From cc17d83e165014b2a44d7343c25f33f431deeea3 Mon Sep 17 00:00:00 2001 From: shi Date: Thu, 27 Mar 2025 17:07:17 +0800 Subject: [PATCH 01/62] =?UTF-8?q?feat(game):=20=E6=B7=BB=E5=8A=A0=20PP=20?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E6=8E=A5=E5=8F=A3=E7=9B=B8=E5=85=B3=E7=B1=BB?= =?UTF-8?q?=E5=92=8C=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 PP 游戏相关的常量和配置 - 添加 PP 游戏用户信息、登录、游戏列表等接口的请求和响应类- 实现 PP 游戏服务的基本功能,包括创建用户、获取游戏列表等 - 添加地址源和客户端接口,用于与 PP游戏服务器通信 --- .../dg/service/impl/GamesDGServiceImpl.java | 3 ++ .../game/api/sa/impl/GamesSAServiceImpl.java | 3 ++ .../service/impl/GameNameServiceImpl.java | 27 ++++++++---------- .../service/impl/GamePlatformServiceImpl.java | 28 ++++++++----------- .../ff/game/service/impl/GameServiceImpl.java | 4 ++- 5 files changed, 33 insertions(+), 32 deletions(-) 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 5d67e2d..75d6448 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 @@ -233,6 +233,7 @@ public class GamesDGServiceImpl implements IGamesService { //没有此平台就新增一个平台 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()); @@ -244,6 +245,7 @@ public class GamesDGServiceImpl implements IGamesService { //不存在这个游戏 if (ObjectUtils.isEmpty(game)) { game = new Game(); + game.setId(GAME_ID); game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); game.setPlatformId(gamePlatform.getId()); game.setGameCode("1"); @@ -255,6 +257,7 @@ public class GamesDGServiceImpl implements IGamesService { 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") 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 615f615..b90a135 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 @@ -245,6 +245,7 @@ public class GamesSAServiceImpl implements IGamesService { //没有此平台就新增一个平台 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()); @@ -256,6 +257,7 @@ public class GamesSAServiceImpl implements IGamesService { //不存在这个游戏 if (ObjectUtils.isEmpty(game)) { game = new Game(); + game.setId(GAME_ID); game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); game.setPlatformId(gamePlatform.getId()); game.setGameCode("1"); @@ -267,6 +269,7 @@ public class GamesSAServiceImpl implements IGamesService { 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") diff --git a/ff-game/src/main/java/com/ff/game/service/impl/GameNameServiceImpl.java b/ff-game/src/main/java/com/ff/game/service/impl/GameNameServiceImpl.java index 4268236..f358ec4 100644 --- a/ff-game/src/main/java/com/ff/game/service/impl/GameNameServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/service/impl/GameNameServiceImpl.java @@ -2,6 +2,7 @@ package com.ff.game.service.impl; import java.util.Collections; import java.util.List; + import com.ff.base.utils.DateUtils; import com.ff.game.domain.GameName; import com.ff.game.dto.GameDTO; @@ -20,8 +21,7 @@ import cn.hutool.core.util.IdUtil; * @date 2025-03-13 */ @Service -public class GameNameServiceImpl implements IGameNameService -{ +public class GameNameServiceImpl implements IGameNameService { @Autowired private GameNameMapper gameNameMapper; @@ -32,8 +32,7 @@ public class GameNameServiceImpl implements IGameNameService * @return 平台子游戏名称管理 */ @Override - public GameName selectGameNameById(Long id) - { + public GameName selectGameNameById(Long id) { return gameNameMapper.selectGameNameById(id); } @@ -44,8 +43,7 @@ public class GameNameServiceImpl implements IGameNameService * @return 平台子游戏名称管理 */ @Override - public List selectGameNameList(GameName gameName) - { + public List selectGameNameList(GameName gameName) { return gameNameMapper.selectGameNameList(gameName); } @@ -56,9 +54,11 @@ public class GameNameServiceImpl implements IGameNameService * @return 结果 */ @Override - public int insertGameName(GameName gameName) - { - gameName.setId(IdUtil.getSnowflakeNextId()); + public int insertGameName(GameName gameName) { + if (gameName.getId() == null) { + gameName.setId(IdUtil.getSnowflakeNextId()); + } + gameName.setCreateTime(DateUtils.getNowDate()); return gameNameMapper.insertGameName(gameName); } @@ -70,8 +70,7 @@ public class GameNameServiceImpl implements IGameNameService * @return 结果 */ @Override - public int updateGameName(GameName gameName) - { + public int updateGameName(GameName gameName) { gameName.setUpdateTime(DateUtils.getNowDate()); return gameNameMapper.updateGameName(gameName); } @@ -83,8 +82,7 @@ public class GameNameServiceImpl implements IGameNameService * @return 结果 */ @Override - public int deleteGameNameByIds(Long[] ids) - { + public int deleteGameNameByIds(Long[] ids) { return gameNameMapper.deleteGameNameByIds(ids); } @@ -95,8 +93,7 @@ public class GameNameServiceImpl implements IGameNameService * @return 结果 */ @Override - public int deleteGameNameById(Long id) - { + public int deleteGameNameById(Long id) { return gameNameMapper.deleteGameNameById(id); } diff --git a/ff-game/src/main/java/com/ff/game/service/impl/GamePlatformServiceImpl.java b/ff-game/src/main/java/com/ff/game/service/impl/GamePlatformServiceImpl.java index 671e83a..2639438 100644 --- a/ff-game/src/main/java/com/ff/game/service/impl/GamePlatformServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/service/impl/GamePlatformServiceImpl.java @@ -4,11 +4,13 @@ import java.util.List; import cn.hutool.core.util.IdUtil; import com.ff.base.utils.DateUtils; +import com.ff.base.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ff.game.mapper.GamePlatformMapper; import com.ff.game.domain.GamePlatform; import com.ff.game.service.IGamePlatformService; +import org.springframework.util.ObjectUtils; /** * 平台管理Service业务层处理 @@ -17,8 +19,7 @@ import com.ff.game.service.IGamePlatformService; * @date 2025-02-10 */ @Service -public class GamePlatformServiceImpl implements IGamePlatformService -{ +public class GamePlatformServiceImpl implements IGamePlatformService { @Autowired private GamePlatformMapper gamePlatformMapper; @@ -29,8 +30,7 @@ public class GamePlatformServiceImpl implements IGamePlatformService * @return 平台管理 */ @Override - public GamePlatform selectGamePlatformById(Long id) - { + public GamePlatform selectGamePlatformById(Long id) { return gamePlatformMapper.selectGamePlatformById(id); } @@ -41,8 +41,7 @@ public class GamePlatformServiceImpl implements IGamePlatformService * @return 平台管理 */ @Override - public List selectGamePlatformList(GamePlatform gamePlatform) - { + public List selectGamePlatformList(GamePlatform gamePlatform) { return gamePlatformMapper.selectGamePlatformList(gamePlatform); } @@ -53,9 +52,10 @@ public class GamePlatformServiceImpl implements IGamePlatformService * @return 结果 */ @Override - public int insertGamePlatform(GamePlatform gamePlatform) - { - gamePlatform.setId(IdUtil.getSnowflakeNextId()); + public int insertGamePlatform(GamePlatform gamePlatform) { + if (ObjectUtils.isEmpty(gamePlatform.getId())) { + gamePlatform.setId(IdUtil.getSnowflakeNextId()); + } gamePlatform.setCreateTime(DateUtils.getNowDate()); return gamePlatformMapper.insertGamePlatform(gamePlatform); } @@ -67,8 +67,7 @@ public class GamePlatformServiceImpl implements IGamePlatformService * @return 结果 */ @Override - public int updateGamePlatform(GamePlatform gamePlatform) - { + public int updateGamePlatform(GamePlatform gamePlatform) { gamePlatform.setUpdateTime(DateUtils.getNowDate()); return gamePlatformMapper.updateGamePlatform(gamePlatform); } @@ -80,8 +79,7 @@ public class GamePlatformServiceImpl implements IGamePlatformService * @return 结果 */ @Override - public int deleteGamePlatformByIds(Long[] ids) - { + public int deleteGamePlatformByIds(Long[] ids) { return gamePlatformMapper.deleteGamePlatformByIds(ids); } @@ -92,13 +90,11 @@ public class GamePlatformServiceImpl implements IGamePlatformService * @return 结果 */ @Override - public int deleteGamePlatformById(Long id) - { + public int deleteGamePlatformById(Long id) { return gamePlatformMapper.deleteGamePlatformById(id); } - /** * 选择最大排序号 * 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 8160451..1dcab48 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 @@ -77,7 +77,9 @@ public class GameServiceImpl implements IGameService @Override public int insertGame(Game game) { - game.setId(IdUtil.getSnowflakeNextId()); + if (game.getId() == null){ + game.setId(IdUtil.getSnowflakeNextId()); + } game.setCreateTime(DateUtils.getNowDate()); return gameMapper.insertGame(game); } From de4a7e9286fd7fe08649583bb29a0bdc6c84d4e9 Mon Sep 17 00:00:00 2001 From: shi Date: Fri, 28 Mar 2025 14:54:21 +0800 Subject: [PATCH 02/62] =?UTF-8?q?feat(game):=20=E6=B7=BB=E5=8A=A0=20PGX=20?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=B9=B3=E5=8F=B0=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 PGX 游戏平台的 API接口实现类 GamesPGXServiceImpl - 添加 PGX 游戏类型枚举类 GPXGameType - 在 GamePlatforms 枚举中添加 PGX 游戏平台 - 更新相关服务和 Mapper 类以支持 PGX 游戏平台 --- .../com/ff/base/constant/CacheConstants.java | 5 + .../java/com/ff/base/constant/Constants.java | 4 + .../java/com/ff/base/enums/GPXGameType.java | 55 ++ .../java/com/ff/base/enums/GamePlatforms.java | 1 + .../com/ff/base/enums/PGXBetRecordStatus.java | 40 ++ .../ff/base/enums/PGXTransactionStatus.java | 41 ++ .../com/ff/base/enums/PGXTransferType.java | 22 + .../ff/base/utils/RandomGeneratorUtils.java | 21 +- .../dg/service/impl/GamesDGServiceImpl.java | 2 +- .../game/api/fc/impl/GamesFCServiceImpl.java | 3 +- .../service/impl/GamesJILIServiceImpl.java | 2 +- .../ng/service/impl/GamesPGServiceImpl.java | 2 +- .../api/pgx/address/MyPGXAddressSource.java | 31 + .../com/ff/game/api/pgx/client/PGXClient.java | 132 ++++ .../api/pgx/dto/PGXBetHistoryResponse.java | 148 ++++ .../ff/game/api/pgx/dto/PGXErrorResponse.java | 26 + .../PGXExchangeTransferStatusResponse.java | 67 ++ .../game/api/pgx/dto/PGXGameListResponse.java | 65 ++ .../api/pgx/dto/PGXGameLoginResponse.java | 30 + .../game/api/pgx/dto/PGXMemberResponse.java | 26 + .../api/pgx/dto/PGXPlayerStatusResponse.java | 26 + .../api/pgx/impl/GamesPGXServiceImpl.java | 652 ++++++++++++++++++ .../game/api/request/GamesDataBuildDTO.java | 5 + .../com/ff/game/api/request/GamesLogin.java | 2 +- .../game/api/sa/impl/GamesSAServiceImpl.java | 2 +- .../xk/service/impl/GamesXKServiceImpl.java | 2 +- .../main/java/com/ff/game/domain/Game.java | 2 +- .../com/ff/game/domain/GameSecretKey.java | 10 + .../ff/game/mapper/GameSecretKeyMapper.java | 11 + .../game/service/IGameSecretKeyService.java | 11 + .../impl/GameSecretKeyServiceImpl.java | 11 + .../service/impl/MemberServiceImpl.java | 6 +- .../mapper/game/GameSecretKeyMapper.xml | 18 +- 33 files changed, 1469 insertions(+), 12 deletions(-) create mode 100644 ff-base/src/main/java/com/ff/base/enums/GPXGameType.java create mode 100644 ff-base/src/main/java/com/ff/base/enums/PGXBetRecordStatus.java create mode 100644 ff-base/src/main/java/com/ff/base/enums/PGXTransactionStatus.java create mode 100644 ff-base/src/main/java/com/ff/base/enums/PGXTransferType.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgx/address/MyPGXAddressSource.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgx/client/PGXClient.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXBetHistoryResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXErrorResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXExchangeTransferStatusResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXGameListResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXGameLoginResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXMemberResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXPlayerStatusResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgx/impl/GamesPGXServiceImpl.java 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 0dbb96e..676af5f 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 @@ -52,6 +52,11 @@ public class CacheConstants */ public static final String XK_GAMES= "xk_games:"; + /** + * pgx游戏 + */ + public static final String PGX_GAMES= "pgx_games:"; + /** * pg游戏 */ diff --git a/ff-base/src/main/java/com/ff/base/constant/Constants.java b/ff-base/src/main/java/com/ff/base/constant/Constants.java index 4f76fe7..cfb844f 100644 --- a/ff-base/src/main/java/com/ff/base/constant/Constants.java +++ b/ff-base/src/main/java/com/ff/base/constant/Constants.java @@ -203,6 +203,10 @@ public class Constants { */ public static final String XK_API_BASE_URL = "xk.api.base.url"; + /** + * pgx-api基本url + */ + public static final String PGX_API_BASE_URL = "gpx.api.base.url"; /** * dg-api基本url diff --git a/ff-base/src/main/java/com/ff/base/enums/GPXGameType.java b/ff-base/src/main/java/com/ff/base/enums/GPXGameType.java new file mode 100644 index 0000000..c1ad300 --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/enums/GPXGameType.java @@ -0,0 +1,55 @@ +package com.ff.base.enums; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Optional; +import java.util.stream.Stream; + + +/** + * xkgame类型 + * + * @author shi + * @date 2024/11/13 + */ +@Getter +@AllArgsConstructor +public enum GPXGameType { + + SL("SL", 1,"电子") + + ; + + private final String code; + private final Integer systemCode; + private final String info; + /** + * 按代码查找系统 + * + * @param code 代码 + * @return {@link String } + */ + public static Integer findSystemByCode(String code) { + Optional system = Stream.of(XKGameType.values()) + .filter(gameType -> gameType.getCode().equals(code)) + .map(XKGameType::getSystemCode) + .findFirst(); + return system.orElse(null); + } + + /** + * 按代码查找信息 + * + * @param code 代码 + * @return {@link String } + */ + public static String findInfoByCode(String code) { + Optional system = Stream.of(XKGameType.values()) + .filter(gameType -> gameType.getCode().equals(code)) + .map(XKGameType::getInfo) + .findFirst(); + return system.orElse(null); + } +} 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 ddb0e04..6bd60a4 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 @@ -7,6 +7,7 @@ public enum GamePlatforms { JILI("JILI", "JILI"), XK("XK", "XK"), PG("PG", "PG"), + PGX("PGX", "PGX"), FC("FC", "FC"), SA("SA", "SA"), DG("DG", "DG"), diff --git a/ff-base/src/main/java/com/ff/base/enums/PGXBetRecordStatus.java b/ff-base/src/main/java/com/ff/base/enums/PGXBetRecordStatus.java new file mode 100644 index 0000000..1a57e04 --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/enums/PGXBetRecordStatus.java @@ -0,0 +1,40 @@ +package com.ff.base.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Optional; +import java.util.stream.Stream; + +/** + * pgxbet记录状态 + * + * @author shi + * @date 2025/03/28 + */ +@Getter +@AllArgsConstructor +public enum PGXBetRecordStatus { + VALID(1, 2,"有效注单"), + RUNNING(0,0, "赛事进行中"), + INVALID(-1,3, "无效注单 (作废, 取消)"); + + + private final Integer code; + private final Integer systemCode; + private final String description; + + /** + * 按值查找代码 + * + * @param code 代码 + * @return {@link Integer } + */ + public static Integer findSystemCodeByCode(Integer code) { + Optional system = Stream.of(PGXBetRecordStatus.values()) + .filter(transactionStatusValue -> transactionStatusValue.getCode().equals(code)) + .map(PGXBetRecordStatus::getSystemCode) + .findFirst(); + return system.orElse(null); + } +} diff --git a/ff-base/src/main/java/com/ff/base/enums/PGXTransactionStatus.java b/ff-base/src/main/java/com/ff/base/enums/PGXTransactionStatus.java new file mode 100644 index 0000000..1afa96a --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/enums/PGXTransactionStatus.java @@ -0,0 +1,41 @@ +package com.ff.base.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Optional; +import java.util.stream.Stream; + +/** + * 转移状态 + * + * @author shi + * @date 2025/03/28 + */ +@AllArgsConstructor +@Getter +public enum PGXTransactionStatus { + SUCCESS("SUCCESS",1, "成功"), + PROCESSING("PROCESSING",0, "进行中,请稍后再确认"), + FAILED("FAILED",2, "失败"); + + // 枚举字段 + private final String code; + private final Integer value; + private final String description; + + + /** + * 按值查找代码 + * + * @param code 代码 + * @return {@link Integer } + */ + public static Integer findValueByCode(String code) { + Optional system = Stream.of(PGXTransactionStatus.values()) + .filter(transactionStatusValue -> transactionStatusValue.getCode().equals(code)) + .map(PGXTransactionStatus::getValue) + .findFirst(); + return system.orElse(null); + } +} diff --git a/ff-base/src/main/java/com/ff/base/enums/PGXTransferType.java b/ff-base/src/main/java/com/ff/base/enums/PGXTransferType.java new file mode 100644 index 0000000..6b3bbbe --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/enums/PGXTransferType.java @@ -0,0 +1,22 @@ +package com.ff.base.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 长传输类型 + * + * @author shi + * @date 2025/03/12 + */ +@Getter +@AllArgsConstructor +public enum PGXTransferType { + WITHDRAW("1", "提出"), + DEPOSIT("0", "存入"); + + private final String code; + private final String description; + + +} diff --git a/ff-base/src/main/java/com/ff/base/utils/RandomGeneratorUtils.java b/ff-base/src/main/java/com/ff/base/utils/RandomGeneratorUtils.java index 27cb271..71ed8ba 100644 --- a/ff-base/src/main/java/com/ff/base/utils/RandomGeneratorUtils.java +++ b/ff-base/src/main/java/com/ff/base/utils/RandomGeneratorUtils.java @@ -43,9 +43,28 @@ public class RandomGeneratorUtils { if (Character.isLetter(randomChar)) { sb.append(Character.toUpperCase(randomChar)); } else { - sb.append(randomChar); // 保持数字 + sb.append(randomChar); } } return sb.toString(); } + + + + + /** + * 生成 5-8 之间的随机长度,只包含小写字母和数字 + * + * @return {@link String } + */ + public static String generateRandomAccountLower() { + int length = 5 + RANDOM.nextInt(4); + StringBuilder sb = new StringBuilder(length); + for (int i = 0; i < length; i++) { + char randomChar = CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length())); + // 保持字母小写,数字不变 + sb.append(randomChar); + } + return sb.toString(); + } } \ No newline at end of file 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 75d6448..8c90a26 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 @@ -249,7 +249,7 @@ public class GamesDGServiceImpl implements IGamesService { game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); game.setPlatformId(gamePlatform.getId()); game.setGameCode("1"); - game.setGameSourceType(1); + game.setGameSourceType(String.valueOf(1)); game.setGameName("真人棋牌"); game.setCreateBy(Constants.SYSTEM); gameService.insertGame(game); 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 78b0675..41b96ba 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 @@ -302,7 +302,7 @@ public class GamesFCServiceImpl implements IGamesService { List games = gameService.selectGameList(game); //不存在这个游戏 if (CollectionUtils.isEmpty(games)) { - game.setGameSourceType(PlatformType.ELECTRONIC.getCode()); + game.setGameSourceType(String.valueOf(PlatformType.ELECTRONIC.getCode())); game.setFreespin(Boolean.FALSE); game.setDemoStatus(Boolean.TRUE); game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); @@ -423,7 +423,6 @@ public class GamesFCServiceImpl implements IGamesService { if (this.getIsSuccess(transferResponseDTO.getResult())) { //更新数据 exchangeMoney.setBalance(transferResponseDTO.getPoints().abs()); - exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue()); exchangeMoney.setCoinBefore(NumberUtil.sub(transferResponseDTO.getAfterPoint(), exchangeMoney.getBalance()).abs()); exchangeMoney.setCoinAfter(transferResponseDTO.getAfterPoint()); exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore()); 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 edf1863..0b6924e 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 @@ -256,7 +256,7 @@ public class GamesJILIServiceImpl implements IGamesService { List games = gameService.selectGameList(game); //不存在这个游戏 if (CollectionUtils.isEmpty(games)) { - game.setGameSourceType(gamesDataDTO.getGameCategoryId()); + game.setGameSourceType(String.valueOf(gamesDataDTO.getGameCategoryId())); game.setFreespin(gamesDataDTO.isFreespin()); game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); game.setGameName(gamesDataDTO.getName().getZhCN()); 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 a966684..8b71e88 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 @@ -282,7 +282,7 @@ public class GamesPGServiceImpl implements IGamesService { List games = gameService.selectGameList(game); //不存在这个游戏 if (CollectionUtils.isEmpty(games)) { - game.setGameSourceType(apiGameInfoResponseDTO.getGameType()); + game.setGameSourceType(String.valueOf(apiGameInfoResponseDTO.getGameType())); game.setFreespin(Boolean.FALSE); game.setDemoStatus(Boolean.TRUE); game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); diff --git a/ff-game/src/main/java/com/ff/game/api/pgx/address/MyPGXAddressSource.java b/ff-game/src/main/java/com/ff/game/api/pgx/address/MyPGXAddressSource.java new file mode 100644 index 0000000..5bd6c65 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgx/address/MyPGXAddressSource.java @@ -0,0 +1,31 @@ +package com.ff.game.api.pgx.address; + +import com.dtflys.forest.callback.AddressSource; +import com.dtflys.forest.http.ForestAddress; +import com.dtflys.forest.http.ForestRequest; +import com.ff.base.constant.Constants; +import com.ff.base.system.service.ISysConfigService; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + + +/** + * 我jili address来源 + * + * @author shi + * @date 2025/02/10 + */ +@Component +public class MyPGXAddressSource implements AddressSource { + + @Resource + private ISysConfigService configService; + + + @Override + public ForestAddress getAddress(ForestRequest request) { + String apiBaseUrl = configService.selectConfigByKey(Constants.PGX_API_BASE_URL); + return new ForestAddress("http",apiBaseUrl, 80,""); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..8cb1827 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgx/client/PGXClient.java @@ -0,0 +1,132 @@ +package com.ff.game.api.pgx.client; + +import com.dtflys.forest.annotation.*; +import com.ff.game.api.dg.dto.DGResponse; +import com.ff.game.api.jili.dto.*; +import com.ff.game.api.ng.dto.ApiExchangeTransferStatusResponseDTO; +import com.ff.game.api.ng.dto.ApiNGResponseDTO; +import com.ff.game.api.pgx.address.MyPGXAddressSource; +import com.ff.game.api.pgx.dto.*; +import com.ff.game.api.xk.dto.XKBetRecordResponseDTO; +import com.ff.game.api.xk.dto.XKKickMemberAllDTO; +import com.ff.game.api.xk.dto.XKKickMemberDTO; + +import java.util.Map; + +/** + * pg 请求 + * + * @author shi + * @date 2025/02/10 + */ +@Address(source = MyPGXAddressSource.class) +public interface PGXClient { + /** + * 创建成员 + * + * @param parameters 范围 + * @return {@link String } + */ + @Get("/createMember.aspx?${parameters}") + PGXErrorResponse createMember(@Var("parameters") String parameters); + + /** + * 获取会员信息 + * + * @param parameters 范围 + * @return {@link PGXMemberResponse } + */ + @Get("/getBalance.aspx?${parameters}") + PGXMemberResponse getMemberInfo(@Var("parameters") String parameters); + + + /** + * 获取会员游戏信息 目前仅支持供应商代号JD. + * + * @param parameters 范围 + * @return {@link PGXPlayerStatusResponse } + */ + @Get("/isPlayerIngame.ashx?${parameters}") + PGXPlayerStatusResponse getMemberPlayInfo(@Var("parameters") String parameters); + + + /** + * 无重定向登录 + * + * @param parameters 范围 + * @return {@link PGXGameLoginResponse } + */ + @Post("/launchGames.aspx?${parameters}") + PGXGameLoginResponse loginWithoutRedirect(@Var("parameters") String parameters); + + /** + * 获取游戏列表 + * + * @param parameters 范围 + * @return {@link PGXGameListResponse } + */ + @Get("/getGameList.aspx?${parameters}") + PGXGameListResponse getGameList(@Var("parameters") String parameters); + + /** + * 按代理id进行交换转账 + * + * @param parameters 参数 + * @return {@link PGXErrorResponse } + */ + @Post(url = "/makeTransfer.aspx?{parameters}") + PGXErrorResponse exchangeTransferByAgentId(@Var("parameters") String parameters); + + /** + * 标记报告 + * + * @return {@link DGResponse } + */ + @Post(url = "markbyjson.aspx") + DGResponse markReport(@JSONBody Map params); + + + + + /** + * 汇兑转移状态 + * + * @param parameters 范围 + * @return {@link ApiNGResponseDTO }<{@link ApiExchangeTransferStatusResponseDTO }> + */ + @Post(url = "/checkTransaction.ashx?{parameters}") + PGXExchangeTransferStatusResponse exchangeTransferStatus(@Var("parameters") String parameters); + + + + + + /** + * 按时间获取投注记录 + * + * @return {@link PGXBetHistoryResponse } + */ + @Get(url = "/fetchArchieve.aspx?{parameters}") + PGXBetHistoryResponse getBetRecordByTime(@Var("parameters") String parameters); + + + /** + * 踢出队员 + * + * @param parameters 范围 + * @return {@link JILIKickMemberDTO } + */ + @Post("/kickPlayerFromProduct.ashx?{parameters}") + PGXErrorResponse kickMember(@Var("parameters") String parameters); + + /** + * 踢出所有队员 + * + * @param params 参数 + * @return {@link JILIKickMemberAllDTO } + */ + @Get("/kickMemberAll") + XKKickMemberAllDTO kickMemberAll(@JSONBody Map params); + + +} diff --git a/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXBetHistoryResponse.java b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXBetHistoryResponse.java new file mode 100644 index 0000000..6e43ba3 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXBetHistoryResponse.java @@ -0,0 +1,148 @@ +package com.ff.game.api.pgx.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 错误信息与投注历史记录返回结果对象 + * + * @author shi + * @date 2025/03/28 + */ +@Data +public class PGXBetHistoryResponse { + + /** + * 错误码 + */ + @JsonProperty("errCode") + private Integer errCode; + + /** + * 投注历史记录的JSON字符串 (String类型) + */ + @JsonProperty("result") + private String result; + + /** + * 错误信息 (String类型) + */ + @JsonProperty("errMsg") + private String errMsg; + + /** + * AIO投注记录对象 + */ + @Data + public class Result { + + /** + * AIO注单号 (唯一值) (Int类型) + */ + @JsonProperty("id") + private int id; + + /** + * 供应商注单号 (Int类型) + */ + @JsonProperty("ref_no") + private int refNo; + + /** + * 供应商代号 (String类型) + */ + @JsonProperty("site") + private String site; + + /** + * 游戏类型代号 (String类型) + */ + @JsonProperty("product") + private String product; + + /** + * 玩家帐号 (String类型) + */ + @JsonProperty("member") + private String member; + + /** + * 游戏代号 (String类型) + */ + @JsonProperty("gameid") + private String gameId; + + /** + * 下注时间 (玩家实际的投注时间) 依据 GMT/UTC +0 时区 + */ + @JsonProperty("start_time") + private Date startTime; + + /** + * 结算时间 (String类型) 依据 GMT/UTC +0 时区 + */ + @JsonProperty("end_time") + private Date endTime; + + /** + * 开赛时间 (String类型) 依据 GMT/UTC +0 时区 + */ + @JsonProperty("match_time") + private String matchTime; + + /** + * 投注明细 (String类型) + */ + @JsonProperty("bet_detail") + private String betDetail; + + /** + * 有效投注金额 (Double类型) + */ + @JsonProperty("turnover") + private BigDecimal turnover; + + /** + * 投注金额 (Double类型) + */ + @JsonProperty("bet") + private BigDecimal bet; + + /** + * 派彩金额 (Double类型) + */ + @JsonProperty("payout") + private BigDecimal payout; + + /** + * 佣金 (Double类型) + */ + @JsonProperty("commission") + private BigDecimal commission; + + /** + * 彩池投注金额 (Double类型) + */ + @JsonProperty("p_share") + private BigDecimal pShare; + + /** + * 彩池派彩金额 (Double类型) + */ + @JsonProperty("p_win") + private BigDecimal pWin; + + /** + * 注单状态 (Int类型) + * 1 (valid bet record 有效注单) + * 0 (running/ongoing match 赛事进行中) + * -1 (invalid bet record 无效注单 e.g. voided 作废, canceled 取消) + */ + @JsonProperty("status") + private int status; + + } +} \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXErrorResponse.java b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXErrorResponse.java new file mode 100644 index 0000000..1fc0aca --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXErrorResponse.java @@ -0,0 +1,26 @@ +package com.ff.game.api.pgx.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 错误响应类 + * + * @author shi + * @date 2025/03/27 + */ +@Data +public class PGXErrorResponse { + + /** 错误码 */ + @JsonProperty("errCode") + private Integer errCode; + + /** 内部参考代码 (字符串类型) */ + @JsonProperty("innerCode") + private String innerCode; + + /** 错误信息 (字符串类型) */ + @JsonProperty("errMsg") + private String errMsg; +} 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 new file mode 100644 index 0000000..e91c2a7 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXExchangeTransferStatusResponse.java @@ -0,0 +1,67 @@ +package com.ff.game.api.pgx.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * pgxexchange传输状态响应 + * + * @author shi + * @date 2025/03/28 + */ +@Data +public class PGXExchangeTransferStatusResponse { + + /** 错误码 */ + @JsonProperty("errCode") + private Integer errCode; + + + + /** 错误信息 (字符串类型) */ + @JsonProperty("errMsg") + private String errMsg; + + + /** GSC生成的转账ID (String类型) */ + @JsonProperty("trans_id") + private String transId; + + /** 交易时间,GMT+0 (String类型) */ + @JsonProperty("trans_time") + private String transTime; + + /** 玩家姓名 (String类型) */ + @JsonProperty("username") + private String username; + + /** 交易类型 (String类型),0为存款,1为取款 */ + @JsonProperty("type") + private String type; + + /** 提供商 (String类型) */ + @JsonProperty("provider") + private String provider; + + /** 交易金额 (double类型) */ + @JsonProperty("amount") + private double amount; + + /** 运营商的参考ID (String类型) */ + @JsonProperty("ref_id") + private String refId; + + /** 交易状态 (String类型),SUCCESS 成功 + PROCESSING 进行中,请稍后再确认 + FAILED 失败 */ + @JsonProperty("status") + private String status; + + /** GSC操作员代码 (String类型) */ + @JsonProperty("operator") + private String operator; + + /** 交易备注 (String类型) */ + @JsonProperty("remark") + private String remark; +} diff --git a/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXGameListResponse.java b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXGameListResponse.java new file mode 100644 index 0000000..f53e146 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXGameListResponse.java @@ -0,0 +1,65 @@ +package com.ff.game.api.pgx.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * pgx游戏列表响应 + * + * @author shi + * @date 2025/03/28 + */ +@Data +public class PGXGameListResponse { + + /** 错误码 (字符串类型) */ + @JsonProperty("errCode") + private Integer errCode; + + /** 游戏列表 (包含多个游戏的详细信息) */ + @JsonProperty("gamelist") + private String gamelist; + + /** 错误信息 (字符串类型) */ + @JsonProperty("errMsg") + private String errMsg; + + /** 数据生成时间 (字符串类型) */ + @JsonProperty("generatedAt") + private Date generatedAt; + + /** + * 游戏信息类 + */ + @Data + public static class Game { + + /** 游戏ID (字符串类型) */ + @JsonProperty("gameId") + private String gameId; + + /** 游戏名称 (字符串类型) */ + @JsonProperty("gameName") + private String gameName; + + /** + * 系统游戏id + */ + private Long systemGameId; + + /** 游戏代码 (字符串类型) */ + @JsonProperty("gameCode") + private String gameCode; + + /** 游戏状态 (整数类型) */ + @JsonProperty("status") + private int status; + + /** 发布状态 (整数类型) */ + @JsonProperty("releaseStatus") + private int releaseStatus; + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXGameLoginResponse.java b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXGameLoginResponse.java new file mode 100644 index 0000000..db85e06 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXGameLoginResponse.java @@ -0,0 +1,30 @@ +package com.ff.game.api.pgx.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 游戏响应对象 + */ +@Data +public class PGXGameLoginResponse { + + /** + * 错误码 (String类型) + */ + @JsonProperty("errCode") + private Integer errCode; + + /** + * 启动游戏链接 (String类型) + */ + @JsonProperty("gameUrl") + private String gameUrl; + + /** + * 错误信息 (String类型) + */ + @JsonProperty("errMsg") + private String errMsg; + +} \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXMemberResponse.java b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXMemberResponse.java new file mode 100644 index 0000000..0fea6fa --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXMemberResponse.java @@ -0,0 +1,26 @@ +package com.ff.game.api.pgx.dto; + + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 响应类,包含错误码、余额和错误信息 + */ +@Data +public class PGXMemberResponse { + + /** 错误码 */ + @JsonProperty("errCode") + private Integer errCode; + + /** 账户余额 (小数类型) */ + @JsonProperty("balance") + private BigDecimal balance; + + /** 错误信息 (字符串类型) */ + @JsonProperty("errMsg") + private String errMsg; +} \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXPlayerStatusResponse.java b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXPlayerStatusResponse.java new file mode 100644 index 0000000..a5698af --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXPlayerStatusResponse.java @@ -0,0 +1,26 @@ +package com.ff.game.api.pgx.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 响应类,包含错误码、玩家是否在游戏中状态和错误信息 + * + * @author shi + * @date 2025/03/28 + */ +@Data +public class PGXPlayerStatusResponse { + + /** 错误码 (字符串类型) */ + @JsonProperty("errCode") + private Integer errCode; + + /** 玩家是否在游戏中 (字符串类型) "true" 表示在游戏中,"false" 表示不在游戏中 */ + @JsonProperty("result") + private Boolean result; + + /** 错误信息 (字符串类型) */ + @JsonProperty("errMsg") + private String errMsg; +} \ No newline at end of file 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 new file mode 100644 index 0000000..37f1673 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgx/impl/GamesPGXServiceImpl.java @@ -0,0 +1,652 @@ +package com.ff.game.api.pgx.impl; + +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; +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.sign.Md5Utils; +import com.ff.config.KeyConfig; +import com.ff.game.api.IGamesService; +import com.ff.game.api.dg.dto.DGBetRecordResponseDTO; +import com.ff.game.api.ng.dto.ApiExchangeTransferStatusResponseDTO; +import com.ff.game.api.pgx.client.PGXClient; +import com.ff.game.api.pgx.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.api.xk.dto.XKKickMemberDTO; +import com.ff.game.domain.*; +import com.ff.game.dto.GameSecretKeyCurrencyDTO; +import com.ff.game.service.*; +import com.ff.member.domain.Member; +import com.ff.member.service.IMemberService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + + +/** + * 游戏pgxservice impl + * + * @author shi + * @date 2025/03/27 + */ +@Service("PGXService") +@Slf4j +public class GamesPGXServiceImpl implements IGamesService { + + + @Resource + private ISysConfigService configService; + + @Resource + private RedisCache redisCache; + + @Resource + private IGameExchangeMoneyService gameExchangeMoneyService; + + + @Resource + private IGamePlatformService gamePlatformService; + + + @Resource + private IGameService gameService; + + + @Resource + private IMemberService memberService; + + @Resource + private IGameFreeRecordService gameFreeRecordService; + @Resource + private IGameSecretKeyService gameSecretKeyService; + + @Resource + private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; + + @Resource + private PGXClient PGXClient; + + + @Resource + private KeyConfig keyConfig; + + @Resource + private IGameBettingDetailsService gameBettingDetailsService; + + @Resource + private IGameNameService gameNameService; + + + /** + * 获得就是成功 + * + * @param errorCode 错误代码 + * @return {@link Boolean } + */ + private Boolean getIsSuccess(Integer errorCode) { + ApiException.isTrue(101 != errorCode, ErrorCode.GAME_ACCOUNT_CREATION_FAILED.getCode()); + + return 0 == errorCode; + } + + + /** + * 获取密钥 + * + * @return {@link String } + */ + private String getKey(Map paramsMap, GamesBaseRequestDTO gamesBaseRequestDTO) { + String result = paramsMap.values().stream() + .map(Object::toString) + .collect(Collectors.joining()); + + return Md5Utils.md5New(result + gamesBaseRequestDTO.getAgentKey()).toUpperCase(); + } + + + /** + * 创建成员 + * + * @param createMemberRequestDTO 创建成员请求dto + * @return {@link Boolean } + */ + @Override + public Boolean createMember(CreateMemberRequestDTO createMemberRequestDTO) { + log.info("GamesXKServiceImpl [createMember] 请求参数 {}", createMemberRequestDTO); + + Map params = new LinkedHashMap<>(); + params.put("operatorcode", createMemberRequestDTO.getAgentId()); + params.put("username", createMemberRequestDTO.getAccount()); + String key = this.getKey(params, createMemberRequestDTO); + params.put("signature", key); + + PGXErrorResponse pgxClientMember = PGXClient.createMember(JsonUtil.mapToQueryString(params)); + Integer errCode = pgxClientMember.getErrCode(); + if (this.getIsSuccess(errCode)) { + return Boolean.TRUE; + } + //判断是否获取成功 + return Boolean.FALSE; + } + + + /** + * 获取会员信息 + * + * @param memberInfoRequestDTO 会员信息请求dto + * @return {@link MemberInfoResponseDTO } + */ + @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()); + params.put("password", gameSecretKey.getPassword()); + params.put("providercode", gameSecretKey.getProviderCode()); + params.put("username", memberInfoRequestDTO.getAccounts()); + String key = this.getKey(params, memberInfoRequestDTO); + params.put("signature", key); + PGXMemberResponse memberInfo = PGXClient.getMemberInfo(JsonUtil.mapToQueryString(params)); + //判断是否获取成功 + if (this.getIsSuccess(memberInfo.getErrCode())) { + MemberInfoResponseDTO memberInfoResponseDTO = MemberInfoResponseDTO.builder() + .status(GameMemberStatus.UNKNOWN.getCode()) + .balance(memberInfo.getBalance()) + .account(memberInfoRequestDTO.getAccounts()) + .build(); + return memberInfoResponseDTO; + } else { + throw new BaseException(memberInfo.getErrMsg()); + } + } + + /** + * 无重定向登录 + * + * @param gamesLogin 游戏登录 + * @return {@link String } + */ + @Override + public String loginWithoutRedirect(GamesLogin gamesLogin) { + log.info("GamesPGXServiceImpl [loginWithoutRedirect] 请求参数 {}", gamesLogin); + GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(gamesLogin.getAgentId()); + Map params = new LinkedHashMap<>(); + params.put("operatorcode", gamesLogin.getAgentId()); + params.put("password", gameSecretKey.getPassword()); + params.put("providercode", gameSecretKey.getProviderCode()); + params.put("type", gamesLogin.getGameType()); + params.put("username", gamesLogin.getAccount()); + String key = this.getKey(params, gamesLogin); + params.put("gameid", gamesLogin.getGameId()); + params.put("lang", gamesLogin.getLang()); + params.put("html5", 1); + params.put("signature", key); + PGXGameLoginResponse PGXGameLoginResponse = PGXClient.loginWithoutRedirect(JsonUtil.mapToQueryString(params)); + //判断是否获取成功 + if (this.getIsSuccess(PGXGameLoginResponse.getErrCode())) { + return PGXGameLoginResponse.getGameUrl(); + } else { + throw new BaseException(PGXGameLoginResponse.getErrMsg()); + } + } + + + /** + * 获取游戏列表 + * + * @param gamesBaseRequestDTO 游戏请求dto + * @return {@link String } + */ + @Transactional + @Override + public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) { + + List gamesDatas = redisCache.getCacheList(CacheConstants.PGX_GAMES); + if (!CollectionUtils.isEmpty(gamesDatas)) { + return CacheConstants.PGX_GAMES; + } + + GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(gamesBaseRequestDTO.getAgentId()); + Map params = new LinkedHashMap<>(); + params.put("operatorcode", gamesBaseRequestDTO.getAgentId()); + params.put("providercode", gameSecretKey.getProviderCode()); + String key = this.getKey(params, gamesBaseRequestDTO); + //没有中文 + params.put("html5", 1); + params.put("signature", key); + + PGXGameListResponse gameList = PGXClient.getGameList(JsonUtil.mapToQueryString(params)); + + //判断是否获取成功 + if (this.getIsSuccess(gameList.getErrCode())) { + + 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.getCode()) + .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); + } + Game game = Game.builder() + .platformId(gamePlatform.getId()) + .gameCode(gamesDataDTO.getGameId()) + .build(); + List games = gameService.selectGameList(game); + //不存在这个游戏 + if (CollectionUtils.isEmpty(games)) { + game.setGameSourceType(GPXGameType.SL.getCode()); + game.setFreespin(Boolean.FALSE); + game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); + game.setGameName(gamesDataDTO.getGameName()); + game.setCreateBy(Constants.SYSTEM); + gameService.insertGame(game); + } else { + 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()); + } + + + } + + redisCache.deleteObject(CacheConstants.PGX_GAMES); + redisCache.setCacheList(CacheConstants.PGX_GAMES, gameLists); + redisCache.expire(CacheConstants.PGX_GAMES, 5L, TimeUnit.HOURS); + } else { + throw new BaseException(gameList.getErrMsg()); + + } + return CacheConstants.PGX_GAMES; + } + + /** + * 按代理id进行交换转账 + * + * @param exchangeTransferMoneyRequestDTO 外汇转账moeny dto + * @return {@link Long } + */ + @Override + @Transactional + public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { + log.info("GamesPGXServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); + + GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() + .platformCode(GamePlatforms.PGX.getCode()) + .code(exchangeTransferMoneyRequestDTO.getAgentId()) + .currency(exchangeTransferMoneyRequestDTO.getCurrency()) + .build()); + + Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); + String transactionId = gameExchangeMoneyService.getTransactionId(GamePlatforms.PGX.getCode(), 17); + List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( + GameExchangeMoney.builder() + .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) + .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) + .build() + ); + Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); + + GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(exchangeTransferMoneyRequestDTO.getAgentId()); + + //获取下一个自增id + GameExchangeMoney exchangeMoney = GameExchangeMoney + .builder() + .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) + .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) + .quota(exchangeTransferMoneyRequestDTO.getQuota()) + .balance(exchangeTransferMoneyRequestDTO.getAmount()) + .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) + .currencyCode(currencyDTO.getSystemCurrency()) + .memberId(member.getId()) + .transactionId(transactionId) + .platformCode(GamePlatforms.PGX.getCode()) + .build(); + exchangeMoney.setCreateBy(Constants.SYSTEM); + + //获取余额 + String type = TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType()) ? PGXTransferType.WITHDRAW.getCode() : PGXTransferType.DEPOSIT.getCode(); + + 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("amount", amount); + paramsMap.put("operatorcode", exchangeTransferMoneyRequestDTO.getAgentId()); + paramsMap.put("password", gameSecretKey.getPassword()); + paramsMap.put("providercode", gameSecretKey.getProviderCode()); + paramsMap.put("referenceid", transactionId); + paramsMap.put("type", type); + paramsMap.put("username", exchangeTransferMoneyRequestDTO.getAccount()); + String key = this.getKey(paramsMap, exchangeTransferMoneyRequestDTO); + paramsMap.put("signature", key); + + PGXErrorResponse errorResponse = PGXClient.exchangeTransferByAgentId(JsonUtil.mapToQueryString(paramsMap)); + if (this.getIsSuccess(errorResponse.getErrCode())) { + + //更新数据 + exchangeMoney.setBalance(amount); + exchangeMoney.setCoinBefore(amountBefore); + //转后的余额 + BigDecimal coinAfter = this.getMemberInfo(gamesBaseRequestDTO).getBalance(); + + exchangeMoney.setCoinAfter(coinAfter); + 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(gameSecretKey.getCode()); + exchangeTransferStatusRequestDTO.setAgentKey(gameSecretKey.getKey()); + this.exchangeTransferStatus(exchangeTransferStatusRequestDTO); + } else { + log.error("GamesFCServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{}", errorResponse.getErrCode()); + throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); + } + return exchangeMoney.getId(); + } + + /** + * 汇兑转移状态 + * + * @param exchangeTransferMoneyRequestDTO 兑换转账请求dto + * @return {@link Boolean } + */ + @Override + public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + log.info("GamesPGXServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO); + Map paramsMap = new LinkedHashMap<>(); + paramsMap.put("operatorcode", exchangeTransferMoneyRequestDTO.getAgentId()); + paramsMap.put("referenceid", exchangeTransferMoneyRequestDTO.getOrderId()); + String key = this.getKey(paramsMap, exchangeTransferMoneyRequestDTO); + paramsMap.put("signature", key); + + PGXExchangeTransferStatusResponse exchangeTransferStatusResponse = PGXClient.exchangeTransferStatus(JsonUtil.mapToQueryString(paramsMap)); + if (this.getIsSuccess(exchangeTransferStatusResponse.getErrCode())) { + List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( + GameExchangeMoney.builder() + .platformCode(GamePlatforms.PGX.getCode()) + .transactionId(exchangeTransferMoneyRequestDTO.getOrderId()) + .build() + ); + + for (GameExchangeMoney exchangeMoney : gameExchangeMonies) { + //更新数据 + exchangeMoney.setStatus(PGXTransactionStatus.findValueByCode(exchangeTransferStatusResponse.getStatus())); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); + } + return Boolean.TRUE; + } else { + log.error("GamesPGXServiceImpl [exchangeTransferStatus]错误代码{},错误信息{}", exchangeTransferStatusResponse.getErrCode(), exchangeTransferStatusResponse.getErrMsg()); + return Boolean.FALSE; + } + } + + + /** + * 按时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link List }<{@link GameBettingDetails }> + */ + @Override + public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { + //请求参数 + log.info("GamesPGXServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO); + Map paramsMap = new LinkedHashMap<>(); + paramsMap.put("operatorcode", betRecordByTimeDTO.getAgentId()); + String key = this.getKey(paramsMap, betRecordByTimeDTO); + paramsMap.put("versionkey", 0); + paramsMap.put("signature", key); + PGXBetHistoryResponse betRecordByTime = PGXClient.getBetRecordByTime(JsonUtil.mapToQueryString(paramsMap)); + + if (this.getIsSuccess(betRecordByTime.getErrCode())) { + List results = JSON.parseArray(betRecordByTime.getResult(), PGXBetHistoryResponse.Result.class); + this.batchInsert(results, betRecordByTimeDTO); + return Boolean.TRUE; + } else { + log.error("GamesPGXServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getErrCode(), betRecordByTime.getErrMsg()); + throw new BaseException(betRecordByTime.getErrMsg()); + } + } + + /** + * 按历史时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link Boolean } + */ + @Override + public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { + return null; + } + + /** + * 赠送免费局数 + * + * @param createFreeSpinRequest 创建自由旋转请求 + * @return {@link Boolean } + */ + @Override + public Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + /** + * 获取游戏详细信息 + * + * @param getGameDetailRequestDTO 获取游戏详细信息请求dto + * @return {@link GetGameDetailResponseDTO } + */ + @Override + public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + /** + * 强制会员从游戏注销 + * + * @param kickMemberRequestDTO 踢会员请求dto + * @return {@link Boolean } + */ + @Override + public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) { + 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 dataBean 数据bean + */ + private void batchInsert(List dataBean, GamesBaseRequestDTO gamesBaseRequestDTO) { + List gameBettingDetails = new ArrayList<>(); + List wagersIds = new ArrayList<>(); + + //数据转化 + for (PGXBetHistoryResponse.Result bean : dataBean) { + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().agentId(gamesBaseRequestDTO.getAgentId()).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); + //用steam流清除list中与wagersIds集合相同的数据 + gameBettingDetails = gameBettingDetails.stream() + .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) + .collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(gameBettingDetails)) { + gameBettingDetailsService.batchInsert(gameBettingDetails); + + //标记报告 + Map paramsMap = new LinkedHashMap<>(); + paramsMap.put("operatorcode", gamesBaseRequestDTO.getAgentId()); + String key = this.getKey(paramsMap, gamesBaseRequestDTO); + paramsMap.put("ticket", String.join(",", wagersIds)); + paramsMap.put("signature", key); + PGXClient.markReport(paramsMap); + } + } + + } + + /** + * 数据构建 + * + * @param gamesDataBuildDTO 数据 + * @return {@link GameBettingDetails } + */ + @Override + public GameBettingDetails dataBuild(GamesDataBuildDTO gamesDataBuildDTO) { + //转化类 + 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)) { + return null; + } + List gamesDatas = redisCache.getCacheList(CacheConstants.PGX_GAMES); + Map dataDTOMap = gamesDatas.stream().collect(Collectors.toMap(PGXGameListResponse.Game::getGameId, e -> e)); + PGXGameListResponse.Game gamesDataDTO = dataDTOMap.get(resultBean.getGameId()); + + + BigDecimal payoffAmount = BigDecimal.ZERO; + BigDecimal payout = resultBean.getPayout(); + //输赢状态 + Integer gameStatus = GameStatus.FLAT.getCode(); + if (payout.compareTo(resultBean.getBet()) > 0) { + payoffAmount = NumberUtil.sub(payout, resultBean.getBet()); + gameStatus = GameStatus.WIN.getCode(); + } else if (payout.compareTo(resultBean.getBet()) < 0) { + payoffAmount = NumberUtil.sub(payout, resultBean.getBet()).negate(); + gameStatus = GameStatus.FAIL.getCode(); + } + //数据构造 + GameBettingDetails gameBettingDetails = GameBettingDetails.builder() + .tenantKey(member.getTenantKey()) + //保存我们的币种id + .currencyCode(currencyDTO.getSystemCurrency()) + .memberId(member.getId()) + .gameCode(resultBean.getGameId()) + .gameType(GPXGameType.SL.getSystemCode()) + .platformCode(GamePlatforms.PGX.getCode()) + .gameId(gamesDataDTO.getSystemGameId()) + .gameName(gamesDataDTO.getGameName()) + .gameStatus(gameStatus) + .gameStatusType(1) + .betContent(resultBean.getBetDetail()) + .gameCurrencyCode(currencyDTO.getCurrency()) + .account(resultBean.getMember()) + .wagersId(String.valueOf(resultBean.getId())) + .wagersTime(resultBean.getStartTime().getTime()) + .betAmount(resultBean.getBet()) + .payoffTime(resultBean.getEndTime().getTime()) + .payoffAmount(payoffAmount) + .settlementTime(resultBean.getEndTime().getTime()) + .turnover(resultBean.getTurnover()) + .settlementStatus(PGXBetRecordStatus.findSystemCodeByCode(resultBean.getStatus())) + .build(); + gameBettingDetails.setCreateBy(Constants.SYSTEM); + gameBettingDetails.setCreateTime(DateUtils.getNowDate()); + return gameBettingDetails; + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/request/GamesDataBuildDTO.java b/ff-game/src/main/java/com/ff/game/api/request/GamesDataBuildDTO.java index 7b87918..73548ee 100644 --- a/ff-game/src/main/java/com/ff/game/api/request/GamesDataBuildDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/request/GamesDataBuildDTO.java @@ -34,5 +34,10 @@ public class GamesDataBuildDTO */ private String currencyCode; + /** + * 代理id + */ + private String agentId; + } diff --git a/ff-game/src/main/java/com/ff/game/api/request/GamesLogin.java b/ff-game/src/main/java/com/ff/game/api/request/GamesLogin.java index da7249c..d46d7fd 100644 --- a/ff-game/src/main/java/com/ff/game/api/request/GamesLogin.java +++ b/ff-game/src/main/java/com/ff/game/api/request/GamesLogin.java @@ -45,5 +45,5 @@ public class GamesLogin extends GamesBaseRequestDTO{ /** * 游戏类型 */ - private Integer gameType; + private String gameType; } 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 b90a135..ac9c0d2 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 @@ -261,7 +261,7 @@ public class GamesSAServiceImpl implements IGamesService { game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); game.setPlatformId(gamePlatform.getId()); game.setGameCode("1"); - game.setGameSourceType(1); + game.setGameSourceType(String.valueOf(1)); game.setGameName("真人棋牌"); game.setCreateBy(Constants.SYSTEM); gameService.insertGame(game); 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 3f8957e..82675d3 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 @@ -270,7 +270,7 @@ public class GamesXKServiceImpl implements IGamesService { List games = gameService.selectGameList(game); //不存在这个游戏 if (CollectionUtils.isEmpty(games)) { - game.setGameSourceType(gamesDataDTO.getGameCategoryId()); + game.setGameSourceType(String.valueOf(gamesDataDTO.getGameCategoryId())); game.setFreespin(gamesDataDTO.isFreeSpin()); game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); game.setGameName(gamesDataDTO.getName()); 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 c0b1e37..27b4b5f 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 @@ -48,7 +48,7 @@ public class Game extends BaseEntity /** 第三方来源分类 */ @Excel(name = "第三方来源分类") - private Integer gameSourceType; + private String gameSourceType; /** 游戏名称 */ @Excel(name = "游戏名称") diff --git a/ff-game/src/main/java/com/ff/game/domain/GameSecretKey.java b/ff-game/src/main/java/com/ff/game/domain/GameSecretKey.java index f34a0ff..d263f9b 100644 --- a/ff-game/src/main/java/com/ff/game/domain/GameSecretKey.java +++ b/ff-game/src/main/java/com/ff/game/domain/GameSecretKey.java @@ -28,6 +28,16 @@ public class GameSecretKey extends BaseEntity @Excel(name = "平台") private String platform; + /** + * 供应商号 + */ + private String providerCode; + + /** + * 供应商号密码 + */ + private String password; + /** 代码 */ @Excel(name = "代码") private String code; diff --git a/ff-game/src/main/java/com/ff/game/mapper/GameSecretKeyMapper.java b/ff-game/src/main/java/com/ff/game/mapper/GameSecretKeyMapper.java index 31daa64..eb4f84a 100644 --- a/ff-game/src/main/java/com/ff/game/mapper/GameSecretKeyMapper.java +++ b/ff-game/src/main/java/com/ff/game/mapper/GameSecretKeyMapper.java @@ -27,6 +27,17 @@ public interface GameSecretKeyMapper */ List selectGameSecretKeyList(GameSecretKey gameSecretKey); + + + /** + * 按代码选择游戏密钥 + * + * @param code 代码 + * @return {@link GameSecretKey } + */ + GameSecretKey selectGameSecretKeyByCode(String code); + + /** * 新增游戏平台密钥管理 * diff --git a/ff-game/src/main/java/com/ff/game/service/IGameSecretKeyService.java b/ff-game/src/main/java/com/ff/game/service/IGameSecretKeyService.java index 1203346..713b050 100644 --- a/ff-game/src/main/java/com/ff/game/service/IGameSecretKeyService.java +++ b/ff-game/src/main/java/com/ff/game/service/IGameSecretKeyService.java @@ -1,6 +1,8 @@ package com.ff.game.service; import java.util.List; + +import com.ff.game.domain.Game; import com.ff.game.domain.GameSecretKey; /** @@ -19,6 +21,15 @@ public interface IGameSecretKeyService */ GameSecretKey selectGameSecretKeyById(Long id); + + /** + * 按代码选择游戏密钥 + * + * @param code 代码 + * @return {@link GameSecretKey } + */ + GameSecretKey selectGameSecretKeyByCode(String code); + /** * 查询游戏平台密钥管理列表 * diff --git a/ff-game/src/main/java/com/ff/game/service/impl/GameSecretKeyServiceImpl.java b/ff-game/src/main/java/com/ff/game/service/impl/GameSecretKeyServiceImpl.java index 85350d3..2c34ac1 100644 --- a/ff-game/src/main/java/com/ff/game/service/impl/GameSecretKeyServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/service/impl/GameSecretKeyServiceImpl.java @@ -34,6 +34,17 @@ public class GameSecretKeyServiceImpl implements IGameSecretKeyService return gameSecretKeyMapper.selectGameSecretKeyById(id); } + /** + * 按代码选择游戏密钥 + * + * @param code 代码 + * @return {@link GameSecretKey } + */ + @Override + public GameSecretKey selectGameSecretKeyByCode(String code) { + return gameSecretKeyMapper.selectGameSecretKeyByCode(code); + } + /** * 查询游戏平台密钥管理列表 * 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 91310dc..428270b 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 @@ -59,7 +59,11 @@ public class MemberServiceImpl implements IMemberService { do { gameAccount = RandomGeneratorUtils.generateRandomAccountUpper(); } while (!ObjectUtils.isEmpty(memberMapper.selectMemberByGameAccount(gameAccount))); - } else { + }else if (GamePlatforms.PG.getInfo().equals(platformCode)||GamePlatforms.PGX.getInfo().equals(platformCode)){ + do { + gameAccount = RandomGeneratorUtils.generateRandomAccountLower(); + } while (!ObjectUtils.isEmpty(memberMapper.selectMemberByGameAccount(gameAccount))); + }else { do { gameAccount = RandomGeneratorUtils.generateRandomAccount(); } while (!ObjectUtils.isEmpty(memberMapper.selectMemberByGameAccount(gameAccount))); diff --git a/ff-game/src/main/resources/mapper/game/GameSecretKeyMapper.xml b/ff-game/src/main/resources/mapper/game/GameSecretKeyMapper.xml index 7576be3..61d8240 100644 --- a/ff-game/src/main/resources/mapper/game/GameSecretKeyMapper.xml +++ b/ff-game/src/main/resources/mapper/game/GameSecretKeyMapper.xml @@ -7,6 +7,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + @@ -16,13 +18,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, platform, code, `key`, create_by, create_time, update_by, update_time from ff_game_secret_key + select id, platform,provider_code,password, code, `key`, create_by, create_time, update_by, update_time from ff_game_secret_key + + insert into ff_game_secret_key id, platform, + provider_code, + password, code, key, create_by, @@ -48,6 +60,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id}, #{platform}, + #{providerCode}, + #{password}, #{code}, #{key}, #{createBy}, @@ -61,6 +75,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update ff_game_secret_key platform = #{platform}, + provider_code = #{providerCode}, + password = #{password}, code = #{code}, key = #{key}, create_by = #{createBy}, From 8732f3e85f24dbe04dfaf0b34938aeffddc81b25 Mon Sep 17 00:00:00 2001 From: shi Date: Fri, 28 Mar 2025 19:23:26 +0800 Subject: [PATCH 03/62] =?UTF-8?q?refactor(game):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E4=BC=A0=E9=80=92=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 GamesPPServiceImpl 中,将 JSONUtils.toJSONString(params) 替换为直接使用 params - 在 PPClient 中,修改 getGameList 方法参数类型从 String 改为 Map --- .../java/com/ff/base/constant/Constants.java | 5 +- .../api/ae/address/MyAEAddressSource.java | 31 + .../com/ff/game/api/ae/client/AEClient.java | 97 +++ .../com/ff/game/api/ae/dto/AEResponse.java | 26 + .../api/ae/dto/XKBetRecordResponseDTO.java | 54 ++ .../api/ae/dto/XKCreateMemberResponseDTO.java | 32 + .../ae/dto/XKExchangeMoneyResponseDTO.java | 46 ++ .../game/api/ae/dto/XKKickMemberAllDTO.java | 27 + .../ff/game/api/ae/dto/XKKickMemberDTO.java | 13 + .../XKLoginWithoutRedirectResponseDTO.java | 29 + .../ff/game/api/ae/dto/XKMemberInfoDTO.java | 49 ++ .../game/api/ae/impl/GamesAEServiceImpl.java | 594 ++++++++++++++++++ 12 files changed, 1002 insertions(+), 1 deletion(-) create mode 100644 ff-game/src/main/java/com/ff/game/api/ae/address/MyAEAddressSource.java create mode 100644 ff-game/src/main/java/com/ff/game/api/ae/client/AEClient.java create mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/AEResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/XKBetRecordResponseDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/XKCreateMemberResponseDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/XKExchangeMoneyResponseDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/XKKickMemberAllDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/XKKickMemberDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/XKLoginWithoutRedirectResponseDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/XKMemberInfoDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/ae/impl/GamesAEServiceImpl.java diff --git a/ff-base/src/main/java/com/ff/base/constant/Constants.java b/ff-base/src/main/java/com/ff/base/constant/Constants.java index cfb844f..50e62d9 100644 --- a/ff-base/src/main/java/com/ff/base/constant/Constants.java +++ b/ff-base/src/main/java/com/ff/base/constant/Constants.java @@ -213,7 +213,10 @@ public class Constants { */ public static final String DG_API_BASE_URL = "dg.api.base.url"; - + /** + * ae api基本url + */ + public static final String AE_API_BASE_URL = "ae.api.base.url"; /** * sa-api基本url */ diff --git a/ff-game/src/main/java/com/ff/game/api/ae/address/MyAEAddressSource.java b/ff-game/src/main/java/com/ff/game/api/ae/address/MyAEAddressSource.java new file mode 100644 index 0000000..21eba22 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/ae/address/MyAEAddressSource.java @@ -0,0 +1,31 @@ +package com.ff.game.api.ae.address; + +import com.dtflys.forest.callback.AddressSource; +import com.dtflys.forest.http.ForestAddress; +import com.dtflys.forest.http.ForestRequest; +import com.ff.base.constant.Constants; +import com.ff.base.system.service.ISysConfigService; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + + +/** + * 我jili address来源 + * + * @author shi + * @date 2025/02/10 + */ +@Component +public class MyAEAddressSource implements AddressSource { + + @Resource + private ISysConfigService configService; + + + @Override + public ForestAddress getAddress(ForestRequest request) { + String apiBaseUrl = configService.selectConfigByKey(Constants.AE_API_BASE_URL); + return new ForestAddress("https",apiBaseUrl, 443,""); + } +} \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/ae/client/AEClient.java b/ff-game/src/main/java/com/ff/game/api/ae/client/AEClient.java new file mode 100644 index 0000000..4427faf --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/ae/client/AEClient.java @@ -0,0 +1,97 @@ +package com.ff.game.api.ae.client; + +import com.dtflys.forest.annotation.*; +import com.ff.game.api.ae.address.MyAEAddressSource; +import com.ff.game.api.ae.dto.*; +import com.ff.game.api.ae.impl.GamesAEServiceImpl; +import com.ff.game.api.jili.dto.*; +import com.ff.game.api.xk.dto.XKGamesDTO; + +import java.util.Map; + +/** + * xk 请求 + * + * @author shi + * @date 2025/02/10 + */ +@Address(source = MyAEAddressSource.class) +public interface AEClient { + /** + * 创建成员 + * + * @param params 参数 + * @return {@link String } + */ + @Post(url ="/wallet/createMember", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + AEResponse createMember(@Body Map params); + + /** + * 获取会员信息 + * + * @param params 参数 + * @return {@link XKMemberInfoDTO } + */ + @Post("/getMemberInfo") + XKMemberInfoDTO getMemberInfo(@JSONBody Map params); + + /** + * 无重定向登录 + * + * @param params 参数 + * @return {@link JILILoginWithoutRedirectResponseDTO } + */ + @Post("/loginWithoutRedirect") + XKLoginWithoutRedirectResponseDTO loginWithoutRedirect(@JSONBody Map params); + + /** + * 获取游戏列表 + * + * @param params 参数 + * @return {@link JILIGamesDTO } + */ + @Post("/getGameList") + XKGamesDTO getGameList(@JSONBody Map params); + + /** + * 按代理id进行交换转账 + * + * @param params 参数 + * @return {@link JILIExchangeMoneyResponseDTO } + */ + @Post(url = "/exchangeTransferByAgentId") + XKExchangeMoneyResponseDTO exchangeTransferByAgentId(@JSONBody Map params); + + /** + * 按时间获取投注记录 + * + * @param params 参数 + * @return {@link XKBetRecordResponseDTO } + */ + @Post(url = "/getGameRecordByTime") + XKBetRecordResponseDTO getBetRecordByTime(@JSONBody Map params); + + + /** + * 踢出队员 + * + * @param params 参数 + * @return {@link JILIKickMemberDTO } + */ + @Post("/kickMember") + XKKickMemberDTO kickMember(@JSONBody Map params); + + /** + * 踢出所有队员 + * + * @param params 参数 + * @return {@link JILIKickMemberAllDTO } + */ + @Get("/kickMemberAll") + XKKickMemberAllDTO kickMemberAll(@JSONBody Map params); + + +} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/AEResponse.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/AEResponse.java new file mode 100644 index 0000000..499a484 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/ae/dto/AEResponse.java @@ -0,0 +1,26 @@ +package com.ff.game.api.ae.dto; + +import lombok.Data; + +/** + * 航空响应 + * + * @author shi + * @date 2025/03/28 + */ +@Data +public class AEResponse { + /** + * 状态码 (String类型) + * 0000 - 成功 + * 其他 - 错误状态码 + */ + private String status; + + /** + * 描述信息 (String类型) + * "Success" - 请求成功 + * 其他 - 错误信息 + */ + private String desc; +} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKBetRecordResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKBetRecordResponseDTO.java new file mode 100644 index 0000000..a4c3540 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKBetRecordResponseDTO.java @@ -0,0 +1,54 @@ +package com.ff.game.api.ae.dto; + +import io.jsonwebtoken.lang.Collections; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +@NoArgsConstructor +@Data +public class XKBetRecordResponseDTO { + + private Integer code; + private String msg; + private DataBean data; + + @NoArgsConstructor + @Data + public static class DataBean { + private Integer currentPage; + private Integer totalPages; + private Integer pageLimit; + private Integer totalNumber; + private List result; + + public List getResult() { + if (Collections.isEmpty(result)) { + return new ArrayList<>(); + } + return result; + } + + @NoArgsConstructor + @Data + public static class ResultBean { + private String account; + private Long wagersId; + private String gameId; + private Long wagersTime; + private BigDecimal betAmount; + private Long payoffTime; + private BigDecimal payoffAmount; + private Integer status; + private Long settlementTime; + private Integer gameCategoryId; + private Integer type; + private String agentId; + private BigDecimal turnover; + private Long roundIndex; + } + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKCreateMemberResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKCreateMemberResponseDTO.java new file mode 100644 index 0000000..01578a0 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKCreateMemberResponseDTO.java @@ -0,0 +1,32 @@ +package com.ff.game.api.ae.dto; + + +import com.ff.game.api.request.GamesBaseRequestDTO; +import lombok.Data; +import lombok.NoArgsConstructor; + + +/** + * 创建成员响应dto + * + * @author shi + * @date 2024/10/22 + */ +@NoArgsConstructor +@Data +public class XKCreateMemberResponseDTO extends GamesBaseRequestDTO { + + + /** + * 代码 + */ + private int code; + /** + * 数据 + */ + private String data; + /** + * msg + */ + private String msg; +} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKExchangeMoneyResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKExchangeMoneyResponseDTO.java new file mode 100644 index 0000000..be8a729 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKExchangeMoneyResponseDTO.java @@ -0,0 +1,46 @@ +package com.ff.game.api.ae.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +@NoArgsConstructor +@Data +public class XKExchangeMoneyResponseDTO { + + private int code; + private String msg; + private DataBean data; + + @NoArgsConstructor + @Data + public static class DataBean { + /** + * 交易序号,额度转移纪录唯一值, 长度上限 50 + */ + private String transactionId; + /** + * 转账前金额(游戏币) + */ + private BigDecimal coinBefore; + /** + * 转账后金额(游戏币) + */ + private BigDecimal coinAfter; + /** + * 转账前金额(指定货币) + */ + private BigDecimal currencyBefore; + /** + * 转账后金额(指定货币) + */ + private BigDecimal currencyAfter; + /** + * 状态: + * 1: 成功 + * 2: 失败 + */ + private Integer status; + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKKickMemberAllDTO.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKKickMemberAllDTO.java new file mode 100644 index 0000000..ea17acc --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKKickMemberAllDTO.java @@ -0,0 +1,27 @@ +package com.ff.game.api.ae.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * xkkick会员全部dto + * + * @author shi + * @date 2024/11/13 + */ +@Data +@NoArgsConstructor +public class XKKickMemberAllDTO { + /** + * 代码 + */ + private int code; + /** + * 数据 + */ + private String data; + /** + * msg + */ + private String msg; +} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKKickMemberDTO.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKKickMemberDTO.java new file mode 100644 index 0000000..ac5ea42 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKKickMemberDTO.java @@ -0,0 +1,13 @@ +package com.ff.game.api.ae.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@Data +public class XKKickMemberDTO { + + private int code; + private String msg; + private Object data; +} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKLoginWithoutRedirectResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKLoginWithoutRedirectResponseDTO.java new file mode 100644 index 0000000..e622416 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKLoginWithoutRedirectResponseDTO.java @@ -0,0 +1,29 @@ +package com.ff.game.api.ae.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 登录时不重定向响应dto + * + * @author shi + * @date 2024/10/22 + */ +@NoArgsConstructor +@Data +public class XKLoginWithoutRedirectResponseDTO { + + + /** + * 代码 + */ + private int code; + /** + * 数据 + */ + private String data; + /** + * msg + */ + private String msg; +} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKMemberInfoDTO.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKMemberInfoDTO.java new file mode 100644 index 0000000..ae6a3bb --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKMemberInfoDTO.java @@ -0,0 +1,49 @@ +package com.ff.game.api.ae.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 会员信息dto + * + * @author shi + * @date 2024/10/30 + */ +@NoArgsConstructor +@Data +public class XKMemberInfoDTO { + + + /** + * 代码 + */ + private Integer code; + /** + * msg + */ + private String msg; + /** + * 数据 + */ + private List data; + + @NoArgsConstructor + @Data + public static class DataBean { + /** + * 账户 + */ + private String account; + /** + * 平衡 + */ + private BigDecimal balance; + /** + * 地位 + */ + private Integer status; + } +} 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 new file mode 100644 index 0000000..0bd6601 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/ae/impl/GamesAEServiceImpl.java @@ -0,0 +1,594 @@ +package com.ff.game.api.ae.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; +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.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.client.AEClient; +import com.ff.game.api.ae.dto.*; +import com.ff.game.api.request.*; +import com.ff.game.api.xk.dto.XKGamesDTO; +import com.ff.game.domain.*; +import com.ff.game.dto.GameSecretKeyCurrencyDTO; +import com.ff.game.service.*; +import com.ff.member.domain.Member; +import com.ff.member.service.IMemberService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + + +/** + * AE 游戏 impl + * + * @author shi + * @date 2024/11/12 + */ +@Service("AEService") +@Slf4j +public class GamesAEServiceImpl implements IGamesService { + + + @Resource + private ISysConfigService configService; + + @Resource + private RedisCache redisCache; + + @Resource + private IGameExchangeMoneyService gameExchangeMoneyService; + + + @Resource + private IGamePlatformService gamePlatformService; + + + @Resource + private IGameService gameService; + + + @Resource + private IMemberService memberService; + + @Resource + private IGameFreeRecordService gameFreeRecordService; + @Resource + private IGameSecretKeyService gameSecretKeyService; + + @Resource + private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; + + @Resource + private AEClient AEClient; + + + @Resource + private KeyConfig keyConfig; + + @Resource + private IGameBettingDetailsService gameBettingDetailsService; + + @Resource + private IGameNameService gameNameService; + + + /** + * 获得就是成功 + * + * @param errorCode 错误代码 + * @return {@link Boolean } + */ + private Boolean getIsSuccess(Integer errorCode) { + return 0 == errorCode; + } + + + /** + * 获取密钥 + * + * @param gamesBaseRequestDTO 游戏请求dto + * @return {@link Map }<{@link String }, {@link Object }> + */ + private Map getKey(GamesBaseRequestDTO gamesBaseRequestDTO ) { + Map params = new LinkedHashMap<>(); + params.put("cert",gamesBaseRequestDTO.getAgentKey()); + params.put("agentId",gamesBaseRequestDTO.getAgentId()); + return params; + } + + /** + * 创建成员 + * + * @param createMemberRequestDTO 创建成员请求dto + * @return {@link Boolean } + */ + @Override + public Boolean createMember(CreateMemberRequestDTO createMemberRequestDTO) { + log.info("GamesAEServiceImpl [createMember] 请求参数 {}", createMemberRequestDTO); + + Map params = this.getKey(createMemberRequestDTO); + params.put("userId", createMemberRequestDTO.getAccount()); + params.put("currency", createMemberRequestDTO.getCurrency()); + params.put("betLimit", "{}"); + AEResponse aeResponse = AEClient.createMember(params); + String errorCode = aeResponse.getStatus(); + if (this.getIsSuccess(Integer.valueOf(errorCode))) { + return Boolean.TRUE; + } + //判断是否获取成功 + return Boolean.FALSE; + } + + + /** + * 获取会员信息 + * + * @param memberInfoRequestDTO 会员信息请求dto + * @return {@link MemberInfoResponseDTO } + */ + @Override + public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO memberInfoRequestDTO) { + log.info("GamesXKServiceImpl [getMemberInfo] 请求参数 {}", memberInfoRequestDTO); + return null; + } + + /** + * 无重定向登录 + * + * @param gamesLogin 游戏登录 + * @return {@link String } + */ + @Override + public String loginWithoutRedirect(GamesLogin gamesLogin) { + log.info("GamesXKServiceImpl [loginWithoutRedirect] 请求参数 {}", gamesLogin); + + Map params = new LinkedHashMap<>(); + params.put("account", gamesLogin.getAccount()); + params.put("gameId", Integer.valueOf(gamesLogin.getGameId())); + params.put("lang", gamesLogin.getLang()); + params.put("agentId", gamesLogin.getAgentId()); + String query = JsonUtil.mapToQueryString(params); + gamesLogin.setQuery(query); + Map key = this.getKey(gamesLogin); + params.put("key", key); + params.put("disableFullScreen", gamesLogin.getDisableFullScreen()); + params.put("homeUrl", gamesLogin.getHomeUrl()); + params.put("platform", gamesLogin.getPlatform()); + XKLoginWithoutRedirectResponseDTO xkLoginWithoutRedirectResponseDTO = AEClient.loginWithoutRedirect(params); + //判断是否获取成功 + if (this.getIsSuccess(xkLoginWithoutRedirectResponseDTO.getCode())) { + return xkLoginWithoutRedirectResponseDTO.getData(); + } else { + throw new BaseException(xkLoginWithoutRedirectResponseDTO.getMsg()); + } + } + + + /** + * 获取游戏列表 + * + * @param gamesBaseRequestDTO 游戏请求dto + * @return {@link String } + */ + @Transactional + @Override + public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) { + + List gamesDatas = redisCache.getCacheList(CacheConstants.XK_GAMES); + if (!CollectionUtils.isEmpty(gamesDatas)) { + return CacheConstants.XK_GAMES; + } + + + Map params = new LinkedHashMap<>(); + params.put("agentId", gamesBaseRequestDTO.getAgentId()); + String query = JsonUtil.mapToQueryString(params); + gamesBaseRequestDTO.setQuery(query); + Map key = this.getKey(gamesBaseRequestDTO); + params.put("key", key); + + XKGamesDTO xkGamesDTO = AEClient.getGameList(params); + //判断是否获取成功 + 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); + } + Game game = Game.builder() + .platformId(gamePlatform.getId()) + .gameCode(String.valueOf(gamesDataDTO.getGameId())) + .build(); + List games = gameService.selectGameList(game); + //不存在这个游戏 + if (CollectionUtils.isEmpty(games)) { + game.setGameSourceType(String.valueOf(gamesDataDTO.getGameCategoryId())); + game.setFreespin(gamesDataDTO.isFreeSpin()); + game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); + game.setGameName(gamesDataDTO.getName()); + game.setCreateBy(Constants.SYSTEM); + gameService.insertGame(game); + } else { + 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); + redisCache.setCacheList(CacheConstants.XK_GAMES, xkGamesDTO.getData()); + redisCache.expire(CacheConstants.XK_GAMES, 5L, TimeUnit.HOURS); + } else { + throw new BaseException(xkGamesDTO.getMsg()); + + } + + return CacheConstants.XK_GAMES; + } + + /** + * 按代理id进行交换转账 + * + * @param exchangeTransferMoneyRequestDTO 外汇转账moeny dto + * @return {@link Long } + */ + @Override + @Transactional + public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { + log.info("GamesXKServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); + GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() + .platformCode(GamePlatforms.XK.getInfo()) + .code(exchangeTransferMoneyRequestDTO.getAgentId()) + .build()); + + Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); + String transactionId = GamePlatforms.XK.getCode() + IdUtils.simpleUUID(); + 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(currencyDTO.getSystemCurrency()) + .memberId(member.getId()) + .transactionId(transactionId) + .platformCode(GamePlatforms.XK.getCode()) + .build(); + exchangeMoney.setCreateBy(Constants.SYSTEM); + //接口限制限制50字符 + exchangeMoney.setTransactionId(GamePlatforms.XK.getCode() + IdUtils.simpleUUID()); + Map params = new LinkedHashMap<>(); + params.put("account", exchangeTransferMoneyRequestDTO.getAccount()); + params.put("transactionId", exchangeMoney.getTransactionId()); + params.put("amount", exchangeTransferMoneyRequestDTO.getAmount().stripTrailingZeros().toPlainString()); + params.put("transferType", exchangeTransferMoneyRequestDTO.getTransferType()); + params.put("agentId", exchangeTransferMoneyRequestDTO.getAgentId()); + String query = JsonUtil.mapToQueryString(params); + exchangeTransferMoneyRequestDTO.setQuery(query); + Map key = this.getKey(exchangeTransferMoneyRequestDTO); + params.put("key", key); + XKExchangeMoneyResponseDTO exchangeMoneyResponse = AEClient.exchangeTransferByAgentId(params); + //判断是否转移成功 + if (this.getIsSuccess(exchangeMoneyResponse.getCode())) { + XKExchangeMoneyResponseDTO.DataBean exchangeMoneyResponseData = exchangeMoneyResponse.getData(); + ApiException.isTrue(!StatusType.FAILURE.getValue().equals(exchangeMoneyResponseData.getStatus()), ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); + + //更新数据 + exchangeMoney.setBalance(NumberUtil.sub(exchangeMoneyResponseData.getCurrencyAfter(), exchangeMoneyResponseData.getCurrencyBefore()).abs()); + exchangeMoney.setCoinBefore(exchangeMoneyResponseData.getCoinBefore()); + exchangeMoney.setCoinAfter(exchangeMoneyResponseData.getCoinAfter()); + exchangeMoney.setCurrencyBefore(exchangeMoneyResponseData.getCurrencyBefore()); + exchangeMoney.setCurrencyAfter(exchangeMoneyResponseData.getCurrencyAfter()); + exchangeMoney.setStatus(exchangeMoneyResponseData.getStatus()); + gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + } else { + log.error("GamesXKServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{},错误信息{}", exchangeMoneyResponse.getCode(), exchangeMoneyResponse.getMsg()); + throw new BaseException(exchangeMoneyResponse.getMsg()); + } + + return exchangeMoney.getId(); + } + + /** + * 汇兑转移状态 + * + * @param exchangeTransferMoneyRequestDTO 兑换转账请求dto + * @return {@link Boolean } + */ + @Override + public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + return Boolean.TRUE; + } + + + /** + * 按时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link List }<{@link GameBettingDetails }> + */ + @Override + public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { + List gameBettingDetails = new ArrayList<>(); + //请求参数 + log.info("GamesXKServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO); + Map params = new LinkedHashMap<>(); + params.put("startTime", betRecordByTimeDTO.getStartTime()); + params.put("endTime", betRecordByTimeDTO.getEndTime()); + params.put("page", betRecordByTimeDTO.getPage()); + params.put("pageLimit", betRecordByTimeDTO.getPageLimit()); + params.put("agentId", betRecordByTimeDTO.getAgentId()); + String query = JsonUtil.mapToQueryString(params); + betRecordByTimeDTO.setQuery(query); + Map key = this.getKey(betRecordByTimeDTO); + params.put("key", key); + XKBetRecordResponseDTO xkBetRecordResponseDTO = AEClient.getBetRecordByTime(params); + + //判断是否获取成功 + if (this.getIsSuccess(xkBetRecordResponseDTO.getCode())) { + //数据组装 + XKBetRecordResponseDTO.DataBean dataBean = xkBetRecordResponseDTO.getData(); + this.batchInsert(xkBetRecordResponseDTO); + + //获取下一页数据 + while (!Objects.equals(dataBean.getCurrentPage(), dataBean.getTotalPages()) && dataBean.getTotalPages() > 0) { + betRecordByTimeDTO.setPage(dataBean.getCurrentPage() + 1); + //请求参数 + params = new LinkedHashMap<>(); + params.put("startTime", betRecordByTimeDTO.getStartTime()); + params.put("endTime", betRecordByTimeDTO.getEndTime()); + params.put("page", betRecordByTimeDTO.getPage()); + params.put("pageLimit", betRecordByTimeDTO.getPageLimit()); + params.put("agentId", betRecordByTimeDTO.getAgentId()); + query = JsonUtil.mapToQueryString(params); + betRecordByTimeDTO.setQuery(query); + key = this.getKey(betRecordByTimeDTO); + params.put("key", key); + xkBetRecordResponseDTO = AEClient.getBetRecordByTime(params); + this.batchInsert(xkBetRecordResponseDTO); + } + + + return Boolean.TRUE; + } else { + log.error("GamesXKServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", xkBetRecordResponseDTO.getCode(), xkBetRecordResponseDTO.getMsg()); + throw new BaseException(xkBetRecordResponseDTO.getMsg()); + } + + } + + /** + * 按历史时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link Boolean } + */ + @Override + public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { + return null; + } + + /** + * 赠送免费局数 + * + * @param createFreeSpinRequest 创建自由旋转请求 + * @return {@link Boolean } + */ + @Override + public Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + /** + * 获取游戏详细信息 + * + * @param getGameDetailRequestDTO 获取游戏详细信息请求dto + * @return {@link GetGameDetailResponseDTO } + */ + @Override + public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + /** + * 强制会员从游戏注销 + * + * @param kickMemberRequestDTO 踢会员请求dto + * @return {@link Boolean } + */ + @Override + public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) { + log.info("GamesXKServiceImpl [kickMember] 请求参数 {}", kickMemberRequestDTO); + Map params = new LinkedHashMap<>(); + params.put("account", kickMemberRequestDTO.getAccount()); + params.put("agentId", kickMemberRequestDTO.getAgentId()); + String query = JsonUtil.mapToQueryString(params); + kickMemberRequestDTO.setQuery(query); + Map key = this.getKey(kickMemberRequestDTO); + params.put("key", key); + XKKickMemberDTO xkKickMemberDTO = AEClient.kickMember(params); + //判断是否获取成功 + if (this.getIsSuccess(xkKickMemberDTO.getCode())) { + return Boolean.TRUE; + } else { + throw new BaseException(xkKickMemberDTO.getMsg()); + } + } + + /** + * 踢成员全部 + * + * @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 xkBetRecordResponseDTO xk下注记录响应dto + */ + private void batchInsert(XKBetRecordResponseDTO xkBetRecordResponseDTO) { + List gameBettingDetails = new ArrayList<>(); + List wagersIds = new ArrayList<>(); + //数据组装 + XKBetRecordResponseDTO.DataBean dataBean = xkBetRecordResponseDTO.getData(); + //数据转化 + for (XKBetRecordResponseDTO.DataBean.ResultBean bean : dataBean.getResult()) { + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean).build()); + if (!ObjectUtils.isEmpty(bettingDetails)) { + bettingDetails.setId(IdUtil.getSnowflakeNextId()); + gameBettingDetails.add(bettingDetails); + } + wagersIds.add(String.valueOf(bean.getWagersId())); + } + if (!CollectionUtils.isEmpty(gameBettingDetails)) { + //查询重复数据id + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds); + //用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) { + //转化类 + XKBetRecordResponseDTO.DataBean.ResultBean resultBean = (XKBetRecordResponseDTO.DataBean.ResultBean) gamesDataBuildDTO.getData(); + + GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() + .platformCode(GamePlatforms.XK.getInfo()) + .code(resultBean.getAgentId()) + .build()); + + Member member = memberService.selectMemberByGameAccount(resultBean.getAccount()); + if (ObjectUtils.isEmpty(member)) { + return null; + } + List gamesDatas = redisCache.getCacheList(CacheConstants.XK_GAMES); + Map dataDTOMap = gamesDatas.stream().collect(Collectors.toMap(XKGamesDTO.DataBean::getGameId, e -> e)); + XKGamesDTO.DataBean gamesDataDTO = dataDTOMap.get(resultBean.getGameId()); + BigDecimal payoffAmount = BigDecimal.ZERO; + + if (GameStatus.WIN.getCode().equals(resultBean.getStatus())) { + payoffAmount = NumberUtil.sub(resultBean.getPayoffAmount(), resultBean.getTurnover()); + } else if (GameStatus.FAIL.getCode().equals(resultBean.getStatus())) { + payoffAmount = NumberUtil.sub(resultBean.getPayoffAmount(), resultBean.getTurnover()).negate(); + } + //数据构造 + GameBettingDetails gameBettingDetails = GameBettingDetails.builder() + .tenantKey(member.getTenantKey()) + //保存我们的币种id + .currencyCode(currencyDTO.getSystemCurrency()) + .memberId(member.getId()) + .gameCode(resultBean.getGameId()) + .gameType(XKGameType.findSystemByCode(resultBean.getGameCategoryId())) + .platformCode(GamePlatforms.XK.getCode()) + .gameId(gamesDataDTO.getSystemGameId()) + .gameName(gamesDataDTO.getName()) + .gameStatus(resultBean.getStatus()) + .gameStatusType(resultBean.getType()) + .gameCurrencyCode(resultBean.getAgentId()) + .account(String.valueOf(resultBean.getAccount())) + .wagersId(String.valueOf(resultBean.getWagersId())) + .wagersTime(resultBean.getWagersTime()) + .betAmount(resultBean.getBetAmount().abs()) + .payoffTime(resultBean.getPayoffTime()) + .payoffAmount(payoffAmount) + .settlementTime(resultBean.getSettlementTime()) + .turnover(resultBean.getTurnover()) + .orderNo(String.valueOf(resultBean.getRoundIndex())) + .settlementStatus(SettlementStatusEnum.COMPLETED.getCode()) + .build(); + gameBettingDetails.setCreateBy(Constants.SYSTEM); + gameBettingDetails.setCreateTime(DateUtils.getNowDate()); + return gameBettingDetails; + } +} From 1d21ed26adfd78d2e5cca239ef721c76d885d3a7 Mon Sep 17 00:00:00 2001 From: shi Date: Mon, 31 Mar 2025 11:23:52 +0800 Subject: [PATCH 04/62] =?UTF-8?q?fix(game):=20=E8=A1=A5=E5=85=85=20pgx=20?= =?UTF-8?q?=E5=BD=A9=E7=A7=8D=E5=BC=80=E5=A5=96=E6=8E=A5=E5=8F=A3=20url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ff-game/src/main/java/com/ff/game/api/pgx/client/PGXClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8cb1827..9632bfe 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,7 +106,7 @@ public interface PGXClient { * * @return {@link PGXBetHistoryResponse } */ - @Get(url = "/fetchArchieve.aspx?{parameters}") + @Get(url = "http://fetch.336699bet.com/fetchArchieve.aspx?{parameters}") PGXBetHistoryResponse getBetRecordByTime(@Var("parameters") String parameters); From dd65af91b8fafae91364012a417f3dd0c20cd348 Mon Sep 17 00:00:00 2001 From: shi Date: Mon, 31 Mar 2025 13:38:34 +0800 Subject: [PATCH 05/62] =?UTF-8?q?fix(game):=20=E4=BF=AE=E5=A4=8D=E6=B8=B8?= =?UTF-8?q?=E6=88=8F=E5=B9=B3=E5=8F=B0=E6=B3=A8=E5=8D=95=E6=8B=89=E5=8F=96?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=B8=BA=E7=A9=BA=E6=97=B6=E7=9A=84=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 JILI 和 XK游戏平台的注单拉取逻辑中,添加了对返回数据为空的处理 - 确保在数据为空时不会出现空指针异常,提高了代码的健壮性 --- .../com/ff/game/api/jili/service/impl/GamesJILIServiceImpl.java | 1 + .../java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java | 1 + 2 files changed, 2 insertions(+) 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 0b6924e..75ea7c7 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 @@ -422,6 +422,7 @@ public class GamesJILIServiceImpl implements IGamesService { 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); 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 82675d3..7f5dd15 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 @@ -432,6 +432,7 @@ public class GamesXKServiceImpl implements IGamesService { key = this.getKey(betRecordByTimeDTO); params.put("key", key); xkBetRecordResponseDTO = xkClient.getBetRecordByTime(params); + dataBean = xkBetRecordResponseDTO.getData(); this.batchInsert(xkBetRecordResponseDTO); } From 5f9af0e041aaada7d76e29aef9eb7739fcd177b1 Mon Sep 17 00:00:00 2001 From: cengy Date: Mon, 31 Mar 2025 14:51:25 +0800 Subject: [PATCH 06/62] =?UTF-8?q?chore:=20=E6=B7=BB=E5=8A=A0=20.gitignore?= =?UTF-8?q?=20=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建 .gitignore 文件,排除构建工具、IDE 和其他工具产生的临时文件和目录 -保留必要的构建脚本文件 - 优化项目结构,提高代码可读性和可维护性 --- .gitignore | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3151277 --- /dev/null +++ b/.gitignore @@ -0,0 +1,49 @@ +###################################################################### +# Build Tools + +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar + +target/ +!.mvn/wrapper/maven-wrapper.jar + +###################################################################### +# IDE + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### JRebel ### +rebel.xml + +### NetBeans ### +nbproject/private/ +build/* +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +###################################################################### +# Others +*.log +*.xml.versionsBackup +*.swp + +!*/build/*.java +!*/build/*.html +!*/build/*.xml +logs/ +.idea/ \ No newline at end of file From 210d878de78f654132a77730800ed8c140d984ac Mon Sep 17 00:00:00 2001 From: shi Date: Mon, 31 Mar 2025 15:23:56 +0800 Subject: [PATCH 07/62] =?UTF-8?q?feat(member):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BC=9A=E5=91=98=E6=8A=95=E6=B3=A8=E9=99=90=E9=A2=9D=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在会员创建接口中增加投注限额参数 - 更新相关 DTO 和服务实现以支持投注限额- 使用 JSON 序列化投注限额对象以适应 AE 接口要求 --- .../java/com/ff/api/controller/ApiMemberController.java | 1 + .../java/com/ff/api/request/MemberCreateApiRequest.java | 6 ++++++ .../java/com/ff/game/api/ae/impl/GamesAEServiceImpl.java | 3 ++- .../com/ff/game/api/request/CreateMemberRequestDTO.java | 7 +++++++ 4 files changed, 16 insertions(+), 1 deletion(-) 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 e82fc57..95fdd5a 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 @@ -132,6 +132,7 @@ public class ApiMemberController extends BaseController { .account(gameAccount) .agentId(gameSecretKey.getCode()) .agentKey(gameSecretKey.getKey()) + .betLimit(memberCreateApiRequest.getBetLimit()) .currency(gameSecretKey.getCurrency()) .build(); Boolean result = iGamesService.createMember(gamesBaseRequestDTO); diff --git a/ff-game/src/main/java/com/ff/api/request/MemberCreateApiRequest.java b/ff-game/src/main/java/com/ff/api/request/MemberCreateApiRequest.java index 249d3f7..1644857 100644 --- a/ff-game/src/main/java/com/ff/api/request/MemberCreateApiRequest.java +++ b/ff-game/src/main/java/com/ff/api/request/MemberCreateApiRequest.java @@ -8,6 +8,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import java.io.Serializable; +import java.util.Map; /** * 创建成员请求 @@ -34,4 +35,9 @@ public class MemberCreateApiRequest implements Serializable{ @Length(max = 32, message = "currencyCode长度不能超过32个字符") private String currencyCode; + /** + * 投注限额 + */ + private Map>> betLimit; + } 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 0bd6601..f388dfd 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 @@ -2,6 +2,7 @@ package com.ff.game.api.ae.impl; 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; import com.ff.base.core.redis.RedisCache; @@ -129,7 +130,7 @@ public class GamesAEServiceImpl implements IGamesService { Map params = this.getKey(createMemberRequestDTO); params.put("userId", createMemberRequestDTO.getAccount()); params.put("currency", createMemberRequestDTO.getCurrency()); - params.put("betLimit", "{}"); + params.put("betLimit", JsonUtil.objToString(createMemberRequestDTO.getBetLimit())); AEResponse aeResponse = AEClient.createMember(params); String errorCode = aeResponse.getStatus(); if (this.getIsSuccess(Integer.valueOf(errorCode))) { diff --git a/ff-game/src/main/java/com/ff/game/api/request/CreateMemberRequestDTO.java b/ff-game/src/main/java/com/ff/game/api/request/CreateMemberRequestDTO.java index 46ec0ab..52b4c5c 100644 --- a/ff-game/src/main/java/com/ff/game/api/request/CreateMemberRequestDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/request/CreateMemberRequestDTO.java @@ -6,6 +6,8 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import java.util.Map; + /** * 创建成员请求dto * @@ -22,5 +24,10 @@ public class CreateMemberRequestDTO extends GamesBaseRequestDTO { */ private String account; + /** + * 投注限额 + */ + private Map>> betLimit; + } From d211dd2d7ea954963391b2877187cb639065e9b4 Mon Sep 17 00:00:00 2001 From: shi Date: Mon, 31 Mar 2025 16:48:58 +0800 Subject: [PATCH 08/62] =?UTF-8?q?refactor(game):=20=E6=9B=B4=E6=96=B0=20PG?= =?UTF-8?q?XBetHistoryResponse=20=E5=92=8C=20PGXClient?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 PGXBetHistoryResponse 中的 int 类型改为 Long 类型 - 修改 PGXClient 中的 API 调用地址 --- .../java/com/ff/game/api/pgx/client/PGXClient.java | 2 +- .../com/ff/game/api/pgx/dto/PGXBetHistoryResponse.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) 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 9632bfe..ee9c68b 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,7 +106,7 @@ public interface PGXClient { * * @return {@link PGXBetHistoryResponse } */ - @Get(url = "http://fetch.336699bet.com/fetchArchieve.aspx?{parameters}") + @Get(url = "http://fetch.336699bet.com/fetchbykey.aspx?{parameters}") PGXBetHistoryResponse getBetRecordByTime(@Var("parameters") String parameters); diff --git a/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXBetHistoryResponse.java b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXBetHistoryResponse.java index 6e43ba3..3dc564e 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXBetHistoryResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXBetHistoryResponse.java @@ -40,16 +40,16 @@ public class PGXBetHistoryResponse { public class Result { /** - * AIO注单号 (唯一值) (Int类型) + * AIO注单号 (唯一值) (Long类型) */ @JsonProperty("id") - private int id; + private Long id; /** - * 供应商注单号 (Int类型) + * 供应商注单号 (Long类型) */ @JsonProperty("ref_no") - private int refNo; + private Long refNo; /** * 供应商代号 (String类型) @@ -72,7 +72,7 @@ public class PGXBetHistoryResponse { /** * 游戏代号 (String类型) */ - @JsonProperty("gameid") + @JsonProperty("game_id") private String gameId; /** From ed4c981ef7cc8a8e3b41f3049c7f1c9245c4f494 Mon Sep 17 00:00:00 2001 From: shi Date: Mon, 31 Mar 2025 16:55:26 +0800 Subject: [PATCH 09/62] =?UTF-8?q?refactor(game):=20=E6=9B=B4=E6=96=B0=20PG?= =?UTF-8?q?XBetHistoryResponse=20=E5=92=8C=20PGXClient?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 PGXBetHistoryResponse 中的 int 类型改为 Long 类型 - 修改 PGXClient 中的 API 调用地址 --- .../com/ff/game/api/pgx/client/PGXClient.java | 5 +++++ .../game/api/pgx/impl/GamesPGXServiceImpl.java | 18 +++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) 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 ee9c68b..baf98c1 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 @@ -110,6 +110,11 @@ public interface PGXClient { PGXBetHistoryResponse getBetRecordByTime(@Var("parameters") String parameters); + + @Get(url = "http://fetch.336699bet.com/fetchArchieve.aspx?{parameters}") + PGXBetHistoryResponse getBetRecordByHistoryTime(@Var("parameters") String parameters); + + /** * 踢出队员 * 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 37f1673..bb33baf 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 @@ -474,7 +474,23 @@ public class GamesPGXServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { - return null; + //请求参数 + log.info("GamesPGXServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", betRecordByTimeDTO); + Map paramsMap = new LinkedHashMap<>(); + paramsMap.put("operatorcode", betRecordByTimeDTO.getAgentId()); + String key = this.getKey(paramsMap, betRecordByTimeDTO); + paramsMap.put("versionkey", 0); + paramsMap.put("signature", key); + PGXBetHistoryResponse betRecordByTime = PGXClient.getBetRecordByHistoryTime(JsonUtil.mapToQueryString(paramsMap)); + + if (this.getIsSuccess(betRecordByTime.getErrCode())) { + List results = JSON.parseArray(betRecordByTime.getResult(), PGXBetHistoryResponse.Result.class); + this.batchInsert(results, betRecordByTimeDTO); + return Boolean.TRUE; + } else { + log.error("GamesPGXServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getErrCode(), betRecordByTime.getErrMsg()); + throw new BaseException(betRecordByTime.getErrMsg()); + } } /** From 3e96c67d575bfc631932138b99a726fb035621f2 Mon Sep 17 00:00:00 2001 From: shi Date: Tue, 1 Apr 2025 11:18:26 +0800 Subject: [PATCH 10/62] =?UTF-8?q?feat(api):=20=E6=B7=BB=E5=8A=A0=20AE=20?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 AEClient 接口和相关 DTO 类- 实现 AE 平台的登录、获取会员信息、存款、 --- .../java/com/ff/base/enums/ErrorCode.java | 2 +- .../java/com/ff/base/enums/GamePlatforms.java | 1 + .../ff/api/controller/ApiGameController.java | 1 + .../com/ff/api/request/GameLoginRequest.java | 6 + .../com/ff/game/api/ae/client/AEClient.java | 40 +-- .../ff/game/api/ae/dto/AELoginResponse.java | 41 +++ .../com/ff/game/api/ae/dto/AEMemberInfo.java | 65 +++++ .../api/ae/dto/AETransactionResponse.java | 60 +++++ .../game/api/ae/impl/GamesAEServiceImpl.java | 248 +++++++++--------- .../dg/service/impl/GamesDGServiceImpl.java | 2 +- .../game/api/fc/impl/GamesFCServiceImpl.java | 16 +- .../service/impl/GamesJILIServiceImpl.java | 12 +- .../ng/service/impl/GamesPGServiceImpl.java | 2 +- .../api/pgx/impl/GamesPGXServiceImpl.java | 14 +- .../api/request/CreateMemberRequestDTO.java | 2 +- .../com/ff/game/api/request/GamesLogin.java | 8 + .../game/api/sa/impl/GamesSAServiceImpl.java | 6 +- .../xk/service/impl/GamesXKServiceImpl.java | 2 +- .../game/mapper/GameBettingDetailsMapper.java | 5 +- .../service/IGameBettingDetailsService.java | 2 +- .../impl/GameBettingDetailsServiceImpl.java | 4 +- .../com/ff/quartz/config/ScheduleConfig.java | 114 ++++---- .../mapper/game/GameBettingDetailsMapper.xml | 2 +- 23 files changed, 416 insertions(+), 239 deletions(-) create mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/AELoginResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/AEMemberInfo.java create mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/AETransactionResponse.java diff --git a/ff-base/src/main/java/com/ff/base/enums/ErrorCode.java b/ff-base/src/main/java/com/ff/base/enums/ErrorCode.java index b4c841e..ddb5bb7 100644 --- a/ff-base/src/main/java/com/ff/base/enums/ErrorCode.java +++ b/ff-base/src/main/java/com/ff/base/enums/ErrorCode.java @@ -13,7 +13,7 @@ import java.util.stream.Stream; */ @Getter public enum ErrorCode { - ERROR(500, "系统业务异常"), + ERROR(500, "业务异常"), GAME_ACCOUNT_CREATION_FAILED(1001, "当前游戏账号已存在"), ACCOUNT_NOT_EXIST(1002, "当前游戏账号不存在"), PLATFORM_NOT_EXIST(1003, "游戏平台不存在"), 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 6bd60a4..f372fb6 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 @@ -11,6 +11,7 @@ public enum GamePlatforms { FC("FC", "FC"), SA("SA", "SA"), DG("DG", "DG"), + AE("AE", "AE"), ; private final String code; diff --git a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java index cfaa77b..8abd9d3 100644 --- a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java +++ b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java @@ -171,6 +171,7 @@ public class ApiGameController extends BaseController { .currency(secretKeyCurrencyDTO.getCurrency()) .gameId(game.getGameCode()) .homeUrl(memberCreateApiRequest.getHomeUrl()) + .betLimit(memberCreateApiRequest.getBetLimit()) .platform(memberCreateApiRequest.getPlatform()) .disableFullScreen(memberCreateApiRequest.getDisableFullScreen()) .lang(gameSecretKeyLangDTO.getLang()) 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 cc85df7..a90f562 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 @@ -6,6 +6,7 @@ import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.io.Serializable; +import java.util.Map; /** * 游戏登录请求 @@ -59,4 +60,9 @@ public class GameLoginRequest implements Serializable { * 带入 1 即关闭全屏幕模式 */ private Integer disableFullScreen; + + /** + * ae 平台 投注限额 + */ + private Map>> betLimit; } diff --git a/ff-game/src/main/java/com/ff/game/api/ae/client/AEClient.java b/ff-game/src/main/java/com/ff/game/api/ae/client/AEClient.java index 4427faf..e87950c 100644 --- a/ff-game/src/main/java/com/ff/game/api/ae/client/AEClient.java +++ b/ff-game/src/main/java/com/ff/game/api/ae/client/AEClient.java @@ -3,9 +3,7 @@ package com.ff.game.api.ae.client; import com.dtflys.forest.annotation.*; import com.ff.game.api.ae.address.MyAEAddressSource; import com.ff.game.api.ae.dto.*; -import com.ff.game.api.ae.impl.GamesAEServiceImpl; import com.ff.game.api.jili.dto.*; -import com.ff.game.api.xk.dto.XKGamesDTO; import java.util.Map; @@ -33,28 +31,24 @@ public interface AEClient { * 获取会员信息 * * @param params 参数 - * @return {@link XKMemberInfoDTO } + * @return {@link AEMemberInfo } */ - @Post("/getMemberInfo") - XKMemberInfoDTO getMemberInfo(@JSONBody Map params); + @Post(url ="/wallet/getBalance", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + AEMemberInfo getMemberInfo(@Body Map params); /** * 无重定向登录 * * @param params 参数 - * @return {@link JILILoginWithoutRedirectResponseDTO } + * @return {@link AELoginResponse } */ - @Post("/loginWithoutRedirect") - XKLoginWithoutRedirectResponseDTO loginWithoutRedirect(@JSONBody Map params); + @Post("/wallet/login") + AELoginResponse loginWithoutRedirect(@Body Map params); + - /** - * 获取游戏列表 - * - * @param params 参数 - * @return {@link JILIGamesDTO } - */ - @Post("/getGameList") - XKGamesDTO getGameList(@JSONBody Map params); /** * 按代理id进行交换转账 @@ -62,8 +56,18 @@ public interface AEClient { * @param params 参数 * @return {@link JILIExchangeMoneyResponseDTO } */ - @Post(url = "/exchangeTransferByAgentId") - XKExchangeMoneyResponseDTO exchangeTransferByAgentId(@JSONBody Map params); + @Post(url ="/wallet/deposit", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + AETransactionResponse deposit(@Body Map params); + + + @Post(url ="/wallet/withdraw", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + AETransactionResponse withdraw(@Body Map params); /** * 按时间获取投注记录 diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/AELoginResponse.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/AELoginResponse.java new file mode 100644 index 0000000..76b33ed --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/ae/dto/AELoginResponse.java @@ -0,0 +1,41 @@ +package com.ff.game.api.ae.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +/** + * aelogin回应 + * + * @author shi + * @date 2025/04/01 + */ +@Data +public class AELoginResponse { + /** + * 响应状态 + */ + @JsonProperty("status") + private Integer status; + + + /** + * 描述信息 (String类型) + * "Success" - 请求成功 + * 其他 - 错误信息 + */ + private String desc; + + /** + * 登录 URL + */ + @JsonProperty("url") + private String url; + + /** + * 扩展字段,类型为列表,可以存储多项数据 + */ + @JsonProperty("extension") + private List extension; +} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/AEMemberInfo.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/AEMemberInfo.java new file mode 100644 index 0000000..5b51159 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/ae/dto/AEMemberInfo.java @@ -0,0 +1,65 @@ +package com.ff.game.api.ae.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.ZonedDateTime; +import java.util.Date; +import java.util.List; + +/** + * AEMEMBER信息 + * + * @author shi + * @date 2025/03/31 + */ +@Data +public class AEMemberInfo { + /** + * 响应结果列表,包含用户信息 + */ + @JsonProperty("results") + private List result; + + /** + * 记录数量 + */ + @JsonProperty("count") + private int count; + + /** + * 查询时间 + */ + @JsonProperty("querytime") + private Date queryTime; + + /** + * 响应状态 + */ + @JsonProperty("status") + private Integer status; + + @Data + public static class UserInfo { + + /** + * 用户ID + */ + @JsonProperty("userId") + private String userId; + + /** + * 用户余额 + */ + @JsonProperty("balance") + private BigDecimal balance; + + /** + * 最后修改时间 + */ + @JsonProperty("lastModified") + private Date lastModified; + } + +} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/AETransactionResponse.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/AETransactionResponse.java new file mode 100644 index 0000000..397d5ea --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/ae/dto/AETransactionResponse.java @@ -0,0 +1,60 @@ +package com.ff.game.api.ae.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.ZonedDateTime; + +/** + * 电子交易响应 + * + * @author shi + * @date 2025/04/01 + */ +@Data +public class AETransactionResponse { + + /** + * 响应状态 + */ + @JsonProperty("status") + private String status; + + + /** + * 金额 + */ + @JsonProperty("amount") + private BigDecimal amount; + + /** + * 交易方法(如:DEPOSIT, WITHDRAW) + */ + @JsonProperty("method") + private String method; + + /** + * 数据库ID + */ + @JsonProperty("databaseId") + private int databaseId; + + /** + * 当前余额 + */ + @JsonProperty("currentBalance") + private BigDecimal currentBalance; + + /** + * 最后修改时间 + */ + @JsonProperty("lastModified") + private ZonedDateTime lastModified; + + /** + * 交易代码 + */ + @JsonProperty("txCode") + private String txCode; +} 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 f388dfd..7003447 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 @@ -2,7 +2,6 @@ package com.ff.game.api.ae.impl; 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; import com.ff.base.core.redis.RedisCache; @@ -12,7 +11,6 @@ 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.sign.Md5Utils; import com.ff.base.utils.uuid.IdUtils; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; @@ -35,7 +33,6 @@ import org.springframework.util.ObjectUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -93,6 +90,21 @@ public class GamesAEServiceImpl implements IGamesService { private IGameNameService gameNameService; + /** + * 游戏id + */ + private static final Long GAME_ID = 1904452832756013817L; + + /** + * 平台ID + */ + private static final Long PLATFORM_ID = 1904411420257108325L; + + /** + * 游戏名称id + */ + private static final Long GAME_NAME_ID = 1904452833756002317L; + /** * 获得就是成功 * @@ -110,10 +122,10 @@ public class GamesAEServiceImpl implements IGamesService { * @param gamesBaseRequestDTO 游戏请求dto * @return {@link Map }<{@link String }, {@link Object }> */ - private Map getKey(GamesBaseRequestDTO gamesBaseRequestDTO ) { + private Map getKey(GamesBaseRequestDTO gamesBaseRequestDTO) { Map params = new LinkedHashMap<>(); - params.put("cert",gamesBaseRequestDTO.getAgentKey()); - params.put("agentId",gamesBaseRequestDTO.getAgentId()); + params.put("cert", gamesBaseRequestDTO.getAgentKey()); + params.put("agentId", gamesBaseRequestDTO.getAgentId()); return params; } @@ -149,8 +161,22 @@ public class GamesAEServiceImpl implements IGamesService { */ @Override public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO memberInfoRequestDTO) { - log.info("GamesXKServiceImpl [getMemberInfo] 请求参数 {}", memberInfoRequestDTO); - return null; + log.info("GamesAEServiceImpl [getMemberInfo] 请求参数 {}", memberInfoRequestDTO); + Map params = this.getKey(memberInfoRequestDTO); + params.put("alluser", 0); + params.put("userIds", memberInfoRequestDTO.getAccounts()); + AEMemberInfo memberInfo = AEClient.getMemberInfo(params); + //判断是否获取成功 + if (this.getIsSuccess(memberInfo.getStatus())) { + AEMemberInfo.UserInfo userInfo = memberInfo.getResult().get(0); + return MemberInfoResponseDTO.builder() + .status(GameMemberStatus.UNKNOWN.getCode()) + .balance(userInfo.getBalance()) + .account(memberInfoRequestDTO.getAccounts()) + .build(); + } else { + throw new ApiException(ErrorCode.ERROR.getCode()); + } } /** @@ -161,26 +187,19 @@ public class GamesAEServiceImpl implements IGamesService { */ @Override public String loginWithoutRedirect(GamesLogin gamesLogin) { - log.info("GamesXKServiceImpl [loginWithoutRedirect] 请求参数 {}", gamesLogin); + log.info("GamesAEServiceImpl [loginWithoutRedirect] 请求参数 {}", gamesLogin); - Map params = new LinkedHashMap<>(); - params.put("account", gamesLogin.getAccount()); - params.put("gameId", Integer.valueOf(gamesLogin.getGameId())); - params.put("lang", gamesLogin.getLang()); - params.put("agentId", gamesLogin.getAgentId()); - String query = JsonUtil.mapToQueryString(params); - gamesLogin.setQuery(query); - Map key = this.getKey(gamesLogin); - params.put("key", key); - params.put("disableFullScreen", gamesLogin.getDisableFullScreen()); - params.put("homeUrl", gamesLogin.getHomeUrl()); - params.put("platform", gamesLogin.getPlatform()); - XKLoginWithoutRedirectResponseDTO xkLoginWithoutRedirectResponseDTO = AEClient.loginWithoutRedirect(params); + Map params = this.getKey(gamesLogin); + params.put("userId", gamesLogin.getAccount()); + params.put("externalURL", gamesLogin.getHomeUrl()); + params.put("language", gamesLogin.getLang()); + params.put("betLimit", gamesLogin.getBetLimit()); + AELoginResponse aeLoginResponse = AEClient.loginWithoutRedirect(params); //判断是否获取成功 - if (this.getIsSuccess(xkLoginWithoutRedirectResponseDTO.getCode())) { - return xkLoginWithoutRedirectResponseDTO.getData(); + if (this.getIsSuccess(aeLoginResponse.getStatus())) { + return aeLoginResponse.getUrl(); } else { - throw new BaseException(xkLoginWithoutRedirectResponseDTO.getMsg()); + throw new BaseException(aeLoginResponse.getDesc()); } } @@ -194,74 +213,40 @@ public class GamesAEServiceImpl implements IGamesService { @Transactional @Override public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) { - - List gamesDatas = redisCache.getCacheList(CacheConstants.XK_GAMES); - if (!CollectionUtils.isEmpty(gamesDatas)) { - return CacheConstants.XK_GAMES; + 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); } - - - Map params = new LinkedHashMap<>(); - params.put("agentId", gamesBaseRequestDTO.getAgentId()); - String query = JsonUtil.mapToQueryString(params); - gamesBaseRequestDTO.setQuery(query); - Map key = this.getKey(gamesBaseRequestDTO); - params.put("key", key); - - XKGamesDTO xkGamesDTO = AEClient.getGameList(params); - //判断是否获取成功 - 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); - } - Game game = Game.builder() - .platformId(gamePlatform.getId()) - .gameCode(String.valueOf(gamesDataDTO.getGameId())) - .build(); - List games = gameService.selectGameList(game); - //不存在这个游戏 - if (CollectionUtils.isEmpty(games)) { - game.setGameSourceType(String.valueOf(gamesDataDTO.getGameCategoryId())); - game.setFreespin(gamesDataDTO.isFreeSpin()); - game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); - game.setGameName(gamesDataDTO.getName()); - game.setCreateBy(Constants.SYSTEM); - gameService.insertGame(game); - } else { - 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); - redisCache.setCacheList(CacheConstants.XK_GAMES, xkGamesDTO.getData()); - redisCache.expire(CacheConstants.XK_GAMES, 5L, TimeUnit.HOURS); - } else { - throw new BaseException(xkGamesDTO.getMsg()); - + Game game = gameService.selectGameById(GAME_ID); + //不存在这个游戏 + if (ObjectUtils.isEmpty(game)) { + game = new Game(); + game.setId(GAME_ID); + game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); + game.setPlatformId(gamePlatform.getId()); + game.setGameCode("1"); + game.setGameSourceType(String.valueOf(1)); + game.setGameName("AE大厅"); + game.setCreateBy(Constants.SYSTEM); + 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; @@ -276,14 +261,14 @@ public class GamesAEServiceImpl implements IGamesService { @Override @Transactional public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { - log.info("GamesXKServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); + log.info("GamesAEServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCode(GamePlatforms.XK.getInfo()) - .code(exchangeTransferMoneyRequestDTO.getAgentId()) + .platformCode(GamePlatforms.AE.getInfo()) + .code(exchangeTransferMoneyRequestDTO.getAgentId()) .build()); Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); - String transactionId = GamePlatforms.XK.getCode() + IdUtils.simpleUUID(); + String transactionId = GamePlatforms.AE.getCode() + IdUtils.simpleUUID(); List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( GameExchangeMoney.builder() .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) @@ -303,40 +288,44 @@ public class GamesAEServiceImpl implements IGamesService { .currencyCode(currencyDTO.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) - .platformCode(GamePlatforms.XK.getCode()) + .platformCode(GamePlatforms.AE.getInfo()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); - //接口限制限制50字符 - exchangeMoney.setTransactionId(GamePlatforms.XK.getCode() + IdUtils.simpleUUID()); - Map params = new LinkedHashMap<>(); - params.put("account", exchangeTransferMoneyRequestDTO.getAccount()); - params.put("transactionId", exchangeMoney.getTransactionId()); - params.put("amount", exchangeTransferMoneyRequestDTO.getAmount().stripTrailingZeros().toPlainString()); - params.put("transferType", exchangeTransferMoneyRequestDTO.getTransferType()); - params.put("agentId", exchangeTransferMoneyRequestDTO.getAgentId()); - String query = JsonUtil.mapToQueryString(params); - exchangeTransferMoneyRequestDTO.setQuery(query); - Map key = this.getKey(exchangeTransferMoneyRequestDTO); - params.put("key", key); - XKExchangeMoneyResponseDTO exchangeMoneyResponse = AEClient.exchangeTransferByAgentId(params); - //判断是否转移成功 - if (this.getIsSuccess(exchangeMoneyResponse.getCode())) { - XKExchangeMoneyResponseDTO.DataBean exchangeMoneyResponseData = exchangeMoneyResponse.getData(); - ApiException.isTrue(!StatusType.FAILURE.getValue().equals(exchangeMoneyResponseData.getStatus()), ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); + Map params = this.getKey(exchangeTransferMoneyRequestDTO); + AETransactionResponse deposit = null; + try { + if (TransferType.GAMES.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) { + + params.put("userId", exchangeTransferMoneyRequestDTO.getAccount()); + params.put("txCode", transactionId); + params.put("transferAmount", exchangeTransferMoneyRequestDTO.getAmount()); + deposit = AEClient.deposit(params); + + } else { + params.put("userId", exchangeTransferMoneyRequestDTO.getAccount()); + params.put("txCode", transactionId); + params.put("withdrawType", 1); + deposit = AEClient.withdraw(params); + } + } finally { //更新数据 - exchangeMoney.setBalance(NumberUtil.sub(exchangeMoneyResponseData.getCurrencyAfter(), exchangeMoneyResponseData.getCurrencyBefore()).abs()); - exchangeMoney.setCoinBefore(exchangeMoneyResponseData.getCoinBefore()); - exchangeMoney.setCoinAfter(exchangeMoneyResponseData.getCoinAfter()); - exchangeMoney.setCurrencyBefore(exchangeMoneyResponseData.getCurrencyBefore()); - exchangeMoney.setCurrencyAfter(exchangeMoneyResponseData.getCurrencyAfter()); - exchangeMoney.setStatus(exchangeMoneyResponseData.getStatus()); + exchangeMoney.setBalance(deposit.getAmount()); + exchangeMoney.setCoinBefore(NumberUtil.sub(deposit.getCurrentBalance(), deposit.getAmount())); + 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.insertGameExchangeMoney(exchangeMoney); - } else { - log.error("GamesXKServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{},错误信息{}", exchangeMoneyResponse.getCode(), exchangeMoneyResponse.getMsg()); - throw new BaseException(exchangeMoneyResponse.getMsg()); } + return exchangeMoney.getId(); } @@ -348,6 +337,7 @@ public class GamesAEServiceImpl implements IGamesService { */ @Override public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + log.info("GamesAEServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO); return Boolean.TRUE; } @@ -427,7 +417,7 @@ public class GamesAEServiceImpl implements IGamesService { */ @Override public Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest) { - throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } /** @@ -438,7 +428,7 @@ public class GamesAEServiceImpl implements IGamesService { */ @Override public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) { - throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } /** @@ -474,7 +464,7 @@ public class GamesAEServiceImpl implements IGamesService { */ @Override public Boolean kickMemberAll(KickMemberAllDTO kickMemberAllDTO) { - throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } /** @@ -485,7 +475,7 @@ public class GamesAEServiceImpl implements IGamesService { */ @Override public List getFreeSpinDashflow(GetFreeSpinDashflowRequestDTO getFreeSpinDashflowRequestDTO) { - throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } /** @@ -496,7 +486,7 @@ public class GamesAEServiceImpl implements IGamesService { */ @Override public Boolean cancelFreeSpin(CancelFreeSpinRequestDTO cancelFreeSpinRequestDTO) { - throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } @@ -521,7 +511,7 @@ public class GamesAEServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds,GamePlatforms.AE.getInfo()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) 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 8c90a26..7097e6f 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 @@ -534,7 +534,7 @@ public class GamesDGServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds,GamePlatforms.DG.getInfo()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) 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 41b96ba..5a4e93c 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 @@ -278,7 +278,7 @@ public class GamesFCServiceImpl implements IGamesService { Map integerGameDetailsMap = gameList.getGetGameIconList().get(gameTypeKey); GamePlatform gamePlatform = GamePlatform.builder() .platformType(FCGameType.findSystemByCode(gameTypeKey)) - .platformCode(GamePlatforms.FC.getCode()) + .platformCode(GamePlatforms.FC.getInfo()) .build(); List gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform); //没有此平台就新增一个平台 @@ -360,13 +360,13 @@ public class GamesFCServiceImpl implements IGamesService { log.info("GamesFCServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCode(GamePlatforms.FC.getCode()) + .platformCode(GamePlatforms.FC.getInfo()) .code(exchangeTransferMoneyRequestDTO.getAgentId()) .currency(exchangeTransferMoneyRequestDTO.getCurrency()) .build()); Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); - String transactionId = gameExchangeMoneyService.getTransactionId(GamePlatforms.FC.getCode(), 30); + String transactionId = gameExchangeMoneyService.getTransactionId(GamePlatforms.FC.getInfo(), 30); List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( GameExchangeMoney.builder() .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) @@ -386,7 +386,7 @@ public class GamesFCServiceImpl implements IGamesService { .currencyCode(currencyDTO.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) - .platformCode(GamePlatforms.FC.getCode()) + .platformCode(GamePlatforms.FC.getInfo()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); @@ -461,7 +461,7 @@ public class GamesFCServiceImpl implements IGamesService { List gameSecretKeyCurrencies = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO.builder() - .platformCode(GamePlatforms.FC.getCode()) + .platformCode(GamePlatforms.FC.getInfo()) .build()); for (GameSecretKeyCurrency gameSecretKeyCurrency : gameSecretKeyCurrencies) { @@ -494,7 +494,7 @@ public class GamesFCServiceImpl implements IGamesService { @Override public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { List gameSecretKeyCurrencies = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO.builder() - .platformCode(GamePlatforms.FC.getCode()) + .platformCode(GamePlatforms.FC.getInfo()) .build()); for (GameSecretKeyCurrency gameSecretKeyCurrency : gameSecretKeyCurrencies) { @@ -649,7 +649,7 @@ public class GamesFCServiceImpl implements IGamesService { .memberId(member.getId()) .gameCode(resultBean.getGameID()) .gameType(FCGameType.findSystemByCode(resultBean.getGametype())) - .platformCode(GamePlatforms.FC.getCode()) + .platformCode(GamePlatforms.FC.getInfo()) .gameId(gamesDataDTO.getSystemGameId()) .gameName(gamesDataDTO.getGameNameOfChinese()) .gameStatus(gameStatus) @@ -692,7 +692,7 @@ public class GamesFCServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds,GamePlatforms.FC.getInfo()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) 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 0b6924e..75d3d47 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 @@ -237,7 +237,7 @@ public class GamesJILIServiceImpl implements IGamesService { for (JILIGamesDataDTO gamesDataDTO : jiliGames.getData()) { GamePlatform gamePlatform = GamePlatform.builder() .platformType(JILIGameType.findSystemByCode(gamesDataDTO.getGameCategoryId())) - .platformCode(GamePlatforms.JILI.getCode()) + .platformCode(GamePlatforms.JILI.getInfo()) .build(); List gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform); //没有此平台就新增一个平台 @@ -313,7 +313,7 @@ public class GamesJILIServiceImpl implements IGamesService { .currency(exchangeTransferMoneyRequestDTO.getCurrency()).build()); Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); - String transactionId = GamePlatforms.JILI.getCode() + IdUtils.simpleUUID(); + String transactionId = GamePlatforms.JILI.getInfo() + IdUtils.simpleUUID(); List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( GameExchangeMoney.builder() @@ -335,7 +335,7 @@ public class GamesJILIServiceImpl implements IGamesService { .currencyCode(gameSecretKey.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) - .platformCode(GamePlatforms.JILI.getCode()) + .platformCode(GamePlatforms.JILI.getInfo()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); //接口限制限制50字符 @@ -472,7 +472,7 @@ public class GamesJILIServiceImpl implements IGamesService { .map(Game::getGameCode) .map(String::valueOf) .collect(Collectors.joining(",")); - String referenceId = GamePlatforms.JILI.getCode() + IdUtils.simpleUUID(); + String referenceId = GamePlatforms.JILI.getInfo() + IdUtils.simpleUUID(); //请求参数 String query = "Account=" + createFreeSpinRequest.getAccount() + "&Currency=" + createFreeSpinRequest.getCurrency() @@ -715,7 +715,7 @@ public class GamesJILIServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds,GamePlatforms.JILI.getInfo()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) @@ -765,7 +765,7 @@ public class GamesJILIServiceImpl implements IGamesService { .memberId(member.getId()) .gameCode(jiliBetRecordDataResponseDTO.getGameId()) .gameType(JILIGameType.findSystemByCode(jiliBetRecordDataResponseDTO.getGameCategoryId())) - .platformCode(GamePlatforms.JILI.getCode()) + .platformCode(GamePlatforms.JILI.getInfo()) .gameId(gamesDataDTO.getSystemGameId()) .gameName(gamesDataDTO.getName().getZhCN()) .gameStatus(jiliBetRecordDataResponseDTO.getStatus()) 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 8b71e88..c314f47 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 @@ -826,7 +826,7 @@ public class GamesPGServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds,NGPlatforms.PG.getPlatform()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) 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 37f1673..f6bb221 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 @@ -244,7 +244,7 @@ public class GamesPGXServiceImpl implements IGamesService { for (PGXGameListResponse.Game gamesDataDTO : gameLists) { GamePlatform gamePlatform = GamePlatform.builder() .platformType(GPXGameType.SL.getSystemCode()) - .platformCode(GamePlatforms.PGX.getCode()) + .platformCode(GamePlatforms.PGX.getInfo()) .build(); List gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform); //没有此平台就新增一个平台 @@ -308,13 +308,13 @@ public class GamesPGXServiceImpl implements IGamesService { log.info("GamesPGXServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCode(GamePlatforms.PGX.getCode()) + .platformCode(GamePlatforms.PGX.getInfo()) .code(exchangeTransferMoneyRequestDTO.getAgentId()) .currency(exchangeTransferMoneyRequestDTO.getCurrency()) .build()); Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); - String transactionId = gameExchangeMoneyService.getTransactionId(GamePlatforms.PGX.getCode(), 17); + String transactionId = gameExchangeMoneyService.getTransactionId(GamePlatforms.PGX.getInfo(), 17); List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( GameExchangeMoney.builder() .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) @@ -336,7 +336,7 @@ public class GamesPGXServiceImpl implements IGamesService { .currencyCode(currencyDTO.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) - .platformCode(GamePlatforms.PGX.getCode()) + .platformCode(GamePlatforms.PGX.getInfo()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); @@ -421,7 +421,7 @@ public class GamesPGXServiceImpl implements IGamesService { if (this.getIsSuccess(exchangeTransferStatusResponse.getErrCode())) { List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( GameExchangeMoney.builder() - .platformCode(GamePlatforms.PGX.getCode()) + .platformCode(GamePlatforms.PGX.getInfo()) .transactionId(exchangeTransferMoneyRequestDTO.getOrderId()) .build() ); @@ -564,7 +564,7 @@ public class GamesPGXServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds,GamePlatforms.PGX.getInfo()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) @@ -628,7 +628,7 @@ public class GamesPGXServiceImpl implements IGamesService { .memberId(member.getId()) .gameCode(resultBean.getGameId()) .gameType(GPXGameType.SL.getSystemCode()) - .platformCode(GamePlatforms.PGX.getCode()) + .platformCode(GamePlatforms.PGX.getInfo()) .gameId(gamesDataDTO.getSystemGameId()) .gameName(gamesDataDTO.getGameName()) .gameStatus(gameStatus) diff --git a/ff-game/src/main/java/com/ff/game/api/request/CreateMemberRequestDTO.java b/ff-game/src/main/java/com/ff/game/api/request/CreateMemberRequestDTO.java index 52b4c5c..f651b69 100644 --- a/ff-game/src/main/java/com/ff/game/api/request/CreateMemberRequestDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/request/CreateMemberRequestDTO.java @@ -25,7 +25,7 @@ public class CreateMemberRequestDTO extends GamesBaseRequestDTO { private String account; /** - * 投注限额 + * ae 平台 投注限额 */ private Map>> betLimit; diff --git a/ff-game/src/main/java/com/ff/game/api/request/GamesLogin.java b/ff-game/src/main/java/com/ff/game/api/request/GamesLogin.java index d46d7fd..e73320c 100644 --- a/ff-game/src/main/java/com/ff/game/api/request/GamesLogin.java +++ b/ff-game/src/main/java/com/ff/game/api/request/GamesLogin.java @@ -6,6 +6,8 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import java.util.Map; + /** * 游戏登录 * @@ -46,4 +48,10 @@ public class GamesLogin extends GamesBaseRequestDTO{ * 游戏类型 */ private String gameType; + + + /** + * ae 平台 投注限额 + */ + private Map>> betLimit; } 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 ac9c0d2..d1b265e 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 @@ -321,7 +321,7 @@ public class GamesSAServiceImpl implements IGamesService { .currencyCode(currencyDTO.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) - .platformCode(GamePlatforms.SA.getCode()) + .platformCode(GamePlatforms.SA.getInfo()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); if (TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) { @@ -546,7 +546,7 @@ public class GamesSAServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds,GamePlatforms.SA.getInfo()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) @@ -599,7 +599,7 @@ public class GamesSAServiceImpl implements IGamesService { .memberId(member.getId()) .gameCode(resultBean.getGameID()) .gameType(PlatformType.CARD_GAME.getCode()) - .platformCode(GamePlatforms.SA.getCode()) + .platformCode(GamePlatforms.SA.getInfo()) .gameId(GAME_ID) .gameName(game.getGameName()) .gameStatus(gameStatus) 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 82675d3..388a27a 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 @@ -557,7 +557,7 @@ public class GamesXKServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds,GamePlatforms.XK.getInfo()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) diff --git a/ff-game/src/main/java/com/ff/game/mapper/GameBettingDetailsMapper.java b/ff-game/src/main/java/com/ff/game/mapper/GameBettingDetailsMapper.java index a5ca8cb..d4b5da3 100644 --- a/ff-game/src/main/java/com/ff/game/mapper/GameBettingDetailsMapper.java +++ b/ff-game/src/main/java/com/ff/game/mapper/GameBettingDetailsMapper.java @@ -26,10 +26,11 @@ public interface GameBettingDetailsMapper /** * 按投注id选择游戏投注详细信息 * - * @param wagersIds 投注ID + * @param wagersIds 投注ID + * @param platformCode 平台代码 * @return {@link List }<{@link Long }> */ - List selectGameBettingDetailsByWagersId(@Param("wagersIds") List wagersIds); + List selectGameBettingDetailsByWagersId(@Param("wagersIds") List wagersIds, @Param("platformCode") String platformCode); /** diff --git a/ff-game/src/main/java/com/ff/game/service/IGameBettingDetailsService.java b/ff-game/src/main/java/com/ff/game/service/IGameBettingDetailsService.java index 7f7135d..3ef3fc3 100644 --- a/ff-game/src/main/java/com/ff/game/service/IGameBettingDetailsService.java +++ b/ff-game/src/main/java/com/ff/game/service/IGameBettingDetailsService.java @@ -29,7 +29,7 @@ public interface IGameBettingDetailsService * @param wagersIds 投注ID * @return {@link List }<{@link Long }> */ - List selectGameBettingDetailsByWagersId(List wagersIds); + List selectGameBettingDetailsByWagersId(List wagersIds,String platformCode); diff --git a/ff-game/src/main/java/com/ff/game/service/impl/GameBettingDetailsServiceImpl.java b/ff-game/src/main/java/com/ff/game/service/impl/GameBettingDetailsServiceImpl.java index 2c41c68..62ffbfe 100644 --- a/ff-game/src/main/java/com/ff/game/service/impl/GameBettingDetailsServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/service/impl/GameBettingDetailsServiceImpl.java @@ -43,8 +43,8 @@ public class GameBettingDetailsServiceImpl implements IGameBettingDetailsService * @return {@link List }<{@link Long }> */ @Override - public List selectGameBettingDetailsByWagersId(List wagersIds) { - return gameBettingDetailsMapper.selectGameBettingDetailsByWagersId(wagersIds); + public List selectGameBettingDetailsByWagersId(List wagersIds, String platformCode) { + return gameBettingDetailsMapper.selectGameBettingDetailsByWagersId(wagersIds,platformCode); } /** diff --git a/ff-game/src/main/java/com/ff/quartz/config/ScheduleConfig.java b/ff-game/src/main/java/com/ff/quartz/config/ScheduleConfig.java index c56e1bc..475653c 100644 --- a/ff-game/src/main/java/com/ff/quartz/config/ScheduleConfig.java +++ b/ff-game/src/main/java/com/ff/quartz/config/ScheduleConfig.java @@ -1,57 +1,57 @@ -package com.ff.quartz.config;//package com.ff.quartz.config; -// -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.scheduling.quartz.SchedulerFactoryBean; -//import javax.sql.DataSource; -//import java.util.Properties; -// -///** -// * 定时任务配置(单机部署建议删除此类和qrtz数据库表,默认走内存会最高效) -// * -// * @author ff -// */ -//@Configuration -//public class ScheduleConfig -//{ -// @Bean -// public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) -// { -// SchedulerFactoryBean factory = new SchedulerFactoryBean(); -// factory.setDataSource(dataSource); -// -// // quartz参数 -// Properties prop = new Properties(); -// prop.put("org.quartz.scheduler.instanceName", "ffScheduler"); -// prop.put("org.quartz.scheduler.instanceId", "AUTO"); -// // 线程池配置 -// prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); -// prop.put("org.quartz.threadPool.threadCount", "20"); -// prop.put("org.quartz.threadPool.threadPriority", "5"); -// // JobStore配置 -// prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore"); -// // 集群配置 -// prop.put("org.quartz.jobStore.isClustered", "true"); -// prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000"); -// prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "10"); -// prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true"); -// -// // sqlserver 启用 -// // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?"); -// prop.put("org.quartz.jobStore.misfireThreshold", "12000"); -// prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); -// factory.setQuartzProperties(prop); -// -// factory.setSchedulerName("ffScheduler"); -// // 延时启动 -// factory.setStartupDelay(1); -// factory.setApplicationContextSchedulerContextKey("applicationContextKey"); -// // 可选,QuartzScheduler -// // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 -// factory.setOverwriteExistingJobs(true); -// // 设置自动启动,默认为true -// factory.setAutoStartup(true); -// -// return factory; -// } -//} +package com.ff.quartz.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; +import javax.sql.DataSource; +import java.util.Properties; + +/** + * 定时任务配置(单机部署建议删除此类和qrtz数据库表,默认走内存会最高效) + * + * @author ff + */ +@Configuration +public class ScheduleConfig +{ + @Bean + public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) + { + SchedulerFactoryBean factory = new SchedulerFactoryBean(); + factory.setDataSource(dataSource); + + // quartz参数 + Properties prop = new Properties(); + prop.put("org.quartz.scheduler.instanceName", "ffScheduler"); + prop.put("org.quartz.scheduler.instanceId", "AUTO"); + // 线程池配置 + prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); + prop.put("org.quartz.threadPool.threadCount", "20"); + prop.put("org.quartz.threadPool.threadPriority", "5"); + // JobStore配置 + prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore"); + // 集群配置 + prop.put("org.quartz.jobStore.isClustered", "true"); + prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000"); + prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "10"); + prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true"); + + // sqlserver 启用 + // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?"); + prop.put("org.quartz.jobStore.misfireThreshold", "12000"); + prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); + factory.setQuartzProperties(prop); + + factory.setSchedulerName("ffScheduler"); + // 延时启动 + factory.setStartupDelay(1); + factory.setApplicationContextSchedulerContextKey("applicationContextKey"); + // 可选,QuartzScheduler + // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 + factory.setOverwriteExistingJobs(true); + // 设置自动启动,默认为true + factory.setAutoStartup(true); + + return factory; + } +} diff --git a/ff-game/src/main/resources/mapper/game/GameBettingDetailsMapper.xml b/ff-game/src/main/resources/mapper/game/GameBettingDetailsMapper.xml index 9600ffc..722c77e 100644 --- a/ff-game/src/main/resources/mapper/game/GameBettingDetailsMapper.xml +++ b/ff-game/src/main/resources/mapper/game/GameBettingDetailsMapper.xml @@ -95,7 +95,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where wagers_id in #{wagersId} - + and platform_code = #{platformCode} and settlement_status !=1 From e632c378a2021296515d6dd4e3e112b4017a0cb3 Mon Sep 17 00:00:00 2001 From: cengy Date: Tue, 1 Apr 2025 11:38:30 +0800 Subject: [PATCH 11/62] =?UTF-8?q?feat(game):=20=E6=B7=BB=E5=8A=A0=E7=BE=8E?= =?UTF-8?q?=E5=A4=A9=E6=A3=8B=E7=89=8C=E5=B9=B3=E5=8F=B0=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增美天棋牌相关的常量、API接口和数据模型 - 实现美天棋牌的会员创建、余额查询、登录、转账等功能 - 添加美天棋牌的游戏数据和记录查询接口 --- .../com/ff/base/constant/CacheConstants.java | 24 +- .../java/com/ff/base/constant/Constants.java | 5 + .../java/com/ff/base/enums/GamePlatforms.java | 2 + .../com/ff/base/enums/MeiTianGameType.java | 53 ++ .../meitian/address/MeiTianAddressSource.java | 29 + .../api/meitian/client/MeiTianClient.java | 147 ++++ .../dto/JILIBetRecordDataResponseDTO.java | 89 +++ .../meitian/dto/JILIBetRecordResponseDTO.java | 62 ++ .../dto/MeiTianCreateMemberResponseDTO.java | 46 ++ .../dto/MeiTianExchangeMoneyResponseDTO.java | 118 +++ .../api/meitian/dto/MeiTianGameDataDTO.java | 31 + .../dto/MeiTianGameRecordDetailDTO.java | 51 ++ .../game/api/meitian/dto/MeiTianGamesDTO.java | 171 +++++ .../meitian/dto/MeiTianLoginResultDTO.java | 52 ++ .../api/meitian/dto/MeiTianLogoutDTO.java | 43 ++ .../api/meitian/dto/MeiTianMemberInfoDTO.java | 69 ++ .../meitian/impl/MeiTianGameServiceImpl.java | 677 ++++++++++++++++++ 17 files changed, 1659 insertions(+), 10 deletions(-) create mode 100644 ff-base/src/main/java/com/ff/base/enums/MeiTianGameType.java create mode 100644 ff-game/src/main/java/com/ff/game/api/meitian/address/MeiTianAddressSource.java create mode 100644 ff-game/src/main/java/com/ff/game/api/meitian/client/MeiTianClient.java create mode 100644 ff-game/src/main/java/com/ff/game/api/meitian/dto/JILIBetRecordDataResponseDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/meitian/dto/JILIBetRecordResponseDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianCreateMemberResponseDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianExchangeMoneyResponseDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianGameDataDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianGameRecordDetailDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianGamesDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianLoginResultDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianLogoutDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianMemberInfoDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/meitian/impl/MeiTianGameServiceImpl.java 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 676af5f..c943a1e 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 @@ -5,8 +5,7 @@ package com.ff.base.constant; * * @author ff */ -public class CacheConstants -{ +public class CacheConstants { /** * 登录用户 redis key */ @@ -45,43 +44,48 @@ public class CacheConstants /** * jili 游戏 */ - public static final String JILI_GAMES= "jili_games:"; + public static final String JILI_GAMES = "jili_games:"; /** * xk 游戏 */ - public static final String XK_GAMES= "xk_games:"; + public static final String XK_GAMES = "xk_games:"; /** * pgx游戏 */ - public static final String PGX_GAMES= "pgx_games:"; + public static final String PGX_GAMES = "pgx_games:"; /** * pg游戏 */ - public static final String PG_GAMES= "pg_games:"; + public static final String PG_GAMES = "pg_games:"; /** * fc游戏 */ - public static final String FC_GAMES= "fc_games:"; + public static final String FC_GAMES = "fc_games:"; /** * sa游戏 */ - public static final String SA_GAMES= "sa_games:"; + public static final String SA_GAMES = "sa_games:"; /** * dg游戏 */ - public static final String DG_GAMES= "dg_games:"; + public static final String DG_GAMES = "dg_games:"; /** * pg游戏投注货币 */ - public static final String PG_GAMES_BET_CURRENCY= "pg_games:bet:currency"; + public static final String PG_GAMES_BET_CURRENCY = "pg_games:bet:currency"; + /** + * 美天棋牌游戏 + */ + public static final String MeiTian_GAMES = "meitian_games:"; + } diff --git a/ff-base/src/main/java/com/ff/base/constant/Constants.java b/ff-base/src/main/java/com/ff/base/constant/Constants.java index cfb844f..180f339 100644 --- a/ff-base/src/main/java/com/ff/base/constant/Constants.java +++ b/ff-base/src/main/java/com/ff/base/constant/Constants.java @@ -219,6 +219,11 @@ public class Constants { */ public static final String SA_API_BASE_URL = "sa.api.base.url"; + /** + * 美天平台 + */ + public static final String MEITIAN_API_BASE_URL = "meitian.api.base.url"; + /** * 服务 */ 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 6bd60a4..2b3e673 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 @@ -11,6 +11,8 @@ public enum GamePlatforms { FC("FC", "FC"), SA("SA", "SA"), DG("DG", "DG"), + MeiTIan("MeiTIan","美天棋牌") + , ; private final String code; diff --git a/ff-base/src/main/java/com/ff/base/enums/MeiTianGameType.java b/ff-base/src/main/java/com/ff/base/enums/MeiTianGameType.java new file mode 100644 index 0000000..c5ef5fa --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/enums/MeiTianGameType.java @@ -0,0 +1,53 @@ +package com.ff.base.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Optional; +import java.util.stream.Stream; + +/** + * @author cengy + */ +@Getter +@AllArgsConstructor +public enum MeiTianGameType { + ELECTRON(4, 1, "电子"), + CHESS(2, 2, "棋牌"), + GAME_HALL(0, 3, "游戏大厅"), + CATCH_FISH(3, 4, "捕鱼") + //bai_ren(1, 5,"白人") + , + ; + private final Integer code; + private final Integer systemCode; + private final String info; + + /** + * 按代码查找系统 + * + * @param code 代码 + * @return {@link String } + */ + public static Integer findSystemByCode(Integer code) { + Optional system = Stream.of(MeiTianGameType.values()) + .filter(gameType -> gameType.getCode().equals(code)) + .map(MeiTianGameType::getSystemCode) + .findFirst(); + return system.orElse(null); + } + + /** + * 按代码查找信息 + * + * @param code 代码 + * @return {@link String } + */ + public static String findInfoByCode(Integer code) { + Optional system = Stream.of(MeiTianGameType.values()) + .filter(gameType -> gameType.getCode().equals(code)) + .map(MeiTianGameType::getInfo) + .findFirst(); + return system.orElse(null); + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/address/MeiTianAddressSource.java b/ff-game/src/main/java/com/ff/game/api/meitian/address/MeiTianAddressSource.java new file mode 100644 index 0000000..f0ccbee --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/meitian/address/MeiTianAddressSource.java @@ -0,0 +1,29 @@ +package com.ff.game.api.meitian.address; + +import com.dtflys.forest.callback.AddressSource; +import com.dtflys.forest.http.ForestAddress; +import com.dtflys.forest.http.ForestRequest; +import com.ff.base.constant.Constants; +import com.ff.base.system.service.ISysConfigService; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + + +/** + * @author shi + * @date 2025/02/10 + */ +@Component +public class MeiTianAddressSource implements AddressSource { + + @Resource + private ISysConfigService configService; + + + @Override + public ForestAddress getAddress(ForestRequest request) { + String apiBaseUrl = configService.selectConfigByKey(Constants.MEITIAN_API_BASE_URL); + return new ForestAddress("https", apiBaseUrl, 443, "services"); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..199e713 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/meitian/client/MeiTianClient.java @@ -0,0 +1,147 @@ +package com.ff.game.api.meitian.client; + +import com.dtflys.forest.annotation.Address; +import com.dtflys.forest.annotation.Body; +import com.dtflys.forest.annotation.Post; +import com.dtflys.forest.annotation.Var; +import com.ff.game.api.meitian.address.MeiTianAddressSource; +import com.ff.game.api.meitian.dto.*; + +/** + * jili 请求 + * + * @author shi + * @date 2025/02/10 + */ +@Address(source = MeiTianAddressSource.class) +public interface MeiTianClient { + + /** + * 创建会员 + * + * @param playerName + * @param merchantId + * @param pwd + * @return {@link MeiTianCreateMemberResponseDTO} + */ + @Post("/dg/player/playerCreate2/{playerName}/{merchantId}/{pwd}/{code}/{data}") + MeiTianCreateMemberResponseDTO createMember( + @Var("playerName") String playerName, + @Var("merchantId") String merchantId, + @Var("pwd") String pwd, + @Var("code") String code, + @Var("data") String data); + + /** + * 查询余额 + * + * @param playerName 用户名 + * @param merchantId 商户号 + * @return {@link MeiTianMemberInfoDTO} + */ + @Post("/dg/player/getPlayerBalance/{playerName}/{merchantId}") + MeiTianMemberInfoDTO getMemberInfo( + @Var("playerName") String playerName, + @Var("merchantId") String merchantId); + + /** + * 登录 + * + * @param merchantId 商户id + * @param playerName 玩家名 + * @return {@link MeiTianLoginResultDTO } + */ + @Post("/dg/player/playerPlatformUrl/{merchantId}/{playerName}/{pwd}/{code}/{data}") + MeiTianLoginResultDTO loginWithoutRedirect( + @Var("merchantId") String merchantId, + @Var("playerName") String playerName, + @Var("pwd") String pwd, + @Var("code") String code, + @Var("data") String data + ); + + + /** + * 转入 + * + * @param merchantId + * @param playerName + * @param coins + * @param extTransId + * @param code + * @param data + * @return {@link MeiTianExchangeMoneyResponseDTO} + */ + @Post("/dg/player/deposit2/{merchantId}/{playerName}/{coins}/{extTransId}/{code}/{data}") + MeiTianExchangeMoneyResponseDTO transferIn( + @Var("merchantId") String merchantId, + @Var("playerName") String playerName, + @Var("coins") String coins, + @Var("extTransId") String extTransId, + @Var("code") String code, + @Var("data") String data + ); + + + /** + * 转出 + * + * @param merchantId + * @param playerName + * @param coins + * @param extTransId + * @param code + * @param data + * @return {@link MeiTianExchangeMoneyResponseDTO} + */ + @Post("/dg/player/withdraw2/{merchantId}/{playerName}/{coins}/{extTransId}/{code}/{data}") + MeiTianExchangeMoneyResponseDTO transferOut( + @Var("merchantId") String merchantId, + @Var("playerName") String playerName, + @Var("coins") String coins, + @Var("extTransId") String extTransId, + @Var("code") String code, + @Var("data") String data + ); + + /** + * 按时间获取投注记录 + * + * @param parameters 参数 + * @param agentId 代理id + * @return {@link JILIBetRecordResponseDTO } + */ + @Post(url = "/GetBetRecordByTime?${parameters}") + JILIBetRecordResponseDTO getBetRecordByTime( + @Var("parameters") String parameters, + @Body("AgentId") String agentId); + + + /** + * 踢出 + * + * @param merchantId + * @param playerName + * @return {@link MeiTianLogoutDTO } + */ + @Post("/dg/player/logOutGame/{merchantId}/{playerName}") + MeiTianLogoutDTO kickMember( + @Var("merchantId") String merchantId, + @Var("playerName") String playerName + ); + + /** + * 获取游戏详情 + * + * @param merchantId + * @param code + * @param data + * @return {@link MeiTianGameRecordDetailDTO} + */ + @Post("dg/player/playCheckUrl/{merchantId}/{code}/{data}") + MeiTianGameRecordDetailDTO getGameDetail( + @Var("merchantId") String merchantId, + @Var("code") String code, + @Var("data") String data + ); +} diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/dto/JILIBetRecordDataResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/meitian/dto/JILIBetRecordDataResponseDTO.java new file mode 100644 index 0000000..8901da3 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/meitian/dto/JILIBetRecordDataResponseDTO.java @@ -0,0 +1,89 @@ +package com.ff.game.api.meitian.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + + +/** + * JiLi游戏纪录查询返回数据类型 + * + * @author shi + * @date 2024/10/21 + */ +@NoArgsConstructor +@Data +public class JILIBetRecordDataResponseDTO { + /** + * 账户 + */ + @JsonProperty("Account") + private String account; + /** + * 投注id + */ + @JsonProperty("WagersId") + private String wagersId; + /** + * 游戏id + */ + @JsonProperty("GameId") + private String gameId; + /** + * 下注时间 + */ + @JsonProperty("WagersTime") + private Long wagersTime; + /** + * 投注金额 + */ + @JsonProperty("BetAmount") + private BigDecimal betAmount; + /** + * 回报时间 + */ + @JsonProperty("PayoffTime") + private Long payoffTime; + /** + * 支付金额 + */ + @JsonProperty("PayoffAmount") + private BigDecimal payoffAmount; + /** + * 注单状态 1: 赢 2: 输 3: 平局 + */ + @JsonProperty("Status") + private int status; + /** + * 结算时间 + */ + @JsonProperty("SettlementTime") + private Long settlementTime; + /** + * 游戏类别id + */ + @JsonProperty("GameCategoryId") + private int gameCategoryId; + /** + * 类型 + */ + @JsonProperty("Type") + private int type; + /** + * 代理id + */ + @JsonProperty("AgentId") + private String agentId; + /** + * 有效投注金额 + */ + @JsonProperty("Turnover") + private BigDecimal turnover; + /** + * 圆形指数 + */ + @JsonProperty("RoundIndex") + private long roundIndex; +} diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/dto/JILIBetRecordResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/meitian/dto/JILIBetRecordResponseDTO.java new file mode 100644 index 0000000..ae3975f --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/meitian/dto/JILIBetRecordResponseDTO.java @@ -0,0 +1,62 @@ +package com.ff.game.api.meitian.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * JiLi游戏纪录查询返回值 + * + * @author shi + * @date 2024/10/21 + */ +@NoArgsConstructor +@Data +public class JILIBetRecordResponseDTO { + + + @JsonProperty("ErrorCode") + private int errorCode; + @JsonProperty("Message") + private String message; + @JsonProperty("Data") + private DataBean data; + + @NoArgsConstructor + @Data + public static class DataBean { + @JsonProperty("Result") + private List result; + @JsonProperty("Pagination") + private PaginationBean pagination; + + @NoArgsConstructor + @Data + public static class PaginationBean { + /** + * 当前页面 + */ + @JsonProperty("CurrentPage") + private int currentPage; + /** + * 总页数 + */ + @JsonProperty("TotalPages") + private int totalPages; + /** + * 页数限制 + */ + @JsonProperty("PageLimit") + private int pageLimit; + /** + * 总数 + */ + @JsonProperty("TotalNumber") + private int totalNumber; + } + + + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianCreateMemberResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianCreateMemberResponseDTO.java new file mode 100644 index 0000000..61a81df --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianCreateMemberResponseDTO.java @@ -0,0 +1,46 @@ +package com.ff.game.api.meitian.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; + + +/** + * 创建成员响应dto + * + * @author shi + * @date 2024/10/22 + */ +@Data +public class MeiTianCreateMemberResponseDTO { + + /** + * 错误代码 + */ + @JsonProperty("resultCode") + private int resultCode; + + + @Getter + @AllArgsConstructor + public enum CreateMemberResultCode { + /** + * 成功 + */ + CreateException(0, "创建异常"), + CreateSuccess(1, "创建成功"), + MerchantNotExist(2, "商户不存在"), + MerchantInvalid(3, "商户无效"), + AlreadyRegistered(5, "商户用户已注册"), + IpLimit(15, "IP被限制"), + DecryptError(21, "解密错误"), + OptionalParameterError(32, "可选参数错误"), + Maintenance(40, "维护模式"), + ; + + private int code; + private String message; + + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianExchangeMoneyResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianExchangeMoneyResponseDTO.java new file mode 100644 index 0000000..c3a47b3 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianExchangeMoneyResponseDTO.java @@ -0,0 +1,118 @@ +package com.ff.game.api.meitian.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; + +import java.math.BigDecimal; + +/** + * jiliexchange货币回应 + * + * @author shi + * @date 2024/10/22 + */ +@Data +public class MeiTianExchangeMoneyResponseDTO { + + + /** + * 错误代码 + */ + @JsonProperty("resultCode") + private int errorCode; + /** + * 交易序号,额度转移纪录唯一值, 长度上限 50 + */ + @JsonProperty("transId") + private String transactionId; + + /** + * 币种 + */ + @JsonProperty("currency") + private String currency; + + /** + * 余额 + */ + @JsonProperty("curBalance") + private BigDecimal balance; + + /** + * 时区(商户时区) GMT+8 + */ + @JsonProperty("timezone") + private String timezone; + + /** + * 交易时间 2018-08-08 12:23:44 + */ + @JsonProperty("date") + private String date; + + @Getter + @AllArgsConstructor + public enum TransferIn { + // 提现异常 + WITHDRAW_ERROR(0, "充值异常"), + // 提现成功 + WITHDRAW_SUCCESS(1, "充值成功"), + MERCHANT_NOT_EXIST(2, "商户不存在"), + MERCHANT_INVALID(3, "商户无效"), + MERCHANT_USER_NOT_EXIST(4, "商户用户不存在"), + MERCHANT_USER_SYSTEM_DISABLED(6, "商户用户系统禁用"), + MERCHANT_USER_GOLD_BALANCE_INSUFFICIENT(9, "商户用户金币余额不足"), + GAME_NOT_SETTLED(12, "游戏未结算"), + IP_LIMIT(15, "IP被限制"), + DECRYPT_ERROR(21, "解密错误"), + OPTIONAL_PARAMETER_ERROR(32, "可选参数错误"), + EXIST_UNPROCESSED_ORDER(36, "存在未处理订单"), + MAINTENANCE(40, "维护模式"), + Unknown(-1, "未知");; + private int code; + private String message; + + + public static TransferIn get(int code) { + for (TransferIn resultMessage : TransferIn.values()) { + if (resultMessage.code == code) { + return resultMessage; + } + } + return Unknown; + } + } + + @Getter + @AllArgsConstructor + public enum TransferOut { + WITHDRAW_ERROR(0, "提现异常"), + WITHDRAW_SUCCESS(1, "提现成功"), + MERCHANT_NOT_EXIST(2, "商户不存在"), + MERCHANT_INVALID(3, "商户无效"), + MERCHANT_USER_NOT_EXIST(4, "商户用户不存在"), + MERCHANT_USER_SYSTEM_DISABLED(6, "商户用户系统禁用"), + MERCHANT_USER_GOLD_BALANCE_INSUFFICIENT(9, "商户用户金币余额不足"), + GAME_NOT_SETTLED(12, "游戏未结算"), + IP_LIMIT(15, "IP被限制"), + DECRYPT_ERROR(21, "解密错误"), + OPTIONAL_PARAMETER_ERROR(32, "可选参数错误"), + EXIST_UNPROCESSED_ORDER(36, "存在未处理订单"), + MAINTENANCE(40, "维护模式"), + Unknown(-1, "未知");; + private int code; + private String message; + + + public static TransferOut get(int code) { + for (TransferOut resultMessage : TransferOut.values()) { + if (resultMessage.code == code) { + return resultMessage; + } + } + return Unknown; + } + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianGameDataDTO.java b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianGameDataDTO.java new file mode 100644 index 0000000..2a89a6b --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianGameDataDTO.java @@ -0,0 +1,31 @@ +package com.ff.game.api.meitian.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * jiligames数据dto + * + * @author shi + * @date 2024/10/22 + */ +@NoArgsConstructor +@Data +@Builder +@AllArgsConstructor +public class MeiTianGameDataDTO { + + + /** + *自己系统游戏id + */ + private Long systemGameId; + private String gameId; + private String cnName; + private String enName; + private Integer gameCategoryId; + +} \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianGameRecordDetailDTO.java b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianGameRecordDetailDTO.java new file mode 100644 index 0000000..c7d2bbd --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianGameRecordDetailDTO.java @@ -0,0 +1,51 @@ +package com.ff.game.api.meitian.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * 获取游戏详细信息请求dto + * + * @author shi + * @date 2024/11/12 + */ +@NoArgsConstructor +@Data +public class MeiTianGameRecordDetailDTO { + + @JsonProperty("resultCode") + private int errorCode; + + private String url; + private String currency; + + @Getter + @AllArgsConstructor + public enum ResultMessage { + QueryException(0, "查询异常"), + QuerySuccess(1, "查询成功"), + MerchantNotExist(2, "商户不存在"), + MerchantInvalid(3, "商户无效"), + IPLimited(15, "IP被限制"), + DecryptError(21, "解密错误"), + OptionalParameterError(32, "可选参数错误"), + MaintenanceMode(40, "维护模式"), + Unknown(-1, "未知错误"), + ; + private int code; + private String message; + } + + public static ResultMessage get(int code) { + for (ResultMessage resultMessage : ResultMessage.values()) { + if (resultMessage.getCode() == code) { + return resultMessage; + } + } + return ResultMessage.Unknown; + } + +} diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianGamesDTO.java b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianGamesDTO.java new file mode 100644 index 0000000..606febf --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianGamesDTO.java @@ -0,0 +1,171 @@ +package com.ff.game.api.meitian.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 游戏 + * + * @author shi + * @date 2024/10/22 + */ + +@NoArgsConstructor +@Data +public class MeiTianGamesDTO { + + // 捕鱼:3棋牌:2街机:4百人:1全部:0或不传 + private List data; + + { + data = new java.util.ArrayList<>(); + // 捕鱼游戏数据列表 + String[][] buyu = { + {"PTG0056", "3D捕鱼", "3D Fishing", "3"}, + {"PTG0011", "李逵劈鱼", "Fishing Kui Lee", "3"}, + {"PTG0045", "金蟾捕鱼", "Golden Toad", "3"}, + {"PTG0100", "海王2", "Ocean King 2", "3"}, + {"PTG0094", "疯狂捕鱼", "Crazy Fishing", "3"}, + {"PTG0004", "捕鱼来了", "Fishing Joy", "3"}, + {"PTG0104", "疯狂魔鬼城", "Trick or Treat", "3"}, + {"PTG0125", "水果炸翻天", "Fruits Carnival", "3"}, + }; + + addGames(buyu, data); + + // 棋牌游戏数据列表 + String[][] qipai = { + {"PTG0042", "五人牛牛", "Beat Bullfight", "2"}, + {"PTG0022", "通比牛牛", "Mutual Bullfight", "2"}, + {"PTG0013", "二人牛牛", "Versus Niu-Niu", "2"}, + {"PTG0039", "十三水", "Winning Thirteen", "2"}, + {"PTG0062", "炸金花", "Fraud Jinhua", "2"}, + {"PTG0037", "德州扑克", "Texas Hold'em", "2"}, + {"PTG0006", "欢乐斗地主", "Fight the Landlord", "2"}, + {"PTG0023", "黑杰克", "Black Jack", "2"}, + {"PTG0017", "二人梭哈", "Show Hand", "2"}, + {"PTG0080", "抢庄牌九", "Pai Gow", "2"}, + {"PTG0082", "三公", "3-card poker", "2"}, + {"PTG0061", "明牌牛牛", "Spread Bullfight", "2"}, + {"PTG0084", "土豪百家乐", "Rich Baccarat", "2"}, + {"PTG0085", "推筒子", "versus 2-8 bar", "2"}, + {"PTG0086", "二人雀神", "Versus Mahjong", "2"}, + {"PTG0093", "血流成河", "Rivers of Blood", "2"}, + {"PTG0110", "看牌牛牛", "Royal Bull-fight", "2"}, + {"PTG0121", "越式13张", "TIEN LEN", "2"}, + {"PTG0127", "UNO", "UNO", "2"}, + {"PTG0122", "Dummy", "Dummy", "2"}, + {"PTG0123", "九鸡", "Jiu-Ji", "2"}, // 未分类 + {"PTG0124", "博丁", "Bo-Ding", "2"}, // 未分类 + {"PTG0126", "牌肯", "Card Ken", "2"}, + {"PTG0133", "泰式十三支", "Thai 13 Cards", "2"}, + {"PTG0134", "泰九牌", "Gao Gae Thai", "2"}, + {"PTG0136", "Dummy Speto", "Dummy Speto", "2"}, + {"PTG0137", "Gao Gae Sam Bai Thod", "Gao Gae Sam Bai Thod", "2"}, + {"PTG0138", "Slave Card", "Slave Card", "2"} + }; + addGames(qipai, data); + + // 百人场游戏数据列表 + String[][] bairenchang = { + {"PTG0058", "红黑大战", "King's Queen", "1"}, + {"PTG0044", "百人牛牛", "Hundred Niu-Niu", "1"}, + {"PTG0059", "百家乐", "Baccarat", "1"}, + {"PTG0008", "豪车漂移", "Drift Car Racing", "-1"}, // 未分类 + {"PTG0041", "龙虎斗", "The Chinese Boxer", "1"}, + {"PTG0007", "飞禽走兽", "Fowls and Beasts", "-1"}, // 未分类 + {"PTG0036", "五星宏辉", "Five Star Stud", "1"}, + {"PTG0064", "金鲨银鲨", "Golden Shark", "1"}, + {"PTG0020", "西游争霸", "Journey to the West", "1"}, + {"PTG0018", "港式赛马", "Horse Racing", "-1"}, // 未分类 + {"PTG0070", "二八杠", "2-8 Bar", "-1"}, // 未分类 + {"PTG0081", "骰宝", "Sic bo", "1"}, + {"PTG0067", "森林舞会", "Forest Party", "-1"}, // 未分类 + {"PTG0091", "鱼虾蟹", "Crab and Shrimp", "1"}, + {"PTG0092", "红包扫雷", "Minesweeping", "-1"}, // 未分类 + {"PTG0089", "动物跑跑跑", "Animal Running", "-1"}, // 未分类 + {"PTG0116", "越式鱼虾蟹", "Vietnamese Fish-Prawn-Crab", "-1"}, // 未分类 + {"PTG0102", "正版抢车位", "GA Car Parking", "-1"}, // 未分类 + {"PTG0120", "番摊", "FAN TAN", "1"}, + {"PTG2008", "西游争霸战无不胜", "Monkey King2 PLUS", "-1"}, // 未分类 + {"PTG0135", "泰式鱼虾蟹", "Thai Fish Prawn Crab", "-1"} // 未分类 + }; + addGames(bairenchang, data); + + // 街机游戏数据列表 + String[][] dianzi = { + {"PTG0060", "超级大亨", "Super Tycoon", "4"}, + {"PTG0069", "ATT金皇冠", "ATT Gold Crown", "4"}, + {"PTG0001", "水果机", "Super Frootz", "4"}, + {"PTG0010", "水浒传", "The Water Margin", "4"}, + {"PTG0066", "大满贯水果机", "Grand Slam Frootz", "4"}, + {"PTG0068", "泰山闯天关2", "Tarzan Adventure 2", "4"}, + {"PTG0083", "财神到", "Mammon", "4"}, + {"PTG0079", "不倒翁", "Happy tumbler", "4"}, + {"PTG0087", "醉西游", "Monkey King", "4"}, + {"PTG0090", "延禧攻略", "Story of Yanxi Palace", "4"}, + {"PTG0095", "连环夺宝", "Linking Jewels", "4"}, + {"PTG0098", "三只小猪", "Three Little Pigs", "4"}, + {"PTG0097", "招财猫", "Fortune Cat", "4"}, + {"PTG0099", "欲望魅影", "Sexy Succubus", "4"}, + {"PTG0096", "绝地求生", "Playerunknown's Battlegrounds", "4"}, + {"PTG0101", "埃及艳后", "Cleopatra's treasures", "4"}, + {"PTG0103", "年年有鱼", "Lucky boy", "4"}, + {"PTG0105", "天空之神", "God of Sky", "4"}, + {"PTG0107", "阿拉丁神灯", "PLUS ALADDIN'S GOLD", "4"}, + {"PTG0109", "武媚娘传奇", "Empress Wu Zetian", "4"}, + {"PTG0106", "亿万富翁", "Billionaire", "4"}, + {"PTG0115", "萝卜跳一跳", "Jump Hot", "4"}, + {"PTG0117", "宫心计", "Beyond The Realm Of Conscience", "4"}, + {"PTG2001", "恭喜发财", "Good Fortune", "4"}, + {"PTG2002", "新潘金莲", "Pan Jinlian", "4"}, + {"PTG2003", "宫本武藏", "Miyamoto Musashi", "4"}, + {"PTG2004", "武则天", "Empress of the Great Tang", "4"}, + {"PTG2005", "发发发", "Fa Fa Fa", "4"}, + {"PTG2007", "赏金船长", "Captain's Bounty", "4"}, + {"PTG2009", "爱尔兰精灵", "Leprechaun Riches", "4"}, + {"PTG2010", "水浒传豪华版", "Water Margin DELUXE", "4"}, + {"PTG2011", "金钱豹水果机", "Golden Jaguar", "4"}, + {"PTG0118", "疯狂猴子", "Crazy Monkey", "4"}, + {"PTG2015", "金刚", "King Kong", "4"}, + {"PTG2016", "福星献舞", "Dancing FU", "4"}, + {"PTG2017", "野蛮世界", "HUGA", "4"}, + {"PTG2018", "上海甜心", "Shanghai Honey", "4"}, + {"PTG2019", "美洲野牛", "Buffalo Gold", "4"}, + {"PTG2020", "白蛇传", "The Legend of White Snake", "4"}, + {"PTG2021", "笑弥勒", "Happys Prosperous", "4"}, + {"PTG2013", "招财推币机", "Fortune Coindozer", "4"}, + {"PTG2025", "东海之王", "Dragon Of The Eastern Ocean", "4"}, + {"PTG2028", "中国龙", "Dragon World", "4"}, + {"PTG2023", "秦皇传说", "Legend of Emperor Qin", "4"}, + {"PTG2026", "辣椒多多", "More Chilli", "4"}, + {"PTG2029", "财神驾到", "CHOY SUN DOA", "4"}, + {"PTG2030", "招财猫2", "Fortune Cat 2", "4"}, + {"PTG2031", "黄金城魅影", "Gold City Treasure Hunt", "4"}, + {"PTG2032", "亡灵宝藏", "WILD BANDITO", "4"}, + {"PTG2033", "麒麟献宝", "WAYS OF THE QILIN", "4"}, + {"PTG2034", "天将神兵", "Heavenly Warriors", "4"} + }; + + addGames(dianzi, data); + + } + + public void addGames(String[][] gameData, List dataList) { + // 添加数据到 List + for (String[] game : gameData) { + String gameId = game[0]; + String cnName = game[1]; + String enName = game[2]; + Integer categoryId = Integer.valueOf(game[3]); + dataList.add(MeiTianGameDataDTO.builder().gameId(gameId) + .cnName(cnName) + .enName(enName) + .gameCategoryId(categoryId) + .build()); + } + + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianLoginResultDTO.java b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianLoginResultDTO.java new file mode 100644 index 0000000..cea3089 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianLoginResultDTO.java @@ -0,0 +1,52 @@ +package com.ff.game.api.meitian.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * 登录时不重定向响应dto + * + * @author shi + * @date 2024/10/22 + */ +@NoArgsConstructor +@Data +public class MeiTianLoginResultDTO { + + @JsonProperty("resultCode") + private int errorCode; + @JsonProperty("url") + private String url; + + @Getter + @AllArgsConstructor + public enum ResultMessage { + LoginException(0, "登录异常"), + LoginSuccess(1, "登录成功"), + MerchantNotExist(2, "商户不存在"), + MerchantInvalid(3, "商户无效"), + MerchantUserNotExist(4, "商户用户不存在"), + MerchantUserSystemDisabled(6, "商户用户系统禁用"), + PasswordError(7, "密码错误"), + IPLimited(15, "IP被限制"), + DecryptError(21, "解密错误"), + MerchantUserLoginDisabled(22, "商户用户登录禁用"), + OptionalParameterError(32, "可选参数错误"), + MaintenanceMode(40, "维护模式"), + Unknown(-1, "未知错误"); + private int code; + private String message; + } + + public static ResultMessage get(int errorCode) { + for (ResultMessage resultMessage : ResultMessage.values()) { + if (resultMessage.getCode() == errorCode) { + return resultMessage; + } + } + return ResultMessage.Unknown; + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianLogoutDTO.java b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianLogoutDTO.java new file mode 100644 index 0000000..103321c --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianLogoutDTO.java @@ -0,0 +1,43 @@ +package com.ff.game.api.meitian.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@Data +public class MeiTianLogoutDTO { + + @JsonProperty("resultCode") + private int errorCode; + + + @Getter + @AllArgsConstructor + public enum ResultMessage { + QueryException(0, "查询异常"), + QuerySuccess(1, "查询成功"), + MerchantNotExist(2, "商户不存在"), + MerchantInvalid(3, "商户无效"), + MerchantUserNotExist(4, "商户用户不存在"), + MerchantUserSystemDisabled(6, "商户用户系统禁用"), + MerchantUserGameOnline(12, "商户用户游戏在线"), + IPLimited(15, "IP被限制"), + MaintenanceMode(40, "维护模式"), + Unknown(-1, "未知错误") + ,; + private int code; + private String message; + } + + public static ResultMessage get(int errorCode) { + for (ResultMessage resultMessage : ResultMessage.values()) { + if (resultMessage.code == errorCode) { + return resultMessage; + } + } + return ResultMessage.Unknown; + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianMemberInfoDTO.java b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianMemberInfoDTO.java new file mode 100644 index 0000000..c28eea2 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianMemberInfoDTO.java @@ -0,0 +1,69 @@ +package com.ff.game.api.meitian.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * 会员信息dto + * + * @author shi + * @date 2024/10/30 + */ +@NoArgsConstructor +@Data +public class MeiTianMemberInfoDTO { + + /** + * 错误代码 + */ + @JsonProperty("resultCode") + private int errorCode; + /** + * 余额 + */ + @JsonProperty("coinBalance") + private BigDecimal balance; + + @JsonProperty("status") + private Integer status; + + @JsonProperty("currency") + private String currency; + + + @Getter + @AllArgsConstructor + public enum ResultMessage { + Excep(0,"查询异常"), + Success(1,"查询成功"), + // 商户不存在 + MerchantNotExist(2,"商户不存在"), + // 商户无效 + MerchantInvalid(3,"商户无效"), + // 商户用户不存在 + AccountNotExist(4,"商户用户不存在"), + // IP被限制 + IpLimit(15,"IP被限制"), + // 维护模式 + Maintenance(40,"维护模式"), + + Unknown(-1, "未知") + ,; + private int code; + private String message; + + public static ResultMessage getResultMessage(int code) { + for (ResultMessage resultMessage : ResultMessage.values()) { + if (resultMessage.code == code) { + return resultMessage; + } + } + return Unknown; + } + } +} 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 new file mode 100644 index 0000000..2f4628c --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/meitian/impl/MeiTianGameServiceImpl.java @@ -0,0 +1,677 @@ +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; +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.sign.Md5Utils; +import com.ff.base.utils.uuid.IdUtils; +import com.ff.game.api.IGamesService; +import com.ff.game.api.meitian.client.MeiTianClient; +import com.ff.game.api.meitian.dto.*; +import com.ff.game.api.request.*; +import com.ff.game.domain.*; +import com.ff.game.dto.GameSecretKeyCurrencyDTO; +import com.ff.game.service.*; +import com.ff.member.domain.Member; +import com.ff.member.service.IMemberService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + + +/** + * 游戏数据解析服务 + * + * @author shi + * @date 2024/10/21 + */ +@Service("MeiTianService") +@Slf4j +public class MeiTianGameServiceImpl implements IGamesService { + + + @Resource + private ISysConfigService configService; + + @Resource + private RedisCache redisCache; + + @Resource + private IGameExchangeMoneyService gameExchangeMoneyService; + + @Resource + private IGamePlatformService gamePlatformService; + + + @Resource + private IGameService gameService; + + + @Resource + private IMemberService memberService; + + + @Resource + private IGameSecretKeyService gameSecretKeyService; + + @Resource + private MeiTianClient meiTianClient; + + @Resource + private IGameBettingDetailsService gameBettingDetailsService; + + @Resource + private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; + + @Resource + private IGameNameService gameNameService; + + /** + * 获得就是成功 + * + * @param errorCode 错误代码 + * @return {@link Boolean } + */ + private Boolean isSuccess(Integer errorCode) { + return 1 == errorCode; + } + + /** + * 创建成员 + * + * @param createMemberRequestDTO 创建成员请求dto + * @return {@link Boolean } + */ + @Override + public Boolean createMember(CreateMemberRequestDTO createMemberRequestDTO) { + GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(createMemberRequestDTO.getAgentId()); + + String playerName = createMemberRequestDTO.getAccount(); + String merchantId = createMemberRequestDTO.getAgentId(); + String md5Password = Md5Utils.md5New(gameSecretKey.getPassword()); + Map rawMap = new LinkedHashMap<>(); + rawMap.put("nickname", createMemberRequestDTO.getAccount()); + rawMap.put("playerLevel", "0"); + String rawData = JSON.toJSONString(rawMap); + String data = null; + try { + data = Base64.encode(rawData.getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + log.error("[MeiTian] encode rawData failure", e); + throw new ApiException(ErrorCode.ERROR.getCode()); + } + String md5Code = Md5Utils.md5New(gameSecretKey.getKey() + rawData);//MD5(key+rawData); + MeiTianCreateMemberResponseDTO createMemberResponseDTO = + meiTianClient.createMember( + playerName, + merchantId, + md5Password, + md5Code, + data); + int errorCode = createMemberResponseDTO.getResultCode(); + log.info("[MeiTian]创建会员失败返回结果:{}", errorCode); + if (1 == errorCode) { + return Boolean.TRUE; + } + if (5 == errorCode) { + throw new ApiException(ErrorCode.GAME_ACCOUNT_CREATION_FAILED.getCode()); + } + //判断是否获取成功 + return Boolean.FALSE; + } + + + /** + * 获取会员信息 + * + * @param memberInfoRequestDTO 会员信息请求dto + * @return {@link MemberInfoResponseDTO } + */ + @Override + public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO memberInfoRequestDTO) { + + String playerName = memberInfoRequestDTO.getAccounts(); + String merchantId = memberInfoRequestDTO.getAgentId(); + MeiTianMemberInfoDTO memberInfoDTO = meiTianClient.getMemberInfo(playerName, merchantId); + //判断是否获取成功 + if (this.isSuccess(memberInfoDTO.getErrorCode())) { + return MemberInfoResponseDTO.builder() + .status(GameMemberStatus.UNKNOWN.getCode()) + .balance(memberInfoDTO.getBalance()) + .account(playerName) + .build(); + } else { + throw new BaseException(MeiTianMemberInfoDTO.ResultMessage.getResultMessage(memberInfoDTO.getErrorCode()).getMessage()); + } + } + + /** + * 无重定向登录 + * + * @param gamesLogin 游戏登录 + * @return {@link String } + */ + @Override + public String loginWithoutRedirect(GamesLogin gamesLogin) { + GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(gamesLogin.getAgentId()); + + String merchantId = gamesLogin.getAgentId(); + String playerName = gamesLogin.getAccount(); + String md5Password = Md5Utils.md5New(gameSecretKey.getPassword()); + Map rawMap = new LinkedHashMap<>(); + rawMap.put("gameHall ", gamesLogin.getGameType()); + /*rawMap.put("gameCode", gamesLogin.getGameId()); + rawMap.put("lang", gamesLogin.getLang()); + rawMap.put("roomID", "0");*/ + + String rawData = JSON.toJSONString(rawMap); + String data = null; + try { + data = Base64.encode(rawData.getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + log.error("[MeiTian] encode rawData failure", e); + throw new ApiException(ErrorCode.ERROR.getCode()); + } + String code = Md5Utils.md5New(gameSecretKey.getKey() + rawData); + MeiTianLoginResultDTO loginWithoutRedirectResponseDTO = + meiTianClient.loginWithoutRedirect( + merchantId, + playerName, + md5Password, + code, + data + ); + //判断是否获取成功 + if (this.isSuccess(loginWithoutRedirectResponseDTO.getErrorCode())) { + return loginWithoutRedirectResponseDTO.getUrl(); + } else { + throw new BaseException(MeiTianLoginResultDTO.get(loginWithoutRedirectResponseDTO.getErrorCode()).getMessage()); + } + + } + + /** + * 获取游戏列表 + * + * @param gamesBaseRequestDTO 游戏请求dto + * @return {@link String } + */ + @Transactional + @Override + public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) { + + List gamesDatas = redisCache.getCacheList(CacheConstants.MeiTian_GAMES); + if (!CollectionUtils.isEmpty(gamesDatas)) { + return CacheConstants.MeiTian_GAMES; + } + + MeiTianGamesDTO gameList = new MeiTianGamesDTO(); + + for (MeiTianGameDataDTO gamesDataDTO : gameList.getData()) { + GamePlatform gamePlatform = GamePlatform.builder() + .platformType(MeiTianGameType.findSystemByCode(gamesDataDTO.getGameCategoryId())) + .platformCode(GamePlatforms.MeiTIan.getCode()) + .build(); + List gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform); + //没有此平台就新增一个平台 + if (CollectionUtils.isEmpty(gamePlatforms)) { + gamePlatform.setPlatformName(GamePlatforms.MeiTIan.getInfo() + MeiTianGameType.findInfoByCode(gamesDataDTO.getGameCategoryId())); + gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1); + gamePlatform.setCreateBy(Constants.SYSTEM); + gamePlatformService.insertGamePlatform(gamePlatform); + } else { + gamePlatform = gamePlatforms.get(0); + } + Game game = Game.builder() + .platformId(gamePlatform.getId()) + .gameCode(String.valueOf(gamesDataDTO.getGameId())) + .build(); + List games = gameService.selectGameList(game); + //不存在这个游戏 + if (CollectionUtils.isEmpty(games)) { + game.setGameSourceType(String.valueOf(gamesDataDTO.getGameCategoryId())); + game.setFreespin(false); + game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); + game.setGameName(gamesDataDTO.getCnName()); + game.setCreateBy(Constants.SYSTEM); + gameService.insertGame(game); + } else { + 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()); +// + gameNameService.insertGameName(GameName.builder() + .gameId(game.getId()) + .gameName(gamesDataDTO.getEnName()) + .langCode("en-US") + .createBy(Constants.SYSTEM) + .build()); + } + + + } + + redisCache.deleteObject(CacheConstants.MeiTian_GAMES); + redisCache.setCacheList(CacheConstants.MeiTian_GAMES, gameList.getData()); + redisCache.expire(CacheConstants.MeiTian_GAMES, 5L, TimeUnit.HOURS); + + return CacheConstants.MeiTian_GAMES; + } + + /** + * 按代理id进行交换转账 + * + * @param exchangeTransferMoneyRequestDTO 外汇转账moeny dto + * @return {@link Long } + */ + @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.MeiTIan.getCode() + IdUtils.simpleUUID(); + + List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( + GameExchangeMoney.builder() + .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) + .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) + .build() + ); + Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); + + + //获取下一个自增id + GameExchangeMoney exchangeMoney = GameExchangeMoney + .builder() + .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) + .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) + .quota(exchangeTransferMoneyRequestDTO.getQuota()) + .balance(exchangeTransferMoneyRequestDTO.getAmount()) + .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) + .currencyCode(gameSecretKey.getSystemCurrency()) + .memberId(member.getId()) + .transactionId(transactionId) + .platformCode(GamePlatforms.MeiTIan.getCode()) + .build(); + exchangeMoney.setCreateBy(Constants.SYSTEM); + //接口限制限制50字符 + exchangeMoney.setTransactionId(transactionId); + + + String key = gameSecretKey.getKey(); + String merchantId = exchangeTransferMoneyRequestDTO.getAgentId(); + String playerName = exchangeTransferMoneyRequestDTO.getAccount(); + String coins = exchangeTransferMoneyRequestDTO.getAmount().setScale(4, RoundingMode.DOWN).toString(); + Map rawMap = new LinkedHashMap<>(); + rawMap.put("merchantId", merchantId); + rawMap.put("playerName", playerName); + rawMap.put("extTransId", transactionId); + rawMap.put("coins", coins); + String rawData = JSON.toJSONString(rawMap); + String data = null; + try { + data = Base64.encode(rawData.getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + log.error("[MeiTian] base64 rawData failure", e); + throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); + } + String md5Code = Md5Utils.md5New(key + rawData); + // 转入到游戏商 type == 2 + if (exchangeTransferMoneyRequestDTO.getTransferType().equals(TransferType.GAMES.getCode())) { + + MeiTianExchangeMoneyResponseDTO exchangeMoneyResponse = meiTianClient + .transferIn( + merchantId, + playerName, + coins, + transactionId, + md5Code, + data + ); + + //判断是否转移成功 + if (this.isSuccess(exchangeMoneyResponse.getErrorCode())) { + //更新数据 + exchangeMoney.setBalance(exchangeMoneyResponse.getBalance()); + BigDecimal transAmount = exchangeTransferMoneyRequestDTO.getAmount(); + exchangeMoney.setCoinBefore(exchangeMoneyResponse.getBalance().subtract(transAmount)); + exchangeMoney.setCoinAfter(exchangeMoneyResponse.getBalance()); + exchangeMoney.setCurrencyBefore(exchangeMoneyResponse.getBalance().subtract(transAmount)); + exchangeMoney.setCurrencyAfter(exchangeMoneyResponse.getBalance()); + exchangeMoney.setStatus(1); // SUCCESS + gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + + } else { + throw new BaseException(MeiTianExchangeMoneyResponseDTO.TransferIn.get(exchangeMoneyResponse.getErrorCode()).getMessage()); + } + + } else { + + MeiTianExchangeMoneyResponseDTO exchangeMoneyResponse = meiTianClient + .transferOut( + merchantId, + playerName, + coins, + transactionId, + md5Code, + data + ); + + //判断是否转移成功 + if (this.isSuccess(exchangeMoneyResponse.getErrorCode())) { + //更新数据 + exchangeMoney.setBalance(exchangeMoneyResponse.getBalance()); + BigDecimal transAmount = exchangeTransferMoneyRequestDTO.getAmount(); + exchangeMoney.setCoinBefore(exchangeMoneyResponse.getBalance().add(transAmount)); + exchangeMoney.setCoinAfter(exchangeMoneyResponse.getBalance()); + exchangeMoney.setCurrencyBefore(exchangeMoneyResponse.getBalance().add(transAmount)); + exchangeMoney.setCurrencyAfter(exchangeMoneyResponse.getBalance()); + exchangeMoney.setStatus(1); // SUCCESS + gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + } else { + throw new BaseException(MeiTianExchangeMoneyResponseDTO.TransferOut.get(exchangeMoneyResponse.getErrorCode()).getMessage()); + } + } + return exchangeMoney.getId(); + } + + /** + * 汇兑转移状态 + * + * @param exchangeTransferMoneyRequestDTO 兑换转账请求dto + * @return {@link Boolean } + */ + @Override + public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + return Boolean.TRUE; + } + + + /** + * 按时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link Boolean } + */ + @Override + public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { + + /*//获取key + JILIBetRecordResponseDTO betRecordJILIResponse = meiTianClient.getBetRecordByTime(query + "&Key=" + key, betRecordByTimeDTO.getAgentId()); + + //判断是否获取成功 + if (this.isSuccess(betRecordJILIResponse.getErrorCode())) { + //数据插入 + this.batchInsert(betRecordJILIResponse); + 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 [getBetRecordByTime] 请求参数 {}", query); + betRecordByTimeDTO.setQuery(query); + key = this.getKey(betRecordByTimeDTO); + betRecordJILIResponse = meiTianClient.getBetRecordByTime(query + "&Key=" + key, betRecordByTimeDTO.getAgentId()); + dataBean = betRecordJILIResponse.getData(); + if (this.isSuccess(betRecordJILIResponse.getErrorCode())) { + //数据插入 + this.batchInsert(betRecordJILIResponse); + } else { + log.error("GameBettingDataJILIServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordJILIResponse.getErrorCode(), betRecordJILIResponse.getMessage()); + } + } + } else { + return Boolean.FALSE; + }*/ + return Boolean.TRUE; + } + + + /** + * 按历史时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link Boolean } + */ + @Override + public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { + return null; + } + + + /** + * 赠送免费局数 + * + * @param createFreeSpinRequest 创建自由旋转请求 + * @return {@link Boolean } + */ + @Override + public Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest) { + throw new BaseException("暂不支持免费局数"); + } + + /** + * 获取游戏详细信息 + * + * @param getGameDetailRequestDTO 获取游戏详细信息请求dto + * @return {@link GetGameDetailResponseDTO } + */ + @Override + public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) { + GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(getGameDetailRequestDTO.getAgentId()); + + String key = gameSecretKey.getKey(); + String merchantId = getGameDetailRequestDTO.getAgentId(); + Map rawMap = new LinkedHashMap<>(); + rawMap.put("rowID", getGameDetailRequestDTO.getWagersId()); + rawMap.put("lang", getGameDetailRequestDTO.getLang()); + + String rawData = JSON.toJSONString(rawMap); + String data = null; + try { + data = Base64.encode(rawData.getBytes("UTF-8")); + } catch (Exception e) { + log.error("[MeiTian] encode rawData failure", e); + throw new ApiException(ErrorCode.ERROR.getCode()); + } + String code = Md5Utils.md5New(data + key); + MeiTianGameRecordDetailDTO responseDTO = meiTianClient.getGameDetail(merchantId, code, data); + + //判断是否获取成功 + if (this.isSuccess(responseDTO.getErrorCode())) { + GetGameDetailResponseDTO getGameDetailResponseDTO = new GetGameDetailResponseDTO(); + getGameDetailResponseDTO.setUrl(responseDTO.getUrl()); + return getGameDetailResponseDTO; + } else { + throw new BaseException(MeiTianGameRecordDetailDTO.get(responseDTO.getErrorCode()).getMessage()); + } + } + + /** + * 强制会员从游戏注销 + * + * @param kickMemberRequestDTO 踢会员请求dto + * @return {@link Boolean } + */ + @Override + public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) { + + String merchantId = kickMemberRequestDTO.getAgentId(); + String playerName = kickMemberRequestDTO.getAccount(); + + MeiTianLogoutDTO jiliKickMemberDTO = meiTianClient.kickMember( + merchantId, + playerName); + //判断是否获取成功 + if (this.isSuccess(jiliKickMemberDTO.getErrorCode())) { + return Boolean.TRUE; + } else { + throw new BaseException(MeiTianLogoutDTO.get(jiliKickMemberDTO.getErrorCode()).getMessage()); + + } + } + + /** + * 踢成员全部 + * + * @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 betRecordJILIResponse 投注记录jiliresponse + * @return {@link Integer } + */ + private void batchInsert(JILIBetRecordResponseDTO betRecordJILIResponse) { + List gameBettingDetails = new ArrayList<>(); + List wagersIds = new ArrayList<>(); + //数据组装 + JILIBetRecordResponseDTO.DataBean dataBean = betRecordJILIResponse.getData(); + //数据转化 + for (JILIBetRecordDataResponseDTO jiliBetRecordDataResponseDTO : dataBean.getResult()) { + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(jiliBetRecordDataResponseDTO).build()); + if (!ObjectUtils.isEmpty(bettingDetails)) { + bettingDetails.setId(IdUtil.getSnowflakeNextId()); + gameBettingDetails.add(bettingDetails); + } + wagersIds.add(jiliBetRecordDataResponseDTO.getWagersId()); + } + if (!CollectionUtils.isEmpty(gameBettingDetails)) { + //查询重复数据id + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds); + //用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) { + + //转化类 + JILIBetRecordDataResponseDTO jiliBetRecordDataResponseDTO = (JILIBetRecordDataResponseDTO) gamesDataBuildDTO.getData(); + GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() + .code(jiliBetRecordDataResponseDTO.getAgentId()) + .platformCode(GamePlatforms.MeiTIan.getInfo()).build()); + + + Member member = memberService.selectMemberByGameAccount(jiliBetRecordDataResponseDTO.getAccount()); + if (ObjectUtils.isEmpty(member)) { + return null; + } + List gamesDatas = redisCache.getCacheList(CacheConstants.JILI_GAMES); + Map dataDTOMap = gamesDatas.stream().collect(Collectors.toMap(MeiTianGameDataDTO::getGameId, e -> e)); + MeiTianGameDataDTO gamesDataDTO = dataDTOMap.get(jiliBetRecordDataResponseDTO.getGameId()); + BigDecimal payoffAmount = BigDecimal.ZERO; + if (GameStatus.WIN.getCode().equals(jiliBetRecordDataResponseDTO.getStatus())) { + payoffAmount = NumberUtil.sub(jiliBetRecordDataResponseDTO.getPayoffAmount(), jiliBetRecordDataResponseDTO.getTurnover()); + } else if (GameStatus.FAIL.getCode().equals(jiliBetRecordDataResponseDTO.getStatus())) { + payoffAmount = NumberUtil.sub(jiliBetRecordDataResponseDTO.getPayoffAmount(), jiliBetRecordDataResponseDTO.getTurnover()).negate(); + } + + //数据构造 + GameBettingDetails gameBettingDetails = GameBettingDetails.builder() + .tenantKey(member.getTenantKey()) + //保存我们的币种id + .currencyCode(gameSecretKey.getSystemCurrency()) + .memberId(member.getId()) + .gameCode(jiliBetRecordDataResponseDTO.getGameId()) + .gameType(JILIGameType.findSystemByCode(jiliBetRecordDataResponseDTO.getGameCategoryId())) + .platformCode(GamePlatforms.MeiTIan.getCode()) + .gameId(gamesDataDTO.getSystemGameId()) + .gameName(gamesDataDTO.getCnName()) + .gameStatus(jiliBetRecordDataResponseDTO.getStatus()) + .gameStatusType(jiliBetRecordDataResponseDTO.getType()) + .gameCurrencyCode(jiliBetRecordDataResponseDTO.getAgentId()) + .account(String.valueOf(jiliBetRecordDataResponseDTO.getAccount())) + .wagersId(jiliBetRecordDataResponseDTO.getWagersId()) + .wagersTime(jiliBetRecordDataResponseDTO.getWagersTime()) + .betAmount(jiliBetRecordDataResponseDTO.getBetAmount().abs()) + .payoffTime(jiliBetRecordDataResponseDTO.getPayoffTime()) + .payoffAmount(payoffAmount) + .settlementTime(jiliBetRecordDataResponseDTO.getSettlementTime()) + .turnover(jiliBetRecordDataResponseDTO.getTurnover()) + .orderNo(String.valueOf(jiliBetRecordDataResponseDTO.getRoundIndex())) + .settlementStatus(SettlementStatusEnum.COMPLETED.getCode()) + .build(); + gameBettingDetails.setCreateBy(Constants.SYSTEM); + gameBettingDetails.setCreateTime(DateUtils.getNowDate()); + return gameBettingDetails; + } +} From 922d59591de6546cdccd96ffce9ae2b3757feb25 Mon Sep 17 00:00:00 2001 From: shi Date: Tue, 1 Apr 2025 16:13:44 +0800 Subject: [PATCH 12/62] =?UTF-8?q?feat(game):=20=E6=8E=A5=E5=85=A5=20AE?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=B9=B3=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 AE 游戏平台的下注记录获取功能 - 实现 AE平台的余额转换状态查询接口 - 添加 AE 平台的玩家登出接口 - 重构原有 XK 平台的相关代码,改为支持 AE 平台 --- .../com/ff/base/constant/CacheConstants.java | 8 + .../java/com/ff/base/utils/DateUtils.java | 24 ++ .../com/ff/game/api/ae/client/AEClient.java | 43 +++- .../game/api/ae/dto/AEBetRecordResponse.java | 186 ++++++++++++++ .../dto/AEExchangeTransferStatusResponse.java | 54 +++++ .../game/api/ae/dto/AELogoutUserResponse.java | 33 +++ .../api/ae/dto/XKBetRecordResponseDTO.java | 54 ----- .../api/ae/dto/XKCreateMemberResponseDTO.java | 32 --- .../ae/dto/XKExchangeMoneyResponseDTO.java | 46 ---- .../game/api/ae/dto/XKKickMemberAllDTO.java | 27 --- .../ff/game/api/ae/dto/XKKickMemberDTO.java | 13 - .../XKLoginWithoutRedirectResponseDTO.java | 29 --- .../ff/game/api/ae/dto/XKMemberInfoDTO.java | 49 ---- .../game/api/ae/impl/GamesAEServiceImpl.java | 228 +++++++++++------- .../ExchangeTransferStatusRequestDTO.java | 5 +- .../ff/game/domain/GameBettingDetails.java | 6 + .../java/com/ff/quartz/task/GameTask.java | 1 + 17 files changed, 496 insertions(+), 342 deletions(-) create mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/AEBetRecordResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/AEExchangeTransferStatusResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/AELogoutUserResponse.java delete mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/XKBetRecordResponseDTO.java delete mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/XKCreateMemberResponseDTO.java delete mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/XKExchangeMoneyResponseDTO.java delete mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/XKKickMemberAllDTO.java delete mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/XKKickMemberDTO.java delete mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/XKLoginWithoutRedirectResponseDTO.java delete mode 100644 ff-game/src/main/java/com/ff/game/api/ae/dto/XKMemberInfoDTO.java 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 676af5f..b922b43 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 @@ -83,5 +83,13 @@ public class CacheConstants */ public static final String PG_GAMES_BET_CURRENCY= "pg_games:bet:currency"; + /** + * ae时间从 + */ + public static final String AE_TIME_FROM= "ae:time:from"; } + + + + 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 49e7441..36043d1 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 @@ -38,6 +38,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { public static String DAY_END_TIME = "23:59:59"; + public static final String ISO_8601_FORMAT= "yyyy-MM-dd'T'HH:mm:ss"; + /** * 获取当前Date型日期 * @@ -202,6 +204,28 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { return zdt.format(formatter); } + /** + * 将时间戳转换为指定格式的时间字符串 + * + * @param timestamp 时间戳(毫秒) + * @param format 目标时间格式,例如:yyyy-MM-dd'T'HH:mm:ssXXX + * @param timeZone 时区,例如:GMT+8,UTC等 + * @return 格式化后的时间字符串 + */ + public static String convertTimestampToFormattedDate(long timestamp, String format, String timeZone) { + // 创建日期格式化对象 + SimpleDateFormat sdf = new SimpleDateFormat(format); + + // 设置时区为GMT+8 + sdf.setTimeZone(TimeZone.getTimeZone(timeZone)); + + // 转换为 Date 对象 + Date date = new Date(timestamp); + + // 返回格式化后的时间字符串 + return sdf.format(date); + } + /** * 将毫秒时间戳转换为指定时区的时间,并按指定格式输出 * diff --git a/ff-game/src/main/java/com/ff/game/api/ae/client/AEClient.java b/ff-game/src/main/java/com/ff/game/api/ae/client/AEClient.java index e87950c..032cc08 100644 --- a/ff-game/src/main/java/com/ff/game/api/ae/client/AEClient.java +++ b/ff-game/src/main/java/com/ff/game/api/ae/client/AEClient.java @@ -4,6 +4,8 @@ import com.dtflys.forest.annotation.*; import com.ff.game.api.ae.address.MyAEAddressSource; import com.ff.game.api.ae.dto.*; import com.ff.game.api.jili.dto.*; +import com.ff.game.api.xk.dto.XKKickMemberAllDTO; +import com.ff.game.api.xk.dto.XKKickMemberDTO; import java.util.Map; @@ -69,24 +71,53 @@ public interface AEClient { }) AETransactionResponse withdraw(@Body Map params); + + /** + * 汇兑转移状态 + * + * @param params 参数 + * @return {@link AEExchangeTransferStatusResponse } + */ + @Post(url ="/wallet/checkTransferOperation", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + AEExchangeTransferStatusResponse exchangeTransferStatus(@Body Map params); + /** * 按时间获取投注记录 * * @param params 参数 - * @return {@link XKBetRecordResponseDTO } + * @return {@link AEBetRecordResponse } */ - @Post(url = "/getGameRecordByTime") - XKBetRecordResponseDTO getBetRecordByTime(@JSONBody Map params); - + @Post(url ="https://tttfetch.apihub55.com/fetch/gzip/getTransactionByUpdateDate", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + AEBetRecordResponse getBetRecordByTime(@Body Map params); + /** + * 按时间获取投注历史记录 + * + * @param params 参数 + * @return {@link AEBetRecordResponse } + */ + @Post(url ="https://tttfetch.apihub55.com/fetch/gzip/getTransactionByTxTime", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + AEBetRecordResponse getBetHistoryRecordByTime(@Body Map params); /** * 踢出队员 * * @param params 参数 * @return {@link JILIKickMemberDTO } */ - @Post("/kickMember") - XKKickMemberDTO kickMember(@JSONBody Map params); + @Post(url ="/wallet/logout", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + XKKickMemberDTO kickMember(@Body Map params); /** * 踢出所有队员 diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/AEBetRecordResponse.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/AEBetRecordResponse.java new file mode 100644 index 0000000..a288b22 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/ae/dto/AEBetRecordResponse.java @@ -0,0 +1,186 @@ +package com.ff.game.api.ae.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * aebet记录响应 + * + * @author shi + * @date 2025/04/01 + */ +@Data +public class AEBetRecordResponse { + + /** + * 状态代码 + */ + @JsonProperty("status") + private Integer status; + + /** + * 描述信息 (String类型) + * "Success" - 请求成功 + * 其他 - 错误信息 + */ + private String desc; + /** + * 交易记录 + */ + @JsonProperty("transactions") + private List transactions; + + @Data + public static class Transaction { + + /** + * 游戏类型 + */ + @JsonProperty("gameType") + private String gameType; + + /** + * 返还金额(包含下注金额) + */ + @JsonProperty("winAmount") + private BigDecimal winAmount; + + /** + * 交易时间 + */ + @JsonProperty("txTime") + private Date txTime; + + /** + * 结算状态 + */ + @JsonProperty("settleStatus") + private Integer settleStatus; + + /** + * 游戏信息 + */ + @JsonProperty("gameInfo") + private String gameInfo; + + /** + * 真实返还金额 + */ + @JsonProperty("realWinAmount") + private BigDecimal realWinAmount; + + /** + * 更新时间 + */ + @JsonProperty("updateTime") + private String updateTime; + + /** + * 真实下注金额 + */ + @JsonProperty("realBetAmount") + private BigDecimal realBetAmount; + + /** + * 用户ID + */ + @JsonProperty("userId") + private String userId; + + /** + * 下注类型 + */ + @JsonProperty("betType") + private String betType; + + /** + * 平台名称 + */ + @JsonProperty("platform") + private String platform; + + /** + * 交易状态 + */ + @JsonProperty("txStatus") + private Integer txStatus; + + /** + * 下注金额 + */ + @JsonProperty("betAmount") + private BigDecimal betAmount; + + /** + * 游戏名称 + */ + @JsonProperty("gameName") + private String gameName; + + /** + * 平台注单号 + */ + @JsonProperty("platformTxId") + private String platformTxId; + + /** + * 下注时间 + */ + @JsonProperty("betTime") + private Date betTime; + + /** + * 平台游戏代码 + */ + @JsonProperty("gameCode") + private String gameCode; + + /** + * 玩家货币代码 + */ + @JsonProperty("currency") + private String currency; + + /** + * 累积奖金的获胜金额 + */ + @JsonProperty("jackpotWinAmount") + private BigDecimal jackpotWinAmount; + + /** + * 累积奖金贡献金额 + */ + @JsonProperty("jackpotBetAmount") + private BigDecimal jackpotBetAmount; + + /** + * 平台有效投注 + */ + @JsonProperty("turnover") + private BigDecimal turnover; + + /** + * 游戏商的回合识别码 + */ + @JsonProperty("roundId") + private String roundId; + + + + /** + * 子注单号 + */ + @JsonProperty("refPlatformTxId") + private String refPlatformTxId; + + /** + * 是否为特殊收费游戏 + */ + @JsonProperty("isPremium") + private Boolean isPremium; + } +} 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 new file mode 100644 index 0000000..c2d064e --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/ae/dto/AEExchangeTransferStatusResponse.java @@ -0,0 +1,54 @@ +package com.ff.game.api.ae.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + + +/** + * aeexchange传输状态响应 + * + * @author shi + * @date 2025/04/01 + */ +@Data +public class AEExchangeTransferStatusResponse { + + /** + * 响应状态 + */ + @JsonProperty("status") + private String status; + + /** + * 情境 1:响应 status = 0000 & txStatus = 1 表示存款/提款成功 + * 情境 2:响应 status = 0000 & txStatus = 0 表示存款/提款失败 + * 情境 3:响应 status = 0000 & txStatus = 2 表示存款/提款处理中,可 3 秒后调用 checkTransferOperation API 确认回覆直到 txStatus = 0 或 1 的回覆 + * 情境 4:响应 status = 1017 表示交易不存在 + */ + @JsonProperty("txStatus") + private String txStatus; + + /** + * 当前余额 + */ + @JsonProperty("balance") + private double balance; + + /** + * 转账金额 + */ + @JsonProperty("transferAmount") + private double transferAmount; + + /** + * 转账类型(如:DEPOSIT 或 WITHDRAW) + */ + @JsonProperty("transferType") + private String transferType; + + /** + * 交易代码 + */ + @JsonProperty("txCode") + private String txCode; +} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/AELogoutUserResponse.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/AELogoutUserResponse.java new file mode 100644 index 0000000..7451bce --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/ae/dto/AELogoutUserResponse.java @@ -0,0 +1,33 @@ +package com.ff.game.api.ae.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +/** + * 注销用户响应 + * + * @author shi + * @date 2025/04/01 + */ +@Data +public class AELogoutUserResponse { + /** + * 状态代码 + */ + @JsonProperty("status") + private String status; + + /** + * 已注销的用户列表 + */ + @JsonProperty("logoutUsers") + private List logoutUsers; + + /** + * 用户数量 + */ + @JsonProperty("count") + private Integer count; +} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKBetRecordResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKBetRecordResponseDTO.java deleted file mode 100644 index a4c3540..0000000 --- a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKBetRecordResponseDTO.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.ff.game.api.ae.dto; - -import io.jsonwebtoken.lang.Collections; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; - -@NoArgsConstructor -@Data -public class XKBetRecordResponseDTO { - - private Integer code; - private String msg; - private DataBean data; - - @NoArgsConstructor - @Data - public static class DataBean { - private Integer currentPage; - private Integer totalPages; - private Integer pageLimit; - private Integer totalNumber; - private List result; - - public List getResult() { - if (Collections.isEmpty(result)) { - return new ArrayList<>(); - } - return result; - } - - @NoArgsConstructor - @Data - public static class ResultBean { - private String account; - private Long wagersId; - private String gameId; - private Long wagersTime; - private BigDecimal betAmount; - private Long payoffTime; - private BigDecimal payoffAmount; - private Integer status; - private Long settlementTime; - private Integer gameCategoryId; - private Integer type; - private String agentId; - private BigDecimal turnover; - private Long roundIndex; - } - } -} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKCreateMemberResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKCreateMemberResponseDTO.java deleted file mode 100644 index 01578a0..0000000 --- a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKCreateMemberResponseDTO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.ff.game.api.ae.dto; - - -import com.ff.game.api.request.GamesBaseRequestDTO; -import lombok.Data; -import lombok.NoArgsConstructor; - - -/** - * 创建成员响应dto - * - * @author shi - * @date 2024/10/22 - */ -@NoArgsConstructor -@Data -public class XKCreateMemberResponseDTO extends GamesBaseRequestDTO { - - - /** - * 代码 - */ - private int code; - /** - * 数据 - */ - private String data; - /** - * msg - */ - private String msg; -} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKExchangeMoneyResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKExchangeMoneyResponseDTO.java deleted file mode 100644 index be8a729..0000000 --- a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKExchangeMoneyResponseDTO.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.ff.game.api.ae.dto; - -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.math.BigDecimal; - -@NoArgsConstructor -@Data -public class XKExchangeMoneyResponseDTO { - - private int code; - private String msg; - private DataBean data; - - @NoArgsConstructor - @Data - public static class DataBean { - /** - * 交易序号,额度转移纪录唯一值, 长度上限 50 - */ - private String transactionId; - /** - * 转账前金额(游戏币) - */ - private BigDecimal coinBefore; - /** - * 转账后金额(游戏币) - */ - private BigDecimal coinAfter; - /** - * 转账前金额(指定货币) - */ - private BigDecimal currencyBefore; - /** - * 转账后金额(指定货币) - */ - private BigDecimal currencyAfter; - /** - * 状态: - * 1: 成功 - * 2: 失败 - */ - private Integer status; - } -} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKKickMemberAllDTO.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKKickMemberAllDTO.java deleted file mode 100644 index ea17acc..0000000 --- a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKKickMemberAllDTO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.ff.game.api.ae.dto; - -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * xkkick会员全部dto - * - * @author shi - * @date 2024/11/13 - */ -@Data -@NoArgsConstructor -public class XKKickMemberAllDTO { - /** - * 代码 - */ - private int code; - /** - * 数据 - */ - private String data; - /** - * msg - */ - private String msg; -} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKKickMemberDTO.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKKickMemberDTO.java deleted file mode 100644 index ac5ea42..0000000 --- a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKKickMemberDTO.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.ff.game.api.ae.dto; - -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@Data -public class XKKickMemberDTO { - - private int code; - private String msg; - private Object data; -} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKLoginWithoutRedirectResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKLoginWithoutRedirectResponseDTO.java deleted file mode 100644 index e622416..0000000 --- a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKLoginWithoutRedirectResponseDTO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.ff.game.api.ae.dto; - -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * 登录时不重定向响应dto - * - * @author shi - * @date 2024/10/22 - */ -@NoArgsConstructor -@Data -public class XKLoginWithoutRedirectResponseDTO { - - - /** - * 代码 - */ - private int code; - /** - * 数据 - */ - private String data; - /** - * msg - */ - private String msg; -} diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKMemberInfoDTO.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/XKMemberInfoDTO.java deleted file mode 100644 index ae6a3bb..0000000 --- a/ff-game/src/main/java/com/ff/game/api/ae/dto/XKMemberInfoDTO.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.ff.game.api.ae.dto; - -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.math.BigDecimal; -import java.util.List; - -/** - * 会员信息dto - * - * @author shi - * @date 2024/10/30 - */ -@NoArgsConstructor -@Data -public class XKMemberInfoDTO { - - - /** - * 代码 - */ - private Integer code; - /** - * msg - */ - private String msg; - /** - * 数据 - */ - private List data; - - @NoArgsConstructor - @Data - public static class DataBean { - /** - * 账户 - */ - private String account; - /** - * 平衡 - */ - private BigDecimal balance; - /** - * 地位 - */ - private Integer status; - } -} 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 7003447..2c66655 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 @@ -11,13 +11,21 @@ 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.TenantUtils; import com.ff.base.utils.uuid.IdUtils; +import com.ff.common.dto.GameBalanceExchange; +import com.ff.common.service.ITenantGameQuotaFlowService; +import com.ff.common.service.ITenantGameQuotaService; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; import com.ff.game.api.ae.client.AEClient; import com.ff.game.api.ae.dto.*; +import com.ff.game.api.ng.dto.ApiExchangeTransferStatusResponseDTO; +import com.ff.game.api.ng.dto.ApiNGResponseDTO; import com.ff.game.api.request.*; import com.ff.game.api.xk.dto.XKGamesDTO; +import com.ff.game.api.xk.dto.XKKickMemberDTO; import com.ff.game.domain.*; import com.ff.game.dto.GameSecretKeyCurrencyDTO; import com.ff.game.service.*; @@ -63,7 +71,8 @@ public class GamesAEServiceImpl implements IGamesService { @Resource private IGameService gameService; - + @Resource + private ITenantGameQuotaService tenantGameQuotaService; @Resource private IMemberService memberService; @@ -308,10 +317,15 @@ public class GamesAEServiceImpl implements IGamesService { deposit = AEClient.withdraw(params); } } 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()); + } //更新数据 exchangeMoney.setBalance(deposit.getAmount()); - exchangeMoney.setCoinBefore(NumberUtil.sub(deposit.getCurrentBalance(), deposit.getAmount())); + exchangeMoney.setCoinBefore(coinBefore); exchangeMoney.setCoinAfter(deposit.getCurrentBalance()); exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore()); exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter()); @@ -338,6 +352,39 @@ public class GamesAEServiceImpl implements IGamesService { @Override public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { log.info("GamesAEServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO); + + Map paramsMap = this.getKey(exchangeTransferMoneyRequestDTO); + paramsMap.put("txCode", exchangeTransferMoneyRequestDTO.getOrderId()); + + AEExchangeTransferStatusResponse exchangeTransferStatusResponse = AEClient.exchangeTransferStatus(paramsMap); + Integer status = StatusType.IN_PROGRESS.getValue(); + if ("0000".equals(exchangeTransferStatusResponse.getStatus()) && "1".equals(exchangeTransferStatusResponse.getTxStatus())) { + status = StatusType.SUCCESS.getValue(); + } else if ("0000".equals(exchangeTransferStatusResponse.getStatus()) && "0".equals(exchangeTransferStatusResponse.getTxStatus())) { + status = StatusType.FAILURE.getValue(); + } else if ("1017".equals(exchangeTransferStatusResponse.getStatus())) { + 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()) + .build()); + } + exchangeMoney.setStatus(status); + exchangeMoney.setUpdateBy(Constants.SYSTEM); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); + + return Boolean.TRUE; } @@ -350,50 +397,29 @@ public class GamesAEServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { - List gameBettingDetails = new ArrayList<>(); //请求参数 - log.info("GamesXKServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO); - Map params = new LinkedHashMap<>(); - params.put("startTime", betRecordByTimeDTO.getStartTime()); - params.put("endTime", betRecordByTimeDTO.getEndTime()); - params.put("page", betRecordByTimeDTO.getPage()); - params.put("pageLimit", betRecordByTimeDTO.getPageLimit()); - params.put("agentId", betRecordByTimeDTO.getAgentId()); - String query = JsonUtil.mapToQueryString(params); - betRecordByTimeDTO.setQuery(query); - Map key = this.getKey(betRecordByTimeDTO); - params.put("key", key); - XKBetRecordResponseDTO xkBetRecordResponseDTO = AEClient.getBetRecordByTime(params); + log.info("GamesAEServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO); + Map params = this.getKey(betRecordByTimeDTO); + + String timeFrom = redisCache.getCacheObject(CacheConstants.AE_TIME_FROM); + if (StringUtils.isEmpty(timeFrom)){ + timeFrom = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT, "GMT+8")+"+08:00"; + } + + + params.put("timeFrom", timeFrom); + params.put("platform", "SEXYBCRT"); + params.put("delayTime",10000); + AEBetRecordResponse aeBetRecordResponse = AEClient.getBetRecordByTime(params); //判断是否获取成功 - if (this.getIsSuccess(xkBetRecordResponseDTO.getCode())) { + if (this.getIsSuccess(aeBetRecordResponse.getStatus())) { //数据组装 - XKBetRecordResponseDTO.DataBean dataBean = xkBetRecordResponseDTO.getData(); - this.batchInsert(xkBetRecordResponseDTO); - - //获取下一页数据 - while (!Objects.equals(dataBean.getCurrentPage(), dataBean.getTotalPages()) && dataBean.getTotalPages() > 0) { - betRecordByTimeDTO.setPage(dataBean.getCurrentPage() + 1); - //请求参数 - params = new LinkedHashMap<>(); - params.put("startTime", betRecordByTimeDTO.getStartTime()); - params.put("endTime", betRecordByTimeDTO.getEndTime()); - params.put("page", betRecordByTimeDTO.getPage()); - params.put("pageLimit", betRecordByTimeDTO.getPageLimit()); - params.put("agentId", betRecordByTimeDTO.getAgentId()); - query = JsonUtil.mapToQueryString(params); - betRecordByTimeDTO.setQuery(query); - key = this.getKey(betRecordByTimeDTO); - params.put("key", key); - xkBetRecordResponseDTO = AEClient.getBetRecordByTime(params); - this.batchInsert(xkBetRecordResponseDTO); - } - - + this.batchInsert(aeBetRecordResponse); return Boolean.TRUE; } else { - log.error("GamesXKServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", xkBetRecordResponseDTO.getCode(), xkBetRecordResponseDTO.getMsg()); - throw new BaseException(xkBetRecordResponseDTO.getMsg()); + log.error("GamesAEServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc()); + throw new BaseException(aeBetRecordResponse.getDesc()); } } @@ -406,7 +432,28 @@ public class GamesAEServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { - return null; + 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 endTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT, "GMT+8")+"+08:00"; + + + params.put("startTime", startTime); + params.put("endTime", endTime); + params.put("platform","SEXYBCRT"); + AEBetRecordResponse aeBetRecordResponse = AEClient.getBetHistoryRecordByTime(params); + + //判断是否获取成功 + if (this.getIsSuccess(aeBetRecordResponse.getStatus())) { + //数据组装 + this.batchInsert(aeBetRecordResponse); + return Boolean.TRUE; + } else { + log.error("GamesAEServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc()); + throw new BaseException(aeBetRecordResponse.getDesc()); + } } /** @@ -439,14 +486,9 @@ public class GamesAEServiceImpl implements IGamesService { */ @Override public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) { - log.info("GamesXKServiceImpl [kickMember] 请求参数 {}", kickMemberRequestDTO); - Map params = new LinkedHashMap<>(); - params.put("account", kickMemberRequestDTO.getAccount()); - params.put("agentId", kickMemberRequestDTO.getAgentId()); - String query = JsonUtil.mapToQueryString(params); - kickMemberRequestDTO.setQuery(query); - Map key = this.getKey(kickMemberRequestDTO); - params.put("key", key); + log.info("GamesAEServiceImpl [kickMember] 请求参数 {}", kickMemberRequestDTO); + Map params = this.getKey(kickMemberRequestDTO); + params.put("userIds", kickMemberRequestDTO.getAccount()); XKKickMemberDTO xkKickMemberDTO = AEClient.kickMember(params); //判断是否获取成功 if (this.getIsSuccess(xkKickMemberDTO.getCode())) { @@ -493,25 +535,28 @@ public class GamesAEServiceImpl implements IGamesService { /** * 批量插入 * - * @param xkBetRecordResponseDTO xk下注记录响应dto + * @param aeBetRecordResponse ae下注记录响应dto */ - private void batchInsert(XKBetRecordResponseDTO xkBetRecordResponseDTO) { + private void batchInsert(AEBetRecordResponse aeBetRecordResponse) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 - XKBetRecordResponseDTO.DataBean dataBean = xkBetRecordResponseDTO.getData(); + List dataBean = aeBetRecordResponse.getTransactions(); + + String timeFrom=null ; //数据转化 - for (XKBetRecordResponseDTO.DataBean.ResultBean bean : dataBean.getResult()) { + for (AEBetRecordResponse.Transaction bean : dataBean) { GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean).build()); if (!ObjectUtils.isEmpty(bettingDetails)) { bettingDetails.setId(IdUtil.getSnowflakeNextId()); gameBettingDetails.add(bettingDetails); } - wagersIds.add(String.valueOf(bean.getWagersId())); + wagersIds.add(bean.getPlatform() + bean.getPlatformTxId()); + timeFrom=bean.getUpdateTime(); } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds,GamePlatforms.AE.getInfo()); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.AE.getInfo()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) @@ -520,7 +565,10 @@ public class GamesAEServiceImpl implements IGamesService { gameBettingDetailsService.batchInsert(gameBettingDetails); } } - + if (StringUtils.isEmpty(timeFrom)){ + timeFrom = DateUtils.convertTimestampToFormattedDate(DateUtils.getNowDate(), DateUtils.ISO_8601_FORMAT, "UTC+8")+"+08:00"; + } + redisCache.setCacheObject(CacheConstants.AE_TIME_FROM, timeFrom); } /** @@ -532,51 +580,61 @@ public class GamesAEServiceImpl implements IGamesService { @Override public GameBettingDetails dataBuild(GamesDataBuildDTO gamesDataBuildDTO) { //转化类 - XKBetRecordResponseDTO.DataBean.ResultBean resultBean = (XKBetRecordResponseDTO.DataBean.ResultBean) gamesDataBuildDTO.getData(); + AEBetRecordResponse.Transaction resultBean = (AEBetRecordResponse.Transaction) gamesDataBuildDTO.getData(); GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCode(GamePlatforms.XK.getInfo()) - .code(resultBean.getAgentId()) + .platformCode(GamePlatforms.AE.getInfo()) + .currency(resultBean.getCurrency()) .build()); - Member member = memberService.selectMemberByGameAccount(resultBean.getAccount()); + Member member = memberService.selectMemberByGameAccount(resultBean.getUserId()); if (ObjectUtils.isEmpty(member)) { return null; } - List gamesDatas = redisCache.getCacheList(CacheConstants.XK_GAMES); - Map dataDTOMap = gamesDatas.stream().collect(Collectors.toMap(XKGamesDTO.DataBean::getGameId, e -> e)); - XKGamesDTO.DataBean gamesDataDTO = dataDTOMap.get(resultBean.getGameId()); - BigDecimal payoffAmount = BigDecimal.ZERO; - if (GameStatus.WIN.getCode().equals(resultBean.getStatus())) { - payoffAmount = NumberUtil.sub(resultBean.getPayoffAmount(), resultBean.getTurnover()); - } else if (GameStatus.FAIL.getCode().equals(resultBean.getStatus())) { - payoffAmount = NumberUtil.sub(resultBean.getPayoffAmount(), resultBean.getTurnover()).negate(); + + // 判断输赢 + Integer gameStatus = GameStatus.FLAT.getCode(); + BigDecimal payoffAmount=BigDecimal.ZERO; + if (resultBean.getRealWinAmount().compareTo(resultBean.getRealBetAmount()) > 0) { + gameStatus = GameStatus.WIN.getCode(); + payoffAmount=resultBean.getRealWinAmount().subtract(resultBean.getRealBetAmount()); + } else if (resultBean.getRealWinAmount().compareTo(resultBean.getRealBetAmount()) < 0) { + gameStatus = GameStatus.FAIL.getCode(); + payoffAmount=resultBean.getRealWinAmount().subtract(resultBean.getRealBetAmount()).abs(); } + + //结算状态 + int settlementStatus=SettlementStatusEnum.REVOKED.getCode(); + if (resultBean.getTxStatus() == 1){ + settlementStatus=SettlementStatusEnum.COMPLETED.getCode(); + } + //数据构造 GameBettingDetails gameBettingDetails = GameBettingDetails.builder() .tenantKey(member.getTenantKey()) //保存我们的币种id .currencyCode(currencyDTO.getSystemCurrency()) .memberId(member.getId()) - .gameCode(resultBean.getGameId()) - .gameType(XKGameType.findSystemByCode(resultBean.getGameCategoryId())) - .platformCode(GamePlatforms.XK.getCode()) - .gameId(gamesDataDTO.getSystemGameId()) - .gameName(gamesDataDTO.getName()) - .gameStatus(resultBean.getStatus()) - .gameStatusType(resultBean.getType()) - .gameCurrencyCode(resultBean.getAgentId()) - .account(String.valueOf(resultBean.getAccount())) - .wagersId(String.valueOf(resultBean.getWagersId())) - .wagersTime(resultBean.getWagersTime()) - .betAmount(resultBean.getBetAmount().abs()) - .payoffTime(resultBean.getPayoffTime()) + .gameCode(resultBean.getGameCode()) + .gameType(PlatformType.GAME_HALL.getCode()) + .platformCode(GamePlatforms.AE.getCode()) + .gameId(GAME_ID) + .gameName(resultBean.getGameName()) + .gameStatus(gameStatus) + .gameStatusType(resultBean.getSettleStatus()) + .gameCurrencyCode(resultBean.getCurrency()) + .account(resultBean.getUserId()) + .wagersId(resultBean.getPlatform()+resultBean.getPlatformTxId()) + .wagersTime(resultBean.getBetTime().getTime()) + .betAmount(resultBean.getRealBetAmount()) + .payoffTime(resultBean.getTxTime().getTime()) .payoffAmount(payoffAmount) - .settlementTime(resultBean.getSettlementTime()) + .betContent(resultBean.getGameInfo()) + .settlementTime(resultBean.getTxTime().getTime()) .turnover(resultBean.getTurnover()) - .orderNo(String.valueOf(resultBean.getRoundIndex())) - .settlementStatus(SettlementStatusEnum.COMPLETED.getCode()) + .orderNo(String.valueOf(resultBean.getRoundId())) + .settlementStatus(settlementStatus) .build(); gameBettingDetails.setCreateBy(Constants.SYSTEM); gameBettingDetails.setCreateTime(DateUtils.getNowDate()); diff --git a/ff-game/src/main/java/com/ff/game/api/request/ExchangeTransferStatusRequestDTO.java b/ff-game/src/main/java/com/ff/game/api/request/ExchangeTransferStatusRequestDTO.java index 353c3fd..8739091 100644 --- a/ff-game/src/main/java/com/ff/game/api/request/ExchangeTransferStatusRequestDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/request/ExchangeTransferStatusRequestDTO.java @@ -29,5 +29,8 @@ public class ExchangeTransferStatusRequestDTO extends GamesBaseRequestDTO { */ private String orderId; - + /** + * 游戏兑换货币id + */ + private Long gameExchangeMoneyId; } 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 04eb913..06791d1 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 @@ -82,6 +82,12 @@ public class GameBettingDetails extends BaseEntity 28 旋转奖金 DG (1:注单,2:红包小费) + AE + 正常状况: + 预设:0 + 结果更改过状况: + Resettle / Unsettle / Voidsettle / Unvoidsettle: 1 + Voidbet: -1 */ @Excel(name = "注单类型") 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 6675502..fe43fbe 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 @@ -271,6 +271,7 @@ public class GameTask { exchangeTransferStatusRequestDTO.setOrderId(exchangeMoney.getTransactionId()); exchangeTransferStatusRequestDTO.setAgentId(gameSecretKey.getCode()); exchangeTransferStatusRequestDTO.setAgentKey(gameSecretKey.getKey()); + exchangeTransferStatusRequestDTO.setGameExchangeMoneyId(exchangeMoney.getId()); gamesService.get(exchangeMoney.getPlatformCode() + Constants.SERVICE).exchangeTransferStatus(exchangeTransferStatusRequestDTO); } catch (Exception e) { log.error("查询 更新交易记录失败,错误信息 {}", e); From c520a5fa24ad5e3ab73a0b5f19a2110b7fa8aa48 Mon Sep 17 00:00:00 2001 From: cengy Date: Tue, 1 Apr 2025 16:47:19 +0800 Subject: [PATCH 13/62] =?UTF-8?q?refactor(ff-game):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E7=BE=8E=E5=A4=A9=E6=B8=B8=E6=88=8F=E8=AE=B0=E5=BD=95=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改类名和字段名以适应新的数据结构 - 实现按记录ID和日期同步游戏记录的功能- 优化数据处理和插入逻辑 - 更新游戏平台枚举和游戏类型枚举 - 新增系统配置相关方法 --- .../java/com/ff/base/enums/GamePlatforms.java | 2 +- .../com/ff/base/enums/MeiTianGameType.java | 4 +- .../system/service/ISysConfigService.java | 2 + .../service/impl/SysConfigServiceImpl.java | 6 + .../api/meitian/client/MeiTianClient.java | 28 +- .../meitian/dto/JILIBetRecordResponseDTO.java | 62 ----- .../dto/MeiTianBetRecordResponseDTO.java | 77 ++++++ .../meitian/impl/MeiTianGameServiceImpl.java | 250 +++++++++++++----- 8 files changed, 288 insertions(+), 143 deletions(-) delete mode 100644 ff-game/src/main/java/com/ff/game/api/meitian/dto/JILIBetRecordResponseDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianBetRecordResponseDTO.java 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 4e58f04..505ca6a 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 @@ -11,7 +11,7 @@ public enum GamePlatforms { FC("FC", "FC"), SA("SA", "SA"), DG("DG", "DG"), - MeiTIan("MeiTIan","美天棋牌"), + MeiTian("MeiTIan","美天棋牌"), AE("AE", "AE"), ; diff --git a/ff-base/src/main/java/com/ff/base/enums/MeiTianGameType.java b/ff-base/src/main/java/com/ff/base/enums/MeiTianGameType.java index c5ef5fa..ee7ada5 100644 --- a/ff-base/src/main/java/com/ff/base/enums/MeiTianGameType.java +++ b/ff-base/src/main/java/com/ff/base/enums/MeiTianGameType.java @@ -15,8 +15,8 @@ public enum MeiTianGameType { ELECTRON(4, 1, "电子"), CHESS(2, 2, "棋牌"), GAME_HALL(0, 3, "游戏大厅"), - CATCH_FISH(3, 4, "捕鱼") - //bai_ren(1, 5,"白人") + CATCH_FISH(3, 4, "捕鱼"), + bai_ren(1, 5,"百人场") , ; private final Integer code; diff --git a/ff-base/src/main/java/com/ff/base/system/service/ISysConfigService.java b/ff-base/src/main/java/com/ff/base/system/service/ISysConfigService.java index 36cb477..46ba6c6 100644 --- a/ff-base/src/main/java/com/ff/base/system/service/ISysConfigService.java +++ b/ff-base/src/main/java/com/ff/base/system/service/ISysConfigService.java @@ -11,6 +11,8 @@ import java.util.List; */ public interface ISysConfigService { + + SysConfig getByConfigKey(String configKey); /** * 查询参数配置信息 * diff --git a/ff-base/src/main/java/com/ff/base/system/service/impl/SysConfigServiceImpl.java b/ff-base/src/main/java/com/ff/base/system/service/impl/SysConfigServiceImpl.java index db717dc..b3b5b1b 100644 --- a/ff-base/src/main/java/com/ff/base/system/service/impl/SysConfigServiceImpl.java +++ b/ff-base/src/main/java/com/ff/base/system/service/impl/SysConfigServiceImpl.java @@ -32,6 +32,12 @@ public class SysConfigServiceImpl implements ISysConfigService { @Autowired private RedisCache redisCache; + @Override + public SysConfig getByConfigKey(String configKey) { + SysConfig config = new SysConfig(); + config.setConfigKey(configKey); + return configMapper.selectConfig(config); + } /** * 查询参数配置信息 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 199e713..c785d98 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 @@ -1,7 +1,6 @@ package com.ff.game.api.meitian.client; import com.dtflys.forest.annotation.Address; -import com.dtflys.forest.annotation.Body; import com.dtflys.forest.annotation.Post; import com.dtflys.forest.annotation.Var; import com.ff.game.api.meitian.address.MeiTianAddressSource; @@ -105,17 +104,28 @@ public interface MeiTianClient { ); /** - * 按时间获取投注记录 + * 按recordId获取投注记录 * - * @param parameters 参数 - * @param agentId 代理id - * @return {@link JILIBetRecordResponseDTO } + * @param merchantId 代理id + * @param data + * @return {@link MeiTianBetRecordResponseDTO } */ - @Post(url = "/GetBetRecordByTime?${parameters}") - JILIBetRecordResponseDTO getBetRecordByTime( - @Var("parameters") String parameters, - @Body("AgentId") String agentId); + @Post(url = "/dg/player/queryMerchantGameRecord2/{merchantId}/{data}") + MeiTianBetRecordResponseDTO syncRecordByRecordID( + @Var("merchantId") String merchantId, + @Var("data") String data); + /** + * 按照日期获取投注记录 + * + * @param merchantId + * @param data + * @return + */ + @Post(url = "/dg/player/queryMerchantGameRecord3/{merchantId}/{data}") + MeiTianBetRecordResponseDTO syncRecordByDate( + @Var("merchantId") String merchantId, + @Var("data") String data); /** * 踢出 diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/dto/JILIBetRecordResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/meitian/dto/JILIBetRecordResponseDTO.java deleted file mode 100644 index ae3975f..0000000 --- a/ff-game/src/main/java/com/ff/game/api/meitian/dto/JILIBetRecordResponseDTO.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.ff.game.api.meitian.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -/** - * JiLi游戏纪录查询返回值 - * - * @author shi - * @date 2024/10/21 - */ -@NoArgsConstructor -@Data -public class JILIBetRecordResponseDTO { - - - @JsonProperty("ErrorCode") - private int errorCode; - @JsonProperty("Message") - private String message; - @JsonProperty("Data") - private DataBean data; - - @NoArgsConstructor - @Data - public static class DataBean { - @JsonProperty("Result") - private List result; - @JsonProperty("Pagination") - private PaginationBean pagination; - - @NoArgsConstructor - @Data - public static class PaginationBean { - /** - * 当前页面 - */ - @JsonProperty("CurrentPage") - private int currentPage; - /** - * 总页数 - */ - @JsonProperty("TotalPages") - private int totalPages; - /** - * 页数限制 - */ - @JsonProperty("PageLimit") - private int pageLimit; - /** - * 总数 - */ - @JsonProperty("TotalNumber") - private int totalNumber; - } - - - } -} diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianBetRecordResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianBetRecordResponseDTO.java new file mode 100644 index 0000000..bc50e57 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianBetRecordResponseDTO.java @@ -0,0 +1,77 @@ +package com.ff.game.api.meitian.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 游戏纪录查询返回值 + * + * @author shi + * @date 2024/10/21 + */ +@NoArgsConstructor +@Data +public class MeiTianBetRecordResponseDTO { + + @JsonProperty("resultCode") + private int errorCode; + + @JsonProperty("transList") + private List dataList; + + @NoArgsConstructor + @Data + public static class DataBean { + @JsonProperty("rowID") + private String rowID; // 美天棋牌交易流水号 + @JsonProperty("playerName") + private String playerName; + @JsonProperty("gameDate") + private String gameDate; + @JsonProperty("gameCode") + private String gameCode; + @JsonProperty("period") + private String period; // 游戏局ID + @JsonProperty("betAmount") + private String betAmount; // 下注金额 + @JsonProperty("commissionable") + private String commissionable; // 有效投注量 + private String roomFee;// 房费 + private String income; // 赢得金额-下注金额-房费 + @JsonProperty("recordID") + private String recordID; // 游戏记录ID + private String gameType; // 游戏类型 1表示百人场,2表示对战,3表示捕鱼,4表示街机 + private String timeZone; // 时区 + private String currency; // 币种 + } + + @Getter + @AllArgsConstructor + public enum ResultMessage { + QueryException(0, "查询异常"), + QuerySuccess(1, "查询成功"), + MerchantNotExist(2, "商户不存在"), + MerchantInvalid(3, "商户无效"), + IPLimited(15, "IP被限制"), + OptionalParameterError(32, "可选参数错误"), + MaintenanceMode(40, "维护模式"), + Unknown(-1, "未知错误"), + ; + private final int code; + private final String message; + } + + public static ResultMessage get(int code) { + for (ResultMessage message : ResultMessage.values()) { + if (message.code == code) { + return message; + } + } + return ResultMessage.Unknown; + } +} 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 2f4628c..38ec563 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,7 +2,6 @@ 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; @@ -10,7 +9,9 @@ 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.domain.SysConfig; import com.ff.base.system.service.ISysConfigService; +import com.ff.base.system.service.impl.SysConfigServiceImpl; import com.ff.base.utils.DateUtils; import com.ff.base.utils.sign.Md5Utils; import com.ff.base.utils.uuid.IdUtils; @@ -24,6 +25,7 @@ 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.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; @@ -34,10 +36,11 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +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; @@ -88,6 +91,8 @@ public class MeiTianGameServiceImpl implements IGamesService { @Resource private IGameNameService gameNameService; + @Autowired + private SysConfigServiceImpl sysConfigServiceImpl; /** * 获得就是成功 @@ -233,12 +238,12 @@ public class MeiTianGameServiceImpl implements IGamesService { for (MeiTianGameDataDTO gamesDataDTO : gameList.getData()) { GamePlatform gamePlatform = GamePlatform.builder() .platformType(MeiTianGameType.findSystemByCode(gamesDataDTO.getGameCategoryId())) - .platformCode(GamePlatforms.MeiTIan.getCode()) + .platformCode(GamePlatforms.MeiTian.getCode()) .build(); List gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform); //没有此平台就新增一个平台 if (CollectionUtils.isEmpty(gamePlatforms)) { - gamePlatform.setPlatformName(GamePlatforms.MeiTIan.getInfo() + MeiTianGameType.findInfoByCode(gamesDataDTO.getGameCategoryId())); + gamePlatform.setPlatformName(GamePlatforms.MeiTian.getInfo() + MeiTianGameType.findInfoByCode(gamesDataDTO.getGameCategoryId())); gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1); gamePlatform.setCreateBy(Constants.SYSTEM); gamePlatformService.insertGamePlatform(gamePlatform); @@ -304,7 +309,7 @@ public class MeiTianGameServiceImpl implements IGamesService { .currency(exchangeTransferMoneyRequestDTO.getCurrency()).build()); Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); - String transactionId = GamePlatforms.MeiTIan.getCode() + IdUtils.simpleUUID(); + String transactionId = GamePlatforms.MeiTian.getCode() + IdUtils.simpleUUID(); List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( GameExchangeMoney.builder() @@ -326,7 +331,7 @@ public class MeiTianGameServiceImpl implements IGamesService { .currencyCode(gameSecretKey.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) - .platformCode(GamePlatforms.MeiTIan.getCode()) + .platformCode(GamePlatforms.MeiTian.getCode()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); //接口限制限制50字符 @@ -430,38 +435,117 @@ public class MeiTianGameServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { + return doSyncRecordByRecordID(betRecordByTimeDTO); + } - /*//获取key - JILIBetRecordResponseDTO betRecordJILIResponse = meiTianClient.getBetRecordByTime(query + "&Key=" + key, betRecordByTimeDTO.getAgentId()); + boolean doSyncRecordByRecordID(BetRecordByTimeDTO betRecordByTimeDTO) { + String configKey = GamePlatforms.MeiTian.getCode() + ":lastRecordID"; + String lastRecordID = sysConfigServiceImpl.selectConfigByKey(configKey); + long recordID = 0; + if (lastRecordID == null || lastRecordID.isEmpty()) { + + } else { + recordID = Long.parseLong(lastRecordID); + } + String merchantId = betRecordByTimeDTO.getAgentId(); + Map rawMap = new LinkedHashMap<>(); + rawMap.put("recordID", recordID + ""); + String rawData = JSON.toJSONString(rawMap); + String data = null; + try { + data = Base64.encode(rawData.getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + log.error("[MeiTian] base64 rawData failure", e); + throw new ApiException(ErrorCode.ERROR.getCode()); + } + + //获取key + MeiTianBetRecordResponseDTO recordResponse = + meiTianClient.syncRecordByRecordID(merchantId, data); //判断是否获取成功 - if (this.isSuccess(betRecordJILIResponse.getErrorCode())) { + if (this.isSuccess(recordResponse.getErrorCode())) { + List dataList = recordResponse.getDataList(); + if (CollectionUtils.isEmpty(dataList)) { + return Boolean.TRUE; + } //数据插入 - this.batchInsert(betRecordJILIResponse); - 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 [getBetRecordByTime] 请求参数 {}", query); - betRecordByTimeDTO.setQuery(query); - key = this.getKey(betRecordByTimeDTO); - betRecordJILIResponse = meiTianClient.getBetRecordByTime(query + "&Key=" + key, betRecordByTimeDTO.getAgentId()); - dataBean = betRecordJILIResponse.getData(); - if (this.isSuccess(betRecordJILIResponse.getErrorCode())) { - //数据插入 - this.batchInsert(betRecordJILIResponse); - } else { - log.error("GameBettingDataJILIServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordJILIResponse.getErrorCode(), betRecordJILIResponse.getMessage()); - } + this.batchInsert(recordResponse); + MeiTianBetRecordResponseDTO.DataBean dataBean = dataList.get(dataList.size() - 1); + SysConfig config = sysConfigServiceImpl.getByConfigKey(configKey); + config.setConfigValue(dataBean.getRecordID()); + sysConfigServiceImpl.updateConfig(config); + + // 它每次返回25000条,所以需要判断,如果大于25000条,则继续拉取 + if (dataList.size() >= 25000) { + doSyncRecordByRecordID(betRecordByTimeDTO); } } else { return Boolean.FALSE; - }*/ + } return Boolean.TRUE; } + boolean doSyncRecordByDate(BetRecordByTimeDTO betRecordByTimeDTO) { + + String date = getDateStr(0); + String configKey = GamePlatforms.MeiTian.getCode() + ":lastSyncDate"; + String syncDateStr = sysConfigServiceImpl.selectConfigByKey(configKey); + Map syncDateMap = new HashMap<>(); + long recordID = 0; + if (syncDateStr == null || syncDateStr.isEmpty()) { + } else { + syncDateMap = JSON.parseObject(syncDateStr, Map.class); + } + if (syncDateMap.containsKey(date)) { + recordID = syncDateMap.get(date); + if (syncDateMap.size() > 10) { + syncDateMap.clear(); + syncDateMap.put(date, recordID); + } + } else { + syncDateMap.put(date, recordID); + } + String merchantId = betRecordByTimeDTO.getAgentId(); + Map rawMap = new LinkedHashMap<>(); + rawMap.put("recordID", recordID + ""); + rawMap.put("startTime", date); + rawMap.put("endTime", date); + String rawData = JSON.toJSONString(rawMap); + String data = null; + try { + data = Base64.encode(rawData.getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + log.error("[MeiTian] base64 rawData failure", e); + throw new ApiException(ErrorCode.ERROR.getCode()); + } + + //获取key + MeiTianBetRecordResponseDTO recordResponse = + meiTianClient.syncRecordByRecordID(merchantId, data); + + //判断是否获取成功 + if (this.isSuccess(recordResponse.getErrorCode())) { + List dataList = recordResponse.getDataList(); + if (CollectionUtils.isEmpty(dataList)) { + return Boolean.TRUE; + } + //数据插入 + this.batchInsert(recordResponse); + MeiTianBetRecordResponseDTO.DataBean dataBean = dataList.get(dataList.size() - 1); + SysConfig config = sysConfigServiceImpl.getByConfigKey(configKey); + config.setConfigValue(JSON.toJSONString(syncDateMap)); + sysConfigServiceImpl.updateConfig(config); + + // 它每次返回25000条,所以需要判断,如果大于25000条,则继续拉取 + if (dataList.size() >= 25000) { + doSyncRecordByDate(betRecordByTimeDTO); + } + } else { + return Boolean.FALSE; + } + return Boolean.TRUE; + } /** * 按历史时间获取投注记录 @@ -471,7 +555,7 @@ public class MeiTianGameServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { - return null; + return doSyncRecordByDate(betRecordByTimeDTO); } @@ -584,26 +668,30 @@ public class MeiTianGameServiceImpl implements IGamesService { /** * 批量插入 * - * @param betRecordJILIResponse 投注记录jiliresponse - * @return {@link Integer } + * @param recordResponse 投注记录 */ - private void batchInsert(JILIBetRecordResponseDTO betRecordJILIResponse) { + private void batchInsert(MeiTianBetRecordResponseDTO recordResponse) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 - JILIBetRecordResponseDTO.DataBean dataBean = betRecordJILIResponse.getData(); + List dataList = recordResponse.getDataList(); + if (CollectionUtils.isEmpty(dataList)) { + return; + } + //数据转化 - for (JILIBetRecordDataResponseDTO jiliBetRecordDataResponseDTO : dataBean.getResult()) { - GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(jiliBetRecordDataResponseDTO).build()); + for (MeiTianBetRecordResponseDTO.DataBean dataBean : dataList) { + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder() + .data(dataBean).build()); if (!ObjectUtils.isEmpty(bettingDetails)) { bettingDetails.setId(IdUtil.getSnowflakeNextId()); gameBettingDetails.add(bettingDetails); } - wagersIds.add(jiliBetRecordDataResponseDTO.getWagersId()); + wagersIds.add(dataBean.getRowID()); } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.MeiTian.getCode()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) @@ -625,53 +713,77 @@ public class MeiTianGameServiceImpl implements IGamesService { public GameBettingDetails dataBuild(GamesDataBuildDTO gamesDataBuildDTO) { //转化类 - JILIBetRecordDataResponseDTO jiliBetRecordDataResponseDTO = (JILIBetRecordDataResponseDTO) gamesDataBuildDTO.getData(); - GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .code(jiliBetRecordDataResponseDTO.getAgentId()) - .platformCode(GamePlatforms.MeiTIan.getInfo()).build()); + MeiTianBetRecordResponseDTO.DataBean dataBean = (MeiTianBetRecordResponseDTO.DataBean) gamesDataBuildDTO.getData(); + GameSecretKeyCurrencyDTO gameSecretKey = + gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() + .currency(dataBean.getCurrency()) + .platformCode(GamePlatforms.MeiTian.getInfo()).build()); - Member member = memberService.selectMemberByGameAccount(jiliBetRecordDataResponseDTO.getAccount()); + Member member = memberService.selectMemberByGameAccount(dataBean.getPlayerName()); if (ObjectUtils.isEmpty(member)) { return null; } - List gamesDatas = redisCache.getCacheList(CacheConstants.JILI_GAMES); - Map dataDTOMap = gamesDatas.stream().collect(Collectors.toMap(MeiTianGameDataDTO::getGameId, e -> e)); - MeiTianGameDataDTO gamesDataDTO = dataDTOMap.get(jiliBetRecordDataResponseDTO.getGameId()); - BigDecimal payoffAmount = BigDecimal.ZERO; - if (GameStatus.WIN.getCode().equals(jiliBetRecordDataResponseDTO.getStatus())) { - payoffAmount = NumberUtil.sub(jiliBetRecordDataResponseDTO.getPayoffAmount(), jiliBetRecordDataResponseDTO.getTurnover()); - } else if (GameStatus.FAIL.getCode().equals(jiliBetRecordDataResponseDTO.getStatus())) { - payoffAmount = NumberUtil.sub(jiliBetRecordDataResponseDTO.getPayoffAmount(), jiliBetRecordDataResponseDTO.getTurnover()).negate(); - } + List gameDatas = redisCache.getCacheList(CacheConstants.MeiTian_GAMES); + Map dataDTOMap = gameDatas.stream().collect(Collectors.toMap(MeiTianGameDataDTO::getGameId, e -> e)); + MeiTianGameDataDTO gamesDataDTO = dataDTOMap.get(dataBean.getGameCode()); + BigDecimal originPayoffAmount = new BigDecimal(dataBean.getIncome()); // 这个值是到手的 + int compareResult = originPayoffAmount.compareTo(BigDecimal.ZERO); + long gameTime = getTime(dataBean.getGameDate()); //数据构造 GameBettingDetails gameBettingDetails = GameBettingDetails.builder() .tenantKey(member.getTenantKey()) //保存我们的币种id .currencyCode(gameSecretKey.getSystemCurrency()) .memberId(member.getId()) - .gameCode(jiliBetRecordDataResponseDTO.getGameId()) - .gameType(JILIGameType.findSystemByCode(jiliBetRecordDataResponseDTO.getGameCategoryId())) - .platformCode(GamePlatforms.MeiTIan.getCode()) + .gameCode(dataBean.getGameCode()) + .gameType(MeiTianGameType.findSystemByCode(Integer.parseInt(dataBean.getGameCode()))) + .platformCode(GamePlatforms.MeiTian.getCode()) .gameId(gamesDataDTO.getSystemGameId()) .gameName(gamesDataDTO.getCnName()) - .gameStatus(jiliBetRecordDataResponseDTO.getStatus()) - .gameStatusType(jiliBetRecordDataResponseDTO.getType()) - .gameCurrencyCode(jiliBetRecordDataResponseDTO.getAgentId()) - .account(String.valueOf(jiliBetRecordDataResponseDTO.getAccount())) - .wagersId(jiliBetRecordDataResponseDTO.getWagersId()) - .wagersTime(jiliBetRecordDataResponseDTO.getWagersTime()) - .betAmount(jiliBetRecordDataResponseDTO.getBetAmount().abs()) - .payoffTime(jiliBetRecordDataResponseDTO.getPayoffTime()) - .payoffAmount(payoffAmount) - .settlementTime(jiliBetRecordDataResponseDTO.getSettlementTime()) - .turnover(jiliBetRecordDataResponseDTO.getTurnover()) - .orderNo(String.valueOf(jiliBetRecordDataResponseDTO.getRoundIndex())) + .gameStatus(compareResult > 0 ? GameStatus.WIN.getCode() : compareResult < 0 ? GameStatus.FAIL.getCode() : GameStatus.FLAT.getCode()) + .gameStatusType(1) // 一般下注 + .gameCurrencyCode(dataBean.getCurrency()) + .account(dataBean.getPlayerName()) + .wagersId(dataBean.getRowID()) + .wagersTime(gameTime) + .betAmount(new BigDecimal(dataBean.getBetAmount())) + .payoffTime(gameTime) + .payoffAmount(originPayoffAmount.abs()) + .settlementTime(gameTime) + .turnover(new BigDecimal(dataBean.getCommissionable())) + .orderNo(dataBean.getRowID()) .settlementStatus(SettlementStatusEnum.COMPLETED.getCode()) .build(); gameBettingDetails.setCreateBy(Constants.SYSTEM); 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); + } + } From 953c94ff3fcfd871b54c655991db4f194644fa13 Mon Sep 17 00:00:00 2001 From: cengy Date: Tue, 1 Apr 2025 16:48:03 +0800 Subject: [PATCH 14/62] =?UTF-8?q?refactor(game):=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E7=BE=8E=E5=A4=A9=E6=B8=B8=E6=88=8F=E7=99=BB=E5=BD=95=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 注释掉 "gameHall" 参数- 解除 "gameCode" 参数的注释 - 移除多余的空格和注释 --- .../ff/game/api/meitian/impl/MeiTianGameServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 38ec563..a053327 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 @@ -187,10 +187,10 @@ public class MeiTianGameServiceImpl implements IGamesService { String playerName = gamesLogin.getAccount(); String md5Password = Md5Utils.md5New(gameSecretKey.getPassword()); Map rawMap = new LinkedHashMap<>(); - rawMap.put("gameHall ", gamesLogin.getGameType()); - /*rawMap.put("gameCode", gamesLogin.getGameId()); + /*rawMap.put("gameHall ", gamesLogin.getGameType());*/ + rawMap.put("gameCode", gamesLogin.getGameId()); rawMap.put("lang", gamesLogin.getLang()); - rawMap.put("roomID", "0");*/ + rawMap.put("roomID", "0"); String rawData = JSON.toJSONString(rawMap); String data = null; From d3fcfad870c4c301545ee96958ab7787cf4460d0 Mon Sep 17 00:00:00 2001 From: cengy Date: Tue, 1 Apr 2025 17:38:16 +0800 Subject: [PATCH 15/62] =?UTF-8?q?fix(game):=20=E4=BF=AE=E5=A4=8D=E7=BE=8E?= =?UTF-8?q?=E5=A4=A9=E5=B9=B3=E5=8F=B0=E5=90=8C=E6=AD=A5=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修正平台代码和游戏类型获取逻辑 - 优化数据同步流程,支持按日期同步 - 增加错误日志记录 - 完善配置插入和更新逻辑 --- .../java/com/ff/base/enums/GamePlatforms.java | 2 +- .../meitian/impl/MeiTianGameServiceImpl.java | 51 +++++++++++++------ 2 files changed, 36 insertions(+), 17 deletions(-) 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 505ca6a..e7eefcf 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 @@ -11,7 +11,7 @@ public enum GamePlatforms { FC("FC", "FC"), SA("SA", "SA"), DG("DG", "DG"), - MeiTian("MeiTIan","美天棋牌"), + MeiTian("MeiTian","美天棋牌"), AE("AE", "AE"), ; 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 a053327..03c2bd3 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 @@ -448,8 +448,8 @@ public class MeiTianGameServiceImpl implements IGamesService { recordID = Long.parseLong(lastRecordID); } String merchantId = betRecordByTimeDTO.getAgentId(); - Map rawMap = new LinkedHashMap<>(); - rawMap.put("recordID", recordID + ""); + Map rawMap = new LinkedHashMap<>(); + rawMap.put("recordID", recordID); String rawData = JSON.toJSONString(rawMap); String data = null; try { @@ -473,22 +473,29 @@ public class MeiTianGameServiceImpl implements IGamesService { this.batchInsert(recordResponse); MeiTianBetRecordResponseDTO.DataBean dataBean = dataList.get(dataList.size() - 1); SysConfig config = sysConfigServiceImpl.getByConfigKey(configKey); - config.setConfigValue(dataBean.getRecordID()); - sysConfigServiceImpl.updateConfig(config); - + if (config == null) { + config = new SysConfig(); + config.setConfigKey(configKey); + config.setConfigValue(dataBean.getRecordID()); + sysConfigServiceImpl.insertConfig(config); + } else { + config.setConfigValue(dataBean.getRecordID()); + sysConfigServiceImpl.updateConfig(config); + } // 它每次返回25000条,所以需要判断,如果大于25000条,则继续拉取 if (dataList.size() >= 25000) { doSyncRecordByRecordID(betRecordByTimeDTO); } } else { + log.error("[MeiTian] syncRecordByRecordID failure, errorCode:{}", recordResponse.getErrorCode()); return Boolean.FALSE; } return Boolean.TRUE; } - boolean doSyncRecordByDate(BetRecordByTimeDTO betRecordByTimeDTO) { + boolean doSyncRecordByDate(BetRecordByTimeDTO betRecordByTimeDTO, int daysToSubtract) { - String date = getDateStr(0); + String date = getDateStr(daysToSubtract); String configKey = GamePlatforms.MeiTian.getCode() + ":lastSyncDate"; String syncDateStr = sysConfigServiceImpl.selectConfigByKey(configKey); Map syncDateMap = new HashMap<>(); @@ -507,8 +514,8 @@ public class MeiTianGameServiceImpl implements IGamesService { syncDateMap.put(date, recordID); } String merchantId = betRecordByTimeDTO.getAgentId(); - Map rawMap = new LinkedHashMap<>(); - rawMap.put("recordID", recordID + ""); + Map rawMap = new LinkedHashMap<>(); + rawMap.put("rowID", recordID); rawMap.put("startTime", date); rawMap.put("endTime", date); String rawData = JSON.toJSONString(rawMap); @@ -522,7 +529,7 @@ public class MeiTianGameServiceImpl implements IGamesService { //获取key MeiTianBetRecordResponseDTO recordResponse = - meiTianClient.syncRecordByRecordID(merchantId, data); + meiTianClient.syncRecordByDate(merchantId, data); //判断是否获取成功 if (this.isSuccess(recordResponse.getErrorCode())) { @@ -533,15 +540,24 @@ public class MeiTianGameServiceImpl implements IGamesService { //数据插入 this.batchInsert(recordResponse); MeiTianBetRecordResponseDTO.DataBean dataBean = dataList.get(dataList.size() - 1); + syncDateMap.put(date, Long.parseLong(dataBean.getRowID())); SysConfig config = sysConfigServiceImpl.getByConfigKey(configKey); - config.setConfigValue(JSON.toJSONString(syncDateMap)); - sysConfigServiceImpl.updateConfig(config); + if (null == config) { + config = new SysConfig(); + config.setConfigKey(configKey); + config.setConfigValue(JSON.toJSONString(syncDateMap)); + sysConfigServiceImpl.insertConfig(config); + } else { + config.setConfigValue(JSON.toJSONString(syncDateMap)); + sysConfigServiceImpl.updateConfig(config); + } // 它每次返回25000条,所以需要判断,如果大于25000条,则继续拉取 if (dataList.size() >= 25000) { - doSyncRecordByDate(betRecordByTimeDTO); + doSyncRecordByDate(betRecordByTimeDTO, daysToSubtract); } } else { + log.error("[MeiTian] syncRecordByDate error, errorCode:{}", recordResponse.getErrorCode()); return Boolean.FALSE; } return Boolean.TRUE; @@ -555,7 +571,10 @@ public class MeiTianGameServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { - return doSyncRecordByDate(betRecordByTimeDTO); + doSyncRecordByDate(betRecordByTimeDTO, 0); + doSyncRecordByDate(betRecordByTimeDTO, 1); // yesterday + + return true; } @@ -717,7 +736,7 @@ public class MeiTianGameServiceImpl implements IGamesService { GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() .currency(dataBean.getCurrency()) - .platformCode(GamePlatforms.MeiTian.getInfo()).build()); + .platformCode(GamePlatforms.MeiTian.getCode()).build()); Member member = memberService.selectMemberByGameAccount(dataBean.getPlayerName()); @@ -738,7 +757,7 @@ public class MeiTianGameServiceImpl implements IGamesService { .currencyCode(gameSecretKey.getSystemCurrency()) .memberId(member.getId()) .gameCode(dataBean.getGameCode()) - .gameType(MeiTianGameType.findSystemByCode(Integer.parseInt(dataBean.getGameCode()))) + .gameType(MeiTianGameType.findSystemByCode(Integer.parseInt(dataBean.getGameType()))) .platformCode(GamePlatforms.MeiTian.getCode()) .gameId(gamesDataDTO.getSystemGameId()) .gameName(gamesDataDTO.getCnName()) From dbde2ba5d53b194245842757841cf15a659d4230 Mon Sep 17 00:00:00 2001 From: shi Date: Tue, 1 Apr 2025 17:46:33 +0800 Subject: [PATCH 16/62] =?UTF-8?q?feat(game):=20=E6=8E=A5=E5=85=A5=20AE?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=B9=B3=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 AE 游戏平台的下注记录获取功能 - 实现 AE平台的余额转换状态查询接口 - 添加 AE 平台的玩家登出接口 - 重构原有 XK 平台的相关代码,改为支持 AE 平台 --- .../com/ff/game/api/dg/service/impl/GamesDGServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 7097e6f..b946566 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 @@ -340,7 +340,7 @@ public class GamesDGServiceImpl implements IGamesService { exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); } else { - log.error("GamesXKServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{},错误信息{}", dgTransactionResponseDTO.getCodeId(), dgTransactionResponseDTO.getMsg()); + log.error("GamesDGServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{},错误信息{}", dgTransactionResponseDTO.getCodeId(), dgTransactionResponseDTO.getMsg()); throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); } @@ -378,7 +378,7 @@ public class GamesDGServiceImpl implements IGamesService { return Boolean.TRUE; } else { - log.error("GamesXKServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getCodeId(), betRecordByTime.getMsg()); + log.error("GamesDGServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getCodeId(), betRecordByTime.getMsg()); throw new BaseException(betRecordByTime.getMsg()); } From 5cddf1b783812bc82c5abccd526941a927808416 Mon Sep 17 00:00:00 2001 From: shi Date: Wed, 2 Apr 2025 09:16:06 +0800 Subject: [PATCH 17/62] =?UTF-8?q?refactor(game):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E6=9C=8D=E5=8A=A1=E5=AE=9E=E7=8E=B0=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化 GameServiceImpl 类的代码结构,增加日志记录和依赖注入 - 新增 insertGameBettingDetails 方法处理游戏投注详细信息插入 - 修改 GameTask 类,使用新的游戏服务方法 - 更新 IGameService 接口,添加新的方法定义 --- .../com/ff/game/service/IGameService.java | 10 +++ .../ff/game/service/impl/GameServiceImpl.java | 70 +++++++++++---- .../java/com/ff/quartz/task/GameTask.java | 88 +++++++++++-------- 3 files changed, 115 insertions(+), 53 deletions(-) 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 07e47ee..8c8572c 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 @@ -2,6 +2,7 @@ package com.ff.game.service; import java.util.List; +import com.dtflys.forest.annotation.Body; import com.ff.api.response.GameResponse; import com.ff.game.api.request.GameUniqueDTO; import com.ff.game.domain.Game; @@ -95,5 +96,14 @@ public interface IGameService */ List selectGameResponseList(); + /** + * 插入游戏投注详细信息 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param platformCode 平台代码 + */ + void insertGameBettingDetails(Long startTime,Long endTime,String platformCode); + } 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 1dcab48..f828da0 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 @@ -2,14 +2,21 @@ package com.ff.game.service.impl; import java.util.Collections; import java.util.List; +import java.util.Map; import cn.hutool.core.util.IdUtil; import com.ff.api.response.GameResponse; import com.ff.base.constant.ConfigConstants; import com.ff.base.utils.DateUtils; +import com.ff.game.api.IGamesService; +import com.ff.game.api.request.BetRecordByTimeDTO; import com.ff.game.api.request.GameUniqueDTO; +import com.ff.game.api.request.GamesBaseRequestDTO; +import com.ff.game.domain.GameSecretKey; import com.ff.game.dto.GameDTO; +import com.ff.game.service.IGameSecretKeyService; import com.ff.member.service.IMemberService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ff.game.mapper.GameMapper; @@ -25,14 +32,21 @@ import javax.annotation.Resource; * @date 2025-02-10 */ @Service -public class GameServiceImpl implements IGameService -{ +@Slf4j +public class GameServiceImpl implements IGameService { @Autowired private GameMapper gameMapper; @Resource private IMemberService memberService; + + @Resource + private IGameSecretKeyService gameSecretKeyService; + + @Autowired + private Map gamesService; + /** * 查询平台子游戏管理 * @@ -40,8 +54,7 @@ public class GameServiceImpl implements IGameService * @return 平台子游戏管理 */ @Override - public Game selectGameById(Long id) - { + public Game selectGameById(Long id) { return gameMapper.selectGameById(id); } @@ -52,8 +65,7 @@ public class GameServiceImpl implements IGameService * @return 平台子游戏管理 */ @Override - public List selectGameList(Game game) - { + public List selectGameList(Game game) { return gameMapper.selectGameList(game); } @@ -75,9 +87,8 @@ public class GameServiceImpl implements IGameService * @return 结果 */ @Override - public int insertGame(Game game) - { - if (game.getId() == null){ + public int insertGame(Game game) { + if (game.getId() == null) { game.setId(IdUtil.getSnowflakeNextId()); } game.setCreateTime(DateUtils.getNowDate()); @@ -91,8 +102,7 @@ public class GameServiceImpl implements IGameService * @return 结果 */ @Override - public int updateGame(Game game) - { + public int updateGame(Game game) { game.setUpdateTime(DateUtils.getNowDate()); return gameMapper.updateGame(game); } @@ -104,8 +114,7 @@ public class GameServiceImpl implements IGameService * @return 结果 */ @Override - public int deleteGameByIds(Long[] ids) - { + public int deleteGameByIds(Long[] ids) { return gameMapper.deleteGameByIds(ids); } @@ -116,8 +125,7 @@ public class GameServiceImpl implements IGameService * @return 结果 */ @Override - public int deleteGameById(Long id) - { + public int deleteGameById(Long id) { return gameMapper.deleteGameById(id); } @@ -134,7 +142,6 @@ public class GameServiceImpl implements IGameService } - /** * 选择游戏唯一列表 * @@ -156,5 +163,36 @@ public class GameServiceImpl implements IGameService return gameMapper.selectGameResponseList(); } + /** + * 插入游戏投注详细信息 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param platformCode 平台代码 + */ + @Override + public void insertGameBettingDetails(Long startTime, Long endTime, String platformCode) { + List gameSecretKeys = gameSecretKeyService.selectGameSecretKeyList(GameSecretKey.builder().platform(platformCode).build()); + for (GameSecretKey gameSecretKey : gameSecretKeys) { + try { + gamesService.get(platformCode).getGameList(GamesBaseRequestDTO.builder() + .agentId(gameSecretKey.getCode()) + .agentKey(gameSecretKey.getKey()) + .build()); + BetRecordByTimeDTO betRecordByTimeDTO = new BetRecordByTimeDTO(); + betRecordByTimeDTO.setGamePlatform(gameSecretKey.getPlatform()); + betRecordByTimeDTO.setStartTime(startTime); + betRecordByTimeDTO.setEndTime(endTime); + betRecordByTimeDTO.setPage(1); + betRecordByTimeDTO.setPageLimit(1000); + betRecordByTimeDTO.setAgentId(gameSecretKey.getCode()); + betRecordByTimeDTO.setAgentKey(gameSecretKey.getKey()); + gamesService.get(platformCode).getBetRecordByHistoryTime(betRecordByTimeDTO); + } catch (Exception e) { + log.error("查询 平台 {} 投注记录失败,错误信息 {}", gameSecretKey.getCode(), e); + } + } + } + } 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 fe43fbe..8a9f90b 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 @@ -20,10 +20,7 @@ import com.ff.game.domain.GameExchangeMoney; import com.ff.game.domain.GameSecretKey; import com.ff.game.dto.GameSecretKeyCurrencyDTO; import com.ff.game.dto.GameSecretKeyDTO; -import com.ff.game.service.IGameExchangeMoneyService; -import com.ff.game.service.IGamePlatformService; -import com.ff.game.service.IGameSecretKeyCurrencyService; -import com.ff.game.service.IGameSecretKeyService; +import com.ff.game.service.*; import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; import lombok.extern.slf4j.Slf4j; @@ -77,7 +74,11 @@ public class GameTask { private IMemberService memberService; @Resource - private RedisCache redisCache; + private RedisCache redisCache; + + + @Resource + private IGameService gameService; /** * 插入游戏投注详细信息 @@ -93,7 +94,7 @@ public class GameTask { for (String gameKey : gamesService.keySet()) { String platformCode = gameKey.replace(Constants.SERVICE, ""); //特殊的平台跳过 - if (NGPlatforms.exists(platformCode)|| GamePlatforms.FC.getInfo().equals(platformCode)) { + if (NGPlatforms.exists(platformCode) || GamePlatforms.FC.getInfo().equals(platformCode)) { continue; } @@ -168,47 +169,60 @@ public class GameTask { } + /** - * 插入历史游戏投注详细信息 部分平台使用 + * 插入FC游戏投注详细信息 * * @param backTime 返回时间 */ - public void insertHistoryGameBettingDetails(Integer backTime) { - - //捞取指定分钟前的数据 + public void insertFCHistoryGameBettingDetails(Integer backTime) { Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTime); Long endTime = DateUtils.getNowDate(); - - - for (String gameKey : gamesService.keySet()) { - String platformCode = gameKey.replace(Constants.SERVICE, ""); - - List gameSecretKeys = gameSecretKeyService.selectGameSecretKeyList(GameSecretKey.builder().platform(platformCode).build()); - for (GameSecretKey gameSecretKey : gameSecretKeys) { - try { - gamesService.get(gameKey).getGameList(GamesBaseRequestDTO.builder() - .agentId(gameSecretKey.getCode()) - .agentKey(gameSecretKey.getKey()) - .build()); - BetRecordByTimeDTO betRecordByTimeDTO = new BetRecordByTimeDTO(); - betRecordByTimeDTO.setGamePlatform(gameSecretKey.getPlatform()); - betRecordByTimeDTO.setStartTime(startTime); - betRecordByTimeDTO.setEndTime(endTime); - betRecordByTimeDTO.setPage(1); - betRecordByTimeDTO.setPageLimit(1000); - betRecordByTimeDTO.setAgentId(gameSecretKey.getCode()); - betRecordByTimeDTO.setAgentKey(gameSecretKey.getKey()); - gamesService.get(gameKey).getBetRecordByHistoryTime(betRecordByTimeDTO); - } catch (Exception e) { - log.error("查询 平台 {} 投注记录失败,错误信息 {}", gameSecretKey.getCode(), e); - } - } - - } + //捞取指定分钟前的数据 + gameService.insertGameBettingDetails(startTime, endTime, GamePlatforms.FC.getInfo()); } + /** + * 插入AE游戏投注详细信息 + * + * @param backTime 返回时间 + */ + public void insertAEHistoryGameBettingDetails(Integer backTime) { + Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTime); + Long endTime = DateUtils.getNowDate(); + //捞取指定分钟前的数据 + gameService.insertGameBettingDetails(startTime, endTime, GamePlatforms.AE.getInfo()); + + } + + /** + * 插入PGX游戏投注详细信息 + * + * @param backTime 返回时间 + */ + public void insertPGXHistoryGameBettingDetails(Integer backTime) { + Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTime); + Long endTime = DateUtils.getNowDate(); + //捞取指定分钟前的数据 + gameService.insertGameBettingDetails(startTime, endTime, GamePlatforms.PGX.getInfo()); + + } + + /** + * 插入MT游戏投注详细信息 + * + * @param backTime 返回时间 + */ + public void insertMTHistoryGameBettingDetails(Integer backTime) { + Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTime); + Long endTime = DateUtils.getNowDate(); + + //捞取指定分钟前的数据 + gameService.insertGameBettingDetails(startTime, endTime, GamePlatforms.MeiTian.getCode()); + + } /** * 插入游戏ngbetting详细信息 From 3b8cddd2ec71e6945c205b4ecdfede63bcb02f50 Mon Sep 17 00:00:00 2001 From: cengy Date: Wed, 2 Apr 2025 09:36:36 +0800 Subject: [PATCH 18/62] =?UTF-8?q?fix(game):=20=E4=BF=AE=E5=A4=8D=E6=AF=8F?= =?UTF-8?q?=E6=97=A5=E6=B8=B8=E6=88=8F=E6=8E=A5=E5=8F=A3=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E5=92=8C=E7=AD=BE=E5=90=8D=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 MeiTianClient 中添加斜杠以匹配服务端路径 - 修改签名逻辑为服务端 key 加密原文本,确保与服务端保持一致 --- .../java/com/ff/game/api/meitian/client/MeiTianClient.java | 2 +- .../com/ff/game/api/meitian/impl/MeiTianGameServiceImpl.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) 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 c785d98..e712c0e 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 @@ -148,7 +148,7 @@ public interface MeiTianClient { * @param data * @return {@link MeiTianGameRecordDetailDTO} */ - @Post("dg/player/playCheckUrl/{merchantId}/{code}/{data}") + @Post("/dg/player/playCheckUrl/{merchantId}/{code}/{data}") MeiTianGameRecordDetailDTO getGameDetail( @Var("merchantId") String merchantId, @Var("code") String code, 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 03c2bd3..fe60da4 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 @@ -608,12 +608,12 @@ public class MeiTianGameServiceImpl implements IGamesService { String rawData = JSON.toJSONString(rawMap); String data = null; try { - data = Base64.encode(rawData.getBytes("UTF-8")); + data = Base64.encode(rawData.getBytes(StandardCharsets.UTF_8)); } catch (Exception e) { log.error("[MeiTian] encode rawData failure", e); throw new ApiException(ErrorCode.ERROR.getCode()); } - String code = Md5Utils.md5New(data + key); + String code = Md5Utils.md5New(key + rawData); MeiTianGameRecordDetailDTO responseDTO = meiTianClient.getGameDetail(merchantId, code, data); //判断是否获取成功 From 019b4e0117c53a91a185912320010995a068f524 Mon Sep 17 00:00:00 2001 From: shi Date: Thu, 3 Apr 2025 09:50:51 +0800 Subject: [PATCH 19/62] =?UTF-8?q?feat(game):=20=E6=B7=BB=E5=8A=A0=20KM=20?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=B9=B3=E5=8F=B0=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 KM游戏平台的接口实现类 GamesKMServiceImpl - 添加 KM 游戏平台的相关配置和常量- 实现 KM 游戏平台的登录、获取游戏列表、下注记录等功能 - 增加 KM 游戏平台的错误处理和日志记录 --- .../com/ff/base/constant/CacheConstants.java | 13 + .../java/com/ff/base/constant/Constants.java | 16 +- .../java/com/ff/base/enums/GamePlatforms.java | 1 + .../java/com/ff/base/enums/KMGameType.java | 70 ++ .../main/java/com/ff/base/utils/JsonUtil.java | 2 +- .../ff/api/controller/ApiGameController.java | 40 +- .../api/controller/ApiMemberController.java | 1 + .../ff/api/request/GameDemoLoginRequest.java | 53 ++ .../api/request/MemberCreateApiRequest.java | 4 + .../api/response/GameDemoLoginResponse.java | 28 + .../java/com/ff/game/api/IGamesService.java | 9 + .../game/api/ae/impl/GamesAEServiceImpl.java | 11 + .../dg/service/impl/GamesDGServiceImpl.java | 13 + .../game/api/fc/impl/GamesFCServiceImpl.java | 11 + .../service/impl/GamesJILIServiceImpl.java | 11 + .../api/km/address/MyKMAddressSource.java | 31 + .../com/ff/game/api/km/client/KMClient.java | 95 +++ .../game/api/km/dto/KMAuthTokenResponse.java | 37 + .../ff/game/api/km/dto/KMBalanceResponse.java | 38 + .../game/api/km/dto/KMBetRecordResponse.java | 145 ++++ .../ff/game/api/km/dto/KMGameResponse.java | 130 ++++ .../game/api/km/dto/KMKickMemberResponse.java | 37 + .../api/km/dto/KMTransactionResponse.java | 59 ++ .../game/api/km/impl/GamesKMServiceImpl.java | 733 ++++++++++++++++++ .../api/km/success/MyKMSuccessCondition.java | 31 + .../meitian/impl/MeiTianGameServiceImpl.java | 11 + .../ng/service/impl/GamesPGServiceImpl.java | 23 +- .../api/pgx/impl/GamesPGXServiceImpl.java | 11 + .../api/request/CreateMemberRequestDTO.java | 5 + .../api/request/GameDemoLoginRequestDTO.java | 34 + .../api/request/GameDemoLoginResponseDTO.java | 23 + .../game/api/sa/impl/GamesSAServiceImpl.java | 11 + .../xk/service/impl/GamesXKServiceImpl.java | 11 + 33 files changed, 1736 insertions(+), 12 deletions(-) create mode 100644 ff-base/src/main/java/com/ff/base/enums/KMGameType.java create mode 100644 ff-game/src/main/java/com/ff/api/request/GameDemoLoginRequest.java create mode 100644 ff-game/src/main/java/com/ff/api/response/GameDemoLoginResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/km/address/MyKMAddressSource.java create mode 100644 ff-game/src/main/java/com/ff/game/api/km/client/KMClient.java create mode 100644 ff-game/src/main/java/com/ff/game/api/km/dto/KMAuthTokenResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/km/dto/KMBalanceResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/km/dto/KMBetRecordResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/km/dto/KMGameResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/km/dto/KMKickMemberResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/km/dto/KMTransactionResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/km/impl/GamesKMServiceImpl.java create mode 100644 ff-game/src/main/java/com/ff/game/api/km/success/MyKMSuccessCondition.java create mode 100644 ff-game/src/main/java/com/ff/game/api/request/GameDemoLoginRequestDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/request/GameDemoLoginResponseDTO.java 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 1b0589e..5f12840 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,6 +51,13 @@ public class CacheConstants { */ public static final String XK_GAMES = "xk_games:"; + + /** + * km游戏 + */ + public static final String KM_GAMES = "km_games:"; + + /** * pgx游戏 */ @@ -92,6 +99,12 @@ public class CacheConstants { */ public static final String MeiTian_GAMES = "meitian_games:"; + + /** + * km用户令牌 + */ + public static final String KM_USER_TOKEN = "km:user:token:"; + } diff --git a/ff-base/src/main/java/com/ff/base/constant/Constants.java b/ff-base/src/main/java/com/ff/base/constant/Constants.java index 73cdc9a..dfbc43c 100644 --- a/ff-base/src/main/java/com/ff/base/constant/Constants.java +++ b/ff-base/src/main/java/com/ff/base/constant/Constants.java @@ -227,6 +227,17 @@ public class Constants { */ public static final String MEITIAN_API_BASE_URL = "meitian.api.base.url"; + + /** + * km-api基本url + */ + public static final String KM_API_BASE_URL_LOGIN = "km.api.base.url"; + /** + * km-api基本登录url + */ + public static final String KM_API_BASE_LOGIN_URL = "km.api.base.login.url"; + + /** * 服务 */ @@ -238,15 +249,12 @@ public class Constants { public static final String SYSTEM = "system"; - - /** * 主 数据源 */ public static final String DATA_SOURCE = "master"; - /** * 租户id */ @@ -300,5 +308,5 @@ public class Constants { /** * 一百 */ - public static final BigDecimal HUNDRED =new BigDecimal("100") ; + public static final BigDecimal HUNDRED = new BigDecimal("100"); } 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 e7eefcf..00d2cfd 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 @@ -13,6 +13,7 @@ public enum GamePlatforms { DG("DG", "DG"), MeiTian("MeiTian","美天棋牌"), AE("AE", "AE"), + KM("KM", "KM") ; private final String code; diff --git a/ff-base/src/main/java/com/ff/base/enums/KMGameType.java b/ff-base/src/main/java/com/ff/base/enums/KMGameType.java new file mode 100644 index 0000000..460795c --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/enums/KMGameType.java @@ -0,0 +1,70 @@ +package com.ff.base.enums; + + +import java.util.Optional; +import java.util.stream.Stream; + + +/** + * xkgame类型 + * + * @author shi + * @date 2024/11/13 + */ +public enum KMGameType { + + ELECTRON("KMQM", 1,"电子") + + ; + + private final String code; + private final Integer systemCode; + private final String info; + KMGameType(String code, Integer systemCode, String info) + { + this.code = code; + this.systemCode = systemCode; + this.info = info; + } + + public String getCode() + { + return code; + } + + public Integer getSystemCode() + { + return systemCode; + } + public String getInfo() + { + return info; + } + /** + * 按代码查找系统 + * + * @param code 代码 + * @return {@link String } + */ + public static Integer findSystemByCode(String code) { + Optional system = Stream.of(KMGameType.values()) + .filter(gameType -> gameType.getCode().equals(code)) + .map(KMGameType::getSystemCode) + .findFirst(); + return system.orElse(null); + } + + /** + * 按代码查找信息 + * + * @param code 代码 + * @return {@link String } + */ + public static String findInfoByCode(String code) { + Optional system = Stream.of(KMGameType.values()) + .filter(gameType -> gameType.getCode().equals(code)) + .map(KMGameType::getInfo) + .findFirst(); + return system.orElse(null); + } +} diff --git a/ff-base/src/main/java/com/ff/base/utils/JsonUtil.java b/ff-base/src/main/java/com/ff/base/utils/JsonUtil.java index f87c94e..b760170 100644 --- a/ff-base/src/main/java/com/ff/base/utils/JsonUtil.java +++ b/ff-base/src/main/java/com/ff/base/utils/JsonUtil.java @@ -108,7 +108,7 @@ public class JsonUtil { * * @param map 地图 * @return {@link String } - */// 将LinkedHashMap转换为查询字符串 + */ // 将LinkedHashMap转换为查询字符串 public static String mapToQueryString(Map map) { return map.entrySet().stream() .map(entry -> entry.getKey() + "=" + entry.getValue()) diff --git a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java index 8abd9d3..0c29474 100644 --- a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java +++ b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java @@ -422,7 +422,6 @@ public class ApiGameController extends BaseController { ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode()); - KickMemberAllDTO kickMemberAllDTO = KickMemberAllDTO.builder() .agentId(gameSecretKey.getCode()) .agentKey(gameSecretKey.getKey()) @@ -589,4 +588,43 @@ public class ApiGameController extends BaseController { return AjaxResult.success(balanceMap); } + + + /** + * 演示登录 + * + * @param gameDemoLoginRequest 游戏演示登录请求 + * @return {@link AjaxResult } + */ + @PostMapping("/demo/login") + public AjaxResult demoLogin(@Validated @RequestBody GameDemoLoginRequest gameDemoLoginRequest) { + + Game game = gameService.selectGameById(gameDemoLoginRequest.getGameId()); + ApiException.notNull(game, ErrorCode.GAME_NOT_EXIST.getCode()); + + GamePlatform gamePlatform = gamePlatformService.selectGamePlatformById(game.getPlatformId()); + ApiException.notNull(gamePlatform, ErrorCode.PLATFORM_NOT_EXIST.getCode()); + + + IGamesService iGamesService = gamesService.get(gamePlatform.getPlatformCode() + Constants.SERVICE); + + + GameSecretKeyLangDTO gameSecretKeyLangDTO = gameSecretKeyLangService.findGameSecretKeyLangDTO(GameSecretKeyLangDTO.builder() + .platformCode(gamePlatform.getPlatformCode()) + .systemLangCode(gameDemoLoginRequest.getLangCode()) + .build()); + ApiException.notNull(gameSecretKeyLangDTO, ErrorCode.LANG_NOT_EXIST.getCode()); + + + GameDemoLoginRequestDTO gamesLogin = GameDemoLoginRequestDTO.builder() + .gameId(game.getGameCode()) + .gameType(game.getGameSourceType()) + .lang(gameSecretKeyLangDTO.getLang()) + .build(); + + GameDemoLoginResponseDTO gameDemoLoginResponseDTO = iGamesService.gameDemoLogin(gamesLogin); + GameDemoLoginResponse gameDemoLoginResponse = new GameDemoLoginResponse(); + BeanUtils.copyProperties(gameDemoLoginResponseDTO, gameDemoLoginResponse); + return AjaxResult.success(gameDemoLoginResponse); + } } 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 95fdd5a..0a7454b 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 @@ -133,6 +133,7 @@ public class ApiMemberController extends BaseController { .agentId(gameSecretKey.getCode()) .agentKey(gameSecretKey.getKey()) .betLimit(memberCreateApiRequest.getBetLimit()) + .platformType(memberCreateApiRequest.getPlatformType()) .currency(gameSecretKey.getCurrency()) .build(); Boolean result = iGamesService.createMember(gamesBaseRequestDTO); diff --git a/ff-game/src/main/java/com/ff/api/request/GameDemoLoginRequest.java b/ff-game/src/main/java/com/ff/api/request/GameDemoLoginRequest.java new file mode 100644 index 0000000..315fdda --- /dev/null +++ b/ff-game/src/main/java/com/ff/api/request/GameDemoLoginRequest.java @@ -0,0 +1,53 @@ +package com.ff.api.request; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Map; + +/** + * 游戏登录请求 + * + * @author shi + * @date 2025/02/11 + */ +@Data +public class GameDemoLoginRequest implements Serializable { + private final static long serialVersionUID = 7699430372422335056L; + + + + + /** + * 语种id + */ + @NotBlank(message = "langCode不能为空") + @Length(max = 32, message = "langCode长度不能超过32个字符") + private String langCode; + + + /** + * 游戏id + */ + @NotNull(message = "gameId不能为空") + private Long gameId; + + + /** + * 游戏回主页功能导向位置 + */ + private String homeUrl; + /** + * 带入 web 或是 app + */ + private String platform; + /** + * 带入 1 即关闭全屏幕模式 + */ + private Integer disableFullScreen; + + +} diff --git a/ff-game/src/main/java/com/ff/api/request/MemberCreateApiRequest.java b/ff-game/src/main/java/com/ff/api/request/MemberCreateApiRequest.java index 1644857..83af3f7 100644 --- a/ff-game/src/main/java/com/ff/api/request/MemberCreateApiRequest.java +++ b/ff-game/src/main/java/com/ff/api/request/MemberCreateApiRequest.java @@ -40,4 +40,8 @@ public class MemberCreateApiRequest implements Serializable{ */ private Map>> betLimit; + /** + * 平台类型 0 桌面 1 移动 + */ + private Integer platformType; } diff --git a/ff-game/src/main/java/com/ff/api/response/GameDemoLoginResponse.java b/ff-game/src/main/java/com/ff/api/response/GameDemoLoginResponse.java new file mode 100644 index 0000000..1978ee0 --- /dev/null +++ b/ff-game/src/main/java/com/ff/api/response/GameDemoLoginResponse.java @@ -0,0 +1,28 @@ +package com.ff.api.response; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + + +/** + * 游戏演示登录响应 + * + * @author shi + * @date 2025/04/03 + */ +@Data +public class GameDemoLoginResponse implements Serializable { + private final static long serialVersionUID = 7699430372422335056L; + + + + /** + * 网址 + */ + private String url; + +} 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 4d7c6f3..1ee439d 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 @@ -96,6 +96,8 @@ public interface IGamesService { */ Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest); + + /** * 获取游戏详细信息 * @@ -136,6 +138,13 @@ public interface IGamesService { */ Boolean cancelFreeSpin(CancelFreeSpinRequestDTO cancelFreeSpinRequestDTO); + /** + * 游戏演示登录 + * + * @param gameDemoLoginRequestDTO 游戏演示登录请求dto + * @return {@link GameDemoLoginResponseDTO } + */ + GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO); /** 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 2c66655..ac359be 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 @@ -531,6 +531,17 @@ public class GamesAEServiceImpl implements IGamesService { throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } + /** + * 游戏演示登录 + * + * @param gameDemoLoginRequestDTO 游戏演示登录请求dto + * @return {@link GameDemoLoginResponseDTO } + */ + @Override + public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + /** * 批量插入 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 b946566..7153ed0 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 @@ -501,6 +501,19 @@ public class GamesDGServiceImpl implements IGamesService { throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } + /** + * 游戏演示登录 + * + * @param gameDemoLoginRequestDTO 游戏演示登录请求dto + * @return {@link GameDemoLoginResponseDTO } + */ + @Override + public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + + /** * 取消赠送免费局数 * 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 5a4e93c..df5c607 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 @@ -610,6 +610,17 @@ public class GamesFCServiceImpl implements IGamesService { throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } + /** + * 游戏演示登录 + * + * @param gameDemoLoginRequestDTO 游戏演示登录请求dto + * @return {@link GameDemoLoginResponseDTO } + */ + @Override + public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + /** * 数据构建 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 ac9b2f4..86b3d74 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 @@ -692,6 +692,17 @@ public class GamesJILIServiceImpl implements IGamesService { throw new BaseException(cancelFreeSpinResponseDTO.getMessage()); } } + /** + * 游戏演示登录 + * + * @param gameDemoLoginRequestDTO 游戏演示登录请求dto + * @return {@link GameDemoLoginResponseDTO } + */ + @Override + public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + /** diff --git a/ff-game/src/main/java/com/ff/game/api/km/address/MyKMAddressSource.java b/ff-game/src/main/java/com/ff/game/api/km/address/MyKMAddressSource.java new file mode 100644 index 0000000..a5a3621 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/km/address/MyKMAddressSource.java @@ -0,0 +1,31 @@ +package com.ff.game.api.km.address; + +import com.dtflys.forest.callback.AddressSource; +import com.dtflys.forest.http.ForestAddress; +import com.dtflys.forest.http.ForestRequest; +import com.ff.base.constant.Constants; +import com.ff.base.system.service.ISysConfigService; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + + +/** + * 我jili address来源 + * + * @author shi + * @date 2025/02/10 + */ +@Component +public class MyKMAddressSource implements AddressSource { + + @Resource + private ISysConfigService configService; + + + @Override + public ForestAddress getAddress(ForestRequest request) { + String apiBaseUrl = configService.selectConfigByKey(Constants.KM_API_BASE_URL_LOGIN); + return new ForestAddress("https",apiBaseUrl, 443,"api"); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..9a480ea --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/km/client/KMClient.java @@ -0,0 +1,95 @@ +package com.ff.game.api.km.client; + + +import com.dtflys.forest.annotation.*; +import com.ff.game.api.dg.dto.DGBetRecordResponseDTO; +import com.ff.game.api.dg.dto.DGResponse; +import com.ff.game.api.dg.dto.DGUserListResponseDTO; +import com.ff.game.api.km.address.MyKMAddressSource; +import com.ff.game.api.km.dto.*; +import com.ff.game.api.km.success.MyKMSuccessCondition; +import com.ff.game.api.xk.dto.XKBetRecordResponseDTO; + +import java.util.Map; + +/** + * dg 请求 + * + * @author shi + * @date 2025/02/10 + */ +@Address(source = MyKMAddressSource.class) +@Success(condition = MyKMSuccessCondition.class) +public interface KMClient { + /** + * 创建成员 + * + * @param params 参数 + * @param header 头球 + * @return {@link DGResponse } + */ + @Post("/player/authorize") + KMAuthTokenResponse createMember(@JSONBody Map params, @Header Map header); + + /** + * 获取会员信息 + * + * @param params 参数 + */ + @Get("/player/balance?{params}") + KMBalanceResponse getMemberInfo(@Var("params") String params, @Header Map header); + + + /** + * 游戏 + * + * @param params 参数 + * @param header 头球 + * @return {@link KMGameResponse } + */ + @Get("/games?{params}") + KMGameResponse getGameList(@Var("params") String params, @Header Map header); + + + /** + * 加钱 + * + * @param params 参数 + * @param header 头球 + * @return {@link KMTransactionResponse } + */ + @Post(url = "/wallet/credit") + KMTransactionResponse credit(@JSONBody Map params, @Header Map header); + + + /** + * 扣钱 + * + * @param params 参数 + * @param header 头球 + * @return {@link KMTransactionResponse } + */ + @Post(url = "/wallet/debit") + KMTransactionResponse debit(@JSONBody Map params, @Header Map header); + + /** + * 按时间获取投注记录 + * + * @param params 参数 + * @return {@link KMBetRecordResponse } + */ + @Get(url ="/v2/history/bets?{params}") + KMBetRecordResponse getBetRecordByTime(@Var("params")String params, @Header Map header); + + + /** + * 踢腿队员 + * + * @param params 参数 + * @param header 头球 + * @return {@link KMKickMemberResponse } + */ + @Post(url = "/player/deauthorize") + KMKickMemberResponse kickMember(@JSONBody Map params, @Header Map header); + +} diff --git a/ff-game/src/main/java/com/ff/game/api/km/dto/KMAuthTokenResponse.java b/ff-game/src/main/java/com/ff/game/api/km/dto/KMAuthTokenResponse.java new file mode 100644 index 0000000..46c55b5 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/km/dto/KMAuthTokenResponse.java @@ -0,0 +1,37 @@ +package com.ff.game.api.km.dto; + + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * kmaust令牌响应 + * + * @author shi + * @date 2025/04/02 + */ +@Data +public class KMAuthTokenResponse { + /** + * 错误代码 + */ + @JsonProperty("err") + private Integer errorCode; + + /** + * 错误描述 + */ + @JsonProperty("errdesc") + private String errorDescription; + /** + * 身份验证令牌 + */ + @JsonProperty("authtoken") + private String authToken; + + /** + * 是否为新用户 + */ + @JsonProperty("isnew") + private Boolean isNew; +} diff --git a/ff-game/src/main/java/com/ff/game/api/km/dto/KMBalanceResponse.java b/ff-game/src/main/java/com/ff/game/api/km/dto/KMBalanceResponse.java new file mode 100644 index 0000000..4a32921 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/km/dto/KMBalanceResponse.java @@ -0,0 +1,38 @@ +package com.ff.game.api.km.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * km平衡响应 + * + * @author shi + * @date 2025/04/02 + */ +@Data +public class KMBalanceResponse { + /** + * 错误代码 + */ + @JsonProperty("err") + private Integer errorCode; + + /** + * 错误描述 + */ + @JsonProperty("errdesc") + private String errorDescription; + /** + * 余额 + */ + @JsonProperty("bal") + private BigDecimal balance; + + /** + * 货币代码 + */ + @JsonProperty("cur") + private String currency; +} diff --git a/ff-game/src/main/java/com/ff/game/api/km/dto/KMBetRecordResponse.java b/ff-game/src/main/java/com/ff/game/api/km/dto/KMBetRecordResponse.java new file mode 100644 index 0000000..9f36e9b --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/km/dto/KMBetRecordResponse.java @@ -0,0 +1,145 @@ +package com.ff.game.api.km.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * kmbet记录响应 + * + * @author shi + * @date 2025/04/02 + */ +@Data +public class KMBetRecordResponse { + /** + * 错误代码 + */ + @JsonProperty("err") + private Integer errorCode; + + /** + * 错误描述 + */ + @JsonProperty("errdesc") + private String errorDescription; + + /** + * bets 包含下列字段的对象数组容器。 + */ + @JsonProperty("bets") + private List bets; + + @Data + public static class Bet { + + /** + * KM内部投注辨识码。此字段是唯一的标识符。 + */ + @JsonProperty("id") + private String id; + + /** + * 记录在KM服务器的投注时间,采用ISO 8601格式。 + */ + @JsonProperty("beton") + private Date beton; // 使用 Date 类型来表示 ISO 8601 格式的时间 + + /** + * 投注关闭的时间,采用ISO 8601格式。如果回合尚未结束,则为null。 + */ + @JsonProperty("closedon") + private Date closedon; // 使用 Date 类型来表示 ISO 8601 格式的时间 + + /** + * 交易回合的唯一辨识代码。 + */ + @JsonProperty("roundid") + private String roundId; + + /** + * 游戏交易执行回合时的游戏供应商辨识码。 + */ + @JsonProperty("externalroundid") + private String externalRoundId; + + /** + * 游戏供应商代码,例如 "KMQM"。 + */ + @JsonProperty("gpcode") + private String gpCode; + + /** + * 游戏代码。 + */ + @JsonProperty("gcode") + private String gCode; + + /** + * 游戏平台的类型。 + */ + @JsonProperty("platformtype") + private Integer platformType; + + /** + * 玩家专属辨识代码。 + */ + @JsonProperty("userid") + private String userId; + + /** + * 玩家在KM系统使用的货币。 + */ + @JsonProperty("cur") + private String currency; + + /** + * 投注的总金额,为负数表示从账户扣款。 + */ + @JsonProperty("riskamt") + private BigDecimal riskAmount; + + /** + * 投注赢的金额,若玩家赢得金额则为正数,若没有输赢则为0。 + */ + @JsonProperty("winamt") + private BigDecimal winAmount; + + /** + * 回合中所有投注的有效投注总金额。 + */ + @JsonProperty("validbet") + private BigDecimal validBet; + + /** + * 下注玩家的佣金金额。 + */ + @JsonProperty("commission") + private BigDecimal commission; + + /** + * 累积奖金对象,包含贡献金额和中奖金额。若没有配置累积奖金,则为null。 + */ + @JsonProperty("jackpot") + private Jackpot jackpot; + + @Data + public static class Jackpot { + + /** + * 贡献到累积奖金的金额。 + */ + @JsonProperty("contrib") + private BigDecimal contrib; + + /** + * 本注的累积奖金赢取金额。 + */ + @JsonProperty("winamt") + private BigDecimal winAmount; + } + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/km/dto/KMGameResponse.java b/ff-game/src/main/java/com/ff/game/api/km/dto/KMGameResponse.java new file mode 100644 index 0000000..cd160d1 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/km/dto/KMGameResponse.java @@ -0,0 +1,130 @@ +package com.ff.game.api.km.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * kmgame响应 + * + * @author shi + * @date 2025/04/02 + */ +@Data +public class KMGameResponse { + /** + * 错误代码 + */ + @JsonProperty("err") + private Integer errorCode; + + /** + * 错误描述 + */ + @JsonProperty("errdesc") + private String errorDescription; + /** + * 游戏图标解析度 + */ + @JsonProperty("iconres") + private List iconResolutions; + + /** + * 游戏数组,包含具体的游戏信息 + */ + @JsonProperty("games") + private List games; + + @Data + public static class Game { + + /** + * 游戏供应商游戏专属辨识代码 + */ + @JsonProperty("externalid") + private String externalId; + + /** + * 游戏代码 + */ + @JsonProperty("code") + private String code; + + /** + * 游戏名称 + */ + @JsonProperty("name") + private String name; + + /** + * 游戏说明 + */ + @JsonProperty("description") + private String description; + + /** + * 游戏供应商代码 + */ + @JsonProperty("providercode") + private String providerCode; + + /** + * 游戏的状态 + */ + @JsonProperty("isactive") + private Boolean isActive; + + /** + * 游戏种类代码 + */ + @JsonProperty("type") + private Integer type; + + /** + * 游戏图标 URL(此字段不可用) + */ + @JsonProperty("iconurl") + private String iconUrl; + + /** + * 系统游戏id + */ + private Long systemGameId; + + /** + * 游戏是否提供试玩 + */ + @JsonProperty("supportdemourl") + private Boolean supportDemoUrl; + + /** + * 投注限额数组(如果有的话) + */ + @JsonProperty("betlimits") + private List betLimits; + + @Data + public static class BetLimit { + + /** + * 游戏供应商的投注限制辨识码 + */ + @JsonProperty("id") + private String id; + + /** + * 最小投注金额 + */ + @JsonProperty("min") + private BigDecimal min; + + /** + * 最大投注金额 + */ + @JsonProperty("max") + private BigDecimal max; + } + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/km/dto/KMKickMemberResponse.java b/ff-game/src/main/java/com/ff/game/api/km/dto/KMKickMemberResponse.java new file mode 100644 index 0000000..cf782dd --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/km/dto/KMKickMemberResponse.java @@ -0,0 +1,37 @@ +package com.ff.game.api.km.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * kmkick成员响应 + * + * @author shi + * @date 2025/04/03 + */ +@Data +public class KMKickMemberResponse { + /** + * 错误代码 + */ + @JsonProperty("err") + private Integer errorCode; + + /** + * 错误描述 + */ + @JsonProperty("errdesc") + private String errorDescription; + + /** + * 成功标志,true 表示操作成功,false 表示操作失败 + */ + @JsonProperty("success") + private boolean success; + + /** + * 描述信息 + */ + @JsonProperty("desc") + private String description; +} diff --git a/ff-game/src/main/java/com/ff/game/api/km/dto/KMTransactionResponse.java b/ff-game/src/main/java/com/ff/game/api/km/dto/KMTransactionResponse.java new file mode 100644 index 0000000..66112ef --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/km/dto/KMTransactionResponse.java @@ -0,0 +1,59 @@ +package com.ff.game.api.km.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * km事务响应 + * + * @author shi + * @date 2025/04/02 + */ +@Data +public class KMTransactionResponse { + + /** + * 错误代码 + */ + @JsonProperty("err") + private Integer errorCode; + + /** + * 错误描述 + */ + @JsonProperty("errdesc") + private String errorDescription; + + /** + * 余额 + */ + @JsonProperty("bal") + private BigDecimal balance; + + /** + * 货币类型 + */ + @JsonProperty("cur") + private String currency; + + /** + * 交易 ID + */ + @JsonProperty("txid") + private String txId; + + /** + * 平台交易 ID + */ + @JsonProperty("ptxid") + private String ptxId; + + /** + * 是否为重复交易 + */ + @JsonProperty("dup") + private Boolean isDuplicate; + +} 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 new file mode 100644 index 0000000..225e41b --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/km/impl/GamesKMServiceImpl.java @@ -0,0 +1,733 @@ +package com.ff.game.api.km.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; +import com.alibaba.druid.support.json.JSONUtils; +import com.ff.base.constant.CacheConstants; +import com.ff.base.constant.ConfigConstants; +import com.ff.base.constant.Constants; +import com.ff.base.core.redis.RedisCache; +import com.ff.base.enums.*; +import com.ff.base.exception.base.ApiException; +import com.ff.base.exception.base.BaseException; +import com.ff.base.system.service.ISysConfigService; +import com.ff.base.utils.DateUtils; +import com.ff.base.utils.JsonUtil; +import com.ff.base.utils.StringUtils; +import com.ff.base.utils.ip.IpUtils; +import com.ff.base.utils.sign.Md5Utils; +import com.ff.base.utils.uuid.IdUtils; +import com.ff.config.KeyConfig; +import com.ff.game.api.IGamesService; +import com.ff.game.api.dg.dto.DGBetRecordResponseDTO; +import com.ff.game.api.dg.dto.DGResponse; +import com.ff.game.api.dg.dto.DGUserListResponseDTO; +import com.ff.game.api.jili.dto.JILIGamesDataDTO; +import com.ff.game.api.km.client.KMClient; +import com.ff.game.api.km.dto.*; +import com.ff.game.api.request.*; +import com.ff.game.api.xk.dto.XKGamesDTO; +import com.ff.game.domain.*; +import com.ff.game.dto.GameSecretKeyCurrencyDTO; +import com.ff.game.service.*; +import com.ff.member.domain.Member; +import com.ff.member.service.IMemberService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.net.URLEncoder; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + + +/** + * DG 游戏 impl + * + * @author shi + * @date 2024/11/12 + */ +@Service("KMService") +@Slf4j +public class GamesKMServiceImpl implements IGamesService { + + + @Resource + private ISysConfigService configService; + + @Resource + private RedisCache redisCache; + + @Resource + private IGameExchangeMoneyService gameExchangeMoneyService; + + + @Resource + private IGamePlatformService gamePlatformService; + + + @Resource + private IGameService gameService; + + + @Resource + private IMemberService memberService; + + @Resource + private IGameFreeRecordService gameFreeRecordService; + @Resource + private IGameSecretKeyService gameSecretKeyService; + + @Resource + private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; + + @Resource + private KMClient KMClient; + + + @Resource + private KeyConfig keyConfig; + + @Resource + private IGameBettingDetailsService gameBettingDetailsService; + + @Resource + private IGameNameService gameNameService; + + + /** + * 游戏id + */ + private static final Long GAME_ID = 1904452832756003817L; + + /** + * 平台ID + */ + private static final Long PLATFORM_ID = 1904411420157108325L; + + /** + * 游戏名称id + */ + private static final Long GAME_NAME_ID = 1904452832756002317L; + + /** + * 获得就是成功 + * + * @param errorCode 错误代码 + * @return {@link Boolean } + */ + private Boolean getIsSuccess(Integer errorCode) { + return 200 == errorCode; + } + + + /** + * 获取密钥 + * + * @param gamesBaseRequestDTO 游戏请求dto + * @return {@link String } + */ + private Map getKey(GamesBaseRequestDTO gamesBaseRequestDTO) { + + //取出对应的key跟密钥跟请求参数 + String agentKey = gamesBaseRequestDTO.getAgentKey(); + String agentId = gamesBaseRequestDTO.getAgentId(); + + Map keyMap = new HashMap<>(); + keyMap.put("X-QM-ClientId", agentId); + keyMap.put("X-QM-ClientSecret", agentKey); + return keyMap; + } + + /** + * 创建成员 + * + * @param createMemberRequestDTO 创建成员请求dto + * @return {@link Boolean } + */ + @Override + public Boolean createMember(CreateMemberRequestDTO createMemberRequestDTO) { + log.info("GamesKMServiceImpl [createMember] 请求参数 {}", createMemberRequestDTO); + + Map params = new LinkedHashMap<>(); + params.put("ipaddress", IpUtils.getHostIp()); + params.put("username", createMemberRequestDTO.getAccount()); + params.put("userid", createMemberRequestDTO.getAccount()); + params.put("lang", "en-US"); + params.put("cur", createMemberRequestDTO.getCurrency()); + /* 1 青铜-基本额度 + 2 白银-升级额度 + 3 黄金-高级额度 + 4 白金-贵宾额度*/ + params.put("betlimitid", 4); + //TODO 后面去掉 + params.put("istestplayer", Boolean.TRUE); + params.put("platformtype", ObjectUtils.isEmpty(createMemberRequestDTO.getPlatformType()) ? 1 : createMemberRequestDTO.getPlatformType()); + + Map headerMap = this.getKey(createMemberRequestDTO); + KMAuthTokenResponse member = KMClient.createMember(params, headerMap); + if (ObjectUtils.isEmpty(member.getErrorCode()) || this.getIsSuccess(member.getErrorCode())) { + redisCache.setCacheObject(CacheConstants.KM_USER_TOKEN + createMemberRequestDTO.getAccount(), member.getAuthToken()); + return Boolean.TRUE; + } + //判断是否获取成功 + return Boolean.FALSE; + } + + + /** + * 获取会员信息 + * + * @param memberInfoRequestDTO 会员信息请求dto + * @return {@link MemberInfoResponseDTO } + */ + @Override + public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO memberInfoRequestDTO) { + log.info("GamesDGServiceImpl [getMemberInfo] 请求参数 {}", memberInfoRequestDTO); + Map paramsMap = new HashMap<>(); + Member member = memberService.selectMemberByGameAccount(memberInfoRequestDTO.getAccounts()); + GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() + .platformCode(GamePlatforms.KM.getInfo()) + .currency(member.getCurrencyCode()) + .build()); + + paramsMap.put("userid", memberInfoRequestDTO.getAccounts()); + paramsMap.put("cur", currencyDTO.getCurrency()); + Map headerMap = this.getKey(memberInfoRequestDTO); + KMBalanceResponse memberInfo = KMClient.getMemberInfo(JsonUtil.mapToQueryString(paramsMap), headerMap); + if (ObjectUtils.isEmpty(memberInfo.getErrorCode()) || this.getIsSuccess(memberInfo.getErrorCode())) { + return MemberInfoResponseDTO.builder().account(memberInfoRequestDTO.getAccounts()).balance(memberInfo.getBalance()).status(GameMemberStatus.UNKNOWN.getCode()).build(); + } else { + throw new ApiException(ErrorCode.ACCOUNT_NOT_EXIST.getCode()); + } + } + + /** + * 无重定向登录 + * + * @param gamesLogin 游戏登录 + * @return {@link String } + */ + @Override + public String loginWithoutRedirect(GamesLogin gamesLogin) { + log.info("GamesKMServiceImpl [loginWithoutRedirect] 请求参数 {}", gamesLogin); + String kmUserToken = redisCache.getCacheObject(CacheConstants.KM_USER_TOKEN + gamesLogin.getAccount()); + if (StringUtils.isEmpty(kmUserToken)) { + Member member = memberService.selectMemberByGameAccount(gamesLogin.getAccount()); + GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() + .platformCode(GamePlatforms.KM.getInfo()) + .currency(member.getCurrencyCode()) + .build()); + + CreateMemberRequestDTO gamesBaseRequestDTO = CreateMemberRequestDTO.builder() + .account(gamesLogin.getAccount()) + .agentId(gamesLogin.getAgentId()) + .agentKey(gamesLogin.getAgentKey()) + .currency(currencyDTO.getCurrency()) + .build(); + this.createMember(gamesBaseRequestDTO); + kmUserToken = redisCache.getCacheObject(CacheConstants.KM_USER_TOKEN + gamesLogin.getAccount()); + } + + + String selectConfigByKey = configService.selectConfigByKey(Constants.KM_API_BASE_LOGIN_URL); + + return selectConfigByKey + "/gamelauncher?gpcode=" + gamesLogin.getGameType() + + "&gcode=" + gamesLogin.getGameId() + + "&token=" + kmUserToken + + "&lang=" + gamesLogin.getLang(); + } + + + /** + * 获取游戏列表 + * + * @param gamesBaseRequestDTO 游戏请求dto + * @return {@link String } + */ + @Transactional + @Override + public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) { + + List gamesDatas = redisCache.getCacheList(CacheConstants.KM_GAMES); + if (!CollectionUtils.isEmpty(gamesDatas)) { + return CacheConstants.KM_GAMES; + } + + + Map params = new LinkedHashMap<>(); + params.put("lang", "zh-CN"); + params.put("platformtype", 1); + Map headerMap = this.getKey(gamesBaseRequestDTO); + KMGameResponse gameMobiles = KMClient.getGameList(JsonUtil.mapToQueryString(params), headerMap); + //判断是否获取成功 + List gameListData = new ArrayList<>(); + if (ObjectUtils.isEmpty(gameMobiles.getErrorCode()) || this.getIsSuccess(gameMobiles.getErrorCode())) { + gameListData.addAll(this.gameList(gameMobiles, IngressType.MOBILE_WEB.getValue())); + + } else { + throw new BaseException(gameMobiles.getErrorDescription()); + + } + params = new LinkedHashMap<>(); + params.put("lang", "zh-CN"); + params.put("platformtype", 0); + KMGameResponse gamePCs = KMClient.getGameList(JsonUtil.mapToQueryString(params), headerMap); + //判断是否获取成功 + if (ObjectUtils.isEmpty(gamePCs.getErrorCode()) || this.getIsSuccess(gamePCs.getErrorCode())) { + gameListData.addAll(this.gameList(gamePCs, IngressType.PC_WEB.getValue())); + + } else { + throw new BaseException(gamePCs.getErrorDescription()); + } + // 使用集合操作来找出相同 code 的对象 + List games = gameMobiles.getGames().stream() + .filter(mobile -> gamePCs.getGames().stream() + .anyMatch(pc -> pc.getCode().equals(mobile.getCode()))) + .collect(Collectors.toList()); + for (KMGameResponse.Game game : games) { + GamePlatform gamePlatform = GamePlatform.builder() + .platformType(KMGameType.findSystemByCode(game.getProviderCode())) + .platformCode(GamePlatforms.KM.getCode()) + .build(); + List gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform); + //没有此平台就新增一个平台 + if (CollectionUtils.isEmpty(gamePlatforms)) { + gamePlatform.setPlatformName(GamePlatforms.KM.getInfo() + KMGameType.findInfoByCode(game.getProviderCode())); + gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1); + gamePlatform.setCreateBy(Constants.SYSTEM); + gamePlatformService.insertGamePlatform(gamePlatform); + } else { + gamePlatform = gamePlatforms.get(0); + } + Game gameOne = Game.builder() + .platformId(gamePlatform.getId()) + .gameCode(game.getCode()) + .build(); + List gameOnes = gameService.selectGameList(gameOne); + for (Game one : gameOnes) { + one.setIngress(IngressType.PC_AND_MOBILE_WEB.getValue()); + gameService.updateGame(one); + } + } + + redisCache.deleteObject(CacheConstants.KM_GAMES); + redisCache.setCacheList(CacheConstants.KM_GAMES, gameListData); + redisCache.expire(CacheConstants.KM_GAMES, 5L, TimeUnit.HOURS); + return CacheConstants.KM_GAMES; + } + + /** + * 游戏列表 + * + * @param gameList 游戏列表 + * @param ingress 进入 + * @return {@link List }<{@link KMGameResponse.Game }> + */ + private List 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); + } + Game game = Game.builder() + .platformId(gamePlatform.getId()) + .gameCode(gamesDataDTO.getCode()) + .build(); + List games = gameService.selectGameList(game); + //不存在这个游戏 + if (CollectionUtils.isEmpty(games)) { + game.setGameSourceType(gamesDataDTO.getProviderCode()); + game.setFreespin(Boolean.FALSE); + game.setDemoStatus(gamesDataDTO.getSupportDemoUrl()); + game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); + game.setGameName(gamesDataDTO.getName()); + game.setCreateBy(Constants.SYSTEM); + game.setIngress(ingress); + gameService.insertGame(game); + } else { + game = games.get(0); + } + gamesDataDTO.setSystemGameId(game.getId()); + List gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(game.getGameName()).build()); + if (CollectionUtils.isEmpty(gameNames)) { + gameNameService.insertGameName(GameName.builder() + .gameId(game.getId()) + .gameName(game.getGameName()) + .langCode("zh-CN") + .createBy(Constants.SYSTEM) + .build()); + } + + } + return gameList.getGames(); + } + + /** + * 按代理id进行交换转账 + * + * @param exchangeTransferMoneyRequestDTO 外汇转账moeny dto + * @return {@link Long } + */ + @Override + @Transactional + public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { + log.info("GamesKMServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); + GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() + .platformCode(GamePlatforms.KM.getInfo()) + .currency(exchangeTransferMoneyRequestDTO.getCurrency()) + .build()); + + Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); + String transactionId = GamePlatforms.KM.getInfo() + IdUtils.simpleUUID(); + List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( + GameExchangeMoney.builder() + .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) + .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) + .build() + ); + Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); + + //获取下一个自增id + GameExchangeMoney exchangeMoney = GameExchangeMoney + .builder() + .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) + .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) + .quota(exchangeTransferMoneyRequestDTO.getQuota()) + .balance(exchangeTransferMoneyRequestDTO.getAmount()) + .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) + .currencyCode(currencyDTO.getSystemCurrency()) + .memberId(member.getId()) + .transactionId(transactionId) + .platformCode(GamePlatforms.KM.getInfo()) + .build(); + exchangeMoney.setCreateBy(Constants.SYSTEM); + + BigDecimal amount = exchangeTransferMoneyRequestDTO.getAmount(); + if (TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) { + // 获取第三方钱包余额 + MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder() + .accounts(member.getGameAccount()) + .agentId(exchangeTransferMoneyRequestDTO.getAgentId()) + .currency(exchangeTransferMoneyRequestDTO.getCurrency()) + .agentKey(exchangeTransferMoneyRequestDTO.getAgentKey()) + .build(); + + amount = this.getMemberInfo(gamesBaseRequestDTO).getBalance(); + } + + Map params = new LinkedHashMap<>(); + params.put("userid", exchangeTransferMoneyRequestDTO.getAccount()); + params.put("amt", amount); + params.put("cur", currencyDTO.getCurrency()); + params.put("txid", transactionId); + + Map headerMap = this.getKey(exchangeTransferMoneyRequestDTO); + KMTransactionResponse kmTransactionResponse; + if (TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) { + kmTransactionResponse = KMClient.debit(params, headerMap); + } else { + kmTransactionResponse = KMClient.credit(params, headerMap); + } + + //判断是否转移成功 + if (ObjectUtils.isEmpty(kmTransactionResponse.getErrorCode()) || this.getIsSuccess(kmTransactionResponse.getErrorCode())) { + + //更新数据 + exchangeMoney.setBalance(amount); + exchangeMoney.setCoinBefore(NumberUtil.sub(amount, kmTransactionResponse.getBalance()).abs()); + exchangeMoney.setCoinAfter(kmTransactionResponse.getBalance()); + exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore()); + exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter()); + exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); + gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + } else { + log.error("GamesDGServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{},错误信息{}", kmTransactionResponse.getErrorCode(), kmTransactionResponse.getErrorDescription()); + throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); + } + + return exchangeMoney.getId(); + } + + /** + * 汇兑转移状态 + * + * @param exchangeTransferMoneyRequestDTO 兑换转账请求dto + * @return {@link Boolean } + */ + @Override + public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + return Boolean.TRUE; + } + + + /** + * 按时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link List }<{@link GameBettingDetails }> + */ + @Override + public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { + //请求参数 + + log.info("GamesKMServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO); + Map 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); + + + return Boolean.TRUE; + } else { + log.error("GamesKMServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getErrorCode(), betRecordByTime.getErrorDescription()); + throw new BaseException(betRecordByTime.getErrorDescription()); + } + + + } + + /** + * 按历史时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link Boolean } + */ + @Override + public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { + return null; + } + + /** + * 赠送免费局数 + * + * @param createFreeSpinRequest 创建自由旋转请求 + * @return {@link Boolean } + */ + @Override + public Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + /** + * 获取游戏详细信息 + * + * @param getGameDetailRequestDTO 获取游戏详细信息请求dto + * @return {@link GetGameDetailResponseDTO } + */ + @Override + public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + /** + * 强制会员从游戏注销 + * + * @param kickMemberRequestDTO 踢会员请求dto + * @return {@link Boolean } + */ + @Override + public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) { + log.info("GamesKMServiceImpl [kickMember] 请求参数 {}", kickMemberRequestDTO); + Map key = this.getKey(kickMemberRequestDTO); + Map params = new LinkedHashMap<>(); + params.put("userid", kickMemberRequestDTO.getAccount()); + KMKickMemberResponse kickMember = KMClient.kickMember(params, key); + if (ObjectUtils.isEmpty(kickMember.getErrorCode()) || this.getIsSuccess(kickMember.getErrorCode())) { + redisCache.deleteObject(CacheConstants.KM_USER_TOKEN + kickMemberRequestDTO.getAccount()); + return kickMember.isSuccess(); + }else { + throw new BaseException(kickMember.getDescription()); + } + } + + /** + * 踢成员全部 + * + * @param kickMemberAllDTO 踢成员全部dto + * @return {@link Boolean } + */ + @Override + public Boolean kickMemberAll(KickMemberAllDTO kickMemberAllDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + /** + * 免费游戏玩家使用的纪录 + * + * @param getFreeSpinDashflowRequestDTO 获取自由旋转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) { + log.info("GamesKMServiceImpl [gameDemoLogin] 请求参数 {}", gameDemoLoginRequestDTO); + Map params = new LinkedHashMap<>(); + params.put("lang", gameDemoLoginRequestDTO.getLang()); + String selectConfigByKey = configService.selectConfigByKey(Constants.KM_API_BASE_LOGIN_URL); + return GameDemoLoginResponseDTO.builder() + .url(selectConfigByKey + "/demolauncher?gpcode=" + gameDemoLoginRequestDTO.getGameType() + + "&gcode=" + gameDemoLoginRequestDTO.getGameId() + + "&lang=" + gameDemoLoginRequestDTO.getLang()) + .build(); + } + + + /** + * 批量插入 + * + * @param betRecordByTime dg投注记录响应dto + */ + private void batchInsert(KMBetRecordResponse betRecordByTime) { + List gameBettingDetails = new ArrayList<>(); + List wagersIds = new ArrayList<>(); + //数据组装 + List report = betRecordByTime.getBets(); + //数据转化 + for (KMBetRecordResponse.Bet bean : report) { + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean).build()); + if (!ObjectUtils.isEmpty(bettingDetails)) { + bettingDetails.setId(IdUtil.getSnowflakeNextId()); + gameBettingDetails.add(bettingDetails); + } + wagersIds.add(String.valueOf(bean.getId())); + } + if (!CollectionUtils.isEmpty(gameBettingDetails)) { + //查询重复数据id + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.KM.getInfo()); + //用steam流清除list中与wagersIds集合相同的数据 + gameBettingDetails = gameBettingDetails.stream() + .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) + .collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(gameBettingDetails)) { + gameBettingDetailsService.batchInsert(gameBettingDetails); + } + } + + } + + /** + * 数据构建 + * + * @param gamesDataBuildDTO 数据 + * @return {@link GameBettingDetails } + */ + @Override + public GameBettingDetails dataBuild(GamesDataBuildDTO gamesDataBuildDTO) { + //转化类 + KMBetRecordResponse.Bet resultBean = (KMBetRecordResponse.Bet) gamesDataBuildDTO.getData(); + + + GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() + .platformCode(GamePlatforms.KM.getInfo()) + .currency(resultBean.getCurrency()) + .build()); + + + Member member = memberService.selectMemberByGameAccount(resultBean.getUserId()); + if (ObjectUtils.isEmpty(member)) { + return null; + } + List gamesDatas = redisCache.getCacheList(CacheConstants.KM_GAMES); + Map dataDTOMap = gamesDatas.stream() .collect(Collectors.toMap( + KMGameResponse.Game::getCode, + e -> e, + (existing, replacement) -> existing + ));; + KMGameResponse.Game gamesDataDTO = dataDTOMap.get(resultBean.getGCode()); + + //输赢状态 + Integer gameStatus = GameStatus.FLAT.getCode(); + BigDecimal payoffAmount =NumberUtil.sub(resultBean.getWinAmount(), resultBean.getRiskAmount().abs()); + if (payoffAmount.compareTo(BigDecimal.ZERO) > 0) { + gameStatus = GameStatus.WIN.getCode(); + } else if (payoffAmount.compareTo(BigDecimal.ZERO) < 0) { + gameStatus = GameStatus.FAIL.getCode(); + } + + + //数据构造 + GameBettingDetails gameBettingDetails = GameBettingDetails.builder() + .tenantKey(member.getTenantKey()) + //保存我们的币种id + .currencyCode(currencyDTO.getSystemCurrency()) + .memberId(member.getId()) + .gameCode(gamesDataDTO.getCode()) + .gameType(PlatformType.CARD_GAME.getCode()) + .platformCode(GamePlatforms.KM.getInfo()) + .gameId(GAME_ID) + .gameName(gamesDataDTO.getName()) + .gameStatus(gameStatus) + .gameStatusType(1) + .gameCurrencyCode(currencyDTO.getCurrency()) + .account(resultBean.getUserId()) + .wagersId(resultBean.getId()) + .wagersTime(resultBean.getBeton().getTime()) + .betAmount(resultBean.getRiskAmount().abs()) + .payoffTime(resultBean.getClosedon().getTime()) + .payoffAmount(payoffAmount.abs()) + .settlementTime(resultBean.getClosedon().getTime()) + .turnover(resultBean.getValidBet()) + .settlementStatus(SettlementStatusEnum.COMPLETED.getCode()) + .orderNo(resultBean.getExternalRoundId()) + .round(resultBean.getRoundId()) + .build(); + gameBettingDetails.setCreateBy(Constants.SYSTEM); + gameBettingDetails.setCreateTime(DateUtils.getNowDate()); + return gameBettingDetails; + } +} 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/km/success/MyKMSuccessCondition.java new file mode 100644 index 0000000..3a29b10 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/km/success/MyKMSuccessCondition.java @@ -0,0 +1,31 @@ +package com.ff.game.api.km.success; + + +import com.dtflys.forest.callback.SuccessWhen; +import com.dtflys.forest.http.ForestRequest; +import com.dtflys.forest.http.ForestResponse; + +/** + * 我kmsuccess状态 + * + * @author shi + * @date 2025/04/02 + */ +public class MyKMSuccessCondition implements SuccessWhen { + + /** + * 请求成功条件 + * @param req Forest请求对象 + * @param res Forest响应对象 + * @return 是否成功,true: 请求成功,false: 请求失败 + */ + @Override + public boolean successWhen(ForestRequest req, ForestResponse res) { + // req 为Forest请求对象,即 ForestRequest 类实例 + // res 为Forest响应对象,即 ForestResponse 类实例 + // 返回值为 ture 则表示请求成功,false 表示请求失败 + return res.noException(); + // 当然在这里也可以写其它条件,比如 通过 res.getResult() 或 res.getContent() 获取业务数据 + // 再根据业务数据判断是否成功 + } +} 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 fe60da4..23b9863 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 @@ -683,6 +683,17 @@ public class MeiTianGameServiceImpl implements IGamesService { throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } + /** + * 游戏演示登录 + * + * @param gameDemoLoginRequestDTO 游戏演示登录请求dto + * @return {@link GameDemoLoginResponseDTO } + */ + @Override + public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + /** * 批量插入 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 c314f47..33bdc76 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 @@ -645,7 +645,7 @@ public class GamesPGServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { - return null; + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } @@ -659,7 +659,7 @@ public class GamesPGServiceImpl implements IGamesService { public Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest) { - return null; + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } /** @@ -689,7 +689,7 @@ public class GamesPGServiceImpl implements IGamesService { @Override public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) { - return null; + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } /** @@ -701,7 +701,7 @@ public class GamesPGServiceImpl implements IGamesService { @Override public Boolean kickMemberAll(KickMemberAllDTO kickMemberAllDTO) { - return null; + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } /** @@ -714,7 +714,7 @@ public class GamesPGServiceImpl implements IGamesService { public List getFreeSpinDashflow(GetFreeSpinDashflowRequestDTO getFreeSpinDashflowRequestDTO) { - return Collections.emptyList(); + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } /** @@ -726,8 +726,19 @@ public class GamesPGServiceImpl implements IGamesService { @Override public Boolean cancelFreeSpin(CancelFreeSpinRequestDTO cancelFreeSpinRequestDTO) { - return null; + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } + /** + * 游戏演示登录 + * + * @param gameDemoLoginRequestDTO 游戏演示登录请求dto + * @return {@link GameDemoLoginResponseDTO } + */ + @Override + public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + /** 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 e15a390..38d9294 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 @@ -559,6 +559,17 @@ public class GamesPGXServiceImpl implements IGamesService { throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } + /** + * 游戏演示登录 + * + * @param gameDemoLoginRequestDTO 游戏演示登录请求dto + * @return {@link GameDemoLoginResponseDTO } + */ + @Override + public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + /** * 批量插入 diff --git a/ff-game/src/main/java/com/ff/game/api/request/CreateMemberRequestDTO.java b/ff-game/src/main/java/com/ff/game/api/request/CreateMemberRequestDTO.java index f651b69..b6d1dac 100644 --- a/ff-game/src/main/java/com/ff/game/api/request/CreateMemberRequestDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/request/CreateMemberRequestDTO.java @@ -29,5 +29,10 @@ public class CreateMemberRequestDTO extends GamesBaseRequestDTO { */ private Map>> betLimit; + /** + * 平台类型 0 桌面 1 移动 + */ + private Integer platformType; + } diff --git a/ff-game/src/main/java/com/ff/game/api/request/GameDemoLoginRequestDTO.java b/ff-game/src/main/java/com/ff/game/api/request/GameDemoLoginRequestDTO.java new file mode 100644 index 0000000..31d095c --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/request/GameDemoLoginRequestDTO.java @@ -0,0 +1,34 @@ +package com.ff.game.api.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * 游戏演示登录请求dto + * + * @author shi + * @date 2025/04/03 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +public class GameDemoLoginRequestDTO extends GamesBaseRequestDTO{ + /** + * 语言 + */ + private String lang; + + + /** + * 游戏类型 + */ + private String gameType; + + /** + * 游戏id + */ + private String gameId; +} diff --git a/ff-game/src/main/java/com/ff/game/api/request/GameDemoLoginResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/request/GameDemoLoginResponseDTO.java new file mode 100644 index 0000000..6f9a2aa --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/request/GameDemoLoginResponseDTO.java @@ -0,0 +1,23 @@ +package com.ff.game.api.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 游戏演示登录响应dto + * + * @author shi + * @date 2025/04/03 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class GameDemoLoginResponseDTO { + /** + * 网址 + */ + private String url; +} 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 d1b265e..2703b42 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 @@ -524,6 +524,17 @@ public class GamesSAServiceImpl implements IGamesService { throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } + /** + * 游戏演示登录 + * + * @param gameDemoLoginRequestDTO 游戏演示登录请求dto + * @return {@link GameDemoLoginResponseDTO } + */ + @Override + public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + /** * 批量插入 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 6e8bc49..76f0223 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 @@ -535,6 +535,17 @@ public class GamesXKServiceImpl implements IGamesService { public Boolean cancelFreeSpin(CancelFreeSpinRequestDTO cancelFreeSpinRequestDTO) { throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } + /** + * 游戏演示登录 + * + * @param gameDemoLoginRequestDTO 游戏演示登录请求dto + * @return {@link GameDemoLoginResponseDTO } + */ + @Override + public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + /** From 8ffe94204c72ab1d37000a1714455e98c3278c1c Mon Sep 17 00:00:00 2001 From: shi Date: Thu, 3 Apr 2025 10:40:43 +0800 Subject: [PATCH 20/62] =?UTF-8?q?feat(game):=20=E6=B7=BB=E5=8A=A0=20KM=20?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=B9=B3=E5=8F=B0=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 KM游戏平台的接口实现类 GamesKMServiceImpl - 添加 KM 游戏平台的相关配置和常量- 实现 KM 游戏平台的登录、获取游戏列表、下注记录等功能 - 增加 KM 游戏平台的错误处理和日志记录 --- .../java/com/ff/member/service/impl/MemberServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 428270b..971752c 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 @@ -55,15 +55,15 @@ public class MemberServiceImpl implements IMemberService { @Override public synchronized String getMemberGameAccount(String platformCode) { String gameAccount = null; - if (GamePlatforms.DG.getInfo().equals(platformCode)) { + if (GamePlatforms.DG.getInfo().equals(platformCode) || GamePlatforms.KM.getInfo().equals(platformCode)) { do { gameAccount = RandomGeneratorUtils.generateRandomAccountUpper(); } while (!ObjectUtils.isEmpty(memberMapper.selectMemberByGameAccount(gameAccount))); - }else if (GamePlatforms.PG.getInfo().equals(platformCode)||GamePlatforms.PGX.getInfo().equals(platformCode)){ + } else if (GamePlatforms.PG.getInfo().equals(platformCode) || GamePlatforms.PGX.getInfo().equals(platformCode)) { do { gameAccount = RandomGeneratorUtils.generateRandomAccountLower(); } while (!ObjectUtils.isEmpty(memberMapper.selectMemberByGameAccount(gameAccount))); - }else { + } else { do { gameAccount = RandomGeneratorUtils.generateRandomAccount(); } while (!ObjectUtils.isEmpty(memberMapper.selectMemberByGameAccount(gameAccount))); From b7ff4ada0ed066a5aa4650219acc7f71b33d0ad7 Mon Sep 17 00:00:00 2001 From: cengy Date: Thu, 3 Apr 2025 11:20:05 +0800 Subject: [PATCH 21/62] =?UTF-8?q?feat(game):=20=E6=96=B0=E5=A2=9E=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加平台管理相关的实体类、Mapper、Service及其实现类 - 实现平台信息的缓存加载和获取 - 新增美天棋牌平台的支持 -重构原有的地址源获取逻辑,使用平台代码进行配置 - 删除了未使用的旧代码和注释 --- .../com/ff/base/constant/CacheConstants.java | 2 + .../java/com/ff/base/enums/GamePlatforms.java | 16 +-- .../java/com/ff/base/enums/PlatformType.java | 3 +- .../java/com/ff/base/handler/JsonHandler.java | 59 ++++++++++ .../com/ff/base/handler/JsonListHandler.java | 64 ++++++++++ .../java/com/ff/base/utils/sign/Md5Utils.java | 51 +++----- ff-game/pom.xml | 1 - .../config/ContentRefreshedEventListener.java | 6 + .../meitian/address/MeiTianAddressSource.java | 10 +- .../dto/JILIBetRecordDataResponseDTO.java | 89 -------------- .../java/com/ff/game/domain/CurrencyInfo.java | 10 ++ .../main/java/com/ff/game/domain/KeyInfo.java | 21 ++++ .../java/com/ff/game/domain/LangInfo.java | 14 +++ .../java/com/ff/game/domain/Platform.java | 38 ++++++ .../java/com/ff/game/domain/PlatformInfo.java | 15 +++ .../main/java/com/ff/game/domain/UrlInfo.java | 16 +++ .../com/ff/game/mapper/PlatformMapper.java | 24 ++++ .../com/ff/game/service/IPlatformService.java | 27 +++++ .../service/impl/PlatformServiceImpl.java | 79 +++++++++++++ .../ff/sports/api/fb/address/FbAddress.java | 29 +++++ ff-game/src/main/java/com/ff/sports/fb/A.java | 7 ++ .../resources/mapper/game/PlatformMapper.xml | 110 ++++++++++++++++++ 22 files changed, 552 insertions(+), 139 deletions(-) create mode 100644 ff-base/src/main/java/com/ff/base/handler/JsonHandler.java create mode 100644 ff-base/src/main/java/com/ff/base/handler/JsonListHandler.java delete mode 100644 ff-game/src/main/java/com/ff/game/api/meitian/dto/JILIBetRecordDataResponseDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/domain/CurrencyInfo.java create mode 100644 ff-game/src/main/java/com/ff/game/domain/KeyInfo.java create mode 100644 ff-game/src/main/java/com/ff/game/domain/LangInfo.java create mode 100644 ff-game/src/main/java/com/ff/game/domain/Platform.java create mode 100644 ff-game/src/main/java/com/ff/game/domain/PlatformInfo.java create mode 100644 ff-game/src/main/java/com/ff/game/domain/UrlInfo.java create mode 100644 ff-game/src/main/java/com/ff/game/mapper/PlatformMapper.java create mode 100644 ff-game/src/main/java/com/ff/game/service/IPlatformService.java create mode 100644 ff-game/src/main/java/com/ff/game/service/impl/PlatformServiceImpl.java create mode 100644 ff-game/src/main/java/com/ff/sports/api/fb/address/FbAddress.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/A.java create mode 100644 ff-game/src/main/resources/mapper/game/PlatformMapper.xml 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 1b0589e..013c73c 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 @@ -92,6 +92,8 @@ public class CacheConstants { */ public static final String MeiTian_GAMES = "meitian_games:"; + + public static final String Platform = "platform:"; } 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 e7eefcf..19a1227 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 @@ -11,23 +11,21 @@ public enum GamePlatforms { FC("FC", "FC"), SA("SA", "SA"), DG("DG", "DG"), - MeiTian("MeiTian","美天棋牌"), + MT("MT", "美天棋牌"), AE("AE", "AE"), ; private final String code; private final String info; - GamePlatforms(String code, String info) - { + GamePlatforms(String code, String info) { this.code = code; this.info = info; } - public static List getCodes() - { - List result=new ArrayList<>(); + public static List getCodes() { + List result = new ArrayList<>(); GamePlatforms[] values = GamePlatforms.values(); for (GamePlatforms value : values) { result.add(value.getCode()); @@ -35,13 +33,11 @@ public enum GamePlatforms { return result; } - public String getCode() - { + public String getCode() { return code; } - public String getInfo() - { + public String getInfo() { return info; } diff --git a/ff-base/src/main/java/com/ff/base/enums/PlatformType.java b/ff-base/src/main/java/com/ff/base/enums/PlatformType.java index 272c646..06385cf 100644 --- a/ff-base/src/main/java/com/ff/base/enums/PlatformType.java +++ b/ff-base/src/main/java/com/ff/base/enums/PlatformType.java @@ -21,7 +21,8 @@ public enum PlatformType { VIDEO(6, "视讯"), LOTTERY(7, "彩票"), SPORTS(8, "体育"), - HUNTING(9, "捕猎"); + HUNTING(9, "捕猎"), + BaiRen(10, "百人场"); private final int code; private final String name; diff --git a/ff-base/src/main/java/com/ff/base/handler/JsonHandler.java b/ff-base/src/main/java/com/ff/base/handler/JsonHandler.java new file mode 100644 index 0000000..df3da7b --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/handler/JsonHandler.java @@ -0,0 +1,59 @@ +package com.ff.base.handler; + +import com.alibaba.fastjson2.JSON; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * mybatis json字段转换 + * + * @author cengy + */ +public class JsonHandler extends BaseTypeHandler { + private final Class type; + + + public JsonHandler(Class type) { + if (type == null) { + throw new IllegalArgumentException("Type argument cannot be null"); + } + this.type = type; + } + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException { + ps.setString(i, JSON.toJSONString(parameter)); + } + + @Override + public T getNullableResult(ResultSet rs, String columnName) throws SQLException { + String json = rs.getString(columnName); + if (json != null) { + return JSON.parseObject(json, type); + } + return null; + } + + @Override + public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + String json = rs.getString(columnIndex); + if (json != null) { + return JSON.parseObject(json, type); + } + return null; + } + + @Override + public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + String json = cs.getString(columnIndex); + if (json != null) { + return JSON.parseObject(json, type); + } + return null; + } +} diff --git a/ff-base/src/main/java/com/ff/base/handler/JsonListHandler.java b/ff-base/src/main/java/com/ff/base/handler/JsonListHandler.java new file mode 100644 index 0000000..da2d651 --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/handler/JsonListHandler.java @@ -0,0 +1,64 @@ +package com.ff.base.handler; + +import com.alibaba.fastjson2.JSON; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +/** + * mybatis json字段转换 + * + * @author cengy + */ +public class JsonListHandler extends BaseTypeHandler> { + private final Class type; + + public JsonListHandler(Class type) { + if (type == null) { + throw new IllegalArgumentException("Type argument cannot be null"); + } + this.type = type; + } + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException { + // Convert the List to JSON string + String json = JSON.toJSONString(parameter); + ps.setString(i, json); + + } + + @Override + public List getNullableResult(ResultSet rs, String columnName) throws SQLException { + + String json = rs.getString(columnName); + if (json == null) { + return null; + } + return JSON.parseArray(json, type); + } + + @Override + public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + String json = rs.getString(columnIndex); + if (json == null) { + return null; + } + return JSON.parseArray(json, type); + + } + + @Override + public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + String json = cs.getString(columnIndex); + if (json == null) { + return null; + } + return JSON.parseArray(json, type); + } +} diff --git a/ff-base/src/main/java/com/ff/base/utils/sign/Md5Utils.java b/ff-base/src/main/java/com/ff/base/utils/sign/Md5Utils.java index 4fa3b0e..aeb5378 100644 --- a/ff-base/src/main/java/com/ff/base/utils/sign/Md5Utils.java +++ b/ff-base/src/main/java/com/ff/base/utils/sign/Md5Utils.java @@ -4,7 +4,6 @@ import com.ff.base.constant.Constants; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import sun.misc.BASE64Encoder; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; @@ -15,27 +14,23 @@ import java.security.NoSuchAlgorithmException; * * @author ff */ -public class Md5Utils -{ +public class Md5Utils { private static final Logger log = LoggerFactory.getLogger(Md5Utils.class); - private static byte[] md5(String s) - { + private static byte[] md5(String s) { MessageDigest algorithm; - try - { + try { algorithm = MessageDigest.getInstance("MD5"); algorithm.reset(); algorithm.update(s.getBytes("UTF-8")); byte[] messageDigest = algorithm.digest(); return messageDigest; - } - catch (Exception e) - { + } catch (Exception e) { log.error("MD5 Error...", e); } return null; } + public static String md5New(String input) { try { MessageDigest md = MessageDigest.getInstance("MD5"); @@ -63,30 +58,24 @@ public class Md5Utils return null; } String result = ""; - try{ + try { MessageDigest md5 = MessageDigest.getInstance("MD5"); - BASE64Encoder base64en = new BASE64Encoder(); - result = base64en.encode(md5.digest(str.getBytes(StandardCharsets.UTF_8))); - }catch (Exception e){ - log.error("encoderByMd5...{0}", str, e); + result = Base64.encode(md5.digest(str.getBytes(StandardCharsets.UTF_8))); + } catch (Exception e) { + log.error("encoderByMd5...{}", str, e); } - return result; } - private static final String toHex(byte hash[]) - { - if (hash == null) - { + private static final String toHex(byte hash[]) { + if (hash == null) { return null; } StringBuffer buf = new StringBuffer(hash.length * 2); int i; - for (i = 0; i < hash.length; i++) - { - if ((hash[i] & 0xff) < 0x10) - { + for (i = 0; i < hash.length; i++) { + if ((hash[i] & 0xff) < 0x10) { buf.append("0"); } buf.append(Long.toString(hash[i] & 0xff, 16)); @@ -94,15 +83,11 @@ public class Md5Utils return buf.toString(); } - public static String hash(String s) - { - try - { - return new String(toHex(md5(Constants.PASS_PREFIX +s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); - } - catch (Exception e) - { - log.error("not supported charset...{}", e); + public static String hash(String s) { + try { + return new String(toHex(md5(Constants.PASS_PREFIX + s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); + } catch (Exception e) { + log.error("not supported charset...", e); return s; } } diff --git a/ff-game/pom.xml b/ff-game/pom.xml index 5d435ed..0751207 100644 --- a/ff-game/pom.xml +++ b/ff-game/pom.xml @@ -16,7 +16,6 @@ - org.springframework.boot diff --git a/ff-game/src/main/java/com/ff/config/ContentRefreshedEventListener.java b/ff-game/src/main/java/com/ff/config/ContentRefreshedEventListener.java index 0b0d82b..a1964ef 100644 --- a/ff-game/src/main/java/com/ff/config/ContentRefreshedEventListener.java +++ b/ff-game/src/main/java/com/ff/config/ContentRefreshedEventListener.java @@ -5,6 +5,7 @@ import com.ff.base.system.domain.SysDatasource; import com.ff.base.system.mapper.SysDatasourceMapper; import com.ff.base.system.service.ISysConfigService; import com.ff.base.system.service.ISysDictTypeService; +import com.ff.game.service.IPlatformService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.context.ApplicationListener; @@ -34,6 +35,9 @@ public class ContentRefreshedEventListener implements ApplicationListener implements Serializable { +} diff --git a/ff-game/src/main/java/com/ff/game/domain/KeyInfo.java b/ff-game/src/main/java/com/ff/game/domain/KeyInfo.java new file mode 100644 index 0000000..2b671a4 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/domain/KeyInfo.java @@ -0,0 +1,21 @@ +package com.ff.game.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 其它字段按需加 + * + * @author cengy + */ +@Data +public class KeyInfo implements Serializable { + + private String code; + private String key; + private String currency; + private String password; + private String providerCode; + +} diff --git a/ff-game/src/main/java/com/ff/game/domain/LangInfo.java b/ff-game/src/main/java/com/ff/game/domain/LangInfo.java new file mode 100644 index 0000000..3ef380d --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/domain/LangInfo.java @@ -0,0 +1,14 @@ +package com.ff.game.domain; + +import java.io.Serializable; +import java.util.HashMap; + +/** + * @author cengy + */ +public class LangInfo extends HashMap implements Serializable { + + public String get(String lang) { + return super.get(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 new file mode 100644 index 0000000..9d818b7 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/domain/Platform.java @@ -0,0 +1,38 @@ +package com.ff.game.domain; + +import com.ff.base.core.domain.BaseEntity; +import lombok.Data; + +import java.util.List; + +/** + * @author cengy + */ +@Data +public class Platform extends BaseEntity { + + /** + * 排序 + */ + private Integer sortNo; + /** + * 平台code + */ + private String platformCode; + /** + * 平台名称 + */ + private String platformName; + + /** + * 状态:true:启用 false:停用 + */ + private Boolean stopStatus; + + private List platformInfo; + private List keyInfo; + private LangInfo langInfo; + private CurrencyInfo currencyInfo; + private UrlInfo urlInfo; + +} diff --git a/ff-game/src/main/java/com/ff/game/domain/PlatformInfo.java b/ff-game/src/main/java/com/ff/game/domain/PlatformInfo.java new file mode 100644 index 0000000..b236435 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/domain/PlatformInfo.java @@ -0,0 +1,15 @@ +package com.ff.game.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cengy + */ +@Data +public class PlatformInfo implements Serializable { + private String code; + private String name; + private int type; +} 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 new file mode 100644 index 0000000..c8f3f96 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/domain/UrlInfo.java @@ -0,0 +1,16 @@ +package com.ff.game.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cengy + */ +@Data +public class UrlInfo implements Serializable { + + private String url; + private String loginUrl; + private String hallCode; +} diff --git a/ff-game/src/main/java/com/ff/game/mapper/PlatformMapper.java b/ff-game/src/main/java/com/ff/game/mapper/PlatformMapper.java new file mode 100644 index 0000000..c6664b1 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/mapper/PlatformMapper.java @@ -0,0 +1,24 @@ +package com.ff.game.mapper; + +import com.ff.game.domain.Platform; + +import java.util.List; + +/** + * @author cengy + */ +public interface PlatformMapper { + + + List selectList(Platform platform); + + Platform selectByPlatformCode(String platformCode); + + int updatePlatform(Platform platform); + + int insertPlatform(Platform platform); + + int deleteById(Long id); + + int deleteByIds(String ids); +} diff --git a/ff-game/src/main/java/com/ff/game/service/IPlatformService.java b/ff-game/src/main/java/com/ff/game/service/IPlatformService.java new file mode 100644 index 0000000..2a8b704 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/service/IPlatformService.java @@ -0,0 +1,27 @@ +package com.ff.game.service; + +import com.ff.game.domain.Platform; + +import java.util.List; + +/** + * @author cengy + */ +public interface IPlatformService { + + List selectList(Platform platform); + + Platform selectByPlatformCode(String platformCode); + + int updatePlatform(Platform platform); + + int insertPlatform(Platform platform); + + int deleteById(Long id); + + int deleteByIds(String ids); + + void loadToCache(); + + Platform get(String platformCode); +} diff --git a/ff-game/src/main/java/com/ff/game/service/impl/PlatformServiceImpl.java b/ff-game/src/main/java/com/ff/game/service/impl/PlatformServiceImpl.java new file mode 100644 index 0000000..6dd8f6b --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/service/impl/PlatformServiceImpl.java @@ -0,0 +1,79 @@ +package com.ff.game.service.impl; + +import com.ff.base.constant.CacheConstants; +import com.ff.base.core.redis.RedisCache; +import com.ff.base.datasource.DynamicDataSourceContextHolder; +import com.ff.game.domain.Platform; +import com.ff.game.mapper.PlatformMapper; +import com.ff.game.service.IPlatformService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.sql.DataSource; +import java.util.List; +import java.util.Map; + +/** + * @author cengy + */ +@Service +public class PlatformServiceImpl implements IPlatformService { + + @Autowired + PlatformMapper platformMapper; + @Autowired + RedisCache redisCache; + + @Override + public List selectList(Platform platform) { + return platformMapper.selectList(platform); + } + + @Override + public Platform selectByPlatformCode(String platformCode) { + return platformMapper.selectByPlatformCode(platformCode); + } + + @Override + public int updatePlatform(Platform platform) { + return platformMapper.updatePlatform(platform); + } + + @Override + public int insertPlatform(Platform platform) { + return platformMapper.insertPlatform(platform); + } + + @Override + public int deleteById(Long id) { + return platformMapper.deleteById(id); + } + + @Override + public int deleteByIds(String ids) { + return platformMapper.deleteByIds(ids); + } + + @Override + public void loadToCache() { + Map resolvedDataSources = DynamicDataSourceContextHolder.getAllDataSource(); + for (Map.Entry entry : resolvedDataSources.entrySet()) { + Object key = entry.getKey(); + // 设置数据源类型 + DynamicDataSourceContextHolder.setDataSourceType(key.toString()); + List list = selectList(new Platform()); + for (Platform pp : list) { + redisCache.setCacheObject(getCacheKey(pp.getPlatformCode()), pp); + } + } + } + + @Override + public Platform get(String platformCode) { + return redisCache.getCacheObject(getCacheKey(platformCode)); + } + + private String getCacheKey(String configKey) { + return CacheConstants.Platform + configKey; + } +} diff --git a/ff-game/src/main/java/com/ff/sports/api/fb/address/FbAddress.java b/ff-game/src/main/java/com/ff/sports/api/fb/address/FbAddress.java new file mode 100644 index 0000000..62ba9ec --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/api/fb/address/FbAddress.java @@ -0,0 +1,29 @@ +package com.ff.sports.api.fb.address; + +import com.dtflys.forest.callback.AddressSource; +import com.dtflys.forest.http.ForestAddress; +import com.dtflys.forest.http.ForestRequest; +import com.ff.base.system.service.ISysConfigService; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + + +/** + * @author shi + * @date 2025/02/10 + */ +@Component +public class FbAddress implements AddressSource { + + public static final String API_BASE_URL = "fb.api.base.url"; + @Resource + private ISysConfigService configService; + + + @Override + public ForestAddress getAddress(ForestRequest request) { + String apiBaseUrl = configService.selectConfigByKey(API_BASE_URL); + return new ForestAddress("https", apiBaseUrl, 443, "services"); + } +} \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/sports/fb/A.java b/ff-game/src/main/java/com/ff/sports/fb/A.java new file mode 100644 index 0000000..badc18a --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/A.java @@ -0,0 +1,7 @@ +package com.ff.sports.fb; + +/** + * @author cengy + */ +public class A { +} diff --git a/ff-game/src/main/resources/mapper/game/PlatformMapper.xml b/ff-game/src/main/resources/mapper/game/PlatformMapper.xml new file mode 100644 index 0000000..25282eb --- /dev/null +++ b/ff-game/src/main/resources/mapper/game/PlatformMapper.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + select * from ff_platform + + + + + + + insert into ff_platform + + id, + sort_no, + platform_code, + platform_name, + platform_info, + url_info, + + key_info, + lang_info, + currency_info, + stop_status, + create_by, + create_time, + update_by, + update_time, + + + #{id}, + #{sortNo} + #{platformCode}, + #{platformName}, + #{platformInfo}, + #{urlInfo}, + #{keyInfo}, + #{langInfo}, + #{currencyInfo}, + #{stopStatus}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + + + + + update ff_platform + + sort_no = #{sortNo}, + platform_code = #{platformCode}, + platform_name = #{platformName}, + platform_info = #{platformInfo}, + url_info = #{urlInfo}, + + key_info = #{keyInfo}, + lang_info = #{langInfo}, + currency_info = #{currencyInfo}, + stop_status = #{stopStatus}, + create_by = #{createBy}, + create_time = #{updateTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + + where id = #{id} + + + + delete from ff_platform where id = #{id} + + + + delete from ff_platform where id in + + #{id} + + + \ No newline at end of file From ad40fc712dfd8da8e2f8a551d28940d28e685cc0 Mon Sep 17 00:00:00 2001 From: cengy Date: Thu, 3 Apr 2025 11:32:14 +0800 Subject: [PATCH 22/62] =?UTF-8?q?refactor(game):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=20API=20=E5=9C=B0=E5=9D=80=E6=9D=A5=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 替换 ISysConfigService 为 IPlatformService - 使用 GamePlatforms枚举替代硬编码的平台名称 - 优化地址获取逻辑,提高代码复用性 - 删除未使用的 Random 类导入 -调整代码格式,提高可读性 --- .../game/api/ae/address/MyAEAddressSource.java | 12 ++++++------ .../game/api/dg/address/MyDGAddressSource.java | 12 ++++++------ .../game/api/fc/address/MyFCAddressSource.java | 11 ++++++----- .../api/jili/address/MyJILIAddressSource.java | 16 +++++++--------- .../game/api/km/address/MyKMAddressSource.java | 12 ++++++------ .../game/api/ng/address/MyNGAddressSource.java | 14 ++++++++------ .../game/api/pgx/address/MyPGXAddressSource.java | 13 +++++++------ .../game/api/sa/address/MySAAddressSource.java | 12 +++++++----- .../game/api/xk/address/MyXKAddressSource.java | 13 +++++++------ 9 files changed, 60 insertions(+), 55 deletions(-) diff --git a/ff-game/src/main/java/com/ff/game/api/ae/address/MyAEAddressSource.java b/ff-game/src/main/java/com/ff/game/api/ae/address/MyAEAddressSource.java index 21eba22..01a76ab 100644 --- a/ff-game/src/main/java/com/ff/game/api/ae/address/MyAEAddressSource.java +++ b/ff-game/src/main/java/com/ff/game/api/ae/address/MyAEAddressSource.java @@ -3,8 +3,8 @@ package com.ff.game.api.ae.address; import com.dtflys.forest.callback.AddressSource; import com.dtflys.forest.http.ForestAddress; import com.dtflys.forest.http.ForestRequest; -import com.ff.base.constant.Constants; -import com.ff.base.system.service.ISysConfigService; +import com.ff.base.enums.GamePlatforms; +import com.ff.game.service.IPlatformService; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -20,12 +20,12 @@ import javax.annotation.Resource; public class MyAEAddressSource implements AddressSource { @Resource - private ISysConfigService configService; - + private IPlatformService platformService; @Override public ForestAddress getAddress(ForestRequest request) { - String apiBaseUrl = configService.selectConfigByKey(Constants.AE_API_BASE_URL); - return new ForestAddress("https",apiBaseUrl, 443,""); + String apiBaseUrl = platformService.get(GamePlatforms.AE.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/dg/address/MyDGAddressSource.java b/ff-game/src/main/java/com/ff/game/api/dg/address/MyDGAddressSource.java index 9bf5985..b98459f 100644 --- a/ff-game/src/main/java/com/ff/game/api/dg/address/MyDGAddressSource.java +++ b/ff-game/src/main/java/com/ff/game/api/dg/address/MyDGAddressSource.java @@ -3,8 +3,8 @@ package com.ff.game.api.dg.address; import com.dtflys.forest.callback.AddressSource; import com.dtflys.forest.http.ForestAddress; import com.dtflys.forest.http.ForestRequest; -import com.ff.base.constant.Constants; -import com.ff.base.system.service.ISysConfigService; +import com.ff.base.enums.GamePlatforms; +import com.ff.game.service.IPlatformService; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -20,12 +20,12 @@ import javax.annotation.Resource; public class MyDGAddressSource implements AddressSource { @Resource - private ISysConfigService configService; - + private IPlatformService platformService; @Override public ForestAddress getAddress(ForestRequest request) { - String apiBaseUrl = configService.selectConfigByKey(Constants.DG_API_BASE_URL); - return new ForestAddress("http",apiBaseUrl, 80,""); + String apiBaseUrl = platformService.get(GamePlatforms.DG.getCode()) + .getUrlInfo().getUrl(); + return new ForestAddress("http", apiBaseUrl, 80, ""); } } \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/fc/address/MyFCAddressSource.java b/ff-game/src/main/java/com/ff/game/api/fc/address/MyFCAddressSource.java index e67a7f0..a7edbdf 100644 --- a/ff-game/src/main/java/com/ff/game/api/fc/address/MyFCAddressSource.java +++ b/ff-game/src/main/java/com/ff/game/api/fc/address/MyFCAddressSource.java @@ -3,8 +3,8 @@ package com.ff.game.api.fc.address; import com.dtflys.forest.callback.AddressSource; import com.dtflys.forest.http.ForestAddress; import com.dtflys.forest.http.ForestRequest; -import com.ff.base.constant.Constants; -import com.ff.base.system.service.ISysConfigService; +import com.ff.base.enums.GamePlatforms; +import com.ff.game.service.IPlatformService; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -13,12 +13,13 @@ import javax.annotation.Resource; public class MyFCAddressSource implements AddressSource { @Resource - private ISysConfigService configService; + private IPlatformService platformService; @Override public ForestAddress getAddress(ForestRequest request) { - String apiBaseUrl = configService.selectConfigByKey(Constants.FC_API_BASE_URL); - return new ForestAddress("https",apiBaseUrl, 443,""); + String apiBaseUrl = platformService.get(GamePlatforms.FC.getCode()) + .getUrlInfo().getUrl(); + return new ForestAddress("https", apiBaseUrl, 443, ""); } } 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 d27b734..66ef096 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 @@ -3,13 +3,11 @@ package com.ff.game.api.jili.address; import com.dtflys.forest.callback.AddressSource; import com.dtflys.forest.http.ForestAddress; import com.dtflys.forest.http.ForestRequest; -import com.ff.base.constant.Constants; -import com.ff.base.system.service.ISysConfigService; -import org.springframework.beans.factory.annotation.Autowired; +import com.ff.base.enums.GamePlatforms; +import com.ff.game.service.IPlatformService; import org.springframework.stereotype.Component; import javax.annotation.Resource; -import java.util.Random; /** @@ -19,15 +17,15 @@ import java.util.Random; * @date 2025/02/10 */ @Component -public class MyJILIAddressSource implements AddressSource { +public class MyJILIAddressSource implements AddressSource { @Resource - private ISysConfigService configService; - + private IPlatformService platformService; @Override public ForestAddress getAddress(ForestRequest request) { - String apiBaseUrl = configService.selectConfigByKey(Constants.JILI_API_BASE_URL); - return new ForestAddress("https",apiBaseUrl, 443,"api1"); + String apiBaseUrl = platformService.get(GamePlatforms.FC.getCode()) + .getUrlInfo().getUrl(); + return new ForestAddress("https", apiBaseUrl, 443, "api1"); } } \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/km/address/MyKMAddressSource.java b/ff-game/src/main/java/com/ff/game/api/km/address/MyKMAddressSource.java index a5a3621..c93baab 100644 --- a/ff-game/src/main/java/com/ff/game/api/km/address/MyKMAddressSource.java +++ b/ff-game/src/main/java/com/ff/game/api/km/address/MyKMAddressSource.java @@ -3,8 +3,8 @@ package com.ff.game.api.km.address; import com.dtflys.forest.callback.AddressSource; import com.dtflys.forest.http.ForestAddress; import com.dtflys.forest.http.ForestRequest; -import com.ff.base.constant.Constants; -import com.ff.base.system.service.ISysConfigService; +import com.ff.base.enums.GamePlatforms; +import com.ff.game.service.IPlatformService; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -20,12 +20,12 @@ import javax.annotation.Resource; public class MyKMAddressSource implements AddressSource { @Resource - private ISysConfigService configService; - + private IPlatformService platformService; @Override public ForestAddress getAddress(ForestRequest request) { - String apiBaseUrl = configService.selectConfigByKey(Constants.KM_API_BASE_URL_LOGIN); - return new ForestAddress("https",apiBaseUrl, 443,"api"); + String apiBaseUrl = platformService.get(GamePlatforms.KM.getCode()) + .getUrlInfo().getUrl(); + return new ForestAddress("https", apiBaseUrl, 443, "api"); } } \ No newline at end of file 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 7f1a0d0..c1b3d32 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 @@ -3,22 +3,24 @@ package com.ff.game.api.ng.address; import com.dtflys.forest.callback.AddressSource; import com.dtflys.forest.http.ForestAddress; import com.dtflys.forest.http.ForestRequest; -import com.ff.base.constant.Constants; -import com.ff.base.system.service.ISysConfigService; +import com.ff.base.enums.GamePlatforms; +import com.ff.game.service.IPlatformService; import org.springframework.stereotype.Component; import javax.annotation.Resource; @Component -public class MyNGAddressSource implements AddressSource { +public class MyNGAddressSource implements AddressSource { @Resource - private ISysConfigService configService; + private IPlatformService platformService; @Override public ForestAddress getAddress(ForestRequest request) { - String apiBaseUrl = configService.selectConfigByKey(Constants.NG_API_BASE_URL); - return new ForestAddress("https",apiBaseUrl, 443,"api"); + //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/pgx/address/MyPGXAddressSource.java b/ff-game/src/main/java/com/ff/game/api/pgx/address/MyPGXAddressSource.java index 5bd6c65..e3349d0 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgx/address/MyPGXAddressSource.java +++ b/ff-game/src/main/java/com/ff/game/api/pgx/address/MyPGXAddressSource.java @@ -3,8 +3,8 @@ package com.ff.game.api.pgx.address; import com.dtflys.forest.callback.AddressSource; import com.dtflys.forest.http.ForestAddress; import com.dtflys.forest.http.ForestRequest; -import com.ff.base.constant.Constants; -import com.ff.base.system.service.ISysConfigService; +import com.ff.base.enums.GamePlatforms; +import com.ff.game.service.IPlatformService; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -20,12 +20,13 @@ import javax.annotation.Resource; public class MyPGXAddressSource implements AddressSource { @Resource - private ISysConfigService configService; - + private IPlatformService platformService; @Override public ForestAddress getAddress(ForestRequest request) { - String apiBaseUrl = configService.selectConfigByKey(Constants.PGX_API_BASE_URL); - return new ForestAddress("http",apiBaseUrl, 80,""); +// String apiBaseUrl = configService.selectConfigByKey(Constants.PGX_API_BASE_URL); + String apiBaseUrl = platformService.get(GamePlatforms.PGX.getCode()) + .getUrlInfo().getUrl(); + return new ForestAddress("http", apiBaseUrl, 80, ""); } } \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/sa/address/MySAAddressSource.java b/ff-game/src/main/java/com/ff/game/api/sa/address/MySAAddressSource.java index 5ee8a89..de51edf 100644 --- a/ff-game/src/main/java/com/ff/game/api/sa/address/MySAAddressSource.java +++ b/ff-game/src/main/java/com/ff/game/api/sa/address/MySAAddressSource.java @@ -3,8 +3,8 @@ package com.ff.game.api.sa.address; import com.dtflys.forest.callback.AddressSource; import com.dtflys.forest.http.ForestAddress; import com.dtflys.forest.http.ForestRequest; -import com.ff.base.constant.Constants; -import com.ff.base.system.service.ISysConfigService; +import com.ff.base.enums.GamePlatforms; +import com.ff.game.service.IPlatformService; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -20,12 +20,14 @@ import javax.annotation.Resource; public class MySAAddressSource implements AddressSource { @Resource - private ISysConfigService configService; + private IPlatformService platformService; @Override public ForestAddress getAddress(ForestRequest request) { - String apiBaseUrl = configService.selectConfigByKey(Constants.SA_API_BASE_URL); - return new ForestAddress("https",apiBaseUrl, 443,"api"); +// String apiBaseUrl = configService.selectConfigByKey(Constants.SA_API_BASE_URL); + String apiBaseUrl = platformService.get(GamePlatforms.SA.getCode()) + .getUrlInfo().getUrl(); + return new ForestAddress("https", apiBaseUrl, 443, "api"); } } \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/xk/address/MyXKAddressSource.java b/ff-game/src/main/java/com/ff/game/api/xk/address/MyXKAddressSource.java index 56ecda7..64144db 100644 --- a/ff-game/src/main/java/com/ff/game/api/xk/address/MyXKAddressSource.java +++ b/ff-game/src/main/java/com/ff/game/api/xk/address/MyXKAddressSource.java @@ -3,8 +3,8 @@ package com.ff.game.api.xk.address; import com.dtflys.forest.callback.AddressSource; import com.dtflys.forest.http.ForestAddress; import com.dtflys.forest.http.ForestRequest; -import com.ff.base.constant.Constants; -import com.ff.base.system.service.ISysConfigService; +import com.ff.base.enums.GamePlatforms; +import com.ff.game.service.IPlatformService; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -20,12 +20,13 @@ import javax.annotation.Resource; public class MyXKAddressSource implements AddressSource { @Resource - private ISysConfigService configService; - + private IPlatformService platformService; @Override public ForestAddress getAddress(ForestRequest request) { - String apiBaseUrl = configService.selectConfigByKey(Constants.XK_API_BASE_URL); - return new ForestAddress("https",apiBaseUrl, 443,"api"); +// String apiBaseUrl = configService.selectConfigByKey(Constants.XK_API_BASE_URL); + String apiBaseUrl = platformService.get(GamePlatforms.XK.getCode()) + .getUrlInfo().getUrl(); + return new ForestAddress("https", apiBaseUrl, 443, "api"); } } \ No newline at end of file From e2375788b4ef8dcf935fe03c209c5928e453dafb Mon Sep 17 00:00:00 2001 From: cengy Date: Thu, 3 Apr 2025 11:35:39 +0800 Subject: [PATCH 23/62] =?UTF-8?q?refactor(ff-game):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=20KM=20=E6=B8=B8=E6=88=8F=E5=B9=B3=E5=8F=B0=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除了 Constants 类中与 KM 相关的冗余常量定义 - 更新了 GamesKMServiceImpl 类中的 URL 构造方式,使用平台服务获取登录 URL - 优化了代码结构,提高了可维护性和可扩展性 --- .../java/com/ff/base/constant/Constants.java | 59 ------------------- .../game/api/km/impl/GamesKMServiceImpl.java | 29 ++++----- 2 files changed, 13 insertions(+), 75 deletions(-) diff --git a/ff-base/src/main/java/com/ff/base/constant/Constants.java b/ff-base/src/main/java/com/ff/base/constant/Constants.java index dfbc43c..cc76992 100644 --- a/ff-base/src/main/java/com/ff/base/constant/Constants.java +++ b/ff-base/src/main/java/com/ff/base/constant/Constants.java @@ -178,65 +178,6 @@ public class Constants { */ public static final String PASS_PREFIX = "FF_"; - /** - * jili 接口请求前缀 - */ - public static final String JILI_API_BASE_URL = "jili.api.base.url"; - - /** - * ng 接口请求前缀 - */ - public static final String NG_API_BASE_URL = "ng.api.base.url"; - - /** - * fc-api基本url - */ - public static final String FC_API_BASE_URL = "fc.api.base.url"; - - /** - * 吉利测试地址 - */ - public static final String JILI_GAME_DOME = "jili.game.dome"; - - /** - * xk 接口请求前缀 - */ - public static final String XK_API_BASE_URL = "xk.api.base.url"; - - /** - * pgx-api基本url - */ - public static final String PGX_API_BASE_URL = "gpx.api.base.url"; - - /** - * dg-api基本url - */ - public static final String DG_API_BASE_URL = "dg.api.base.url"; - - /** - * ae api基本url - */ - public static final String AE_API_BASE_URL = "ae.api.base.url"; - /** - * sa-api基本url - */ - public static final String SA_API_BASE_URL = "sa.api.base.url"; - - /** - * 美天平台 - */ - public static final String MEITIAN_API_BASE_URL = "meitian.api.base.url"; - - - /** - * km-api基本url - */ - public static final String KM_API_BASE_URL_LOGIN = "km.api.base.url"; - /** - * km-api基本登录url - */ - public static final String KM_API_BASE_LOGIN_URL = "km.api.base.login.url"; - /** * 服务 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 225e41b..3326c1d 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 @@ -2,9 +2,7 @@ package com.ff.game.api.km.impl; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; -import com.alibaba.druid.support.json.JSONUtils; import com.ff.base.constant.CacheConstants; -import com.ff.base.constant.ConfigConstants; import com.ff.base.constant.Constants; import com.ff.base.core.redis.RedisCache; import com.ff.base.enums.*; @@ -15,14 +13,9 @@ import com.ff.base.utils.DateUtils; import com.ff.base.utils.JsonUtil; import com.ff.base.utils.StringUtils; import com.ff.base.utils.ip.IpUtils; -import com.ff.base.utils.sign.Md5Utils; import com.ff.base.utils.uuid.IdUtils; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; -import com.ff.game.api.dg.dto.DGBetRecordResponseDTO; -import com.ff.game.api.dg.dto.DGResponse; -import com.ff.game.api.dg.dto.DGUserListResponseDTO; -import com.ff.game.api.jili.dto.JILIGamesDataDTO; import com.ff.game.api.km.client.KMClient; import com.ff.game.api.km.dto.*; import com.ff.game.api.request.*; @@ -57,6 +50,8 @@ import java.util.stream.Collectors; @Slf4j public class GamesKMServiceImpl implements IGamesService { + @Resource + private IPlatformService platformService; @Resource private ISysConfigService configService; @@ -235,10 +230,10 @@ public class GamesKMServiceImpl implements IGamesService { kmUserToken = redisCache.getCacheObject(CacheConstants.KM_USER_TOKEN + gamesLogin.getAccount()); } + String loginUrl = platformService.get(GamePlatforms.KM.getCode()).getUrlInfo().getLoginUrl(); + //String selectConfigByKey = configService.selectConfigByKey(Constants.KM_API_BASE_LOGIN_URL); - String selectConfigByKey = configService.selectConfigByKey(Constants.KM_API_BASE_LOGIN_URL); - - return selectConfigByKey + "/gamelauncher?gpcode=" + gamesLogin.getGameType() + return loginUrl + "/gamelauncher?gpcode=" + gamesLogin.getGameType() + "&gcode=" + gamesLogin.getGameId() + "&token=" + kmUserToken + "&lang=" + gamesLogin.getLang(); @@ -569,7 +564,7 @@ public class GamesKMServiceImpl implements IGamesService { if (ObjectUtils.isEmpty(kickMember.getErrorCode()) || this.getIsSuccess(kickMember.getErrorCode())) { redisCache.deleteObject(CacheConstants.KM_USER_TOKEN + kickMemberRequestDTO.getAccount()); return kickMember.isSuccess(); - }else { + } else { throw new BaseException(kickMember.getDescription()); } } @@ -618,9 +613,10 @@ public class GamesKMServiceImpl implements IGamesService { log.info("GamesKMServiceImpl [gameDemoLogin] 请求参数 {}", gameDemoLoginRequestDTO); Map params = new LinkedHashMap<>(); params.put("lang", gameDemoLoginRequestDTO.getLang()); - String selectConfigByKey = configService.selectConfigByKey(Constants.KM_API_BASE_LOGIN_URL); + String loginUrl = platformService.get(GamePlatforms.KM.getCode()).getUrlInfo().getLoginUrl(); + //String selectConfigByKey = configService.selectConfigByKey(Constants.KM_API_BASE_LOGIN_URL); return GameDemoLoginResponseDTO.builder() - .url(selectConfigByKey + "/demolauncher?gpcode=" + gameDemoLoginRequestDTO.getGameType() + .url(loginUrl + "/demolauncher?gpcode=" + gameDemoLoginRequestDTO.getGameType() + "&gcode=" + gameDemoLoginRequestDTO.getGameId() + "&lang=" + gameDemoLoginRequestDTO.getLang()) .build(); @@ -683,16 +679,17 @@ public class GamesKMServiceImpl implements IGamesService { return null; } List gamesDatas = redisCache.getCacheList(CacheConstants.KM_GAMES); - Map dataDTOMap = gamesDatas.stream() .collect(Collectors.toMap( + Map dataDTOMap = gamesDatas.stream().collect(Collectors.toMap( KMGameResponse.Game::getCode, e -> e, (existing, replacement) -> existing - ));; + )); + ; KMGameResponse.Game gamesDataDTO = dataDTOMap.get(resultBean.getGCode()); //输赢状态 Integer gameStatus = GameStatus.FLAT.getCode(); - BigDecimal payoffAmount =NumberUtil.sub(resultBean.getWinAmount(), resultBean.getRiskAmount().abs()); + BigDecimal payoffAmount = NumberUtil.sub(resultBean.getWinAmount(), resultBean.getRiskAmount().abs()); if (payoffAmount.compareTo(BigDecimal.ZERO) > 0) { gameStatus = GameStatus.WIN.getCode(); } else if (payoffAmount.compareTo(BigDecimal.ZERO) < 0) { From 22b613ece010a5cf426cded50e697c18166fb5c4 Mon Sep 17 00:00:00 2001 From: cengy Date: Thu, 3 Apr 2025 14:34:49 +0800 Subject: [PATCH 24/62] =?UTF-8?q?refactor(ff-game):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=20API=20=E6=8E=A7=E5=88=B6=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除了对 GameSecretKeyCurrencyDTO 和 GameSecretKeyLangDTO 的依赖- 引入了 Platform 和 KeyInfo 类 - 优化了货币和语言的处理逻辑 -简化了游戏平台的配置和访问 - 调整了线程池的使用方式 --- .../ff/api/controller/ApiGameController.java | 463 +++++++++++++----- .../api/controller/ApiMemberController.java | 156 ++++-- .../ff/api/request/GameDemoLoginRequest.java | 6 + .../meitian/impl/MeiTianGameServiceImpl.java | 35 +- .../ng/service/impl/GamesPGServiceImpl.java | 11 +- .../game/api/request/GamesBaseRequestDTO.java | 9 +- .../xk/service/impl/GamesXKServiceImpl.java | 3 +- .../java/com/ff/game/domain/CurrencyInfo.java | 3 +- .../main/java/com/ff/game/domain/Game.java | 49 +- .../java/com/ff/quartz/task/GameTask.java | 2 +- 10 files changed, 502 insertions(+), 235 deletions(-) diff --git a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java index 0c29474..2d5ee20 100644 --- a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java +++ b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java @@ -9,12 +9,14 @@ import com.ff.base.constant.Constants; import com.ff.base.core.controller.BaseController; import com.ff.base.core.domain.AjaxResult; import com.ff.base.core.page.TableDataInfo; -import com.ff.base.enums.*; +import com.ff.base.enums.ErrorCode; +import com.ff.base.enums.GamePlatforms; +import com.ff.base.enums.TransferType; import com.ff.base.exception.base.ApiException; import com.ff.base.exception.base.BaseException; +import com.ff.base.system.domain.TenantSecretKey; import com.ff.base.utils.StringUtils; import com.ff.base.utils.bean.BeanUtils; -import com.ff.base.system.domain.TenantSecretKey; import com.ff.common.dto.GameBalanceExchange; import com.ff.common.service.ITenantGameQuotaFlowService; import com.ff.common.service.ITenantGameQuotaService; @@ -23,18 +25,16 @@ import com.ff.game.api.IGamesService; import com.ff.game.api.request.*; import com.ff.game.domain.*; import com.ff.game.dto.GameBettingDetailsDTO; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; -import com.ff.game.dto.GameSecretKeyLangDTO; import com.ff.game.service.*; import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; import com.github.pagehelper.PageHelper; +import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; import org.springframework.validation.annotation.Validated; @@ -45,10 +45,12 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.math.BigDecimal; -import java.util.*; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Future; -import java.util.stream.Collectors; /** * api控制器 @@ -74,16 +76,9 @@ public class ApiGameController extends BaseController { @Resource private KeyConfig keyConfig; - @Resource - private IGameSecretKeyService gameSecretKeyService; - @Resource private IMemberService memberService; - @Resource - private IGamePlatformService gamePlatformService; - - @Resource private ITenantGameQuotaService tenantGameQuotaService; @@ -98,17 +93,12 @@ public class ApiGameController extends BaseController { @Resource private IGameExchangeMoneyService gameExchangeMoneyService; - @Resource - private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; - - - @Resource - private IGameSecretKeyLangService gameSecretKeyLangService; - @Autowired @Qualifier("threadPoolTaskExecutor") private ThreadPoolTaskExecutor threadPoolTaskExecutor; + @Resource + private IPlatformService platformService; /** * 列表 @@ -118,11 +108,20 @@ public class ApiGameController extends BaseController { @PostMapping("/list") public AjaxResult list() { List gameResponses = gameService.selectGameResponseList(); - for (GameResponse gameRespons : gameResponses) { + for (GameResponse gameResponse : gameResponses) { + Platform platform = platformService.get(gameResponse.getPlatformCode()); + if (null == platform) { + continue; + } +// List gameSecretKeyCurrencies = +// gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList( +// GameSecretKeyCurrencyDTO.builder().platformCode(gameResponse.getPlatformCode()) +// .build() +// ); +// List currencyCode = gameSecretKeyCurrencies.stream().map(GameSecretKeyCurrencyDTO::getSystemCurrency).collect(Collectors.toList()); - List gameSecretKeyCurrencies = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO.builder().platformCode(gameRespons.getPlatformCode()).build()); - List currencyCode = gameSecretKeyCurrencies.stream().map(GameSecretKeyCurrencyDTO::getSystemCurrency).collect(Collectors.toList()); - gameRespons.setCurrencyCode(currencyCode); + List currencyCode = new ArrayList<>(platform.getCurrencyInfo().keySet()); + gameResponse.setCurrencyCode(currencyCode); } return AjaxResult.success(gameResponses); } @@ -131,50 +130,67 @@ public class ApiGameController extends BaseController { /** * 登录 * - * @param memberCreateApiRequest 成员创建api请求 + * @param loginRequest 登入游戏 * @return {@link AjaxResult } */ @PostMapping("/login") - public AjaxResult login(@Validated @RequestBody GameLoginRequest memberCreateApiRequest) { + public AjaxResult login(@Validated @RequestBody GameLoginRequest loginRequest) { - Game game = gameService.selectGameById(memberCreateApiRequest.getGameId()); + Game game = gameService.selectGameById(loginRequest.getGameId()); ApiException.notNull(game, ErrorCode.GAME_NOT_EXIST.getCode()); - GamePlatform gamePlatform = gamePlatformService.selectGamePlatformById(game.getPlatformId()); - ApiException.notNull(gamePlatform, ErrorCode.PLATFORM_NOT_EXIST.getCode()); + Platform platform = platformService.get(game.getPlatformCode()); + ApiException.notNull(platform, ErrorCode.PLATFORM_NOT_EXIST.getCode()); + IGamesService iGamesService = gamesService.get(platform.getPlatformCode() + Constants.SERVICE); + ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode()); + + String targetCurrency = platform.getCurrencyInfo().get(loginRequest.getCurrencyCode()); + ApiException.notNull(targetCurrency, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + + KeyInfo keyInfo = null; + for (KeyInfo keyData : platform.getKeyInfo()) { + if (StringUtils.isNotEmpty(loginRequest.getCurrencyCode())) { + if (keyData.getCurrency().equalsIgnoreCase(loginRequest.getCurrencyCode())) { + keyInfo = keyData; + break; + } + } + } + ApiException.notNull(keyInfo, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + + 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()); - IGamesService iGamesService = gamesService.get(gamePlatform.getPlatformCode() + Constants.SERVICE); - - - 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(memberCreateApiRequest.getAccount(), memberCreateApiRequest.getCurrencyCode(), gamePlatform.getPlatformCode()); + Member member = memberService.selectMemberByAccount(loginRequest.getAccount(), loginRequest.getCurrencyCode(), platform.getPlatformCode()); ApiException.notNull(member, ErrorCode.ACCOUNT_NOT_EXIST.getCode()); GamesLogin gamesLogin = GamesLogin.builder() - .agentId(secretKeyCurrencyDTO.getCode()) - .agentKey(secretKeyCurrencyDTO.getKey()) + .agentId(keyInfo.getCode()) + .agentKey(keyInfo.getKey()) .account(member.getGameAccount()) .gameType(game.getGameSourceType()) - .currency(secretKeyCurrencyDTO.getCurrency()) + .currency(/*secretKeyCurrencyDTO.getCurrency()*/targetCurrency) .gameId(game.getGameCode()) - .homeUrl(memberCreateApiRequest.getHomeUrl()) - .betLimit(memberCreateApiRequest.getBetLimit()) - .platform(memberCreateApiRequest.getPlatform()) - .disableFullScreen(memberCreateApiRequest.getDisableFullScreen()) - .lang(gameSecretKeyLangDTO.getLang()) + .homeUrl(loginRequest.getHomeUrl()) + .betLimit(loginRequest.getBetLimit()) + .platform(loginRequest.getPlatform()) + .disableFullScreen(loginRequest.getDisableFullScreen()) + .lang(/*gameSecretKeyLangDTO.getLang()*/ targetLang) + .vendor(platform) + .keyInfo(keyInfo) .build(); String login = iGamesService.loginWithoutRedirect(gamesLogin); @@ -193,17 +209,33 @@ public class ApiGameController extends BaseController { @Transactional public AjaxResult exchangeBalance(@Validated @RequestBody GameExchangeBalanceRequest gameExchangeBalanceRequest) { - IGamesService iGamesService = gamesService.get(gameExchangeBalanceRequest.getPlatformCode() + Constants.SERVICE); ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode()); TenantSecretKey tenantSecretKey = keyConfig.get(); - GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCode(gameExchangeBalanceRequest.getPlatformCode()) - .systemCurrency(gameExchangeBalanceRequest.getCurrencyCode()).build()); +// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCode(gameExchangeBalanceRequest.getPlatformCode()) +// .systemCurrency(gameExchangeBalanceRequest.getCurrencyCode()).build()); +// +// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); - ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + Platform platform = platformService.get(gameExchangeBalanceRequest.getPlatformCode()); + ApiException.notNull(platform, ErrorCode.PLATFORM_NOT_EXIST.getCode()); + + String targetCurrency = platform.getCurrencyInfo().get(gameExchangeBalanceRequest.getCurrencyCode()); + ApiException.notNull(targetCurrency, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + + KeyInfo keyInfo = null; + for (KeyInfo keyData : platform.getKeyInfo()) { + if (StringUtils.isNotEmpty(gameExchangeBalanceRequest.getCurrencyCode())) { + if (keyData.getCurrency().equalsIgnoreCase(gameExchangeBalanceRequest.getCurrencyCode())) { + keyInfo = keyData; + break; + } + } + } + ApiException.notNull(keyInfo, ErrorCode.CURRENCY_NOT_EXIST.getCode()); BigDecimal quota = tenantGameQuotaService.gameBalanceExchange(GameBalanceExchange.builder() .platformCode(gameExchangeBalanceRequest.getPlatformCode()) @@ -222,15 +254,17 @@ public class ApiGameController extends BaseController { //操作第三方额度接口 ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO = ExchangeTransferMoneyRequestDTO.builder() - .agentId(gameSecretKey.getCode()) - .agentKey(gameSecretKey.getKey()) + .agentId(keyInfo.getCode()) + .agentKey(keyInfo.getKey()) .orderId(gameExchangeBalanceRequest.getOrderId()) .account(member.getGameAccount()) - .currency(gameSecretKey.getCurrency()) + .currency(/*gameSecretKey.getCurrency()*/targetCurrency) .tenantKey(tenantSecretKey.getTenantKey()) .quota(quota) .amount(gameExchangeBalanceRequest.getAmount()) .transferType(gameExchangeBalanceRequest.getTransferType()) + .vendor(platform) + .keyInfo(keyInfo) .build(); Long exchangeTransferId = iGamesService.exchangeTransferByAgentId(exchangeTransferMoneyRequestDTO); GameExchangeMoney gameExchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferId); @@ -276,12 +310,27 @@ public class ApiGameController extends BaseController { ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode()); - TenantSecretKey tenantSecretKey = keyConfig.get(); - GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCode(gameCreateFreeSpinRequest.getPlatformCode()) - .systemCurrency(gameCreateFreeSpinRequest.getCurrencyCode()).build()); - ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); +// TenantSecretKey tenantSecretKey = keyConfig.get(); +// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCode(gameCreateFreeSpinRequest.getPlatformCode()) +// .systemCurrency(gameCreateFreeSpinRequest.getCurrencyCode()).build()); +// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + Platform platform = platformService.get(gameCreateFreeSpinRequest.getPlatformCode()); + ApiException.notNull(platform, ErrorCode.PLATFORM_NOT_EXIST.getCode()); + String targetCurrency = platform.getCurrencyInfo().get(gameCreateFreeSpinRequest.getCurrencyCode()); + ApiException.notNull(targetCurrency, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + + KeyInfo keyInfo = null; + for (KeyInfo keyData : platform.getKeyInfo()) { + if (StringUtils.isNotEmpty(gameCreateFreeSpinRequest.getCurrencyCode())) { + if (keyData.getCurrency().equalsIgnoreCase(gameCreateFreeSpinRequest.getCurrencyCode())) { + keyInfo = keyData; + break; + } + } + } + ApiException.notNull(keyInfo, ErrorCode.CURRENCY_NOT_EXIST.getCode()); Member member = memberService.selectMemberByAccount(gameCreateFreeSpinRequest.getAccount(), gameCreateFreeSpinRequest.getCurrencyCode(), gameCreateFreeSpinRequest.getPlatformCode()); ApiException.notNull(member, ErrorCode.ACCOUNT_NOT_EXIST.getCode()); @@ -289,15 +338,17 @@ public class ApiGameController extends BaseController { CreateFreeSpinRequestDTO createFreeSpinRequestDTO = CreateFreeSpinRequestDTO.builder() .account(member.getGameAccount()) - .currency(gameCreateFreeSpinRequest.getCurrencyCode()) - .agentId(gameSecretKey.getCode()) - .agentKey(gameSecretKey.getKey()) + .currency(/*gameCreateFreeSpinRequest.getCurrencyCode()*/targetCurrency) + .agentId(keyInfo.getCode()) + .agentKey(keyInfo.getKey()) .referenceId(gameCreateFreeSpinRequest.getReferenceId()) .freeSpinValidity(gameCreateFreeSpinRequest.getFreeSpinValidity()) .numberOfRounds(gameCreateFreeSpinRequest.getNumberOfRounds()) .gameIds(gameCreateFreeSpinRequest.getGameIds()) .betValue(gameCreateFreeSpinRequest.getBetValue()) .startTime(gameCreateFreeSpinRequest.getStartTime()) + .vendor(platform) + .keyInfo(keyInfo) .build(); @@ -350,32 +401,52 @@ public class ApiGameController extends BaseController { */ @PostMapping("/get/detail") public AjaxResult getDetail(@Validated @RequestBody GameGetDetailRequest gameGetDetailRequest) { + Platform platform = platformService.get(gameGetDetailRequest.getPlatformCode()); + ApiException.notNull(platform, ErrorCode.PLATFORM_NOT_EXIST.getCode()); + + String targetCurrency = platform.getCurrencyInfo().get(gameGetDetailRequest.getCurrencyCode()); + ApiException.notNull(targetCurrency, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + + KeyInfo keyInfo = null; + for (KeyInfo keyData : platform.getKeyInfo()) { + if (StringUtils.isNotEmpty(gameGetDetailRequest.getCurrencyCode())) { + if (keyData.getCurrency().equalsIgnoreCase(gameGetDetailRequest.getCurrencyCode())) { + keyInfo = keyData; + break; + } + } + } + ApiException.notNull(keyInfo, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + + String targetLang = platform.getLangInfo().get(gameGetDetailRequest.getLangCode()); + ApiException.notNull(targetLang, ErrorCode.LANG_NOT_EXIST.getCode()); + +// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCode(gameGetDetailRequest.getPlatformCode()) +// .systemCurrency(gameGetDetailRequest.getCurrencyCode()).build()); - GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCode(gameGetDetailRequest.getPlatformCode()) - .systemCurrency(gameGetDetailRequest.getCurrencyCode()).build()); - - - ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); +// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); IGamesService iGamesService = gamesService.get(gameGetDetailRequest.getPlatformCode() + Constants.SERVICE); ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode()); - GameSecretKeyLangDTO gameSecretKeyLang = gameSecretKeyLangService.findGameSecretKeyLangDTO(GameSecretKeyLangDTO.builder() - .platformCode(gameGetDetailRequest.getPlatformCode()) - .systemLangCode(gameGetDetailRequest.getLangCode()) - .build()); - ApiException.notNull(gameSecretKeyLang, ErrorCode.LANG_NOT_EXIST.getCode()); +// GameSecretKeyLangDTO gameSecretKeyLang = gameSecretKeyLangService.findGameSecretKeyLangDTO(GameSecretKeyLangDTO.builder() +// .platformCode(gameGetDetailRequest.getPlatformCode()) +// .systemLangCode(gameGetDetailRequest.getLangCode()) +// .build()); +// ApiException.notNull(gameSecretKeyLang, ErrorCode.LANG_NOT_EXIST.getCode()); GetGameDetailResponseDTO gameDetail = iGamesService.getGameDetail(GetGameDetailRequestDTO.builder() .wagersId(gameGetDetailRequest.getWagersId()) - .lang(gameSecretKeyLang.getLang()) - .agentId(gameSecretKey.getCode()) - .agentKey(gameSecretKey.getKey()) + .lang(/*gameSecretKeyLang.getLang()*/targetLang) + .agentId(keyInfo.getCode()) + .agentKey(keyInfo.getKey()) + .vendor(platform) + .keyInfo(keyInfo) .build()); return AjaxResult.success(gameDetail); } @@ -388,44 +459,80 @@ public class ApiGameController extends BaseController { */ @PostMapping("/kick/member") public AjaxResult kickMember(@Validated @RequestBody GameKickMemeberRequest gameKickMemeberRequest) { - GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCode(gameKickMemeberRequest.getPlatformCode()) - .systemCurrency(gameKickMemeberRequest.getCurrencyCode()).build()); - ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); +// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCode(gameKickMemeberRequest.getPlatformCode()) +// .systemCurrency(gameKickMemeberRequest.getCurrencyCode()).build()); +// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + Platform platform = platformService.get(gameKickMemeberRequest.getPlatformCode()); + ApiException.notNull(platform, ErrorCode.PLATFORM_NOT_EXIST.getCode()); - Member member = memberService.selectMemberByAccount(gameKickMemeberRequest.getAccount(), gameKickMemeberRequest.getCurrencyCode(), gameKickMemeberRequest.getPlatformCode()); - ApiException.notNull(member, ErrorCode.ACCOUNT_NOT_EXIST.getCode()); + String targetCurrency = platform.getCurrencyInfo().get(gameKickMemeberRequest.getCurrencyCode()); + ApiException.notNull(targetCurrency, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + + KeyInfo keyInfo = null; + for (KeyInfo keyData : platform.getKeyInfo()) { + if (StringUtils.isNotEmpty(gameKickMemeberRequest.getCurrencyCode())) { + if (keyData.getCurrency().equalsIgnoreCase(gameKickMemeberRequest.getCurrencyCode())) { + keyInfo = keyData; + break; + } + } + } + ApiException.notNull(keyInfo, ErrorCode.CURRENCY_NOT_EXIST.getCode()); IGamesService iGamesService = gamesService.get(gameKickMemeberRequest.getPlatformCode() + Constants.SERVICE); ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode()); + Member member = memberService.selectMemberByAccount(gameKickMemeberRequest.getAccount(), gameKickMemeberRequest.getCurrencyCode(), gameKickMemeberRequest.getPlatformCode()); + ApiException.notNull(member, ErrorCode.ACCOUNT_NOT_EXIST.getCode()); + return AjaxResult.success(iGamesService.kickMember(KickMemberRequestDTO.builder() .account(member.getGameAccount()) - .agentId(gameSecretKey.getCode()) - .currency(gameSecretKey.getCurrency()) - .agentKey(gameSecretKey.getKey()) + .agentId(keyInfo.getCode()) + .currency(targetCurrency) + .agentKey(keyInfo.getKey()) + .vendor(platform) + .keyInfo(keyInfo) .build())); } @PostMapping("/kick/member/all") public AjaxResult kickMemberAll(@Validated @RequestBody GameKickMemeberAllRequest gameKickMemeberAllRequest) { - GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCode(gameKickMemeberAllRequest.getPlatformCode()) - .systemCurrency(gameKickMemeberAllRequest.getCurrencyCode()).build()); +// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCode(gameKickMemeberAllRequest.getPlatformCode()) +// .systemCurrency(gameKickMemeberAllRequest.getCurrencyCode()).build()); +// +// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + Platform platform = platformService.get(gameKickMemeberAllRequest.getPlatformCode()); + ApiException.notNull(platform, ErrorCode.PLATFORM_NOT_EXIST.getCode()); - ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + String targetCurrency = platform.getCurrencyInfo().get(gameKickMemeberAllRequest.getCurrencyCode()); + ApiException.notNull(targetCurrency, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + + KeyInfo keyInfo = null; + for (KeyInfo keyData : platform.getKeyInfo()) { + if (StringUtils.isNotEmpty(gameKickMemeberAllRequest.getCurrencyCode())) { + if (keyData.getCurrency().equalsIgnoreCase(gameKickMemeberAllRequest.getCurrencyCode())) { + keyInfo = keyData; + break; + } + } + } + ApiException.notNull(keyInfo, ErrorCode.CURRENCY_NOT_EXIST.getCode()); IGamesService iGamesService = gamesService.get(gameKickMemeberAllRequest.getPlatformCode() + Constants.SERVICE); ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode()); KickMemberAllDTO kickMemberAllDTO = KickMemberAllDTO.builder() - .agentId(gameSecretKey.getCode()) - .agentKey(gameSecretKey.getKey()) - .currency(gameSecretKey.getCurrency()) + .agentId(keyInfo.getCode()) + .agentKey(keyInfo.getKey()) + .currency(/*gameSecretKey.getCurrency()*/targetCurrency) + .vendor(platform) + .keyInfo(keyInfo) .build(); if (!ObjectUtils.isEmpty(gameKickMemeberAllRequest.getGameId())) { Game game = gameService.selectGameById(gameKickMemeberAllRequest.getGameId()); @@ -474,23 +581,42 @@ public class ApiGameController extends BaseController { /** * 取消自由旋转 * - * @param gameGetFreeSpinDashflowRequest 游戏获得免费旋转dashflow请求 + * @param request 游戏获得免费旋转dashflow请求 * @return {@link TableDataInfo } */ @PostMapping("/cancel/free/spin") - public AjaxResult cancelFreeSpin(@Validated @RequestBody GameCancelFreeSpinRequest gameGetFreeSpinDashflowRequest) { - GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCode(gameGetFreeSpinDashflowRequest.getPlatformCode()) - .systemCurrency(gameGetFreeSpinDashflowRequest.getCurrencyCode()).build()); - ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + public AjaxResult cancelFreeSpin(@Validated @RequestBody GameCancelFreeSpinRequest request) { +// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCode(gameGetFreeSpinDashflowRequest.getPlatformCode()) +// .systemCurrency(gameGetFreeSpinDashflowRequest.getCurrencyCode()).build()); +// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); - IGamesService iGamesService = gamesService.get(gameGetFreeSpinDashflowRequest.getPlatformCode() + Constants.SERVICE); + Platform platform = platformService.get(request.getPlatformCode()); + ApiException.notNull(platform, ErrorCode.PLATFORM_NOT_EXIST.getCode()); + + String targetCurrency = platform.getCurrencyInfo().get(request.getCurrencyCode()); + ApiException.notNull(targetCurrency, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + + KeyInfo keyInfo = null; + for (KeyInfo keyData : platform.getKeyInfo()) { + if (StringUtils.isNotEmpty(request.getCurrencyCode())) { + if (keyData.getCurrency().equalsIgnoreCase(request.getCurrencyCode())) { + keyInfo = keyData; + break; + } + } + } + ApiException.notNull(keyInfo, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + + IGamesService iGamesService = gamesService.get(request.getPlatformCode() + Constants.SERVICE); ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode()); Boolean cancelFreeSpin = iGamesService.cancelFreeSpin(CancelFreeSpinRequestDTO.builder() - .agentId(gameSecretKey.getCode()) - .agentKey(gameSecretKey.getKey()) - .referenceId(gameGetFreeSpinDashflowRequest.getReferenceId()) + .agentId(keyInfo.getCode()) + .agentKey(keyInfo.getKey()) + .referenceId(request.getReferenceId()) + .vendor(platform) + .keyInfo(keyInfo) .build()); return AjaxResult.success(cancelFreeSpin); } @@ -498,45 +624,79 @@ public class ApiGameController extends BaseController { /** * 信息全部 * - * @param gameExchangeBalanceAllRequest 成员信息所有api请求 + * @param request 成员信息所有api请求 * @return {@link AjaxResult } */ @PostMapping("/exchange/balance/all") - public AjaxResult exchangeBalanceAll(@Validated @RequestBody GameExchangeBalanceAllRequest gameExchangeBalanceAllRequest) { + public AjaxResult exchangeBalanceAll(@Validated @RequestBody GameExchangeBalanceAllRequest request) { TenantSecretKey tenantSecretKey = keyConfig.get(); - List gameSecretKeys = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO.builder() - .systemCurrency(gameExchangeBalanceAllRequest.getCurrencyCode()).build()); +// List gameSecretKeys = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO.builder() +// .systemCurrency(gameExchangeBalanceAllRequest.getCurrencyCode()).build()); + List keys = new ArrayList<>(); + for (GamePlatforms platformEnum : GamePlatforms.values()) { + + Platform platform = platformService.get(platformEnum.getCode()); + String targetCurrency = platform.getCurrencyInfo().get(request.getCurrencyCode()); + if (StringUtils.isEmpty(targetCurrency)) { + continue; + } + KeyInfo keyInfo = null; + for (KeyInfo keyData : platform.getKeyInfo()) { + if (StringUtils.isNotEmpty(request.getCurrencyCode())) { + if (keyData.getCurrency().equalsIgnoreCase(request.getCurrencyCode())) { + keyInfo = keyData; + break; + } + } + } + if (null == keyInfo) { + continue; + } + + Key key = new Key(); + key.setPlatformCode(platform.getPlatformCode()); + key.setCode(keyInfo.getCode()); + key.setKey(keyInfo.getKey()); + key.setCurrency(targetCurrency); + key.setPlatform(platform); + key.setKeyInfo(keyInfo); + keys.add(key); + } + // 创建线程池 Map balanceMap = new LinkedHashMap<>(); - CountDownLatch latch = new CountDownLatch(gameSecretKeys.size()); + CountDownLatch latch = new CountDownLatch(keys.size()); // 使用List存储Future对象,用于获取异步执行的结果 List> futures = new ArrayList<>(); // 提交异步任务到线程池 - for (GameSecretKeyCurrencyDTO gameSecretKeyCurrencyDTO : gameSecretKeys) { +// for (GameSecretKeyCurrencyDTO gameSecretKeyCurrencyDTO : gameSecretKeys) { + for (Key key : keys) { futures.add(threadPoolTaskExecutor.submit(() -> { try { - IGamesService iGamesService = gamesService.get(gameSecretKeyCurrencyDTO.getPlatformCode() + Constants.SERVICE); + IGamesService iGamesService = gamesService.get(key.getPlatformCode() + Constants.SERVICE); - Member member = memberService.selectMemberByAccount(gameExchangeBalanceAllRequest.getAccount(), gameExchangeBalanceAllRequest.getCurrencyCode(), gameSecretKeyCurrencyDTO.getPlatformCode()); + Member member = memberService.selectMemberByAccount(request.getAccount(), request.getCurrencyCode(), key.getPlatformCode()); ApiException.notNull(member, ErrorCode.ACCOUNT_NOT_EXIST.getCode()); //操作第三方钱包 ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO = ExchangeTransferMoneyRequestDTO.builder() - .agentId(gameSecretKeyCurrencyDTO.getCode()) - .agentKey(gameSecretKeyCurrencyDTO.getKey()) - .orderId(gameExchangeBalanceAllRequest.getOrderId()) + .agentId(key.getCode()) + .agentKey(key.getKey()) + .orderId(request.getOrderId()) .amount(BigDecimal.ONE) - .currency(gameSecretKeyCurrencyDTO.getCurrency()) + .currency(/*gameSecretKeyCurrencyDTO.getCurrency()*/key.currency) .tenantKey(tenantSecretKey.getTenantKey()) .account(member.getGameAccount()) + .vendor(key.getPlatform()) + .keyInfo(key.getKeyInfo()) .transferType(TransferType.ALL.getCode()) .build(); return iGamesService.exchangeTransferByAgentId(exchangeTransferMoneyRequestDTO); @@ -571,7 +731,7 @@ public class ApiGameController extends BaseController { tenantGameQuotaService.gameBalanceExchange(GameBalanceExchange.builder() .platformCode(gameExchangeMoney.getPlatformCode()) .currencyCode(gameExchangeMoney.getCurrencyCode()) - .sourceId(gameExchangeBalanceAllRequest.getOrderId()) + .sourceId(request.getOrderId()) .transferType(TransferType.ALL.getCode()) .amount(gameExchangeMoney.getBalance()) .account(member.getMemberAccount()) @@ -593,33 +753,54 @@ public class ApiGameController extends BaseController { /** * 演示登录 * - * @param gameDemoLoginRequest 游戏演示登录请求 + * @param request 游戏演示登录请求 * @return {@link AjaxResult } */ @PostMapping("/demo/login") - public AjaxResult demoLogin(@Validated @RequestBody GameDemoLoginRequest gameDemoLoginRequest) { + public AjaxResult demoLogin(@Validated @RequestBody GameDemoLoginRequest request) { - Game game = gameService.selectGameById(gameDemoLoginRequest.getGameId()); + Game game = gameService.selectGameById(request.getGameId()); ApiException.notNull(game, ErrorCode.GAME_NOT_EXIST.getCode()); - GamePlatform gamePlatform = gamePlatformService.selectGamePlatformById(game.getPlatformId()); - ApiException.notNull(gamePlatform, ErrorCode.PLATFORM_NOT_EXIST.getCode()); + //GamePlatform gamePlatform = gamePlatformService.selectGamePlatformById(game.getPlatformId()); + //ApiException.notNull(gamePlatform, ErrorCode.PLATFORM_NOT_EXIST.getCode()); + Platform platform = platformService.get(game.getPlatformCode()); + ApiException.notNull(platform, ErrorCode.PLATFORM_NOT_EXIST.getCode()); - IGamesService iGamesService = gamesService.get(gamePlatform.getPlatformCode() + Constants.SERVICE); + IGamesService iGamesService = gamesService.get(platform.getPlatformCode() + Constants.SERVICE); + ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode()); + String targetCurrency = platform.getCurrencyInfo().get(request.getCurrencyCode()); + ApiException.notNull(targetCurrency, ErrorCode.CURRENCY_NOT_EXIST.getCode()); - GameSecretKeyLangDTO gameSecretKeyLangDTO = gameSecretKeyLangService.findGameSecretKeyLangDTO(GameSecretKeyLangDTO.builder() - .platformCode(gamePlatform.getPlatformCode()) - .systemLangCode(gameDemoLoginRequest.getLangCode()) - .build()); - ApiException.notNull(gameSecretKeyLangDTO, ErrorCode.LANG_NOT_EXIST.getCode()); + KeyInfo keyInfo = null; + for (KeyInfo keyData : platform.getKeyInfo()) { + if (StringUtils.isNotEmpty(request.getCurrencyCode())) { + if (keyData.getCurrency().equalsIgnoreCase(request.getCurrencyCode())) { + keyInfo = keyData; + break; + } + } + } + ApiException.notNull(keyInfo, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + + String targetLang = platform.getLangInfo().get(request.getLangCode()); + ApiException.notNull(targetLang, ErrorCode.LANG_NOT_EXIST.getCode()); + +// GameSecretKeyLangDTO gameSecretKeyLangDTO = gameSecretKeyLangService.findGameSecretKeyLangDTO(GameSecretKeyLangDTO.builder() +// .platformCode(gamePlatform.getPlatformCode()) +// .systemLangCode(gameDemoLoginRequest.getLangCode()) +// .build()); +// ApiException.notNull(gameSecretKeyLangDTO, ErrorCode.LANG_NOT_EXIST.getCode()); GameDemoLoginRequestDTO gamesLogin = GameDemoLoginRequestDTO.builder() .gameId(game.getGameCode()) .gameType(game.getGameSourceType()) - .lang(gameSecretKeyLangDTO.getLang()) + .lang(/*gameSecretKeyLangDTO.getLang()*/targetLang) + .vendor(platform) + .keyInfo(keyInfo) .build(); GameDemoLoginResponseDTO gameDemoLoginResponseDTO = iGamesService.gameDemoLogin(gamesLogin); @@ -627,4 +808,14 @@ public class ApiGameController extends BaseController { BeanUtils.copyProperties(gameDemoLoginResponseDTO, gameDemoLoginResponse); return AjaxResult.success(gameDemoLoginResponse); } + + @Data + class Key { + private String platformCode; + private String code; + private String currency; + private String key; + private Platform platform; + private KeyInfo keyInfo; + } } 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 0a7454b..50a08a8 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 @@ -11,20 +11,22 @@ import com.ff.base.constant.Constants; import com.ff.base.core.controller.BaseController; import com.ff.base.core.domain.AjaxResult; import com.ff.base.enums.ErrorCode; +import com.ff.base.enums.GamePlatforms; import com.ff.base.exception.base.ApiException; import com.ff.base.exception.base.BaseException; -import com.ff.base.utils.StringUtils; import com.ff.base.system.domain.TenantSecretKey; +import com.ff.base.utils.StringUtils; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; -import com.ff.game.api.request.*; -import com.ff.game.domain.GameSecretKey; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; -import com.ff.game.service.IGameSecretKeyCurrencyService; -import com.ff.game.service.IGameSecretKeyService; -import com.ff.game.service.IGameService; +import com.ff.game.api.request.CreateMemberRequestDTO; +import com.ff.game.api.request.MemberInfoRequestDTO; +import com.ff.game.api.request.MemberInfoResponseDTO; +import com.ff.game.domain.KeyInfo; +import com.ff.game.domain.Platform; +import com.ff.game.service.IPlatformService; import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; +import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -32,10 +34,12 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.math.BigDecimal; @@ -58,31 +62,21 @@ import java.util.concurrent.Future; @Slf4j public class ApiMemberController extends BaseController { - @Autowired private Map gamesService; - - @Resource - private IGameService gameService; - - @Resource private KeyConfig keyConfig; - @Resource - private IGameSecretKeyService gameSecretKeyService; - @Resource private IMemberService memberService; - @Autowired @Qualifier("threadPoolTaskExecutor") private ThreadPoolTaskExecutor threadPoolTaskExecutor; @Resource - private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; + private IPlatformService platformService; /** * 创建成员 @@ -98,24 +92,38 @@ public class ApiMemberController extends BaseController { ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode()); TenantSecretKey tenantSecretKey = keyConfig.get(); - GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCode(memberCreateApiRequest.getPlatformCode()) - .systemCurrency(memberCreateApiRequest.getCurrencyCode()).build()); - ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + Platform platform = platformService.get(memberCreateApiRequest.getPlatformCode()); + ApiException.notNull(platform, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + String targetCurrency = platform.getCurrencyInfo().get(memberCreateApiRequest.getCurrencyCode()); + ApiException.notNull(targetCurrency, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + + KeyInfo keyInfo = null; + for (KeyInfo keyData : platform.getKeyInfo()) { + if (StringUtils.isNotEmpty(memberCreateApiRequest.getCurrencyCode())) { + if (keyData.getCurrency().equalsIgnoreCase(memberCreateApiRequest.getCurrencyCode())) { + keyInfo = keyData; + break; + } + } + } + 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()); // 获取用户信息 Member gameMember = memberService.selectMemberByAccount(memberCreateApiRequest.getAccount(), memberCreateApiRequest.getCurrencyCode(), memberCreateApiRequest.getPlatformCode()); - if (!ObjectUtils.isEmpty(gameMember)){ + if (!ObjectUtils.isEmpty(gameMember)) { throw new ApiException(ErrorCode.GAME_ACCOUNT_CREATION_FAILED.getCode()); } - - //注册本地账号 Member member = Member.builder() .tenantKey(tenantSecretKey.getTenantKey()) @@ -130,11 +138,13 @@ public class ApiMemberController extends BaseController { //向第三方注册账号 CreateMemberRequestDTO gamesBaseRequestDTO = CreateMemberRequestDTO.builder() .account(gameAccount) - .agentId(gameSecretKey.getCode()) - .agentKey(gameSecretKey.getKey()) + .agentId(keyInfo.getCode()) + .agentKey(keyInfo.getKey()) .betLimit(memberCreateApiRequest.getBetLimit()) .platformType(memberCreateApiRequest.getPlatformType()) - .currency(gameSecretKey.getCurrency()) + .currency(targetCurrency) + .vendor(platform) + .keyInfo(keyInfo) .build(); Boolean result = iGamesService.createMember(gamesBaseRequestDTO); Assert.isTrue(result, "建立游戏账号失败"); @@ -146,35 +156,51 @@ public class ApiMemberController extends BaseController { /** * 获取会员信息 * - * @param memberInfoApiRequest 成员信息api请求 + * @param request 成员信息api请求 * @return {@link AjaxResult } */ @PostMapping("/info") - public AjaxResult getMemberInfo(@Validated @RequestBody MemberInfoApiRequest memberInfoApiRequest) { - IGamesService iGamesService = gamesService.get(memberInfoApiRequest.getPlatformCode() + Constants.SERVICE); + public AjaxResult getMemberInfo(@Validated @RequestBody MemberInfoApiRequest request) { + IGamesService iGamesService = gamesService.get(request.getPlatformCode() + Constants.SERVICE); 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()); +// 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()); - ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + String targetCurrency = platform.getCurrencyInfo().get(request.getCurrencyCode()); + ApiException.notNull(targetCurrency, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + KeyInfo keyInfo = null; + for (KeyInfo keyData : platform.getKeyInfo()) { + if (StringUtils.isNotEmpty(request.getCurrencyCode())) { + if (keyData.getCurrency().equalsIgnoreCase(request.getCurrencyCode())) { + keyInfo = keyData; + break; + } + } + } + ApiException.notNull(keyInfo, ErrorCode.CURRENCY_NOT_EXIST.getCode()); // 获取用户信息 - Member member = memberService.selectMemberByAccount(memberInfoApiRequest.getAccount(), memberInfoApiRequest.getCurrencyCode(), memberInfoApiRequest.getPlatformCode()); + Member member = memberService.selectMemberByAccount(request.getAccount(), request.getCurrencyCode(), request.getPlatformCode()); ApiException.notNull(member, ErrorCode.ACCOUNT_NOT_EXIST.getCode()); - //向第三方查询账号 MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder() .accounts(member.getGameAccount()) - .agentId(gameSecretKey.getCode()) - .currency(gameSecretKey.getCurrency()) - .agentKey(gameSecretKey.getKey()) + .agentId(keyInfo.getCode()) + .currency(targetCurrency) + .agentKey(keyInfo.getKey()) + .vendor(platform) + .keyInfo(keyInfo) .build(); MemberInfoResponseDTO memberInfo = iGamesService.getMemberInfo(gamesBaseRequestDTO); MemberInfoResponse memberInfoResponse = new MemberInfoResponse(); @@ -193,22 +219,49 @@ public class ApiMemberController extends BaseController { public AjaxResult infoAll(@Validated @RequestBody MemberInfoAllApiRequest memberInfoAllApiRequest) { +// List gameSecretKeys = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList( +// GameSecretKeyCurrencyDTO.builder() +// .systemCurrency(memberInfoAllApiRequest.getCurrencyCode()).build()); + List keys = new ArrayList<>(); + for (GamePlatforms platformEnum : GamePlatforms.values()) { + Platform platform = platformService.get(platformEnum.getCode()); + String targetCurrency = platform.getCurrencyInfo().get(memberInfoAllApiRequest.getCurrencyCode()); + if (StringUtils.isEmpty(targetCurrency)) { + continue; + } + KeyInfo keyInfo = null; + for (KeyInfo keyData : platform.getKeyInfo()) { + if (StringUtils.isNotEmpty(memberInfoAllApiRequest.getCurrencyCode())) { + if (keyData.getCurrency().equalsIgnoreCase(memberInfoAllApiRequest.getCurrencyCode())) { + keyInfo = keyData; + break; + } + } + } + if (null == keyInfo) { + continue; + } - - List gameSecretKeys = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO.builder() - .systemCurrency(memberInfoAllApiRequest.getCurrencyCode()).build()); - + Key key = new Key(); + key.setPlatformCode(platform.getPlatformCode()); + key.setCode(keyInfo.getCode()); + key.setKey(keyInfo.getKey()); + key.setCurrency(targetCurrency); + keys.add(key); + } // 创建线程池 Map balanceMap = new LinkedHashMap<>(); - CountDownLatch latch = new CountDownLatch(gameSecretKeys.size()); + CountDownLatch latch = new CountDownLatch(keys.size()); // 使用List存储Future对象,用于获取异步执行的结果 List> futures = new ArrayList<>(); // 提交异步任务到线程池 - for (GameSecretKeyCurrencyDTO gameSecretKey : gameSecretKeys) { + for (Key gameSecretKey : keys) { + futures.add(threadPoolTaskExecutor.submit(() -> { + try { IGamesService iGamesService = gamesService.get(gameSecretKey.getPlatformCode() + Constants.SERVICE); @@ -256,5 +309,12 @@ public class ApiMemberController extends BaseController { return AjaxResult.success(balanceMap); } + @Data + class Key { + private String platformCode; + private String code; + private String currency; + private String key; + } } diff --git a/ff-game/src/main/java/com/ff/api/request/GameDemoLoginRequest.java b/ff-game/src/main/java/com/ff/api/request/GameDemoLoginRequest.java index 315fdda..e1c116c 100644 --- a/ff-game/src/main/java/com/ff/api/request/GameDemoLoginRequest.java +++ b/ff-game/src/main/java/com/ff/api/request/GameDemoLoginRequest.java @@ -49,5 +49,11 @@ public class GameDemoLoginRequest implements Serializable { */ private Integer disableFullScreen; + /** + * 币种 + */ + @NotBlank(message = "currencyCode不能为空") + @Length(max = 32, message = "currencyCode长度不能超过32个字符") + private String currencyCode; } 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 23b9863..79c92a2 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 @@ -76,10 +76,6 @@ public class MeiTianGameServiceImpl implements IGamesService { @Resource private IMemberService memberService; - - @Resource - private IGameSecretKeyService gameSecretKeyService; - @Resource private MeiTianClient meiTianClient; @@ -112,11 +108,10 @@ public class MeiTianGameServiceImpl implements IGamesService { */ @Override public Boolean createMember(CreateMemberRequestDTO createMemberRequestDTO) { - GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(createMemberRequestDTO.getAgentId()); String playerName = createMemberRequestDTO.getAccount(); String merchantId = createMemberRequestDTO.getAgentId(); - String md5Password = Md5Utils.md5New(gameSecretKey.getPassword()); + String md5Password = Md5Utils.md5New(createMemberRequestDTO.getKeyInfo().getPassword()); Map rawMap = new LinkedHashMap<>(); rawMap.put("nickname", createMemberRequestDTO.getAccount()); rawMap.put("playerLevel", "0"); @@ -128,7 +123,7 @@ public class MeiTianGameServiceImpl implements IGamesService { log.error("[MeiTian] encode rawData failure", e); throw new ApiException(ErrorCode.ERROR.getCode()); } - String md5Code = Md5Utils.md5New(gameSecretKey.getKey() + rawData);//MD5(key+rawData); + String md5Code = Md5Utils.md5New(createMemberRequestDTO.getKeyInfo().getKey() + rawData);//MD5(key+rawData); MeiTianCreateMemberResponseDTO createMemberResponseDTO = meiTianClient.createMember( playerName, @@ -181,11 +176,10 @@ public class MeiTianGameServiceImpl implements IGamesService { */ @Override public String loginWithoutRedirect(GamesLogin gamesLogin) { - GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(gamesLogin.getAgentId()); String merchantId = gamesLogin.getAgentId(); String playerName = gamesLogin.getAccount(); - String md5Password = Md5Utils.md5New(gameSecretKey.getPassword()); + String md5Password = Md5Utils.md5New(gamesLogin.getKeyInfo().getPassword()); Map rawMap = new LinkedHashMap<>(); /*rawMap.put("gameHall ", gamesLogin.getGameType());*/ rawMap.put("gameCode", gamesLogin.getGameId()); @@ -200,7 +194,7 @@ public class MeiTianGameServiceImpl implements IGamesService { log.error("[MeiTian] encode rawData failure", e); throw new ApiException(ErrorCode.ERROR.getCode()); } - String code = Md5Utils.md5New(gameSecretKey.getKey() + rawData); + String code = Md5Utils.md5New(gamesLogin.getKeyInfo().getKey() + rawData); MeiTianLoginResultDTO loginWithoutRedirectResponseDTO = meiTianClient.loginWithoutRedirect( merchantId, @@ -238,12 +232,12 @@ public class MeiTianGameServiceImpl implements IGamesService { for (MeiTianGameDataDTO gamesDataDTO : gameList.getData()) { GamePlatform gamePlatform = GamePlatform.builder() .platformType(MeiTianGameType.findSystemByCode(gamesDataDTO.getGameCategoryId())) - .platformCode(GamePlatforms.MeiTian.getCode()) + .platformCode(GamePlatforms.MT.getCode()) .build(); List gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform); //没有此平台就新增一个平台 if (CollectionUtils.isEmpty(gamePlatforms)) { - gamePlatform.setPlatformName(GamePlatforms.MeiTian.getInfo() + MeiTianGameType.findInfoByCode(gamesDataDTO.getGameCategoryId())); + gamePlatform.setPlatformName(GamePlatforms.MT.getInfo() + MeiTianGameType.findInfoByCode(gamesDataDTO.getGameCategoryId())); gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1); gamePlatform.setCreateBy(Constants.SYSTEM); gamePlatformService.insertGamePlatform(gamePlatform); @@ -309,7 +303,7 @@ public class MeiTianGameServiceImpl implements IGamesService { .currency(exchangeTransferMoneyRequestDTO.getCurrency()).build()); Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); - String transactionId = GamePlatforms.MeiTian.getCode() + IdUtils.simpleUUID(); + String transactionId = GamePlatforms.MT.getCode() + IdUtils.simpleUUID(); List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( GameExchangeMoney.builder() @@ -331,7 +325,7 @@ public class MeiTianGameServiceImpl implements IGamesService { .currencyCode(gameSecretKey.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) - .platformCode(GamePlatforms.MeiTian.getCode()) + .platformCode(GamePlatforms.MT.getCode()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); //接口限制限制50字符 @@ -439,7 +433,7 @@ public class MeiTianGameServiceImpl implements IGamesService { } boolean doSyncRecordByRecordID(BetRecordByTimeDTO betRecordByTimeDTO) { - String configKey = GamePlatforms.MeiTian.getCode() + ":lastRecordID"; + String configKey = GamePlatforms.MT.getCode() + ":lastRecordID"; String lastRecordID = sysConfigServiceImpl.selectConfigByKey(configKey); long recordID = 0; if (lastRecordID == null || lastRecordID.isEmpty()) { @@ -496,7 +490,7 @@ public class MeiTianGameServiceImpl implements IGamesService { boolean doSyncRecordByDate(BetRecordByTimeDTO betRecordByTimeDTO, int daysToSubtract) { String date = getDateStr(daysToSubtract); - String configKey = GamePlatforms.MeiTian.getCode() + ":lastSyncDate"; + String configKey = GamePlatforms.MT.getCode() + ":lastSyncDate"; String syncDateStr = sysConfigServiceImpl.selectConfigByKey(configKey); Map syncDateMap = new HashMap<>(); long recordID = 0; @@ -597,9 +591,8 @@ public class MeiTianGameServiceImpl implements IGamesService { */ @Override public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) { - GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(getGameDetailRequestDTO.getAgentId()); - String key = gameSecretKey.getKey(); + String key = getGameDetailRequestDTO.getKeyInfo().getKey(); String merchantId = getGameDetailRequestDTO.getAgentId(); Map rawMap = new LinkedHashMap<>(); rawMap.put("rowID", getGameDetailRequestDTO.getWagersId()); @@ -721,7 +714,7 @@ public class MeiTianGameServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.MeiTian.getCode()); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.MT.getCode()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) @@ -747,7 +740,7 @@ public class MeiTianGameServiceImpl implements IGamesService { GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() .currency(dataBean.getCurrency()) - .platformCode(GamePlatforms.MeiTian.getCode()).build()); + .platformCode(GamePlatforms.MT.getCode()).build()); Member member = memberService.selectMemberByGameAccount(dataBean.getPlayerName()); @@ -769,7 +762,7 @@ public class MeiTianGameServiceImpl implements IGamesService { .memberId(member.getId()) .gameCode(dataBean.getGameCode()) .gameType(MeiTianGameType.findSystemByCode(Integer.parseInt(dataBean.getGameType()))) - .platformCode(GamePlatforms.MeiTian.getCode()) + .platformCode(GamePlatforms.MT.getCode()) .gameId(gamesDataDTO.getSystemGameId()) .gameName(gamesDataDTO.getCnName()) .gameStatus(compareResult > 0 ? GameStatus.WIN.getCode() : compareResult < 0 ? GameStatus.FAIL.getCode() : GameStatus.FLAT.getCode()) 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 33bdc76..8f40651 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 @@ -2,7 +2,6 @@ package com.ff.game.api.ng.service.impl; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; -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; @@ -11,19 +10,14 @@ 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.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.jili.dto.*; import com.ff.game.api.ng.client.NGClient; import com.ff.game.api.ng.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.*; import com.ff.game.service.*; @@ -42,15 +36,12 @@ import org.springframework.util.ObjectUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.security.SecureRandom; -import java.text.SimpleDateFormat; import java.time.Instant; import java.time.ZoneId; -import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Function; import java.util.stream.Collectors; @@ -228,7 +219,7 @@ public class GamesPGServiceImpl implements IGamesService { paramsMap.put("lang", gamesLogin.getLang()); paramsMap.put("gameCode", gamesLogin.getGameId()); paramsMap.put("returnUrl", gamesLogin.getHomeUrl()); - paramsMap.put("ingress", PlatformHomeType.WEB.getValue().equals(gamesLogin.getPlatform()) ? IngressType.PC_WEB.getValue() : IngressType.MOBILE_WEB.getValue()); + paramsMap.put("ingress", PlatformHomeType.WEB.getValue().equals(gamesLogin.getVendor()) ? IngressType.PC_WEB.getValue() : IngressType.MOBILE_WEB.getValue()); Map headerMap = this.getKey(gamesLogin); ApiNGResponseDTO apiLoginResponseDTOApiNGResponseDTO = ngClient.loginWithoutRedirect(paramsMap, headerMap); if (this.getIsSuccess(apiLoginResponseDTOApiNGResponseDTO.getCode())) { diff --git a/ff-game/src/main/java/com/ff/game/api/request/GamesBaseRequestDTO.java b/ff-game/src/main/java/com/ff/game/api/request/GamesBaseRequestDTO.java index 072657c..48511cb 100644 --- a/ff-game/src/main/java/com/ff/game/api/request/GamesBaseRequestDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/request/GamesBaseRequestDTO.java @@ -1,7 +1,8 @@ package com.ff.game.api.request; +import com.ff.game.domain.KeyInfo; +import com.ff.game.domain.Platform; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; @@ -36,12 +37,14 @@ public class GamesBaseRequestDTO implements Serializable { private String query; - - /** * 货币 */ private String currency; + private Platform vendor; + + private KeyInfo keyInfo; + } 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 76f0223..5294c0a 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 @@ -11,7 +11,6 @@ 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.MessageUtils; import com.ff.base.utils.sign.Md5Utils; import com.ff.base.utils.uuid.IdUtils; import com.ff.config.KeyConfig; @@ -210,7 +209,7 @@ public class GamesXKServiceImpl implements IGamesService { params.put("key", key); params.put("disableFullScreen", gamesLogin.getDisableFullScreen()); params.put("homeUrl", gamesLogin.getHomeUrl()); - params.put("platform", gamesLogin.getPlatform()); + params.put("platform", gamesLogin.getVendor()); XKLoginWithoutRedirectResponseDTO xkLoginWithoutRedirectResponseDTO = xkClient.loginWithoutRedirect(params); //判断是否获取成功 if (this.getIsSuccess(xkLoginWithoutRedirectResponseDTO.getCode())) { diff --git a/ff-game/src/main/java/com/ff/game/domain/CurrencyInfo.java b/ff-game/src/main/java/com/ff/game/domain/CurrencyInfo.java index 4590d2b..fc4456a 100644 --- a/ff-game/src/main/java/com/ff/game/domain/CurrencyInfo.java +++ b/ff-game/src/main/java/com/ff/game/domain/CurrencyInfo.java @@ -6,5 +6,6 @@ import java.util.HashMap; /** * @author cengy */ -public class CurrencyInfo extends HashMap implements Serializable { +public class CurrencyInfo extends HashMap implements Serializable { + } 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 27b4b5f..252ebb8 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 @@ -5,7 +5,6 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.ff.base.annotation.Excel; import com.ff.base.core.domain.BaseEntity; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; @@ -20,24 +19,31 @@ import lombok.experimental.SuperBuilder; @AllArgsConstructor @NoArgsConstructor @SuperBuilder -public class Game extends BaseEntity -{ +public class Game extends BaseEntity { private static final long serialVersionUID = 1L; - /** 主键id */ + /** + * 主键id + */ @JsonSerialize(using = ToStringSerializer.class) private Long id; - /** 排序 */ + /** + * 排序 + */ @Excel(name = "排序") private Integer sortNo; - /** 游戏平台id */ + /** + * 游戏平台id + */ @Excel(name = "游戏平台id") @JsonSerialize(using = ToStringSerializer.class) private Long platformId; - /** 游戏第三方id */ + /** + * 游戏第三方id + */ @Excel(name = "游戏第三方id") private String gameCode; @@ -46,27 +52,44 @@ public class Game extends BaseEntity */ private Integer ingress; - /** 第三方来源分类 */ + /** + * 第三方来源分类 + */ @Excel(name = "第三方来源分类") private String gameSourceType; - /** 游戏名称 */ + /** + * 游戏名称 + */ @Excel(name = "游戏名称") private String gameName; - /** 是否支持免费游戏 1 支持 0 不支持 */ + /** + * 是否支持免费游戏 1 支持 0 不支持 + */ @Excel(name = "是否支持免费游戏 1 支持 0 不支持") private Boolean freespin; - /** 是否支持试玩 0关闭 1开启 */ + /** + * 是否支持试玩 0关闭 1开启 + */ @Excel(name = "是否支持试玩 0关闭 1开启") private Boolean demoStatus; - /** 维护开关 维护状态 */ + /** + * 维护开关 维护状态 + */ @Excel(name = "维护开关 ") private Boolean stopStatus; + /** + * 平台code + */ + private String platformCode; - + /** + * 平台类型 + */ + private Integer platformType; } 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 8a9f90b..19d7950 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 @@ -220,7 +220,7 @@ public class GameTask { Long endTime = DateUtils.getNowDate(); //捞取指定分钟前的数据 - gameService.insertGameBettingDetails(startTime, endTime, GamePlatforms.MeiTian.getCode()); + gameService.insertGameBettingDetails(startTime, endTime, GamePlatforms.MT.getCode()); } From e020b73282f4fbd57cadb7f0e4c18697c09be714 Mon Sep 17 00:00:00 2001 From: shi Date: Thu, 3 Apr 2025 16:27:48 +0800 Subject: [PATCH 25/62] =?UTF-8?q?feat(game):=20=E6=B7=BB=E5=8A=A0=20PGT=20?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=B9=B3=E5=8F=B0=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 PGT 游戏平台的 API接口和实现类 - 添加 PGT 游戏平台的会员账户生成逻辑 - 实现 PGT 游戏平台的余额查询、转账等功能 - 添加 PGT 游戏平台的错误响应和数据模型类 --- .../java/com/ff/base/enums/GamePlatforms.java | 3 +- .../java/com/ff/base/utils/NumberUtils.java | 14 +- .../api/controller/ApiMemberController.java | 2 +- .../com/ff/game/api/km/client/KMClient.java | 7 +- .../api/pgt/address/MyPGTAddressSource.java | 30 + .../com/ff/game/api/pgt/client/PGTClient.java | 132 +++++ .../game/api/pgt/dto/PGTBalanceResponse.java | 62 ++ .../api/pgt/dto/PGTCreateMemberResponse.java | 60 ++ .../api/pgt/dto/PGXBetHistoryResponse.java | 148 +++++ .../ff/game/api/pgt/dto/PGXErrorResponse.java | 26 + .../PGXExchangeTransferStatusResponse.java | 67 +++ .../api/pgt/dto/PGXGameLoginResponse.java | 30 + .../game/api/pgt/dto/PGXMemberResponse.java | 26 + .../api/pgt/dto/PGXPlayerStatusResponse.java | 26 + .../api/pgt/impl/GamesPGTServiceImpl.java | 534 ++++++++++++++++++ .../MySuccessCondition.java} | 4 +- .../com/ff/member/service/IMemberService.java | 4 +- .../service/impl/MemberServiceImpl.java | 12 +- 18 files changed, 1163 insertions(+), 24 deletions(-) create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/address/MyPGTAddressSource.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTBalanceResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTCreateMemberResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXBetHistoryResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXErrorResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXExchangeTransferStatusResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXGameLoginResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXMemberResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXPlayerStatusResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java rename ff-game/src/main/java/com/ff/game/api/{km/success/MyKMSuccessCondition.java => success/MySuccessCondition.java} (90%) 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 00d2cfd..e2136c8 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 @@ -13,7 +13,8 @@ public enum GamePlatforms { DG("DG", "DG"), MeiTian("MeiTian","美天棋牌"), AE("AE", "AE"), - KM("KM", "KM") + KM("KM", "KM"), + PGT("PGT", "PGT"), ; private final String code; 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 parameters, @Header Map headerMap); + + /** + * 获取会员信息 + * + * @param parameters 范围 + * @return {@link PGTBalanceResponse } + */ + @Get("/balance?${parameters}") + PGTBalanceResponse getMemberInfo(@Var("parameters") String parameters, @Header Map headerMap); + + + /** + * 获取会员游戏信息 目前仅支持供应商代号JD. + * + * @param parameters 范围 + * @return {@link PGXPlayerStatusResponse } + */ + @Get("/isPlayerIngame.ashx?${parameters}") + PGXPlayerStatusResponse getMemberPlayInfo(@Var("parameters") String parameters); + + + /** + * 无重定向登录 + * + * @param parameters 范围 + * @return {@link PGXGameLoginResponse } + */ + @Post("/launchGames.aspx?${parameters}") + PGXGameLoginResponse loginWithoutRedirect(@Var("parameters") String parameters); + + + + /** + * 按代理id进行交换转账 + * + * @param parameters 参数 + * @return {@link PGXErrorResponse } + */ + @Post(url = "/makeTransfer.aspx?{parameters}") + PGXErrorResponse exchangeTransferByAgentId(@Var("parameters") String parameters); + + /** + * 标记报告 + * + * @return {@link DGResponse } + */ + @Post(url = "markbyjson.aspx") + DGResponse markReport(@JSONBody Map params); + + + + + /** + * 汇兑转移状态 + * + * @param parameters 范围 + * @return {@link ApiNGResponseDTO }<{@link ApiExchangeTransferStatusResponseDTO }> + */ + @Post(url = "/checkTransaction.ashx?{parameters}") + PGXExchangeTransferStatusResponse exchangeTransferStatus(@Var("parameters") String parameters); + + + + + + /** + * 按时间获取投注记录 + * + * @return {@link PGXBetHistoryResponse } + */ + @Get(url = "/fetchbykey.aspx?{parameters}") + PGXBetHistoryResponse getBetRecordByTime(@Var("parameters") String parameters); + + + + @Get(url = "h/fetchArchieve.aspx?{parameters}") + PGXBetHistoryResponse getBetRecordByHistoryTime(@Var("parameters") String parameters); + + + /** + * 踢出队员 + * + * @param parameters 范围 + * @return {@link JILIKickMemberDTO } + */ + @Post("/kickPlayerFromProduct.ashx?{parameters}") + PGXErrorResponse kickMember(@Var("parameters") String parameters); + + /** + * 踢出所有队员 + * + * @param params 参数 + * @return {@link JILIKickMemberAllDTO } + */ + @Get("/kickMemberAll") + XKKickMemberAllDTO kickMemberAll(@JSONBody Map params); + + +} 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/PGXBetHistoryResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXBetHistoryResponse.java new file mode 100644 index 0000000..3b98e14 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXBetHistoryResponse.java @@ -0,0 +1,148 @@ +package com.ff.game.api.pgt.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 错误信息与投注历史记录返回结果对象 + * + * @author shi + * @date 2025/03/28 + */ +@Data +public class PGXBetHistoryResponse { + + /** + * 错误码 + */ + @JsonProperty("errCode") + private Integer errCode; + + /** + * 投注历史记录的JSON字符串 (String类型) + */ + @JsonProperty("result") + private String result; + + /** + * 错误信息 (String类型) + */ + @JsonProperty("errMsg") + private String errMsg; + + /** + * AIO投注记录对象 + */ + @Data + public class Result { + + /** + * AIO注单号 (唯一值) (Long类型) + */ + @JsonProperty("id") + private Long id; + + /** + * 供应商注单号 (Long类型) + */ + @JsonProperty("ref_no") + private Long refNo; + + /** + * 供应商代号 (String类型) + */ + @JsonProperty("site") + private String site; + + /** + * 游戏类型代号 (String类型) + */ + @JsonProperty("product") + private String product; + + /** + * 玩家帐号 (String类型) + */ + @JsonProperty("member") + private String member; + + /** + * 游戏代号 (String类型) + */ + @JsonProperty("game_id") + private String gameId; + + /** + * 下注时间 (玩家实际的投注时间) 依据 GMT/UTC +0 时区 + */ + @JsonProperty("start_time") + private Date startTime; + + /** + * 结算时间 (String类型) 依据 GMT/UTC +0 时区 + */ + @JsonProperty("end_time") + private Date endTime; + + /** + * 开赛时间 (String类型) 依据 GMT/UTC +0 时区 + */ + @JsonProperty("match_time") + private String matchTime; + + /** + * 投注明细 (String类型) + */ + @JsonProperty("bet_detail") + private String betDetail; + + /** + * 有效投注金额 (Double类型) + */ + @JsonProperty("turnover") + private BigDecimal turnover; + + /** + * 投注金额 (Double类型) + */ + @JsonProperty("bet") + private BigDecimal bet; + + /** + * 派彩金额 (Double类型) + */ + @JsonProperty("payout") + private BigDecimal payout; + + /** + * 佣金 (Double类型) + */ + @JsonProperty("commission") + private BigDecimal commission; + + /** + * 彩池投注金额 (Double类型) + */ + @JsonProperty("p_share") + private BigDecimal pShare; + + /** + * 彩池派彩金额 (Double类型) + */ + @JsonProperty("p_win") + private BigDecimal pWin; + + /** + * 注单状态 (Int类型) + * 1 (valid bet record 有效注单) + * 0 (running/ongoing match 赛事进行中) + * -1 (invalid bet record 无效注单 e.g. voided 作废, canceled 取消) + */ + @JsonProperty("status") + private int status; + + } +} \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXErrorResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXErrorResponse.java new file mode 100644 index 0000000..a11da08 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXErrorResponse.java @@ -0,0 +1,26 @@ +package com.ff.game.api.pgt.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 错误响应类 + * + * @author shi + * @date 2025/03/27 + */ +@Data +public class PGXErrorResponse { + + /** 错误码 */ + @JsonProperty("errCode") + private Integer errCode; + + /** 内部参考代码 (字符串类型) */ + @JsonProperty("innerCode") + private String innerCode; + + /** 错误信息 (字符串类型) */ + @JsonProperty("errMsg") + private String errMsg; +} diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXExchangeTransferStatusResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXExchangeTransferStatusResponse.java new file mode 100644 index 0000000..5fab258 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXExchangeTransferStatusResponse.java @@ -0,0 +1,67 @@ +package com.ff.game.api.pgt.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * pgxexchange传输状态响应 + * + * @author shi + * @date 2025/03/28 + */ +@Data +public class PGXExchangeTransferStatusResponse { + + /** 错误码 */ + @JsonProperty("errCode") + private Integer errCode; + + + + /** 错误信息 (字符串类型) */ + @JsonProperty("errMsg") + private String errMsg; + + + /** GSC生成的转账ID (String类型) */ + @JsonProperty("trans_id") + private String transId; + + /** 交易时间,GMT+0 (String类型) */ + @JsonProperty("trans_time") + private String transTime; + + /** 玩家姓名 (String类型) */ + @JsonProperty("username") + private String username; + + /** 交易类型 (String类型),0为存款,1为取款 */ + @JsonProperty("type") + private String type; + + /** 提供商 (String类型) */ + @JsonProperty("provider") + private String provider; + + /** 交易金额 (double类型) */ + @JsonProperty("amount") + private double amount; + + /** 运营商的参考ID (String类型) */ + @JsonProperty("ref_id") + private String refId; + + /** 交易状态 (String类型),SUCCESS 成功 + PROCESSING 进行中,请稍后再确认 + FAILED 失败 */ + @JsonProperty("status") + private String status; + + /** GSC操作员代码 (String类型) */ + @JsonProperty("operator") + private String operator; + + /** 交易备注 (String类型) */ + @JsonProperty("remark") + private String remark; +} diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXGameLoginResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXGameLoginResponse.java new file mode 100644 index 0000000..1b18e65 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXGameLoginResponse.java @@ -0,0 +1,30 @@ +package com.ff.game.api.pgt.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 游戏响应对象 + */ +@Data +public class PGXGameLoginResponse { + + /** + * 错误码 (String类型) + */ + @JsonProperty("errCode") + private Integer errCode; + + /** + * 启动游戏链接 (String类型) + */ + @JsonProperty("gameUrl") + private String gameUrl; + + /** + * 错误信息 (String类型) + */ + @JsonProperty("errMsg") + private String errMsg; + +} \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXMemberResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXMemberResponse.java new file mode 100644 index 0000000..80c40ce --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXMemberResponse.java @@ -0,0 +1,26 @@ +package com.ff.game.api.pgt.dto; + + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 响应类,包含错误码、余额和错误信息 + */ +@Data +public class PGXMemberResponse { + + /** 错误码 */ + @JsonProperty("errCode") + private Integer errCode; + + /** 账户余额 (小数类型) */ + @JsonProperty("balance") + private BigDecimal balance; + + /** 错误信息 (字符串类型) */ + @JsonProperty("errMsg") + private String errMsg; +} \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXPlayerStatusResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXPlayerStatusResponse.java new file mode 100644 index 0000000..536becf --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXPlayerStatusResponse.java @@ -0,0 +1,26 @@ +package com.ff.game.api.pgt.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 响应类,包含错误码、玩家是否在游戏中状态和错误信息 + * + * @author shi + * @date 2025/03/28 + */ +@Data +public class PGXPlayerStatusResponse { + + /** 错误码 (字符串类型) */ + @JsonProperty("errCode") + private Integer errCode; + + /** 玩家是否在游戏中 (字符串类型) "true" 表示在游戏中,"false" 表示不在游戏中 */ + @JsonProperty("result") + private Boolean result; + + /** 错误信息 (字符串类型) */ + @JsonProperty("errMsg") + private String errMsg; +} \ No newline at end of file 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..765c85e --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java @@ -0,0 +1,534 @@ +package com.ff.game.api.pgt.impl; + +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson2.JSON; +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.JsonUtil; +import com.ff.base.utils.sign.Base64; +import com.ff.config.KeyConfig; +import com.ff.game.api.IGamesService; +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.domain.*; +import com.ff.game.dto.GameSecretKeyCurrencyDTO; +import com.ff.game.service.*; +import com.ff.member.domain.Member; +import com.ff.member.service.IMemberService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.util.Base64Utils; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +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 IGamePlatformService gamePlatformService; + + + @Resource + private IGameService gameService; + + + @Resource + private IMemberService memberService; + + @Resource + private IGameFreeRecordService gameFreeRecordService; + @Resource + private IGameSecretKeyService gameSecretKeyService; + + @Resource + private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; + + @Resource + private PGTClient pgtClient; + + + @Resource + private KeyConfig keyConfig; + + @Resource + private IGameBettingDetailsService gameBettingDetailsService; + + @Resource + private IGameNameService gameNameService; + + + /** + * 获得就是成功 + * + * @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","PGSOFT"); + + 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", "PGSOFT"); + 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("GamesPGXServiceImpl [loginWithoutRedirect] 请求参数 {}", gamesLogin); + GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(gamesLogin.getAgentId()); + Map params = new LinkedHashMap<>(); + params.put("operatorcode", gamesLogin.getAgentId()); + params.put("password", gameSecretKey.getPassword()); + params.put("providercode", gameSecretKey.getProviderCode()); + params.put("type", gamesLogin.getGameType()); + params.put("username", gamesLogin.getAccount()); + Map key = this.getKey(gamesLogin); + params.put("gameid", gamesLogin.getGameId()); + params.put("lang", gamesLogin.getLang()); + params.put("html5", 1); + params.put("signature", key); + PGXGameLoginResponse PGXGameLoginResponse = pgtClient.loginWithoutRedirect(JsonUtil.mapToQueryString(params)); + //判断是否获取成功 + if (this.getIsSuccess(PGXGameLoginResponse.getErrCode())) { + return PGXGameLoginResponse.getGameUrl(); + } else { + throw new BaseException(PGXGameLoginResponse.getErrMsg()); + } + } + + + /** + * 获取游戏列表 + * + * @param gamesBaseRequestDTO 游戏请求dto + * @return {@link String } + */ + @Transactional + @Override + public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) { + + + return CacheConstants.PGX_GAMES; + } + + /** + * 按代理id进行交换转账 + * + * @param exchangeTransferMoneyRequestDTO 外汇转账moeny dto + * @return {@link Long } + */ + @Override + @Transactional + 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); + List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( + GameExchangeMoney.builder() + .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) + .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) + .build() + ); + Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); + + GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(exchangeTransferMoneyRequestDTO.getAgentId()); + + //获取下一个自增id + GameExchangeMoney exchangeMoney = GameExchangeMoney + .builder() + .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) + .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) + .quota(exchangeTransferMoneyRequestDTO.getQuota()) + .balance(exchangeTransferMoneyRequestDTO.getAmount()) + .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) + .currencyCode(currencyDTO.getSystemCurrency()) + .memberId(member.getId()) + .transactionId(transactionId) + .platformCode(GamePlatforms.PGX.getInfo()) + .build(); + exchangeMoney.setCreateBy(Constants.SYSTEM); + + //获取余额 + String type = TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType()) ? PGXTransferType.WITHDRAW.getCode() : PGXTransferType.DEPOSIT.getCode(); + + 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("amount", amount); + paramsMap.put("operatorcode", exchangeTransferMoneyRequestDTO.getAgentId()); + paramsMap.put("password", gameSecretKey.getPassword()); + paramsMap.put("providercode", gameSecretKey.getProviderCode()); + paramsMap.put("referenceid", transactionId); + paramsMap.put("type", type); + paramsMap.put("username", exchangeTransferMoneyRequestDTO.getAccount()); + + + PGXErrorResponse errorResponse = pgtClient.exchangeTransferByAgentId(JsonUtil.mapToQueryString(paramsMap)); + if (this.getIsSuccess(errorResponse.getErrCode())) { + + //更新数据 + exchangeMoney.setBalance(amount); + exchangeMoney.setCoinBefore(amountBefore); + //转后的余额 + BigDecimal coinAfter = this.getMemberInfo(gamesBaseRequestDTO).getBalance(); + + exchangeMoney.setCoinAfter(coinAfter); + 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(gameSecretKey.getCode()); + exchangeTransferStatusRequestDTO.setAgentKey(gameSecretKey.getKey()); + this.exchangeTransferStatus(exchangeTransferStatusRequestDTO); + } else { + log.error("GamesFCServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{}", errorResponse.getErrCode()); + throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); + } + return exchangeMoney.getId(); + } + + /** + * 汇兑转移状态 + * + * @param exchangeTransferMoneyRequestDTO 兑换转账请求dto + * @return {@link Boolean } + */ + @Override + public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + log.info("GamesPGXServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO); + Map paramsMap = new LinkedHashMap<>(); + paramsMap.put("operatorcode", exchangeTransferMoneyRequestDTO.getAgentId()); + paramsMap.put("referenceid", exchangeTransferMoneyRequestDTO.getOrderId()); + + + PGXExchangeTransferStatusResponse exchangeTransferStatusResponse = pgtClient.exchangeTransferStatus(JsonUtil.mapToQueryString(paramsMap)); + 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; + } else { + log.error("GamesPGXServiceImpl [exchangeTransferStatus]错误代码{},错误信息{}", exchangeTransferStatusResponse.getErrCode(), exchangeTransferStatusResponse.getErrMsg()); + return Boolean.FALSE; + } + } + + + /** + * 按时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link List }<{@link GameBettingDetails }> + */ + @Override + public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { + //请求参数 + log.info("GamesPGXServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO); + Map paramsMap = new LinkedHashMap<>(); + paramsMap.put("operatorcode", betRecordByTimeDTO.getAgentId()); + + paramsMap.put("versionkey", 0); + PGXBetHistoryResponse betRecordByTime = pgtClient.getBetRecordByTime(JsonUtil.mapToQueryString(paramsMap)); + + if (this.getIsSuccess(betRecordByTime.getErrCode())) { + List results = JSON.parseArray(betRecordByTime.getResult(), PGXBetHistoryResponse.Result.class); + this.batchInsert(results, betRecordByTimeDTO); + return Boolean.TRUE; + } else { + log.error("GamesPGXServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getErrCode(), betRecordByTime.getErrMsg()); + throw new BaseException(betRecordByTime.getErrMsg()); + } + } + + /** + * 按历史时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link Boolean } + */ + @Override + public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { + //请求参数 + log.info("GamesPGXServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", betRecordByTimeDTO); + Map paramsMap = new LinkedHashMap<>(); + paramsMap.put("operatorcode", betRecordByTimeDTO.getAgentId()); + paramsMap.put("versionkey", 0); + PGXBetHistoryResponse betRecordByTime = pgtClient.getBetRecordByHistoryTime(JsonUtil.mapToQueryString(paramsMap)); + + if (this.getIsSuccess(betRecordByTime.getErrCode())) { + List results = JSON.parseArray(betRecordByTime.getResult(), PGXBetHistoryResponse.Result.class); + this.batchInsert(results, betRecordByTimeDTO); + return Boolean.TRUE; + } else { + log.error("GamesPGXServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getErrCode(), betRecordByTime.getErrMsg()); + throw new BaseException(betRecordByTime.getErrMsg()); + } + } + + /** + * 赠送免费局数 + * + * @param createFreeSpinRequest 创建自由旋转请求 + * @return {@link Boolean } + */ + @Override + public Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + /** + * 获取游戏详细信息 + * + * @param getGameDetailRequestDTO 获取游戏详细信息请求dto + * @return {@link GetGameDetailResponseDTO } + */ + @Override + public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + /** + * 强制会员从游戏注销 + * + * @param kickMemberRequestDTO 踢会员请求dto + * @return {@link Boolean } + */ + @Override + public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) { + 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 void batchInsert(List dataBean, GamesBaseRequestDTO gamesBaseRequestDTO) { + List gameBettingDetails = new ArrayList<>(); + List wagersIds = new ArrayList<>(); + + //数据转化 + for (PGXBetHistoryResponse.Result bean : dataBean) { + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().agentId(gamesBaseRequestDTO.getAgentId()).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) { + //转化类 + + return new GameBettingDetails(); + } +} 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/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..248cd38 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))); } From 3ce8dba98f9630a29345d695c7946e2a0129adee Mon Sep 17 00:00:00 2001 From: shi Date: Thu, 3 Apr 2025 16:57:14 +0800 Subject: [PATCH 26/62] =?UTF-8?q?feat(game):=20=E6=B7=BB=E5=8A=A0=20PGT=20?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=B9=B3=E5=8F=B0=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 PGT 游戏平台的 API接口和实现类 - 添加 PGT 游戏平台的会员账户生成逻辑 - 实现 PGT 游戏平台的余额查询、转账等功能 - 添加 PGT 游戏平台的错误响应和数据模型类 --- .../src/main/java/com/ff/game/api/pgt/client/PGTClient.java | 4 ++-- .../java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java b/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java index 74bfe60..0ab0842 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java @@ -58,8 +58,8 @@ public interface PGTClient { * @param parameters 范围 * @return {@link PGXGameLoginResponse } */ - @Post("/launchGames.aspx?${parameters}") - PGXGameLoginResponse loginWithoutRedirect(@Var("parameters") String parameters); + @Post("/logIn") + PGXGameLoginResponse loginWithoutRedirect(@JSONBody Map parameters, @Header Map headerMap); diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java index 765c85e..b2d4c1c 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java @@ -178,7 +178,7 @@ public class GamesPGTServiceImpl implements IGamesService { */ @Override public String loginWithoutRedirect(GamesLogin gamesLogin) { - log.info("GamesPGXServiceImpl [loginWithoutRedirect] 请求参数 {}", gamesLogin); + log.info("GamesPGTServiceImpl [loginWithoutRedirect] 请求参数 {}", gamesLogin); GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(gamesLogin.getAgentId()); Map params = new LinkedHashMap<>(); params.put("operatorcode", gamesLogin.getAgentId()); @@ -191,7 +191,7 @@ public class GamesPGTServiceImpl implements IGamesService { params.put("lang", gamesLogin.getLang()); params.put("html5", 1); params.put("signature", key); - PGXGameLoginResponse PGXGameLoginResponse = pgtClient.loginWithoutRedirect(JsonUtil.mapToQueryString(params)); + PGXGameLoginResponse PGXGameLoginResponse = pgtClient.loginWithoutRedirect(params,key); //判断是否获取成功 if (this.getIsSuccess(PGXGameLoginResponse.getErrCode())) { return PGXGameLoginResponse.getGameUrl(); From 40208aab98fa9157942f0fc4f48293a5e16db76a Mon Sep 17 00:00:00 2001 From: cengy Date: Mon, 7 Apr 2025 10:15:35 +0800 Subject: [PATCH 27/62] =?UTF-8?q?feat(game):=20=E6=96=B0=E5=A2=9E=E6=B8=B8?= =?UTF-8?q?=E6=88=8F=E5=B9=B3=E5=8F=B0=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 AE 和 DG 游戏平台的接口实现 - 新增游戏列表、兑换转账、投注记录等功能 - 优化游戏数据构建和处理逻辑 - 移除不必要的服务和缓存操作 --- .../ff/api/controller/ApiGameController.java | 13 + .../api/controller/ApiMemberController.java | 2 + .../game/api/ae/impl/GamesAEServiceImpl.java | 125 +++--- .../dg/service/impl/GamesDGServiceImpl.java | 94 ++--- .../game/api/fc/impl/GamesFCServiceImpl.java | 146 ++++--- .../service/impl/GamesJILIServiceImpl.java | 94 +++-- .../game/api/request/BetRecordByTimeDTO.java | 7 - .../game/api/request/GamesBaseRequestDTO.java | 1 + .../game/api/request/GamesDataBuildDTO.java | 3 + .../java/com/ff/game/domain/CurrencyInfo.java | 5 + .../main/java/com/ff/game/domain/ExtInfo.java | 20 + .../main/java/com/ff/game/domain/Game.java | 3 + .../java/com/ff/game/domain/NameInfo.java | 20 + .../java/com/ff/game/domain/Platform.java | 38 ++ .../java/com/ff/game/mapper/GameMapper.java | 46 +-- .../com/ff/game/service/IGameService.java | 39 +- .../java/com/ff/quartz/task/GameTask.java | 367 ++++++++---------- .../main/resources/mapper/game/GameMapper.xml | 9 + 18 files changed, 521 insertions(+), 511 deletions(-) create mode 100644 ff-game/src/main/java/com/ff/game/domain/ExtInfo.java create mode 100644 ff-game/src/main/java/com/ff/game/domain/NameInfo.java diff --git a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java index 2d5ee20..27c3a29 100644 --- a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java +++ b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java @@ -191,6 +191,8 @@ public class ApiGameController extends BaseController { .lang(/*gameSecretKeyLangDTO.getLang()*/ targetLang) .vendor(platform) .keyInfo(keyInfo) + .systemCurrency(loginRequest.getCurrencyCode()) + .build(); String login = iGamesService.loginWithoutRedirect(gamesLogin); @@ -265,6 +267,8 @@ public class ApiGameController extends BaseController { .transferType(gameExchangeBalanceRequest.getTransferType()) .vendor(platform) .keyInfo(keyInfo) + .systemCurrency(gameExchangeBalanceRequest.getCurrencyCode()) + .build(); Long exchangeTransferId = iGamesService.exchangeTransferByAgentId(exchangeTransferMoneyRequestDTO); GameExchangeMoney gameExchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferId); @@ -349,6 +353,7 @@ public class ApiGameController extends BaseController { .startTime(gameCreateFreeSpinRequest.getStartTime()) .vendor(platform) .keyInfo(keyInfo) + .systemCurrency(gameCreateFreeSpinRequest.getCurrencyCode()) .build(); @@ -447,6 +452,7 @@ public class ApiGameController extends BaseController { .agentKey(keyInfo.getKey()) .vendor(platform) .keyInfo(keyInfo) + .systemCurrency(gameGetDetailRequest.getCurrencyCode()) .build()); return AjaxResult.success(gameDetail); } @@ -496,6 +502,7 @@ public class ApiGameController extends BaseController { .agentKey(keyInfo.getKey()) .vendor(platform) .keyInfo(keyInfo) + .systemCurrency(gameKickMemeberRequest.getCurrencyCode()) .build())); } @@ -533,6 +540,7 @@ public class ApiGameController extends BaseController { .currency(/*gameSecretKey.getCurrency()*/targetCurrency) .vendor(platform) .keyInfo(keyInfo) + .systemCurrency(gameKickMemeberAllRequest.getCurrencyCode()) .build(); if (!ObjectUtils.isEmpty(gameKickMemeberAllRequest.getGameId())) { Game game = gameService.selectGameById(gameKickMemeberAllRequest.getGameId()); @@ -617,6 +625,7 @@ public class ApiGameController extends BaseController { .referenceId(request.getReferenceId()) .vendor(platform) .keyInfo(keyInfo) + .systemCurrency(request.getCurrencyCode()) .build()); return AjaxResult.success(cancelFreeSpin); } @@ -665,6 +674,7 @@ public class ApiGameController extends BaseController { key.setCurrency(targetCurrency); key.setPlatform(platform); key.setKeyInfo(keyInfo); + key.setSystemCurrency(request.getCurrencyCode()); keys.add(key); } @@ -697,6 +707,7 @@ public class ApiGameController extends BaseController { .account(member.getGameAccount()) .vendor(key.getPlatform()) .keyInfo(key.getKeyInfo()) + .systemCurrency(key.systemCurrency) .transferType(TransferType.ALL.getCode()) .build(); return iGamesService.exchangeTransferByAgentId(exchangeTransferMoneyRequestDTO); @@ -801,6 +812,7 @@ public class ApiGameController extends BaseController { .lang(/*gameSecretKeyLangDTO.getLang()*/targetLang) .vendor(platform) .keyInfo(keyInfo) + .systemCurrency(request.getCurrencyCode()) .build(); GameDemoLoginResponseDTO gameDemoLoginResponseDTO = iGamesService.gameDemoLogin(gamesLogin); @@ -817,5 +829,6 @@ public class ApiGameController extends BaseController { private String key; private Platform platform; private KeyInfo keyInfo; + private String systemCurrency; } } 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 50a08a8..745d42e 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 @@ -145,6 +145,7 @@ public class ApiMemberController extends BaseController { .currency(targetCurrency) .vendor(platform) .keyInfo(keyInfo) + .systemCurrency(memberCreateApiRequest.getCurrencyCode()) .build(); Boolean result = iGamesService.createMember(gamesBaseRequestDTO); Assert.isTrue(result, "建立游戏账号失败"); @@ -201,6 +202,7 @@ public class ApiMemberController extends BaseController { .agentKey(keyInfo.getKey()) .vendor(platform) .keyInfo(keyInfo) + .systemCurrency(request.getCurrencyCode()) .build(); MemberInfoResponseDTO memberInfo = iGamesService.getMemberInfo(gamesBaseRequestDTO); MemberInfoResponse memberInfoResponse = new MemberInfoResponse(); 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 ac359be..927c928 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 @@ -12,23 +12,19 @@ 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.TenantUtils; import com.ff.base.utils.uuid.IdUtils; import com.ff.common.dto.GameBalanceExchange; -import com.ff.common.service.ITenantGameQuotaFlowService; import com.ff.common.service.ITenantGameQuotaService; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; import com.ff.game.api.ae.client.AEClient; import com.ff.game.api.ae.dto.*; -import com.ff.game.api.ng.dto.ApiExchangeTransferStatusResponseDTO; -import com.ff.game.api.ng.dto.ApiNGResponseDTO; import com.ff.game.api.request.*; -import com.ff.game.api.xk.dto.XKGamesDTO; import com.ff.game.api.xk.dto.XKKickMemberDTO; import com.ff.game.domain.*; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; -import com.ff.game.service.*; +import com.ff.game.service.IGameBettingDetailsService; +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 lombok.extern.slf4j.Slf4j; @@ -65,10 +61,6 @@ public class GamesAEServiceImpl implements IGamesService { private IGameExchangeMoneyService gameExchangeMoneyService; - @Resource - private IGamePlatformService gamePlatformService; - - @Resource private IGameService gameService; @Resource @@ -77,14 +69,6 @@ public class GamesAEServiceImpl implements IGamesService { @Resource private IMemberService memberService; - @Resource - private IGameFreeRecordService gameFreeRecordService; - @Resource - private IGameSecretKeyService gameSecretKeyService; - - @Resource - private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; - @Resource private AEClient AEClient; @@ -95,10 +79,6 @@ public class GamesAEServiceImpl implements IGamesService { @Resource private IGameBettingDetailsService gameBettingDetailsService; - @Resource - private IGameNameService gameNameService; - - /** * 游戏id */ @@ -222,32 +202,39 @@ public class GamesAEServiceImpl implements IGamesService { @Transactional @Override public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) { - GamePlatform gamePlatform = gamePlatformService.selectGamePlatformById(PLATFORM_ID); +// 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); - } +// 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); //不存在这个游戏 if (ObjectUtils.isEmpty(game)) { game = new Game(); game.setId(GAME_ID); - game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); - game.setPlatformId(gamePlatform.getId()); + 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"); game.setGameSourceType(String.valueOf(1)); game.setGameName("AE大厅"); game.setCreateBy(Constants.SYSTEM); + NameInfo nameInfo = new NameInfo(); + nameInfo.setLang("zh-CN"); + nameInfo.setName("AE大厅"); + game.setNameInfo(Collections.singletonList(nameInfo)); gameService.insertGame(game); } - GameName gameName = gameNameService.selectGameNameById(GAME_NAME_ID); + /*GameName gameName = gameNameService.selectGameNameById(GAME_NAME_ID); if (ObjectUtils.isEmpty(gameName)) { gameNameService.insertGameName(GameName.builder() .id(GAME_NAME_ID) @@ -256,7 +243,7 @@ public class GamesAEServiceImpl implements IGamesService { .langCode("zh-CN") .createBy(Constants.SYSTEM) .build()); - } + }*/ return CacheConstants.XK_GAMES; } @@ -271,10 +258,10 @@ 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()); +// 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(); @@ -294,7 +281,7 @@ public class GamesAEServiceImpl implements IGamesService { .quota(exchangeTransferMoneyRequestDTO.getQuota()) .balance(exchangeTransferMoneyRequestDTO.getAmount()) .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(currencyDTO.getSystemCurrency()) + .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) .platformCode(GamePlatforms.AE.getInfo()) @@ -402,20 +389,20 @@ public class GamesAEServiceImpl implements IGamesService { Map params = this.getKey(betRecordByTimeDTO); String timeFrom = redisCache.getCacheObject(CacheConstants.AE_TIME_FROM); - if (StringUtils.isEmpty(timeFrom)){ - timeFrom = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT, "GMT+8")+"+08:00"; + if (StringUtils.isEmpty(timeFrom)) { + timeFrom = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00"; } params.put("timeFrom", timeFrom); params.put("platform", "SEXYBCRT"); - params.put("delayTime",10000); + params.put("delayTime", 10000); AEBetRecordResponse aeBetRecordResponse = AEClient.getBetRecordByTime(params); //判断是否获取成功 if (this.getIsSuccess(aeBetRecordResponse.getStatus())) { //数据组装 - this.batchInsert(aeBetRecordResponse); + this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO); return Boolean.TRUE; } else { log.error("GamesAEServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc()); @@ -436,19 +423,19 @@ public class GamesAEServiceImpl implements IGamesService { 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 endTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT, "GMT+8")+"+08:00"; + String startTime = DateUtils.convertTimestampToFormattedDate(startTimeLong, DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00"; + String endTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00"; params.put("startTime", startTime); params.put("endTime", endTime); - params.put("platform","SEXYBCRT"); + params.put("platform", "SEXYBCRT"); AEBetRecordResponse aeBetRecordResponse = AEClient.getBetHistoryRecordByTime(params); //判断是否获取成功 if (this.getIsSuccess(aeBetRecordResponse.getStatus())) { //数据组装 - this.batchInsert(aeBetRecordResponse); + this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO); return Boolean.TRUE; } else { log.error("GamesAEServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc()); @@ -548,22 +535,24 @@ public class GamesAEServiceImpl implements IGamesService { * * @param aeBetRecordResponse ae下注记录响应dto */ - private void batchInsert(AEBetRecordResponse aeBetRecordResponse) { + private void batchInsert(AEBetRecordResponse aeBetRecordResponse, BetRecordByTimeDTO betRecordByTimeDTO) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 List dataBean = aeBetRecordResponse.getTransactions(); - String timeFrom=null ; + String timeFrom = null; //数据转化 for (AEBetRecordResponse.Transaction bean : dataBean) { - GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean).build()); + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder() + .platform(betRecordByTimeDTO.getVendor()) + .data(bean).build()); if (!ObjectUtils.isEmpty(bettingDetails)) { bettingDetails.setId(IdUtil.getSnowflakeNextId()); gameBettingDetails.add(bettingDetails); } wagersIds.add(bean.getPlatform() + bean.getPlatformTxId()); - timeFrom=bean.getUpdateTime(); + timeFrom = bean.getUpdateTime(); } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id @@ -576,8 +565,8 @@ public class GamesAEServiceImpl implements IGamesService { gameBettingDetailsService.batchInsert(gameBettingDetails); } } - if (StringUtils.isEmpty(timeFrom)){ - timeFrom = DateUtils.convertTimestampToFormattedDate(DateUtils.getNowDate(), DateUtils.ISO_8601_FORMAT, "UTC+8")+"+08:00"; + if (StringUtils.isEmpty(timeFrom)) { + timeFrom = DateUtils.convertTimestampToFormattedDate(DateUtils.getNowDate(), DateUtils.ISO_8601_FORMAT, "UTC+8") + "+08:00"; } redisCache.setCacheObject(CacheConstants.AE_TIME_FROM, timeFrom); } @@ -593,10 +582,10 @@ public class GamesAEServiceImpl implements IGamesService { //转化类 AEBetRecordResponse.Transaction resultBean = (AEBetRecordResponse.Transaction) gamesDataBuildDTO.getData(); - GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() + /*GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() .platformCode(GamePlatforms.AE.getInfo()) .currency(resultBean.getCurrency()) - .build()); + .build());*/ Member member = memberService.selectMemberByGameAccount(resultBean.getUserId()); if (ObjectUtils.isEmpty(member)) { @@ -606,26 +595,26 @@ public class GamesAEServiceImpl implements IGamesService { // 判断输赢 Integer gameStatus = GameStatus.FLAT.getCode(); - BigDecimal payoffAmount=BigDecimal.ZERO; + BigDecimal payoffAmount = BigDecimal.ZERO; if (resultBean.getRealWinAmount().compareTo(resultBean.getRealBetAmount()) > 0) { gameStatus = GameStatus.WIN.getCode(); - payoffAmount=resultBean.getRealWinAmount().subtract(resultBean.getRealBetAmount()); - } else if (resultBean.getRealWinAmount().compareTo(resultBean.getRealBetAmount()) < 0) { + payoffAmount = resultBean.getRealWinAmount().subtract(resultBean.getRealBetAmount()); + } else if (resultBean.getRealWinAmount().compareTo(resultBean.getRealBetAmount()) < 0) { gameStatus = GameStatus.FAIL.getCode(); - payoffAmount=resultBean.getRealWinAmount().subtract(resultBean.getRealBetAmount()).abs(); + payoffAmount = resultBean.getRealWinAmount().subtract(resultBean.getRealBetAmount()).abs(); } //结算状态 - int settlementStatus=SettlementStatusEnum.REVOKED.getCode(); - if (resultBean.getTxStatus() == 1){ - settlementStatus=SettlementStatusEnum.COMPLETED.getCode(); + int settlementStatus = SettlementStatusEnum.REVOKED.getCode(); + if (resultBean.getTxStatus() == 1) { + settlementStatus = SettlementStatusEnum.COMPLETED.getCode(); } //数据构造 GameBettingDetails gameBettingDetails = GameBettingDetails.builder() .tenantKey(member.getTenantKey()) //保存我们的币种id - .currencyCode(currencyDTO.getSystemCurrency()) + .currencyCode(gamesDataBuildDTO.getPlatform().getOurCurrency(resultBean.getCurrency())) .memberId(member.getId()) .gameCode(resultBean.getGameCode()) .gameType(PlatformType.GAME_HALL.getCode()) @@ -636,7 +625,7 @@ public class GamesAEServiceImpl implements IGamesService { .gameStatusType(resultBean.getSettleStatus()) .gameCurrencyCode(resultBean.getCurrency()) .account(resultBean.getUserId()) - .wagersId(resultBean.getPlatform()+resultBean.getPlatformTxId()) + .wagersId(resultBean.getPlatform() + resultBean.getPlatformTxId()) .wagersTime(resultBean.getBetTime().getTime()) .betAmount(resultBean.getRealBetAmount()) .payoffTime(resultBean.getTxTime().getTime()) 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 7153ed0..cf46f08 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 @@ -4,14 +4,10 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; 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.SleepUtil; import com.ff.base.utils.StringUtils; import com.ff.base.utils.sign.Md5Utils; import com.ff.base.utils.uuid.IdUtils; @@ -19,14 +15,8 @@ import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; import com.ff.game.api.dg.client.DGClient; import com.ff.game.api.dg.dto.*; -import com.ff.game.api.ng.dto.ApiLoginResponseDTO; -import com.ff.game.api.ng.dto.ApiMemberInfoResponseDTO; -import com.ff.game.api.ng.dto.ApiNGResponseDTO; import com.ff.game.api.request.*; -import com.ff.game.api.xk.client.XKClient; -import com.ff.game.api.xk.dto.*; import com.ff.game.domain.*; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; import com.ff.game.service.*; import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; @@ -40,7 +30,6 @@ import org.springframework.util.ObjectUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -54,13 +43,6 @@ import java.util.stream.Collectors; @Slf4j public class GamesDGServiceImpl implements IGamesService { - - @Resource - private ISysConfigService configService; - - @Resource - private RedisCache redisCache; - @Resource private IGameExchangeMoneyService gameExchangeMoneyService; @@ -76,18 +58,9 @@ public class GamesDGServiceImpl implements IGamesService { @Resource private IMemberService memberService; - @Resource - private IGameFreeRecordService gameFreeRecordService; - @Resource - private IGameSecretKeyService gameSecretKeyService; - - @Resource - private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; - @Resource private DGClient DGClient; - @Resource private KeyConfig keyConfig; @@ -97,7 +70,6 @@ public class GamesDGServiceImpl implements IGamesService { @Resource private IGameNameService gameNameService; - /** * 游戏id */ @@ -229,9 +201,9 @@ public class GamesDGServiceImpl implements IGamesService { @Transactional @Override public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) { - GamePlatform gamePlatform = gamePlatformService.selectGamePlatformById(PLATFORM_ID); + //GamePlatform gamePlatform = gamePlatformService.selectGamePlatformById(PLATFORM_ID); //没有此平台就新增一个平台 - if (ObjectUtils.isEmpty(gamePlatform)) { + /*if (ObjectUtils.isEmpty(gamePlatform)) { gamePlatform = new GamePlatform(); gamePlatform.setId(PLATFORM_ID); gamePlatform.setPlatformCode(GamePlatforms.DG.getInfo()); @@ -240,21 +212,24 @@ public class GamesDGServiceImpl implements IGamesService { 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(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); - game.setPlatformId(gamePlatform.getId()); + game.setSortNo(1); + //game.setPlatformId(gamePlatform.getId()); + game.setPlatformCode(GamePlatforms.DG.getCode()); + game.setPlatformType(PlatformType.GAME_HALL.getCode()); game.setGameCode("1"); game.setGameSourceType(String.valueOf(1)); game.setGameName("真人棋牌"); game.setCreateBy(Constants.SYSTEM); + game.setNameInfo(Collections.singletonList(new NameInfo("真人棋牌", "zh-CN"))); gameService.insertGame(game); } - GameName gameName = gameNameService.selectGameNameById(GAME_NAME_ID); + /*GameName gameName = gameNameService.selectGameNameById(GAME_NAME_ID); if (ObjectUtils.isEmpty(gameName)) { gameNameService.insertGameName(GameName.builder() .id(GAME_NAME_ID) @@ -263,7 +238,7 @@ public class GamesDGServiceImpl implements IGamesService { .langCode("zh-CN") .createBy(Constants.SYSTEM) .build()); - } + }*/ return CacheConstants.DG_GAMES; } @@ -277,10 +252,10 @@ 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()); +// 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(); @@ -300,7 +275,7 @@ public class GamesDGServiceImpl implements IGamesService { .quota(exchangeTransferMoneyRequestDTO.getQuota()) .balance(exchangeTransferMoneyRequestDTO.getAmount()) .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(currencyDTO.getSystemCurrency()) + .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) .platformCode(GamePlatforms.DG.getInfo()) @@ -373,9 +348,7 @@ public class GamesDGServiceImpl implements IGamesService { DGBetRecordResponseDTO betRecordByTime = DGClient.getBetRecordByTime(key); if (this.getIsSuccess(betRecordByTime.getCodeId())) { - this.batchInsert(betRecordByTime,betRecordByTimeDTO); - - + this.batchInsert(betRecordByTime, betRecordByTimeDTO); return Boolean.TRUE; } else { log.error("GamesDGServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getCodeId(), betRecordByTime.getMsg()); @@ -432,14 +405,14 @@ public class GamesDGServiceImpl implements IGamesService { if (!this.getIsSuccess(userListResponseDTO.getCodeId())) { throw new ApiException(ErrorCode.KICK_OUT_AILED.getCode()); } - if (CollectionUtils.isEmpty(userListResponseDTO.getList())){ + if (CollectionUtils.isEmpty(userListResponseDTO.getList())) { return Boolean.TRUE; } DGUserListResponseDTO.UserDTO userDTO = userListResponseDTO.getList().stream() .filter(user -> user.getUsername().equals(kickMemberRequestDTO.getAccount())) .findFirst() .orElse(null); - if (Objects.isNull(userDTO)){ + if (Objects.isNull(userDTO)) { return Boolean.TRUE; } @@ -447,7 +420,7 @@ public class GamesDGServiceImpl implements IGamesService { List memberIds = new ArrayList<>(); memberIds.add(userDTO.getMemberId()); Map params = new LinkedHashMap<>(); - params.put("list",memberIds); + params.put("list", memberIds); DGResponse dgResponse = DGClient.kickMember(params, key); //判断是否获取成功 if (this.getIsSuccess(dgResponse.getCodeId())) { @@ -472,7 +445,7 @@ public class GamesDGServiceImpl implements IGamesService { throw new ApiException(ErrorCode.KICK_OUT_AILED.getCode()); } - if (CollectionUtils.isEmpty(userListResponseDTO.getList())){ + if (CollectionUtils.isEmpty(userListResponseDTO.getList())) { return Boolean.TRUE; } @@ -480,7 +453,7 @@ public class GamesDGServiceImpl implements IGamesService { Map params = new LinkedHashMap<>(); - params.put("list",memberIds); + params.put("list", memberIds); DGResponse dgResponse = DGClient.kickMember(params, key); //判断是否获取成功 if (this.getIsSuccess(dgResponse.getCodeId())) { @@ -513,7 +486,6 @@ public class GamesDGServiceImpl implements IGamesService { } - /** * 取消赠送免费局数 * @@ -531,14 +503,16 @@ public class GamesDGServiceImpl implements IGamesService { * * @param dgBetRecordResponseDTO dg投注记录响应dto */ - private void batchInsert(DGBetRecordResponseDTO dgBetRecordResponseDTO,GamesBaseRequestDTO gamesBaseRequestDTO) { + private void batchInsert(DGBetRecordResponseDTO dgBetRecordResponseDTO, GamesBaseRequestDTO gamesBaseRequestDTO) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 List report = dgBetRecordResponseDTO.getList(); //数据转化 for (DGBetRecordResponseDTO.ReportDTO bean : report) { - GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean).build()); + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder() + .platform(gamesBaseRequestDTO.getVendor()) + .data(bean).build()); if (!ObjectUtils.isEmpty(bettingDetails)) { bettingDetails.setId(IdUtil.getSnowflakeNextId()); gameBettingDetails.add(bettingDetails); @@ -547,7 +521,7 @@ public class GamesDGServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds,GamePlatforms.DG.getInfo()); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.DG.getInfo()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) @@ -557,7 +531,7 @@ public class GamesDGServiceImpl implements IGamesService { Map key = this.getKey(gamesBaseRequestDTO); Map params = new HashMap<>(); params.put("list", wagersIds); - DGClient.markReport(params,key); + DGClient.markReport(params, key); } } @@ -575,10 +549,10 @@ public class GamesDGServiceImpl implements IGamesService { DGBetRecordResponseDTO.ReportDTO resultBean = (DGBetRecordResponseDTO.ReportDTO) gamesDataBuildDTO.getData(); - GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCode(GamePlatforms.DG.getInfo()) - .currencyId(String.valueOf(resultBean.getCurrencyId())) - .build()); +// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCode(GamePlatforms.DG.getInfo()) +// .currencyId(String.valueOf(resultBean.getCurrencyId())) +// .build()); Member member = memberService.selectMemberByGameAccount(resultBean.getUserName()); @@ -608,16 +582,16 @@ public class GamesDGServiceImpl implements IGamesService { GameBettingDetails gameBettingDetails = GameBettingDetails.builder() .tenantKey(member.getTenantKey()) //保存我们的币种id - .currencyCode(currencyDTO.getSystemCurrency()) + .currencyCode(gamesDataBuildDTO.getPlatform().getExtInfo().getOurCurrency(String.valueOf(resultBean.getCurrencyId()))) .memberId(member.getId()) .gameCode(String.valueOf(resultBean.getGameId())) .gameType(PlatformType.CARD_GAME.getCode()) - .platformCode(GamePlatforms.DG.getInfo()) + .platformCode(GamePlatforms.DG.getCode()) .gameId(GAME_ID) .gameName(game.getGameName()) .gameStatus(gameStatus) .gameStatusType(resultBean.getGameType()) - .gameCurrencyCode(currencyDTO.getCurrency()) + .gameCurrencyCode(/*gamesDataBuildDTO.getCurrencyCode()*/String.valueOf(resultBean.getCurrencyId())) .account(String.valueOf(resultBean.getUserName())) .wagersId(String.valueOf(resultBean.getId())) .wagersTime(resultBean.getBetTime().getTime()) 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 df5c607..faae116 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 @@ -9,19 +9,19 @@ 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.StringUtils; import com.ff.base.utils.sign.Md5Utils; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; -import com.ff.game.api.fc.dto.*; import com.ff.game.api.fc.client.FCClient; -import com.ff.game.api.ng.client.NGClient; +import com.ff.game.api.fc.dto.*; import com.ff.game.api.request.*; import com.ff.game.domain.*; -import com.ff.game.dto.GameBettingDetailsDTO; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; -import com.ff.game.service.*; +import com.ff.game.service.IGameBettingDetailsService; +import com.ff.game.service.IGameExchangeMoneyService; +import com.ff.game.service.IGameService; +import com.ff.game.service.IPlatformService; import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; import lombok.extern.slf4j.Slf4j; @@ -54,21 +54,12 @@ import java.util.stream.Collectors; @Slf4j public class GamesFCServiceImpl implements IGamesService { - - @Resource - private ISysConfigService configService; - @Resource private RedisCache redisCache; @Resource private IGameExchangeMoneyService gameExchangeMoneyService; - - @Resource - private IGamePlatformService gamePlatformService; - - @Resource private IGameService gameService; @@ -76,37 +67,22 @@ public class GamesFCServiceImpl implements IGamesService { @Resource private IMemberService memberService; - @Resource - private IGameFreeRecordService gameFreeRecordService; - - @Resource - private IGameSecretKeyService gameSecretKeyService; - @Resource private FCClient FCClient; - @Resource private KeyConfig keyConfig; @Resource private IGameBettingDetailsService gameBettingDetailsService; - @Resource - private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; - - @Resource - private IGameNameService gameNameService; - - - @Resource - private IGameSecretKeyLangService gameSecretKeyLangService; - - @Autowired @Qualifier("threadPoolTaskExecutor") private ThreadPoolTaskExecutor threadPoolTaskExecutor; + @Autowired + private IPlatformService platformService; + /** * 获得就是成功 * @@ -276,45 +252,40 @@ public class GamesFCServiceImpl implements IGamesService { for (String gameTypeKey : gameList.getGetGameIconList().keySet()) { Map integerGameDetailsMap = gameList.getGetGameIconList().get(gameTypeKey); - GamePlatform gamePlatform = GamePlatform.builder() - .platformType(FCGameType.findSystemByCode(gameTypeKey)) - .platformCode(GamePlatforms.FC.getInfo()) - .build(); - List gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform); - //没有此平台就新增一个平台 - if (CollectionUtils.isEmpty(gamePlatforms)) { - gamePlatform.setPlatformName(GamePlatforms.FC.getInfo() + FCGameType.findInfoByCode(gameTypeKey)); - gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1); - gamePlatform.setCreateBy(Constants.SYSTEM); - gamePlatformService.insertGamePlatform(gamePlatform); - } else { - gamePlatform = gamePlatforms.get(0); - } //新增游戏 for (String gameIdKey : integerGameDetailsMap.keySet()) { ApiFCGameListResponseDTO.GameDetails gameDetails = integerGameDetailsMap.get(gameIdKey); Game game = Game.builder() - .platformId(gamePlatform.getId()) + //.platformId(gamePlatform.getId()) + .platformCode(GamePlatforms.FC.getCode()) .gameCode(gameIdKey) .build(); List games = gameService.selectGameList(game); + int platformType = FCGameType.findSystemByCode(gameTypeKey); //不存在这个游戏 if (CollectionUtils.isEmpty(games)) { game.setGameSourceType(String.valueOf(PlatformType.ELECTRONIC.getCode())); game.setFreespin(Boolean.FALSE); game.setDemoStatus(Boolean.TRUE); - game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); + 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); + + 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); 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()); + /*List gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(gameDetails.getGameNameOfChinese()).build()); if (CollectionUtils.isEmpty(gameNames)) { gameNameService.insertGameName(GameName.builder() .gameId(game.getId()) @@ -331,7 +302,7 @@ public class GamesFCServiceImpl implements IGamesService { .langCode("en-US") .createBy(Constants.SYSTEM) .build()); - } + }*/ gameDetails.setGameId(gameIdKey); gameDetailsList.add(gameDetails); @@ -359,11 +330,11 @@ 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()); +// 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); @@ -383,7 +354,7 @@ public class GamesFCServiceImpl implements IGamesService { .quota(exchangeTransferMoneyRequestDTO.getQuota()) .balance(exchangeTransferMoneyRequestDTO.getAmount()) .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(currencyDTO.getSystemCurrency()) + .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) .platformCode(GamePlatforms.FC.getInfo()) @@ -402,7 +373,7 @@ public class GamesFCServiceImpl implements IGamesService { .accounts(member.getGameAccount()) .agentId(exchangeTransferMoneyRequestDTO.getAgentId()) .agentKey(exchangeTransferMoneyRequestDTO.getAgentKey()) - .currency(currencyDTO.getCurrency()) + .currency(exchangeTransferMoneyRequestDTO.getCurrency()) .build(); MemberInfoResponseDTO memberInfo = this.getMemberInfo(gamesBaseRequestDTO); //判断是不是转出 @@ -459,29 +430,37 @@ public class GamesFCServiceImpl implements IGamesService { @Override public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { +// List gameSecretKeyCurrencies = gameSecretKeyCurrencyService +// .findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO.builder() +// .platformCode(GamePlatforms.FC.getInfo()) +// .build()); - List gameSecretKeyCurrencies = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO.builder() - .platformCode(GamePlatforms.FC.getInfo()) - .build()); - - for (GameSecretKeyCurrency gameSecretKeyCurrency : gameSecretKeyCurrencies) { + 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); - paramsMap.putAll(getKeyMap(paramsMap, betRecordByTimeDTO.getAgentKey(), gameSecretKeyCurrency.getCurrency(), betRecordByTimeDTO.getAgentId())); + 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; + } + + paramsMap.putAll(getKeyMap(paramsMap, betRecordByTimeDTO.getAgentKey(), keyInfo.getCurrency(), betRecordByTimeDTO.getAgentId())); ApiFCBetRecordResponseDTO betRecordByTime = FCClient.getBetRecordByTime(paramsMap); if (this.getIsSuccess(betRecordByTime.getResult())) { //数据组装 - this.batchInsert(betRecordByTime, gameSecretKeyCurrency.getSystemCurrency(), gameSecretKeyCurrency.getCurrency()); - + this.batchInsert(betRecordByTime, currency, targetCurrency); } - - - } + //} return Boolean.TRUE; } @@ -493,15 +472,20 @@ public class GamesFCServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { - List gameSecretKeyCurrencies = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO.builder() - .platformCode(GamePlatforms.FC.getInfo()) - .build()); - for (GameSecretKeyCurrency gameSecretKeyCurrency : gameSecretKeyCurrencies) { + 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); - + String currency = keyInfo.getCurrency(); + String targetCurrency = platform.getCurrencyInfo().get(currency); + if (StringUtils.isEmpty(targetCurrency)) { + log.error("获取不到币种,platformCode:{},{}->{}", platform.getPlatformCode(), currency, targetCurrency); + continue; + } //查询一个小时内的数据一次最多15分钟 int timeWheel = 60; while (timeWheel > 0) { @@ -510,18 +494,16 @@ public class GamesFCServiceImpl implements IGamesService { Map paramsMap = new HashMap<>(); paramsMap.put("StartDate", startTime); paramsMap.put("EndDate", endTime); - paramsMap.putAll(getKeyMap(paramsMap, betRecordByTimeDTO.getAgentKey(), gameSecretKeyCurrency.getCurrency(), betRecordByTimeDTO.getAgentId())); + paramsMap.putAll(getKeyMap(paramsMap, betRecordByTimeDTO.getAgentKey(), targetCurrency, betRecordByTimeDTO.getAgentId())); ApiFCBetRecordResponseDTO betRecordByTime = FCClient.getBetRecordByHistoryTime(paramsMap); if (this.getIsSuccess(betRecordByTime.getResult())) { //数据组装 - this.batchInsert(betRecordByTime, gameSecretKeyCurrency.getSystemCurrency(), gameSecretKeyCurrency.getCurrency()); + this.batchInsert(betRecordByTime, currency, targetCurrency); } timeWheel -= 15; } - - } return Boolean.TRUE; } @@ -660,7 +642,7 @@ public class GamesFCServiceImpl implements IGamesService { .memberId(member.getId()) .gameCode(resultBean.getGameID()) .gameType(FCGameType.findSystemByCode(resultBean.getGametype())) - .platformCode(GamePlatforms.FC.getInfo()) + .platformCode(GamePlatforms.FC.getCode()) .gameId(gamesDataDTO.getSystemGameId()) .gameName(gamesDataDTO.getGameNameOfChinese()) .gameStatus(gameStatus) @@ -694,7 +676,9 @@ public class GamesFCServiceImpl implements IGamesService { List wagersIds = new ArrayList<>(); //数据转化 for (ApiFCBetRecordResponseDTO.BetRecord bean : data.getRecords()) { - GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean).currencyCode(currencyCode).systemCurrencyCode(systemCurrencyCode).build()); + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean) + .currencyCode(currencyCode) + .systemCurrencyCode(systemCurrencyCode).build()); if (!ObjectUtils.isEmpty(bettingDetails)) { bettingDetails.setId(IdUtil.getSnowflakeNextId()); gameBettingDetails.add(bettingDetails); @@ -703,7 +687,7 @@ public class GamesFCServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds,GamePlatforms.FC.getInfo()); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.FC.getInfo()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) 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 86b3d74..c7abe9e 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 @@ -19,8 +19,10 @@ import com.ff.game.api.jili.client.JILIClient; import com.ff.game.api.jili.dto.*; import com.ff.game.api.request.*; import com.ff.game.domain.*; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; -import com.ff.game.service.*; +import com.ff.game.service.IGameBettingDetailsService; +import com.ff.game.service.IGameExchangeMoneyService; +import com.ff.game.service.IGameFreeRecordService; +import com.ff.game.service.IGameService; import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; import lombok.extern.slf4j.Slf4j; @@ -58,10 +60,6 @@ public class GamesJILIServiceImpl implements IGamesService { private IGameExchangeMoneyService gameExchangeMoneyService; - @Resource - private IGamePlatformService gamePlatformService; - - @Resource private IGameService gameService; @@ -72,8 +70,6 @@ public class GamesJILIServiceImpl implements IGamesService { @Resource private IGameFreeRecordService gameFreeRecordService; - @Resource - private IGameSecretKeyService gameSecretKeyService; @Resource private JILIClient jiliClient; @@ -85,11 +81,6 @@ public class GamesJILIServiceImpl implements IGamesService { @Resource private IGameBettingDetailsService gameBettingDetailsService; - @Resource - private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; - - @Resource - private IGameNameService gameNameService; /** * 获得就是成功 * @@ -138,10 +129,10 @@ public class GamesJILIServiceImpl implements IGamesService { String key = this.getKey(createMemberRequestDTO); JILICreateMemberResponseDTO createMemberResponseDTO = jiliClient.createMember(query + "&Key=" + key); int errorCode = createMemberResponseDTO.getErrorCode(); - if (0 == errorCode){ + if (0 == errorCode) { return Boolean.TRUE; } - if (101 == errorCode){ + if (101 == errorCode) { throw new ApiException(ErrorCode.GAME_ACCOUNT_CREATION_FAILED.getCode()); } //判断是否获取成功 @@ -235,7 +226,7 @@ public class GamesJILIServiceImpl implements IGamesService { if (this.getIsSuccess(jiliGames.getErrorCode())) { for (JILIGamesDataDTO gamesDataDTO : jiliGames.getData()) { - GamePlatform gamePlatform = GamePlatform.builder() + /*GamePlatform gamePlatform = GamePlatform.builder() .platformType(JILIGameType.findSystemByCode(gamesDataDTO.getGameCategoryId())) .platformCode(GamePlatforms.JILI.getInfo()) .build(); @@ -248,9 +239,12 @@ public class GamesJILIServiceImpl implements IGamesService { gamePlatformService.insertGamePlatform(gamePlatform); } else { gamePlatform = gamePlatforms.get(0); - } + }*/ + Integer platformType = JILIGameType.findSystemByCode(gamesDataDTO.getGameCategoryId()); Game game = Game.builder() - .platformId(gamePlatform.getId()) + //.platformId(gamePlatform.getId()) + .platformCode(GamePlatforms.JILI.getCode()) + .platformType(platformType) .gameCode(String.valueOf(gamesDataDTO.getGameId())) .build(); List games = gameService.selectGameList(game); @@ -258,7 +252,7 @@ public class GamesJILIServiceImpl implements IGamesService { if (CollectionUtils.isEmpty(games)) { game.setGameSourceType(String.valueOf(gamesDataDTO.getGameCategoryId())); game.setFreespin(gamesDataDTO.isFreespin()); - game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); + game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.JILI.getCode()) + 1); game.setGameName(gamesDataDTO.getName().getZhCN()); game.setCreateBy(Constants.SYSTEM); gameService.insertGame(game); @@ -266,9 +260,16 @@ public class GamesJILIServiceImpl implements IGamesService { game = games.get(0); } gamesDataDTO.setSystemGameId(game.getId()); + List nameInfos = new ArrayList<>(); + nameInfos.add(new NameInfo(gamesDataDTO.getName().getZhCN(), "zh-CN")); + nameInfos.add(new NameInfo(gamesDataDTO.getName().getEnUS(), "en-US")); + game.setNameInfo(nameInfos); - List gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(game.getGameName()).build()); - if (CollectionUtils.isEmpty(gameNames)){ + /*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()) @@ -282,8 +283,7 @@ public class GamesJILIServiceImpl implements IGamesService { .langCode("en-US") .createBy(Constants.SYSTEM) .build()); - } - + }*/ } @@ -308,9 +308,9 @@ 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()); +// 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(); @@ -332,7 +332,7 @@ public class GamesJILIServiceImpl implements IGamesService { .quota(exchangeTransferMoneyRequestDTO.getQuota()) .balance(exchangeTransferMoneyRequestDTO.getAmount()) .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(gameSecretKey.getSystemCurrency()) + .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) .platformCode(GamePlatforms.JILI.getInfo()) @@ -410,8 +410,12 @@ public class GamesJILIServiceImpl implements IGamesService { //判断是否获取成功 if (this.getIsSuccess(betRecordJILIResponse.getErrorCode())) { + + KeyInfo keyInfo = betRecordByTimeDTO.getKeyInfo(); + String currency = keyInfo.getCurrency(); + String targetCurrency = betRecordByTimeDTO.getVendor().getOurCurrency(currency); //数据插入 - this.batchInsert(betRecordJILIResponse); + this.batchInsert(betRecordJILIResponse, betRecordByTimeDTO, currency, targetCurrency); JILIBetRecordResponseDTO.DataBean dataBean = betRecordJILIResponse.getData(); //获取下一页数据 while (dataBean.getPagination().getCurrentPage() != dataBean.getPagination().getTotalPages() && dataBean.getPagination().getTotalPages() > 0) { @@ -425,7 +429,7 @@ public class GamesJILIServiceImpl implements IGamesService { dataBean = betRecordJILIResponse.getData(); if (this.getIsSuccess(betRecordJILIResponse.getErrorCode())) { //数据插入 - this.batchInsert(betRecordJILIResponse); + this.batchInsert(betRecordJILIResponse, betRecordByTimeDTO, currency, targetCurrency); } else { log.error("GameBettingDataJILIServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordJILIResponse.getErrorCode(), betRecordJILIResponse.getMessage()); } @@ -461,9 +465,9 @@ 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()); +// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .code(createFreeSpinRequest.getAgentId()) +// .currency(createFreeSpinRequest.getCurrency()).build()); List gameIds = createFreeSpinRequest.getGameIds(); GameUniqueDTO gameUniqueDTO = new GameUniqueDTO(); @@ -473,7 +477,7 @@ public class GamesJILIServiceImpl implements IGamesService { .map(Game::getGameCode) .map(String::valueOf) .collect(Collectors.joining(",")); - String referenceId = GamePlatforms.JILI.getInfo() + IdUtils.simpleUUID(); + String referenceId = GamePlatforms.JILI.getCode() + IdUtils.simpleUUID(); //请求参数 String query = "Account=" + createFreeSpinRequest.getAccount() + "&Currency=" + createFreeSpinRequest.getCurrency() @@ -514,7 +518,7 @@ public class GamesJILIServiceImpl implements IGamesService { GameFreeRecord gameFreeRecord = GameFreeRecord.builder() - .currencyCode(gameSecretKey.getSystemCurrency()) + .currencyCode(createFreeSpinRequest.getSystemCurrency()) .referenceId(referenceId) .platformCode(GamePlatforms.JILI.getInfo()) .memberId(member.getId()) @@ -677,7 +681,7 @@ public class GamesJILIServiceImpl implements IGamesService { cancelFreeSpinRequestDTO.setQuery(query); //获取key String key = this.getKey(cancelFreeSpinRequestDTO); - JILICancelFreeSpinResponseDTO cancelFreeSpinResponseDTO = jiliClient.cancelFreeSpin(query + "&Key=" + key); + JILICancelFreeSpinResponseDTO cancelFreeSpinResponseDTO = jiliClient.cancelFreeSpin(query + "&Key=" + key); //判断是否获取成功 if (this.getIsSuccess(cancelFreeSpinResponseDTO.getErrorCode())) { List gameFreeRecords = gameFreeRecordService.selectGameFreeRecordList(GameFreeRecord.builder() @@ -692,6 +696,7 @@ public class GamesJILIServiceImpl implements IGamesService { throw new BaseException(cancelFreeSpinResponseDTO.getMessage()); } } + /** * 游戏演示登录 * @@ -704,21 +709,24 @@ public class GamesJILIServiceImpl implements IGamesService { } - /** * 批量插入 * * @param betRecordJILIResponse 投注记录jiliresponse * @return {@link Integer } */ - private void batchInsert(JILIBetRecordResponseDTO betRecordJILIResponse) { + private void batchInsert(JILIBetRecordResponseDTO betRecordJILIResponse, BetRecordByTimeDTO betRecordByTimeDTO, String systemCurrency, String currency) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 JILIBetRecordResponseDTO.DataBean dataBean = betRecordJILIResponse.getData(); //数据转化 for (JILIBetRecordDataResponseDTO jiliBetRecordDataResponseDTO : dataBean.getResult()) { - GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(jiliBetRecordDataResponseDTO).build()); + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder() + .systemCurrencyCode(systemCurrency) + .currencyCode(currency) + .platform(betRecordByTimeDTO.getVendor()) + .data(jiliBetRecordDataResponseDTO).build()); if (!ObjectUtils.isEmpty(bettingDetails)) { bettingDetails.setId(IdUtil.getSnowflakeNextId()); gameBettingDetails.add(bettingDetails); @@ -727,7 +735,7 @@ public class GamesJILIServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds,GamePlatforms.JILI.getInfo()); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.JILI.getInfo()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) @@ -750,9 +758,9 @@ public class GamesJILIServiceImpl implements IGamesService { //转化类 JILIBetRecordDataResponseDTO jiliBetRecordDataResponseDTO = (JILIBetRecordDataResponseDTO) gamesDataBuildDTO.getData(); - GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .code(jiliBetRecordDataResponseDTO.getAgentId()) - .platformCode(GamePlatforms.JILI.getInfo()).build()); +// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .code(jiliBetRecordDataResponseDTO.getAgentId()) +// .platformCode(GamePlatforms.JILI.getInfo()).build()); Member member = memberService.selectMemberByGameAccount(jiliBetRecordDataResponseDTO.getAccount()); @@ -773,7 +781,7 @@ public class GamesJILIServiceImpl implements IGamesService { GameBettingDetails gameBettingDetails = GameBettingDetails.builder() .tenantKey(member.getTenantKey()) //保存我们的币种id - .currencyCode(gameSecretKey.getSystemCurrency()) + .currencyCode(/*gameSecretKey.getSystemCurrency()*/gamesDataBuildDTO.getSystemCurrencyCode()) .memberId(member.getId()) .gameCode(jiliBetRecordDataResponseDTO.getGameId()) .gameType(JILIGameType.findSystemByCode(jiliBetRecordDataResponseDTO.getGameCategoryId())) diff --git a/ff-game/src/main/java/com/ff/game/api/request/BetRecordByTimeDTO.java b/ff-game/src/main/java/com/ff/game/api/request/BetRecordByTimeDTO.java index a0bb724..61dccb9 100644 --- a/ff-game/src/main/java/com/ff/game/api/request/BetRecordByTimeDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/request/BetRecordByTimeDTO.java @@ -30,13 +30,6 @@ public class BetRecordByTimeDTO extends GamesBaseRequestDTO { * 游戏id */ private Integer gameId; - /** - * 指定平台 - */ - private String gamePlatform; - - - } diff --git a/ff-game/src/main/java/com/ff/game/api/request/GamesBaseRequestDTO.java b/ff-game/src/main/java/com/ff/game/api/request/GamesBaseRequestDTO.java index 48511cb..e55b059 100644 --- a/ff-game/src/main/java/com/ff/game/api/request/GamesBaseRequestDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/request/GamesBaseRequestDTO.java @@ -46,5 +46,6 @@ public class GamesBaseRequestDTO implements Serializable { private KeyInfo keyInfo; + private String systemCurrency; } diff --git a/ff-game/src/main/java/com/ff/game/api/request/GamesDataBuildDTO.java b/ff-game/src/main/java/com/ff/game/api/request/GamesDataBuildDTO.java index 73548ee..23cb419 100644 --- a/ff-game/src/main/java/com/ff/game/api/request/GamesDataBuildDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/request/GamesDataBuildDTO.java @@ -1,5 +1,6 @@ package com.ff.game.api.request; +import com.ff.game.domain.Platform; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -39,5 +40,7 @@ public class GamesDataBuildDTO */ private String agentId; + private Platform platform; + } diff --git a/ff-game/src/main/java/com/ff/game/domain/CurrencyInfo.java b/ff-game/src/main/java/com/ff/game/domain/CurrencyInfo.java index fc4456a..22c6e80 100644 --- a/ff-game/src/main/java/com/ff/game/domain/CurrencyInfo.java +++ b/ff-game/src/main/java/com/ff/game/domain/CurrencyInfo.java @@ -1,11 +1,16 @@ package com.ff.game.domain; +import lombok.Data; + import java.io.Serializable; import java.util.HashMap; /** * @author cengy */ +@Data public class CurrencyInfo extends HashMap implements Serializable { + private String currencyId; + } diff --git a/ff-game/src/main/java/com/ff/game/domain/ExtInfo.java b/ff-game/src/main/java/com/ff/game/domain/ExtInfo.java new file mode 100644 index 0000000..c86d5f9 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/domain/ExtInfo.java @@ -0,0 +1,20 @@ +package com.ff.game.domain; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * @author cengy + */ +@Data +public class ExtInfo implements Serializable { + + // 币种信息,key为其它平台的币种id,value为我们自己的币种 + private Map currency; + + public String getOurCurrency(String currencyId) { + return currency == null ? null : currency.get(currencyId); + } +} 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 252ebb8..673c71c 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 @@ -9,6 +9,8 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import java.util.List; + /** * 平台子游戏管理对象 ff_game * @@ -92,4 +94,5 @@ public class Game extends BaseEntity { */ private Integer platformType; + private List nameInfo; } 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 new file mode 100644 index 0000000..76c12d8 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/domain/NameInfo.java @@ -0,0 +1,20 @@ +package com.ff.game.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @author cengy + */ +@Data +@AllArgsConstructor +@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 9d818b7..6352a41 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 @@ -1,9 +1,13 @@ package com.ff.game.domain; import com.ff.base.core.domain.BaseEntity; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.Getter; import java.util.List; +import java.util.Map; +import java.util.Set; /** * @author cengy @@ -34,5 +38,39 @@ public class Platform extends BaseEntity { private LangInfo langInfo; private CurrencyInfo currencyInfo; private UrlInfo urlInfo; + /** + * 代理类型 0:代理单币种 1:代理多币种 + */ + private Integer type; + private ExtInfo extInfo; + + + @Getter + @AllArgsConstructor + public enum Type { + /** + * 代理类型 0:代理单币种 1:代理多币种 + */ + SINGLE(0, "代理单币种"), + MULTI(1, "代理多币种"); + + private Integer code; + private String name; + + } + + public boolean isMultiAgent() { + return this.type == Type.MULTI.getCode(); + } + + public String getOurCurrency(String currency) { + Set> entrySet= currencyInfo.entrySet(); + for (Map.Entry entry : entrySet) { + if (entry.getValue().equals(currency)) { + return entry.getKey(); + } + } + return null; + } } 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 a9db62d..c6deaeb 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 @@ -1,77 +1,77 @@ package com.ff.game.mapper; -import java.util.List; - import com.ff.api.response.GameResponse; import com.ff.game.api.request.GameUniqueDTO; import com.ff.game.domain.Game; import com.ff.game.dto.GameDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 平台子游戏管理Mapper接口 - * + * * @author shi * @date 2025-02-10 */ -public interface GameMapper -{ +public interface GameMapper { /** * 查询平台子游戏管理 - * + * * @param id 平台子游戏管理主键 * @return 平台子游戏管理 */ - Game selectGameById(Long id); + Game selectGameById(Long id); /** * 查询平台子游戏管理列表 - * + * * @param game 平台子游戏管理 * @return 平台子游戏管理集合 */ - List selectGameList(Game game); + List selectGameList(Game game); /** * 新增平台子游戏管理 - * + * * @param game 平台子游戏管理 * @return 结果 */ - int insertGame(Game game); + int insertGame(Game game); /** * 修改平台子游戏管理 - * + * * @param game 平台子游戏管理 * @return 结果 */ - int updateGame(Game game); + int updateGame(Game game); /** * 删除平台子游戏管理 - * + * * @param id 平台子游戏管理主键 * @return 结果 */ - int deleteGameById(Long id); + int deleteGameById(Long id); /** * 批量删除平台子游戏管理 - * + * * @param ids 需要删除的数据主键集合 * @return 结果 */ - int deleteGameByIds(Long[] ids); + int deleteGameByIds(Long[] ids); /** - * 按平台id选择最大排序号 + * 根据平台code与平台类型选择最大序号 * - * @param platformId 平台id - * @return {@link Integer } + * @param platformType + * @param platformCode + * @return */ - Integer selectMaxSortNoByPlatformId(Long platformId); - + Integer selectMaxSortNoBy(@Param("platformType") Integer platformType, @Param("platformCode") String platformCode); /** * 选择游戏唯一列表 @@ -79,7 +79,7 @@ public interface GameMapper * @param gameUniqueDTO 游戏独有dto * @return {@link List }<{@link Game }> */ - List selectGameUniqueList(GameUniqueDTO gameUniqueDTO); + List selectGameUniqueList(GameUniqueDTO gameUniqueDTO); /** * 选择游戏响应列表 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 8c8572c..e1a0863 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 @@ -1,36 +1,34 @@ package com.ff.game.service; -import java.util.List; - -import com.dtflys.forest.annotation.Body; import com.ff.api.response.GameResponse; import com.ff.game.api.request.GameUniqueDTO; import com.ff.game.domain.Game; import com.ff.game.dto.GameDTO; +import java.util.List; + /** * 平台子游戏管理Service接口 - * + * * @author shi * @date 2025-02-10 */ -public interface IGameService -{ +public interface IGameService { /** * 查询平台子游戏管理 - * + * * @param id 平台子游戏管理主键 * @return 平台子游戏管理 */ - Game selectGameById(Long id); + Game selectGameById(Long id); /** * 查询平台子游戏管理列表 - * + * * @param game 平台子游戏管理 * @return 平台子游戏管理集合 */ - List selectGameList(Game game); + List selectGameList(Game game); /** @@ -43,43 +41,42 @@ public interface IGameService /** * 新增平台子游戏管理 - * + * * @param game 平台子游戏管理 * @return 结果 */ - int insertGame(Game game); + int insertGame(Game game); /** * 修改平台子游戏管理 - * + * * @param game 平台子游戏管理 * @return 结果 */ - int updateGame(Game game); + int updateGame(Game game); /** * 批量删除平台子游戏管理 - * + * * @param ids 需要删除的平台子游戏管理主键集合 * @return 结果 */ - int deleteGameByIds(Long[] ids); + int deleteGameByIds(Long[] ids); /** * 删除平台子游戏管理信息 - * + * * @param id 平台子游戏管理主键 * @return 结果 */ - int deleteGameById(Long id); + int deleteGameById(Long id); /** * 按平台id选择最大排序号 * - * @param platformId 平台id * @return {@link Integer } */ - Integer selectMaxSortNoByPlatformId(Long platformId); + Integer selectMaxSortNo(Integer platformType, String platformCode); /** * 选择游戏唯一列表 @@ -103,7 +100,7 @@ public interface IGameService * @param endTime 结束时间 * @param platformCode 平台代码 */ - void insertGameBettingDetails(Long startTime,Long endTime,String platformCode); + void insertGameBettingDetails(Long startTime, Long endTime, String platformCode); } 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 19d7950..1732f03 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 @@ -1,43 +1,30 @@ package com.ff.quartz.task; import com.ff.base.constant.Constants; -import com.ff.base.core.redis.RedisCache; -import com.ff.base.datasource.DynamicDataSourceContextHolder; import com.ff.base.enums.GamePlatforms; -import com.ff.base.enums.NGPlatforms; -import com.ff.base.enums.PlatformType; import com.ff.base.enums.StatusType; import com.ff.base.utils.DateUtils; +import com.ff.base.utils.StringUtils; import com.ff.game.api.IGamesService; import com.ff.game.api.ng.client.NGClient; -import com.ff.game.api.ng.dto.ApiExchangeTransferStatusResponseDTO; -import com.ff.game.api.ng.dto.ApiNGResponseDTO; import com.ff.game.api.request.BetRecordByTimeDTO; import com.ff.game.api.request.ExchangeTransferStatusRequestDTO; import com.ff.game.api.request.GamesBaseRequestDTO; import com.ff.game.api.request.GetFreeSpinDashflowRequestDTO; import com.ff.game.domain.GameExchangeMoney; -import com.ff.game.domain.GameSecretKey; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; -import com.ff.game.dto.GameSecretKeyDTO; -import com.ff.game.service.*; +import com.ff.game.domain.KeyInfo; +import com.ff.game.domain.Platform; +import com.ff.game.service.IGameExchangeMoneyService; +import com.ff.game.service.IPlatformService; import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.scheduling.annotation.AsyncConfigurationSelector; -import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; -import org.springframework.util.ObjectUtils; import javax.annotation.Resource; -import javax.sql.DataSource; -import javax.xml.crypto.dsig.keyinfo.PGPData; -import java.util.*; -import java.util.stream.Collectors; +import java.util.List; +import java.util.Map; /** @@ -50,242 +37,206 @@ import java.util.stream.Collectors; @Component("gameTask") public class GameTask { - @Autowired private Map gamesService; - @Resource - private IGameSecretKeyService gameSecretKeyService; - - @Resource - private IGamePlatformService gamePlatformService; - - @Resource private NGClient ngClient; @Resource private IGameExchangeMoneyService gameExchangeMoneyService; - @Resource - private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; - @Resource private IMemberService memberService; @Resource - private RedisCache redisCache; - - - @Resource - private IGameService gameService; + private IPlatformService platformService; /** - * 插入游戏投注详细信息 + * 同步游戏列表 */ - - public void insertGameBettingDetails(Integer backTime) { - - //捞取指定分钟前的数据 - Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTime); - Long endTime = DateUtils.getNowDate(); - - - for (String gameKey : gamesService.keySet()) { - String platformCode = gameKey.replace(Constants.SERVICE, ""); - //特殊的平台跳过 - if (NGPlatforms.exists(platformCode) || GamePlatforms.FC.getInfo().equals(platformCode)) { - continue; + public void syncGameList() { + for (GamePlatforms gamePlatform : GamePlatforms.values()) { + String platformCode = gamePlatform.getCode(); + try { + syncGameList(platformCode); + } catch (Exception e) { + log.error("同步游戏列表失败platformCode:{}", platformCode, e); } + } + } - List gameSecretKeys = gameSecretKeyService.selectGameSecretKeyList(GameSecretKey.builder().platform(platformCode).build()); - for (GameSecretKey gameSecretKey : gameSecretKeys) { - try { - gamesService.get(gameKey).getGameList(GamesBaseRequestDTO.builder() - .agentId(gameSecretKey.getCode()) - .agentKey(gameSecretKey.getKey()) + public void syncGameList(String platformCode) { + + Platform platform = platformService.get(platformCode); + if (null == platform) { + return; + } + List keyData = platform.getKeyInfo(); + for (KeyInfo keyInfo : keyData) { + gamesService.get(platformCode + Constants.SERVICE) + .getGameList(GamesBaseRequestDTO.builder() + .agentId(keyInfo.getCode()) + .agentKey(keyInfo.getKey()) + .keyInfo(keyInfo) + .vendor(platform) .build()); - BetRecordByTimeDTO betRecordByTimeDTO = new BetRecordByTimeDTO(); - betRecordByTimeDTO.setGamePlatform(gameSecretKey.getPlatform()); - betRecordByTimeDTO.setStartTime(startTime); - betRecordByTimeDTO.setEndTime(endTime); - betRecordByTimeDTO.setPage(1); - betRecordByTimeDTO.setPageLimit(1000); - betRecordByTimeDTO.setAgentId(gameSecretKey.getCode()); - betRecordByTimeDTO.setAgentKey(gameSecretKey.getKey()); - gamesService.get(gameKey).getBetRecordByTime(betRecordByTimeDTO); - } catch (Exception e) { - log.error("查询 币种 {} 投注记录失败,错误信息 {}", gameSecretKey.getCode(), e); - } + break; + } + } + + /** + * 同步实时投注记录 + * + * @param platformCode + * @param backTimeMin + */ + public void syncRealtimeBetRecord(String platformCode, Integer backTimeMin) { + //捞取指定分钟前的数据 + Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTimeMin); + Long endTime = DateUtils.getNowDate(); + + Platform platform = platformService.get(platformCode); + if (null == platform) { + return; + } + List keyData = platform.getKeyInfo(); + + for (KeyInfo keyInfo : keyData) { + try { + BetRecordByTimeDTO betRecordByTimeDTO = new BetRecordByTimeDTO(); + betRecordByTimeDTO.setStartTime(startTime); + betRecordByTimeDTO.setEndTime(endTime); + betRecordByTimeDTO.setPage(1); + betRecordByTimeDTO.setPageLimit(1000); + betRecordByTimeDTO.setAgentId(keyInfo.getCode()); + betRecordByTimeDTO.setAgentKey(keyInfo.getKey()); + betRecordByTimeDTO.setKeyInfo(keyInfo); + betRecordByTimeDTO.setVendor(platform); + gamesService.get(platformCode + Constants.SERVICE).getBetRecordByTime(betRecordByTimeDTO); + } catch (Exception e) { + log.error("同步平台投注记录失败platformCode:{}", platformCode, e); } - - } - - } - - /** - * 插入游戏cfbetting详细信息 - */ - public void insertGameCFBettingDetails(Integer backTime) { - - - try { - //捞取指定分钟前的数据 - Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTime); - Long endTime = DateUtils.getNowDate(); - - for (String gameKey : gamesService.keySet()) { - String platformCode = gameKey.replace(Constants.SERVICE, ""); - //不是特殊的平台跳过 - if (!GamePlatforms.FC.getInfo().equals(platformCode)) { - continue; - } - List gameSecretKeys = gameSecretKeyService.selectGameSecretKeyList(GameSecretKey.builder().platform(platformCode).build()); - for (GameSecretKey gameSecretKey : gameSecretKeys) { - try { - gamesService.get(gameKey).getGameList(GamesBaseRequestDTO.builder() - .agentId(gameSecretKey.getCode()) - .agentKey(gameSecretKey.getKey()) - .build()); - BetRecordByTimeDTO betRecordByTimeDTO = new BetRecordByTimeDTO(); - betRecordByTimeDTO.setGamePlatform(gameSecretKey.getPlatform()); - betRecordByTimeDTO.setStartTime(startTime); - betRecordByTimeDTO.setEndTime(endTime); - betRecordByTimeDTO.setPage(1); - betRecordByTimeDTO.setPageLimit(1000); - betRecordByTimeDTO.setAgentId(gameSecretKey.getCode()); - betRecordByTimeDTO.setAgentKey(gameSecretKey.getKey()); - gamesService.get(gameKey).getBetRecordByTime(betRecordByTimeDTO); - } catch (Exception e) { - log.error("查询 平台 {} 投注记录失败,错误信息 {}", gameSecretKey.getCode(), e); - } - } - + if (platform.isMultiAgent()) { + break; } - } catch (Exception e) { - log.error("查询 FC 投注记录失败,错误信息 {}", e); - } - - } - - - /** - * 插入FC游戏投注详细信息 - * - * @param backTime 返回时间 - */ - public void insertFCHistoryGameBettingDetails(Integer backTime) { - Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTime); - Long endTime = DateUtils.getNowDate(); - //捞取指定分钟前的数据 - gameService.insertGameBettingDetails(startTime, endTime, GamePlatforms.FC.getInfo()); - - } - - - /** - * 插入AE游戏投注详细信息 - * - * @param backTime 返回时间 - */ - public void insertAEHistoryGameBettingDetails(Integer backTime) { - Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTime); - Long endTime = DateUtils.getNowDate(); - //捞取指定分钟前的数据 - gameService.insertGameBettingDetails(startTime, endTime, GamePlatforms.AE.getInfo()); - } /** - * 插入PGX游戏投注详细信息 + * 同步历史投注记录 * - * @param backTime 返回时间 + * @param platformCode + * @param backTimeMin */ - public void insertPGXHistoryGameBettingDetails(Integer backTime) { - Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTime); - Long endTime = DateUtils.getNowDate(); - //捞取指定分钟前的数据 - gameService.insertGameBettingDetails(startTime, endTime, GamePlatforms.PGX.getInfo()); - - } - - /** - * 插入MT游戏投注详细信息 - * - * @param backTime 返回时间 - */ - public void insertMTHistoryGameBettingDetails(Integer backTime) { - Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTime); - Long endTime = DateUtils.getNowDate(); + public void syncHistoryBetRecord(String platformCode, Integer backTimeMin) { //捞取指定分钟前的数据 - gameService.insertGameBettingDetails(startTime, endTime, GamePlatforms.MT.getCode()); - - } - - /** - * 插入游戏ngbetting详细信息 - */ - public void insertGameNGBettingDetails(Integer backTime) { - - - try { - //捞取指定分钟前的数据 - Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTime); - Long endTime = DateUtils.getNowDate(); - BetRecordByTimeDTO betRecordByTimeDTO = new BetRecordByTimeDTO(); - betRecordByTimeDTO.setStartTime(startTime); - betRecordByTimeDTO.setEndTime(endTime); - gamesService.get(NGPlatforms.PG.getPlatform() + Constants.SERVICE).getBetRecordByTime(betRecordByTimeDTO); - } catch (Exception e) { - log.error("查询 NG 投注记录失败,错误信息 {}", e); + Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTimeMin); + Long endTime = DateUtils.getNowDate(); + Platform platform = platformService.get(platformCode); + if (null == platform) { + return; } + List keyData = platform.getKeyInfo(); - } + for (KeyInfo keyInfo : keyData) { + try { + BetRecordByTimeDTO betRecordByTimeDTO = new BetRecordByTimeDTO(); + betRecordByTimeDTO.setStartTime(startTime); + betRecordByTimeDTO.setEndTime(endTime); + betRecordByTimeDTO.setPage(1); + betRecordByTimeDTO.setPageLimit(1000); + betRecordByTimeDTO.setAgentId(keyInfo.getCode()); + betRecordByTimeDTO.setAgentKey(keyInfo.getKey()); + betRecordByTimeDTO.setKeyInfo(keyInfo); + betRecordByTimeDTO.setVendor(platform); - - /** - * 插入免费游戏局数情况 - */ - public void insertFreeSpinDashflow() { - Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), -70); - for (String gameKey : gamesService.keySet()) { - List gameSecretKeys = gameSecretKeyService.selectGameSecretKeyList(GameSecretKey.builder().platform(gameKey.replace(Constants.SERVICE, "")).build()); - for (GameSecretKey gameSecretKey : gameSecretKeys) { - try { - GetFreeSpinDashflowRequestDTO getFreeSpinDashflowRequestDTO = new GetFreeSpinDashflowRequestDTO(); - getFreeSpinDashflowRequestDTO.setStartTime(startTime); - getFreeSpinDashflowRequestDTO.setAgentId(gameSecretKey.getCode()); - getFreeSpinDashflowRequestDTO.setAgentKey(gameSecretKey.getKey()); - gamesService.get(gameKey).getFreeSpinDashflow(getFreeSpinDashflowRequestDTO); - } catch (Exception e) { - log.error("查询 币种 {} 免费游戏投注记录失败,错误信息 {}", gameSecretKey.getCode(), e.getMessage()); - } + gamesService.get(platformCode + Constants.SERVICE).getBetRecordByHistoryTime(betRecordByTimeDTO); + } catch (Exception e) { + log.error("同步平台投注记录失败platformCode:{}", platformCode, e); + } + if (platform.isMultiAgent()) { + break; } - - } } + /** + * 同步免费游玩记录 + */ + public void syncFreeBetRecord(String platformCode, Integer backTime) { + // 捞取指定分钟前的数据 + Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTime); + + Platform platform = platformService.get(platformCode); + if (null == platform) { + return; + } + List keyData = platform.getKeyInfo(); + + for (KeyInfo keyInfo : keyData) { + try { + GetFreeSpinDashflowRequestDTO getFreeSpinDashflowRequestDTO = new GetFreeSpinDashflowRequestDTO(); + getFreeSpinDashflowRequestDTO.setStartTime(startTime); + getFreeSpinDashflowRequestDTO.setAgentId(keyInfo.getCode()); + getFreeSpinDashflowRequestDTO.setAgentKey(keyInfo.getKey()); + getFreeSpinDashflowRequestDTO.setVendor(platform); + getFreeSpinDashflowRequestDTO.setKeyInfo(keyInfo); + gamesService.get(platformCode + Constants.SERVICE).getFreeSpinDashflow(getFreeSpinDashflowRequestDTO); + + } catch (Exception e) { + log.error("免费游戏投注记录失败platformCode:{}", platformCode, e); + } + if (platform.isMultiAgent()) { + break; + } + } + } public void updateGameExchangeMoney() { 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()); +// 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()); + continue; + } + + List keyInfos = platform.getKeyInfo(); + KeyInfo keyInfo = null; + for (KeyInfo keyData : keyInfos) { + if (keyData.getCurrency().equalsIgnoreCase(exchangeMoney.getCurrencyCode())) { + keyInfo = keyData; + break; + } + } + if (null == keyInfo) { + log.error("平台不存在currencyCode:{}", exchangeMoney.getCurrencyCode()); + continue; + } + String targetCurrency = platform.getCurrencyInfo().get(exchangeMoney.getCurrencyCode()); + if (StringUtils.isEmpty(targetCurrency)) { + log.error("平台不存在currencyCode:{}", exchangeMoney.getCurrencyCode()); + continue; + } Member member = memberService.selectMemberById(exchangeMoney.getMemberId()); ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO(); exchangeTransferStatusRequestDTO.setAccount(member.getGameAccount()); - exchangeTransferStatusRequestDTO.setCurrency(gameSecretKey.getCurrency()); + exchangeTransferStatusRequestDTO.setCurrency(targetCurrency); exchangeTransferStatusRequestDTO.setOrderId(exchangeMoney.getTransactionId()); - exchangeTransferStatusRequestDTO.setAgentId(gameSecretKey.getCode()); - exchangeTransferStatusRequestDTO.setAgentKey(gameSecretKey.getKey()); + exchangeTransferStatusRequestDTO.setAgentId(keyInfo.getCode()); + exchangeTransferStatusRequestDTO.setAgentKey(keyInfo.getKey()); exchangeTransferStatusRequestDTO.setGameExchangeMoneyId(exchangeMoney.getId()); + exchangeTransferStatusRequestDTO.setVendor(platform); + exchangeTransferStatusRequestDTO.setKeyInfo(keyInfo); + exchangeTransferStatusRequestDTO.setSystemCurrency(targetCurrency); gamesService.get(exchangeMoney.getPlatformCode() + Constants.SERVICE).exchangeTransferStatus(exchangeTransferStatusRequestDTO); } catch (Exception e) { log.error("查询 更新交易记录失败,错误信息 {}", e); diff --git a/ff-game/src/main/resources/mapper/game/GameMapper.xml b/ff-game/src/main/resources/mapper/game/GameMapper.xml index abf59e2..3baffbe 100644 --- a/ff-game/src/main/resources/mapper/game/GameMapper.xml +++ b/ff-game/src/main/resources/mapper/game/GameMapper.xml @@ -12,6 +12,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -40,6 +41,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and freespin = #{freespin} and demo_status = #{demoStatus} and stop_status = #{stopStatus} + and platform_code = #{platformCode} + and platform_type = #{platformType} + @@ -161,6 +165,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where platform_id = #{platformId} + From 2013a12aeea17da832bc415587a9ba2faa7bd45a Mon Sep 17 00:00:00 2001 From: shi Date: Mon, 7 Apr 2025 10:53:56 +0800 Subject: [PATCH 28/62] =?UTF-8?q?feat(game):=20=E6=B7=BB=E5=8A=A0=20PGT=20?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=B9=B3=E5=8F=B0=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 PGT 游戏平台的 API接口和实现类 - 添加 PGT 游戏平台的会员账户生成逻辑 - 实现 PGT 游戏平台的余额查询、转账等功能 - 添加 PGT 游戏平台的错误响应和数据模型类 --- .../com/ff/game/api/pgt/client/PGTClient.java | 46 +++--- .../pgt/dto/PGTExchangeTransferResponse.java | 80 ++++++++++ .../ff/game/api/pgt/dto/PGTLoginResponse.java | 54 +++++++ .../dto/PGTTransactionDetailsResponse.java | 150 ++++++++++++++++++ .../api/pgt/dto/PGTTransactionResponse.java | 90 +++++++++++ .../api/pgt/impl/GamesPGTServiceImpl.java | 149 +++++++++-------- 6 files changed, 471 insertions(+), 98 deletions(-) create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTExchangeTransferResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTLoginResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTTransactionDetailsResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTTransactionResponse.java diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java b/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java index 0ab0842..6fbc837 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java @@ -56,53 +56,53 @@ public interface PGTClient { * 无重定向登录 * * @param parameters 范围 - * @return {@link PGXGameLoginResponse } + * @return {@link PGTLoginResponse } */ @Post("/logIn") - PGXGameLoginResponse loginWithoutRedirect(@JSONBody Map parameters, @Header Map headerMap); - + PGTLoginResponse loginWithoutRedirect(@JSONBody Map parameters, @Header Map headerMap); /** - * 按代理id进行交换转账 + * 押金 * - * @param parameters 参数 - * @return {@link PGXErrorResponse } + * @param parameters 范围 + * @param headerMap 标题映射 + * @return {@link PGTExchangeTransferResponse } */ - @Post(url = "/makeTransfer.aspx?{parameters}") - PGXErrorResponse exchangeTransferByAgentId(@Var("parameters") String parameters); + @Post(url = "/deposit") + PGTExchangeTransferResponse deposit(@JSONBody Map parameters, @Header Map headerMap); + /** - * 标记报告 + * 收回 * - * @return {@link DGResponse } + * @param parameters 范围 + * @param headerMap 标题映射 + * @return {@link PGTExchangeTransferResponse } */ - @Post(url = "markbyjson.aspx") - DGResponse markReport(@JSONBody Map params); - - - + @Post(url = "/withdraw") + PGTExchangeTransferResponse withdraw(@JSONBody Map parameters, @Header Map headerMap); /** * 汇兑转移状态 * * @param parameters 范围 + * @param headerMap 标题映射 * @return {@link ApiNGResponseDTO }<{@link ApiExchangeTransferStatusResponseDTO }> */ - @Post(url = "/checkTransaction.ashx?{parameters}") - PGXExchangeTransferStatusResponse exchangeTransferStatus(@Var("parameters") String parameters); - - - + @Post(url = "/verifyDepositWithdraw") + PGTTransactionResponse exchangeTransferStatus(@JSONBody Map parameters, @Header Map headerMap); /** * 按时间获取投注记录 * - * @return {@link PGXBetHistoryResponse } + * @param parameters 范围 + * @param headerMap 标题映射 + * @return {@link PGTTransactionDetailsResponse } */ - @Get(url = "/fetchbykey.aspx?{parameters}") - PGXBetHistoryResponse getBetRecordByTime(@Var("parameters") String parameters); + @Get(url = "/betTransactionsV2") + PGTTransactionDetailsResponse getBetRecordByTime(@JSONBody Map parameters, @Header Map headerMap); 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/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/PGTTransactionDetailsResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTTransactionDetailsResponse.java new file mode 100644 index 0000000..d9b5455 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTTransactionDetailsResponse.java @@ -0,0 +1,150 @@ +package com.ff.game.api.pgt.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +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 String accountingDate; + + /** + * 最新更新时间 + */ + @JsonProperty("updatedDate") + private String updatedDate; + + /** + * 质押金额 + */ + @JsonProperty("stake") + private double stake; + + /** + * 支付金额(包括本金) + */ + @JsonProperty("payout") + private double payout; + + /** + * 产品 ID + */ + @JsonProperty("productId") + private String productId; + + /** + * 游戏代码 + */ + @JsonProperty("gameCode") + private String gameCode; + + /** + * 游戏名称 + */ + @JsonProperty("gameName") + private String gameName; + + /** + * 轮次 ID + */ + @JsonProperty("roundId") + private String roundId; + + /** + * 投注状态(未结、已结算、未结算、无效) + */ + @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..d0776f9 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTTransactionResponse.java @@ -0,0 +1,90 @@ +package com.ff.game.api.pgt.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 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 String amount; + + /** + * 交易前的余额 + */ + @JsonProperty("beforeBalance") + private String beforeBalance; + + /** + * 交易后的余额 + */ + @JsonProperty("afterBalance") + private String afterBalance; + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java index b2d4c1c..7a0f23e 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java @@ -110,15 +110,16 @@ public class GamesPGTServiceImpl implements IGamesService { * * @return {@link String } */ - private Map getKey( GamesBaseRequestDTO gamesBaseRequestDTO) { - Map headerMap=new LinkedHashMap<>(); + 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); + headerMap.put("Authorization", "Basic " + encodedAuth); return headerMap; } + String productId = "PGSOFT"; /** * 创建成员 @@ -132,7 +133,7 @@ public class GamesPGTServiceImpl implements IGamesService { Map headerMap = this.getKey(createMemberRequestDTO); Map params = new LinkedHashMap<>(); params.put("username", createMemberRequestDTO.getAccount()); - params.put("productId","PGSOFT"); + params.put("productId", productId); PGTCreateMemberResponse member = pgtClient.createMember(params, headerMap); if (this.getIsSuccess(member.getCode())) { @@ -154,9 +155,9 @@ public class GamesPGTServiceImpl implements IGamesService { log.info("GamesPGTServiceImpl [getMemberInfo] 请求参数 {}", memberInfoRequestDTO); Map params = new LinkedHashMap<>(); params.put("username", memberInfoRequestDTO.getAccounts()); - params.put("productId", "PGSOFT"); + params.put("productId", productId); Map headerMap = this.getKey(memberInfoRequestDTO); - PGTBalanceResponse memberInfo = pgtClient.getMemberInfo(JsonUtil.mapToQueryString(params),headerMap); + PGTBalanceResponse memberInfo = pgtClient.getMemberInfo(JsonUtil.mapToQueryString(params), headerMap); //判断是否获取成功 if (this.getIsSuccess(memberInfo.getCode())) { MemberInfoResponseDTO memberInfoResponseDTO = MemberInfoResponseDTO.builder() @@ -179,24 +180,19 @@ public class GamesPGTServiceImpl implements IGamesService { @Override public String loginWithoutRedirect(GamesLogin gamesLogin) { log.info("GamesPGTServiceImpl [loginWithoutRedirect] 请求参数 {}", gamesLogin); - GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(gamesLogin.getAgentId()); Map params = new LinkedHashMap<>(); - params.put("operatorcode", gamesLogin.getAgentId()); - params.put("password", gameSecretKey.getPassword()); - params.put("providercode", gameSecretKey.getProviderCode()); - params.put("type", gamesLogin.getGameType()); 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); - params.put("gameid", gamesLogin.getGameId()); - params.put("lang", gamesLogin.getLang()); - params.put("html5", 1); - params.put("signature", key); - PGXGameLoginResponse PGXGameLoginResponse = pgtClient.loginWithoutRedirect(params,key); + PGTLoginResponse pgtLoginResponse = pgtClient.loginWithoutRedirect(params, key); //判断是否获取成功 - if (this.getIsSuccess(PGXGameLoginResponse.getErrCode())) { - return PGXGameLoginResponse.getGameUrl(); + if (this.getIsSuccess(pgtLoginResponse.getCode())) { + return pgtLoginResponse.getData().getUrl(); } else { - throw new BaseException(PGXGameLoginResponse.getErrMsg()); + throw new BaseException(pgtLoginResponse.getMessage()); } } @@ -224,13 +220,10 @@ public class GamesPGTServiceImpl implements IGamesService { @Override @Transactional public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { - log.info("GamesPGXServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); + log.info("GamesPGTServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); + + String currency = exchangeTransferMoneyRequestDTO.getCurrency(); - 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); @@ -242,7 +235,6 @@ public class GamesPGTServiceImpl implements IGamesService { ); Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); - GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(exchangeTransferMoneyRequestDTO.getAgentId()); //获取下一个自增id GameExchangeMoney exchangeMoney = GameExchangeMoney @@ -252,15 +244,13 @@ public class GamesPGTServiceImpl implements IGamesService { .quota(exchangeTransferMoneyRequestDTO.getQuota()) .balance(exchangeTransferMoneyRequestDTO.getAmount()) .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(currencyDTO.getSystemCurrency()) + .currencyCode(currency) .memberId(member.getId()) .transactionId(transactionId) - .platformCode(GamePlatforms.PGX.getInfo()) + .platformCode(GamePlatforms.PGT.getInfo()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); - //获取余额 - String type = TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType()) ? PGXTransferType.WITHDRAW.getCode() : PGXTransferType.DEPOSIT.getCode(); BigDecimal amount = exchangeTransferMoneyRequestDTO.getAmount(); BigDecimal amountBefore = BigDecimal.ZERO; @@ -272,49 +262,48 @@ public class GamesPGTServiceImpl implements IGamesService { .agentKey(exchangeTransferMoneyRequestDTO.getAgentKey()) .build(); + //判断是不是提出 if (TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) { - amountBefore = this.getMemberInfo(gamesBaseRequestDTO).getBalance(); amount = amountBefore; - } Map paramsMap = new LinkedHashMap<>(); - paramsMap.put("amount", amount); - paramsMap.put("operatorcode", exchangeTransferMoneyRequestDTO.getAgentId()); - paramsMap.put("password", gameSecretKey.getPassword()); - paramsMap.put("providercode", gameSecretKey.getProviderCode()); - paramsMap.put("referenceid", transactionId); - paramsMap.put("type", type); paramsMap.put("username", exchangeTransferMoneyRequestDTO.getAccount()); + paramsMap.put("amount", amount); + 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); + } - - PGXErrorResponse errorResponse = pgtClient.exchangeTransferByAgentId(JsonUtil.mapToQueryString(paramsMap)); - if (this.getIsSuccess(errorResponse.getErrCode())) { - + if (this.getIsSuccess(errorResponse.getCode())) { + PGTExchangeTransferResponse.BalanceData data = errorResponse.getData(); //更新数据 - exchangeMoney.setBalance(amount); - exchangeMoney.setCoinBefore(amountBefore); - //转后的余额 - BigDecimal coinAfter = this.getMemberInfo(gamesBaseRequestDTO).getBalance(); - - exchangeMoney.setCoinAfter(coinAfter); + exchangeMoney.setBalance(data.getAmount()); + exchangeMoney.setCoinBefore(data.getBeforeBalance()); + exchangeMoney.setCoinAfter(data.getBalance()); exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore()); exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter()); exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue()); - gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); - //确认状态 + //查询交易状态 ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO(); - exchangeTransferStatusRequestDTO.setAccount(member.getGameAccount()); - exchangeTransferStatusRequestDTO.setOrderId(exchangeMoney.getTransactionId()); - exchangeTransferStatusRequestDTO.setAgentId(gameSecretKey.getCode()); - exchangeTransferStatusRequestDTO.setAgentKey(gameSecretKey.getKey()); + exchangeTransferStatusRequestDTO.setAccount(exchangeTransferMoneyRequestDTO.getAccount()); + exchangeTransferStatusRequestDTO.setCurrency(currency); + exchangeTransferStatusRequestDTO.setOrderId(transactionId); + exchangeTransferStatusRequestDTO.setAgentId(exchangeTransferMoneyRequestDTO.getAgentId()); + exchangeTransferStatusRequestDTO.setAgentKey(exchangeTransferMoneyRequestDTO.getAgentKey()); this.exchangeTransferStatus(exchangeTransferStatusRequestDTO); } else { - log.error("GamesFCServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{}", errorResponse.getErrCode()); + log.error("GamesPGTServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{}", errorResponse.getCode()); throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); } return exchangeMoney.getId(); @@ -328,29 +317,35 @@ public class GamesPGTServiceImpl implements IGamesService { */ @Override public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { - log.info("GamesPGXServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO); + log.info("GamesPGTServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO); + GameExchangeMoney gameExchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeMoneyId()); Map paramsMap = new LinkedHashMap<>(); - paramsMap.put("operatorcode", exchangeTransferMoneyRequestDTO.getAgentId()); - paramsMap.put("referenceid", exchangeTransferMoneyRequestDTO.getOrderId()); - - - PGXExchangeTransferStatusResponse exchangeTransferStatusResponse = pgtClient.exchangeTransferStatus(JsonUtil.mapToQueryString(paramsMap)); - if (this.getIsSuccess(exchangeTransferStatusResponse.getErrCode())) { + 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); + if (this.getIsSuccess(transactionResponse.getCode())) { List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( GameExchangeMoney.builder() - .platformCode(GamePlatforms.PGX.getInfo()) + .platformCode(GamePlatforms.PGT.getCode()) .transactionId(exchangeTransferMoneyRequestDTO.getOrderId()) .build() ); for (GameExchangeMoney exchangeMoney : gameExchangeMonies) { //更新数据 - exchangeMoney.setStatus(PGXTransactionStatus.findValueByCode(exchangeTransferStatusResponse.getStatus())); + exchangeMoney.setStatus(transactionResponse.getData().isSuccess() ? StatusType.SUCCESS.getValue() : StatusType.FAILURE.getValue()); gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); } return Boolean.TRUE; } else { - log.error("GamesPGXServiceImpl [exchangeTransferStatus]错误代码{},错误信息{}", exchangeTransferStatusResponse.getErrCode(), exchangeTransferStatusResponse.getErrMsg()); + log.error("GamesPGTServiceImpl [exchangeTransferStatus]错误代码{},错误信息{}", transactionResponse.getCode(), transactionResponse.getMessage()); return Boolean.FALSE; } } @@ -365,16 +360,20 @@ public class GamesPGTServiceImpl implements IGamesService { @Override public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { //请求参数 - log.info("GamesPGXServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO); + log.info("GamesPGTServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO); Map paramsMap = new LinkedHashMap<>(); - paramsMap.put("operatorcode", betRecordByTimeDTO.getAgentId()); + paramsMap.put("productId", productId); + paramsMap.put("date", productId); + paramsMap.put("startTime", productId); + paramsMap.put("endTime", productId); + paramsMap.put("nextId", productId); + Map key = this.getKey(betRecordByTimeDTO); - paramsMap.put("versionkey", 0); - PGXBetHistoryResponse betRecordByTime = pgtClient.getBetRecordByTime(JsonUtil.mapToQueryString(paramsMap)); + PGTTransactionDetailsResponse betRecordByTime = pgtClient.getBetRecordByTime(paramsMap, key); - if (this.getIsSuccess(betRecordByTime.getErrCode())) { - List results = JSON.parseArray(betRecordByTime.getResult(), PGXBetHistoryResponse.Result.class); - this.batchInsert(results, betRecordByTimeDTO); + if (this.getIsSuccess(betRecordByTime.getCode())) { + List txns = betRecordByTime.getData().getTxns(); + this.batchInsert(txns, betRecordByTimeDTO); return Boolean.TRUE; } else { log.error("GamesPGXServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getErrCode(), betRecordByTime.getErrMsg()); @@ -490,12 +489,12 @@ public class GamesPGTServiceImpl implements IGamesService { * * @param dataBean 数据bean */ - private void batchInsert(List dataBean, GamesBaseRequestDTO gamesBaseRequestDTO) { + private void batchInsert(List dataBean, GamesBaseRequestDTO gamesBaseRequestDTO) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据转化 - for (PGXBetHistoryResponse.Result bean : dataBean) { + for (PGTTransactionDetailsResponse.Transaction bean : dataBean) { GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().agentId(gamesBaseRequestDTO.getAgentId()).data(bean).build()); if (!ObjectUtils.isEmpty(bettingDetails)) { bettingDetails.setId(IdUtil.getSnowflakeNextId()); @@ -505,7 +504,7 @@ public class GamesPGTServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds,GamePlatforms.PGX.getInfo()); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.PGX.getInfo()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) From b35fad13d1132797b10a69bf112bbcbb19f9aa89 Mon Sep 17 00:00:00 2001 From: cengy Date: Mon, 7 Apr 2025 11:22:47 +0800 Subject: [PATCH 29/62] =?UTF-8?q?refactor(ff-game):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=B9=B3=E5=8F=B0=E7=9B=B8=E5=85=B3=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除了 GameSecretKeyCurrency 相关的使用 - 优化了货币转换逻辑 - 简化了游戏平台和货币信息的处理- 调整了批量插入逻辑,使其更加通用 --- .../api/controller/ApiMemberController.java | 3 + .../service/impl/GamesJILIServiceImpl.java | 25 +-- .../game/api/km/impl/GamesKMServiceImpl.java | 142 ++++++++--------- .../meitian/impl/MeiTianGameServiceImpl.java | 71 ++++----- .../ng/service/impl/GamesPGServiceImpl.java | 148 +++++++++--------- .../java/com/ff/game/domain/CurrencyInfo.java | 5 +- .../java/com/ff/quartz/task/GameTask.java | 7 + 7 files changed, 201 insertions(+), 200 deletions(-) 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 745d42e..130cf65 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 @@ -250,6 +250,7 @@ public class ApiMemberController extends BaseController { key.setCode(keyInfo.getCode()); key.setKey(keyInfo.getKey()); key.setCurrency(targetCurrency); + key.setSystemCurrency(memberInfoAllApiRequest.getCurrencyCode()); keys.add(key); } // 创建线程池 @@ -276,6 +277,7 @@ public class ApiMemberController extends BaseController { .accounts(member.getGameAccount()) .agentId(gameSecretKey.getCode()) .currency(gameSecretKey.getCurrency()) + .systemCurrency(gameSecretKey.getSystemCurrency()) .agentKey(gameSecretKey.getKey()) .build(); //查询余额 @@ -317,6 +319,7 @@ public class ApiMemberController extends BaseController { private String code; private String currency; private String key; + private String systemCurrency; } } 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 c7abe9e..0db9694 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 @@ -255,15 +255,18 @@ public class GamesJILIServiceImpl implements IGamesService { game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.JILI.getCode()) + 1); game.setGameName(gamesDataDTO.getName().getZhCN()); game.setCreateBy(Constants.SYSTEM); + + List nameInfos = new ArrayList<>(); + nameInfos.add(new NameInfo(gamesDataDTO.getName().getZhCN(), "zh-CN")); + nameInfos.add(new NameInfo(gamesDataDTO.getName().getEnUS(), "en-US")); + game.setNameInfo(nameInfos); + gameService.insertGame(game); } else { game = games.get(0); } gamesDataDTO.setSystemGameId(game.getId()); - List nameInfos = new ArrayList<>(); - nameInfos.add(new NameInfo(gamesDataDTO.getName().getZhCN(), "zh-CN")); - nameInfos.add(new NameInfo(gamesDataDTO.getName().getEnUS(), "en-US")); - game.setNameInfo(nameInfos); + /*List gameNames = gameNameService.selectGameNameList(GameName .builder() @@ -411,11 +414,8 @@ public class GamesJILIServiceImpl implements IGamesService { //判断是否获取成功 if (this.getIsSuccess(betRecordJILIResponse.getErrorCode())) { - KeyInfo keyInfo = betRecordByTimeDTO.getKeyInfo(); - String currency = keyInfo.getCurrency(); - String targetCurrency = betRecordByTimeDTO.getVendor().getOurCurrency(currency); //数据插入 - this.batchInsert(betRecordJILIResponse, betRecordByTimeDTO, currency, targetCurrency); + this.batchInsert(betRecordJILIResponse, betRecordByTimeDTO); JILIBetRecordResponseDTO.DataBean dataBean = betRecordJILIResponse.getData(); //获取下一页数据 while (dataBean.getPagination().getCurrentPage() != dataBean.getPagination().getTotalPages() && dataBean.getPagination().getTotalPages() > 0) { @@ -429,7 +429,7 @@ public class GamesJILIServiceImpl implements IGamesService { dataBean = betRecordJILIResponse.getData(); if (this.getIsSuccess(betRecordJILIResponse.getErrorCode())) { //数据插入 - this.batchInsert(betRecordJILIResponse, betRecordByTimeDTO, currency, targetCurrency); + this.batchInsert(betRecordJILIResponse, betRecordByTimeDTO); } else { log.error("GameBettingDataJILIServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordJILIResponse.getErrorCode(), betRecordJILIResponse.getMessage()); } @@ -715,7 +715,7 @@ public class GamesJILIServiceImpl implements IGamesService { * @param betRecordJILIResponse 投注记录jiliresponse * @return {@link Integer } */ - private void batchInsert(JILIBetRecordResponseDTO betRecordJILIResponse, BetRecordByTimeDTO betRecordByTimeDTO, String systemCurrency, String currency) { + private void batchInsert(JILIBetRecordResponseDTO betRecordJILIResponse, BetRecordByTimeDTO betRecordByTimeDTO) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 @@ -723,8 +723,9 @@ public class GamesJILIServiceImpl implements IGamesService { //数据转化 for (JILIBetRecordDataResponseDTO jiliBetRecordDataResponseDTO : dataBean.getResult()) { GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder() - .systemCurrencyCode(systemCurrency) - .currencyCode(currency) + .systemCurrencyCode(betRecordByTimeDTO.getSystemCurrency()) + .platform(betRecordByTimeDTO.getVendor()) + .currencyCode(betRecordByTimeDTO.getCurrency()) .platform(betRecordByTimeDTO.getVendor()) .data(jiliBetRecordDataResponseDTO).build()); if (!ObjectUtils.isEmpty(bettingDetails)) { 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 3326c1d..d3d32ee 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 @@ -8,7 +8,6 @@ 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; @@ -21,7 +20,6 @@ import com.ff.game.api.km.dto.*; import com.ff.game.api.request.*; import com.ff.game.api.xk.dto.XKGamesDTO; import com.ff.game.domain.*; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; import com.ff.game.service.*; import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; @@ -53,20 +51,12 @@ public class GamesKMServiceImpl implements IGamesService { @Resource private IPlatformService platformService; - @Resource - private ISysConfigService configService; - @Resource private RedisCache redisCache; @Resource private IGameExchangeMoneyService gameExchangeMoneyService; - - @Resource - private IGamePlatformService gamePlatformService; - - @Resource private IGameService gameService; @@ -74,14 +64,6 @@ public class GamesKMServiceImpl implements IGamesService { @Resource private IMemberService memberService; - @Resource - private IGameFreeRecordService gameFreeRecordService; - @Resource - private IGameSecretKeyService gameSecretKeyService; - - @Resource - private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; - @Resource private KMClient KMClient; @@ -186,14 +168,14 @@ 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()); +// Member member = memberService.selectMemberByGameAccount(memberInfoRequestDTO.getAccounts()); +// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCode(GamePlatforms.KM.getInfo()) +// .currency(member.getCurrencyCode()) +// .build()); paramsMap.put("userid", memberInfoRequestDTO.getAccounts()); - paramsMap.put("cur", currencyDTO.getCurrency()); + paramsMap.put("cur", memberInfoRequestDTO.getCurrency()); Map headerMap = this.getKey(memberInfoRequestDTO); KMBalanceResponse memberInfo = KMClient.getMemberInfo(JsonUtil.mapToQueryString(paramsMap), headerMap); if (ObjectUtils.isEmpty(memberInfo.getErrorCode()) || this.getIsSuccess(memberInfo.getErrorCode())) { @@ -214,17 +196,17 @@ 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()); +// Member member = memberService.selectMemberByGameAccount(gamesLogin.getAccount()); +// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCode(GamePlatforms.KM.getInfo()) +// .currency(member.getCurrencyCode()) +// .build()); CreateMemberRequestDTO gamesBaseRequestDTO = CreateMemberRequestDTO.builder() .account(gamesLogin.getAccount()) .agentId(gamesLogin.getAgentId()) .agentKey(gamesLogin.getAgentKey()) - .currency(currencyDTO.getCurrency()) + .currency(gamesLogin.getCurrency()) .build(); this.createMember(gamesBaseRequestDTO); kmUserToken = redisCache.getCacheObject(CacheConstants.KM_USER_TOKEN + gamesLogin.getAccount()); @@ -287,11 +269,11 @@ 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); +// 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())); @@ -300,9 +282,12 @@ public class GamesKMServiceImpl implements IGamesService { gamePlatformService.insertGamePlatform(gamePlatform); } else { gamePlatform = gamePlatforms.get(0); - } + }*/ + Integer platformType = KMGameType.findSystemByCode(game.getProviderCode()); Game gameOne = Game.builder() - .platformId(gamePlatform.getId()) + //.platformId(gamePlatform.getId()) + .platformCode(GamePlatforms.KM.getCode()) + .platformType(platformType) .gameCode(game.getCode()) .build(); List gameOnes = gameService.selectGameList(gameOne); @@ -327,11 +312,11 @@ 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); +// 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())); @@ -340,9 +325,12 @@ public class GamesKMServiceImpl implements IGamesService { gamePlatformService.insertGamePlatform(gamePlatform); } else { gamePlatform = gamePlatforms.get(0); - } + }*/ + Integer platformType = KMGameType.findSystemByCode(gamesDataDTO.getProviderCode()); Game game = Game.builder() - .platformId(gamePlatform.getId()) + //.platformId(gamePlatform.getId()) + .platformCode(GamePlatforms.KM.getCode()) + .platformType(platformType) .gameCode(gamesDataDTO.getCode()) .build(); List games = gameService.selectGameList(game); @@ -351,24 +339,27 @@ public class GamesKMServiceImpl implements IGamesService { game.setGameSourceType(gamesDataDTO.getProviderCode()); game.setFreespin(Boolean.FALSE); game.setDemoStatus(gamesDataDTO.getSupportDemoUrl()); - game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); + game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.KM.getCode()) + 1); game.setGameName(gamesDataDTO.getName()); game.setCreateBy(Constants.SYSTEM); game.setIngress(ingress); + List nameInfos = new ArrayList<>(); + nameInfos.add(new NameInfo(gamesDataDTO.getName(), "zh-CN")); + game.setNameInfo(nameInfos); gameService.insertGame(game); } else { 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()); - } +// 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(); @@ -384,10 +375,10 @@ 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()); +// 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(); @@ -407,7 +398,7 @@ public class GamesKMServiceImpl implements IGamesService { .quota(exchangeTransferMoneyRequestDTO.getQuota()) .balance(exchangeTransferMoneyRequestDTO.getAmount()) .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(currencyDTO.getSystemCurrency()) + .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) .platformCode(GamePlatforms.KM.getInfo()) @@ -430,7 +421,7 @@ public class GamesKMServiceImpl implements IGamesService { Map params = new LinkedHashMap<>(); params.put("userid", exchangeTransferMoneyRequestDTO.getAccount()); params.put("amt", amount); - params.put("cur", currencyDTO.getCurrency()); + params.put("cur", exchangeTransferMoneyRequestDTO.getCurrency()); params.put("txid", transactionId); Map headerMap = this.getKey(exchangeTransferMoneyRequestDTO); @@ -503,9 +494,7 @@ public class GamesKMServiceImpl implements IGamesService { KMBetRecordResponse betRecordByTime = KMClient.getBetRecordByTime(JsonUtil.mapToQueryString(params), key); if (ObjectUtils.isEmpty(betRecordByTime.getErrorCode()) || this.getIsSuccess(betRecordByTime.getErrorCode())) { - this.batchInsert(betRecordByTime); - - + this.batchInsert(betRecordByTime, betRecordByTimeDTO); return Boolean.TRUE; } else { log.error("GamesKMServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getErrorCode(), betRecordByTime.getErrorDescription()); @@ -628,14 +617,18 @@ public class GamesKMServiceImpl implements IGamesService { * * @param betRecordByTime dg投注记录响应dto */ - private void batchInsert(KMBetRecordResponse betRecordByTime) { + private void batchInsert(KMBetRecordResponse betRecordByTime, BetRecordByTimeDTO betRecordByTimeDTO) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 List report = betRecordByTime.getBets(); //数据转化 for (KMBetRecordResponse.Bet bean : report) { - GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean).build()); + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder() + //.systemCurrencyCode(systemCurrency) + //.currencyCode(targetCurrency) + .platform(betRecordByTimeDTO.getVendor()) + .data(bean).build()); if (!ObjectUtils.isEmpty(bettingDetails)) { bettingDetails.setId(IdUtil.getSnowflakeNextId()); gameBettingDetails.add(bettingDetails); @@ -666,12 +659,11 @@ 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()); +// +// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCode(GamePlatforms.KM.getInfo()) +// .currency(resultBean.getCurrency()) +// .build()); Member member = memberService.selectMemberByGameAccount(resultBean.getUserId()); @@ -697,20 +689,22 @@ public class GamesKMServiceImpl implements IGamesService { } + Platform platform = gamesDataBuildDTO.getPlatform(); + String systemCurrency = platform.getOurCurrency(resultBean.getCurrency()); //数据构造 GameBettingDetails gameBettingDetails = GameBettingDetails.builder() .tenantKey(member.getTenantKey()) //保存我们的币种id - .currencyCode(currencyDTO.getSystemCurrency()) + .currencyCode(systemCurrency) .memberId(member.getId()) .gameCode(gamesDataDTO.getCode()) .gameType(PlatformType.CARD_GAME.getCode()) - .platformCode(GamePlatforms.KM.getInfo()) + .platformCode(GamePlatforms.KM.getCode()) .gameId(GAME_ID) .gameName(gamesDataDTO.getName()) .gameStatus(gameStatus) .gameStatusType(1) - .gameCurrencyCode(currencyDTO.getCurrency()) + .gameCurrencyCode(resultBean.getCurrency()) .account(resultBean.getUserId()) .wagersId(resultBean.getId()) .wagersTime(resultBean.getBeton().getTime()) 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 79c92a2..ad63dd9 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 @@ -10,7 +10,6 @@ import com.ff.base.enums.*; import com.ff.base.exception.base.ApiException; import com.ff.base.exception.base.BaseException; import com.ff.base.system.domain.SysConfig; -import com.ff.base.system.service.ISysConfigService; import com.ff.base.system.service.impl.SysConfigServiceImpl; import com.ff.base.utils.DateUtils; import com.ff.base.utils.sign.Md5Utils; @@ -20,8 +19,9 @@ import com.ff.game.api.meitian.client.MeiTianClient; import com.ff.game.api.meitian.dto.*; import com.ff.game.api.request.*; import com.ff.game.domain.*; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; -import com.ff.game.service.*; +import com.ff.game.service.IGameBettingDetailsService; +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 lombok.extern.slf4j.Slf4j; @@ -55,20 +55,12 @@ import java.util.stream.Collectors; @Slf4j public class MeiTianGameServiceImpl implements IGamesService { - - @Resource - private ISysConfigService configService; - @Resource private RedisCache redisCache; @Resource private IGameExchangeMoneyService gameExchangeMoneyService; - @Resource - private IGamePlatformService gamePlatformService; - - @Resource private IGameService gameService; @@ -82,11 +74,6 @@ public class MeiTianGameServiceImpl implements IGamesService { @Resource private IGameBettingDetailsService gameBettingDetailsService; - @Resource - private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; - - @Resource - private IGameNameService gameNameService; @Autowired private SysConfigServiceImpl sysConfigServiceImpl; @@ -230,7 +217,7 @@ public class MeiTianGameServiceImpl implements IGamesService { MeiTianGamesDTO gameList = new MeiTianGamesDTO(); for (MeiTianGameDataDTO gamesDataDTO : gameList.getData()) { - GamePlatform gamePlatform = GamePlatform.builder() + /* GamePlatform gamePlatform = GamePlatform.builder() .platformType(MeiTianGameType.findSystemByCode(gamesDataDTO.getGameCategoryId())) .platformCode(GamePlatforms.MT.getCode()) .build(); @@ -243,9 +230,12 @@ public class MeiTianGameServiceImpl implements IGamesService { gamePlatformService.insertGamePlatform(gamePlatform); } else { gamePlatform = gamePlatforms.get(0); - } + }*/ + Integer platformType = MeiTianGameType.findSystemByCode(gamesDataDTO.getGameCategoryId()); Game game = Game.builder() - .platformId(gamePlatform.getId()) + //.platformId(gamePlatform.getId()) + .platformCode(GamePlatforms.MT.getCode()) + .platformType(platformType) .gameCode(String.valueOf(gamesDataDTO.getGameId())) .build(); List games = gameService.selectGameList(game); @@ -253,16 +243,21 @@ public class MeiTianGameServiceImpl implements IGamesService { if (CollectionUtils.isEmpty(games)) { game.setGameSourceType(String.valueOf(gamesDataDTO.getGameCategoryId())); game.setFreespin(false); - game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); + game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.MT.getCode()) + 1); game.setGameName(gamesDataDTO.getCnName()); game.setCreateBy(Constants.SYSTEM); + + List nameInfos = new ArrayList<>(); + nameInfos.add(new NameInfo(gamesDataDTO.getCnName(), "zh-CN")); + nameInfos.add(new NameInfo(gamesDataDTO.getEnName(), "en-US")); + game.setNameInfo(nameInfos); gameService.insertGame(game); } else { game = games.get(0); } gamesDataDTO.setSystemGameId(game.getId()); - List gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(game.getGameName()).build()); + /*List gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(game.getGameName()).build()); if (CollectionUtils.isEmpty(gameNames)) { gameNameService.insertGameName(GameName.builder() .gameId(game.getId()) @@ -270,15 +265,13 @@ public class MeiTianGameServiceImpl implements IGamesService { .langCode("zh-CN") .createBy(Constants.SYSTEM) .build()); -// gameNameService.insertGameName(GameName.builder() .gameId(game.getId()) .gameName(gamesDataDTO.getEnName()) .langCode("en-US") .createBy(Constants.SYSTEM) .build()); - } - + }*/ } @@ -298,9 +291,9 @@ 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()); +// 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(); @@ -322,7 +315,7 @@ public class MeiTianGameServiceImpl implements IGamesService { .quota(exchangeTransferMoneyRequestDTO.getQuota()) .balance(exchangeTransferMoneyRequestDTO.getAmount()) .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(gameSecretKey.getSystemCurrency()) + .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) .platformCode(GamePlatforms.MT.getCode()) @@ -332,7 +325,8 @@ public class MeiTianGameServiceImpl implements IGamesService { exchangeMoney.setTransactionId(transactionId); - String key = gameSecretKey.getKey(); +// 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(); @@ -464,7 +458,7 @@ public class MeiTianGameServiceImpl implements IGamesService { return Boolean.TRUE; } //数据插入 - this.batchInsert(recordResponse); + this.batchInsert(recordResponse, betRecordByTimeDTO); MeiTianBetRecordResponseDTO.DataBean dataBean = dataList.get(dataList.size() - 1); SysConfig config = sysConfigServiceImpl.getByConfigKey(configKey); if (config == null) { @@ -532,7 +526,7 @@ public class MeiTianGameServiceImpl implements IGamesService { return Boolean.TRUE; } //数据插入 - this.batchInsert(recordResponse); + this.batchInsert(recordResponse, betRecordByTimeDTO); MeiTianBetRecordResponseDTO.DataBean dataBean = dataList.get(dataList.size() - 1); syncDateMap.put(date, Long.parseLong(dataBean.getRowID())); SysConfig config = sysConfigServiceImpl.getByConfigKey(configKey); @@ -693,7 +687,7 @@ public class MeiTianGameServiceImpl implements IGamesService { * * @param recordResponse 投注记录 */ - private void batchInsert(MeiTianBetRecordResponseDTO recordResponse) { + private void batchInsert(MeiTianBetRecordResponseDTO recordResponse, BetRecordByTimeDTO betRecordByTimeDTO) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 @@ -705,6 +699,7 @@ public class MeiTianGameServiceImpl implements IGamesService { //数据转化 for (MeiTianBetRecordResponseDTO.DataBean dataBean : dataList) { GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder() + .platform(betRecordByTimeDTO.getVendor()) .data(dataBean).build()); if (!ObjectUtils.isEmpty(bettingDetails)) { bettingDetails.setId(IdUtil.getSnowflakeNextId()); @@ -737,10 +732,10 @@ public class MeiTianGameServiceImpl implements IGamesService { //转化类 MeiTianBetRecordResponseDTO.DataBean dataBean = (MeiTianBetRecordResponseDTO.DataBean) gamesDataBuildDTO.getData(); - GameSecretKeyCurrencyDTO gameSecretKey = - gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .currency(dataBean.getCurrency()) - .platformCode(GamePlatforms.MT.getCode()).build()); +// GameSecretKeyCurrencyDTO gameSecretKey = +// gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .currency(dataBean.getCurrency()) +// .platformCode(GamePlatforms.MT.getCode()).build()); Member member = memberService.selectMemberByGameAccount(dataBean.getPlayerName()); @@ -754,11 +749,13 @@ public class MeiTianGameServiceImpl implements IGamesService { int compareResult = originPayoffAmount.compareTo(BigDecimal.ZERO); long gameTime = getTime(dataBean.getGameDate()); + Platform platform = gamesDataBuildDTO.getPlatform(); + String systemCurrency = platform.getOurCurrency(dataBean.getCurrency()); //数据构造 GameBettingDetails gameBettingDetails = GameBettingDetails.builder() .tenantKey(member.getTenantKey()) //保存我们的币种id - .currencyCode(gameSecretKey.getSystemCurrency()) + .currencyCode(systemCurrency) .memberId(member.getId()) .gameCode(dataBean.getGameCode()) .gameType(MeiTianGameType.findSystemByCode(Integer.parseInt(dataBean.getGameType()))) 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 8f40651..9bf0f95 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 @@ -19,8 +19,12 @@ import com.ff.game.api.ng.client.NGClient; import com.ff.game.api.ng.dto.*; import com.ff.game.api.request.*; import com.ff.game.domain.*; -import com.ff.game.dto.*; -import com.ff.game.service.*; +import com.ff.game.dto.GameBettingDetailsDTO; +import com.ff.game.dto.GameDTO; +import com.ff.game.dto.GameSecretKeyCurrencyDTO; +import com.ff.game.service.IGameBettingDetailsService; +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 lombok.extern.slf4j.Slf4j; @@ -65,11 +69,6 @@ public class GamesPGServiceImpl implements IGamesService { @Resource private IGameExchangeMoneyService gameExchangeMoneyService; - - @Resource - private IGamePlatformService gamePlatformService; - - @Resource private IGameService gameService; @@ -77,33 +76,15 @@ public class GamesPGServiceImpl implements IGamesService { @Resource private IMemberService memberService; - @Resource - private IGameFreeRecordService gameFreeRecordService; - - @Resource - private IGameSecretKeyService gameSecretKeyService; - @Resource private NGClient ngClient; - @Resource private KeyConfig keyConfig; @Resource private IGameBettingDetailsService gameBettingDetailsService; - @Resource - private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; - - @Resource - private IGameNameService gameNameService; - - - @Resource - private IGameSecretKeyLangService gameSecretKeyLangService; - - @Autowired @Qualifier("threadPoolTaskExecutor") private ThreadPoolTaskExecutor threadPoolTaskExecutor; @@ -252,7 +233,7 @@ 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() + /*GamePlatform gamePlatform = GamePlatform.builder() .platformType(NGGameType.findSystemByCode(apiGameInfoResponseDTO.getGameType())) .platformCode(GamePlatforms.PG.getCode()) .build(); @@ -265,9 +246,12 @@ public class GamesPGServiceImpl implements IGamesService { gamePlatformService.insertGamePlatform(gamePlatform); } else { gamePlatform = gamePlatforms.get(0); - } + }*/ + Integer platformType = NGGameType.findSystemByCode(apiGameInfoResponseDTO.getGameType()); Game game = Game.builder() - .platformId(gamePlatform.getId()) +// .platformId(gamePlatform.getId()) + .platformCode(GamePlatforms.PG.getCode()) + .platformType(platformType) .gameCode(apiGameInfoResponseDTO.getGameCode()) .build(); List games = gameService.selectGameList(game); @@ -276,15 +260,20 @@ public class GamesPGServiceImpl implements IGamesService { game.setGameSourceType(String.valueOf(apiGameInfoResponseDTO.getGameType())); game.setFreespin(Boolean.FALSE); game.setDemoStatus(Boolean.TRUE); - game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); + game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.PG.getCode()) + 1); game.setGameName(apiGameInfoResponseDTO.getGameName().get("zh-hans")); game.setCreateBy(Constants.SYSTEM); + 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")); + nameInfos.add(new NameInfo(apiGameInfoResponseDTO.getGameName().get("en"), "en-US")); + game.setNameInfo(nameInfos); gameService.insertGame(game); } else { game = games.get(0); } apiGameInfoResponseDTO.setSystemGameId(game.getId()); - Map gameName = apiGameInfoResponseDTO.getGameName(); + /*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()); @@ -309,7 +298,7 @@ public class GamesPGServiceImpl implements IGamesService { .build()); } } - } + }*/ } @@ -334,11 +323,11 @@ 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()); +// 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); @@ -358,7 +347,7 @@ public class GamesPGServiceImpl implements IGamesService { .quota(exchangeTransferMoneyRequestDTO.getQuota()) .balance(exchangeTransferMoneyRequestDTO.getAmount()) .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(currencyDTO.getSystemCurrency()) + .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) .platformCode(GamePlatforms.PG.getCode()) @@ -372,7 +361,7 @@ public class GamesPGServiceImpl implements IGamesService { .accounts(member.getGameAccount()) .agentId(exchangeTransferMoneyRequestDTO.getAgentId()) .agentKey(exchangeTransferMoneyRequestDTO.getAgentKey()) - .currency(currencyDTO.getCurrency()) + .currency(exchangeTransferMoneyRequestDTO.getCurrency()) .build(); MemberInfoResponseDTO memberInfo = this.getMemberInfo(gamesBaseRequestDTO); //判断是不是转出 @@ -384,7 +373,7 @@ public class GamesPGServiceImpl implements IGamesService { Map paramsMap = new HashMap<>(); paramsMap.put("platType", NGPlatforms.PG.getCode()); paramsMap.put("playerId", exchangeTransferMoneyRequestDTO.getAccount()); - paramsMap.put("currency", currencyDTO.getCurrency()); + paramsMap.put("currency", exchangeTransferMoneyRequestDTO.getCurrency()); paramsMap.put("type", type); paramsMap.put("amount", exchangeTransferMoneyRequestDTO.getAmount()); paramsMap.put("orderId", transactionId); @@ -399,7 +388,7 @@ public class GamesPGServiceImpl implements IGamesService { gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO(); exchangeTransferStatusRequestDTO.setAccount(exchangeTransferMoneyRequestDTO.getAccount()); - exchangeTransferStatusRequestDTO.setCurrency(currencyDTO.getCurrency()); + exchangeTransferStatusRequestDTO.setCurrency(exchangeTransferMoneyRequestDTO.getCurrency()); exchangeTransferStatusRequestDTO.setOrderId(transactionId); exchangeTransferStatusRequestDTO.setAgentId(exchangeTransferMoneyRequestDTO.getAgentId()); exchangeTransferStatusRequestDTO.setAgentKey(exchangeTransferMoneyRequestDTO.getAgentKey()); @@ -467,17 +456,19 @@ public class GamesPGServiceImpl implements IGamesService { GameSecretKeyCurrencyDTO gameSecretKeyDTO = new GameSecretKeyCurrencyDTO(); gameSecretKeyDTO.setPlatformCodes(NGPlatforms.getAllPlatforms()); - List currencyDTOList = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(gameSecretKeyDTO); - List currencys = currencyDTOList.stream() - .map(GameSecretKeyCurrencyDTO::getCurrency) - .distinct() - .collect(Collectors.toList()); +// 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); if (CollectionUtils.isEmpty(cacheSet)) { cacheSet = new HashSet<>(); } + List currencys = new ArrayList<>(platform.getCurrencyInfo().values()); //如果长度一致则清空缓存循环币种 if (cacheSet.size() >= currencys.size()) { cacheSet = new HashSet<>(); @@ -488,22 +479,24 @@ public class GamesPGServiceImpl implements IGamesService { String firstCurrency = currencys.get(0); - GameSecretKeyCurrencyDTO currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCode(GamePlatforms.PG.getCode()) - .currency(firstCurrency) - .build()); +// GameSecretKeyCurrencyDTO currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCode(GamePlatforms.PG.getCode()) +// .currency(firstCurrency) +// .build()); - betRecordByTimeDTO.setAgentId(currencyDTO.getCode()); - betRecordByTimeDTO.setAgentKey(currencyDTO.getKey()); +// betRecordByTimeDTO.setAgentId(currencyDTO.getCode()); +// betRecordByTimeDTO.setAgentKey(currencyDTO.getKey()); int pageNo = 1; int pageSize = 2000; Map paramsMap = new HashMap<>(); - paramsMap.put("currency", currencyDTO.getCurrency()); + paramsMap.put("currency", /*currencyDTO.getCurrency()*/ firstCurrency); paramsMap.put("pageNo", pageNo); paramsMap.put("pageSize", pageSize); Map key = this.getKey(betRecordByTimeDTO); + String systemCurrency = platform.getOurCurrency(firstCurrency); + ApiNGResponseDTO betRecordByTime = ngClient.getBetRecordByTime(paramsMap, key); @@ -517,7 +510,7 @@ public class GamesPGServiceImpl implements IGamesService { ApiGameBetRecordPageResponseDTO data = result.getData(); //数据组装 - this.batchInsert(data); + this.batchInsert(data, systemCurrency, firstCurrency); //总页数 // 计算总页数,确保不会遗漏 @@ -528,19 +521,19 @@ public class GamesPGServiceImpl implements IGamesService { pageNoAtomic.incrementAndGet(); //请求参数 Map paramMap = new HashMap<>(); - paramMap.put("currency", currencyDTO.getCurrency()); + paramMap.put("currency", /*currencyDTO.getCurrency()*/firstCurrency); paramMap.put("pageNo", pageNoAtomic.get()); paramMap.put("pageSize", pageSize); SleepUtil.sleep(10000); ApiNGResponseDTO betRecordByTimePage = ngClient.getBetRecordByTime(paramMap, key); data = betRecordByTimePage.getData(); //数据组装 - this.batchInsert(data); + this.batchInsert(data, systemCurrency, firstCurrency); } } - getBetRecordByHistoryTime(betRecordByTimeDTO, currencyDTO); + getBetRecordByHistoryTime(betRecordByTimeDTO, systemCurrency, firstCurrency); return Boolean.TRUE; } @@ -548,9 +541,9 @@ public class GamesPGServiceImpl implements IGamesService { * 按历史时间获取投注记录 * * @param betRecordByTimeDTO 按时间dto投注记录 - * @param currencyDTO 货币dto + * @param currency 货币 */ - private void getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO, GameSecretKeyCurrencyDTO currencyDTO) { + private void getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO, String systemCurrency, String currency /*GameSecretKeyCurrencyDTO currencyDTO*/) { //捞取指定30分钟前的数据 Long startTimes = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), -30); @@ -578,12 +571,12 @@ public class GamesPGServiceImpl implements IGamesService { .format(Instant.ofEpochMilli(betRecordByTimeDTO.getEndTime())); - betRecordByTimeDTO.setAgentId(currencyDTO.getCode()); - betRecordByTimeDTO.setAgentKey(currencyDTO.getKey()); + //betRecordByTimeDTO.setAgentId(currencyDTO.getCode()); + //betRecordByTimeDTO.setAgentKey(currencyDTO.getKey()); int pageNo = 1; int pageSize = 2000; Map paramsMap = new HashMap<>(); - paramsMap.put("currency", currencyDTO.getCurrency()); + paramsMap.put("currency", /*currencyDTO.getCurrency()*/ currency); paramsMap.put("pageNo", pageNo); paramsMap.put("pageSize", pageSize); paramsMap.put("startTime", startTime); @@ -601,7 +594,7 @@ public class GamesPGServiceImpl implements IGamesService { ApiGameBetRecordPageResponseDTO data = result.getData(); //数据组装 - this.batchInsert(data); + this.batchInsert(data, systemCurrency, currency); //总页数 // 计算总页数,确保不会遗漏 @@ -612,7 +605,7 @@ public class GamesPGServiceImpl implements IGamesService { pageNoAtomic.incrementAndGet(); //请求参数 Map paramMap = new HashMap<>(); - paramMap.put("currency", currencyDTO.getCurrency()); + paramMap.put("currency", /*currencyDTO.getCurrency()*/ currency); paramMap.put("pageNo", pageNoAtomic.get()); paramMap.put("pageSize", pageSize); paramMap.put("startTime", startTime); @@ -621,13 +614,14 @@ public class GamesPGServiceImpl implements IGamesService { ApiNGResponseDTO betRecordByTimePage = ngClient.getBetRecordByTime(paramMap, key); data = betRecordByTimePage.getData(); //数据组装 - this.batchInsert(data); + this.batchInsert(data, systemCurrency, currency); } }); } } + /** * 按历史时间获取投注记录 * @@ -719,6 +713,7 @@ public class GamesPGServiceImpl implements IGamesService { throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } + /** * 游戏演示登录 * @@ -731,7 +726,6 @@ public class GamesPGServiceImpl implements IGamesService { } - /** * 数据构建 * @@ -750,15 +744,18 @@ public class GamesPGServiceImpl implements IGamesService { } String platform = ngPlatforms.getPlatform(); - List games = gameService.selectGameDTOList(GameDTO.builder().gameName(resultBean.getGameName()).platformCode(platform).build()); + List games = gameService.selectGameDTOList(GameDTO.builder() + .gameName(resultBean.getGameName()) + .platformCode(platform) + .build()); if (CollectionUtils.isEmpty(games)) { return null; } Game gamesDataDTO = games.get(0); - GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCodes(NGPlatforms.getAllPlatforms()) - .currency(resultBean.getCurrency()) - .build()); +// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCodes(NGPlatforms.getAllPlatforms()) +// .currency(resultBean.getCurrency()) +// .build()); Member member = memberService.selectMemberByGameAccount(resultBean.getPlayerId()); if (ObjectUtils.isEmpty(member)) { @@ -778,7 +775,7 @@ public class GamesPGServiceImpl implements IGamesService { GameBettingDetails gameBettingDetails = GameBettingDetails.builder() .tenantKey(member.getTenantKey()) //保存我们的币种id - .currencyCode(currencyDTO.getSystemCurrency()) + .currencyCode(gamesDataBuildDTO.getSystemCurrencyCode()) .memberId(member.getId()) .gameCode(gamesDataDTO.getGameCode()) .gameType(NGGameType.findSystemByCode(resultBean.getGameType())) @@ -814,12 +811,15 @@ public class GamesPGServiceImpl implements IGamesService { * * @param data 数据 */ - private synchronized void batchInsert(ApiGameBetRecordPageResponseDTO data) { + private synchronized void batchInsert(ApiGameBetRecordPageResponseDTO data, String systemCurrency, String currency) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据转化 for (ApiGameBetRecordPageResponseDTO.GameBetRecord bean : data.getList()) { - GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean).build()); + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder() + .systemCurrencyCode(systemCurrency) + .currencyCode(currency) + .data(bean).build()); if (!ObjectUtils.isEmpty(bettingDetails)) { bettingDetails.setId(IdUtil.getSnowflakeNextId()); gameBettingDetails.add(bettingDetails); @@ -828,7 +828,7 @@ public class GamesPGServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds,NGPlatforms.PG.getPlatform()); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, NGPlatforms.PG.getPlatform()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) diff --git a/ff-game/src/main/java/com/ff/game/domain/CurrencyInfo.java b/ff-game/src/main/java/com/ff/game/domain/CurrencyInfo.java index 22c6e80..173c9b5 100644 --- a/ff-game/src/main/java/com/ff/game/domain/CurrencyInfo.java +++ b/ff-game/src/main/java/com/ff/game/domain/CurrencyInfo.java @@ -6,11 +6,10 @@ import java.io.Serializable; import java.util.HashMap; /** + * key:我们的币种 + * * @author cengy */ @Data public class CurrencyInfo extends HashMap implements Serializable { - - private String currencyId; - } 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 1732f03..58fefee 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 @@ -113,6 +113,10 @@ public class GameTask { betRecordByTimeDTO.setAgentKey(keyInfo.getKey()); betRecordByTimeDTO.setKeyInfo(keyInfo); betRecordByTimeDTO.setVendor(platform); + + betRecordByTimeDTO.setSystemCurrency(keyInfo.getCurrency()); + betRecordByTimeDTO.setCurrency(platform.getCurrencyInfo().get(keyInfo.getCurrency())); + gamesService.get(platformCode + Constants.SERVICE).getBetRecordByTime(betRecordByTimeDTO); } catch (Exception e) { log.error("同步平台投注记录失败platformCode:{}", platformCode, e); @@ -153,6 +157,9 @@ public class GameTask { betRecordByTimeDTO.setKeyInfo(keyInfo); betRecordByTimeDTO.setVendor(platform); + betRecordByTimeDTO.setSystemCurrency(keyInfo.getCurrency()); + betRecordByTimeDTO.setCurrency(platform.getCurrencyInfo().get(keyInfo.getCurrency())); + gamesService.get(platformCode + Constants.SERVICE).getBetRecordByHistoryTime(betRecordByTimeDTO); } catch (Exception e) { log.error("同步平台投注记录失败platformCode:{}", platformCode, e); From 905893df96fc9daf15c001f876a15c88901be9b8 Mon Sep 17 00:00:00 2001 From: shi Date: Mon, 7 Apr 2025 14:44:55 +0800 Subject: [PATCH 30/62] =?UTF-8?q?feat(game):=20=E6=B7=BB=E5=8A=A0=20PGT=20?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E6=8E=A5=E5=8F=A3=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 PGT 游戏列表获取功能- 实现 PGT 投注记录获取和处理 - 添加 PGT 成员踢出功能 - 优化 PGT 客户端接口定义 - 新增相关枚举类和数据传输对象 --- .../com/ff/base/constant/CacheConstants.java | 11 ++ .../java/com/ff/base/enums/PGTBetStatus.java | 24 +++ .../java/com/ff/base/enums/PGTGameType.java | 43 +++++ .../com/ff/base/enums/PGTPayoutStatus.java | 35 ++++ .../java/com/ff/base/utils/DateUtils.java | 5 + .../com/ff/game/api/pgt/client/PGTClient.java | 44 +++-- .../game/api/pgt/dto/PGTGameListResponse.java | 133 ++++++++++++++ .../api/pgt/dto/PGTKickMemberResponse.java | 56 ++++++ .../dto/PGTTransactionDetailsResponse.java | 11 +- .../api/pgt/dto/PGXBetHistoryResponse.java | 148 ---------------- .../ff/game/api/pgt/dto/PGXErrorResponse.java | 26 --- .../PGXExchangeTransferStatusResponse.java | 67 ------- .../api/pgt/dto/PGXGameLoginResponse.java | 30 ---- .../game/api/pgt/dto/PGXMemberResponse.java | 26 --- .../api/pgt/dto/PGXPlayerStatusResponse.java | 26 --- .../api/pgt/impl/GamesPGTServiceImpl.java | 167 ++++++++++++++---- .../ff/game/domain/GameBettingDetails.java | 4 +- .../java/com/ff/game/domain/Platform.java | 6 + 18 files changed, 480 insertions(+), 382 deletions(-) create mode 100644 ff-base/src/main/java/com/ff/base/enums/PGTBetStatus.java create mode 100644 ff-base/src/main/java/com/ff/base/enums/PGTGameType.java create mode 100644 ff-base/src/main/java/com/ff/base/enums/PGTPayoutStatus.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTGameListResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTKickMemberResponse.java delete mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXBetHistoryResponse.java delete mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXErrorResponse.java delete mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXExchangeTransferStatusResponse.java delete mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXGameLoginResponse.java delete mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXMemberResponse.java delete mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXPlayerStatusResponse.java 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 1e5c620..401a331 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 @@ -68,6 +68,11 @@ public class CacheConstants { */ public static final String PG_GAMES = "pg_games:"; + /** + * pgt游戏 + */ + public static final String PGT_GAMES = "pgt_games:"; + /** * fc游戏 @@ -89,6 +94,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/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/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-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java b/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java index 6fbc837..186d702 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java @@ -2,12 +2,14 @@ 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; @@ -42,14 +44,7 @@ public interface PGTClient { PGTBalanceResponse getMemberInfo(@Var("parameters") String parameters, @Header Map headerMap); - /** - * 获取会员游戏信息 目前仅支持供应商代号JD. - * - * @param parameters 范围 - * @return {@link PGXPlayerStatusResponse } - */ - @Get("/isPlayerIngame.ashx?${parameters}") - PGXPlayerStatusResponse getMemberPlayInfo(@Var("parameters") String parameters); + /** @@ -62,6 +57,17 @@ public interface PGTClient { PGTLoginResponse loginWithoutRedirect(@JSONBody Map parameters, @Header Map headerMap); + /** + * 获取游戏列表 + * + * @param parameters 范围 + * @param headerMap 标题映射 + * @return {@link PGTGameListResponse } + */ + @Get("/GetGameIconList") + PGTGameListResponse getGameList(@JSONBody Map parameters, @Header Map headerMap); + + /** * 押金 * @@ -101,32 +107,24 @@ public interface PGTClient { * @param headerMap 标题映射 * @return {@link PGTTransactionDetailsResponse } */ - @Get(url = "/betTransactionsV2") - PGTTransactionDetailsResponse getBetRecordByTime(@JSONBody Map parameters, @Header Map headerMap); + @Get(url = "/betTransactionsV2?{parameters}") + PGTTransactionDetailsResponse getBetRecordByTime(@Var("parameters") String parameters, @Header Map headerMap); - @Get(url = "h/fetchArchieve.aspx?{parameters}") - PGXBetHistoryResponse getBetRecordByHistoryTime(@Var("parameters") String parameters); /** * 踢出队员 * * @param parameters 范围 - * @return {@link JILIKickMemberDTO } + * @param headerMap 标题映射 + * @return {@link PGTKickMemberResponse } */ - @Post("/kickPlayerFromProduct.ashx?{parameters}") - PGXErrorResponse kickMember(@Var("parameters") String parameters); + @Post("/seamless/kickOutPlayer") + PGTKickMemberResponse kickMember(@JSONBody Map parameters, @Header Map headerMap); + - /** - * 踢出所有队员 - * - * @param params 参数 - * @return {@link JILIKickMemberAllDTO } - */ - @Get("/kickMemberAll") - XKKickMemberAllDTO kickMemberAll(@JSONBody Map params); } 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/PGTTransactionDetailsResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTTransactionDetailsResponse.java index d9b5455..096183e 100644 --- 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 @@ -3,6 +3,8 @@ 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; /** @@ -85,25 +87,25 @@ public class PGTTransactionDetailsResponse { * 结算时间 */ @JsonProperty("accountingDate") - private String accountingDate; + private Date accountingDate; /** * 最新更新时间 */ @JsonProperty("updatedDate") - private String updatedDate; + private Date updatedDate; /** * 质押金额 */ @JsonProperty("stake") - private double stake; + private BigDecimal stake; /** * 支付金额(包括本金) */ @JsonProperty("payout") - private double payout; + private BigDecimal payout; /** * 产品 ID @@ -131,6 +133,7 @@ public class PGTTransactionDetailsResponse { /** * 投注状态(未结、已结算、未结算、无效) + * OPEN, SETTLED, UNSETTLED, VOID */ @JsonProperty("betStatus") private String betStatus; diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXBetHistoryResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXBetHistoryResponse.java deleted file mode 100644 index 3b98e14..0000000 --- a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXBetHistoryResponse.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.ff.game.api.pgt.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -import java.math.BigDecimal; -import java.util.Date; - -/** - * 错误信息与投注历史记录返回结果对象 - * - * @author shi - * @date 2025/03/28 - */ -@Data -public class PGXBetHistoryResponse { - - /** - * 错误码 - */ - @JsonProperty("errCode") - private Integer errCode; - - /** - * 投注历史记录的JSON字符串 (String类型) - */ - @JsonProperty("result") - private String result; - - /** - * 错误信息 (String类型) - */ - @JsonProperty("errMsg") - private String errMsg; - - /** - * AIO投注记录对象 - */ - @Data - public class Result { - - /** - * AIO注单号 (唯一值) (Long类型) - */ - @JsonProperty("id") - private Long id; - - /** - * 供应商注单号 (Long类型) - */ - @JsonProperty("ref_no") - private Long refNo; - - /** - * 供应商代号 (String类型) - */ - @JsonProperty("site") - private String site; - - /** - * 游戏类型代号 (String类型) - */ - @JsonProperty("product") - private String product; - - /** - * 玩家帐号 (String类型) - */ - @JsonProperty("member") - private String member; - - /** - * 游戏代号 (String类型) - */ - @JsonProperty("game_id") - private String gameId; - - /** - * 下注时间 (玩家实际的投注时间) 依据 GMT/UTC +0 时区 - */ - @JsonProperty("start_time") - private Date startTime; - - /** - * 结算时间 (String类型) 依据 GMT/UTC +0 时区 - */ - @JsonProperty("end_time") - private Date endTime; - - /** - * 开赛时间 (String类型) 依据 GMT/UTC +0 时区 - */ - @JsonProperty("match_time") - private String matchTime; - - /** - * 投注明细 (String类型) - */ - @JsonProperty("bet_detail") - private String betDetail; - - /** - * 有效投注金额 (Double类型) - */ - @JsonProperty("turnover") - private BigDecimal turnover; - - /** - * 投注金额 (Double类型) - */ - @JsonProperty("bet") - private BigDecimal bet; - - /** - * 派彩金额 (Double类型) - */ - @JsonProperty("payout") - private BigDecimal payout; - - /** - * 佣金 (Double类型) - */ - @JsonProperty("commission") - private BigDecimal commission; - - /** - * 彩池投注金额 (Double类型) - */ - @JsonProperty("p_share") - private BigDecimal pShare; - - /** - * 彩池派彩金额 (Double类型) - */ - @JsonProperty("p_win") - private BigDecimal pWin; - - /** - * 注单状态 (Int类型) - * 1 (valid bet record 有效注单) - * 0 (running/ongoing match 赛事进行中) - * -1 (invalid bet record 无效注单 e.g. voided 作废, canceled 取消) - */ - @JsonProperty("status") - private int status; - - } -} \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXErrorResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXErrorResponse.java deleted file mode 100644 index a11da08..0000000 --- a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXErrorResponse.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.ff.game.api.pgt.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -/** - * 错误响应类 - * - * @author shi - * @date 2025/03/27 - */ -@Data -public class PGXErrorResponse { - - /** 错误码 */ - @JsonProperty("errCode") - private Integer errCode; - - /** 内部参考代码 (字符串类型) */ - @JsonProperty("innerCode") - private String innerCode; - - /** 错误信息 (字符串类型) */ - @JsonProperty("errMsg") - private String errMsg; -} diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXExchangeTransferStatusResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXExchangeTransferStatusResponse.java deleted file mode 100644 index 5fab258..0000000 --- a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXExchangeTransferStatusResponse.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.ff.game.api.pgt.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -/** - * pgxexchange传输状态响应 - * - * @author shi - * @date 2025/03/28 - */ -@Data -public class PGXExchangeTransferStatusResponse { - - /** 错误码 */ - @JsonProperty("errCode") - private Integer errCode; - - - - /** 错误信息 (字符串类型) */ - @JsonProperty("errMsg") - private String errMsg; - - - /** GSC生成的转账ID (String类型) */ - @JsonProperty("trans_id") - private String transId; - - /** 交易时间,GMT+0 (String类型) */ - @JsonProperty("trans_time") - private String transTime; - - /** 玩家姓名 (String类型) */ - @JsonProperty("username") - private String username; - - /** 交易类型 (String类型),0为存款,1为取款 */ - @JsonProperty("type") - private String type; - - /** 提供商 (String类型) */ - @JsonProperty("provider") - private String provider; - - /** 交易金额 (double类型) */ - @JsonProperty("amount") - private double amount; - - /** 运营商的参考ID (String类型) */ - @JsonProperty("ref_id") - private String refId; - - /** 交易状态 (String类型),SUCCESS 成功 - PROCESSING 进行中,请稍后再确认 - FAILED 失败 */ - @JsonProperty("status") - private String status; - - /** GSC操作员代码 (String类型) */ - @JsonProperty("operator") - private String operator; - - /** 交易备注 (String类型) */ - @JsonProperty("remark") - private String remark; -} diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXGameLoginResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXGameLoginResponse.java deleted file mode 100644 index 1b18e65..0000000 --- a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXGameLoginResponse.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.ff.game.api.pgt.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -/** - * 游戏响应对象 - */ -@Data -public class PGXGameLoginResponse { - - /** - * 错误码 (String类型) - */ - @JsonProperty("errCode") - private Integer errCode; - - /** - * 启动游戏链接 (String类型) - */ - @JsonProperty("gameUrl") - private String gameUrl; - - /** - * 错误信息 (String类型) - */ - @JsonProperty("errMsg") - private String errMsg; - -} \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXMemberResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXMemberResponse.java deleted file mode 100644 index 80c40ce..0000000 --- a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXMemberResponse.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.ff.game.api.pgt.dto; - - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -import java.math.BigDecimal; - -/** - * 响应类,包含错误码、余额和错误信息 - */ -@Data -public class PGXMemberResponse { - - /** 错误码 */ - @JsonProperty("errCode") - private Integer errCode; - - /** 账户余额 (小数类型) */ - @JsonProperty("balance") - private BigDecimal balance; - - /** 错误信息 (字符串类型) */ - @JsonProperty("errMsg") - private String errMsg; -} \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXPlayerStatusResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXPlayerStatusResponse.java deleted file mode 100644 index 536becf..0000000 --- a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGXPlayerStatusResponse.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.ff.game.api.pgt.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -/** - * 响应类,包含错误码、玩家是否在游戏中状态和错误信息 - * - * @author shi - * @date 2025/03/28 - */ -@Data -public class PGXPlayerStatusResponse { - - /** 错误码 (字符串类型) */ - @JsonProperty("errCode") - private Integer errCode; - - /** 玩家是否在游戏中 (字符串类型) "true" 表示在游戏中,"false" 表示不在游戏中 */ - @JsonProperty("result") - private Boolean result; - - /** 错误信息 (字符串类型) */ - @JsonProperty("errMsg") - private String errMsg; -} \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java index 7a0f23e..fd49051 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java @@ -1,7 +1,9 @@ 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; @@ -9,13 +11,18 @@ 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.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.GameSecretKeyCurrencyDTO; import com.ff.game.service.*; @@ -32,10 +39,8 @@ import org.springframework.util.ObjectUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -206,9 +211,60 @@ public class GamesPGTServiceImpl implements IGamesService { @Transactional @Override public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) { + List apiGameInfoResponseDTOS = redisCache.getCacheList(CacheConstants.PGT_GAMES); + if (!CollectionUtils.isEmpty(apiGameInfoResponseDTOS)) { + return CacheConstants.PGT_GAMES; + } - return CacheConstants.PGX_GAMES; + log.info("GamesPGTServiceImpl [getGameList] 请求参数 {}", gamesBaseRequestDTO); + Map paramsMap = new HashMap<>(); + paramsMap.put("productId", productId); + PGTGameListResponse gameList = pgtClient.getGameList(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.getLocale().getCn()); + game.setCreateBy(Constants.SYSTEM); + + List nameInfos = new ArrayList<>(); + nameInfos.add(NameInfo.builder().lang("zh-CN").name(gameIdKey.getLocale().getCn()).build()); + nameInfos.add(NameInfo.builder().lang("en-US").name(gameIdKey.getLocale().getEn()).build()); + nameInfos.add(NameInfo.builder().lang("th-TH").name(gameIdKey.getLocale().getTh()).build()); + 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; } /** @@ -361,23 +417,31 @@ public class GamesPGTServiceImpl implements IGamesService { public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { //请求参数 log.info("GamesPGTServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO); + + String startTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT_Z, "GMT+8"); + String endTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT_Z, "GMT+8"); + + String nextId = redisCache.getCacheObject(CacheConstants.PGT_NEXT_ID); + + Map paramsMap = new LinkedHashMap<>(); paramsMap.put("productId", productId); - paramsMap.put("date", productId); - paramsMap.put("startTime", productId); - paramsMap.put("endTime", productId); - paramsMap.put("nextId", productId); + paramsMap.put("startTime", startTime); + paramsMap.put("endTime", endTime); + paramsMap.put("nextId", nextId); Map key = this.getKey(betRecordByTimeDTO); - PGTTransactionDetailsResponse betRecordByTime = pgtClient.getBetRecordByTime(paramsMap, key); + 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.getErrCode(), betRecordByTime.getErrMsg()); - throw new BaseException(betRecordByTime.getErrMsg()); + log.error("GamesPGXServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getCode(), betRecordByTime.getMessage()); + throw new BaseException(betRecordByTime.getMessage()); } } @@ -389,21 +453,7 @@ public class GamesPGTServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { - //请求参数 - log.info("GamesPGXServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", betRecordByTimeDTO); - Map paramsMap = new LinkedHashMap<>(); - paramsMap.put("operatorcode", betRecordByTimeDTO.getAgentId()); - paramsMap.put("versionkey", 0); - PGXBetHistoryResponse betRecordByTime = pgtClient.getBetRecordByHistoryTime(JsonUtil.mapToQueryString(paramsMap)); - - if (this.getIsSuccess(betRecordByTime.getErrCode())) { - List results = JSON.parseArray(betRecordByTime.getResult(), PGXBetHistoryResponse.Result.class); - this.batchInsert(results, betRecordByTimeDTO); - return Boolean.TRUE; - } else { - log.error("GamesPGXServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getErrCode(), betRecordByTime.getErrMsg()); - throw new BaseException(betRecordByTime.getErrMsg()); - } + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } /** @@ -436,7 +486,18 @@ public class GamesPGTServiceImpl implements IGamesService { */ @Override public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) { - throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + log.info("GamesPGTServiceImpl [kickMember] 请求参数 {}", kickMemberRequestDTO); + Map paramsMap = new HashMap<>(); + paramsMap.put("username", kickMemberRequestDTO.getAccount()); + paramsMap.put("productId", productId); + Map key = this.getKey(kickMemberRequestDTO); + + PGTKickMemberResponse pgtKickMemberResponse = pgtClient.kickMember(paramsMap, key); + if (this.getIsSuccess(pgtKickMemberResponse.getCode())&&"SUCCESS".equals(pgtKickMemberResponse.getData().getStatus())) { + return Boolean.TRUE; + } else { + throw new ApiException(ErrorCode.KICK_OUT_AILED.getCode()); + } } /** @@ -495,7 +556,9 @@ public class GamesPGTServiceImpl implements IGamesService { //数据转化 for (PGTTransactionDetailsResponse.Transaction bean : dataBean) { - GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().agentId(gamesBaseRequestDTO.getAgentId()).data(bean).build()); + 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); @@ -527,7 +590,51 @@ public class GamesPGTServiceImpl implements IGamesService { @Override public GameBettingDetails dataBuild(GamesDataBuildDTO gamesDataBuildDTO) { //转化类 + PGTTransactionDetailsResponse.Transaction resultBean = (PGTTransactionDetailsResponse.Transaction) gamesDataBuildDTO.getData(); - return new GameBettingDetails(); + + //只要结算的数据 + 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.getPayout()) + .payoffTime(resultBean.getAccountingDate().getTime()) + .payoffAmount(resultBean.getStake()) + .settlementTime(resultBean.getAccountingDate().getTime()) + .turnover(resultBean.getPayout()) + .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/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/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) { From 947d54590a76c579ac0ae78234af3a0c4f850f97 Mon Sep 17 00:00:00 2001 From: cengy Date: Mon, 7 Apr 2025 15:22:04 +0800 Subject: [PATCH 31/62] =?UTF-8?q?refactor(ff-game):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E6=A8=A1=E5=9D=97=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除了 GameName、GamePlatform 和 GameSecretKey 相关的实体类、Mapper 和 Service - 优化了 ApiGameController 中的代码结构 - 更新了 GameBalanceExchange 类的继承关系 - 调整了 GamesAEServiceImpl 和 GamesDGServiceImpl 中的方法实现 --- .../ff/api/controller/ApiGameController.java | 23 +-- .../ff/common/dto/GameBalanceExchange.java | 3 +- .../impl/TenantGameQuotaServiceImpl.java | 31 +--- .../game/api/ae/impl/GamesAEServiceImpl.java | 4 + .../dg/service/impl/GamesDGServiceImpl.java | 12 +- .../service/impl/GamesJILIServiceImpl.java | 2 + .../game/api/km/impl/GamesKMServiceImpl.java | 10 +- .../meitian/impl/MeiTianGameServiceImpl.java | 2 + .../ng/service/impl/GamesPGServiceImpl.java | 7 +- .../api/pgx/impl/GamesPGXServiceImpl.java | 117 ++++++++------- .../game/api/sa/impl/GamesSAServiceImpl.java | 92 +++++------- .../xk/service/impl/GamesXKServiceImpl.java | 102 ++++++------- .../controller/GamePlatformController.java | 86 +---------- .../controller/GameSecretKeyController.java | 104 ------------- .../java/com/ff/game/domain/GameName.java | 50 ------- .../java/com/ff/game/domain/GamePlatform.java | 58 ------- .../com/ff/game/domain/GameSecretKey.java | 50 ------- .../ff/game/domain/GameSecretKeyCurrency.java | 55 ------- .../com/ff/game/domain/GameSecretKeyLang.java | 43 ------ .../java/com/ff/game/dto/GameNameDTO.java | 28 ---- .../ff/game/dto/GameSecretKeyCurrencyDTO.java | 51 ------- .../com/ff/game/dto/GameSecretKeyDTO.java | 21 --- .../com/ff/game/dto/GameSecretKeyLangDTO.java | 41 ----- .../com/ff/game/mapper/GameNameMapper.java | 72 --------- .../ff/game/mapper/GamePlatformMapper.java | 70 --------- .../mapper/GameSecretKeyCurrencyMapper.java | 79 ---------- .../game/mapper/GameSecretKeyLangMapper.java | 71 --------- .../ff/game/mapper/GameSecretKeyMapper.java | 72 --------- .../com/ff/game/service/IGameNameService.java | 74 --------- .../ff/game/service/IGamePlatformService.java | 71 --------- .../IGameSecretKeyCurrencyService.java | 86 ----------- .../service/IGameSecretKeyLangService.java | 72 --------- .../game/service/IGameSecretKeyService.java | 72 --------- .../com/ff/game/service/IGameService.java | 9 -- .../service/impl/GameNameServiceImpl.java | 110 -------------- .../service/impl/GamePlatformServiceImpl.java | 107 ------------- .../GameSecretKeyCurrencyServiceImpl.java | 123 --------------- .../impl/GameSecretKeyLangServiceImpl.java | 106 ------------- .../impl/GameSecretKeyServiceImpl.java | 110 -------------- .../ff/game/service/impl/GameServiceImpl.java | 65 +------- .../java/com/ff/quartz/task/GameTask.java | 2 +- .../resources/mapper/game/GameNameMapper.xml | 124 --------------- .../mapper/game/GamePlatformMapper.xml | 99 ------------ .../game/GameSecretKeyCurrencyMapper.xml | 141 ------------------ .../mapper/game/GameSecretKeyLangMapper.xml | 112 -------------- .../mapper/game/GameSecretKeyMapper.xml | 100 ------------- 46 files changed, 202 insertions(+), 2737 deletions(-) delete mode 100644 ff-game/src/main/java/com/ff/game/controller/GameSecretKeyController.java delete mode 100644 ff-game/src/main/java/com/ff/game/domain/GameName.java delete mode 100644 ff-game/src/main/java/com/ff/game/domain/GamePlatform.java delete mode 100644 ff-game/src/main/java/com/ff/game/domain/GameSecretKey.java delete mode 100644 ff-game/src/main/java/com/ff/game/domain/GameSecretKeyCurrency.java delete mode 100644 ff-game/src/main/java/com/ff/game/domain/GameSecretKeyLang.java delete mode 100644 ff-game/src/main/java/com/ff/game/dto/GameNameDTO.java delete mode 100644 ff-game/src/main/java/com/ff/game/dto/GameSecretKeyCurrencyDTO.java delete mode 100644 ff-game/src/main/java/com/ff/game/dto/GameSecretKeyDTO.java delete mode 100644 ff-game/src/main/java/com/ff/game/dto/GameSecretKeyLangDTO.java delete mode 100644 ff-game/src/main/java/com/ff/game/mapper/GameNameMapper.java delete mode 100644 ff-game/src/main/java/com/ff/game/mapper/GamePlatformMapper.java delete mode 100644 ff-game/src/main/java/com/ff/game/mapper/GameSecretKeyCurrencyMapper.java delete mode 100644 ff-game/src/main/java/com/ff/game/mapper/GameSecretKeyLangMapper.java delete mode 100644 ff-game/src/main/java/com/ff/game/mapper/GameSecretKeyMapper.java delete mode 100644 ff-game/src/main/java/com/ff/game/service/IGameNameService.java delete mode 100644 ff-game/src/main/java/com/ff/game/service/IGamePlatformService.java delete mode 100644 ff-game/src/main/java/com/ff/game/service/IGameSecretKeyCurrencyService.java delete mode 100644 ff-game/src/main/java/com/ff/game/service/IGameSecretKeyLangService.java delete mode 100644 ff-game/src/main/java/com/ff/game/service/IGameSecretKeyService.java delete mode 100644 ff-game/src/main/java/com/ff/game/service/impl/GameNameServiceImpl.java delete mode 100644 ff-game/src/main/java/com/ff/game/service/impl/GamePlatformServiceImpl.java delete mode 100644 ff-game/src/main/java/com/ff/game/service/impl/GameSecretKeyCurrencyServiceImpl.java delete mode 100644 ff-game/src/main/java/com/ff/game/service/impl/GameSecretKeyLangServiceImpl.java delete mode 100644 ff-game/src/main/java/com/ff/game/service/impl/GameSecretKeyServiceImpl.java delete mode 100644 ff-game/src/main/resources/mapper/game/GameNameMapper.xml delete mode 100644 ff-game/src/main/resources/mapper/game/GamePlatformMapper.xml delete mode 100644 ff-game/src/main/resources/mapper/game/GameSecretKeyCurrencyMapper.xml delete mode 100644 ff-game/src/main/resources/mapper/game/GameSecretKeyLangMapper.xml delete mode 100644 ff-game/src/main/resources/mapper/game/GameSecretKeyMapper.xml diff --git a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java index 27c3a29..76ecf27 100644 --- a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java +++ b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java @@ -1,7 +1,6 @@ package com.ff.api.controller; -import cn.hutool.core.util.NumberUtil; import com.ff.annotation.CheckHeader; import com.ff.api.request.*; import com.ff.api.response.*; @@ -10,10 +9,7 @@ import com.ff.base.core.controller.BaseController; import com.ff.base.core.domain.AjaxResult; import com.ff.base.core.page.TableDataInfo; import com.ff.base.enums.ErrorCode; -import com.ff.base.enums.GamePlatforms; -import com.ff.base.enums.TransferType; import com.ff.base.exception.base.ApiException; -import com.ff.base.exception.base.BaseException; import com.ff.base.system.domain.TenantSecretKey; import com.ff.base.utils.StringUtils; import com.ff.base.utils.bean.BeanUtils; @@ -46,11 +42,8 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.Future; /** * api控制器 @@ -243,10 +236,15 @@ public class ApiGameController extends BaseController { .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()); // 获取用户信息 @@ -635,13 +633,12 @@ public class ApiGameController extends BaseController { * * @param request 成员信息所有api请求 * @return {@link AjaxResult } - */ + *//* @PostMapping("/exchange/balance/all") public AjaxResult exchangeBalanceAll(@Validated @RequestBody GameExchangeBalanceAllRequest request) { TenantSecretKey tenantSecretKey = keyConfig.get(); - // List gameSecretKeys = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO.builder() // .systemCurrency(gameExchangeBalanceAllRequest.getCurrencyCode()).build()); @@ -702,7 +699,7 @@ public class ApiGameController extends BaseController { .agentKey(key.getKey()) .orderId(request.getOrderId()) .amount(BigDecimal.ONE) - .currency(/*gameSecretKeyCurrencyDTO.getCurrency()*/key.currency) + .currency(*//*gameSecretKeyCurrencyDTO.getCurrency()*//*key.currency) .tenantKey(tenantSecretKey.getTenantKey()) .account(member.getGameAccount()) .vendor(key.getPlatform()) @@ -747,6 +744,10 @@ public class ApiGameController extends BaseController { .amount(gameExchangeMoney.getBalance()) .account(member.getMemberAccount()) .tenantKey(tenantSecretKey.getTenantKey()) + .currency() + .systemCurrency(gameExchangeMoney.getCurrencyCode()) + .agentId() + .agentKey() .build()); } @@ -758,7 +759,7 @@ public class ApiGameController extends BaseController { return AjaxResult.success(balanceMap); - } + }*/ /** 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 5935c43..055ae84 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 @@ -1,5 +1,6 @@ package com.ff.common.dto; +import com.ff.game.api.request.GamesBaseRequestDTO; import io.swagger.models.auth.In; import lombok.AllArgsConstructor; import lombok.Builder; @@ -21,7 +22,7 @@ import java.math.BigDecimal; @AllArgsConstructor @NoArgsConstructor @SuperBuilder -public class GameBalanceExchange implements Serializable { +public class GameBalanceExchange extends GamesBaseRequestDTO implements Serializable { private final static long serialVersionUID = 3452954102791311247L; 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 3186d9e..4307341 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 @@ -26,13 +26,8 @@ import com.ff.common.service.ITenantQuotaExchangeService; import com.ff.base.system.service.ITenantSecretKeyService; import com.ff.game.api.IGamesService; import com.ff.game.api.request.MemberInfoRequestDTO; -import com.ff.game.domain.GameSecretKey; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; -import com.ff.game.service.IGameSecretKeyCurrencyService; -import com.ff.game.service.IGameSecretKeyService; import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; -import nonapi.io.github.classgraph.json.Id; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ff.common.mapper.TenantGameQuotaMapper; @@ -61,30 +56,18 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService { @Resource private ITenantSecretKeyService tenantSecretKeyService; - @Resource private IMemberService memberService; - - @Resource - private IGameSecretKeyService gameSecretKeyService; - - @Autowired private Map gamesService; - @Resource private ITenantQuotaExchangeService tenantQuotaExchangeService; @Resource private ITenantPlatformService tenantPlatformService; - - @Resource - private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; - - /** * 查询租户游戏配额 * @@ -289,12 +272,12 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService { @Override public BigDecimal gameBalanceExchange(GameBalanceExchange gameBalanceExchange) { // 获取平台接口密钥 - GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCode(gameBalanceExchange.getPlatformCode()) - .systemCurrency(gameBalanceExchange.getCurrencyCode()).build()); +// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCode(gameBalanceExchange.getPlatformCode()) +// .systemCurrency(gameBalanceExchange.getCurrencyCode()).build()); // 检查平台密钥是否存在,否则抛出异常 - ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); +// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); TenantQuotaExchange tenantQuotaExchange = tenantQuotaExchangeService.getTenantQuotaExchange(Constants.USDT, gameBalanceExchange.getCurrencyCode()); ApiException.notNull(tenantQuotaExchange, ErrorCode.CURRENCY_EXCHANGE.getCode()); @@ -344,9 +327,9 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService { // 获取第三方钱包余额 MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder() .accounts(member.getGameAccount()) - .agentId(gameSecretKey.getCode()) - .currency(gameSecretKey.getCurrency()) - .agentKey(gameSecretKey.getKey()) + .agentId(gameBalanceExchange.getAgentId()) + .currency(gameBalanceExchange.getCurrency()) + .agentKey(gameBalanceExchange.getAgentKey()) .build(); balanceRequestAmount = iGamesService.getMemberInfo(gamesBaseRequestDTO).getBalance(); balanceRequestAmount = NumberUtil.add(balanceRequestAmount, NumberUtil.mul(balanceRequestAmount, NumberUtil.div(tenantPlatform.getUseCost(), Constants.HUNDRED))); 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 927c928..17453f3 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 @@ -365,6 +365,10 @@ public class GamesAEServiceImpl implements IGamesService { .amount(exchangeMoney.getBalance()) .account(member.getMemberAccount()) .tenantKey(exchangeMoney.getTenantKey()) + .currency(exchangeTransferMoneyRequestDTO.getCurrency()) + .systemCurrency(exchangeTransferMoneyRequestDTO.getSystemCurrency()) + .agentKey(exchangeTransferMoneyRequestDTO.getAgentKey()) + .agentId(exchangeTransferMoneyRequestDTO.getAgentId()) .build()); } exchangeMoney.setStatus(status); 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 cf46f08..7a55494 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 @@ -17,7 +17,9 @@ import com.ff.game.api.dg.client.DGClient; import com.ff.game.api.dg.dto.*; import com.ff.game.api.request.*; import com.ff.game.domain.*; -import com.ff.game.service.*; +import com.ff.game.service.IGameBettingDetailsService; +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 lombok.extern.slf4j.Slf4j; @@ -46,11 +48,6 @@ public class GamesDGServiceImpl implements IGamesService { @Resource private IGameExchangeMoneyService gameExchangeMoneyService; - - @Resource - private IGamePlatformService gamePlatformService; - - @Resource private IGameService gameService; @@ -67,9 +64,6 @@ public class GamesDGServiceImpl implements IGamesService { @Resource private IGameBettingDetailsService gameBettingDetailsService; - @Resource - private IGameNameService gameNameService; - /** * 游戏id */ 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 0db9694..6219b33 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 @@ -255,6 +255,8 @@ public class GamesJILIServiceImpl implements IGamesService { game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.JILI.getCode()) + 1); game.setGameName(gamesDataDTO.getName().getZhCN()); game.setCreateBy(Constants.SYSTEM); + game.setPlatformType(platformType); + game.setPlatformCode(GamePlatforms.JILI.getCode()); List nameInfos = new ArrayList<>(); nameInfos.add(new NameInfo(gamesDataDTO.getName().getZhCN(), "zh-CN")); 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 d3d32ee..bcb8108 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 @@ -20,7 +20,10 @@ import com.ff.game.api.km.dto.*; import com.ff.game.api.request.*; import com.ff.game.api.xk.dto.XKGamesDTO; import com.ff.game.domain.*; -import com.ff.game.service.*; +import com.ff.game.service.IGameBettingDetailsService; +import com.ff.game.service.IGameExchangeMoneyService; +import com.ff.game.service.IGameService; +import com.ff.game.service.IPlatformService; import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; import lombok.extern.slf4j.Slf4j; @@ -74,9 +77,6 @@ public class GamesKMServiceImpl implements IGamesService { @Resource private IGameBettingDetailsService gameBettingDetailsService; - @Resource - private IGameNameService gameNameService; - /** * 游戏id @@ -343,6 +343,8 @@ public class GamesKMServiceImpl implements IGamesService { game.setGameName(gamesDataDTO.getName()); game.setCreateBy(Constants.SYSTEM); game.setIngress(ingress); + game.setPlatformCode(GamePlatforms.KM.getCode()); + game.setPlatformType(platformType); List nameInfos = new ArrayList<>(); nameInfos.add(new NameInfo(gamesDataDTO.getName(), "zh-CN")); game.setNameInfo(nameInfos); 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 ad63dd9..4741aa6 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 @@ -246,6 +246,8 @@ public class MeiTianGameServiceImpl implements IGamesService { game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.MT.getCode()) + 1); game.setGameName(gamesDataDTO.getCnName()); game.setCreateBy(Constants.SYSTEM); + game.setPlatformType(platformType); + game.setPlatformCode(GamePlatforms.MT.getCode()); List nameInfos = new ArrayList<>(); nameInfos.add(new NameInfo(gamesDataDTO.getCnName(), "zh-CN")); 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 9bf0f95..861735d 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 @@ -21,7 +21,6 @@ import com.ff.game.api.request.*; import com.ff.game.domain.*; import com.ff.game.dto.GameBettingDetailsDTO; import com.ff.game.dto.GameDTO; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; import com.ff.game.service.IGameBettingDetailsService; import com.ff.game.service.IGameExchangeMoneyService; import com.ff.game.service.IGameService; @@ -263,6 +262,8 @@ public class GamesPGServiceImpl implements IGamesService { game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.PG.getCode()) + 1); game.setGameName(apiGameInfoResponseDTO.getGameName().get("zh-hans")); game.setCreateBy(Constants.SYSTEM); + game.setPlatformCode(GamePlatforms.PG.getCode()); + game.setPlatformType(platformType); 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")); @@ -454,8 +455,8 @@ public class GamesPGServiceImpl implements IGamesService { @Override public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { - GameSecretKeyCurrencyDTO gameSecretKeyDTO = new GameSecretKeyCurrencyDTO(); - gameSecretKeyDTO.setPlatformCodes(NGPlatforms.getAllPlatforms()); +// GameSecretKeyCurrencyDTO gameSecretKeyDTO = new GameSecretKeyCurrencyDTO(); +// gameSecretKeyDTO.setPlatformCodes(NGPlatforms.getAllPlatforms()); // List currencyDTOList = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(gameSecretKeyDTO); // List currencys = currencyDTOList.stream() // .map(GameSecretKeyCurrencyDTO::getCurrency) 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 38d9294..b8439e5 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 @@ -15,17 +15,13 @@ import com.ff.base.utils.JsonUtil; 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.DGBetRecordResponseDTO; -import com.ff.game.api.ng.dto.ApiExchangeTransferStatusResponseDTO; import com.ff.game.api.pgx.client.PGXClient; import com.ff.game.api.pgx.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.api.xk.dto.XKKickMemberDTO; import com.ff.game.domain.*; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; -import com.ff.game.service.*; +import com.ff.game.service.IGameBettingDetailsService; +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 lombok.extern.slf4j.Slf4j; @@ -37,7 +33,10 @@ import org.springframework.util.ObjectUtils; import javax.annotation.Resource; import java.math.BigDecimal; -import java.util.*; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -63,10 +62,6 @@ public class GamesPGXServiceImpl implements IGamesService { private IGameExchangeMoneyService gameExchangeMoneyService; - @Resource - private IGamePlatformService gamePlatformService; - - @Resource private IGameService gameService; @@ -74,14 +69,6 @@ public class GamesPGXServiceImpl implements IGamesService { @Resource private IMemberService memberService; - @Resource - private IGameFreeRecordService gameFreeRecordService; - @Resource - private IGameSecretKeyService gameSecretKeyService; - - @Resource - private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; - @Resource private PGXClient PGXClient; @@ -92,9 +79,6 @@ public class GamesPGXServiceImpl implements IGamesService { @Resource private IGameBettingDetailsService gameBettingDetailsService; - @Resource - private IGameNameService gameNameService; - /** * 获得就是成功 @@ -158,11 +142,12 @@ public class GamesPGXServiceImpl implements IGamesService { @Override public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO memberInfoRequestDTO) { log.info("GamesPGXServiceImpl [getMemberInfo] 请求参数 {}", memberInfoRequestDTO); - GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(memberInfoRequestDTO.getAgentId()); +// GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(memberInfoRequestDTO.getAgentId()); Map params = new LinkedHashMap<>(); params.put("operatorcode", memberInfoRequestDTO.getAgentId()); - params.put("password", gameSecretKey.getPassword()); - params.put("providercode", gameSecretKey.getProviderCode()); + KeyInfo keyInfo = memberInfoRequestDTO.getKeyInfo(); + params.put("password", keyInfo.getPassword()); + params.put("providercode", keyInfo.getProviderCode()); params.put("username", memberInfoRequestDTO.getAccounts()); String key = this.getKey(params, memberInfoRequestDTO); params.put("signature", key); @@ -189,11 +174,13 @@ public class GamesPGXServiceImpl implements IGamesService { @Override public String loginWithoutRedirect(GamesLogin gamesLogin) { log.info("GamesPGXServiceImpl [loginWithoutRedirect] 请求参数 {}", gamesLogin); - GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(gamesLogin.getAgentId()); +// GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(gamesLogin.getAgentId()); + KeyInfo keyInfo = gamesLogin.getKeyInfo(); + Map params = new LinkedHashMap<>(); params.put("operatorcode", gamesLogin.getAgentId()); - params.put("password", gameSecretKey.getPassword()); - params.put("providercode", gameSecretKey.getProviderCode()); + params.put("password", keyInfo.getPassword()); + params.put("providercode", keyInfo.getProviderCode()); params.put("type", gamesLogin.getGameType()); params.put("username", gamesLogin.getAccount()); String key = this.getKey(params, gamesLogin); @@ -226,10 +213,11 @@ public class GamesPGXServiceImpl implements IGamesService { return CacheConstants.PGX_GAMES; } - GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(gamesBaseRequestDTO.getAgentId()); +// GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(gamesBaseRequestDTO.getAgentId()); + KeyInfo keyInfo = gamesBaseRequestDTO.getKeyInfo(); Map params = new LinkedHashMap<>(); params.put("operatorcode", gamesBaseRequestDTO.getAgentId()); - params.put("providercode", gameSecretKey.getProviderCode()); + params.put("providercode", keyInfo.getProviderCode()); String key = this.getKey(params, gamesBaseRequestDTO); //没有中文 params.put("html5", 1); @@ -242,7 +230,7 @@ public class GamesPGXServiceImpl implements IGamesService { List gameLists = JSON.parseArray(gameList.getGamelist(), PGXGameListResponse.Game.class); for (PGXGameListResponse.Game gamesDataDTO : gameLists) { - GamePlatform gamePlatform = GamePlatform.builder() + /* GamePlatform gamePlatform = GamePlatform.builder() .platformType(GPXGameType.SL.getSystemCode()) .platformCode(GamePlatforms.PGX.getInfo()) .build(); @@ -255,25 +243,33 @@ public class GamesPGXServiceImpl implements IGamesService { gamePlatformService.insertGamePlatform(gamePlatform); } else { gamePlatform = gamePlatforms.get(0); - } + }*/ + Integer platformType = GPXGameType.findSystemByCode(gamesDataDTO.getGameCode()); Game game = Game.builder() - .platformId(gamePlatform.getId()) + //.platformId(gamePlatform.getId()) .gameCode(gamesDataDTO.getGameId()) + .platformCode(GamePlatforms.PGX.getCode()) + .platformType(platformType) .build(); List games = gameService.selectGameList(game); //不存在这个游戏 if (CollectionUtils.isEmpty(games)) { game.setGameSourceType(GPXGameType.SL.getCode()); game.setFreespin(Boolean.FALSE); - game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); + game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.PGX.getCode()) + 1); game.setGameName(gamesDataDTO.getGameName()); game.setCreateBy(Constants.SYSTEM); + game.setPlatformCode(GamePlatforms.PGX.getCode()); + game.setPlatformType(platformType); + List nameInfos = new ArrayList<>(); + nameInfos.add(new NameInfo(gamesDataDTO.getGameName(), "en-US")); + game.setNameInfo(nameInfos); gameService.insertGame(game); } else { game = games.get(0); } gamesDataDTO.setSystemGameId(game.getId()); - List gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(game.getGameName()).build()); + /*List gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(game.getGameName()).build()); if (CollectionUtils.isEmpty(gameNames)) { gameNameService.insertGameName(GameName.builder() .gameId(game.getId()) @@ -281,7 +277,7 @@ public class GamesPGXServiceImpl implements IGamesService { .langCode("en-US") .createBy(Constants.SYSTEM) .build()); - } + }*/ } @@ -307,11 +303,11 @@ 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()); +// 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); @@ -323,7 +319,7 @@ public class GamesPGXServiceImpl implements IGamesService { ); Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); - GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(exchangeTransferMoneyRequestDTO.getAgentId()); +// GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(exchangeTransferMoneyRequestDTO.getAgentId()); //获取下一个自增id GameExchangeMoney exchangeMoney = GameExchangeMoney @@ -333,7 +329,7 @@ public class GamesPGXServiceImpl implements IGamesService { .quota(exchangeTransferMoneyRequestDTO.getQuota()) .balance(exchangeTransferMoneyRequestDTO.getAmount()) .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(currencyDTO.getSystemCurrency()) + .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) .platformCode(GamePlatforms.PGX.getInfo()) @@ -362,11 +358,12 @@ public class GamesPGXServiceImpl implements IGamesService { } + KeyInfo keyInfo = exchangeTransferMoneyRequestDTO.getKeyInfo(); Map paramsMap = new LinkedHashMap<>(); paramsMap.put("amount", amount); paramsMap.put("operatorcode", exchangeTransferMoneyRequestDTO.getAgentId()); - paramsMap.put("password", gameSecretKey.getPassword()); - paramsMap.put("providercode", gameSecretKey.getProviderCode()); + paramsMap.put("password", keyInfo.getPassword()); + paramsMap.put("providercode", keyInfo.getProviderCode()); paramsMap.put("referenceid", transactionId); paramsMap.put("type", type); paramsMap.put("username", exchangeTransferMoneyRequestDTO.getAccount()); @@ -392,8 +389,8 @@ public class GamesPGXServiceImpl implements IGamesService { ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO(); exchangeTransferStatusRequestDTO.setAccount(member.getGameAccount()); exchangeTransferStatusRequestDTO.setOrderId(exchangeMoney.getTransactionId()); - exchangeTransferStatusRequestDTO.setAgentId(gameSecretKey.getCode()); - exchangeTransferStatusRequestDTO.setAgentKey(gameSecretKey.getKey()); + exchangeTransferStatusRequestDTO.setAgentId(keyInfo.getCode()); + exchangeTransferStatusRequestDTO.setAgentKey(keyInfo.getKey()); this.exchangeTransferStatus(exchangeTransferStatusRequestDTO); } else { log.error("GamesFCServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{}", errorResponse.getErrCode()); @@ -576,13 +573,17 @@ public class GamesPGXServiceImpl implements IGamesService { * * @param dataBean 数据bean */ - private void batchInsert(List dataBean, GamesBaseRequestDTO gamesBaseRequestDTO) { + private void batchInsert(List dataBean, BetRecordByTimeDTO gamesBaseRequestDTO) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据转化 for (PGXBetHistoryResponse.Result bean : dataBean) { - GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().agentId(gamesBaseRequestDTO.getAgentId()).data(bean).build()); + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder() + .currencyCode(gamesBaseRequestDTO.getCurrency()) + .systemCurrencyCode(gamesBaseRequestDTO.getSystemCurrency()) + .agentId(gamesBaseRequestDTO.getAgentId()) + .data(bean).build()); if (!ObjectUtils.isEmpty(bettingDetails)) { bettingDetails.setId(IdUtil.getSnowflakeNextId()); gameBettingDetails.add(bettingDetails); @@ -591,7 +592,7 @@ public class GamesPGXServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds,GamePlatforms.PGX.getInfo()); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.PGX.getInfo()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) @@ -622,10 +623,10 @@ 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()); +// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCode(GamePlatforms.PGX.getInfo()) +// .code(gamesDataBuildDTO.getAgentId()) +// .build()); Member member = memberService.selectMemberByGameAccount(resultBean.getMember()); if (ObjectUtils.isEmpty(member)) { @@ -651,17 +652,17 @@ public class GamesPGXServiceImpl implements IGamesService { GameBettingDetails gameBettingDetails = GameBettingDetails.builder() .tenantKey(member.getTenantKey()) //保存我们的币种id - .currencyCode(currencyDTO.getSystemCurrency()) + .currencyCode(/*currencyDTO.getSystemCurrency()*/gamesDataBuildDTO.getSystemCurrencyCode()) .memberId(member.getId()) .gameCode(resultBean.getGameId()) .gameType(GPXGameType.SL.getSystemCode()) - .platformCode(GamePlatforms.PGX.getInfo()) + .platformCode(GamePlatforms.PGX.getCode()) .gameId(gamesDataDTO.getSystemGameId()) .gameName(gamesDataDTO.getGameName()) .gameStatus(gameStatus) .gameStatusType(1) .betContent(resultBean.getBetDetail()) - .gameCurrencyCode(currencyDTO.getCurrency()) + .gameCurrencyCode(/*currencyDTO.getCurrency()*/gamesDataBuildDTO.getCurrencyCode()) .account(resultBean.getMember()) .wagersId(String.valueOf(resultBean.getId())) .wagersTime(resultBean.getStartTime().getTime()) 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 2703b42..8ad3da3 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 @@ -5,23 +5,20 @@ import cn.hutool.core.util.NumberUtil; import com.ff.base.constant.CacheConstants; import com.ff.base.constant.ConfigConstants; import com.ff.base.constant.Constants; -import com.ff.base.core.redis.RedisCache; import com.ff.base.enums.*; import com.ff.base.exception.base.ApiException; -import com.ff.base.exception.base.BaseException; import com.ff.base.system.service.ISysConfigService; import com.ff.base.utils.*; 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.request.*; import com.ff.game.api.sa.client.SAClient; import com.ff.game.api.sa.dto.*; -import com.ff.game.api.xk.dto.*; import com.ff.game.domain.*; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; -import com.ff.game.service.*; +import com.ff.game.service.IGameBettingDetailsService; +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 lombok.extern.slf4j.Slf4j; @@ -33,8 +30,10 @@ import org.springframework.util.ObjectUtils; import javax.annotation.Resource; import java.math.BigDecimal; -import java.util.*; -import java.util.concurrent.TimeUnit; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; @@ -52,17 +51,9 @@ public class GamesSAServiceImpl implements IGamesService { @Resource private ISysConfigService configService; - @Resource - private RedisCache redisCache; - @Resource private IGameExchangeMoneyService gameExchangeMoneyService; - - @Resource - private IGamePlatformService gamePlatformService; - - @Resource private IGameService gameService; @@ -70,14 +61,6 @@ public class GamesSAServiceImpl implements IGamesService { @Resource private IMemberService memberService; - @Resource - private IGameFreeRecordService gameFreeRecordService; - @Resource - private IGameSecretKeyService gameSecretKeyService; - - @Resource - private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; - @Resource private SAClient SAClient; @@ -88,9 +71,6 @@ public class GamesSAServiceImpl implements IGamesService { @Resource private IGameBettingDetailsService gameBettingDetailsService; - @Resource - private IGameNameService gameNameService; - /** * 游戏id */ @@ -241,9 +221,9 @@ public class GamesSAServiceImpl implements IGamesService { @Transactional @Override public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) { - GamePlatform gamePlatform = gamePlatformService.selectGamePlatformById(PLATFORM_ID); +// GamePlatform gamePlatform = gamePlatformService.selectGamePlatformById(PLATFORM_ID); //没有此平台就新增一个平台 - if (ObjectUtils.isEmpty(gamePlatform)) { + /*if (ObjectUtils.isEmpty(gamePlatform)) { gamePlatform = new GamePlatform(); gamePlatform.setId(PLATFORM_ID); gamePlatform.setPlatformCode(GamePlatforms.SA.getInfo()); @@ -252,30 +232,36 @@ public class GamesSAServiceImpl implements IGamesService { gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1); gamePlatform.setCreateBy(Constants.SYSTEM); gamePlatformService.insertGamePlatform(gamePlatform); - } + }*/ Game game = gameService.selectGameById(GAME_ID); + Integer platformType = PlatformType.CARD_GAME.getCode(); //不存在这个游戏 if (ObjectUtils.isEmpty(game)) { game = new Game(); game.setId(GAME_ID); - game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); - game.setPlatformId(gamePlatform.getId()); + game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.SA.getCode()) + 1); + //game.setPlatformId(gamePlatform.getId()); + game.setPlatformCode(GamePlatforms.SA.getCode()); + game.setPlatformType(platformType); game.setGameCode("1"); game.setGameSourceType(String.valueOf(1)); game.setGameName("真人棋牌"); game.setCreateBy(Constants.SYSTEM); + List nameInfos = new ArrayList<>(); + nameInfos.add(new NameInfo("真人棋牌", "zh-CN")); + game.setNameInfo(nameInfos); gameService.insertGame(game); } - GameName gameName = gameNameService.selectGameNameById(GAME_NAME_ID); - if (ObjectUtils.isEmpty(gameName)) { +// GameName gameName = gameNameService.selectGameNameById(GAME_NAME_ID); + /*if (ObjectUtils.isEmpty(gameName)) { gameNameService.insertGameName(GameName.builder() - .id(GAME_NAME_ID) + .id(GAME_NAME_ID) .gameId(game.getId()) .gameName(game.getGameName()) .langCode("zh-CN") .createBy(Constants.SYSTEM) .build()); - } + }*/ return CacheConstants.SA_GAMES; } @@ -289,10 +275,10 @@ 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()); +// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCode(GamePlatforms.SA.getInfo()) +// .code(exchangeTransferMoneyRequestDTO.getAgentId()) +// .build()); Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); @@ -318,7 +304,7 @@ public class GamesSAServiceImpl implements IGamesService { .quota(exchangeTransferMoneyRequestDTO.getQuota()) .balance(exchangeTransferMoneyRequestDTO.getAmount()) .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(currencyDTO.getSystemCurrency()) + .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) .platformCode(GamePlatforms.SA.getInfo()) @@ -355,7 +341,7 @@ public class GamesSAServiceImpl implements IGamesService { params.put("Username", exchangeTransferMoneyRequestDTO.getAccount()); params.put("OrderId", exchangeMoney.getTransactionId()); params.put("CreditAmount", exchangeTransferMoneyRequestDTO.getAmount().stripTrailingZeros().toPlainString()); - params.put("CurrencyType", currencyDTO.getCurrency()); + params.put("CurrencyType", exchangeTransferMoneyRequestDTO.getCurrency()); String query = JsonUtil.mapToQueryString(params); exchangeTransferMoneyRequestDTO.setQuery(query); String key = this.getKey(exchangeTransferMoneyRequestDTO, "CreditBalanceDV"); @@ -424,7 +410,7 @@ public class GamesSAServiceImpl implements IGamesService { //判断是否获取成功 if (this.getIsSuccess(errorCode)) { //数据组装 - this.batchInsert(saGetAllBetDetailsResponse); + this.batchInsert(saGetAllBetDetailsResponse, betRecordByTimeDTO); return Boolean.TRUE; } else { @@ -541,14 +527,17 @@ public class GamesSAServiceImpl implements IGamesService { * * @param saGetAllBetDetailsResponse sa获取所有投注详细信息响应 */ - private void batchInsert(SAGetAllBetDetailsResponse saGetAllBetDetailsResponse) { + private void batchInsert(SAGetAllBetDetailsResponse saGetAllBetDetailsResponse, BetRecordByTimeDTO betRecordByTimeDTO) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 List result = saGetAllBetDetailsResponse.getBetDetailList(); //数据转化 for (SAGetAllBetDetailsResponse.BetDetail bean : result) { - GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean).build()); + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder() + .platform(betRecordByTimeDTO.getVendor()) + .data(bean) + .build()); if (!ObjectUtils.isEmpty(bettingDetails)) { bettingDetails.setId(IdUtil.getSnowflakeNextId()); gameBettingDetails.add(bettingDetails); @@ -557,7 +546,7 @@ public class GamesSAServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds,GamePlatforms.SA.getInfo()); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.SA.getInfo()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) @@ -580,10 +569,10 @@ 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()); +// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCode(GamePlatforms.SA.getInfo()) +// .currency(resultBean.getCurrency()) +// .build()); Member member = memberService.selectMemberByGameAccount(resultBean.getUsername()); if (ObjectUtils.isEmpty(member)) { @@ -602,11 +591,12 @@ public class GamesSAServiceImpl implements IGamesService { } + String systemCurrency = gamesDataBuildDTO.getPlatform().getOurCurrency(resultBean.getCurrency()); //数据构造 GameBettingDetails gameBettingDetails = GameBettingDetails.builder() .tenantKey(member.getTenantKey()) //保存我们的币种id - .currencyCode(currencyDTO.getSystemCurrency()) + .currencyCode(systemCurrency) .memberId(member.getId()) .gameCode(resultBean.getGameID()) .gameType(PlatformType.CARD_GAME.getCode()) diff --git a/ff-game/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java index 5294c0a..cef2595 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 @@ -8,7 +8,6 @@ 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.sign.Md5Utils; @@ -19,8 +18,9 @@ import com.ff.game.api.request.*; import com.ff.game.api.xk.client.XKClient; import com.ff.game.api.xk.dto.*; import com.ff.game.domain.*; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; -import com.ff.game.service.*; +import com.ff.game.service.IGameBettingDetailsService; +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 lombok.extern.slf4j.Slf4j; @@ -47,49 +47,27 @@ import java.util.stream.Collectors; @Slf4j public class GamesXKServiceImpl implements IGamesService { - - @Resource - private ISysConfigService configService; - @Resource private RedisCache redisCache; @Resource private IGameExchangeMoneyService gameExchangeMoneyService; - - @Resource - private IGamePlatformService gamePlatformService; - - @Resource private IGameService gameService; - @Resource private IMemberService memberService; - @Resource - private IGameFreeRecordService gameFreeRecordService; - @Resource - private IGameSecretKeyService gameSecretKeyService; - - @Resource - private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; - @Resource private XKClient xkClient; - @Resource private KeyConfig keyConfig; @Resource private IGameBettingDetailsService gameBettingDetailsService; - @Resource - private IGameNameService gameNameService; - /** * 获得就是成功 @@ -248,7 +226,7 @@ public class GamesXKServiceImpl implements IGamesService { if (this.getIsSuccess(xkGamesDTO.getCode())) { for (XKGamesDTO.DataBean gamesDataDTO : xkGamesDTO.getData()) { - GamePlatform gamePlatform = GamePlatform.builder() + /*GamePlatform gamePlatform = GamePlatform.builder() .platformType(XKGameType.findSystemByCode(gamesDataDTO.getGameCategoryId())) .platformCode(GamePlatforms.XK.getCode()) .build(); @@ -261,9 +239,12 @@ public class GamesXKServiceImpl implements IGamesService { gamePlatformService.insertGamePlatform(gamePlatform); } else { gamePlatform = gamePlatforms.get(0); - } + }*/ + Integer platformType = XKGameType.findSystemByCode(gamesDataDTO.getGameCategoryId()); Game game = Game.builder() - .platformId(gamePlatform.getId()) + //.platformId(gamePlatform.getId()) + .platformCode(GamePlatforms.XK.getCode()) + .platformType(platformType) .gameCode(String.valueOf(gamesDataDTO.getGameId())) .build(); List games = gameService.selectGameList(game); @@ -271,24 +252,30 @@ public class GamesXKServiceImpl implements IGamesService { if (CollectionUtils.isEmpty(games)) { game.setGameSourceType(String.valueOf(gamesDataDTO.getGameCategoryId())); game.setFreespin(gamesDataDTO.isFreeSpin()); - game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1); + game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.XK.getCode()) + 1); + game.setPlatformCode(GamePlatforms.XK.getCode()); + game.setPlatformType(platformType); game.setGameName(gamesDataDTO.getName()); game.setCreateBy(Constants.SYSTEM); + + List nameInfos = new ArrayList<>(); + nameInfos.add(new NameInfo(gamesDataDTO.getName(), "zh-CN")); + game.setNameInfo(nameInfos); + gameService.insertGame(game); } else { 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)){ + /*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); @@ -312,10 +299,10 @@ public class GamesXKServiceImpl implements IGamesService { @Transactional public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { log.info("GamesXKServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); - GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCode(GamePlatforms.XK.getInfo()) - .code(exchangeTransferMoneyRequestDTO.getAgentId()) - .build()); +// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCode(GamePlatforms.XK.getInfo()) +// .code(exchangeTransferMoneyRequestDTO.getAgentId()) +// .build()); Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); String transactionId = GamePlatforms.XK.getCode() + IdUtils.simpleUUID(); @@ -335,7 +322,7 @@ public class GamesXKServiceImpl implements IGamesService { .quota(exchangeTransferMoneyRequestDTO.getQuota()) .balance(exchangeTransferMoneyRequestDTO.getAmount()) .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(currencyDTO.getSystemCurrency()) + .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) .platformCode(GamePlatforms.XK.getCode()) @@ -395,7 +382,7 @@ public class GamesXKServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { - List gameBettingDetails = new ArrayList<>(); +// List gameBettingDetails = new ArrayList<>(); //请求参数 log.info("GamesXKServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO); Map params = new LinkedHashMap<>(); @@ -414,7 +401,7 @@ public class GamesXKServiceImpl implements IGamesService { if (this.getIsSuccess(xkBetRecordResponseDTO.getCode())) { //数据组装 XKBetRecordResponseDTO.DataBean dataBean = xkBetRecordResponseDTO.getData(); - this.batchInsert(xkBetRecordResponseDTO); + this.batchInsert(xkBetRecordResponseDTO, betRecordByTimeDTO); //获取下一页数据 while (!Objects.equals(dataBean.getCurrentPage(), dataBean.getTotalPages()) && dataBean.getTotalPages() > 0) { @@ -432,7 +419,7 @@ public class GamesXKServiceImpl implements IGamesService { params.put("key", key); xkBetRecordResponseDTO = xkClient.getBetRecordByTime(params); dataBean = xkBetRecordResponseDTO.getData(); - this.batchInsert(xkBetRecordResponseDTO); + this.batchInsert(xkBetRecordResponseDTO, betRecordByTimeDTO); } @@ -463,7 +450,7 @@ public class GamesXKServiceImpl implements IGamesService { */ @Override public Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest) { - throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } /** @@ -474,7 +461,7 @@ public class GamesXKServiceImpl implements IGamesService { */ @Override public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) { - throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } /** @@ -510,7 +497,7 @@ public class GamesXKServiceImpl implements IGamesService { */ @Override public Boolean kickMemberAll(KickMemberAllDTO kickMemberAllDTO) { - throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } /** @@ -521,7 +508,7 @@ public class GamesXKServiceImpl implements IGamesService { */ @Override public List getFreeSpinDashflow(GetFreeSpinDashflowRequestDTO getFreeSpinDashflowRequestDTO) { - throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } /** @@ -532,8 +519,9 @@ public class GamesXKServiceImpl implements IGamesService { */ @Override public Boolean cancelFreeSpin(CancelFreeSpinRequestDTO cancelFreeSpinRequestDTO) { - throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } + /** * 游戏演示登录 * @@ -546,20 +534,24 @@ public class GamesXKServiceImpl implements IGamesService { } - /** * 批量插入 * * @param xkBetRecordResponseDTO xk下注记录响应dto */ - private void batchInsert(XKBetRecordResponseDTO xkBetRecordResponseDTO) { + private void batchInsert(XKBetRecordResponseDTO xkBetRecordResponseDTO, BetRecordByTimeDTO betRecordByTimeDTO) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 XKBetRecordResponseDTO.DataBean dataBean = xkBetRecordResponseDTO.getData(); //数据转化 for (XKBetRecordResponseDTO.DataBean.ResultBean bean : dataBean.getResult()) { - GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean).build()); + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder() + .platform(betRecordByTimeDTO.getVendor()) + .systemCurrencyCode(betRecordByTimeDTO.getSystemCurrency()) + .currencyCode(betRecordByTimeDTO.getCurrency()) + .data(bean) + .build()); if (!ObjectUtils.isEmpty(bettingDetails)) { bettingDetails.setId(IdUtil.getSnowflakeNextId()); gameBettingDetails.add(bettingDetails); @@ -568,7 +560,7 @@ public class GamesXKServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds,GamePlatforms.XK.getInfo()); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.XK.getInfo()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) @@ -591,10 +583,10 @@ public class GamesXKServiceImpl implements IGamesService { //转化类 XKBetRecordResponseDTO.DataBean.ResultBean resultBean = (XKBetRecordResponseDTO.DataBean.ResultBean) gamesDataBuildDTO.getData(); - GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCode(GamePlatforms.XK.getInfo()) - .code(resultBean.getAgentId()) - .build()); +// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .platformCode(GamePlatforms.XK.getInfo()) +// .code(resultBean.getAgentId()) +// .build()); Member member = memberService.selectMemberByGameAccount(resultBean.getAccount()); if (ObjectUtils.isEmpty(member)) { @@ -614,7 +606,7 @@ public class GamesXKServiceImpl implements IGamesService { GameBettingDetails gameBettingDetails = GameBettingDetails.builder() .tenantKey(member.getTenantKey()) //保存我们的币种id - .currencyCode(currencyDTO.getSystemCurrency()) + .currencyCode(gamesDataBuildDTO.getSystemCurrencyCode()) .memberId(member.getId()) .gameCode(resultBean.getGameId()) .gameType(XKGameType.findSystemByCode(resultBean.getGameCategoryId())) diff --git a/ff-game/src/main/java/com/ff/game/controller/GamePlatformController.java b/ff-game/src/main/java/com/ff/game/controller/GamePlatformController.java index 4719b5f..cc87b71 100644 --- a/ff-game/src/main/java/com/ff/game/controller/GamePlatformController.java +++ b/ff-game/src/main/java/com/ff/game/controller/GamePlatformController.java @@ -1,27 +1,11 @@ package com.ff.game.controller; -import java.util.List; -import javax.servlet.http.HttpServletResponse; - -import com.ff.base.enums.GamePlatforms; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import com.ff.base.annotation.Log; import com.ff.base.core.controller.BaseController; import com.ff.base.core.domain.AjaxResult; -import com.ff.base.enums.BusinessType; -import com.ff.game.domain.GamePlatform; -import com.ff.game.service.IGamePlatformService; -import com.ff.base.utils.poi.ExcelUtil; -import com.ff.base.core.page.TableDataInfo; +import com.ff.base.enums.GamePlatforms; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; /** * 平台管理Controller @@ -32,19 +16,7 @@ import com.ff.base.core.page.TableDataInfo; @RestController @RequestMapping("/game/platform") public class GamePlatformController extends BaseController { - @Autowired - private IGamePlatformService gamePlatformService; - /** - * 查询平台管理列表 - */ - @PreAuthorize("@ss.hasPermi('game:platform:list')") - @GetMapping("/list") - public TableDataInfo list(GamePlatform gamePlatform) { - startPage(); - List list = gamePlatformService.selectGamePlatformList(gamePlatform); - return getDataTable(list); - } /** * 选择 @@ -56,54 +28,4 @@ public class GamePlatformController extends BaseController { return AjaxResult.success(GamePlatforms.getCodes()); } - /** - * 导出平台管理列表 - */ - @PreAuthorize("@ss.hasPermi('game:platform:export')") - @Log(title = "平台管理", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(HttpServletResponse response, GamePlatform gamePlatform) { - List list = gamePlatformService.selectGamePlatformList(gamePlatform); - ExcelUtil util = new ExcelUtil(GamePlatform.class); - util.exportExcel(response, list, "平台管理数据"); - } - - /** - * 获取平台管理详细信息 - */ - @PreAuthorize("@ss.hasPermi('game:platform:query')") - @GetMapping(value = "/{id}") - public AjaxResult getInfo(@PathVariable("id") Long id) { - return success(gamePlatformService.selectGamePlatformById(id)); - } - - /** - * 新增平台管理 - */ - @PreAuthorize("@ss.hasPermi('game:platform:add')") - @Log(title = "平台管理", businessType = BusinessType.INSERT) - @PostMapping - public AjaxResult add(@RequestBody GamePlatform gamePlatform) { - return toAjax(gamePlatformService.insertGamePlatform(gamePlatform)); - } - - /** - * 修改平台管理 - */ - @PreAuthorize("@ss.hasPermi('game:platform:edit')") - @Log(title = "平台管理", businessType = BusinessType.UPDATE) - @PutMapping - public AjaxResult edit(@RequestBody GamePlatform gamePlatform) { - return toAjax(gamePlatformService.updateGamePlatform(gamePlatform)); - } - - /** - * 删除平台管理 - */ - @PreAuthorize("@ss.hasPermi('game:platform:remove')") - @Log(title = "平台管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public AjaxResult remove(@PathVariable Long[] ids) { - return toAjax(gamePlatformService.deleteGamePlatformByIds(ids)); - } } diff --git a/ff-game/src/main/java/com/ff/game/controller/GameSecretKeyController.java b/ff-game/src/main/java/com/ff/game/controller/GameSecretKeyController.java deleted file mode 100644 index 627fc8d..0000000 --- a/ff-game/src/main/java/com/ff/game/controller/GameSecretKeyController.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.ff.game.controller; - -import java.util.List; -import javax.servlet.http.HttpServletResponse; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import com.ff.base.annotation.Log; -import com.ff.base.core.controller.BaseController; -import com.ff.base.core.domain.AjaxResult; -import com.ff.base.enums.BusinessType; -import com.ff.game.domain.GameSecretKey; -import com.ff.game.service.IGameSecretKeyService; -import com.ff.base.utils.poi.ExcelUtil; -import com.ff.base.core.page.TableDataInfo; - -/** - * 游戏平台密钥管理Controller - * - * @author shi - * @date 2025-02-10 - */ -@RestController -@RequestMapping("/game/key") -public class GameSecretKeyController extends BaseController -{ - @Autowired - private IGameSecretKeyService gameSecretKeyService; - - /** - * 查询游戏平台密钥管理列表 - */ - @PreAuthorize("@ss.hasPermi('game:key:list')") - @GetMapping("/list") - public TableDataInfo list(GameSecretKey gameSecretKey) - { - startPage(); - List list = gameSecretKeyService.selectGameSecretKeyList(gameSecretKey); - return getDataTable(list); - } - - /** - * 导出游戏平台密钥管理列表 - */ - @PreAuthorize("@ss.hasPermi('game:key:export')") - @Log(title = "游戏平台密钥管理", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(HttpServletResponse response, GameSecretKey gameSecretKey) - { - List list = gameSecretKeyService.selectGameSecretKeyList(gameSecretKey); - ExcelUtil util = new ExcelUtil(GameSecretKey.class); - util.exportExcel(response, list, "游戏平台密钥管理数据"); - } - - /** - * 获取游戏平台密钥管理详细信息 - */ - @PreAuthorize("@ss.hasPermi('game:key:query')") - @GetMapping(value = "/{id}") - public AjaxResult getInfo(@PathVariable("id") Long id) - { - return success(gameSecretKeyService.selectGameSecretKeyById(id)); - } - - /** - * 新增游戏平台密钥管理 - */ - @PreAuthorize("@ss.hasPermi('game:key:add')") - @Log(title = "游戏平台密钥管理", businessType = BusinessType.INSERT) - @PostMapping - public AjaxResult add(@RequestBody GameSecretKey gameSecretKey) - { - return toAjax(gameSecretKeyService.insertGameSecretKey(gameSecretKey)); - } - - /** - * 修改游戏平台密钥管理 - */ - @PreAuthorize("@ss.hasPermi('game:key:edit')") - @Log(title = "游戏平台密钥管理", businessType = BusinessType.UPDATE) - @PutMapping - public AjaxResult edit(@RequestBody GameSecretKey gameSecretKey) - { - return toAjax(gameSecretKeyService.updateGameSecretKey(gameSecretKey)); - } - - /** - * 删除游戏平台密钥管理 - */ - @PreAuthorize("@ss.hasPermi('game:key:remove')") - @Log(title = "游戏平台密钥管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public AjaxResult remove(@PathVariable Long[] ids) - { - return toAjax(gameSecretKeyService.deleteGameSecretKeyByIds(ids)); - } -} diff --git a/ff-game/src/main/java/com/ff/game/domain/GameName.java b/ff-game/src/main/java/com/ff/game/domain/GameName.java deleted file mode 100644 index 144a9e4..0000000 --- a/ff-game/src/main/java/com/ff/game/domain/GameName.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.ff.game.domain; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import com.ff.base.annotation.Excel; -import com.ff.base.core.domain.BaseEntity; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -/** - * 平台子游戏名称管理对象 ff_game_name - * - * @author shi - * @date 2025-03-13 - */ -@Data -@AllArgsConstructor -@SuperBuilder -@NoArgsConstructor -public class GameName extends BaseEntity { - private static final long serialVersionUID = 1L; - - /** - * $column.columnComment - */ - private Long id; - - /** - * 游戏id - */ - @JsonSerialize(using = ToStringSerializer.class) - @Excel(name = "游戏id", width = 30, dateFormat = "yyyy-MM-dd") - private Long gameId; - - /** - * 游戏名称 - */ - @Excel(name = "游戏名称") - private String gameName; - - /** - * 语言代码 - */ - @Excel(name = "语言代码") - private String langCode; - - -} diff --git a/ff-game/src/main/java/com/ff/game/domain/GamePlatform.java b/ff-game/src/main/java/com/ff/game/domain/GamePlatform.java deleted file mode 100644 index 2d2ee66..0000000 --- a/ff-game/src/main/java/com/ff/game/domain/GamePlatform.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.ff.game.domain; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import com.ff.base.annotation.Excel; -import com.ff.base.core.domain.BaseEntity; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -/** - * 平台管理对象 ff_game_platform - * - * @author shi - * @date 2025-02-10 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -@SuperBuilder -public class GamePlatform extends BaseEntity -{ - private static final long serialVersionUID = 1L; - - /** 主键id */ - @JsonSerialize(using = ToStringSerializer.class) - private Long id; - - /** 排序 */ - @Excel(name = "排序") - private Integer sortNo; - - /** 平台编码 */ - @Excel(name = "平台编码") - private String platformCode; - - /** 平台类型 ff_game_platform_type 字典 */ - @Excel(name = "平台类型 ff_game_platform_type 字典") - private Integer platformType; - - /** 平台名称 */ - @Excel(name = "平台名称") - private String platformName; - - /** 维护开关 维护状态 */ - @Excel(name = "维护开关 维护状态 ") - private Boolean stopStatus; - - /** 平台开关 平台开关状态 */ - @Excel(name = "平台开关 平台开关状态 ") - private Boolean platformStatus; - - - - -} diff --git a/ff-game/src/main/java/com/ff/game/domain/GameSecretKey.java b/ff-game/src/main/java/com/ff/game/domain/GameSecretKey.java deleted file mode 100644 index d263f9b..0000000 --- a/ff-game/src/main/java/com/ff/game/domain/GameSecretKey.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.ff.game.domain; - -import com.ff.base.annotation.Excel; -import com.ff.base.core.domain.BaseEntity; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -/** - * 游戏平台密钥管理对象 ff_game_secret_key - * - * @author shi - * @date 2025-03-13 - */ -@Data -@AllArgsConstructor -@SuperBuilder -@NoArgsConstructor -public class GameSecretKey extends BaseEntity -{ - private static final long serialVersionUID = 1L; - - /** $column.columnComment */ - private Long id; - - /** 平台 */ - @Excel(name = "平台") - private String platform; - - /** - * 供应商号 - */ - private String providerCode; - - /** - * 供应商号密码 - */ - private String password; - - /** 代码 */ - @Excel(name = "代码") - private String code; - - /** 密钥 */ - @Excel(name = "密钥") - private String key; - - -} diff --git a/ff-game/src/main/java/com/ff/game/domain/GameSecretKeyCurrency.java b/ff-game/src/main/java/com/ff/game/domain/GameSecretKeyCurrency.java deleted file mode 100644 index c081e8a..0000000 --- a/ff-game/src/main/java/com/ff/game/domain/GameSecretKeyCurrency.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.ff.game.domain; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import com.ff.base.annotation.Excel; -import com.ff.base.core.domain.BaseEntity; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -/** - * 游戏平台币种管理对象 ff_game_secret_key_currency - * - * @author shi - * @date 2025-03-13 - */ -@Data -@SuperBuilder -@AllArgsConstructor -@NoArgsConstructor -public class GameSecretKeyCurrency extends BaseEntity { - private static final long serialVersionUID = 1L; - - /** - * $column.columnComment - */ - private Long id; - - /** - * 平台 - */ - @JsonSerialize(using = ToStringSerializer.class) - @Excel(name = "平台", width = 30, dateFormat = "yyyy-MM-dd") - private Long gameSecretKeyId; - - /** - * 货币id - */ - private String currencyId; - /** - * 币种 - */ - @Excel(name = "币种") - private String currency; - - /** - * 系统代码 - */ - @Excel(name = "系统代码") - private String systemCurrency; - - -} diff --git a/ff-game/src/main/java/com/ff/game/domain/GameSecretKeyLang.java b/ff-game/src/main/java/com/ff/game/domain/GameSecretKeyLang.java deleted file mode 100644 index 91212da..0000000 --- a/ff-game/src/main/java/com/ff/game/domain/GameSecretKeyLang.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.ff.game.domain; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import com.ff.base.annotation.Excel; -import com.ff.base.core.domain.BaseEntity; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -/** - * 游戏平台语言管理对象 ff_game_secret_key_lang - * - * @author shi - * @date 2025-03-13 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -@SuperBuilder -public class GameSecretKeyLang extends BaseEntity -{ - private static final long serialVersionUID = 1L; - - /** $column.columnComment */ - private Long id; - - /** 平台 */ - @JsonSerialize(using = ToStringSerializer.class) - @Excel(name = "平台", width = 30, dateFormat = "yyyy-MM-dd") - private Long gameSecretKeyId; - - /** 语言 */ - @Excel(name = "语言") - private String lang; - - /** 系统语种id */ - @Excel(name = "系统语种id") - private String systemLangCode; - - -} diff --git a/ff-game/src/main/java/com/ff/game/dto/GameNameDTO.java b/ff-game/src/main/java/com/ff/game/dto/GameNameDTO.java deleted file mode 100644 index f4d187f..0000000 --- a/ff-game/src/main/java/com/ff/game/dto/GameNameDTO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.ff.game.dto; - -import com.ff.game.domain.GameName; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -@Data -@AllArgsConstructor -@NoArgsConstructor -@SuperBuilder -public class GameNameDTO extends GameName { - /** - * 平台代码 - */ - private String platformCode; - - /** - * 默认名称 - */ - private String defaultName; - - /** - * 游戏代码 - */ - private String gameCode; -} diff --git a/ff-game/src/main/java/com/ff/game/dto/GameSecretKeyCurrencyDTO.java b/ff-game/src/main/java/com/ff/game/dto/GameSecretKeyCurrencyDTO.java deleted file mode 100644 index 5c0dbff..0000000 --- a/ff-game/src/main/java/com/ff/game/dto/GameSecretKeyCurrencyDTO.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.ff.game.dto; - -import com.ff.game.domain.GameSecretKeyCurrency; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -import java.util.List; - -/** - * 游戏密钥货币dto - * - * @author shi - * @date 2025/03/13 - */ -@Data -@SuperBuilder -@AllArgsConstructor -@NoArgsConstructor -public class GameSecretKeyCurrencyDTO extends GameSecretKeyCurrency { - - /** - * 平台 - */ - private String platformCode; - - - /** - * 平台代码 - */ - private List platformCodes; - - /** - * API code - */ - private String code; - - /** - * 游戏密钥id - */ - private Long gameSecretKeyId; - - /** - * 密钥 - */ - private String key; - - -} diff --git a/ff-game/src/main/java/com/ff/game/dto/GameSecretKeyDTO.java b/ff-game/src/main/java/com/ff/game/dto/GameSecretKeyDTO.java deleted file mode 100644 index 3a769b9..0000000 --- a/ff-game/src/main/java/com/ff/game/dto/GameSecretKeyDTO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.ff.game.dto; - -import com.ff.game.domain.GameSecretKey; -import lombok.Data; - -import java.util.List; - - -/** - * 游戏密钥dto - * - * @author shi - * @date 2025/03/12 - */ -@Data -public class GameSecretKeyDTO extends GameSecretKey { - /** - * 平台 - */ - private List platforms; -} diff --git a/ff-game/src/main/java/com/ff/game/dto/GameSecretKeyLangDTO.java b/ff-game/src/main/java/com/ff/game/dto/GameSecretKeyLangDTO.java deleted file mode 100644 index af56c2f..0000000 --- a/ff-game/src/main/java/com/ff/game/dto/GameSecretKeyLangDTO.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ff.game.dto; - -import com.ff.game.domain.GameSecretKeyLang; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -/** - * 游戏密钥lang dto - * - * @author shi - * @date 2025/03/13 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -@SuperBuilder -public class GameSecretKeyLangDTO extends GameSecretKeyLang { - - /** - * 平台 - */ - private String platformCode; - - /** - * API code - */ - private String code; - - /** - * 游戏密钥id - */ - private Long gameSecretKeyId; - - /** - * 密钥 - */ - private String key; - -} diff --git a/ff-game/src/main/java/com/ff/game/mapper/GameNameMapper.java b/ff-game/src/main/java/com/ff/game/mapper/GameNameMapper.java deleted file mode 100644 index 435b093..0000000 --- a/ff-game/src/main/java/com/ff/game/mapper/GameNameMapper.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.ff.game.mapper; - -import com.ff.game.domain.GameName; -import com.ff.game.dto.GameDTO; -import com.ff.game.dto.GameNameDTO; - -import java.util.List; - -/** - * 平台子游戏名称管理Mapper接口 - * - * @author shi - * @date 2025-03-13 - */ -public interface GameNameMapper -{ - /** - * 查询平台子游戏名称管理 - * - * @param id 平台子游戏名称管理主键 - * @return 平台子游戏名称管理 - */ - GameName selectGameNameById(Long id); - - /** - * 查询平台子游戏名称管理列表 - * - * @param gameName 平台子游戏名称管理 - * @return 平台子游戏名称管理集合 - */ - List selectGameNameList(GameName gameName); - - /** - * 新增平台子游戏名称管理 - * - * @param gameName 平台子游戏名称管理 - * @return 结果 - */ - int insertGameName(GameName gameName); - - /** - * 修改平台子游戏名称管理 - * - * @param gameName 平台子游戏名称管理 - * @return 结果 - */ - int updateGameName(GameName gameName); - - /** - * 删除平台子游戏名称管理 - * - * @param id 平台子游戏名称管理主键 - * @return 结果 - */ - int deleteGameNameById(Long id); - - /** - * 批量删除平台子游戏名称管理 - * - * @param ids 需要删除的数据主键集合 - * @return 结果 - */ - int deleteGameNameByIds(Long[] ids); - - /** - * 选择游戏名称数据列表 - * - * @param gameNameDTO 游戏dto - * @return {@link List }<{@link GameDTO }> - */ - List selectGameNameDTOList(GameNameDTO gameNameDTO); -} diff --git a/ff-game/src/main/java/com/ff/game/mapper/GamePlatformMapper.java b/ff-game/src/main/java/com/ff/game/mapper/GamePlatformMapper.java deleted file mode 100644 index e938093..0000000 --- a/ff-game/src/main/java/com/ff/game/mapper/GamePlatformMapper.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.ff.game.mapper; - -import java.util.List; -import com.ff.game.domain.GamePlatform; - -/** - * 平台管理Mapper接口 - * - * @author shi - * @date 2025-02-10 - */ -public interface GamePlatformMapper -{ - /** - * 查询平台管理 - * - * @param id 平台管理主键 - * @return 平台管理 - */ - GamePlatform selectGamePlatformById(Long id); - - /** - * 查询平台管理列表 - * - * @param gamePlatform 平台管理 - * @return 平台管理集合 - */ - List selectGamePlatformList(GamePlatform gamePlatform); - - /** - * 新增平台管理 - * - * @param gamePlatform 平台管理 - * @return 结果 - */ - int insertGamePlatform(GamePlatform gamePlatform); - - /** - * 修改平台管理 - * - * @param gamePlatform 平台管理 - * @return 结果 - */ - int updateGamePlatform(GamePlatform gamePlatform); - - /** - * 删除平台管理 - * - * @param id 平台管理主键 - * @return 结果 - */ - int deleteGamePlatformById(Long id); - - /** - * 批量删除平台管理 - * - * @param ids 需要删除的数据主键集合 - * @return 结果 - */ - int deleteGamePlatformByIds(Long[] ids); - - - /** - * 选择最大排序号 - * - * @return {@link Integer } - */ - Integer selectMaxSortNo(); - -} diff --git a/ff-game/src/main/java/com/ff/game/mapper/GameSecretKeyCurrencyMapper.java b/ff-game/src/main/java/com/ff/game/mapper/GameSecretKeyCurrencyMapper.java deleted file mode 100644 index df58ee8..0000000 --- a/ff-game/src/main/java/com/ff/game/mapper/GameSecretKeyCurrencyMapper.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.ff.game.mapper; - -import java.util.List; -import com.ff.game.domain.GameSecretKeyCurrency; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; - -/** - * 游戏平台币种管理Mapper接口 - * - * @author shi - * @date 2025-03-13 - */ -public interface GameSecretKeyCurrencyMapper -{ - /** - * 查询游戏平台币种管理 - * - * @param id 游戏平台币种管理主键 - * @return 游戏平台币种管理 - */ - GameSecretKeyCurrency selectGameSecretKeyCurrencyById(Long id); - - /** - * 查询游戏平台币种管理列表 - * - * @param gameSecretKeyCurrency 游戏平台币种管理 - * @return 游戏平台币种管理集合 - */ - List selectGameSecretKeyCurrencyList(GameSecretKeyCurrency gameSecretKeyCurrency); - - /** - * 新增游戏平台币种管理 - * - * @param gameSecretKeyCurrency 游戏平台币种管理 - * @return 结果 - */ - int insertGameSecretKeyCurrency(GameSecretKeyCurrency gameSecretKeyCurrency); - - /** - * 修改游戏平台币种管理 - * - * @param gameSecretKeyCurrency 游戏平台币种管理 - * @return 结果 - */ - int updateGameSecretKeyCurrency(GameSecretKeyCurrency gameSecretKeyCurrency); - - /** - * 删除游戏平台币种管理 - * - * @param id 游戏平台币种管理主键 - * @return 结果 - */ - int deleteGameSecretKeyCurrencyById(Long id); - - /** - * 批量删除游戏平台币种管理 - * - * @param ids 需要删除的数据主键集合 - * @return 结果 - */ - int deleteGameSecretKeyCurrencyByIds(Long[] ids); - - - /** - * 按游戏找到密钥货币dto - * - * @param gameSecretKeyCurrencyDTO 游戏密钥货币dto - * @return {@link GameSecretKeyCurrencyDTO } - */ - GameSecretKeyCurrencyDTO findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO gameSecretKeyCurrencyDTO); - - /** - * 按游戏查找密钥货币数据列表 - * - * @param gameSecretKeyCurrencyDTO 游戏密钥货币dto - * @return {@link List }<{@link GameSecretKeyCurrencyDTO }> - */ - List findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO gameSecretKeyCurrencyDTO); -} diff --git a/ff-game/src/main/java/com/ff/game/mapper/GameSecretKeyLangMapper.java b/ff-game/src/main/java/com/ff/game/mapper/GameSecretKeyLangMapper.java deleted file mode 100644 index afa304f..0000000 --- a/ff-game/src/main/java/com/ff/game/mapper/GameSecretKeyLangMapper.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.ff.game.mapper; - -import java.util.List; -import com.ff.game.domain.GameSecretKeyLang; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; -import com.ff.game.dto.GameSecretKeyLangDTO; - -/** - * 游戏平台语言管理Mapper接口 - * - * @author shi - * @date 2025-03-13 - */ -public interface GameSecretKeyLangMapper -{ - /** - * 查询游戏平台语言管理 - * - * @param id 游戏平台语言管理主键 - * @return 游戏平台语言管理 - */ - GameSecretKeyLang selectGameSecretKeyLangById(Long id); - - /** - * 查询游戏平台语言管理列表 - * - * @param gameSecretKeyLang 游戏平台语言管理 - * @return 游戏平台语言管理集合 - */ - List selectGameSecretKeyLangList(GameSecretKeyLang gameSecretKeyLang); - - /** - * 新增游戏平台语言管理 - * - * @param gameSecretKeyLang 游戏平台语言管理 - * @return 结果 - */ - int insertGameSecretKeyLang(GameSecretKeyLang gameSecretKeyLang); - - /** - * 修改游戏平台语言管理 - * - * @param gameSecretKeyLang 游戏平台语言管理 - * @return 结果 - */ - int updateGameSecretKeyLang(GameSecretKeyLang gameSecretKeyLang); - - /** - * 删除游戏平台语言管理 - * - * @param id 游戏平台语言管理主键 - * @return 结果 - */ - int deleteGameSecretKeyLangById(Long id); - - /** - * 批量删除游戏平台语言管理 - * - * @param ids 需要删除的数据主键集合 - * @return 结果 - */ - int deleteGameSecretKeyLangByIds(Long[] ids); - - /** - * 查找游戏密钥货币dto - * - * @param gameSecretKeyLangDTO 游戏密钥货币dto - * @return {@link GameSecretKeyLangDTO } - */ - GameSecretKeyLangDTO findGameSecretKeyLangDTO(GameSecretKeyLangDTO gameSecretKeyLangDTO); -} diff --git a/ff-game/src/main/java/com/ff/game/mapper/GameSecretKeyMapper.java b/ff-game/src/main/java/com/ff/game/mapper/GameSecretKeyMapper.java deleted file mode 100644 index eb4f84a..0000000 --- a/ff-game/src/main/java/com/ff/game/mapper/GameSecretKeyMapper.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.ff.game.mapper; - -import java.util.List; -import com.ff.game.domain.GameSecretKey; - -/** - * 游戏平台密钥管理Mapper接口 - * - * @author shi - * @date 2025-03-13 - */ -public interface GameSecretKeyMapper -{ - /** - * 查询游戏平台密钥管理 - * - * @param id 游戏平台密钥管理主键 - * @return 游戏平台密钥管理 - */ - GameSecretKey selectGameSecretKeyById(Long id); - - /** - * 查询游戏平台密钥管理列表 - * - * @param gameSecretKey 游戏平台密钥管理 - * @return 游戏平台密钥管理集合 - */ - List selectGameSecretKeyList(GameSecretKey gameSecretKey); - - - - /** - * 按代码选择游戏密钥 - * - * @param code 代码 - * @return {@link GameSecretKey } - */ - GameSecretKey selectGameSecretKeyByCode(String code); - - - /** - * 新增游戏平台密钥管理 - * - * @param gameSecretKey 游戏平台密钥管理 - * @return 结果 - */ - int insertGameSecretKey(GameSecretKey gameSecretKey); - - /** - * 修改游戏平台密钥管理 - * - * @param gameSecretKey 游戏平台密钥管理 - * @return 结果 - */ - int updateGameSecretKey(GameSecretKey gameSecretKey); - - /** - * 删除游戏平台密钥管理 - * - * @param id 游戏平台密钥管理主键 - * @return 结果 - */ - int deleteGameSecretKeyById(Long id); - - /** - * 批量删除游戏平台密钥管理 - * - * @param ids 需要删除的数据主键集合 - * @return 结果 - */ - int deleteGameSecretKeyByIds(Long[] ids); -} diff --git a/ff-game/src/main/java/com/ff/game/service/IGameNameService.java b/ff-game/src/main/java/com/ff/game/service/IGameNameService.java deleted file mode 100644 index 7bde767..0000000 --- a/ff-game/src/main/java/com/ff/game/service/IGameNameService.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.ff.game.service; - -import com.ff.game.domain.GameName; -import com.ff.game.dto.GameDTO; -import com.ff.game.dto.GameNameDTO; - -import java.util.List; - -/** - * 平台子游戏名称管理Service接口 - * - * @author shi - * @date 2025-03-13 - */ -public interface IGameNameService -{ - /** - * 查询平台子游戏名称管理 - * - * @param id 平台子游戏名称管理主键 - * @return 平台子游戏名称管理 - */ - GameName selectGameNameById(Long id); - - /** - * 查询平台子游戏名称管理列表 - * - * @param gameName 平台子游戏名称管理 - * @return 平台子游戏名称管理集合 - */ - List selectGameNameList(GameName gameName); - - /** - * 新增平台子游戏名称管理 - * - * @param gameName 平台子游戏名称管理 - * @return 结果 - */ - int insertGameName(GameName gameName); - - /** - * 修改平台子游戏名称管理 - * - * @param gameName 平台子游戏名称管理 - * @return 结果 - */ - int updateGameName(GameName gameName); - - /** - * 批量删除平台子游戏名称管理 - * - * @param ids 需要删除的平台子游戏名称管理主键集合 - * @return 结果 - */ - int deleteGameNameByIds(Long[] ids); - - /** - * 删除平台子游戏名称管理信息 - * - * @param id 平台子游戏名称管理主键 - * @return 结果 - */ - int deleteGameNameById(Long id); - - /** - * 选择游戏名称数据列表 - * - * @param gameNameDTO 游戏dto - * @return {@link List }<{@link GameDTO }> - */ - List selectGameNameDTOList(GameNameDTO gameNameDTO); - - -} diff --git a/ff-game/src/main/java/com/ff/game/service/IGamePlatformService.java b/ff-game/src/main/java/com/ff/game/service/IGamePlatformService.java deleted file mode 100644 index a616d2a..0000000 --- a/ff-game/src/main/java/com/ff/game/service/IGamePlatformService.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.ff.game.service; - -import java.util.List; -import com.ff.game.domain.GamePlatform; - -/** - * 平台管理Service接口 - * - * @author shi - * @date 2025-02-10 - */ -public interface IGamePlatformService -{ - /** - * 查询平台管理 - * - * @param id 平台管理主键 - * @return 平台管理 - */ - GamePlatform selectGamePlatformById(Long id); - - /** - * 查询平台管理列表 - * - * @param gamePlatform 平台管理 - * @return 平台管理集合 - */ - List selectGamePlatformList(GamePlatform gamePlatform); - - /** - * 新增平台管理 - * - * @param gamePlatform 平台管理 - * @return 结果 - */ - int insertGamePlatform(GamePlatform gamePlatform); - - /** - * 修改平台管理 - * - * @param gamePlatform 平台管理 - * @return 结果 - */ - int updateGamePlatform(GamePlatform gamePlatform); - - /** - * 批量删除平台管理 - * - * @param ids 需要删除的平台管理主键集合 - * @return 结果 - */ - int deleteGamePlatformByIds(Long[] ids); - - /** - * 删除平台管理信息 - * - * @param id 平台管理主键 - * @return 结果 - */ - int deleteGamePlatformById(Long id); - - - /** - * 选择最大排序号 - * - * @return {@link Integer } - */ - Integer selectMaxSortNo(); - - -} diff --git a/ff-game/src/main/java/com/ff/game/service/IGameSecretKeyCurrencyService.java b/ff-game/src/main/java/com/ff/game/service/IGameSecretKeyCurrencyService.java deleted file mode 100644 index f14b93a..0000000 --- a/ff-game/src/main/java/com/ff/game/service/IGameSecretKeyCurrencyService.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.ff.game.service; - -import java.util.List; - -import com.ff.game.domain.GameName; -import com.ff.game.domain.GameSecretKey; -import com.ff.game.domain.GameSecretKeyCurrency; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; -import com.ff.game.dto.GameSecretKeyDTO; - -/** - * 游戏平台币种管理Service接口 - * - * @author shi - * @date 2025-03-13 - */ -public interface IGameSecretKeyCurrencyService -{ - /** - * 查询游戏平台币种管理 - * - * @param id 游戏平台币种管理主键 - * @return 游戏平台币种管理 - */ - GameSecretKeyCurrency selectGameSecretKeyCurrencyById(Long id); - - /** - * 查询游戏平台币种管理列表 - * - * @param gameSecretKeyCurrency 游戏平台币种管理 - * @return 游戏平台币种管理集合 - */ - List selectGameSecretKeyCurrencyList(GameSecretKeyCurrency gameSecretKeyCurrency); - - /** - * 新增游戏平台币种管理 - * - * @param gameSecretKeyCurrency 游戏平台币种管理 - * @return 结果 - */ - int insertGameSecretKeyCurrency(GameSecretKeyCurrency gameSecretKeyCurrency); - - /** - * 修改游戏平台币种管理 - * - * @param gameSecretKeyCurrency 游戏平台币种管理 - * @return 结果 - */ - int updateGameSecretKeyCurrency(GameSecretKeyCurrency gameSecretKeyCurrency); - - /** - * 批量删除游戏平台币种管理 - * - * @param ids 需要删除的游戏平台币种管理主键集合 - * @return 结果 - */ - int deleteGameSecretKeyCurrencyByIds(Long[] ids); - - /** - * 删除游戏平台币种管理信息 - * - * @param id 游戏平台币种管理主键 - * @return 结果 - */ - int deleteGameSecretKeyCurrencyById(Long id); - - /** - * 按游戏找到密钥货币dto - * - * @param gameSecretKeyCurrencyDTO 游戏密钥货币dto - * @return {@link GameSecretKeyCurrencyDTO } - */ - GameSecretKeyCurrencyDTO findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO gameSecretKeyCurrencyDTO); - - - /** - * 按游戏查找密钥货币数据列表 - * - * @param gameSecretKeyCurrencyDTO 游戏密钥货币dto - * @return {@link List }<{@link GameSecretKeyCurrencyDTO }> - */ - List findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO gameSecretKeyCurrencyDTO); - - - -} diff --git a/ff-game/src/main/java/com/ff/game/service/IGameSecretKeyLangService.java b/ff-game/src/main/java/com/ff/game/service/IGameSecretKeyLangService.java deleted file mode 100644 index 6858764..0000000 --- a/ff-game/src/main/java/com/ff/game/service/IGameSecretKeyLangService.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.ff.game.service; - -import java.util.List; - -import com.ff.game.domain.GameSecretKeyLang; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; -import com.ff.game.dto.GameSecretKeyDTO; -import com.ff.game.dto.GameSecretKeyLangDTO; - -/** - * 游戏平台语言管理Service接口 - * - * @author shi - * @date 2025-03-13 - */ -public interface IGameSecretKeyLangService { - /** - * 查询游戏平台语言管理 - * - * @param id 游戏平台语言管理主键 - * @return 游戏平台语言管理 - */ - GameSecretKeyLang selectGameSecretKeyLangById(Long id); - - /** - * 查询游戏平台语言管理列表 - * - * @param gameSecretKeyLang 游戏平台语言管理 - * @return 游戏平台语言管理集合 - */ - List selectGameSecretKeyLangList(GameSecretKeyLang gameSecretKeyLang); - - /** - * 新增游戏平台语言管理 - * - * @param gameSecretKeyLang 游戏平台语言管理 - * @return 结果 - */ - int insertGameSecretKeyLang(GameSecretKeyLang gameSecretKeyLang); - - /** - * 修改游戏平台语言管理 - * - * @param gameSecretKeyLang 游戏平台语言管理 - * @return 结果 - */ - int updateGameSecretKeyLang(GameSecretKeyLang gameSecretKeyLang); - - /** - * 批量删除游戏平台语言管理 - * - * @param ids 需要删除的游戏平台语言管理主键集合 - * @return 结果 - */ - int deleteGameSecretKeyLangByIds(Long[] ids); - - /** - * 删除游戏平台语言管理信息 - * - * @param id 游戏平台语言管理主键 - * @return 结果 - */ - int deleteGameSecretKeyLangById(Long id); - - /** - * 查找游戏密钥货币dto - * - * @param gameSecretKeyLangDTO 游戏密钥货币dto - * @return {@link GameSecretKeyLangDTO } - */ - GameSecretKeyLangDTO findGameSecretKeyLangDTO(GameSecretKeyLangDTO gameSecretKeyLangDTO); -} diff --git a/ff-game/src/main/java/com/ff/game/service/IGameSecretKeyService.java b/ff-game/src/main/java/com/ff/game/service/IGameSecretKeyService.java deleted file mode 100644 index 713b050..0000000 --- a/ff-game/src/main/java/com/ff/game/service/IGameSecretKeyService.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.ff.game.service; - -import java.util.List; - -import com.ff.game.domain.Game; -import com.ff.game.domain.GameSecretKey; - -/** - * 游戏平台密钥管理Service接口 - * - * @author shi - * @date 2025-03-13 - */ -public interface IGameSecretKeyService -{ - /** - * 查询游戏平台密钥管理 - * - * @param id 游戏平台密钥管理主键 - * @return 游戏平台密钥管理 - */ - GameSecretKey selectGameSecretKeyById(Long id); - - - /** - * 按代码选择游戏密钥 - * - * @param code 代码 - * @return {@link GameSecretKey } - */ - GameSecretKey selectGameSecretKeyByCode(String code); - - /** - * 查询游戏平台密钥管理列表 - * - * @param gameSecretKey 游戏平台密钥管理 - * @return 游戏平台密钥管理集合 - */ - List selectGameSecretKeyList(GameSecretKey gameSecretKey); - - /** - * 新增游戏平台密钥管理 - * - * @param gameSecretKey 游戏平台密钥管理 - * @return 结果 - */ - int insertGameSecretKey(GameSecretKey gameSecretKey); - - /** - * 修改游戏平台密钥管理 - * - * @param gameSecretKey 游戏平台密钥管理 - * @return 结果 - */ - int updateGameSecretKey(GameSecretKey gameSecretKey); - - /** - * 批量删除游戏平台密钥管理 - * - * @param ids 需要删除的游戏平台密钥管理主键集合 - * @return 结果 - */ - int deleteGameSecretKeyByIds(Long[] ids); - - /** - * 删除游戏平台密钥管理信息 - * - * @param id 游戏平台密钥管理主键 - * @return 结果 - */ - int deleteGameSecretKeyById(Long id); -} 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 e1a0863..47d8f05 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 @@ -93,14 +93,5 @@ public interface IGameService { */ List selectGameResponseList(); - /** - * 插入游戏投注详细信息 - * - * @param startTime 开始时间 - * @param endTime 结束时间 - * @param platformCode 平台代码 - */ - void insertGameBettingDetails(Long startTime, Long endTime, String platformCode); - } diff --git a/ff-game/src/main/java/com/ff/game/service/impl/GameNameServiceImpl.java b/ff-game/src/main/java/com/ff/game/service/impl/GameNameServiceImpl.java deleted file mode 100644 index f358ec4..0000000 --- a/ff-game/src/main/java/com/ff/game/service/impl/GameNameServiceImpl.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.ff.game.service.impl; - -import java.util.Collections; -import java.util.List; - -import com.ff.base.utils.DateUtils; -import com.ff.game.domain.GameName; -import com.ff.game.dto.GameDTO; -import com.ff.game.dto.GameNameDTO; -import com.ff.game.mapper.GameNameMapper; -import com.ff.game.service.IGameNameService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import cn.hutool.core.util.IdUtil; - - -/** - * 平台子游戏名称管理Service业务层处理 - * - * @author shi - * @date 2025-03-13 - */ -@Service -public class GameNameServiceImpl implements IGameNameService { - @Autowired - private GameNameMapper gameNameMapper; - - /** - * 查询平台子游戏名称管理 - * - * @param id 平台子游戏名称管理主键 - * @return 平台子游戏名称管理 - */ - @Override - public GameName selectGameNameById(Long id) { - return gameNameMapper.selectGameNameById(id); - } - - /** - * 查询平台子游戏名称管理列表 - * - * @param gameName 平台子游戏名称管理 - * @return 平台子游戏名称管理 - */ - @Override - public List selectGameNameList(GameName gameName) { - return gameNameMapper.selectGameNameList(gameName); - } - - /** - * 新增平台子游戏名称管理 - * - * @param gameName 平台子游戏名称管理 - * @return 结果 - */ - @Override - public int insertGameName(GameName gameName) { - if (gameName.getId() == null) { - gameName.setId(IdUtil.getSnowflakeNextId()); - } - - gameName.setCreateTime(DateUtils.getNowDate()); - return gameNameMapper.insertGameName(gameName); - } - - /** - * 修改平台子游戏名称管理 - * - * @param gameName 平台子游戏名称管理 - * @return 结果 - */ - @Override - public int updateGameName(GameName gameName) { - gameName.setUpdateTime(DateUtils.getNowDate()); - return gameNameMapper.updateGameName(gameName); - } - - /** - * 批量删除平台子游戏名称管理 - * - * @param ids 需要删除的平台子游戏名称管理主键 - * @return 结果 - */ - @Override - public int deleteGameNameByIds(Long[] ids) { - return gameNameMapper.deleteGameNameByIds(ids); - } - - /** - * 删除平台子游戏名称管理信息 - * - * @param id 平台子游戏名称管理主键 - * @return 结果 - */ - @Override - public int deleteGameNameById(Long id) { - return gameNameMapper.deleteGameNameById(id); - } - - /** - * 选择游戏名称数据列表 - * - * @param gameNameDTO 游戏dto - * @return {@link List }<{@link GameDTO }> - */ - @Override - public List selectGameNameDTOList(GameNameDTO gameNameDTO) { - return gameNameMapper.selectGameNameDTOList(gameNameDTO); - } -} diff --git a/ff-game/src/main/java/com/ff/game/service/impl/GamePlatformServiceImpl.java b/ff-game/src/main/java/com/ff/game/service/impl/GamePlatformServiceImpl.java deleted file mode 100644 index 2639438..0000000 --- a/ff-game/src/main/java/com/ff/game/service/impl/GamePlatformServiceImpl.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.ff.game.service.impl; - -import java.util.List; - -import cn.hutool.core.util.IdUtil; -import com.ff.base.utils.DateUtils; -import com.ff.base.utils.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import com.ff.game.mapper.GamePlatformMapper; -import com.ff.game.domain.GamePlatform; -import com.ff.game.service.IGamePlatformService; -import org.springframework.util.ObjectUtils; - -/** - * 平台管理Service业务层处理 - * - * @author shi - * @date 2025-02-10 - */ -@Service -public class GamePlatformServiceImpl implements IGamePlatformService { - @Autowired - private GamePlatformMapper gamePlatformMapper; - - /** - * 查询平台管理 - * - * @param id 平台管理主键 - * @return 平台管理 - */ - @Override - public GamePlatform selectGamePlatformById(Long id) { - return gamePlatformMapper.selectGamePlatformById(id); - } - - /** - * 查询平台管理列表 - * - * @param gamePlatform 平台管理 - * @return 平台管理 - */ - @Override - public List selectGamePlatformList(GamePlatform gamePlatform) { - return gamePlatformMapper.selectGamePlatformList(gamePlatform); - } - - /** - * 新增平台管理 - * - * @param gamePlatform 平台管理 - * @return 结果 - */ - @Override - public int insertGamePlatform(GamePlatform gamePlatform) { - if (ObjectUtils.isEmpty(gamePlatform.getId())) { - gamePlatform.setId(IdUtil.getSnowflakeNextId()); - } - gamePlatform.setCreateTime(DateUtils.getNowDate()); - return gamePlatformMapper.insertGamePlatform(gamePlatform); - } - - /** - * 修改平台管理 - * - * @param gamePlatform 平台管理 - * @return 结果 - */ - @Override - public int updateGamePlatform(GamePlatform gamePlatform) { - gamePlatform.setUpdateTime(DateUtils.getNowDate()); - return gamePlatformMapper.updateGamePlatform(gamePlatform); - } - - /** - * 批量删除平台管理 - * - * @param ids 需要删除的平台管理主键 - * @return 结果 - */ - @Override - public int deleteGamePlatformByIds(Long[] ids) { - return gamePlatformMapper.deleteGamePlatformByIds(ids); - } - - /** - * 删除平台管理信息 - * - * @param id 平台管理主键 - * @return 结果 - */ - @Override - public int deleteGamePlatformById(Long id) { - return gamePlatformMapper.deleteGamePlatformById(id); - } - - - /** - * 选择最大排序号 - * - * @return {@link Integer } - */ - @Override - public Integer selectMaxSortNo() { - return gamePlatformMapper.selectMaxSortNo(); - } -} diff --git a/ff-game/src/main/java/com/ff/game/service/impl/GameSecretKeyCurrencyServiceImpl.java b/ff-game/src/main/java/com/ff/game/service/impl/GameSecretKeyCurrencyServiceImpl.java deleted file mode 100644 index aab9c01..0000000 --- a/ff-game/src/main/java/com/ff/game/service/impl/GameSecretKeyCurrencyServiceImpl.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.ff.game.service.impl; - -import java.util.Collections; -import java.util.List; -import com.ff.base.utils.DateUtils; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import com.ff.game.mapper.GameSecretKeyCurrencyMapper; -import com.ff.game.domain.GameSecretKeyCurrency; -import com.ff.game.service.IGameSecretKeyCurrencyService; -import cn.hutool.core.util.IdUtil; - - -/** - * 游戏平台币种管理Service业务层处理 - * - * @author shi - * @date 2025-03-13 - */ -@Service -public class GameSecretKeyCurrencyServiceImpl implements IGameSecretKeyCurrencyService -{ - @Autowired - private GameSecretKeyCurrencyMapper gameSecretKeyCurrencyMapper; - - /** - * 查询游戏平台币种管理 - * - * @param id 游戏平台币种管理主键 - * @return 游戏平台币种管理 - */ - @Override - public GameSecretKeyCurrency selectGameSecretKeyCurrencyById(Long id) - { - return gameSecretKeyCurrencyMapper.selectGameSecretKeyCurrencyById(id); - } - - /** - * 查询游戏平台币种管理列表 - * - * @param gameSecretKeyCurrency 游戏平台币种管理 - * @return 游戏平台币种管理 - */ - @Override - public List selectGameSecretKeyCurrencyList(GameSecretKeyCurrency gameSecretKeyCurrency) - { - return gameSecretKeyCurrencyMapper.selectGameSecretKeyCurrencyList(gameSecretKeyCurrency); - } - - /** - * 新增游戏平台币种管理 - * - * @param gameSecretKeyCurrency 游戏平台币种管理 - * @return 结果 - */ - @Override - public int insertGameSecretKeyCurrency(GameSecretKeyCurrency gameSecretKeyCurrency) - { - gameSecretKeyCurrency.setId(IdUtil.getSnowflakeNextId()); - gameSecretKeyCurrency.setCreateTime(DateUtils.getNowDate()); - return gameSecretKeyCurrencyMapper.insertGameSecretKeyCurrency(gameSecretKeyCurrency); - } - - /** - * 修改游戏平台币种管理 - * - * @param gameSecretKeyCurrency 游戏平台币种管理 - * @return 结果 - */ - @Override - public int updateGameSecretKeyCurrency(GameSecretKeyCurrency gameSecretKeyCurrency) - { - gameSecretKeyCurrency.setUpdateTime(DateUtils.getNowDate()); - return gameSecretKeyCurrencyMapper.updateGameSecretKeyCurrency(gameSecretKeyCurrency); - } - - /** - * 批量删除游戏平台币种管理 - * - * @param ids 需要删除的游戏平台币种管理主键 - * @return 结果 - */ - @Override - public int deleteGameSecretKeyCurrencyByIds(Long[] ids) - { - return gameSecretKeyCurrencyMapper.deleteGameSecretKeyCurrencyByIds(ids); - } - - /** - * 删除游戏平台币种管理信息 - * - * @param id 游戏平台币种管理主键 - * @return 结果 - */ - @Override - public int deleteGameSecretKeyCurrencyById(Long id) - { - return gameSecretKeyCurrencyMapper.deleteGameSecretKeyCurrencyById(id); - } - - /** - * 按游戏找到密钥货币dto - * - * @param gameSecretKeyCurrencyDTO 游戏密钥货币dto - * @return {@link GameSecretKeyCurrency } - */ - @Override - public GameSecretKeyCurrencyDTO findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO gameSecretKeyCurrencyDTO) { - return gameSecretKeyCurrencyMapper.findByGameSecretKeyCurrencyDTO(gameSecretKeyCurrencyDTO); - } - - /** - * 按游戏查找密钥货币数据列表 - * - * @param gameSecretKeyCurrencyDTO 游戏密钥货币dto - * @return {@link List }<{@link GameSecretKeyCurrencyDTO }> - */ - @Override - public List findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO gameSecretKeyCurrencyDTO) { - return gameSecretKeyCurrencyMapper.findByGameSecretKeyCurrencyDTOList(gameSecretKeyCurrencyDTO); - } -} diff --git a/ff-game/src/main/java/com/ff/game/service/impl/GameSecretKeyLangServiceImpl.java b/ff-game/src/main/java/com/ff/game/service/impl/GameSecretKeyLangServiceImpl.java deleted file mode 100644 index 695a073..0000000 --- a/ff-game/src/main/java/com/ff/game/service/impl/GameSecretKeyLangServiceImpl.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.ff.game.service.impl; - -import java.util.List; - -import com.ff.base.utils.DateUtils; -import com.ff.game.dto.GameSecretKeyCurrencyDTO; -import com.ff.game.dto.GameSecretKeyLangDTO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import com.ff.game.mapper.GameSecretKeyLangMapper; -import com.ff.game.domain.GameSecretKeyLang; -import com.ff.game.service.IGameSecretKeyLangService; -import cn.hutool.core.util.IdUtil; - - -/** - * 游戏平台语言管理Service业务层处理 - * - * @author shi - * @date 2025-03-13 - */ -@Service -public class GameSecretKeyLangServiceImpl implements IGameSecretKeyLangService { - @Autowired - private GameSecretKeyLangMapper gameSecretKeyLangMapper; - - /** - * 查询游戏平台语言管理 - * - * @param id 游戏平台语言管理主键 - * @return 游戏平台语言管理 - */ - @Override - public GameSecretKeyLang selectGameSecretKeyLangById(Long id) { - return gameSecretKeyLangMapper.selectGameSecretKeyLangById(id); - } - - /** - * 查询游戏平台语言管理列表 - * - * @param gameSecretKeyLang 游戏平台语言管理 - * @return 游戏平台语言管理 - */ - @Override - public List selectGameSecretKeyLangList(GameSecretKeyLang gameSecretKeyLang) { - return gameSecretKeyLangMapper.selectGameSecretKeyLangList(gameSecretKeyLang); - } - - /** - * 新增游戏平台语言管理 - * - * @param gameSecretKeyLang 游戏平台语言管理 - * @return 结果 - */ - @Override - public int insertGameSecretKeyLang(GameSecretKeyLang gameSecretKeyLang) { - gameSecretKeyLang.setId(IdUtil.getSnowflakeNextId()); - gameSecretKeyLang.setCreateTime(DateUtils.getNowDate()); - return gameSecretKeyLangMapper.insertGameSecretKeyLang(gameSecretKeyLang); - } - - /** - * 修改游戏平台语言管理 - * - * @param gameSecretKeyLang 游戏平台语言管理 - * @return 结果 - */ - @Override - public int updateGameSecretKeyLang(GameSecretKeyLang gameSecretKeyLang) { - gameSecretKeyLang.setUpdateTime(DateUtils.getNowDate()); - return gameSecretKeyLangMapper.updateGameSecretKeyLang(gameSecretKeyLang); - } - - /** - * 批量删除游戏平台语言管理 - * - * @param ids 需要删除的游戏平台语言管理主键 - * @return 结果 - */ - @Override - public int deleteGameSecretKeyLangByIds(Long[] ids) { - return gameSecretKeyLangMapper.deleteGameSecretKeyLangByIds(ids); - } - - /** - * 删除游戏平台语言管理信息 - * - * @param id 游戏平台语言管理主键 - * @return 结果 - */ - @Override - public int deleteGameSecretKeyLangById(Long id) { - return gameSecretKeyLangMapper.deleteGameSecretKeyLangById(id); - } - - /** - * 查找游戏密钥货币dto - * - * @param gameSecretKeyLangDTO 游戏密钥货币dto - * @return {@link GameSecretKeyLangDTO } - */ - @Override - public GameSecretKeyLangDTO findGameSecretKeyLangDTO(GameSecretKeyLangDTO gameSecretKeyLangDTO) { - return gameSecretKeyLangMapper.findGameSecretKeyLangDTO(gameSecretKeyLangDTO); - } -} diff --git a/ff-game/src/main/java/com/ff/game/service/impl/GameSecretKeyServiceImpl.java b/ff-game/src/main/java/com/ff/game/service/impl/GameSecretKeyServiceImpl.java deleted file mode 100644 index 2c34ac1..0000000 --- a/ff-game/src/main/java/com/ff/game/service/impl/GameSecretKeyServiceImpl.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.ff.game.service.impl; - -import java.util.List; -import com.ff.base.utils.DateUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import com.ff.game.mapper.GameSecretKeyMapper; -import com.ff.game.domain.GameSecretKey; -import com.ff.game.service.IGameSecretKeyService; -import cn.hutool.core.util.IdUtil; - - -/** - * 游戏平台密钥管理Service业务层处理 - * - * @author shi - * @date 2025-03-13 - */ -@Service -public class GameSecretKeyServiceImpl implements IGameSecretKeyService -{ - @Autowired - private GameSecretKeyMapper gameSecretKeyMapper; - - /** - * 查询游戏平台密钥管理 - * - * @param id 游戏平台密钥管理主键 - * @return 游戏平台密钥管理 - */ - @Override - public GameSecretKey selectGameSecretKeyById(Long id) - { - return gameSecretKeyMapper.selectGameSecretKeyById(id); - } - - /** - * 按代码选择游戏密钥 - * - * @param code 代码 - * @return {@link GameSecretKey } - */ - @Override - public GameSecretKey selectGameSecretKeyByCode(String code) { - return gameSecretKeyMapper.selectGameSecretKeyByCode(code); - } - - /** - * 查询游戏平台密钥管理列表 - * - * @param gameSecretKey 游戏平台密钥管理 - * @return 游戏平台密钥管理 - */ - @Override - public List selectGameSecretKeyList(GameSecretKey gameSecretKey) - { - return gameSecretKeyMapper.selectGameSecretKeyList(gameSecretKey); - } - - /** - * 新增游戏平台密钥管理 - * - * @param gameSecretKey 游戏平台密钥管理 - * @return 结果 - */ - @Override - public int insertGameSecretKey(GameSecretKey gameSecretKey) - { - gameSecretKey.setId(IdUtil.getSnowflakeNextId()); - gameSecretKey.setCreateTime(DateUtils.getNowDate()); - return gameSecretKeyMapper.insertGameSecretKey(gameSecretKey); - } - - /** - * 修改游戏平台密钥管理 - * - * @param gameSecretKey 游戏平台密钥管理 - * @return 结果 - */ - @Override - public int updateGameSecretKey(GameSecretKey gameSecretKey) - { - gameSecretKey.setUpdateTime(DateUtils.getNowDate()); - return gameSecretKeyMapper.updateGameSecretKey(gameSecretKey); - } - - /** - * 批量删除游戏平台密钥管理 - * - * @param ids 需要删除的游戏平台密钥管理主键 - * @return 结果 - */ - @Override - public int deleteGameSecretKeyByIds(Long[] ids) - { - return gameSecretKeyMapper.deleteGameSecretKeyByIds(ids); - } - - /** - * 删除游戏平台密钥管理信息 - * - * @param id 游戏平台密钥管理主键 - * @return 结果 - */ - @Override - public int deleteGameSecretKeyById(Long id) - { - return gameSecretKeyMapper.deleteGameSecretKeyById(id); - } -} 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 f828da0..95df45c 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 @@ -1,29 +1,22 @@ package com.ff.game.service.impl; -import java.util.Collections; -import java.util.List; -import java.util.Map; - import cn.hutool.core.util.IdUtil; import com.ff.api.response.GameResponse; -import com.ff.base.constant.ConfigConstants; import com.ff.base.utils.DateUtils; import com.ff.game.api.IGamesService; -import com.ff.game.api.request.BetRecordByTimeDTO; import com.ff.game.api.request.GameUniqueDTO; -import com.ff.game.api.request.GamesBaseRequestDTO; -import com.ff.game.domain.GameSecretKey; +import com.ff.game.domain.Game; import com.ff.game.dto.GameDTO; -import com.ff.game.service.IGameSecretKeyService; +import com.ff.game.mapper.GameMapper; +import com.ff.game.service.IGameService; import com.ff.member.service.IMemberService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.ff.game.mapper.GameMapper; -import com.ff.game.domain.Game; -import com.ff.game.service.IGameService; import javax.annotation.Resource; +import java.util.List; +import java.util.Map; /** * 平台子游戏管理Service业务层处理 @@ -34,16 +27,13 @@ import javax.annotation.Resource; @Service @Slf4j public class GameServiceImpl implements IGameService { + @Autowired private GameMapper gameMapper; @Resource private IMemberService memberService; - - @Resource - private IGameSecretKeyService gameSecretKeyService; - @Autowired private Map gamesService; @@ -129,19 +119,6 @@ public class GameServiceImpl implements IGameService { return gameMapper.deleteGameById(id); } - - /** - * 按平台id选择最大排序号 - * - * @param platformId 平台id - * @return {@link Integer } - */ - @Override - public Integer selectMaxSortNoByPlatformId(Long platformId) { - return gameMapper.selectMaxSortNoByPlatformId(platformId); - } - - /** * 选择游戏唯一列表 * @@ -163,35 +140,9 @@ public class GameServiceImpl implements IGameService { return gameMapper.selectGameResponseList(); } - /** - * 插入游戏投注详细信息 - * - * @param startTime 开始时间 - * @param endTime 结束时间 - * @param platformCode 平台代码 - */ @Override - public void insertGameBettingDetails(Long startTime, Long endTime, String platformCode) { - List gameSecretKeys = gameSecretKeyService.selectGameSecretKeyList(GameSecretKey.builder().platform(platformCode).build()); - for (GameSecretKey gameSecretKey : gameSecretKeys) { - try { - gamesService.get(platformCode).getGameList(GamesBaseRequestDTO.builder() - .agentId(gameSecretKey.getCode()) - .agentKey(gameSecretKey.getKey()) - .build()); - BetRecordByTimeDTO betRecordByTimeDTO = new BetRecordByTimeDTO(); - betRecordByTimeDTO.setGamePlatform(gameSecretKey.getPlatform()); - betRecordByTimeDTO.setStartTime(startTime); - betRecordByTimeDTO.setEndTime(endTime); - betRecordByTimeDTO.setPage(1); - betRecordByTimeDTO.setPageLimit(1000); - betRecordByTimeDTO.setAgentId(gameSecretKey.getCode()); - betRecordByTimeDTO.setAgentKey(gameSecretKey.getKey()); - gamesService.get(platformCode).getBetRecordByHistoryTime(betRecordByTimeDTO); - } catch (Exception e) { - log.error("查询 平台 {} 投注记录失败,错误信息 {}", gameSecretKey.getCode(), e); - } - } + public Integer selectMaxSortNo(Integer platformType, String platformCode) { + return gameMapper.selectMaxSortNoBy(platformType, platformCode); } 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 58fefee..afd632e 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 @@ -243,7 +243,7 @@ public class GameTask { exchangeTransferStatusRequestDTO.setGameExchangeMoneyId(exchangeMoney.getId()); exchangeTransferStatusRequestDTO.setVendor(platform); exchangeTransferStatusRequestDTO.setKeyInfo(keyInfo); - exchangeTransferStatusRequestDTO.setSystemCurrency(targetCurrency); + exchangeTransferStatusRequestDTO.setSystemCurrency(exchangeMoney.getCurrencyCode()); gamesService.get(exchangeMoney.getPlatformCode() + Constants.SERVICE).exchangeTransferStatus(exchangeTransferStatusRequestDTO); } catch (Exception e) { log.error("查询 更新交易记录失败,错误信息 {}", e); diff --git a/ff-game/src/main/resources/mapper/game/GameNameMapper.xml b/ff-game/src/main/resources/mapper/game/GameNameMapper.xml deleted file mode 100644 index a330f6b..0000000 --- a/ff-game/src/main/resources/mapper/game/GameNameMapper.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select id, game_id, game_name, lang_code, create_by, create_time, update_by, update_time from ff_game_name - - - - - - - - - - insert into ff_game_name - - id, - game_id, - game_name, - lang_code, - create_by, - create_time, - update_by, - update_time, - - - #{id}, - #{gameId}, - #{gameName}, - #{langCode}, - #{createBy}, - #{createTime}, - #{updateBy}, - #{updateTime}, - - - - - update ff_game_name - - game_id = #{gameId}, - game_name = #{gameName}, - lang_code = #{langCode}, - create_by = #{createBy}, - create_time = #{createTime}, - update_by = #{updateBy}, - update_time = #{updateTime}, - - where id = #{id} - - - - delete from ff_game_name where id = #{id} - - - - delete from ff_game_name where id in - - #{id} - - - - - \ No newline at end of file diff --git a/ff-game/src/main/resources/mapper/game/GamePlatformMapper.xml b/ff-game/src/main/resources/mapper/game/GamePlatformMapper.xml deleted file mode 100644 index 3838414..0000000 --- a/ff-game/src/main/resources/mapper/game/GamePlatformMapper.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - select id, sort_no, platform_code, platform_type, platform_name, stop_status, create_by, create_time, update_by, update_time from ff_game_platform - - - - - - - - insert into ff_game_platform - id, - sort_no, - platform_code, - platform_type, - platform_name, - stop_status, - create_by, - create_time, - update_by, - update_time, - - #{id}, - #{sortNo}, - #{platformCode}, - #{platformType}, - #{platformName}, - #{stopStatus}, - #{createBy}, - #{createTime}, - #{updateBy}, - #{updateTime}, - - - - - update ff_game_platform - - sort_no = #{sortNo}, - platform_code = #{platformCode}, - platform_type = #{platformType}, - platform_name = #{platformName}, - stop_status = #{stopStatus}, - create_by = #{createBy}, - create_time = #{createTime}, - update_by = #{updateBy}, - update_time = #{updateTime}, - - where id = #{id} - - - - delete from ff_game_platform where id = #{id} - - - - delete from ff_game_platform where id in - - #{id} - - - - - \ No newline at end of file diff --git a/ff-game/src/main/resources/mapper/game/GameSecretKeyCurrencyMapper.xml b/ff-game/src/main/resources/mapper/game/GameSecretKeyCurrencyMapper.xml deleted file mode 100644 index 5c988ce..0000000 --- a/ff-game/src/main/resources/mapper/game/GameSecretKeyCurrencyMapper.xml +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select id,currency_id, game_secret_key_id, currency, system_currency, create_by, create_time, update_by, update_time from ff_game_secret_key_currency - - - - - - - - insert into ff_game_secret_key_currency - - id, - game_secret_key_id, - currency_id, - currency, - system_currency, - create_by, - create_time, - update_by, - update_time, - - - #{id}, - #{gameSecretKeyId}, - #{currencyId}, - #{currency}, - #{systemCurrency}, - #{createBy}, - #{createTime}, - #{updateBy}, - #{updateTime}, - - - - - update ff_game_secret_key_currency - - game_secret_key_id = #{gameSecretKeyId}, - currency_id = #{currencyId}, - currency = #{currency}, - system_currency = #{systemCurrency}, - create_by = #{createBy}, - create_time = #{createTime}, - update_by = #{updateBy}, - update_time = #{updateTime}, - - where id = #{id} - - - - delete from ff_game_secret_key_currency where id = #{id} - - - - delete from ff_game_secret_key_currency where id in - - #{id} - - - - - - - - \ No newline at end of file diff --git a/ff-game/src/main/resources/mapper/game/GameSecretKeyLangMapper.xml b/ff-game/src/main/resources/mapper/game/GameSecretKeyLangMapper.xml deleted file mode 100644 index b137079..0000000 --- a/ff-game/src/main/resources/mapper/game/GameSecretKeyLangMapper.xml +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select id, game_secret_key_id, lang, system_lang_code, create_by, create_time, update_by, update_time from ff_game_secret_key_lang - - - - - - - - insert into ff_game_secret_key_lang - - id, - game_secret_key_id, - lang, - system_lang_code, - create_by, - create_time, - update_by, - update_time, - - - #{id}, - #{gameSecretKeyId}, - #{lang}, - #{systemLangCode}, - #{createBy}, - #{createTime}, - #{updateBy}, - #{updateTime}, - - - - - update ff_game_secret_key_lang - - game_secret_key_id = #{gameSecretKeyId}, - lang = #{lang}, - system_lang_code = #{systemLangCode}, - create_by = #{createBy}, - create_time = #{createTime}, - update_by = #{updateBy}, - update_time = #{updateTime}, - - where id = #{id} - - - - delete from ff_game_secret_key_lang where id = #{id} - - - - delete from ff_game_secret_key_lang where id in - - #{id} - - - - - \ No newline at end of file diff --git a/ff-game/src/main/resources/mapper/game/GameSecretKeyMapper.xml b/ff-game/src/main/resources/mapper/game/GameSecretKeyMapper.xml deleted file mode 100644 index 61d8240..0000000 --- a/ff-game/src/main/resources/mapper/game/GameSecretKeyMapper.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - select id, platform,provider_code,password, code, `key`, create_by, create_time, update_by, update_time from ff_game_secret_key - - - - - - - - - - insert into ff_game_secret_key - - id, - platform, - provider_code, - password, - code, - key, - create_by, - create_time, - update_by, - update_time, - - - #{id}, - #{platform}, - #{providerCode}, - #{password}, - #{code}, - #{key}, - #{createBy}, - #{createTime}, - #{updateBy}, - #{updateTime}, - - - - - update ff_game_secret_key - - platform = #{platform}, - provider_code = #{providerCode}, - password = #{password}, - code = #{code}, - key = #{key}, - create_by = #{createBy}, - create_time = #{createTime}, - update_by = #{updateBy}, - update_time = #{updateTime}, - - where id = #{id} - - - - delete from ff_game_secret_key where id = #{id} - - - - delete from ff_game_secret_key where id in - - #{id} - - - \ No newline at end of file From f35179c8bcff0654e7e2d5983db84597e46c4219 Mon Sep 17 00:00:00 2001 From: cengy Date: Mon, 7 Apr 2025 15:22:12 +0800 Subject: [PATCH 32/62] =?UTF-8?q?refactor(ff-game):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E6=A8=A1=E5=9D=97=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除了 GameName、GamePlatform 和 GameSecretKey 相关的实体类、Mapper 和 Service - 优化了 ApiGameController 中的代码结构 - 更新了 GameBalanceExchange 类的继承关系 - 调整了 GamesAEServiceImpl 和 GamesDGServiceImpl 中的方法实现 --- ff-game/src/main/resources/mapper/game/PlatformMapper.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ff-game/src/main/resources/mapper/game/PlatformMapper.xml b/ff-game/src/main/resources/mapper/game/PlatformMapper.xml index 25282eb..3955a3c 100644 --- a/ff-game/src/main/resources/mapper/game/PlatformMapper.xml +++ b/ff-game/src/main/resources/mapper/game/PlatformMapper.xml @@ -14,6 +14,8 @@ + + @@ -52,6 +54,8 @@ key_info, lang_info, currency_info, + ext_info, + stop_status, create_by, create_time, @@ -88,6 +92,8 @@ key_info = #{keyInfo}, lang_info = #{langInfo}, currency_info = #{currencyInfo}, + ext_info = #{extInfo}, + stop_status = #{stopStatus}, create_by = #{createBy}, create_time = #{updateTime}, From 0183bad8e72f9af70003d04f08712388e640d17b Mon Sep 17 00:00:00 2001 From: shi Date: Mon, 7 Apr 2025 15:36:11 +0800 Subject: [PATCH 33/62] =?UTF-8?q?refactor(game):=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E6=9C=AA=E4=BD=BF=E7=94=A8=E7=9A=84=E5=B8=B8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除了 GamesAEServiceImpl 类中的 PLATFORM_ID 和 GAME_NAME_ID 两个常量- 这些常量在代码中未被使用,移除它们可以提高代码的可读性和维护性 --- .../java/com/ff/game/api/ae/impl/GamesAEServiceImpl.java | 8 -------- 1 file changed, 8 deletions(-) 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..0b5396c 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,7 @@ 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; /** * 获得就是成功 From b466e052f1c00bf40bafc530e9ce1cf99bc1d46b Mon Sep 17 00:00:00 2001 From: shi Date: Mon, 7 Apr 2025 15:47:59 +0800 Subject: [PATCH 34/62] =?UTF-8?q?refactor(ff-game):=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E6=9C=AA=E4=BD=BF=E7=94=A8=E7=9A=84=E4=BB=A3=E7=A0=81=E5=92=8C?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除了 ApiMemberController 中未使用的 GameSecretKeyCurrencyDTO 相关代码 - 移除了 GamesPGTServiceImpl 中未使用的 IGamePlatformService、IGameSecretKeyService、IGameSecretKeyCurrencyService 和 IGameNameService 的注入 - 清理了 GamesPGTServiceImpl 中未使用的 import 语句 --- .../com/ff/api/controller/ApiMemberController.java | 11 ----------- .../com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java | 11 +---------- 2 files changed, 1 insertion(+), 21 deletions(-) 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 a7af640..a25f0ac 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,11 +108,6 @@ 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 =memberService.getMemberGameAccount(memberCreateApiRequest.getPlatformCode(), tenantSecretKey.getTenantSn()); @@ -166,12 +161,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/game/api/pgt/impl/GamesPGTServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java index fd49051..4deda5f 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java @@ -24,7 +24,6 @@ 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.GameSecretKeyCurrencyDTO; import com.ff.game.service.*; import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; @@ -65,8 +64,7 @@ public class GamesPGTServiceImpl implements IGamesService { private IGameExchangeMoneyService gameExchangeMoneyService; - @Resource - private IGamePlatformService gamePlatformService; + @Resource @@ -78,11 +76,7 @@ public class GamesPGTServiceImpl implements IGamesService { @Resource private IGameFreeRecordService gameFreeRecordService; - @Resource - private IGameSecretKeyService gameSecretKeyService; - @Resource - private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService; @Resource private PGTClient pgtClient; @@ -94,9 +88,6 @@ public class GamesPGTServiceImpl implements IGamesService { @Resource private IGameBettingDetailsService gameBettingDetailsService; - @Resource - private IGameNameService gameNameService; - /** * 获得就是成功 From 72810d4d0e644fe1d6199b36fc575582e95336aa Mon Sep 17 00:00:00 2001 From: cengy Date: Tue, 8 Apr 2025 13:33:18 +0800 Subject: [PATCH 35/62] =?UTF-8?q?feat(fb):=20=E6=96=B0=E5=A2=9E=20FB=20?= =?UTF-8?q?=E4=BD=93=E8=82=B2=E5=B9=B3=E5=8F=B0=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 FB 体育相关的数据结构和接口定义 - 实现 FB 体育平台的会员创建、资金转账、获取会员信息等功能 - 集成 FB 体育平台的 URL 获取和登录逻辑 - 为 FB 体育平台添加错误码定义 -优化游戏列表获取逻辑,支持 FB 体育游戏数据同步 --- .../com/ff/base/constant/CacheConstants.java | 4 + .../java/com/ff/base/enums/ErrorCode.java | 10 +- .../java/com/ff/base/enums/GamePlatforms.java | 5 +- .../ff/api/controller/ApiGameController.java | 3 - .../impl/TenantGameQuotaServiceImpl.java | 32 +- .../meitian/impl/MeiTianGameServiceImpl.java | 40 +- .../api/request/MemberInfoRequestDTO.java | 4 +- .../ff/sports/api/fb/address/FbAddress.java | 29 - ff-game/src/main/java/com/ff/sports/fb/A.java | 7 - .../ff/sports/fb/address/FBSportsAddress.java | 30 + .../ff/sports/fb/client/FBSportsClient.java | 77 +++ .../ff/sports/fb/dto/CreateUserRequest.java | 30 + .../ff/sports/fb/dto/CreateUserResponse.java | 19 + .../main/java/com/ff/sports/fb/dto/Enums.java | 9 + .../sports/fb/dto/GetMemberInfoRequest.java | 27 + .../sports/fb/dto/GetMemberInfoResponse.java | 38 ++ .../com/ff/sports/fb/dto/GetUrlRequest.java | 17 + .../com/ff/sports/fb/dto/GetUrlResponse.java | 33 + .../ff/sports/fb/dto/OrderFilesRequest.java | 33 + .../ff/sports/fb/dto/OrderFilesResponse.java | 27 + .../ff/sports/fb/dto/OrderInfoRequest.java | 26 + .../ff/sports/fb/dto/OrderInfoResponse.java | 115 ++++ .../sports/fb/dto/TransferDetailRequest.java | 39 ++ .../sports/fb/dto/TransferDetailResponse.java | 39 ++ .../ff/sports/fb/dto/TransferInRequest.java | 46 ++ .../ff/sports/fb/dto/TransferInResponse.java | 20 + .../ff/sports/fb/dto/TransferOutRequest.java | 46 ++ .../ff/sports/fb/dto/TransferOutResponse.java | 20 + .../sports/fb/impl/FBSportsServiceImpl.java | 618 ++++++++++++++++++ .../com/ff/utils/CalculateDateDaysAgo.java | 25 + .../com/ff/utils/SortByAttributeNameASC.java | 40 ++ .../com/ff/utils/TimestampFromString.java | 23 + .../main/resources/mapper/game/GameMapper.xml | 54 +- 33 files changed, 1450 insertions(+), 135 deletions(-) delete mode 100644 ff-game/src/main/java/com/ff/sports/api/fb/address/FbAddress.java delete mode 100644 ff-game/src/main/java/com/ff/sports/fb/A.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/address/FBSportsAddress.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/client/FBSportsClient.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/CreateUserRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/CreateUserResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/Enums.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/GetMemberInfoRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/GetMemberInfoResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/GetUrlRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/GetUrlResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/TransferDetailRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/TransferDetailResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/TransferInRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/TransferInResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/TransferOutRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/TransferOutResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java create mode 100644 ff-game/src/main/java/com/ff/utils/CalculateDateDaysAgo.java create mode 100644 ff-game/src/main/java/com/ff/utils/SortByAttributeNameASC.java create mode 100644 ff-game/src/main/java/com/ff/utils/TimestampFromString.java 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 1e5c620..8df3d35 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 @@ -84,6 +84,10 @@ public class CacheConstants { * dg游戏 */ public static final String DG_GAMES = "dg_games:"; + /** + * fb体育 + */ + public static final String FB_Sports = "fp_sports:"; /** * pg游戏投注货币 */ diff --git a/ff-base/src/main/java/com/ff/base/enums/ErrorCode.java b/ff-base/src/main/java/com/ff/base/enums/ErrorCode.java index ddb5bb7..29e6031 100644 --- a/ff-base/src/main/java/com/ff/base/enums/ErrorCode.java +++ b/ff-base/src/main/java/com/ff/base/enums/ErrorCode.java @@ -20,8 +20,8 @@ public enum ErrorCode { CURRENCY_NOT_EXIST(1004, "游戏平台不支持的货币"), GAME_NOT_EXIST(1005, "游戏不存在"), CURRENCY_EXCHANGE(1006, "不支持币种的汇率"), - FREQUENT_INTERFACE_REQUESTS (1007, "接口请求频繁"), - BALANCE_TRANSFER_FAILED (1008, "余额转移失败"), + FREQUENT_INTERFACE_REQUESTS(1007, "接口请求频繁"), + BALANCE_TRANSFER_FAILED(1008, "余额转移失败"), LANG_NOT_EXIST(1009, "游戏平台不支持的语言"), ORDER_NOT_EXIST(1010, "订单不存在"), PLAYERS_ARE_PLAYING(1011, "玩家游玩中"), @@ -30,6 +30,12 @@ public enum ErrorCode { ACCOUNT_NOT_ONLINE(1014, "账号不在线"), FREQUENT_BALANCE_TRANSFER(1015, "当前游戏账号余额转移频繁"), PLATFORM_NOT_METHODS(1016, "游戏平台不支持的方法"), + Create_Member_Failure(1017, "创建会员失败"), + Transfer_In_Failure(1018, "转入失败"), + Transfer_Out_Failure(1019, "转出失败"), + Get_Member_Info_Failure(1020, "获取会员信息失败"), + Transfer_Not_Exist(1021, "转帐操作不存在"), + Get_Url_Failure(1022, "获取URL失败") ; // 获取错误码 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 5689a02..a952382 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 @@ -13,8 +13,9 @@ public enum GamePlatforms { DG("DG", "DG"), MT("MT", "美天棋牌"), AE("AE", "AE"), - KM("KM", "KM") - ; + KM("KM", "KM"), + + FBSports("FBSports", "FB体育"); private final String code; private final String info; diff --git a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java index 76ecf27..18f64c1 100644 --- a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java +++ b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java @@ -75,9 +75,6 @@ public class ApiGameController extends BaseController { @Resource private ITenantGameQuotaService tenantGameQuotaService; - @Resource - private ITenantGameQuotaFlowService tenantGameQuotaFlowService; - @Resource private IGameBettingDetailsService gameBettingDetailsService; diff --git a/ff-game/src/main/java/com/ff/common/service/impl/TenantGameQuotaServiceImpl.java b/ff-game/src/main/java/com/ff/common/service/impl/TenantGameQuotaServiceImpl.java index 4307341..7bafc53 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 @@ -1,42 +1,40 @@ package com.ff.common.service.impl; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.util.List; -import java.util.Map; - import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; import com.ff.base.constant.Constants; import com.ff.base.enums.*; import com.ff.base.exception.base.ApiException; import com.ff.base.system.domain.TenantPlatform; +import com.ff.base.system.domain.TenantSecretKey; import com.ff.base.system.service.ITenantPlatformService; +import com.ff.base.system.service.ITenantSecretKeyService; import com.ff.base.utils.DateUtils; import com.ff.base.utils.QuotaUtils; -import com.ff.base.utils.StringUtils; +import com.ff.common.domain.TenantGameQuota; import com.ff.common.domain.TenantGameQuotaFlow; import com.ff.common.domain.TenantQuotaExchange; -import com.ff.base.system.domain.TenantSecretKey; import com.ff.common.dto.BalanceChangesDTO; import com.ff.common.dto.BalanceRealChangesDTO; import com.ff.common.dto.GameBalanceExchange; +import com.ff.common.mapper.TenantGameQuotaMapper; import com.ff.common.service.ITenantGameQuotaFlowService; +import com.ff.common.service.ITenantGameQuotaService; import com.ff.common.service.ITenantQuotaExchangeService; -import com.ff.base.system.service.ITenantSecretKeyService; import com.ff.game.api.IGamesService; import com.ff.game.api.request.MemberInfoRequestDTO; import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.ff.common.mapper.TenantGameQuotaMapper; -import com.ff.common.domain.TenantGameQuota; -import com.ff.common.service.ITenantGameQuotaService; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; +import java.util.Map; /** * 租户游戏配额Service业务层处理 @@ -296,14 +294,11 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService { ApiException.notNull(tenantPlatform, ErrorCode.PLATFORM_NOT_EXIST.getCode()); - // 获取用户信息 Member member = memberService.selectMemberByAccount(gameBalanceExchange.getAccount(), gameBalanceExchange.getCurrencyCode(), gameBalanceExchange.getPlatformCode()); ApiException.notNull(member, ErrorCode.ACCOUNT_NOT_EXIST.getCode()); - - // 检查用户是否存在,否则抛出异常 ApiException.notNull(member, ErrorCode.ACCOUNT_NOT_EXIST.getCode()); @@ -332,6 +327,11 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService { .agentKey(gameBalanceExchange.getAgentKey()) .build(); balanceRequestAmount = iGamesService.getMemberInfo(gamesBaseRequestDTO).getBalance(); + + if (balanceRequestAmount.compareTo(BigDecimal.ZERO) <= 0) { + throw new ApiException(ErrorCode.INSUFFICIENT_PLAYER_BALANCE.getCode()); + } + balanceRequestAmount = NumberUtil.add(balanceRequestAmount, NumberUtil.mul(balanceRequestAmount, NumberUtil.div(tenantPlatform.getUseCost(), Constants.HUNDRED))); // 计算累计转入和转出金额 @@ -393,12 +393,10 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService { // 如果是扣账操作,首先处理假额度 String falseTenantQuotaType = QuotaUtils.getFalseTenantQuota(gameBalanceExchange.getPlatformCode(), gameBalanceExchange.getCurrencyCode()); TenantGameQuota falseTenantQuota = selectTenantGameQuotaByTenantKey(tenantSecretKey.getTenantKey(), falseTenantQuotaType); - balanceRequestAmount = NumberUtil.add(gameBalanceExchange.getAmount(), NumberUtil.mul(gameBalanceExchange.getAmount(), NumberUtil.div(tenantPlatform.getUseCost(), Constants.HUNDRED))); + balanceRequestAmount = NumberUtil.add(gameBalanceExchange.getAmount(), NumberUtil.mul(gameBalanceExchange.getAmount(), NumberUtil.div(tenantPlatform.getUseCost(), Constants.HUNDRED))); if (falseTenantQuota.getBalance().compareTo(BigDecimal.ZERO) > 0) { - - BigDecimal falseQuotaBalance = falseTenantQuota.getBalance(); if (falseQuotaBalance.compareTo(balanceRequestAmount) >= 0) { // 假额度足够扣除本次所需金额 diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/impl/MeiTianGameServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/meitian/impl/MeiTianGameServiceImpl.java index 4741aa6..47af3fa 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 @@ -24,6 +24,8 @@ 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; @@ -36,10 +38,6 @@ 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; @@ -368,7 +366,7 @@ public class MeiTianGameServiceImpl implements IGamesService { exchangeMoney.setCoinAfter(exchangeMoneyResponse.getBalance()); exchangeMoney.setCurrencyBefore(exchangeMoneyResponse.getBalance().subtract(transAmount)); exchangeMoney.setCurrencyAfter(exchangeMoneyResponse.getBalance()); - exchangeMoney.setStatus(1); // SUCCESS + exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); // SUCCESS gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); } else { @@ -396,7 +394,7 @@ public class MeiTianGameServiceImpl implements IGamesService { exchangeMoney.setCoinAfter(exchangeMoneyResponse.getBalance()); exchangeMoney.setCurrencyBefore(exchangeMoneyResponse.getBalance().add(transAmount)); exchangeMoney.setCurrencyAfter(exchangeMoneyResponse.getBalance()); - exchangeMoney.setStatus(1); // SUCCESS + exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); // SUCCESS gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); } else { throw new BaseException(MeiTianExchangeMoneyResponseDTO.TransferOut.get(exchangeMoneyResponse.getErrorCode()).getMessage()); @@ -485,7 +483,7 @@ public class MeiTianGameServiceImpl implements IGamesService { boolean doSyncRecordByDate(BetRecordByTimeDTO betRecordByTimeDTO, int daysToSubtract) { - String date = getDateStr(daysToSubtract); + String date = CalculateDateDaysAgo.getStr(daysToSubtract); String configKey = GamePlatforms.MT.getCode() + ":lastSyncDate"; String syncDateStr = sysConfigServiceImpl.selectConfigByKey(configKey); Map syncDateMap = new HashMap<>(); @@ -750,7 +748,7 @@ public class MeiTianGameServiceImpl implements IGamesService { BigDecimal originPayoffAmount = new BigDecimal(dataBean.getIncome()); // 这个值是到手的 int compareResult = originPayoffAmount.compareTo(BigDecimal.ZERO); - long gameTime = getTime(dataBean.getGameDate()); + long gameTime = TimestampFromString.from(dataBean.getGameDate()); Platform platform = gamesDataBuildDTO.getPlatform(); String systemCurrency = platform.getOurCurrency(dataBean.getCurrency()); //数据构造 @@ -782,30 +780,4 @@ 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/request/MemberInfoRequestDTO.java b/ff-game/src/main/java/com/ff/game/api/request/MemberInfoRequestDTO.java index 40a3182..78c20cd 100644 --- a/ff-game/src/main/java/com/ff/game/api/request/MemberInfoRequestDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/request/MemberInfoRequestDTO.java @@ -6,7 +6,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; /** - * 创建成员请求dto + * 查询用户信息 * * @author shi * @date 2024/10/22 @@ -19,7 +19,7 @@ public class MemberInfoRequestDTO extends GamesBaseRequestDTO { /** * 账户 */ - private String accounts; + private String accounts; } diff --git a/ff-game/src/main/java/com/ff/sports/api/fb/address/FbAddress.java b/ff-game/src/main/java/com/ff/sports/api/fb/address/FbAddress.java deleted file mode 100644 index 62ba9ec..0000000 --- a/ff-game/src/main/java/com/ff/sports/api/fb/address/FbAddress.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.ff.sports.api.fb.address; - -import com.dtflys.forest.callback.AddressSource; -import com.dtflys.forest.http.ForestAddress; -import com.dtflys.forest.http.ForestRequest; -import com.ff.base.system.service.ISysConfigService; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - - -/** - * @author shi - * @date 2025/02/10 - */ -@Component -public class FbAddress implements AddressSource { - - public static final String API_BASE_URL = "fb.api.base.url"; - @Resource - private ISysConfigService configService; - - - @Override - public ForestAddress getAddress(ForestRequest request) { - String apiBaseUrl = configService.selectConfigByKey(API_BASE_URL); - return new ForestAddress("https", apiBaseUrl, 443, "services"); - } -} \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/sports/fb/A.java b/ff-game/src/main/java/com/ff/sports/fb/A.java deleted file mode 100644 index badc18a..0000000 --- a/ff-game/src/main/java/com/ff/sports/fb/A.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.ff.sports.fb; - -/** - * @author cengy - */ -public class A { -} diff --git a/ff-game/src/main/java/com/ff/sports/fb/address/FBSportsAddress.java b/ff-game/src/main/java/com/ff/sports/fb/address/FBSportsAddress.java new file mode 100644 index 0000000..a1f47b8 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/address/FBSportsAddress.java @@ -0,0 +1,30 @@ +package com.ff.sports.fb.address; + +import com.dtflys.forest.callback.AddressSource; +import com.dtflys.forest.http.ForestAddress; +import com.dtflys.forest.http.ForestRequest; +import com.ff.base.enums.GamePlatforms; +import com.ff.game.service.IPlatformService; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + + +/** + * 文档地址:https://doc.newsportspro.com/apidoc_data.html#%E5%85%A5%E5%8F%82 + * @author shi + * @date 2025/02/10 + */ +@Component +public class FBSportsAddress implements AddressSource { + + @Resource + private IPlatformService platformService; + + @Override + public ForestAddress getAddress(ForestRequest request) { + String apiBaseUrl = platformService.get(GamePlatforms.FBSports.getCode()) + .getUrlInfo().getUrl(); + return new ForestAddress("https", apiBaseUrl, 443, "fb/data"); + } +} \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/sports/fb/client/FBSportsClient.java b/ff-game/src/main/java/com/ff/sports/fb/client/FBSportsClient.java new file mode 100644 index 0000000..674a4e4 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/client/FBSportsClient.java @@ -0,0 +1,77 @@ +package com.ff.sports.fb.client; + +import com.dtflys.forest.annotation.*; +import com.ff.sports.fb.address.FBSportsAddress; +import com.ff.sports.fb.dto.*; + +/** + * https://doc.newsportspro.com/apidoc_data.html + * + * @author cengy + */ +@Address(source = FBSportsAddress.class) +public interface FBSportsClient { + /** + * 创建投注用户 + * + * @return {@link CreateUserResponse} + */ + @Post(url = "/api/v2/new/user/create") + CreateUserResponse createMember(@JSONBody CreateUserRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); + + /** + * 用户金额转入到FB体育平台,支持两位小数,最小0.01,必须是正数 + * + * @param request + * @param sign + * @param timestamp + * @param merchantId + * @return {@link TransferInResponse} + */ + @Post(url = "/api/v2/new/transfer/in") + TransferInResponse transferIn(@JSONBody TransferInRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); + + @Post(url = "/api/v2/new/transfer/out") + TransferOutResponse transferOut(@JSONBody TransferOutRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); + + @Post(url = "/api/v2/new/user/detail") + GetMemberInfoResponse getMemberInfo(@JSONBody GetMemberInfoRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); + + /** + * 查询转账详情,当转入/转出接口遇到异常,可查询某次转账是否成功 + */ + @Post(url = "/api/v2/transfer/detail") + TransferDetailResponse transferDetail(@JSONBody TransferDetailRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); + + @Post(url = "/api/v2/service/domain/list") + GetUrlResponse getUrl(@JSONBody GetUrlRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); + + /** + * FB体育用拉取订单文件的方式同步订单数据,FB体育每5分钟生成一次订单文件, + * 通过此接口获取某一段时间内的文件ID列表,再通过文件ID获取具体订单数据 + */ + @Post(url = "/api/v2/transfer/detail") + OrderFilesResponse orderFiles(@JSONBody OrderFilesRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); + +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/CreateUserRequest.java b/ff-game/src/main/java/com/ff/sports/fb/dto/CreateUserRequest.java new file mode 100644 index 0000000..95c942d --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/CreateUserRequest.java @@ -0,0 +1,30 @@ +package com.ff.sports.fb.dto; + +import com.alibaba.fastjson2.JSON; +import lombok.Data; + +import java.io.Serializable; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cengy + */ +@Data +public class CreateUserRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + private String merchantUserId;// 渠道用户id,支持40位字符串,必须唯一 + private List currencyIds = null; // 币种id集合 , see enum: currency + private Integer oddsLevel = null; // 赔率级别,不传则为默认, see enum: user_odds_level_enum + + public String toJSON() { + Map map = new LinkedHashMap<>(); + map.put("currencyIds", currencyIds); + map.put("merchantUserId", merchantUserId); + map.put("oddsLevel", oddsLevel); + return JSON.toJSONString(map); + } +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/CreateUserResponse.java b/ff-game/src/main/java/com/ff/sports/fb/dto/CreateUserResponse.java new file mode 100644 index 0000000..015abf1 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/CreateUserResponse.java @@ -0,0 +1,19 @@ +package com.ff.sports.fb.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cengy + */ +@Data +public class CreateUserResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + private Boolean success; + private Integer data; + private Integer code; + private String message; +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/Enums.java b/ff-game/src/main/java/com/ff/sports/fb/dto/Enums.java new file mode 100644 index 0000000..cf2bd48 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/Enums.java @@ -0,0 +1,9 @@ +package com.ff.sports.fb.dto; + +/** + * @author cengy + */ +public class Enums { + + +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/GetMemberInfoRequest.java b/ff-game/src/main/java/com/ff/sports/fb/dto/GetMemberInfoRequest.java new file mode 100644 index 0000000..51e7129 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/GetMemberInfoRequest.java @@ -0,0 +1,27 @@ +package com.ff.sports.fb.dto; + +import com.alibaba.fastjson2.JSON; +import lombok.Data; + +import java.io.Serializable; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author cengy + */ +@Data +public class GetMemberInfoRequest implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 渠道用户id,不能为空 + */ + private String merchantUserId; + + public String toJSON() { + Map map = new LinkedHashMap<>(); + map.put("merchantUserId", merchantUserId); + return JSON.toJSONString(map); + } +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/GetMemberInfoResponse.java b/ff-game/src/main/java/com/ff/sports/fb/dto/GetMemberInfoResponse.java new file mode 100644 index 0000000..0911248 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/GetMemberInfoResponse.java @@ -0,0 +1,38 @@ +package com.ff.sports.fb.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * @author cengy + */ +@Data +public class GetMemberInfoResponse implements Serializable { + private static final long serialVersionUID = 1L; + + private Boolean success; + private String message; + private MemberInfo data; + private Integer code; + + @Data + public static class MemberInfo implements Serializable{ + private static final long serialVersionUID = 1L; + private String merchantUserId; + private Integer userId; // FB体育用户id + private Integer walletType; // 用户钱包类型 , see enum: wallet_type + private Integer currencyType; // 用户币种类型 , see enum: currency_type + private List wallets; // 钱包集合 + private Integer oddsLevel;// 赔率级别 , see enum: user_odds_level_enum + } + @Data + public static class Wallet implements Serializable{ + private static final long serialVersionUID = 1L; + private Integer currencyType; // 币种类型 , see enum: currency_type + private BigDecimal balance; // 余额 + private Integer currencyId; // 币种id , see enum: currency + } +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/GetUrlRequest.java b/ff-game/src/main/java/com/ff/sports/fb/dto/GetUrlRequest.java new file mode 100644 index 0000000..15d3213 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/GetUrlRequest.java @@ -0,0 +1,17 @@ +package com.ff.sports.fb.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cengy + */ +@Data +public class GetUrlRequest implements Serializable { + private static final long serialVersionUID = 1L; + + public String toJSON() { + return "{}"; + } +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/GetUrlResponse.java b/ff-game/src/main/java/com/ff/sports/fb/dto/GetUrlResponse.java new file mode 100644 index 0000000..e0ea5f8 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/GetUrlResponse.java @@ -0,0 +1,33 @@ +package com.ff.sports.fb.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author cengy + */ +@Data +public class GetUrlResponse implements Serializable { + private static final long serialVersionUID = 1L; + + private Boolean success; + private String message; + private List data; + private Integer code; + + @Data + public static class UrlDTO implements Serializable { + private static final long serialVersionUID = 1L; + private int type; //域名类型,1:API,2:PUSH,3:H5,4:PC,5:IMAGE , see enum: domain_type_enum + private List domainList; // 域名集合 + } + + @Data + public static class DomainDTO implements Serializable { + private static final long serialVersionUID = 1L; + private String domain; // 域名 + private int weight; // 权限值 + } +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesRequest.java b/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesRequest.java new file mode 100644 index 0000000..3d3e48b --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesRequest.java @@ -0,0 +1,33 @@ +package com.ff.sports.fb.dto; + +import com.alibaba.fastjson2.JSON; +import lombok.Data; + +import java.io.Serializable; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author cengy + */ +@Data +public class OrderFilesRequest implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 开始时间戳,13位数字,不能为null + */ + private Long startTime; + + /** + * 结束时间戳,13位数字,不能为null + */ + private Long endTime; + + public String toJSON() { + Map map = new LinkedHashMap<>(); + map.put("endTime", endTime); + map.put("startTime", startTime); + return JSON.toJSONString(map); + } +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesResponse.java b/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesResponse.java new file mode 100644 index 0000000..3042774 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesResponse.java @@ -0,0 +1,27 @@ +package com.ff.sports.fb.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author cengy + */ +@Data +public class OrderFilesResponse implements Serializable { + private static final long serialVersionUID = 1L; + + private Boolean success; + private String message; + private Integer code; + + private List data; + + @Data + public static class FileId implements Serializable { + private static final long serialVersionUID = 1L; + private Integer fileId; + } + +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoRequest.java b/ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoRequest.java new file mode 100644 index 0000000..5b75ecb --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoRequest.java @@ -0,0 +1,26 @@ +package com.ff.sports.fb.dto; + +import com.alibaba.fastjson2.JSON; +import lombok.Data; + +import java.io.Serializable; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author cengy + */ +@Data +public class OrderInfoRequest implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 文件Id,需要从/order/file/ids接口获取到 + */ + private Integer fileId; + + public String toJSON() { + Map map = new LinkedHashMap<>(); + map.put("fileId", fileId); + return JSON.toJSONString(map); + } +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoResponse.java b/ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoResponse.java new file mode 100644 index 0000000..fb48ce7 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoResponse.java @@ -0,0 +1,115 @@ +package com.ff.sports.fb.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author cengy + */ +@Data +public class OrderInfoResponse implements Serializable { + private static final long serialVersionUID = 1L; + + private Boolean success; + private String message; + private Integer code; + + private List data; + + @Data + public static class OrderDTO implements Serializable { + private static final long serialVersionUID = 1L; + private String id; // 订单号 + private Integer rejectReason; // 拒单原因码 see enum: order_reject_type + private String rejectReasonStr; // 拒单原因 + private String userId; // FB平台用户ID + private String merchantId; // 渠道ID + private String merchantUserId; // 渠道用户ID + private Integer currency; // 币种 see enum: currency + private String exchangeRate; // 汇率快照 + private Integer seriesType; // 关次类型 ,0 单关、1 串关, see enum: series_type + private String betType; // 投注类型 + private Integer allUp; // 总关数 + private Integer allUpAlive; // 存活关数 + private String stakeAmount; // 投注额(本金) + private String liabilityStake; // 名义投注额(名义本金) + private String settleAmount; // 结算派奖金额 + private Integer orderStatus; // 订单状态 see enum: order_status + private Integer payStatus; // 付款状态 + private Integer oddsChange; // 是否接受赔率变更 0不接受,1 接受更好赔率,2接受任意赔率 , see enum: odds_change_enum + private String device; // 设备类型 (pc、h5、mobile) , see enum: plat_form_enum + private String ip; // 投注IP地址 + private String settleTime; // 订单结算时间 + private String createTime; // 订单创建时间 + private String modifyTime; // 订单确认时间 + private String cancelTime; // 订单取消时间 + private String thirdRemark; // 第三方备注 + private String relatedId; // 三方关联ID + private String maxWinAmount; // 最大可赢金额 + private String loseAmount; // 最大赔付金额 + private Integer rollBackCount; // 回滚次数 + private Integer itemCount; // 选项数 + private Integer seriesValue; // 串几关 + private Integer betNum; // 子单数 + private String cashOutTotalStake; // 提前结算总本金 + private String liabilityCashoutStake; // 提前结算名义总本金 + private String cashOutPayoutStake; // 提前结算总派奖额 + private String reserveId; // 预约订单单号 + private Integer cashOutCount; // 提前结算次数 + private String unitStake; // 每单金额 + private Integer reserveVersion; // 预约订单版本号 + private List betList; // 注单集合 + } + + @Data + public static class BetDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private String id; // ID + private String orderId; // 订单ID + private Integer sportId; // 运动ID + private String matchId; // 比赛ID + private String matchName; // 比赛名称 + private Integer period; // 阶段ID + private String marketId; // 玩法ID + private Integer marketType; // 玩法类型 + private Integer optionType; // 投注项类型 + private String optionName; // 选项名称 + private String marketName; // 玩法名称 + private String tournamentId; // 联赛ID + private String tournamentName; // 联赛名称 + private String odds; // 欧式赔率 + private Integer oddsFormat; // 投注时赔率类型 + private String betOdds; // 投注时赔率 + private Integer settleStatus; // 结算状态 + private Integer settleResult; // 结算结果 + private Boolean isInplay; // 是否滚球 + private String remark; // 备注 + private Double p1; // 变量1 (例如:让几个球) + private Double p2; // 变量2 + private Double p3; // 变量3 + private String extendedParameter; // 亚洲让球线 + private String extraInfo; // 当前比分 + private String pendingTime; // 延迟等待时间 + private String betScore; // 下注当时比分 + private Integer cancelReason; // 取消原因 + private String cancelReasonName; // 取消原因文本 + private Integer matchType; // 赛事类型 + private String matchTime; // 开赛时间 + private Integer virtualMatchDay; // 轮次 + private Integer virtualChampId; // 赛季 + private Integer virtualLegOrder; // 淘汰赛回合 + private Integer virtualWeekDay; // 小组赛比赛日 + private Integer virtualBlockId; // 期 + private Integer leaguePhase; // 联赛阶段 + private String maxStake; // 最大投注额 + private String validSettleStakeAmount; // 有效已结算投注额 + private String validSettleAmount; // 有效返还额 + private String cashOutCancelStake; // 提前结算取消总额 + private Integer walletType; // 钱包类型 + private Integer version; // 数据变更标记 + } + +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferDetailRequest.java b/ff-game/src/main/java/com/ff/sports/fb/dto/TransferDetailRequest.java new file mode 100644 index 0000000..85f678d --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/TransferDetailRequest.java @@ -0,0 +1,39 @@ +package com.ff.sports.fb.dto; + +import com.alibaba.fastjson2.JSON; +import lombok.Data; + +import java.io.Serializable; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author cengy + */ +@Data +public class TransferDetailRequest implements Serializable { + + + /** + * 业务id,不能为null + */ + private String businessId; + + /** + * 渠道用户ID,不能为null + */ + private String merchantUserId; + + /** + * 转账类型 , see enum: transfer_type_enum 不能为空 + */ + private String transferType; + + public String toJSON() { + Map map = new LinkedHashMap<>(); + map.put("businessId", businessId); + map.put("merchantUserId", merchantUserId); + map.put("transferType", transferType); + return JSON.toJSONString(map); + } +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferDetailResponse.java b/ff-game/src/main/java/com/ff/sports/fb/dto/TransferDetailResponse.java new file mode 100644 index 0000000..614edd0 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/TransferDetailResponse.java @@ -0,0 +1,39 @@ +package com.ff.sports.fb.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author cengy + */ +@Data +public class TransferDetailResponse implements Serializable { + private static final long serialVersionUID = 1L; + + private Boolean success; + private String message; + private TransferDetail data; + private Integer code; + + @Data + public static class TransferDetail implements Serializable { + private static final long serialVersionUID = 1L; + + private Integer id; + private Integer userId; + private String merchantUserId; + private String businessId; + // IN 转入 + // OUT 转出 + private String transferType; + private BigDecimal beforeTransferAmount; + private BigDecimal afterTransferAmount; + private Integer status; // 状态 , see enum: transfer_status_enum, 1 Successful 0 Failure + private Long createTime; // 记录创建时间 + private Integer currencyId;// 币种id , see enum: currency + + } + +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferInRequest.java b/ff-game/src/main/java/com/ff/sports/fb/dto/TransferInRequest.java new file mode 100644 index 0000000..52b4c62 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/TransferInRequest.java @@ -0,0 +1,46 @@ +package com.ff.sports.fb.dto; + +import com.alibaba.fastjson2.JSON; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author cengy + */ +@Data +public class TransferInRequest implements Serializable { + + /** + * 转账金额,不能为null + * 必须大於或等於0 + */ + private BigDecimal amount; + + /** + * 业务id,不能为null + */ + private String businessId; + + /** + * 渠道用户ID,不能为null + */ + private String merchantUserId; + + /** + * 币种id,可不传入 + */ + private Integer currencyId; + + public String toJSON() { + Map map = new LinkedHashMap<>(); + map.put("amount", amount); + map.put("businessId", businessId); + map.put("currencyId", currencyId); + map.put("merchantUserId", merchantUserId); + return JSON.toJSONString(map); + } +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferInResponse.java b/ff-game/src/main/java/com/ff/sports/fb/dto/TransferInResponse.java new file mode 100644 index 0000000..e5ab6ca --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/TransferInResponse.java @@ -0,0 +1,20 @@ +package com.ff.sports.fb.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author cengy + */ +@Data +public class TransferInResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + private Boolean success; + private BigDecimal data; + private Integer code; + private String message; +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferOutRequest.java b/ff-game/src/main/java/com/ff/sports/fb/dto/TransferOutRequest.java new file mode 100644 index 0000000..37fc465 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/TransferOutRequest.java @@ -0,0 +1,46 @@ +package com.ff.sports.fb.dto; + +import com.alibaba.fastjson2.JSON; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author cengy + */ +@Data +public class TransferOutRequest implements Serializable { + + /** + * 转账金额,不能为null + * 必须大於或等於0 + */ + private BigDecimal amount; + + /** + * 业务id,不能为null + */ + private String businessId; + + /** + * 渠道用户ID,不能为null + */ + private String merchantUserId; + + /** + * 币种id,可不传入 + */ + private Integer currencyId; + + public String toJSON() { + Map map = new LinkedHashMap<>(); + map.put("amount", amount); + map.put("businessId", businessId); + map.put("currencyId", currencyId); + map.put("merchantUserId", merchantUserId); + return JSON.toJSONString(map); + } +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferOutResponse.java b/ff-game/src/main/java/com/ff/sports/fb/dto/TransferOutResponse.java new file mode 100644 index 0000000..9fb8897 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/TransferOutResponse.java @@ -0,0 +1,20 @@ +package com.ff.sports.fb.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author cengy + */ +@Data +public class TransferOutResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + private Boolean success; + private BigDecimal data; + private Integer code; + private String message; +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java new file mode 100644 index 0000000..cb82873 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java @@ -0,0 +1,618 @@ +package com.ff.sports.fb.impl; + +import cn.hutool.core.lang.generator.SnowflakeGenerator; +import cn.hutool.core.util.IdUtil; +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.utils.DateUtils; +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.meitian.dto.MeiTianBetRecordResponseDTO; +import com.ff.game.api.meitian.dto.MeiTianGameDataDTO; +import com.ff.game.api.request.*; +import com.ff.game.domain.*; +import com.ff.game.service.IGameBettingDetailsService; +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.sports.fb.client.FBSportsClient; +import com.ff.sports.fb.dto.*; +import com.ff.utils.TimestampFromString; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + + +/** + * FB体育 + * + * @author shi + * @date 2024/10/21 + */ +@Service("FBSportsService") +@Slf4j +public class FBSportsServiceImpl implements IGamesService { + + @Resource + private RedisCache redisCache; + + @Resource + private IGameExchangeMoneyService gameExchangeMoneyService; + + @Resource + private IGameService gameService; + + + @Resource + private IMemberService memberService; + + @Resource + private FBSportsClient fbSportsClient; + + @Resource + private IGameBettingDetailsService gameBettingDetailsService; + + /** + * 获得就是成功 + * + * @param errorCode 错误代码 + * @return {@link Boolean } + */ + private Boolean isSuccess(Integer errorCode) { + return 0 == errorCode; + } + + String getSign(String bodyJsonString, String merchantId, String merchantApiSecret, long requestTimestamp) { + + String stringThatNeedsToBeSigned = bodyJsonString + "." + merchantId + "." + requestTimestamp + "." + merchantApiSecret; + String sign = Md5Utils.md5New(stringThatNeedsToBeSigned); + return sign; + } + + /** + * 创建成员 + * + * @param createMemberRequestDTO 创建成员请求dto + * @return {@link Boolean } + */ + @Override + public Boolean createMember(CreateMemberRequestDTO createMemberRequestDTO) { + + long timestamp = System.currentTimeMillis(); + CreateUserRequest request = new CreateUserRequest(); + request.setMerchantUserId(createMemberRequestDTO.getAccount()); + ArrayList currencyIds = new ArrayList<>(); + currencyIds.add(Integer.parseInt(createMemberRequestDTO.getCurrency())); + request.setCurrencyIds(currencyIds); + String jsonBody = /*SortByAttributeNameASC.get(request)*/ request.toJSON(); + String sign = getSign(jsonBody, + createMemberRequestDTO.getAgentId(), + createMemberRequestDTO.getAgentKey(), + timestamp + ); + + CreateUserResponse response = fbSportsClient.createMember( + request, + sign, + timestamp, createMemberRequestDTO.getAgentId()); + if (isSuccess(response.getCode())) { + log.info("创建会员成功, account:{}->{}", createMemberRequestDTO.getAccount(), response.getData()); + return Boolean.TRUE; + } + + log.error("创建会员失败, errorCode:{}, errorMessage:{}", response.getCode(), response.getMessage()); + throw new ApiException(ErrorCode.Create_Member_Failure.getCode()); + } + + + /** + * 按代理id进行交换转账 + * + * @param requestDTO 外汇转账moeny dto + * @return {@link Long } + */ + @Override + @Transactional + public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO requestDTO) { + + Member member = memberService.selectMemberByGameAccount(requestDTO.getAccount()); + String transactionId = GamePlatforms.FBSports.getCode() + IdUtils.simpleUUID(); + List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( + GameExchangeMoney.builder() + .tenantKey(requestDTO.getTenantKey()) + .orderId(requestDTO.getOrderId()) + .build() + ); + Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); +//获取下一个自增id + GameExchangeMoney exchangeMoney = GameExchangeMoney + .builder() + .orderId(requestDTO.getOrderId()) + .tenantKey(requestDTO.getTenantKey()) + .quota(requestDTO.getQuota()) + .balance(requestDTO.getAmount()) + .exchangeType(requestDTO.getTransferType()) + .currencyCode(requestDTO.getSystemCurrency()) + .memberId(member.getId()) + .transactionId(transactionId) + .platformCode(GamePlatforms.FBSports.getCode()) + .build(); + exchangeMoney.setCreateBy(Constants.SYSTEM); + //接口限制限制50字符 + exchangeMoney.setTransactionId(transactionId); + // 转入 + if (requestDTO.getTransferType().equals(TransferType.GAMES.getCode())) { + TransferInRequest request = new TransferInRequest(); + request.setMerchantUserId(requestDTO.getAccount()); + request.setAmount(requestDTO.getAmount()); + request.setBusinessId(requestDTO.getOrderId()); + request.setCurrencyId(Integer.parseInt(requestDTO.getCurrency())); + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + + TransferInResponse response = fbSportsClient.transferIn( + request, + sign, + timestamp, + requestDTO.getAgentId()); + if (isSuccess(response.getCode())) { + + exchangeMoney.setBalance(response.getData()); + BigDecimal transAmount = requestDTO.getAmount(); + exchangeMoney.setCoinBefore(response.getData().subtract(transAmount)); + exchangeMoney.setCoinAfter(response.getData()); + exchangeMoney.setCurrencyBefore(response.getData().subtract(transAmount)); + exchangeMoney.setCurrencyAfter(response.getData()); + exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); // SUCCESS + gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + } else { + throw new ApiException(ErrorCode.Transfer_In_Failure.getCode()); + } + } else { + // 获取第三方钱包余额 + MemberInfoRequestDTO memberInfoRequestDTO = MemberInfoRequestDTO.builder() + .accounts(member.getGameAccount()) + .agentId(requestDTO.getAgentId()) + .agentKey(requestDTO.getAgentKey()) + .build(); + BigDecimal balance = this.getMemberInfo(memberInfoRequestDTO).getBalance(); + + TransferOutRequest request = new TransferOutRequest(); + request.setMerchantUserId(requestDTO.getAccount()); + request.setAmount(/*requestDTO.getAmount()*/ balance); + request.setBusinessId(requestDTO.getOrderId()); + request.setCurrencyId(Integer.parseInt(requestDTO.getCurrency())); + + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + + TransferOutResponse response = fbSportsClient + .transferOut( + request, + sign, + timestamp, + requestDTO.getAgentId() + ); + + + //判断是否转移成功 + if (this.isSuccess(response.getCode())) { + //更新数据 + exchangeMoney.setBalance(response.getData()); + BigDecimal transAmount = balance; + exchangeMoney.setCoinBefore(response.getData().add(transAmount)); + exchangeMoney.setCoinAfter(response.getData()); + exchangeMoney.setCurrencyBefore(response.getData().add(transAmount)); + exchangeMoney.setCurrencyAfter(response.getData()); + exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); // SUCCESS + gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + } else { + throw new ApiException(ErrorCode.Transfer_Out_Failure.getCode()); + } + } + return exchangeMoney.getId(); + } + + /** + * 获取会员信息 + * + * @param requestDTO 会员信息请求dto + * @return {@link MemberInfoResponseDTO } + */ + @Override + public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO requestDTO) { + GetMemberInfoRequest request = new GetMemberInfoRequest(); + request.setMerchantUserId(requestDTO.getAccounts()); + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + GetMemberInfoResponse response = fbSportsClient.getMemberInfo( + request, + sign, + timestamp, + requestDTO.getAgentId() + ); + //判断是否获取成功 + if (this.isSuccess(response.getCode())) { + BigDecimal balance = new BigDecimal("0.00"); + + for (GetMemberInfoResponse.Wallet wallet : response.getData().getWallets()) { + balance = balance.add(wallet.getBalance()); + } + return MemberInfoResponseDTO.builder() + .status(GameMemberStatus.UNKNOWN.getCode()) + .balance(balance) + .account(requestDTO.getAccounts()) + .build(); + } else { + throw new ApiException(ErrorCode.Get_Member_Info_Failure.getCode()); + } + } + + /** + * 无重定向登录 + * + * @param requestDTO 游戏登录 + * @return {@link String } + */ + @Override + public String loginWithoutRedirect(GamesLogin requestDTO) { + GetUrlRequest request = new GetUrlRequest(); + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + GetUrlResponse response = fbSportsClient.getUrl( + request, + sign, + timestamp, + requestDTO.getAgentId() + ); + //判断是否获取成功 + if (this.isSuccess(response.getCode())) { + List urlDTOS = new ArrayList<>(); + for (GetUrlResponse.UrlDTO urlDTO : response.getData()) { + if (urlDTO.getType() == 3) { // 3:h5 + urlDTOS.add(urlDTO); + } + } + if (urlDTOS.isEmpty()){ + throw new ApiException(ErrorCode.Get_Url_Failure.getCode()); + } + int randomIndex = new Random().nextInt(urlDTOS.size()); + GetUrlResponse.UrlDTO urlDTO = urlDTOS.get(randomIndex); + Collections.shuffle(urlDTO.getDomainList()); + return urlDTO.getDomainList().get(0).getDomain(); + } + throw new ApiException(ErrorCode.Get_Url_Failure.getCode()); + } + private static final Long GAME_ID = 1904452832756013817L; + /** + * 获取游戏列表 + * + * @param gamesBaseRequestDTO 游戏请求dto + * @return {@link String } + */ + @Transactional + @Override + public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) { + + Platform platform = gamesBaseRequestDTO.getVendor(); + Game game = gameService.selectGameById(GAME_ID); + //不存在这个游戏 + if (ObjectUtils.isEmpty(game)) { + game = new Game(); + game.setId(IdUtil.getSnowflakeNextId()); + game.setSortNo(1); + //game.setPlatformId(gamePlatform.getId()); + game.setPlatformCode(platform.getPlatformCode()); + game.setPlatformType(PlatformType.GAME_HALL.getCode()); + game.setGameCode("1"); + game.setGameSourceType(String.valueOf(1)); + game.setGameName("FB体育"); + game.setCreateBy(Constants.SYSTEM); + NameInfo nameInfo = new NameInfo(); + nameInfo.setLang("zh-CN"); + nameInfo.setName("FB体育"); + game.setNameInfo(Collections.singletonList(nameInfo)); + 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.FB_Sports; + } + + /** + * 汇兑转移状态 + * + * @param requestDTO 兑换转账请求dto + * @return {@link Boolean } + */ + @Override + public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO requestDTO) { + + GameExchangeMoney gameExchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(requestDTO.getGameExchangeMoneyId()); + if (null == gameExchangeMoney) { + throw new ApiException(ErrorCode.Transfer_Not_Exist.getCode()); + } + if (Objects.equals(gameExchangeMoney.getStatus(), StatusType.SUCCESS.getValue())) { + return Boolean.TRUE; + } + TransferDetailRequest request = new TransferDetailRequest(); + request.setMerchantUserId(requestDTO.getAccount()); + request.setTransferType(Objects.equals(gameExchangeMoney.getExchangeType(), TransferType.GAMES.getCode()) + ? "IN" : "OUT"); + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + TransferDetailResponse response = fbSportsClient.transferDetail( + request, + sign, + timestamp, + requestDTO.getAgentId() + ); + if (this.isSuccess(response.getCode())) { + return Boolean.TRUE; + } + return Boolean.FALSE; + } + + + /** + * 按时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link Boolean } + */ + @Override + public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { + return doSyncRecordByRecordID(betRecordByTimeDTO); + } + + boolean doSyncRecordByRecordID(BetRecordByTimeDTO betRecordByTimeDTO) { + + return Boolean.FALSE; + } + + boolean doSyncRecordByDate(BetRecordByTimeDTO betRecordByTimeDTO, int daysToSubtract) { + return Boolean.FALSE; + } + + /** + * 按历史时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link Boolean } + */ + @Override + public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { + doSyncRecordByDate(betRecordByTimeDTO, 0); + doSyncRecordByDate(betRecordByTimeDTO, 1); // yesterday + + return true; + } + + + /** + * 赠送免费局数 + * + * @param createFreeSpinRequest 创建自由旋转请求 + * @return {@link Boolean } + */ + @Override + public Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest) { + throw new BaseException("暂不支持免费局数"); + } + + /** + * 获取游戏详细信息 + * + * @param getGameDetailRequestDTO 获取游戏详细信息请求dto + * @return {@link GetGameDetailResponseDTO } + */ + @Override + public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) { + + return null; + } + + /** + * 强制会员从游戏注销 + * + * @param kickMemberRequestDTO 踢会员请求dto + * @return {@link Boolean } + */ + @Override + public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) { + + return Boolean.FALSE; + } + + /** + * 踢成员全部 + * + * @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 recordResponse 投注记录 + */ + private void batchInsert(MeiTianBetRecordResponseDTO recordResponse, BetRecordByTimeDTO betRecordByTimeDTO) { + List gameBettingDetails = new ArrayList<>(); + List wagersIds = new ArrayList<>(); + //数据组装 + List dataList = recordResponse.getDataList(); + if (CollectionUtils.isEmpty(dataList)) { + return; + } + + //数据转化 + for (MeiTianBetRecordResponseDTO.DataBean dataBean : dataList) { + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder() + .platform(betRecordByTimeDTO.getVendor()) + .data(dataBean).build()); + if (!ObjectUtils.isEmpty(bettingDetails)) { + bettingDetails.setId(IdUtil.getSnowflakeNextId()); + gameBettingDetails.add(bettingDetails); + } + wagersIds.add(dataBean.getRowID()); + } + if (!CollectionUtils.isEmpty(gameBettingDetails)) { + //查询重复数据id + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.MT.getCode()); + //用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) { + + //转化类 + MeiTianBetRecordResponseDTO.DataBean dataBean = (MeiTianBetRecordResponseDTO.DataBean) gamesDataBuildDTO.getData(); +// GameSecretKeyCurrencyDTO gameSecretKey = +// gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() +// .currency(dataBean.getCurrency()) +// .platformCode(GamePlatforms.MT.getCode()).build()); + + + Member member = memberService.selectMemberByGameAccount(dataBean.getPlayerName()); + if (ObjectUtils.isEmpty(member)) { + return null; + } + List gameDatas = redisCache.getCacheList(CacheConstants.MeiTian_GAMES); + Map dataDTOMap = gameDatas.stream().collect(Collectors.toMap(MeiTianGameDataDTO::getGameId, e -> e)); + MeiTianGameDataDTO gamesDataDTO = dataDTOMap.get(dataBean.getGameCode()); + BigDecimal originPayoffAmount = new BigDecimal(dataBean.getIncome()); // 这个值是到手的 + + int compareResult = originPayoffAmount.compareTo(BigDecimal.ZERO); + long gameTime = TimestampFromString.from(dataBean.getGameDate()); + Platform platform = gamesDataBuildDTO.getPlatform(); + String systemCurrency = platform.getOurCurrency(dataBean.getCurrency()); + //数据构造 + GameBettingDetails gameBettingDetails = GameBettingDetails.builder() + .tenantKey(member.getTenantKey()) + //保存我们的币种id + .currencyCode(systemCurrency) + .memberId(member.getId()) + .gameCode(dataBean.getGameCode()) + .gameType(MeiTianGameType.findSystemByCode(Integer.parseInt(dataBean.getGameType()))) + .platformCode(GamePlatforms.MT.getCode()) + .gameId(gamesDataDTO.getSystemGameId()) + .gameName(gamesDataDTO.getCnName()) + .gameStatus(compareResult > 0 ? GameStatus.WIN.getCode() : compareResult < 0 ? GameStatus.FAIL.getCode() : GameStatus.FLAT.getCode()) + .gameStatusType(1) // 一般下注 + .gameCurrencyCode(dataBean.getCurrency()) + .account(dataBean.getPlayerName()) + .wagersId(dataBean.getRowID()) + .wagersTime(gameTime) + .betAmount(new BigDecimal(dataBean.getBetAmount())) + .payoffTime(gameTime) + .payoffAmount(originPayoffAmount.abs()) + .settlementTime(gameTime) + .turnover(new BigDecimal(dataBean.getCommissionable())) + .orderNo(dataBean.getRowID()) + .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/utils/CalculateDateDaysAgo.java b/ff-game/src/main/java/com/ff/utils/CalculateDateDaysAgo.java new file mode 100644 index 0000000..dc5363b --- /dev/null +++ b/ff-game/src/main/java/com/ff/utils/CalculateDateDaysAgo.java @@ -0,0 +1,25 @@ +package com.ff.utils; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +/** + * @author cengy + */ +public class CalculateDateDaysAgo { + + public static LocalDate get(int daysToSubtract) { + return LocalDate.now().minusDays(daysToSubtract); + } + + public static String getStr(int daysToSubtract) { + // 获取当前日期减去指定天数 + LocalDate date = get(daysToSubtract); + + // 定义日期格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + // 返回格式化日期字符串 + return date.format(formatter); + } +} diff --git a/ff-game/src/main/java/com/ff/utils/SortByAttributeNameASC.java b/ff-game/src/main/java/com/ff/utils/SortByAttributeNameASC.java new file mode 100644 index 0000000..6e351b1 --- /dev/null +++ b/ff-game/src/main/java/com/ff/utils/SortByAttributeNameASC.java @@ -0,0 +1,40 @@ +package com.ff.utils; + +import com.alibaba.fastjson2.JSON; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author cengy + */ +public class SortByAttributeNameASC { + public static String get(Object o) { + // Create a map to store field names and values + Map fieldMap = new LinkedHashMap<>(); + + // Get all fields of the class + Field[] fields = o.getClass().getDeclaredFields(); + + // Sort field names + Arrays.sort(fields, (f1, f2) -> f1.getName().compareTo(f2.getName())); + + // Fill the map with sorted fields and their values + for (Field field : fields) { + field.setAccessible(true); // Make private fields accessible + Object value = null; + try { + value = field.get(o); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + fieldMap.put(field.getName(), value); + } + + + return JSON.toJSONString(fieldMap); + } + +} diff --git a/ff-game/src/main/java/com/ff/utils/TimestampFromString.java b/ff-game/src/main/java/com/ff/utils/TimestampFromString.java new file mode 100644 index 0000000..0280b2c --- /dev/null +++ b/ff-game/src/main/java/com/ff/utils/TimestampFromString.java @@ -0,0 +1,23 @@ +package com.ff.utils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @author cengy + */ +public class TimestampFromString { + + public static final String PATTERN_DATE = "yyyy-MM-dd HH:mm:ss"; + + public static Long from(String date) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(PATTERN_DATE); + try { + Date parse = simpleDateFormat.parse(date); + return parse.getTime(); + } catch (ParseException e) { + return 0L; + } + } +} diff --git a/ff-game/src/main/resources/mapper/game/GameMapper.xml b/ff-game/src/main/resources/mapper/game/GameMapper.xml index 3baffbe..910da1b 100644 --- a/ff-game/src/main/resources/mapper/game/GameMapper.xml +++ b/ff-game/src/main/resources/mapper/game/GameMapper.xml @@ -7,7 +7,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - @@ -16,6 +15,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + @@ -23,7 +24,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, sort_no, platform_id, game_code,ingress, game_source_type, game_name, freespin, demo_status, stop_status, create_by, create_time, update_by, update_time from ff_game + select * from ff_game @@ -33,7 +34,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} @@ -48,40 +48,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" @@ -112,7 +91,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id}, #{sortNo}, - #{platformId}, #{gameCode}, #{ingress}, #{gameSourceType}, @@ -131,7 +109,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update ff_game sort_no = #{sortNo}, - platform_id = #{platformId}, game_code = #{gameCode}, ingress = #{ingress}, game_source_type = #{gameSourceType}, @@ -192,8 +169,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" g.ingress, gp.platform_type from ff_game g - inner join ff_game_platform gp on g.platform_id=gp.id - where gp.stop_status=1 and g.stop_status=1 + where g.stop_status=1 From b087305ba1e5f15ae12880c12673bfdfef3bdde0 Mon Sep 17 00:00:00 2001 From: cengy Date: Tue, 8 Apr 2025 13:36:57 +0800 Subject: [PATCH 36/62] =?UTF-8?q?test(fb):=20=E4=BF=AE=E6=94=B9=E6=B8=B8?= =?UTF-8?q?=E6=88=8F=20ID=20=E7=94=9F=E6=88=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将静态常量 GAME_ID 修改为 11111 - 在创建新游戏时,将游戏 ID 设置为 GAME_ID,而不是使用 Snowflake算法生成的随机 ID --- .../main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java index cb82873..f56fce4 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java +++ b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java @@ -317,7 +317,7 @@ public class FBSportsServiceImpl implements IGamesService { } throw new ApiException(ErrorCode.Get_Url_Failure.getCode()); } - private static final Long GAME_ID = 1904452832756013817L; + private static final Long GAME_ID = 11111L; /** * 获取游戏列表 * @@ -333,7 +333,7 @@ public class FBSportsServiceImpl implements IGamesService { //不存在这个游戏 if (ObjectUtils.isEmpty(game)) { game = new Game(); - game.setId(IdUtil.getSnowflakeNextId()); + game.setId(/*IdUtil.getSnowflakeNextId()*/GAME_ID); game.setSortNo(1); //game.setPlatformId(gamePlatform.getId()); game.setPlatformCode(platform.getPlatformCode()); From 8ec1afd87594fe7f93b0bab302642a7cb6ef7829 Mon Sep 17 00:00:00 2001 From: cengy Date: Tue, 8 Apr 2025 17:11:31 +0800 Subject: [PATCH 37/62] =?UTF-8?q?feat(fb-sports):=20=E5=AE=9E=E7=8E=B0=20F?= =?UTF-8?q?B=20=E4=BD=93=E8=82=B2=E6=95=B0=E6=8D=AE=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 FB 体育类型枚举类 FBSportsType - 实现 FB 体育客户端接口,包括获取 token、订单文件列表和订单数据- 重构 FBSportsServiceImpl 类,支持按时间和历史时间获取投注记录 - 优化数据处理逻辑,实现批量插入功能 -移除不必要的定时任务配置 --- .../java/com/ff/base/enums/FBSportsType.java | 60 ++++ .../meitian/impl/MeiTianGameServiceImpl.java | 4 +- .../com/ff/quartz/config/ScheduleConfig.java | 114 ++++---- .../ff/sports/fb/address/FBSportsAddress.java | 6 +- .../ff/sports/fb/client/FBSportsClient.java | 29 +- .../com/ff/sports/fb/dto/GetTokenRequest.java | 30 ++ .../ff/sports/fb/dto/GetTokenResponse.java | 49 ++++ .../ff/sports/fb/dto/OrderFilesRequest.java | 8 + .../ff/sports/fb/dto/OrderFilesResponse.java | 2 +- .../ff/sports/fb/dto/OrderInfoRequest.java | 2 +- .../sports/fb/impl/FBSportsServiceImpl.java | 262 +++++++++++++----- .../com/ff/utils/TimestampFromString.java | 4 + 12 files changed, 437 insertions(+), 133 deletions(-) create mode 100644 ff-base/src/main/java/com/ff/base/enums/FBSportsType.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/GetTokenRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/fb/dto/GetTokenResponse.java diff --git a/ff-base/src/main/java/com/ff/base/enums/FBSportsType.java b/ff-base/src/main/java/com/ff/base/enums/FBSportsType.java new file mode 100644 index 0000000..f3fff75 --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/enums/FBSportsType.java @@ -0,0 +1,60 @@ +package com.ff.base.enums; + + +import lombok.Getter; + +import java.util.Optional; +import java.util.stream.Stream; + + +/** + * xkgame类型 + * + * @author shi + * @date 2024/11/13 + */ +@Getter +public enum FBSportsType { + + Sports("8", 8,"FB体育"), + ; + + private final String code; + private final Integer systemCode; + private final String info; + FBSportsType(String code, Integer systemCode, String info) + { + this.code = code; + this.systemCode = systemCode; + this.info = info; + } + + + /** + * 按代码查找系统 + * + * @param code 代码 + * @return {@link String } + */ + public static Integer findSystemByCode(String code) { + Optional system = Stream.of(FBSportsType.values()) + .filter(gameType -> gameType.getCode().equals(code)) + .map(FBSportsType::getSystemCode) + .findFirst(); + return system.orElse(null); + } + + /** + * 按代码查找信息 + * + * @param code 代码 + * @return {@link String } + */ + public static String findInfoByCode(String code) { + Optional system = Stream.of(FBSportsType.values()) + .filter(gameType -> gameType.getCode().equals(code)) + .map(FBSportsType::getInfo) + .findFirst(); + return system.orElse(null); + } +} 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 47af3fa..305a9eb 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 @@ -746,8 +746,8 @@ 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()); // 这个值是到手的 - - int compareResult = originPayoffAmount.compareTo(BigDecimal.ZERO); + BigDecimal betAmount = new BigDecimal(dataBean.getBetAmount()); + int compareResult = originPayoffAmount.compareTo(betAmount); long gameTime = TimestampFromString.from(dataBean.getGameDate()); Platform platform = gamesDataBuildDTO.getPlatform(); String systemCurrency = platform.getOurCurrency(dataBean.getCurrency()); diff --git a/ff-game/src/main/java/com/ff/quartz/config/ScheduleConfig.java b/ff-game/src/main/java/com/ff/quartz/config/ScheduleConfig.java index 475653c..c5b6fe3 100644 --- a/ff-game/src/main/java/com/ff/quartz/config/ScheduleConfig.java +++ b/ff-game/src/main/java/com/ff/quartz/config/ScheduleConfig.java @@ -1,57 +1,57 @@ -package com.ff.quartz.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.quartz.SchedulerFactoryBean; -import javax.sql.DataSource; -import java.util.Properties; - -/** - * 定时任务配置(单机部署建议删除此类和qrtz数据库表,默认走内存会最高效) - * - * @author ff - */ -@Configuration -public class ScheduleConfig -{ - @Bean - public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) - { - SchedulerFactoryBean factory = new SchedulerFactoryBean(); - factory.setDataSource(dataSource); - - // quartz参数 - Properties prop = new Properties(); - prop.put("org.quartz.scheduler.instanceName", "ffScheduler"); - prop.put("org.quartz.scheduler.instanceId", "AUTO"); - // 线程池配置 - prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); - prop.put("org.quartz.threadPool.threadCount", "20"); - prop.put("org.quartz.threadPool.threadPriority", "5"); - // JobStore配置 - prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore"); - // 集群配置 - prop.put("org.quartz.jobStore.isClustered", "true"); - prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000"); - prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "10"); - prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true"); - - // sqlserver 启用 - // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?"); - prop.put("org.quartz.jobStore.misfireThreshold", "12000"); - prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); - factory.setQuartzProperties(prop); - - factory.setSchedulerName("ffScheduler"); - // 延时启动 - factory.setStartupDelay(1); - factory.setApplicationContextSchedulerContextKey("applicationContextKey"); - // 可选,QuartzScheduler - // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 - factory.setOverwriteExistingJobs(true); - // 设置自动启动,默认为true - factory.setAutoStartup(true); - - return factory; - } -} +//package com.ff.quartz.config; +// +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.scheduling.quartz.SchedulerFactoryBean; +//import javax.sql.DataSource; +//import java.util.Properties; +// +///** +// * 定时任务配置(单机部署建议删除此类和qrtz数据库表,默认走内存会最高效) +// * +// * @author ff +// */ +//@Configuration +//public class ScheduleConfig +//{ +// @Bean +// public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) +// { +// SchedulerFactoryBean factory = new SchedulerFactoryBean(); +// factory.setDataSource(dataSource); +// +// // quartz参数 +// Properties prop = new Properties(); +// prop.put("org.quartz.scheduler.instanceName", "ffScheduler"); +// prop.put("org.quartz.scheduler.instanceId", "AUTO"); +// // 线程池配置 +// prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); +// prop.put("org.quartz.threadPool.threadCount", "20"); +// prop.put("org.quartz.threadPool.threadPriority", "5"); +// // JobStore配置 +// prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore"); +// // 集群配置 +// prop.put("org.quartz.jobStore.isClustered", "true"); +// prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000"); +// prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "10"); +// prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true"); +// +// // sqlserver 启用 +// // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?"); +// prop.put("org.quartz.jobStore.misfireThreshold", "12000"); +// prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); +// factory.setQuartzProperties(prop); +// +// factory.setSchedulerName("ffScheduler"); +// // 延时启动 +// factory.setStartupDelay(1); +// factory.setApplicationContextSchedulerContextKey("applicationContextKey"); +// // 可选,QuartzScheduler +// // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 +// factory.setOverwriteExistingJobs(true); +// // 设置自动启动,默认为true +// factory.setAutoStartup(true); +// +// return factory; +// } +//} diff --git a/ff-game/src/main/java/com/ff/sports/fb/address/FBSportsAddress.java b/ff-game/src/main/java/com/ff/sports/fb/address/FBSportsAddress.java index a1f47b8..e0aaa84 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/address/FBSportsAddress.java +++ b/ff-game/src/main/java/com/ff/sports/fb/address/FBSportsAddress.java @@ -11,9 +11,9 @@ import javax.annotation.Resource; /** - * 文档地址:https://doc.newsportspro.com/apidoc_data.html#%E5%85%A5%E5%8F%82 - * @author shi - * @date 2025/02/10 + * 对接文档地址 + * + * @author cengy */ @Component public class FBSportsAddress implements AddressSource { diff --git a/ff-game/src/main/java/com/ff/sports/fb/client/FBSportsClient.java b/ff-game/src/main/java/com/ff/sports/fb/client/FBSportsClient.java index 674a4e4..dc28d2d 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/client/FBSportsClient.java +++ b/ff-game/src/main/java/com/ff/sports/fb/client/FBSportsClient.java @@ -5,7 +5,8 @@ import com.ff.sports.fb.address.FBSportsAddress; import com.ff.sports.fb.dto.*; /** - * https://doc.newsportspro.com/apidoc_data.html + * 数据接口文档
+ * 网页接入文档 * * @author cengy */ @@ -68,10 +69,34 @@ public interface FBSportsClient { * FB体育用拉取订单文件的方式同步订单数据,FB体育每5分钟生成一次订单文件, * 通过此接口获取某一段时间内的文件ID列表,再通过文件ID获取具体订单数据 */ - @Post(url = "/api/v2/transfer/detail") + @Post(url = "/api/v2/order/file/ids") OrderFilesResponse orderFiles(@JSONBody OrderFilesRequest request, @Header("sign") @Var("sign") String sign, @Header("timestamp") @Var("timestamp") long timestamp, @Header("merchantId") @Var("merchantId") String merchantId); + /** + * 拉取订单Json数据 + */ + @Post(url = "/api/v2/order/list") + OrderInfoResponse getOrderJsonData(@JSONBody OrderInfoRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); + + + /** + * 获取用户app端鉴权token和相关服务url,获取到的token用于app调用接口鉴权 + * + * @param request + * @param sign + * @param timestamp + * @param merchantId + * @return + */ + @Post(url = "/api/v2/token/get") + GetTokenResponse getToken(@JSONBody GetTokenRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); } diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/GetTokenRequest.java b/ff-game/src/main/java/com/ff/sports/fb/dto/GetTokenRequest.java new file mode 100644 index 0000000..1f46602 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/GetTokenRequest.java @@ -0,0 +1,30 @@ +package com.ff.sports.fb.dto; + +import com.alibaba.fastjson2.JSON; +import lombok.Data; + +import java.io.Serializable; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author cengy + */ +@Data +public class GetTokenRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + private String merchantUserId; + // 平台类型,pc,h5, mobile , see enum: plat_form_enum + private String platForm; + // 客户端用户ip地址,尽可能提供,我们用于风控 + private String ip; // 可选 + + public String toJSON() { + Map map = new LinkedHashMap<>(); + map.put("merchantUserId", merchantUserId); + map.put("platForm", platForm); + return JSON.toJSONString(map); + } +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/GetTokenResponse.java b/ff-game/src/main/java/com/ff/sports/fb/dto/GetTokenResponse.java new file mode 100644 index 0000000..32a5029 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/GetTokenResponse.java @@ -0,0 +1,49 @@ +package com.ff.sports.fb.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author cengy + */ +@Data +public class GetTokenResponse implements Serializable { + private static final long serialVersionUID = 1L; + + private Boolean success; + private String message; + private Integer code; + private TokenDTO data; + + @Data + public static class TokenDTO implements Serializable { + private String token; // 用户鉴权token,用于客户端鉴权 + private ServerInfo serverInfo; // 服务器地址信息 + private List domains; // 全部服务器地址信息 + private String themeBgColor; // 主题背景色 + private String themeFgColor; // 主题前景色 + private Integer userId; // FB用户ID + } + + @Data + public static class ServerInfo implements Serializable { + private static final long serialVersionUID = 1L; + private String apiServerAddress; // app接口服务地址 + private String apiEmbeddedServerAddress; // app内嵌网页地址 + private String pushServerAddress; // 推送服务地址 + private String pcAddress; // PC投注网站地址 + private String h5Address; // h5投注网站地址 + private String virtualAddress; // 虚拟体育投注网站地址 + private String virtualMatchVideoAddress; // 虚拟赛事视频地址 + private String ouH5Address; // 欧版h5地址 + private String ouPcAddress; // 欧版pc地址 + } + + @Data + public static class Domain { + private Integer type; // 域名类型 + private List domains; // 域名集合 + } +} diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesRequest.java b/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesRequest.java index 3d3e48b..5cbbeed 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesRequest.java +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesRequest.java @@ -29,5 +29,13 @@ public class OrderFilesRequest implements Serializable { map.put("endTime", endTime); map.put("startTime", startTime); return JSON.toJSONString(map); +// String endTimeStr = endTime ; // 转换为字符串 +// String startTimeStr = startTime; // 转换为字符串 +// +// String json = "{" + +// "\"endTime\": \"" + endTimeStr + "\", " + +// "\"startTime\": \"" + startTimeStr + "\"" + +// "}"; +// return json; } } diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesResponse.java b/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesResponse.java index 3042774..8d9f1b5 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesResponse.java +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesResponse.java @@ -21,7 +21,7 @@ public class OrderFilesResponse implements Serializable { @Data public static class FileId implements Serializable { private static final long serialVersionUID = 1L; - private Integer fileId; + private Long fileId; } } diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoRequest.java b/ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoRequest.java index 5b75ecb..251dc02 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoRequest.java +++ b/ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoRequest.java @@ -16,7 +16,7 @@ public class OrderInfoRequest implements Serializable { /** * 文件Id,需要从/order/file/ids接口获取到 */ - private Integer fileId; + private Long fileId; public String toJSON() { Map map = new LinkedHashMap<>(); diff --git a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java index f56fce4..8cc5533 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java +++ b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java @@ -1,6 +1,5 @@ package com.ff.sports.fb.impl; -import cn.hutool.core.lang.generator.SnowflakeGenerator; import cn.hutool.core.util.IdUtil; import com.ff.base.constant.CacheConstants; import com.ff.base.constant.Constants; @@ -9,11 +8,10 @@ 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.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.meitian.dto.MeiTianBetRecordResponseDTO; -import com.ff.game.api.meitian.dto.MeiTianGameDataDTO; import com.ff.game.api.request.*; import com.ff.game.domain.*; import com.ff.game.service.IGameBettingDetailsService; @@ -33,7 +31,10 @@ import org.springframework.util.ObjectUtils; import javax.annotation.Resource; import java.math.BigDecimal; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; @@ -285,7 +286,50 @@ public class FBSportsServiceImpl implements IGamesService { */ @Override public String loginWithoutRedirect(GamesLogin requestDTO) { - GetUrlRequest request = new GetUrlRequest(); + GetTokenRequest request = new GetTokenRequest(); + request.setMerchantUserId(requestDTO.getAccount()); + request.setPlatForm(/*requestDTO.getPlatform()*/ "mobile"); // pc,h5, mobile , see enum: plat_form_enum + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + + GetTokenResponse response = fbSportsClient.getToken( + request, + sign, + timestamp, + requestDTO.getAgentId() + ); + + if (this.isSuccess(response.getCode())) { + String token = response.getData().getToken(); + Integer userId = response.getData().getUserId(); + GetTokenResponse.ServerInfo serverInfo = response.getData().getServerInfo(); + String h5Address = serverInfo.getH5Address(); + if (StringUtils.isEmpty(h5Address)) { + throw new ApiException(ErrorCode.Get_Url_Failure.getCode()); + } + + return h5Address + + "/index.html#/" + + "?token=" + + token + + "&nickname=" + + userId + + "&apiSrc=" + + serverInfo.getApiServerAddress() + + "&pushSrc=" + + serverInfo.getPushServerAddress() + + "&virtualSrc=" + + serverInfo.getVirtualAddress() + + "&platformName=XK体育"; + } + + + /*GetUrlRequest request = new GetUrlRequest(); long timestamp = System.currentTimeMillis(); String jsonBody = request.toJSON(); String sign = getSign(jsonBody, @@ -314,10 +358,12 @@ public class FBSportsServiceImpl implements IGamesService { GetUrlResponse.UrlDTO urlDTO = urlDTOS.get(randomIndex); Collections.shuffle(urlDTO.getDomainList()); return urlDTO.getDomainList().get(0).getDomain(); - } + }*/ throw new ApiException(ErrorCode.Get_Url_Failure.getCode()); } + private static final Long GAME_ID = 11111L; + /** * 获取游戏列表 * @@ -405,35 +451,123 @@ public class FBSportsServiceImpl implements IGamesService { /** * 按时间获取投注记录 * - * @param betRecordByTimeDTO 按时间dto投注记录 + * @param requestDTO 按时间dto投注记录 * @return {@link Boolean } */ @Override - public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { - return doSyncRecordByRecordID(betRecordByTimeDTO); + public Boolean getBetRecordByTime(BetRecordByTimeDTO requestDTO) { + Long lend = requestDTO.getEndTime(); + Long lstart = requestDTO.getStartTime(); + //betRecordByTimeDTO.setStartTime(lstart); + //betRecordByTimeDTO.setEndTime(lend); + + OrderFilesRequest request = new OrderFilesRequest(); + request.setStartTime(lstart); + request.setEndTime(lend); + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + OrderFilesResponse orderFilesResponse = fbSportsClient.orderFiles( + request, + sign, + timestamp, + requestDTO.getAgentId() + ); + if (this.isSuccess(orderFilesResponse.getCode())) { + for (OrderFilesResponse.FileId fileId : orderFilesResponse.getData()) { + try { + getOrderData(fileId.getFileId(), requestDTO); + } catch (Exception e) { + log.error("获取订单数据失败,fileId:{},agentId:{}", fileId, requestDTO.getAgentId()); + } + } + return true; + } + log.error("获取订单文件失败,agentId:{}", requestDTO.getAgentId()); + return false; } - boolean doSyncRecordByRecordID(BetRecordByTimeDTO betRecordByTimeDTO) { + void getOrderData(Long fileId, BetRecordByTimeDTO requestDTO) { + OrderInfoRequest request = new OrderInfoRequest(); + request.setFileId(fileId); + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); - return Boolean.FALSE; - } - - boolean doSyncRecordByDate(BetRecordByTimeDTO betRecordByTimeDTO, int daysToSubtract) { - return Boolean.FALSE; + OrderInfoResponse orderInfoResponse = fbSportsClient.getOrderJsonData( + request, + sign, + timestamp, + requestDTO.getAgentId() + ); + if (!this.isSuccess(orderInfoResponse.getCode())) { + return; + } + List settledOrderList = new ArrayList<>(); + for (OrderInfoResponse.OrderDTO orderDTO : orderInfoResponse.getData()) { +// 0 Created 未确认 +// 1 Confirming 确认中 +// 2 Rejected 已拒单 +// 3 Canceled 已取消 +// 4 Confirmed 已接单 +// 5 Settled 已结算 + if (!orderDTO.getOrderStatus().equals(5)) { // 已结算 + continue; + } + settledOrderList.add(orderDTO); + } + this.batchInsert(settledOrderList, requestDTO); } /** * 按历史时间获取投注记录 * - * @param betRecordByTimeDTO 按时间dto投注记录 + * @param requestDTO 按时间dto投注记录 * @return {@link Boolean } */ @Override - public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { - doSyncRecordByDate(betRecordByTimeDTO, 0); - doSyncRecordByDate(betRecordByTimeDTO, 1); // yesterday + public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO requestDTO) { + Long lend = requestDTO.getEndTime(); + Long lstart = requestDTO.getStartTime(); + //betRecordByTimeDTO.setStartTime(lstart); + //betRecordByTimeDTO.setEndTime(lend); - return true; + OrderFilesRequest request = new OrderFilesRequest(); + request.setStartTime(lstart); + request.setEndTime(lend); + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + OrderFilesResponse orderFilesResponse = fbSportsClient.orderFiles( + request, + sign, + timestamp, + requestDTO.getAgentId() + ); + if (this.isSuccess(orderFilesResponse.getCode())) { + for (OrderFilesResponse.FileId fileId : orderFilesResponse.getData()) { + try { + getOrderData(fileId.getFileId(), requestDTO); + } catch (Exception e) { + log.error("获取订单数据失败,fileId:{},agentId:{}", fileId, requestDTO.getAgentId()); + } + } + return true; + } + log.error("获取订单文件失败,agentId:{}", requestDTO.getAgentId()); + return false; } @@ -456,8 +590,7 @@ public class FBSportsServiceImpl implements IGamesService { */ @Override public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) { - - return null; + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } /** @@ -516,23 +649,22 @@ public class FBSportsServiceImpl implements IGamesService { throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } - /** * 批量插入 * - * @param recordResponse 投注记录 + * @param settledOrderList 投注记录 */ - private void batchInsert(MeiTianBetRecordResponseDTO recordResponse, BetRecordByTimeDTO betRecordByTimeDTO) { + private void batchInsert(List settledOrderList, BetRecordByTimeDTO betRecordByTimeDTO) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 - List dataList = recordResponse.getDataList(); + List dataList = settledOrderList; if (CollectionUtils.isEmpty(dataList)) { return; } //数据转化 - for (MeiTianBetRecordResponseDTO.DataBean dataBean : dataList) { + for (OrderInfoResponse.OrderDTO dataBean : dataList) { GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder() .platform(betRecordByTimeDTO.getVendor()) .data(dataBean).build()); @@ -540,20 +672,21 @@ public class FBSportsServiceImpl implements IGamesService { bettingDetails.setId(IdUtil.getSnowflakeNextId()); gameBettingDetails.add(bettingDetails); } - wagersIds.add(dataBean.getRowID()); + wagersIds.add(dataBean.getId()); } + if (CollectionUtils.isEmpty(gameBettingDetails)) { + return; + } + //查询重复数据id + List removeWagersIds = gameBettingDetailsService + .selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.FBSports.getCode()); + //用steam流清除list中与wagersIds集合相同的数据 + gameBettingDetails = gameBettingDetails.stream() + .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) + .collect(Collectors.toList()); if (!CollectionUtils.isEmpty(gameBettingDetails)) { - //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.MT.getCode()); - //用steam流清除list中与wagersIds集合相同的数据 - gameBettingDetails = gameBettingDetails.stream() - .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) - .collect(Collectors.toList()); - if (!CollectionUtils.isEmpty(gameBettingDetails)) { - gameBettingDetailsService.batchInsert(gameBettingDetails); - } + gameBettingDetailsService.batchInsert(gameBettingDetails); } - } /** @@ -566,49 +699,44 @@ public class FBSportsServiceImpl implements IGamesService { public GameBettingDetails dataBuild(GamesDataBuildDTO gamesDataBuildDTO) { //转化类 - MeiTianBetRecordResponseDTO.DataBean dataBean = (MeiTianBetRecordResponseDTO.DataBean) gamesDataBuildDTO.getData(); -// GameSecretKeyCurrencyDTO gameSecretKey = -// gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .currency(dataBean.getCurrency()) -// .platformCode(GamePlatforms.MT.getCode()).build()); - - - Member member = memberService.selectMemberByGameAccount(dataBean.getPlayerName()); + OrderInfoResponse.OrderDTO dataBean = (OrderInfoResponse.OrderDTO) gamesDataBuildDTO.getData(); + Member member = memberService.selectMemberByGameAccount(dataBean.getMerchantUserId()); if (ObjectUtils.isEmpty(member)) { return null; } - List gameDatas = redisCache.getCacheList(CacheConstants.MeiTian_GAMES); - Map dataDTOMap = gameDatas.stream().collect(Collectors.toMap(MeiTianGameDataDTO::getGameId, e -> e)); - MeiTianGameDataDTO gamesDataDTO = dataDTOMap.get(dataBean.getGameCode()); - BigDecimal originPayoffAmount = new BigDecimal(dataBean.getIncome()); // 这个值是到手的 + List gameList = redisCache.getCacheList(CacheConstants.FB_Sports); + Game game = gameList.get(0); + BigDecimal originPayoffAmount = new BigDecimal(dataBean.getSettleAmount()); + BigDecimal betAmount = new BigDecimal(dataBean.getStakeAmount()); - int compareResult = originPayoffAmount.compareTo(BigDecimal.ZERO); - long gameTime = TimestampFromString.from(dataBean.getGameDate()); + int compareResult = originPayoffAmount.compareTo(betAmount); + long payoffTime = TimestampFromString.to(dataBean.getSettleTime()); + long createTime = TimestampFromString.to(dataBean.getCreateTime()); Platform platform = gamesDataBuildDTO.getPlatform(); - String systemCurrency = platform.getOurCurrency(dataBean.getCurrency()); + String systemCurrency = platform.getOurCurrency(dataBean.getCurrency().toString()); //数据构造 GameBettingDetails gameBettingDetails = GameBettingDetails.builder() .tenantKey(member.getTenantKey()) //保存我们的币种id .currencyCode(systemCurrency) .memberId(member.getId()) - .gameCode(dataBean.getGameCode()) - .gameType(MeiTianGameType.findSystemByCode(Integer.parseInt(dataBean.getGameType()))) - .platformCode(GamePlatforms.MT.getCode()) - .gameId(gamesDataDTO.getSystemGameId()) - .gameName(gamesDataDTO.getCnName()) + .gameCode(game.getGameCode()) + .gameType(8) // 体育 + .platformCode(GamePlatforms.FBSports.getCode()) + .gameId(game.getId()) + .gameName(game.getGameName()) .gameStatus(compareResult > 0 ? GameStatus.WIN.getCode() : compareResult < 0 ? GameStatus.FAIL.getCode() : GameStatus.FLAT.getCode()) .gameStatusType(1) // 一般下注 - .gameCurrencyCode(dataBean.getCurrency()) - .account(dataBean.getPlayerName()) - .wagersId(dataBean.getRowID()) - .wagersTime(gameTime) - .betAmount(new BigDecimal(dataBean.getBetAmount())) - .payoffTime(gameTime) + .gameCurrencyCode(dataBean.getCurrency().toString()) + .account(dataBean.getMerchantUserId()) + .wagersId(dataBean.getId()) + .wagersTime(createTime) + .betAmount(betAmount) + .payoffTime(payoffTime) .payoffAmount(originPayoffAmount.abs()) - .settlementTime(gameTime) - .turnover(new BigDecimal(dataBean.getCommissionable())) - .orderNo(dataBean.getRowID()) + .settlementTime(payoffTime) + .turnover(betAmount) + .orderNo(dataBean.getId()) .settlementStatus(SettlementStatusEnum.COMPLETED.getCode()) .build(); gameBettingDetails.setCreateBy(Constants.SYSTEM); diff --git a/ff-game/src/main/java/com/ff/utils/TimestampFromString.java b/ff-game/src/main/java/com/ff/utils/TimestampFromString.java index 0280b2c..8a3ddd6 100644 --- a/ff-game/src/main/java/com/ff/utils/TimestampFromString.java +++ b/ff-game/src/main/java/com/ff/utils/TimestampFromString.java @@ -20,4 +20,8 @@ public class TimestampFromString { return 0L; } } + + public static Long to(String timestamp) { + return Long.parseLong(timestamp); + } } From 58becaf578072c458af8f1766dd09ae0d6ff605a Mon Sep 17 00:00:00 2001 From: shi Date: Tue, 8 Apr 2025 17:12:40 +0800 Subject: [PATCH 38/62] =?UTF-8?q?refactor(ff-game):=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E6=9C=AA=E4=BD=BF=E7=94=A8=E7=9A=84=E4=BB=A3=E7=A0=81=E5=92=8C?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除了 ApiMemberController 中未使用的 GameSecretKeyCurrencyDTO 相关代码 - 移除了 GamesPGTServiceImpl 中未使用的 IGamePlatformService、IGameSecretKeyService、IGameSecretKeyCurrencyService 和 IGameNameService 的注入 - 清理了 GamesPGTServiceImpl 中未 --- .../com/ff/base/constant/CacheConstants.java | 5 +- .../com/ff/base/enums/GameExchangeStep.java | 24 +++ .../ff/base/enums/GameExchangeStepStatus.java | 21 +++ .../java/com/ff/base/enums/TransferType.java | 3 +- .../java/com/ff/base/utils/StringUtils.java | 8 +- .../ff/api/controller/ApiGameController.java | 60 +++---- .../api/controller/ApiMemberController.java | 4 + .../com/ff/api/request/GameLoginRequest.java | 4 +- .../com/ff/api/response/GameResponse.java | 8 +- .../ff/common/dto/GameBalanceExchange.java | 6 + .../impl/TenantGameQuotaServiceImpl.java | 7 - .../java/com/ff/game/api/IGamesService.java | 4 +- .../dto/AEExchangeTransferStatusResponse.java | 6 +- .../game/api/ae/impl/GamesAEServiceImpl.java | 107 +++++------- .../com/ff/game/api/dg/client/DGClient.java | 10 ++ .../dg/service/impl/GamesDGServiceImpl.java | 83 +++++----- .../com/ff/game/api/fc/client/FCClient.java | 5 + ...ApiCFBalanceTransferStatusResponseDTO.java | 96 +++++++++++ .../game/api/fc/impl/GamesFCServiceImpl.java | 120 +++++++------- .../api/jili/address/MyJILIAddressSource.java | 2 +- .../ff/game/api/jili/client/JILIClient.java | 16 ++ .../dto/JILITransferStatusResponseDTO.java | 78 +++++++++ .../service/impl/GamesJILIServiceImpl.java | 136 ++++++++------- .../com/ff/game/api/km/client/KMClient.java | 11 ++ .../KMBalanceTransferStatusResponseDTO.java | 77 +++++++++ .../game/api/km/impl/GamesKMServiceImpl.java | 150 ++++++++--------- .../api/meitian/client/MeiTianClient.java | 17 ++ ...iTianBalanceTransferStatusResponseDTO.java | 69 ++++++++ .../meitian/impl/MeiTianGameServiceImpl.java | 111 +++++++------ .../api/ng/address/MyNGAddressSource.java | 1 - .../ng/service/impl/GamesPGServiceImpl.java | 122 +++----------- .../api/pgt/address/MyPGTAddressSource.java | 9 +- .../com/ff/game/api/pgt/client/PGTClient.java | 13 +- .../api/pgt/dto/PGTReplayUrlResponseDTO.java | 50 ++++++ .../api/pgt/dto/PGTTransactionResponse.java | 8 +- .../api/pgt/impl/GamesPGTServiceImpl.java | 155 +++++++++++------- .../api/pgx/impl/GamesPGXServiceImpl.java | 42 ++--- .../ExchangeTransferStatusResponseDTO.java | 41 +++++ .../api/request/GetGameDetailResponseDTO.java | 4 + .../game/api/sa/impl/GamesSAServiceImpl.java | 2 +- .../xk/service/impl/GamesXKServiceImpl.java | 4 +- .../main/java/com/ff/game/domain/Game.java | 8 + .../com/ff/game/domain/GameExchangeMoney.java | 8 + .../java/com/ff/game/domain/NameInfo.java | 6 + .../java/com/ff/game/mapper/GameMapper.java | 9 + .../com/ff/game/service/IGameService.java | 9 + .../ff/game/service/impl/GameServiceImpl.java | 11 ++ .../service/impl/MemberServiceImpl.java | 2 +- .../java/com/ff/quartz/task/GameTask.java | 3 - .../mapper/game/GameExchangeMoneyMapper.xml | 26 ++- .../main/resources/mapper/game/GameMapper.xml | 61 +++---- 51 files changed, 1189 insertions(+), 653 deletions(-) create mode 100644 ff-base/src/main/java/com/ff/base/enums/GameExchangeStep.java create mode 100644 ff-base/src/main/java/com/ff/base/enums/GameExchangeStepStatus.java create mode 100644 ff-game/src/main/java/com/ff/game/api/fc/dto/ApiCFBalanceTransferStatusResponseDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/jili/dto/JILITransferStatusResponseDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/km/dto/KMBalanceTransferStatusResponseDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianBalanceTransferStatusResponseDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTReplayUrlResponseDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/request/ExchangeTransferStatusResponseDTO.java diff --git a/ff-base/src/main/java/com/ff/base/constant/CacheConstants.java b/ff-base/src/main/java/com/ff/base/constant/CacheConstants.java index 401a331..9df0da0 100644 --- a/ff-base/src/main/java/com/ff/base/constant/CacheConstants.java +++ b/ff-base/src/main/java/com/ff/base/constant/CacheConstants.java @@ -51,7 +51,10 @@ public class CacheConstants { */ public static final String XK_GAMES = "xk_games:"; - + /** + * ae游戏 + */ + public static final String AE_GAMES = "ae_games:"; /** * km游戏 */ diff --git a/ff-base/src/main/java/com/ff/base/enums/GameExchangeStep.java b/ff-base/src/main/java/com/ff/base/enums/GameExchangeStep.java new file mode 100644 index 0000000..2f13939 --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/enums/GameExchangeStep.java @@ -0,0 +1,24 @@ +package com.ff.base.enums; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; + +/** + * 游戏交换步骤 + * + * @author shi + * @date 2025/04/08 + */ +@Getter +@AllArgsConstructor +public enum GameExchangeStep { + CREATE_ORDER(1, "创建订单"), + PLATFORM_TRANSACTION(2, "平台交易成功"), + PLATFORM_TRANSACTION_CONFIRM(3, "平台交易状态确认"), + TENANT_QUOTA_DEDUCTED(4, "租户额度扣减成功"); + + private final int code; + private final String description; +} diff --git a/ff-base/src/main/java/com/ff/base/enums/GameExchangeStepStatus.java b/ff-base/src/main/java/com/ff/base/enums/GameExchangeStepStatus.java new file mode 100644 index 0000000..fd70790 --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/enums/GameExchangeStepStatus.java @@ -0,0 +1,21 @@ +package com.ff.base.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 游戏交换步骤状态 + * + * @author shi + * @date 2025/04/08 + */ +@Getter +@AllArgsConstructor +public enum GameExchangeStepStatus { + IN_PROGRESS(0, "进行中"), + SUCCESS(1, "成功"), + FAILURE(2, "失败"); + + private final int code; + private final String description; +} diff --git a/ff-base/src/main/java/com/ff/base/enums/TransferType.java b/ff-base/src/main/java/com/ff/base/enums/TransferType.java index 6ebbfac..8d110ab 100644 --- a/ff-base/src/main/java/com/ff/base/enums/TransferType.java +++ b/ff-base/src/main/java/com/ff/base/enums/TransferType.java @@ -9,7 +9,8 @@ package com.ff.base.enums; */ public enum TransferType { ALL(1, "从游戏商转移额度到平台商(不看amount值,全部转出"), - GAMES(2, "从平台商转移额度到游戏商"); + GAMES(2, "从平台商转移额度到游戏商"), + ; private final Integer code; private final String info; diff --git a/ff-base/src/main/java/com/ff/base/utils/StringUtils.java b/ff-base/src/main/java/com/ff/base/utils/StringUtils.java index e8fbe8d..d35bd9e 100644 --- a/ff-base/src/main/java/com/ff/base/utils/StringUtils.java +++ b/ff-base/src/main/java/com/ff/base/utils/StringUtils.java @@ -585,12 +585,12 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils { /** * 加后缀 * - * @param account 账户 - * @param suffix 后缀 + * @param code 代码 + * @param suffix 后缀 * @return {@link String } */ - public static String addSuffix(String account, String suffix) { - return account + suffix; + public static String addSuffix(String code, Object suffix) { + return code +"_"+ suffix; } /** diff --git a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java index 76ecf27..2cac157 100644 --- a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java +++ b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java @@ -9,6 +9,7 @@ import com.ff.base.core.controller.BaseController; import com.ff.base.core.domain.AjaxResult; import com.ff.base.core.page.TableDataInfo; import com.ff.base.enums.ErrorCode; +import com.ff.base.enums.TransferType; import com.ff.base.exception.base.ApiException; import com.ff.base.system.domain.TenantSecretKey; import com.ff.base.utils.StringUtils; @@ -106,15 +107,10 @@ public class ApiGameController extends BaseController { if (null == platform) { continue; } -// List gameSecretKeyCurrencies = -// gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList( -// GameSecretKeyCurrencyDTO.builder().platformCode(gameResponse.getPlatformCode()) -// .build() -// ); -// List currencyCode = gameSecretKeyCurrencies.stream().map(GameSecretKeyCurrencyDTO::getSystemCurrency).collect(Collectors.toList()); List currencyCode = new ArrayList<>(platform.getCurrencyInfo().keySet()); gameResponse.setCurrencyCode(currencyCode); + } return AjaxResult.success(gameResponses); } @@ -129,7 +125,7 @@ public class ApiGameController extends BaseController { @PostMapping("/login") public AjaxResult login(@Validated @RequestBody GameLoginRequest loginRequest) { - Game game = gameService.selectGameById(loginRequest.getGameId()); + Game game = gameService.selectGameByGameId(loginRequest.getGameId()); ApiException.notNull(game, ErrorCode.GAME_NOT_EXIST.getCode()); Platform platform = platformService.get(game.getPlatformCode()); @@ -154,18 +150,6 @@ public class ApiGameController extends BaseController { String targetLang = platform.getLangInfo().get(loginRequest.getLangCode()); ApiException.notNull(targetLang, ErrorCode.LANG_NOT_EXIST.getCode()); -// TenantSecretKey tenantSecretKey = keyConfig.get(); -// GameSecretKeyCurrencyDTO secretKeyCurrencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(gamePlatform.getPlatformCode()) -// .systemCurrency(memberCreateApiRequest.getCurrencyCode()).build()); -// ApiException.notNull(secretKeyCurrencyDTO, ErrorCode.CURRENCY_NOT_EXIST.getCode()); - -// GameSecretKeyLangDTO gameSecretKeyLangDTO = gameSecretKeyLangService.findGameSecretKeyLangDTO(GameSecretKeyLangDTO.builder() -// .platformCode(gamePlatform.getPlatformCode()) -// .systemLangCode(memberCreateApiRequest.getLangCode()) -// .build()); -// ApiException.notNull(gameSecretKeyLangDTO, ErrorCode.LANG_NOT_EXIST.getCode()); - Member member = memberService.selectMemberByAccount(loginRequest.getAccount(), loginRequest.getCurrencyCode(), platform.getPlatformCode()); ApiException.notNull(member, ErrorCode.ACCOUNT_NOT_EXIST.getCode()); @@ -209,11 +193,6 @@ public class ApiGameController extends BaseController { TenantSecretKey tenantSecretKey = keyConfig.get(); -// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(gameExchangeBalanceRequest.getPlatformCode()) -// .systemCurrency(gameExchangeBalanceRequest.getCurrencyCode()).build()); -// -// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); Platform platform = platformService.get(gameExchangeBalanceRequest.getPlatformCode()); ApiException.notNull(platform, ErrorCode.PLATFORM_NOT_EXIST.getCode()); @@ -231,21 +210,24 @@ public class ApiGameController extends BaseController { } } ApiException.notNull(keyInfo, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + BigDecimal quota = BigDecimal.ZERO; + //如果是扣钱提前扣 + if (TransferType.GAMES.getCode().equals(gameExchangeBalanceRequest.getTransferType())) { + quota = tenantGameQuotaService.gameBalanceExchange(GameBalanceExchange.builder() + .platformCode(gameExchangeBalanceRequest.getPlatformCode()) + .sourceId(gameExchangeBalanceRequest.getOrderId()) + .currencyCode(gameExchangeBalanceRequest.getCurrencyCode()) + .currency(targetCurrency) + .transferType(gameExchangeBalanceRequest.getTransferType()) + .amount(gameExchangeBalanceRequest.getAmount()) + .account(gameExchangeBalanceRequest.getAccount()) + .tenantKey(tenantSecretKey.getTenantKey()) + .systemCurrency(gameExchangeBalanceRequest.getCurrencyCode()) + .agentId(keyInfo.getCode()) + .agentKey(keyInfo.getKey()) + .build()); + } - BigDecimal quota = tenantGameQuotaService.gameBalanceExchange(GameBalanceExchange.builder() - .platformCode(gameExchangeBalanceRequest.getPlatformCode()) - .sourceId(gameExchangeBalanceRequest.getOrderId()) - .currencyCode(gameExchangeBalanceRequest.getCurrencyCode()) - .currency(targetCurrency) - .transferType(gameExchangeBalanceRequest.getTransferType()) - .amount(gameExchangeBalanceRequest.getAmount()) - .account(gameExchangeBalanceRequest.getAccount()) - .tenantKey(tenantSecretKey.getTenantKey()) - .systemCurrency(gameExchangeBalanceRequest.getCurrencyCode()) - .agentId(keyInfo.getCode()) - .agentKey(keyInfo.getKey()) - - .build()); // 获取用户信息 Member member = memberService.selectMemberByAccount(gameExchangeBalanceRequest.getAccount(), gameExchangeBalanceRequest.getCurrencyCode(), gameExchangeBalanceRequest.getPlatformCode()); @@ -258,7 +240,7 @@ public class ApiGameController extends BaseController { .agentKey(keyInfo.getKey()) .orderId(gameExchangeBalanceRequest.getOrderId()) .account(member.getGameAccount()) - .currency(/*gameSecretKey.getCurrency()*/targetCurrency) + .currency(targetCurrency) .tenantKey(tenantSecretKey.getTenantKey()) .quota(quota) .amount(gameExchangeBalanceRequest.getAmount()) diff --git a/ff-game/src/main/java/com/ff/api/controller/ApiMemberController.java b/ff-game/src/main/java/com/ff/api/controller/ApiMemberController.java index a25f0ac..56bd037 100644 --- a/ff-game/src/main/java/com/ff/api/controller/ApiMemberController.java +++ b/ff-game/src/main/java/com/ff/api/controller/ApiMemberController.java @@ -144,6 +144,10 @@ public class ApiMemberController extends BaseController { .build(); Boolean result = iGamesService.createMember(gamesBaseRequestDTO); Assert.isTrue(result, "建立游戏账号失败"); + + + + return toAjax(Boolean.TRUE); } diff --git a/ff-game/src/main/java/com/ff/api/request/GameLoginRequest.java b/ff-game/src/main/java/com/ff/api/request/GameLoginRequest.java index a90f562..9c2d5f4 100644 --- a/ff-game/src/main/java/com/ff/api/request/GameLoginRequest.java +++ b/ff-game/src/main/java/com/ff/api/request/GameLoginRequest.java @@ -44,8 +44,8 @@ public class GameLoginRequest implements Serializable { /** * 游戏id */ - @NotNull(message = "gameId不能为空") - private Long gameId; + @NotBlank(message = "gameId不能为空") + private String gameId; /** diff --git a/ff-game/src/main/java/com/ff/api/response/GameResponse.java b/ff-game/src/main/java/com/ff/api/response/GameResponse.java index 8f4eee3..4b24077 100644 --- a/ff-game/src/main/java/com/ff/api/response/GameResponse.java +++ b/ff-game/src/main/java/com/ff/api/response/GameResponse.java @@ -1,5 +1,6 @@ package com.ff.api.response; +import com.ff.game.domain.NameInfo; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -27,7 +28,7 @@ public class GameResponse implements Serializable { /** * 游戏id */ - private Long id; + private String id; /** * 游戏名称 @@ -60,5 +61,8 @@ public class GameResponse implements Serializable { * 支持货币代码 */ private List currencyCode; - + /** + * 名称 + */ + private List nameInfo; } diff --git a/ff-game/src/main/java/com/ff/common/dto/GameBalanceExchange.java b/ff-game/src/main/java/com/ff/common/dto/GameBalanceExchange.java index 055ae84..15c82ff 100644 --- a/ff-game/src/main/java/com/ff/common/dto/GameBalanceExchange.java +++ b/ff-game/src/main/java/com/ff/common/dto/GameBalanceExchange.java @@ -47,6 +47,12 @@ public class GameBalanceExchange extends GamesBaseRequestDTO implements Serializ */ private BigDecimal amount; + + /** + * + */ + private BigDecimal amountActual; + /** * 账户 */ diff --git a/ff-game/src/main/java/com/ff/common/service/impl/TenantGameQuotaServiceImpl.java b/ff-game/src/main/java/com/ff/common/service/impl/TenantGameQuotaServiceImpl.java index 4307341..25f5253 100644 --- a/ff-game/src/main/java/com/ff/common/service/impl/TenantGameQuotaServiceImpl.java +++ b/ff-game/src/main/java/com/ff/common/service/impl/TenantGameQuotaServiceImpl.java @@ -271,13 +271,6 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService { */ @Override public BigDecimal gameBalanceExchange(GameBalanceExchange gameBalanceExchange) { - // 获取平台接口密钥 -// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(gameBalanceExchange.getPlatformCode()) -// .systemCurrency(gameBalanceExchange.getCurrencyCode()).build()); - - // 检查平台密钥是否存在,否则抛出异常 -// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); TenantQuotaExchange tenantQuotaExchange = tenantQuotaExchangeService.getTenantQuotaExchange(Constants.USDT, gameBalanceExchange.getCurrencyCode()); ApiException.notNull(tenantQuotaExchange, ErrorCode.CURRENCY_EXCHANGE.getCode()); diff --git a/ff-game/src/main/java/com/ff/game/api/IGamesService.java b/ff-game/src/main/java/com/ff/game/api/IGamesService.java index 1ee439d..d8ed023 100644 --- a/ff-game/src/main/java/com/ff/game/api/IGamesService.java +++ b/ff-game/src/main/java/com/ff/game/api/IGamesService.java @@ -66,9 +66,9 @@ public interface IGamesService { * 汇兑转移状态确认 * * @param exchangeTransferMoneyRequestDTO 兑换转账请求dto - * @return {@link Boolean } + * @return {@link ExchangeTransferStatusResponseDTO } */ - Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO); + ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO); /** diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/AEExchangeTransferStatusResponse.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/AEExchangeTransferStatusResponse.java index c2d064e..8e68c0f 100644 --- a/ff-game/src/main/java/com/ff/game/api/ae/dto/AEExchangeTransferStatusResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/ae/dto/AEExchangeTransferStatusResponse.java @@ -3,6 +3,8 @@ package com.ff.game.api.ae.dto; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; +import java.math.BigDecimal; + /** * aeexchange传输状态响应 @@ -32,13 +34,13 @@ public class AEExchangeTransferStatusResponse { * 当前余额 */ @JsonProperty("balance") - private double balance; + private BigDecimal balance; /** * 转账金额 */ @JsonProperty("transferAmount") - private double transferAmount; + private BigDecimal transferAmount; /** * 转账类型(如:DEPOSIT 或 WITHDRAW) diff --git a/ff-game/src/main/java/com/ff/game/api/ae/impl/GamesAEServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/ae/impl/GamesAEServiceImpl.java index 0b5396c..612c597 100644 --- a/ff-game/src/main/java/com/ff/game/api/ae/impl/GamesAEServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/ae/impl/GamesAEServiceImpl.java @@ -85,7 +85,6 @@ public class GamesAEServiceImpl implements IGamesService { private static final Long GAME_ID = 1904452832756013817L; - /** * 获得就是成功 * @@ -194,18 +193,6 @@ public class GamesAEServiceImpl implements IGamesService { @Transactional @Override public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) { -// GamePlatform gamePlatform = gamePlatformService.selectGamePlatformById(PLATFORM_ID); - //没有此平台就新增一个平台 -// if (ObjectUtils.isEmpty(gamePlatform)) { -// gamePlatform = new GamePlatform(); -// gamePlatform.setId(PLATFORM_ID); -// gamePlatform.setPlatformCode(GamePlatforms.AE.getInfo()); -// gamePlatform.setPlatformType(PlatformType.GAME_HALL.getCode()); -// gamePlatform.setPlatformName(GamePlatforms.AE.getInfo() + PlatformType.GAME_HALL.getName()); -// gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1); -// gamePlatform.setCreateBy(Constants.SYSTEM); -// gamePlatformService.insertGamePlatform(gamePlatform); -// } Platform platform = gamesBaseRequestDTO.getVendor(); Game game = gameService.selectGameById(GAME_ID); //不存在这个游戏 @@ -213,7 +200,6 @@ public class GamesAEServiceImpl implements IGamesService { game = new Game(); game.setId(GAME_ID); game.setSortNo(gameService.selectMaxSortNo(PlatformType.GAME_HALL.getCode(), GamePlatforms.AE.getCode()) + 1); - //game.setPlatformId(gamePlatform.getId()); game.setPlatformCode(platform.getPlatformCode()); game.setPlatformType(PlatformType.GAME_HALL.getCode()); game.setGameCode("1"); @@ -224,20 +210,10 @@ public class GamesAEServiceImpl implements IGamesService { nameInfo.setLang("zh-CN"); nameInfo.setName("AE大厅"); game.setNameInfo(Collections.singletonList(nameInfo)); + game.setGameId(StringUtils.addSuffix(GamePlatforms.AE.getCode(), 1)); gameService.insertGame(game); } - /*GameName gameName = gameNameService.selectGameNameById(GAME_NAME_ID); - if (ObjectUtils.isEmpty(gameName)) { - gameNameService.insertGameName(GameName.builder() - .id(GAME_NAME_ID) - .gameId(game.getId()) - .gameName(game.getGameName()) - .langCode("zh-CN") - .createBy(Constants.SYSTEM) - .build()); - }*/ - - return CacheConstants.XK_GAMES; + return CacheConstants.AE_GAMES; } /** @@ -250,10 +226,7 @@ public class GamesAEServiceImpl implements IGamesService { @Transactional public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { log.info("GamesAEServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); -// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(GamePlatforms.AE.getInfo()) -// .code(exchangeTransferMoneyRequestDTO.getAgentId()) -// .build()); + Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); String transactionId = GamePlatforms.AE.getCode() + IdUtils.simpleUUID(); @@ -279,6 +252,12 @@ public class GamesAEServiceImpl implements IGamesService { .platformCode(GamePlatforms.AE.getInfo()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); + exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue()); + exchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + + Map params = this.getKey(exchangeTransferMoneyRequestDTO); AETransactionResponse deposit = null; try { @@ -295,27 +274,30 @@ public class GamesAEServiceImpl implements IGamesService { params.put("withdrawType", 1); deposit = AEClient.withdraw(params); } - } finally { + }finally { BigDecimal coinBefore; if (TransferType.GAMES.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) { coinBefore = NumberUtil.sub(deposit.getCurrentBalance(), deposit.getAmount()); } else { coinBefore = NumberUtil.add(deposit.getCurrentBalance(), deposit.getAmount()); } + //判断是否转移成功 + if ("0000".equals(deposit.getStatus())) { + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + } else { + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.IN_PROGRESS.getCode()); + } //更新数据 exchangeMoney.setBalance(deposit.getAmount()); exchangeMoney.setCoinBefore(coinBefore); exchangeMoney.setCoinAfter(deposit.getCurrentBalance()); exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore()); exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter()); - //判断是否转移成功 - if ("0000".equals(deposit.getStatus())) { - exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); - } else { - exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue()); - } + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); + - gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); } @@ -326,10 +308,10 @@ public class GamesAEServiceImpl implements IGamesService { * 汇兑转移状态 * * @param exchangeTransferMoneyRequestDTO 兑换转账请求dto - * @return {@link Boolean } + * @return {@link ExchangeTransferStatusResponseDTO } */ @Override - public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { log.info("GamesAEServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO); Map paramsMap = this.getKey(exchangeTransferMoneyRequestDTO); @@ -345,30 +327,22 @@ public class GamesAEServiceImpl implements IGamesService { status = StatusType.FAILURE.getValue(); } GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeMoneyId()); - - //如果失败扣除租户之前被扣额度 - if (status.equals(StatusType.FAILURE.getValue())) { - Member member = memberService.selectMemberById(exchangeMoney.getMemberId()); - tenantGameQuotaService.gameBalanceExchange(GameBalanceExchange.builder() - .platformCode(exchangeMoney.getPlatformCode()) - .sourceId(exchangeMoney.getOrderId()) - .currencyCode(exchangeMoney.getCurrencyCode()) - .transferType(TransferType.ALL.getCode()) - .amount(exchangeMoney.getBalance()) - .account(member.getMemberAccount()) - .tenantKey(exchangeMoney.getTenantKey()) - .currency(exchangeTransferMoneyRequestDTO.getCurrency()) - .systemCurrency(exchangeTransferMoneyRequestDTO.getSystemCurrency()) - .agentKey(exchangeTransferMoneyRequestDTO.getAgentKey()) - .agentId(exchangeTransferMoneyRequestDTO.getAgentId()) - .build()); + //更新 + BigDecimal coinBefore; + if (TransferType.GAMES.getCode().equals(exchangeMoney.getExchangeType())) { + coinBefore = NumberUtil.sub(exchangeTransferStatusResponse.getBalance(), exchangeTransferStatusResponse.getTransferAmount()); + } else { + coinBefore = NumberUtil.add(exchangeTransferStatusResponse.getBalance(), exchangeTransferStatusResponse.getTransferAmount()); } - exchangeMoney.setStatus(status); - exchangeMoney.setUpdateBy(Constants.SYSTEM); - gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); - return Boolean.TRUE; + + return ExchangeTransferStatusResponseDTO.builder() + .statusType(status) + .balance(exchangeTransferStatusResponse.getTransferAmount()) + .coinBefore(coinBefore) + .coinAfter(exchangeTransferStatusResponse.getBalance()) + .build(); } @@ -401,6 +375,7 @@ public class GamesAEServiceImpl implements IGamesService { this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO); return Boolean.TRUE; } else { + redisCache.deleteObject(CacheConstants.AE_TIME_FROM); log.error("GamesAEServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc()); throw new BaseException(aeBetRecordResponse.getDesc()); } @@ -417,9 +392,7 @@ public class GamesAEServiceImpl implements IGamesService { public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { log.info("GamesAEServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", betRecordByTimeDTO); Map params = this.getKey(betRecordByTimeDTO); - - long startTimeLong = DateUtils.addOrSubtractMinutes(betRecordByTimeDTO.getStartTime(), -40); - String startTime = DateUtils.convertTimestampToFormattedDate(startTimeLong, DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00"; + String startTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00"; String endTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00"; @@ -531,7 +504,7 @@ public class GamesAEServiceImpl implements IGamesService { * * @param aeBetRecordResponse ae下注记录响应dto */ - private void batchInsert(AEBetRecordResponse aeBetRecordResponse, BetRecordByTimeDTO betRecordByTimeDTO) { + private synchronized void batchInsert(AEBetRecordResponse aeBetRecordResponse, BetRecordByTimeDTO betRecordByTimeDTO) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 @@ -578,10 +551,6 @@ public class GamesAEServiceImpl implements IGamesService { //转化类 AEBetRecordResponse.Transaction resultBean = (AEBetRecordResponse.Transaction) gamesDataBuildDTO.getData(); - /*GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() - .platformCode(GamePlatforms.AE.getInfo()) - .currency(resultBean.getCurrency()) - .build());*/ Member member = memberService.selectMemberByGameAccount(resultBean.getUserId()); if (ObjectUtils.isEmpty(member)) { diff --git a/ff-game/src/main/java/com/ff/game/api/dg/client/DGClient.java b/ff-game/src/main/java/com/ff/game/api/dg/client/DGClient.java index bc58304..15679c4 100644 --- a/ff-game/src/main/java/com/ff/game/api/dg/client/DGClient.java +++ b/ff-game/src/main/java/com/ff/game/api/dg/client/DGClient.java @@ -55,6 +55,16 @@ public interface DGClient { @Post(url = "/v2/api/transfer") DGTransactionResponseDTO exchangeTransferByAgentId(@JSONBody Map params, @Header Map header); + + /** + * 汇兑转移状态 + * + * @param params 参数 + * @param header 头球 + * @return {@link DGTransactionResponseDTO } + */ + @Post(url = "/v2/api/checkTransfer") + DGTransactionResponseDTO exchangeTransferStatus(@JSONBody Map params, @Header Map header); /** * 按时间获取投注记录 * diff --git a/ff-game/src/main/java/com/ff/game/api/dg/service/impl/GamesDGServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/dg/service/impl/GamesDGServiceImpl.java index 7a55494..b4315e9 100644 --- a/ff-game/src/main/java/com/ff/game/api/dg/service/impl/GamesDGServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/dg/service/impl/GamesDGServiceImpl.java @@ -8,11 +8,13 @@ import com.ff.base.enums.*; import com.ff.base.exception.base.ApiException; import com.ff.base.exception.base.BaseException; import com.ff.base.utils.DateUtils; +import com.ff.base.utils.SleepUtil; import com.ff.base.utils.StringUtils; import com.ff.base.utils.sign.Md5Utils; import com.ff.base.utils.uuid.IdUtils; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; +import com.ff.game.api.ae.dto.AEExchangeTransferStatusResponse; import com.ff.game.api.dg.client.DGClient; import com.ff.game.api.dg.dto.*; import com.ff.game.api.request.*; @@ -69,15 +71,6 @@ public class GamesDGServiceImpl implements IGamesService { */ private static final Long GAME_ID = 1904452832756003817L; - /** - * 平台ID - */ - private static final Long PLATFORM_ID = 1904411420157108325L; - - /** - * 游戏名称id - */ - private static final Long GAME_NAME_ID = 1904452832756002317L; /** * 获得就是成功 @@ -195,25 +188,13 @@ public class GamesDGServiceImpl implements IGamesService { @Transactional @Override public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) { - //GamePlatform gamePlatform = gamePlatformService.selectGamePlatformById(PLATFORM_ID); - //没有此平台就新增一个平台 - /*if (ObjectUtils.isEmpty(gamePlatform)) { - gamePlatform = new GamePlatform(); - gamePlatform.setId(PLATFORM_ID); - gamePlatform.setPlatformCode(GamePlatforms.DG.getInfo()); - gamePlatform.setPlatformType(PlatformType.CARD_GAME.getCode()); - gamePlatform.setPlatformName(GamePlatforms.DG.getInfo() + PlatformType.CARD_GAME.getName()); - gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1); - gamePlatform.setCreateBy(Constants.SYSTEM); - gamePlatformService.insertGamePlatform(gamePlatform); - }*/ + Game game = gameService.selectGameById(GAME_ID); //不存在这个游戏 if (ObjectUtils.isEmpty(game)) { game = new Game(); game.setId(GAME_ID); game.setSortNo(1); - //game.setPlatformId(gamePlatform.getId()); game.setPlatformCode(GamePlatforms.DG.getCode()); game.setPlatformType(PlatformType.GAME_HALL.getCode()); game.setGameCode("1"); @@ -221,18 +202,9 @@ public class GamesDGServiceImpl implements IGamesService { game.setGameName("真人棋牌"); game.setCreateBy(Constants.SYSTEM); game.setNameInfo(Collections.singletonList(new NameInfo("真人棋牌", "zh-CN"))); + game.setGameId(StringUtils.addSuffix(GamePlatforms.DG.getCode(), 1)); gameService.insertGame(game); } - /*GameName gameName = gameNameService.selectGameNameById(GAME_NAME_ID); - if (ObjectUtils.isEmpty(gameName)) { - gameNameService.insertGameName(GameName.builder() - .id(GAME_NAME_ID) - .gameId(game.getId()) - .gameName(game.getGameName()) - .langCode("zh-CN") - .createBy(Constants.SYSTEM) - .build()); - }*/ return CacheConstants.DG_GAMES; } @@ -246,10 +218,7 @@ public class GamesDGServiceImpl implements IGamesService { @Transactional public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { log.info("GamesDGServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); -// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(GamePlatforms.DG.getInfo()) -// .code(exchangeTransferMoneyRequestDTO.getAgentId()) -// .build()); + Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); String transactionId = GamePlatforms.DG.getInfo() + IdUtils.simpleUUID(); @@ -275,7 +244,10 @@ public class GamesDGServiceImpl implements IGamesService { .platformCode(GamePlatforms.DG.getInfo()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); - + exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue()); + exchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); BigDecimal amount = exchangeTransferMoneyRequestDTO.getAmount(); if (TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) { // 获取第三方钱包余额 @@ -306,9 +278,13 @@ public class GamesDGServiceImpl implements IGamesService { exchangeMoney.setCoinAfter(dgTransactionResponseDTO.getBalance()); exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore()); exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter()); - exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); - gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); } else { + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); log.error("GamesDGServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{},错误信息{}", dgTransactionResponseDTO.getCodeId(), dgTransactionResponseDTO.getMsg()); throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); } @@ -320,11 +296,31 @@ public class GamesDGServiceImpl implements IGamesService { * 汇兑转移状态 * * @param exchangeTransferMoneyRequestDTO 兑换转账请求dto - * @return {@link Boolean } + * @return {@link ExchangeTransferStatusResponseDTO } */ @Override - public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { - return Boolean.TRUE; + public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + log.info("GamesDGServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO); + + Map params = new LinkedHashMap<>(); + params.put("serial", exchangeTransferMoneyRequestDTO.getOrderId()); + + Map headerMap = this.getKey(exchangeTransferMoneyRequestDTO); + + DGTransactionResponseDTO dgTransactionResponseDTO = DGClient.exchangeTransferStatus(params, headerMap); + Integer status = StatusType.IN_PROGRESS.getValue(); + if (this.getIsSuccess(dgTransactionResponseDTO.getCodeId())) { + status = StatusType.SUCCESS.getValue(); + } else { + status = StatusType.FAILURE.getValue(); + } + + return ExchangeTransferStatusResponseDTO.builder() + .statusType(status) + .balance(dgTransactionResponseDTO.getAmount().abs()) + .coinBefore(NumberUtil.sub(dgTransactionResponseDTO.getBalance(), dgTransactionResponseDTO.getAmount().abs()).abs()) + .coinAfter(dgTransactionResponseDTO.getBalance()) + .build(); } @@ -336,6 +332,7 @@ public class GamesDGServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { + SleepUtil.sleep(50000); //请求参数 log.info("GamesDGServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO); Map key = this.getKey(betRecordByTimeDTO); @@ -360,7 +357,7 @@ public class GamesDGServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { - return null; + return Boolean.FALSE; } /** diff --git a/ff-game/src/main/java/com/ff/game/api/fc/client/FCClient.java b/ff-game/src/main/java/com/ff/game/api/fc/client/FCClient.java index cdb3e12..5c31ed9 100644 --- a/ff-game/src/main/java/com/ff/game/api/fc/client/FCClient.java +++ b/ff-game/src/main/java/com/ff/game/api/fc/client/FCClient.java @@ -89,6 +89,11 @@ public interface FCClient { ApiCFBalanceTransferResponseDTO exchangeTransferByAgentId(@JSONBody Map parameters); + @Post(url = "/GetSingleBill") + ApiCFBalanceTransferStatusResponseDTO exchangeTransferStatus(@JSONBody Map parameters); + + + /** * 按时间获取投注记录 * diff --git a/ff-game/src/main/java/com/ff/game/api/fc/dto/ApiCFBalanceTransferStatusResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/fc/dto/ApiCFBalanceTransferStatusResponseDTO.java new file mode 100644 index 0000000..ecae0ae --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/fc/dto/ApiCFBalanceTransferStatusResponseDTO.java @@ -0,0 +1,96 @@ +package com.ff.game.api.fc.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * api cfbalance传输状态响应dto + * + * @author shi + * @date 2025/04/08 + */ +@Data +public class ApiCFBalanceTransferStatusResponseDTO { + + /** + * 请求结果代码 + * 0 表示成功 + */ + @JsonProperty("Result") + private int result; + + /** + * 银行 ID + */ + @JsonProperty("bankID") + private int bankId; + + /** + * 交易 ID + */ + @JsonProperty("trsID") + private String trsId; + + /** + * 操作类型(如存款、取款等) + */ + @JsonProperty("action") + private String action; + + /** + * 交易的点数 + */ + @JsonProperty("points") + private BigDecimal points; + + /** + * 用户账号 + */ + @JsonProperty("account") + private String account; + + /** + * 交易状态 + * 1: 成功,其他值表示失败 + */ + @JsonProperty("status") + private int status; + + /** + * 交易前点数 + */ + @JsonProperty("beforepoints") + private BigDecimal beforePoints; + + /** + * 交易后点数 + */ + @JsonProperty("afterpoints") + private BigDecimal afterPoints; + + /** + * 创建日期 + */ + @JsonProperty("cdate") + private String createDate; + + /** + * 变更日期 + */ + @JsonProperty("bdate") + private String updateDate; + + /** + * 事件 ID + */ + @JsonProperty("eventID") + private String eventId; + + /** + * 货币类型 + */ + @JsonProperty("currency") + private String currency; +} diff --git a/ff-game/src/main/java/com/ff/game/api/fc/impl/GamesFCServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/fc/impl/GamesFCServiceImpl.java index faae116..1c4a951 100644 --- a/ff-game/src/main/java/com/ff/game/api/fc/impl/GamesFCServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/fc/impl/GamesFCServiceImpl.java @@ -14,6 +14,7 @@ import com.ff.base.utils.StringUtils; import com.ff.base.utils.sign.Md5Utils; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; +import com.ff.game.api.dg.dto.DGTransactionResponseDTO; import com.ff.game.api.fc.client.FCClient; import com.ff.game.api.fc.dto.*; import com.ff.game.api.request.*; @@ -258,7 +259,6 @@ public class GamesFCServiceImpl implements IGamesService { ApiFCGameListResponseDTO.GameDetails gameDetails = integerGameDetailsMap.get(gameIdKey); Game game = Game.builder() - //.platformId(gamePlatform.getId()) .platformCode(GamePlatforms.FC.getCode()) .gameCode(gameIdKey) .build(); @@ -269,41 +269,23 @@ public class GamesFCServiceImpl implements IGamesService { game.setGameSourceType(String.valueOf(PlatformType.ELECTRONIC.getCode())); game.setFreespin(Boolean.FALSE); game.setDemoStatus(Boolean.TRUE); - game.setPlatformCode(GamePlatforms.FC.getCode()); - game.setPlatformType(platformType); + game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.FC.getCode()) + 1); game.setGameName(gameDetails.getGameNameOfChinese()); game.setCreateBy(Constants.SYSTEM); - + game.setPlatformCode(GamePlatforms.FC.getCode()); + game.setPlatformType(platformType); List nameInfos = new ArrayList<>(); nameInfos.add(NameInfo.builder().lang("zh-CN").name(gameDetails.getGameNameOfChinese()).build()); nameInfos.add(NameInfo.builder().lang("en-US").name(gameDetails.getGameNameOfEnglish()).build()); game.setNameInfo(nameInfos); + game.setGameId(StringUtils.addSuffix(GamePlatforms.FC.getCode(), gameIdKey)); gameService.insertGame(game); } else { game = games.get(0); + } gameDetails.setSystemGameId(game.getId()); - - /*List gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(gameDetails.getGameNameOfChinese()).build()); - if (CollectionUtils.isEmpty(gameNames)) { - gameNameService.insertGameName(GameName.builder() - .gameId(game.getId()) - .gameName(gameDetails.getGameNameOfChinese()) - .langCode("zh-CN") - .createBy(Constants.SYSTEM) - .build()); - } - gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(gameDetails.getGameNameOfEnglish()).build()); - if (CollectionUtils.isEmpty(gameNames)) { - gameNameService.insertGameName(GameName.builder() - .gameId(game.getId()) - .gameName(gameDetails.getGameNameOfEnglish()) - .langCode("en-US") - .createBy(Constants.SYSTEM) - .build()); - }*/ - gameDetails.setGameId(gameIdKey); gameDetailsList.add(gameDetails); } @@ -330,11 +312,6 @@ public class GamesFCServiceImpl implements IGamesService { public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { log.info("GamesFCServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); -// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(GamePlatforms.FC.getInfo()) -// .code(exchangeTransferMoneyRequestDTO.getAgentId()) -// .currency(exchangeTransferMoneyRequestDTO.getCurrency()) -// .build()); Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); String transactionId = gameExchangeMoneyService.getTransactionId(GamePlatforms.FC.getInfo(), 30); @@ -360,6 +337,11 @@ public class GamesFCServiceImpl implements IGamesService { .platformCode(GamePlatforms.FC.getInfo()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); + exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue()); + exchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + //获取余额 String type = TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType()) ? FCTransferType.TRANSFER_OUT_ALL.getValue() : FCTransferType.TRANSFER_OUT.getValue(); @@ -398,10 +380,13 @@ public class GamesFCServiceImpl implements IGamesService { exchangeMoney.setCoinAfter(transferResponseDTO.getAfterPoint()); exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore()); exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter()); - exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); - - gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); } else { + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); log.error("GamesFCServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{}", transferResponseDTO.getResult()); throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); } @@ -412,11 +397,30 @@ public class GamesFCServiceImpl implements IGamesService { * 汇兑转移状态 * * @param exchangeTransferMoneyRequestDTO 兑换转账请求dto - * @return {@link Boolean } + * @return {@link ExchangeTransferStatusResponseDTO } */ @Override - public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { - throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + log.info("GamesDGServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO); + + Map paramsMap = new LinkedHashMap<>(); + paramsMap.put("TrsID", exchangeTransferMoneyRequestDTO.getOrderId()); + paramsMap.putAll(getKeyMap(paramsMap, exchangeTransferMoneyRequestDTO.getAgentKey(), exchangeTransferMoneyRequestDTO.getCurrency(), exchangeTransferMoneyRequestDTO.getAgentId())); + + ApiCFBalanceTransferStatusResponseDTO apiCFBalanceTransferStatusResponseDTO = FCClient.exchangeTransferStatus(paramsMap); + Integer status = StatusType.IN_PROGRESS.getValue(); + if (this.getIsSuccess(apiCFBalanceTransferStatusResponseDTO.getResult())) { + status = StatusType.SUCCESS.getValue(); + } else { + status = StatusType.FAILURE.getValue(); + } + + return ExchangeTransferStatusResponseDTO.builder() + .statusType(status) + .balance(apiCFBalanceTransferStatusResponseDTO.getPoints()) + .coinBefore(apiCFBalanceTransferStatusResponseDTO.getBeforePoints()) + .coinAfter(apiCFBalanceTransferStatusResponseDTO.getAfterPoints()) + .build(); } @@ -430,37 +434,29 @@ public class GamesFCServiceImpl implements IGamesService { @Override public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { -// List gameSecretKeyCurrencies = gameSecretKeyCurrencyService -// .findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO.builder() -// .platformCode(GamePlatforms.FC.getInfo()) -// .build()); Platform platform = betRecordByTimeDTO.getVendor(); - //for (KeyInfo keyInfo : platform.getKeyInfo()) { -// for (GameSecretKeyCurrency gameSecretKeyCurrency : gameSecretKeyCurrencies) { - String startTime = DateUtils.convertTimeZone(betRecordByTimeDTO.getStartTime(), "America/New_York", DateUtils.YYYY_MM_DD_HH_MM_SS); - String endTime = DateUtils.convertTimeZone(betRecordByTimeDTO.getEndTime(), "America/New_York", DateUtils.YYYY_MM_DD_HH_MM_SS); - Map paramsMap = new HashMap<>(); - paramsMap.put("StartDate", startTime); - paramsMap.put("EndDate", endTime); - KeyInfo keyInfo = betRecordByTimeDTO.getKeyInfo(); - String currency = keyInfo.getCurrency(); - String targetCurrency = platform.getCurrencyInfo().get(currency); - if (StringUtils.isEmpty(targetCurrency)) { - log.error("获取不到币种,platformCode:{},{}->{}", platform.getPlatformCode(), currency, targetCurrency); - //continue; - return Boolean.FALSE; - } + String startTime = DateUtils.convertTimeZone(betRecordByTimeDTO.getStartTime(), "America/New_York", DateUtils.YYYY_MM_DD_HH_MM_SS); + String endTime = DateUtils.convertTimeZone(betRecordByTimeDTO.getEndTime(), "America/New_York", DateUtils.YYYY_MM_DD_HH_MM_SS); + Map paramsMap = new HashMap<>(); + paramsMap.put("StartDate", startTime); + paramsMap.put("EndDate", endTime); + KeyInfo keyInfo = betRecordByTimeDTO.getKeyInfo(); + String currency = keyInfo.getCurrency(); + String targetCurrency = platform.getCurrencyInfo().get(currency); + if (StringUtils.isEmpty(targetCurrency)) { + log.error("获取不到币种,platformCode:{},{}->{}", platform.getPlatformCode(), currency, targetCurrency); + return Boolean.FALSE; + } - paramsMap.putAll(getKeyMap(paramsMap, betRecordByTimeDTO.getAgentKey(), keyInfo.getCurrency(), betRecordByTimeDTO.getAgentId())); + paramsMap.putAll(getKeyMap(paramsMap, betRecordByTimeDTO.getAgentKey(), keyInfo.getCurrency(), betRecordByTimeDTO.getAgentId())); - ApiFCBetRecordResponseDTO betRecordByTime = FCClient.getBetRecordByTime(paramsMap); + ApiFCBetRecordResponseDTO betRecordByTime = FCClient.getBetRecordByTime(paramsMap); - if (this.getIsSuccess(betRecordByTime.getResult())) { - //数据组装 - this.batchInsert(betRecordByTime, currency, targetCurrency); - } - //} + if (this.getIsSuccess(betRecordByTime.getResult())) { + //数据组装 + this.batchInsert(betRecordByTime, currency, targetCurrency); + } return Boolean.TRUE; } @@ -476,7 +472,7 @@ public class GamesFCServiceImpl implements IGamesService { Platform platform = betRecordByTimeDTO.getVendor(); for (KeyInfo keyInfo : platform.getKeyInfo()) { -// for (GameSecretKeyCurrency gameSecretKeyCurrency : gameSecretKeyCurrencies) { + //必须两个小时之前的数据 long startTimeLong = DateUtils.addOrSubtractMinutes(betRecordByTimeDTO.getStartTime(), -120); long endTimeLong = DateUtils.addOrSubtractMinutes(betRecordByTimeDTO.getEndTime(), -120); diff --git a/ff-game/src/main/java/com/ff/game/api/jili/address/MyJILIAddressSource.java b/ff-game/src/main/java/com/ff/game/api/jili/address/MyJILIAddressSource.java index 66ef096..592bae2 100644 --- a/ff-game/src/main/java/com/ff/game/api/jili/address/MyJILIAddressSource.java +++ b/ff-game/src/main/java/com/ff/game/api/jili/address/MyJILIAddressSource.java @@ -24,7 +24,7 @@ public class MyJILIAddressSource implements AddressSource { @Override public ForestAddress getAddress(ForestRequest request) { - String apiBaseUrl = platformService.get(GamePlatforms.FC.getCode()) + String apiBaseUrl = platformService.get(GamePlatforms.JILI.getCode()) .getUrlInfo().getUrl(); return new ForestAddress("https", apiBaseUrl, 443, "api1"); } diff --git a/ff-game/src/main/java/com/ff/game/api/jili/client/JILIClient.java b/ff-game/src/main/java/com/ff/game/api/jili/client/JILIClient.java index bcc4bae..7f38bac 100644 --- a/ff-game/src/main/java/com/ff/game/api/jili/client/JILIClient.java +++ b/ff-game/src/main/java/com/ff/game/api/jili/client/JILIClient.java @@ -63,6 +63,22 @@ public interface JILIClient { ) JILIExchangeMoneyResponseDTO exchangeTransferByAgentId(@Var("parameters") String parameters,@Body("AgentId") String agentId); + /** + * 按交易id检查转账 + * + * @param parameters 范围 + * @param agentId 代理id + * @return {@link JILITransferStatusResponseDTO } + */ + @Post( + url = "/CheckTransferByTransactionId?${parameters}", + headers = { + "Content-type: application/x-www-form-urlencoded" + } + ) + JILITransferStatusResponseDTO checkTransferByTransactionId(@Var("parameters") String parameters,@Body("AgentId") String agentId); + + /** * 按时间获取投注记录 * diff --git a/ff-game/src/main/java/com/ff/game/api/jili/dto/JILITransferStatusResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/jili/dto/JILITransferStatusResponseDTO.java new file mode 100644 index 0000000..ea53732 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/jili/dto/JILITransferStatusResponseDTO.java @@ -0,0 +1,78 @@ +package com.ff.game.api.jili.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * jilitransfer状态响应数据 + * + * @author shi + * @date 2025/04/08 + */ +@Data +public class JILITransferStatusResponseDTO { + + + /** + * 错误代码,0 表示成功 + */ + @JsonProperty("ErrorCode") + private int errorCode; + + /** + * 错误或状态信息 + */ + @JsonProperty("Message") + private String message; + + /** + * 转账相关数据 + */ + @JsonProperty("Data") + private TransferData data; + + /** + * 转账详细数据结构 + */ + @Data + public static class TransferData { + + /** + * 用户账户名 + */ + @JsonProperty("Account") + private String account; + + /** + * 转账交易 ID + */ + @JsonProperty("TransactionId") + private String transactionId; + + /** + * 转账时间,格式为 ISO 8601,如:2023-03-13T01:13:59-04:00 + */ + @JsonProperty("TransferTime") + private String transferTime; + + /** + * 转账金额 + */ + @JsonProperty("Amount") + private BigDecimal amount; + + /** + * 转账状态,1 表示成功,其他值可表示失败等状态 + */ + @JsonProperty("Status") + private int status; + + /** + * 转账类型,例如 1 表示入账,2 表示出账(视接口定义而定) + */ + @JsonProperty("TransferType") + private int transferType; + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/jili/service/impl/GamesJILIServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/jili/service/impl/GamesJILIServiceImpl.java index 6219b33..f82a544 100644 --- a/ff-game/src/main/java/com/ff/game/api/jili/service/impl/GamesJILIServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/jili/service/impl/GamesJILIServiceImpl.java @@ -15,6 +15,7 @@ import com.ff.base.utils.sign.Md5Utils; import com.ff.base.utils.uuid.IdUtils; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; +import com.ff.game.api.fc.dto.ApiCFBalanceTransferStatusResponseDTO; import com.ff.game.api.jili.client.JILIClient; import com.ff.game.api.jili.dto.*; import com.ff.game.api.request.*; @@ -226,23 +227,8 @@ public class GamesJILIServiceImpl implements IGamesService { if (this.getIsSuccess(jiliGames.getErrorCode())) { for (JILIGamesDataDTO gamesDataDTO : jiliGames.getData()) { - /*GamePlatform gamePlatform = GamePlatform.builder() - .platformType(JILIGameType.findSystemByCode(gamesDataDTO.getGameCategoryId())) - .platformCode(GamePlatforms.JILI.getInfo()) - .build(); - List gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform); - //没有此平台就新增一个平台 - if (CollectionUtils.isEmpty(gamePlatforms)) { - gamePlatform.setPlatformName(GamePlatforms.JILI.getInfo() + JILIGameType.findInfoByCode(gamesDataDTO.getGameCategoryId())); - gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1); - gamePlatform.setCreateBy(Constants.SYSTEM); - gamePlatformService.insertGamePlatform(gamePlatform); - } else { - gamePlatform = gamePlatforms.get(0); - }*/ Integer platformType = JILIGameType.findSystemByCode(gamesDataDTO.getGameCategoryId()); Game game = Game.builder() - //.platformId(gamePlatform.getId()) .platformCode(GamePlatforms.JILI.getCode()) .platformType(platformType) .gameCode(String.valueOf(gamesDataDTO.getGameId())) @@ -257,7 +243,7 @@ public class GamesJILIServiceImpl implements IGamesService { game.setCreateBy(Constants.SYSTEM); game.setPlatformType(platformType); game.setPlatformCode(GamePlatforms.JILI.getCode()); - + game.setGameId(StringUtils.addSuffix(GamePlatforms.JILI.getCode(), gamesDataDTO.getGameId())); List nameInfos = new ArrayList<>(); nameInfos.add(new NameInfo(gamesDataDTO.getName().getZhCN(), "zh-CN")); nameInfos.add(new NameInfo(gamesDataDTO.getName().getEnUS(), "en-US")); @@ -270,27 +256,6 @@ public class GamesJILIServiceImpl implements IGamesService { gamesDataDTO.setSystemGameId(game.getId()); - /*List gameNames = gameNameService.selectGameNameList(GameName - .builder() - .gameId(game.getId()) - .gameName(game.getGameName()).build()); - if (CollectionUtils.isEmpty(gameNames)) { - gameNameService.insertGameName(GameName.builder() - .gameId(game.getId()) - .gameName(game.getGameName()) - .langCode("zh-CN") - .createBy(Constants.SYSTEM) - .build()); - - gameNameService.insertGameName(GameName.builder() - .gameId(game.getId()) - .gameName(gamesDataDTO.getName().getEnUS()) - .langCode("en-US") - .createBy(Constants.SYSTEM) - .build()); - }*/ - - } redisCache.deleteObject(CacheConstants.JILI_GAMES); @@ -313,9 +278,6 @@ public class GamesJILIServiceImpl implements IGamesService { @Override @Transactional public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { -// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .code(exchangeTransferMoneyRequestDTO.getAgentId()) -// .currency(exchangeTransferMoneyRequestDTO.getCurrency()).build()); Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); String transactionId = GamePlatforms.JILI.getInfo() + IdUtils.simpleUUID(); @@ -343,8 +305,12 @@ public class GamesJILIServiceImpl implements IGamesService { .platformCode(GamePlatforms.JILI.getInfo()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); - //接口限制限制50字符 - exchangeMoney.setTransactionId(transactionId); + exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue()); + exchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + + String query = "Account=" + exchangeTransferMoneyRequestDTO.getAccount() + "&TransactionId=" + exchangeMoney.getTransactionId() + "&Amount=" + exchangeTransferMoneyRequestDTO.getAmount() @@ -371,10 +337,14 @@ public class GamesJILIServiceImpl implements IGamesService { exchangeMoney.setCoinAfter(exchangeMoneyResponseData.getCoinAfter()); exchangeMoney.setCurrencyBefore(exchangeMoneyResponseData.getCurrencyBefore()); exchangeMoney.setCurrencyAfter(exchangeMoneyResponseData.getCurrencyAfter()); - exchangeMoney.setStatus(exchangeMoneyResponseData.getStatus()); - gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); } else { + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); throw new BaseException(exchangeMoneyResponse.getMessage()); } @@ -389,8 +359,32 @@ public class GamesJILIServiceImpl implements IGamesService { * @return {@link Boolean } */ @Override - public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { - return Boolean.TRUE; + public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + log.info("GamesDGServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO); + + String query = "TransactionId=" + exchangeTransferMoneyRequestDTO.getOrderId() + + "&AgentId=" + exchangeTransferMoneyRequestDTO.getAgentId(); + exchangeTransferMoneyRequestDTO.setQuery(query); + + String key = this.getKey(exchangeTransferMoneyRequestDTO); + + JILITransferStatusResponseDTO jiliTransferStatusResponseDTO = jiliClient.checkTransferByTransactionId(query + "&Key=" + key, exchangeTransferMoneyRequestDTO.getAgentId()); + Integer status = StatusType.IN_PROGRESS.getValue(); + if (this.getIsSuccess(jiliTransferStatusResponseDTO.getErrorCode())) { + status = StatusType.SUCCESS.getValue(); + } else { + status = StatusType.FAILURE.getValue(); + } + JILITransferStatusResponseDTO.TransferData data = jiliTransferStatusResponseDTO.getData(); + ExchangeTransferStatusResponseDTO statusResponseDTO = ExchangeTransferStatusResponseDTO.builder() + .statusType(status) + .build(); + if (!ObjectUtils.isEmpty(data)) { + + statusResponseDTO.setBalance(data.getAmount()); + } + + return statusResponseDTO; } @@ -452,7 +446,45 @@ public class GamesJILIServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { - return null; + String startTime = DateUtils.formatDateToGMT4(new Date(betRecordByTimeDTO.getStartTime())); + String endTime = DateUtils.formatDateToGMT4(new Date(betRecordByTimeDTO.getEndTime())); + + //请求参数 + String query = "StartTime=" + startTime + "&EndTime=" + endTime + "&Page=" + betRecordByTimeDTO.getPage() + "&PageLimit=" + betRecordByTimeDTO.getPageLimit() + "&AgentId=" + betRecordByTimeDTO.getAgentId(); + log.info("GamesJILIServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", query); + betRecordByTimeDTO.setQuery(query); + //获取key + String key = this.getKey(betRecordByTimeDTO); + JILIBetRecordResponseDTO betRecordJILIResponse = jiliClient.getBetRecordByTime(query + "&Key=" + key, betRecordByTimeDTO.getAgentId()); + + //判断是否获取成功 + if (this.getIsSuccess(betRecordJILIResponse.getErrorCode())) { + + //数据插入 + this.batchInsert(betRecordJILIResponse, betRecordByTimeDTO); + JILIBetRecordResponseDTO.DataBean dataBean = betRecordJILIResponse.getData(); + //获取下一页数据 + while (dataBean.getPagination().getCurrentPage() != dataBean.getPagination().getTotalPages() && dataBean.getPagination().getTotalPages() > 0) { + betRecordByTimeDTO.setPage(dataBean.getPagination().getCurrentPage() + 1); + //请求参数 + query = "StartTime=" + startTime + "&EndTime=" + endTime + "&Page=" + betRecordByTimeDTO.getPage() + "&PageLimit=" + betRecordByTimeDTO.getPageLimit() + "&AgentId=" + betRecordByTimeDTO.getAgentId(); + log.info("GamesJILIServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", query); + betRecordByTimeDTO.setQuery(query); + key = this.getKey(betRecordByTimeDTO); + betRecordJILIResponse = jiliClient.getBetRecordByTime(query + "&Key=" + key, betRecordByTimeDTO.getAgentId()); + dataBean = betRecordJILIResponse.getData(); + if (this.getIsSuccess(betRecordJILIResponse.getErrorCode())) { + //数据插入 + this.batchInsert(betRecordJILIResponse, betRecordByTimeDTO); + } else { + log.error("GameBettingDataJILIServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordJILIResponse.getErrorCode(), betRecordJILIResponse.getMessage()); + } + } + } else { + log.error("GameBettingDataJILIServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordJILIResponse.getErrorCode(), betRecordJILIResponse.getMessage()); + return Boolean.FALSE; + } + return Boolean.TRUE; } @@ -467,9 +499,6 @@ public class GamesJILIServiceImpl implements IGamesService { String freeSpinValidity = DateUtils.formatDateToGMT4(new Date(createFreeSpinRequest.getFreeSpinValidity())); -// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .code(createFreeSpinRequest.getAgentId()) -// .currency(createFreeSpinRequest.getCurrency()).build()); List gameIds = createFreeSpinRequest.getGameIds(); GameUniqueDTO gameUniqueDTO = new GameUniqueDTO(); @@ -678,7 +707,6 @@ public class GamesJILIServiceImpl implements IGamesService { //请求参数 String query = "ReferenceId=" + cancelFreeSpinRequestDTO.getReferenceId() + "&AgentId=" + cancelFreeSpinRequestDTO.getAgentId(); - ; log.info("GamesJILIServiceImpl [cancelFreeSpin] 请求参数 {}", query); cancelFreeSpinRequestDTO.setQuery(query); //获取key @@ -717,7 +745,7 @@ public class GamesJILIServiceImpl implements IGamesService { * @param betRecordJILIResponse 投注记录jiliresponse * @return {@link Integer } */ - private void batchInsert(JILIBetRecordResponseDTO betRecordJILIResponse, BetRecordByTimeDTO betRecordByTimeDTO) { + private synchronized void batchInsert(JILIBetRecordResponseDTO betRecordJILIResponse, BetRecordByTimeDTO betRecordByTimeDTO) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 @@ -761,10 +789,6 @@ public class GamesJILIServiceImpl implements IGamesService { //转化类 JILIBetRecordDataResponseDTO jiliBetRecordDataResponseDTO = (JILIBetRecordDataResponseDTO) gamesDataBuildDTO.getData(); -// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .code(jiliBetRecordDataResponseDTO.getAgentId()) -// .platformCode(GamePlatforms.JILI.getInfo()).build()); - Member member = memberService.selectMemberByGameAccount(jiliBetRecordDataResponseDTO.getAccount()); if (ObjectUtils.isEmpty(member)) { diff --git a/ff-game/src/main/java/com/ff/game/api/km/client/KMClient.java b/ff-game/src/main/java/com/ff/game/api/km/client/KMClient.java index 0085fd9..77009c2 100644 --- a/ff-game/src/main/java/com/ff/game/api/km/client/KMClient.java +++ b/ff-game/src/main/java/com/ff/game/api/km/client/KMClient.java @@ -3,6 +3,7 @@ package com.ff.game.api.km.client; import com.dtflys.forest.annotation.*; import com.ff.game.api.dg.dto.DGResponse; +import com.ff.game.api.fc.dto.ApiCFBalanceTransferStatusResponseDTO; import com.ff.game.api.km.address.MyKMAddressSource; import com.ff.game.api.km.dto.*; import com.ff.game.api.success.MySuccessCondition; @@ -78,6 +79,16 @@ public interface KMClient { @Get(url ="/v2/history/bets?{params}") KMBetRecordResponse getBetRecordByTime(@Var("params")String params, @Header Map header); + /** + * 汇兑转移状态 + * + * @param params 参数 + * @param parameters 范围 + * @return {@link KMBalanceTransferStatusResponseDTO } + */ + @Post(url = "/history/transfers/{params}") + KMBalanceTransferStatusResponseDTO exchangeTransferStatus(@Var("params")String params,@JSONBody Map parameters); + /** * 踢腿队员 diff --git a/ff-game/src/main/java/com/ff/game/api/km/dto/KMBalanceTransferStatusResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/km/dto/KMBalanceTransferStatusResponseDTO.java new file mode 100644 index 0000000..9a30d2d --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/km/dto/KMBalanceTransferStatusResponseDTO.java @@ -0,0 +1,77 @@ +package com.ff.game.api.km.dto; + + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * km平衡传输状态响应数据 + * + * @author shi + * @date 2025/04/08 + */ +@Data +public class KMBalanceTransferStatusResponseDTO { + + /** + * 错误代码 + */ + @JsonProperty("err") + private Integer errorCode; + + /** + * 错误描述 + */ + @JsonProperty("errdesc") + private String errorDescription; + + /** + * 转账交易 ID + */ + @JsonProperty("txid") + private String txid; + + /** + * 转账时间戳,格式为 ISO 8601,如:2017-12-12T12:11:16+08:00 + */ + @JsonProperty("timestamp") + private String timestamp; + + /** + * 用户 ID + */ + @JsonProperty("userid") + private String userid; + + /** + * 用户名 + */ + @JsonProperty("username") + private String username; + + /** + * 玩家类型,1 代表普通玩家(具体含义根据接口文档定义) + */ + @JsonProperty("playertype") + private int playertype; + + /** + * 转账金额 + */ + @JsonProperty("amt") + private BigDecimal amt; + + /** + * 转账后的余额 + */ + @JsonProperty("postbal") + private BigDecimal postbal; + + /** + * 货币类型,符合 ISO 4217 标准(如 THB) + */ + @JsonProperty("cur") + private String cur; +} diff --git a/ff-game/src/main/java/com/ff/game/api/km/impl/GamesKMServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/km/impl/GamesKMServiceImpl.java index bcb8108..6029bbc 100644 --- a/ff-game/src/main/java/com/ff/game/api/km/impl/GamesKMServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/km/impl/GamesKMServiceImpl.java @@ -15,6 +15,8 @@ import com.ff.base.utils.ip.IpUtils; import com.ff.base.utils.uuid.IdUtils; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; +import com.ff.game.api.fc.dto.ApiCFBalanceTransferStatusResponseDTO; +import com.ff.game.api.jili.dto.JILITransferStatusResponseDTO; import com.ff.game.api.km.client.KMClient; import com.ff.game.api.km.dto.*; import com.ff.game.api.request.*; @@ -78,21 +80,6 @@ public class GamesKMServiceImpl implements IGamesService { private IGameBettingDetailsService gameBettingDetailsService; - /** - * 游戏id - */ - private static final Long GAME_ID = 1904452832756003817L; - - /** - * 平台ID - */ - private static final Long PLATFORM_ID = 1904411420157108325L; - - /** - * 游戏名称id - */ - private static final Long GAME_NAME_ID = 1904452832756002317L; - /** * 获得就是成功 * @@ -168,11 +155,7 @@ public class GamesKMServiceImpl implements IGamesService { public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO memberInfoRequestDTO) { log.info("GamesDGServiceImpl [getMemberInfo] 请求参数 {}", memberInfoRequestDTO); Map paramsMap = new HashMap<>(); -// Member member = memberService.selectMemberByGameAccount(memberInfoRequestDTO.getAccounts()); -// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(GamePlatforms.KM.getInfo()) -// .currency(member.getCurrencyCode()) -// .build()); + paramsMap.put("userid", memberInfoRequestDTO.getAccounts()); paramsMap.put("cur", memberInfoRequestDTO.getCurrency()); @@ -196,11 +179,7 @@ public class GamesKMServiceImpl implements IGamesService { log.info("GamesKMServiceImpl [loginWithoutRedirect] 请求参数 {}", gamesLogin); String kmUserToken = redisCache.getCacheObject(CacheConstants.KM_USER_TOKEN + gamesLogin.getAccount()); if (StringUtils.isEmpty(kmUserToken)) { -// Member member = memberService.selectMemberByGameAccount(gamesLogin.getAccount()); -// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(GamePlatforms.KM.getInfo()) -// .currency(member.getCurrencyCode()) -// .build()); + CreateMemberRequestDTO gamesBaseRequestDTO = CreateMemberRequestDTO.builder() .account(gamesLogin.getAccount()) @@ -213,7 +192,6 @@ public class GamesKMServiceImpl implements IGamesService { } String loginUrl = platformService.get(GamePlatforms.KM.getCode()).getUrlInfo().getLoginUrl(); - //String selectConfigByKey = configService.selectConfigByKey(Constants.KM_API_BASE_LOGIN_URL); return loginUrl + "/gamelauncher?gpcode=" + gamesLogin.getGameType() + "&gcode=" + gamesLogin.getGameId() @@ -269,23 +247,9 @@ public class GamesKMServiceImpl implements IGamesService { .anyMatch(pc -> pc.getCode().equals(mobile.getCode()))) .collect(Collectors.toList()); for (KMGameResponse.Game game : games) { -// GamePlatform gamePlatform = GamePlatform.builder() -// .platformType(KMGameType.findSystemByCode(game.getProviderCode())) -// .platformCode(GamePlatforms.KM.getCode()) -// .build(); - /*List gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform); - //没有此平台就新增一个平台 - if (CollectionUtils.isEmpty(gamePlatforms)) { - gamePlatform.setPlatformName(GamePlatforms.KM.getInfo() + KMGameType.findInfoByCode(game.getProviderCode())); - gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1); - gamePlatform.setCreateBy(Constants.SYSTEM); - gamePlatformService.insertGamePlatform(gamePlatform); - } else { - gamePlatform = gamePlatforms.get(0); - }*/ + Integer platformType = KMGameType.findSystemByCode(game.getProviderCode()); Game gameOne = Game.builder() - //.platformId(gamePlatform.getId()) .platformCode(GamePlatforms.KM.getCode()) .platformType(platformType) .gameCode(game.getCode()) @@ -312,23 +276,8 @@ public class GamesKMServiceImpl implements IGamesService { */ private List gameList(KMGameResponse gameList, Integer ingress) { for (KMGameResponse.Game gamesDataDTO : gameList.getGames()) { -// GamePlatform gamePlatform = GamePlatform.builder() -// .platformType(KMGameType.findSystemByCode(gamesDataDTO.getProviderCode())) -// .platformCode(GamePlatforms.KM.getCode()) -// .build(); - /*List gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform); - //没有此平台就新增一个平台 - if (CollectionUtils.isEmpty(gamePlatforms)) { - gamePlatform.setPlatformName(GamePlatforms.KM.getInfo() + KMGameType.findInfoByCode(gamesDataDTO.getProviderCode())); - gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1); - gamePlatform.setCreateBy(Constants.SYSTEM); - gamePlatformService.insertGamePlatform(gamePlatform); - } else { - gamePlatform = gamePlatforms.get(0); - }*/ Integer platformType = KMGameType.findSystemByCode(gamesDataDTO.getProviderCode()); Game game = Game.builder() - //.platformId(gamePlatform.getId()) .platformCode(GamePlatforms.KM.getCode()) .platformType(platformType) .gameCode(gamesDataDTO.getCode()) @@ -345,6 +294,7 @@ public class GamesKMServiceImpl implements IGamesService { game.setIngress(ingress); game.setPlatformCode(GamePlatforms.KM.getCode()); game.setPlatformType(platformType); + game.setGameId(StringUtils.addSuffix(GamePlatforms.KM.getCode(), gamesDataDTO.getCode())); List nameInfos = new ArrayList<>(); nameInfos.add(new NameInfo(gamesDataDTO.getName(), "zh-CN")); game.setNameInfo(nameInfos); @@ -353,16 +303,6 @@ public class GamesKMServiceImpl implements IGamesService { game = games.get(0); } gamesDataDTO.setSystemGameId(game.getId()); -// List gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(game.getGameName()).build()); -// if (CollectionUtils.isEmpty(gameNames)) { -// gameNameService.insertGameName(GameName.builder() -// .gameId(game.getId()) -// .gameName(game.getGameName()) -// .langCode("zh-CN") -// .createBy(Constants.SYSTEM) -// .build()); -// } - } return gameList.getGames(); } @@ -377,10 +317,7 @@ public class GamesKMServiceImpl implements IGamesService { @Transactional public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { log.info("GamesKMServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); -// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(GamePlatforms.KM.getInfo()) -// .currency(exchangeTransferMoneyRequestDTO.getCurrency()) -// .build()); + Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); String transactionId = GamePlatforms.KM.getInfo() + IdUtils.simpleUUID(); @@ -406,6 +343,11 @@ public class GamesKMServiceImpl implements IGamesService { .platformCode(GamePlatforms.KM.getInfo()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); + exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue()); + exchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + BigDecimal amount = exchangeTransferMoneyRequestDTO.getAmount(); if (TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) { @@ -443,9 +385,13 @@ public class GamesKMServiceImpl implements IGamesService { exchangeMoney.setCoinAfter(kmTransactionResponse.getBalance()); exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore()); exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter()); - exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); - gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); } else { + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); log.error("GamesDGServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{},错误信息{}", kmTransactionResponse.getErrorCode(), kmTransactionResponse.getErrorDescription()); throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); } @@ -460,8 +406,25 @@ public class GamesKMServiceImpl implements IGamesService { * @return {@link Boolean } */ @Override - public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { - return Boolean.TRUE; + public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + log.info("GamesKMServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO); + + + Map headerMap = this.getKey(exchangeTransferMoneyRequestDTO); + + KMBalanceTransferStatusResponseDTO kmBalanceTransferStatusResponseDTO = KMClient.exchangeTransferStatus(exchangeTransferMoneyRequestDTO.getOrderId(), headerMap); + Integer status = StatusType.IN_PROGRESS.getValue(); + if (ObjectUtils.isEmpty(kmBalanceTransferStatusResponseDTO.getErrorCode()) || this.getIsSuccess(kmBalanceTransferStatusResponseDTO.getErrorCode())) { + status = StatusType.SUCCESS.getValue(); + } else { + status = StatusType.FAILURE.getValue(); + } + return ExchangeTransferStatusResponseDTO.builder() + .statusType(status) + .balance(kmBalanceTransferStatusResponseDTO.getAmt()) + .coinBefore(NumberUtil.sub(kmBalanceTransferStatusResponseDTO.getAmt(), kmBalanceTransferStatusResponseDTO.getPostbal()).abs()) + .coinAfter(kmBalanceTransferStatusResponseDTO.getPostbal()) + .build(); } @@ -514,7 +477,35 @@ public class GamesKMServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { - return null; + + log.info("GamesKMServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", betRecordByTimeDTO); + Map key = this.getKey(betRecordByTimeDTO); + String startTime = null; + String endTime = null; + try { + + + startTime = URLEncoder.encode(DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00", "UTF-8"); + endTime = URLEncoder.encode(DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00", "UTF-8"); + } catch (Exception e) { + throw new BaseException(e.getMessage()); + } + Map params = new LinkedHashMap<>(); + params.put("startdate", startTime); + params.put("enddate", endTime); + params.put("includetestplayers", Boolean.TRUE); + params.put("issettled", Boolean.TRUE); + + KMBetRecordResponse betRecordByTime = KMClient.getBetRecordByTime(JsonUtil.mapToQueryString(params), key); + + if (ObjectUtils.isEmpty(betRecordByTime.getErrorCode()) || this.getIsSuccess(betRecordByTime.getErrorCode())) { + this.batchInsert(betRecordByTime, betRecordByTimeDTO); + return Boolean.TRUE; + } else { + log.error("GamesKMServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getErrorCode(), betRecordByTime.getErrorDescription()); + throw new BaseException(betRecordByTime.getErrorDescription()); + } + } /** @@ -661,11 +652,7 @@ public class GamesKMServiceImpl implements IGamesService { public GameBettingDetails dataBuild(GamesDataBuildDTO gamesDataBuildDTO) { //转化类 KMBetRecordResponse.Bet resultBean = (KMBetRecordResponse.Bet) gamesDataBuildDTO.getData(); -// -// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(GamePlatforms.KM.getInfo()) -// .currency(resultBean.getCurrency()) -// .build()); + Member member = memberService.selectMemberByGameAccount(resultBean.getUserId()); @@ -678,7 +665,6 @@ public class GamesKMServiceImpl implements IGamesService { e -> e, (existing, replacement) -> existing )); - ; KMGameResponse.Game gamesDataDTO = dataDTOMap.get(resultBean.getGCode()); //输赢状态 @@ -702,7 +688,7 @@ public class GamesKMServiceImpl implements IGamesService { .gameCode(gamesDataDTO.getCode()) .gameType(PlatformType.CARD_GAME.getCode()) .platformCode(GamePlatforms.KM.getCode()) - .gameId(GAME_ID) + .gameId(gamesDataDTO.getSystemGameId()) .gameName(gamesDataDTO.getName()) .gameStatus(gameStatus) .gameStatusType(1) diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/client/MeiTianClient.java b/ff-game/src/main/java/com/ff/game/api/meitian/client/MeiTianClient.java index e712c0e..8f1fb3e 100644 --- a/ff-game/src/main/java/com/ff/game/api/meitian/client/MeiTianClient.java +++ b/ff-game/src/main/java/com/ff/game/api/meitian/client/MeiTianClient.java @@ -3,6 +3,7 @@ package com.ff.game.api.meitian.client; import com.dtflys.forest.annotation.Address; import com.dtflys.forest.annotation.Post; import com.dtflys.forest.annotation.Var; +import com.ff.game.api.km.dto.KMBalanceTransferStatusResponseDTO; import com.ff.game.api.meitian.address.MeiTianAddressSource; import com.ff.game.api.meitian.dto.*; @@ -103,6 +104,22 @@ public interface MeiTianClient { @Var("data") String data ); + + /** + * 汇兑转移状态 + * + * @param merchantId 商户ID + * @param playerName 玩家姓名 + * @param coins 硬币 + * @return {@link MeiTianBalanceTransferStatusResponseDTO } + */ + @Post("dg/player/queryTransbyId/{playerName}/{merchantId}/{extTransId}") + MeiTianBalanceTransferStatusResponseDTO exchangeTransferStatus( + @Var("playerName") String merchantId, + @Var("merchantId") String playerName, + @Var("extTransId") String coins + ); + /** * 按recordId获取投注记录 * diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianBalanceTransferStatusResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianBalanceTransferStatusResponseDTO.java new file mode 100644 index 0000000..4c95d1c --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianBalanceTransferStatusResponseDTO.java @@ -0,0 +1,69 @@ +package com.ff.game.api.meitian.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 梅田余额转移状态响应dto + * + * @author shi + * @date 2025/04/08 + */ +@Data +public class MeiTianBalanceTransferStatusResponseDTO { + /** + * 响应结果代码 + */ + @JsonProperty("resultCode") + private Integer resultCode; + + /** + * 交易 ID + */ + @JsonProperty("transId") + private String transId; + + /** + * 交易时间,格式为 yyyy-MM-dd HH:mm:ss + */ + @JsonProperty("transTime") + private String transTime; + + /** + * 交易类型代码 + */ + @JsonProperty("transType") + private String transType; + + /** + * 交易金额 + */ + @JsonProperty("transCoins") + private BigDecimal transCoins; + + /** + * 当前余额 + */ + @JsonProperty("curBalance") + private BigDecimal curBalance; + + /** + * 时区信息,如:GMT+8 + */ + @JsonProperty("timeZone") + private String timeZone; + + /** + * 交易状态,1 表示成功 + */ + @JsonProperty("status") + private String status; + + /** + * 货币类型,如:CNY + */ + @JsonProperty("currency") + private String currency; +} diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/impl/MeiTianGameServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/meitian/impl/MeiTianGameServiceImpl.java index 4741aa6..c01c1aa 100644 --- a/ff-game/src/main/java/com/ff/game/api/meitian/impl/MeiTianGameServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/meitian/impl/MeiTianGameServiceImpl.java @@ -2,6 +2,7 @@ package com.ff.game.api.meitian.impl; import cn.hutool.core.codec.Base64; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; import com.alibaba.fastjson2.JSON; import com.ff.base.constant.CacheConstants; import com.ff.base.constant.Constants; @@ -12,9 +13,11 @@ import com.ff.base.exception.base.BaseException; import com.ff.base.system.domain.SysConfig; import com.ff.base.system.service.impl.SysConfigServiceImpl; import com.ff.base.utils.DateUtils; +import com.ff.base.utils.StringUtils; import com.ff.base.utils.sign.Md5Utils; import com.ff.base.utils.uuid.IdUtils; import com.ff.game.api.IGamesService; +import com.ff.game.api.km.dto.KMBalanceTransferStatusResponseDTO; import com.ff.game.api.meitian.client.MeiTianClient; import com.ff.game.api.meitian.dto.*; import com.ff.game.api.request.*; @@ -51,7 +54,7 @@ import java.util.stream.Collectors; * @author shi * @date 2024/10/21 */ -@Service("MeiTianService") +@Service("MTService") @Slf4j public class MeiTianGameServiceImpl implements IGamesService { @@ -217,23 +220,8 @@ public class MeiTianGameServiceImpl implements IGamesService { MeiTianGamesDTO gameList = new MeiTianGamesDTO(); for (MeiTianGameDataDTO gamesDataDTO : gameList.getData()) { - /* GamePlatform gamePlatform = GamePlatform.builder() - .platformType(MeiTianGameType.findSystemByCode(gamesDataDTO.getGameCategoryId())) - .platformCode(GamePlatforms.MT.getCode()) - .build(); - List gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform); - //没有此平台就新增一个平台 - if (CollectionUtils.isEmpty(gamePlatforms)) { - gamePlatform.setPlatformName(GamePlatforms.MT.getInfo() + MeiTianGameType.findInfoByCode(gamesDataDTO.getGameCategoryId())); - gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1); - gamePlatform.setCreateBy(Constants.SYSTEM); - gamePlatformService.insertGamePlatform(gamePlatform); - } else { - gamePlatform = gamePlatforms.get(0); - }*/ Integer platformType = MeiTianGameType.findSystemByCode(gamesDataDTO.getGameCategoryId()); Game game = Game.builder() - //.platformId(gamePlatform.getId()) .platformCode(GamePlatforms.MT.getCode()) .platformType(platformType) .gameCode(String.valueOf(gamesDataDTO.getGameId())) @@ -248,7 +236,7 @@ public class MeiTianGameServiceImpl implements IGamesService { game.setCreateBy(Constants.SYSTEM); game.setPlatformType(platformType); game.setPlatformCode(GamePlatforms.MT.getCode()); - + game.setGameId(StringUtils.addSuffix(GamePlatforms.MT.getCode(), gamesDataDTO.getGameId())); List nameInfos = new ArrayList<>(); nameInfos.add(new NameInfo(gamesDataDTO.getCnName(), "zh-CN")); nameInfos.add(new NameInfo(gamesDataDTO.getEnName(), "en-US")); @@ -259,22 +247,6 @@ public class MeiTianGameServiceImpl implements IGamesService { } gamesDataDTO.setSystemGameId(game.getId()); - /*List gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(game.getGameName()).build()); - if (CollectionUtils.isEmpty(gameNames)) { - gameNameService.insertGameName(GameName.builder() - .gameId(game.getId()) - .gameName(game.getGameName()) - .langCode("zh-CN") - .createBy(Constants.SYSTEM) - .build()); - gameNameService.insertGameName(GameName.builder() - .gameId(game.getId()) - .gameName(gamesDataDTO.getEnName()) - .langCode("en-US") - .createBy(Constants.SYSTEM) - .build()); - }*/ - } redisCache.deleteObject(CacheConstants.MeiTian_GAMES); @@ -293,9 +265,6 @@ public class MeiTianGameServiceImpl implements IGamesService { @Override @Transactional public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { -// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .code(exchangeTransferMoneyRequestDTO.getAgentId()) -// .currency(exchangeTransferMoneyRequestDTO.getCurrency()).build()); Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); String transactionId = GamePlatforms.MT.getCode() + IdUtils.simpleUUID(); @@ -323,15 +292,25 @@ public class MeiTianGameServiceImpl implements IGamesService { .platformCode(GamePlatforms.MT.getCode()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); - //接口限制限制50字符 - exchangeMoney.setTransactionId(transactionId); + exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue()); + exchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); - -// String key = gameSecretKey.getKey(); String key = exchangeTransferMoneyRequestDTO.getAgentKey(); String merchantId = exchangeTransferMoneyRequestDTO.getAgentId(); String playerName = exchangeTransferMoneyRequestDTO.getAccount(); String coins = exchangeTransferMoneyRequestDTO.getAmount().setScale(4, RoundingMode.DOWN).toString(); + if (exchangeTransferMoneyRequestDTO.getTransferType().equals(TransferType.ALL.getCode())){ + MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder() + .accounts(member.getGameAccount()) + .agentId(exchangeTransferMoneyRequestDTO.getAgentId()) + .currency(exchangeTransferMoneyRequestDTO.getCurrency()) + .agentKey(exchangeTransferMoneyRequestDTO.getAgentKey()) + .build(); + coins = this.getMemberInfo(gamesBaseRequestDTO).getBalance().setScale(4, RoundingMode.DOWN).toString(); + } + Map rawMap = new LinkedHashMap<>(); rawMap.put("merchantId", merchantId); rawMap.put("playerName", playerName); @@ -362,16 +341,21 @@ public class MeiTianGameServiceImpl implements IGamesService { //判断是否转移成功 if (this.isSuccess(exchangeMoneyResponse.getErrorCode())) { //更新数据 - exchangeMoney.setBalance(exchangeMoneyResponse.getBalance()); - BigDecimal transAmount = exchangeTransferMoneyRequestDTO.getAmount(); + BigDecimal transAmount =new BigDecimal(coins); + exchangeMoney.setBalance(transAmount); + exchangeMoney.setCoinBefore(exchangeMoneyResponse.getBalance().subtract(transAmount)); exchangeMoney.setCoinAfter(exchangeMoneyResponse.getBalance()); exchangeMoney.setCurrencyBefore(exchangeMoneyResponse.getBalance().subtract(transAmount)); exchangeMoney.setCurrencyAfter(exchangeMoneyResponse.getBalance()); - exchangeMoney.setStatus(1); // SUCCESS - gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); } else { + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); throw new BaseException(MeiTianExchangeMoneyResponseDTO.TransferIn.get(exchangeMoneyResponse.getErrorCode()).getMessage()); } @@ -390,15 +374,20 @@ public class MeiTianGameServiceImpl implements IGamesService { //判断是否转移成功 if (this.isSuccess(exchangeMoneyResponse.getErrorCode())) { //更新数据 - exchangeMoney.setBalance(exchangeMoneyResponse.getBalance()); - BigDecimal transAmount = exchangeTransferMoneyRequestDTO.getAmount(); + BigDecimal transAmount =new BigDecimal(coins); + exchangeMoney.setBalance(transAmount); + exchangeMoney.setCoinBefore(exchangeMoneyResponse.getBalance().add(transAmount)); exchangeMoney.setCoinAfter(exchangeMoneyResponse.getBalance()); exchangeMoney.setCurrencyBefore(exchangeMoneyResponse.getBalance().add(transAmount)); exchangeMoney.setCurrencyAfter(exchangeMoneyResponse.getBalance()); - exchangeMoney.setStatus(1); // SUCCESS - gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); } else { + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); throw new BaseException(MeiTianExchangeMoneyResponseDTO.TransferOut.get(exchangeMoneyResponse.getErrorCode()).getMessage()); } } @@ -412,8 +401,30 @@ public class MeiTianGameServiceImpl implements IGamesService { * @return {@link Boolean } */ @Override - public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { - return Boolean.TRUE; + public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + log.info("MeiTianGameServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO); + + + String merchantId = exchangeTransferMoneyRequestDTO.getAgentId(); + String playerName = exchangeTransferMoneyRequestDTO.getAccount(); + + MeiTianBalanceTransferStatusResponseDTO meiTianBalanceTransferStatusResponseDTO = meiTianClient.exchangeTransferStatus( + playerName, + merchantId, + exchangeTransferMoneyRequestDTO.getOrderId() + ); + Integer status = StatusType.IN_PROGRESS.getValue(); + if (this.isSuccess(meiTianBalanceTransferStatusResponseDTO.getResultCode())&& "1".equals(meiTianBalanceTransferStatusResponseDTO.getStatus())) { + status = StatusType.SUCCESS.getValue(); + } else { + status = StatusType.FAILURE.getValue(); + } + return ExchangeTransferStatusResponseDTO.builder() + .statusType(status) + .balance(meiTianBalanceTransferStatusResponseDTO.getTransCoins()) + .coinBefore(NumberUtil.sub(meiTianBalanceTransferStatusResponseDTO.getTransCoins(), meiTianBalanceTransferStatusResponseDTO.getCurBalance()).abs()) + .coinAfter(meiTianBalanceTransferStatusResponseDTO.getCurBalance()) + .build(); } diff --git a/ff-game/src/main/java/com/ff/game/api/ng/address/MyNGAddressSource.java b/ff-game/src/main/java/com/ff/game/api/ng/address/MyNGAddressSource.java index c1b3d32..3a6b35a 100644 --- a/ff-game/src/main/java/com/ff/game/api/ng/address/MyNGAddressSource.java +++ b/ff-game/src/main/java/com/ff/game/api/ng/address/MyNGAddressSource.java @@ -18,7 +18,6 @@ public class MyNGAddressSource implements AddressSource { @Override public ForestAddress getAddress(ForestRequest request) { - //String apiBaseUrl = configService.selectConfigByKey(Constants.NG_API_BASE_URL); String apiBaseUrl = platformService.get(GamePlatforms.PG.getCode()) .getUrlInfo().getUrl(); return new ForestAddress("https", apiBaseUrl, 443, "api"); diff --git a/ff-game/src/main/java/com/ff/game/api/ng/service/impl/GamesPGServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/ng/service/impl/GamesPGServiceImpl.java index 861735d..c1b9208 100644 --- a/ff-game/src/main/java/com/ff/game/api/ng/service/impl/GamesPGServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/ng/service/impl/GamesPGServiceImpl.java @@ -232,23 +232,8 @@ public class GamesPGServiceImpl implements IGamesService { ApiNGResponseDTO> gameList = ngClient.getGameList(paramsMap, headerMap); if (this.getIsSuccess(gameList.getCode())) { for (ApiGameInfoResponseDTO apiGameInfoResponseDTO : gameList.getData()) { - /*GamePlatform gamePlatform = GamePlatform.builder() - .platformType(NGGameType.findSystemByCode(apiGameInfoResponseDTO.getGameType())) - .platformCode(GamePlatforms.PG.getCode()) - .build(); - List gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform); - //没有此平台就新增一个平台 - if (CollectionUtils.isEmpty(gamePlatforms)) { - gamePlatform.setPlatformName(GamePlatforms.PG.getInfo() + NGGameType.findInfoByCode(apiGameInfoResponseDTO.getGameType())); - gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1); - gamePlatform.setCreateBy(Constants.SYSTEM); - gamePlatformService.insertGamePlatform(gamePlatform); - } else { - gamePlatform = gamePlatforms.get(0); - }*/ Integer platformType = NGGameType.findSystemByCode(apiGameInfoResponseDTO.getGameType()); Game game = Game.builder() -// .platformId(gamePlatform.getId()) .platformCode(GamePlatforms.PG.getCode()) .platformType(platformType) .gameCode(apiGameInfoResponseDTO.getGameCode()) @@ -264,6 +249,7 @@ public class GamesPGServiceImpl implements IGamesService { game.setCreateBy(Constants.SYSTEM); game.setPlatformCode(GamePlatforms.PG.getCode()); game.setPlatformType(platformType); + game.setGameId(StringUtils.addSuffix(GamePlatforms.PG.getCode(), apiGameInfoResponseDTO.getGameCode())); List nameInfos = new ArrayList<>(); nameInfos.add(new NameInfo(apiGameInfoResponseDTO.getGameName().get("zh-hans"), "zh-CN")); nameInfos.add(new NameInfo(apiGameInfoResponseDTO.getGameName().get("zh-hant"), "zh-TW")); @@ -274,32 +260,6 @@ public class GamesPGServiceImpl implements IGamesService { game = games.get(0); } apiGameInfoResponseDTO.setSystemGameId(game.getId()); - /*Map gameName = apiGameInfoResponseDTO.getGameName(); - for (String key : gameName.keySet()) { - String name = gameName.get(key); - List gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(name).build()); - if (CollectionUtils.isEmpty(gameNames)) { - if ("zh-hans".equals(key)) { - gameNameService.insertGameName(GameName.builder() - .gameId(game.getId()) - .gameName(name) - .langCode("zh-CN") - .createBy(Constants.SYSTEM) - .build()); - } else if (!"zh-hant".equals(key)) { - GameSecretKeyLangDTO gameSecretKeyLangDTO = gameSecretKeyLangService.findGameSecretKeyLangDTO(GameSecretKeyLangDTO.builder() - .platformCode(GamePlatforms.PG.getCode()) - .lang(key) - .build()); - gameNameService.insertGameName(GameName.builder() - .gameId(game.getId()) - .gameName(name) - .langCode(gameSecretKeyLangDTO.getSystemLangCode()) - .createBy(Constants.SYSTEM) - .build()); - } - } - }*/ } @@ -324,11 +284,6 @@ public class GamesPGServiceImpl implements IGamesService { public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { log.info("GamesNGServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); -// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(GamePlatforms.PG.getCode()) -// .code(exchangeTransferMoneyRequestDTO.getAgentId()) -// .currency(exchangeTransferMoneyRequestDTO.getCurrency()) -// .build()); Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); String transactionId = gameExchangeMoneyService.getTransactionId(GamePlatforms.PG.getCode(), 32); @@ -354,6 +309,11 @@ public class GamesPGServiceImpl implements IGamesService { .platformCode(GamePlatforms.PG.getCode()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); + exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue()); + exchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + //获取余额 String type = TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType()) ? NGTransferType.TRANSFER_OUT.getValue() : NGTransferType.TRANSFER_IN.getValue(); @@ -385,16 +345,13 @@ public class GamesPGServiceImpl implements IGamesService { if (this.getIsSuccess(apiNGResponseDTO.getCode())) { //更新数据 exchangeMoney.setBalance(exchangeTransferMoneyRequestDTO.getAmount()); - exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue()); - gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); - ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO(); - exchangeTransferStatusRequestDTO.setAccount(exchangeTransferMoneyRequestDTO.getAccount()); - exchangeTransferStatusRequestDTO.setCurrency(exchangeTransferMoneyRequestDTO.getCurrency()); - exchangeTransferStatusRequestDTO.setOrderId(transactionId); - exchangeTransferStatusRequestDTO.setAgentId(exchangeTransferMoneyRequestDTO.getAgentId()); - exchangeTransferStatusRequestDTO.setAgentKey(exchangeTransferMoneyRequestDTO.getAgentKey()); - this.exchangeTransferStatus(exchangeTransferStatusRequestDTO); + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); } else { + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); log.error("GamesPGServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{},错误信息{}", apiNGResponseDTO.getCode(), apiNGResponseDTO.getMsg()); throw new BaseException(apiNGResponseDTO.getMsg()); } @@ -408,7 +365,7 @@ public class GamesPGServiceImpl implements IGamesService { * @return {@link Boolean } */ @Override - public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { Map paramsMap = new HashMap<>(); @@ -417,32 +374,24 @@ public class GamesPGServiceImpl implements IGamesService { paramsMap.put("orderId", exchangeTransferMoneyRequestDTO.getOrderId()); Map key = this.getKey(exchangeTransferMoneyRequestDTO); ApiNGResponseDTO apiNGResponseDTO = ngClient.exchangeTransferStatus(paramsMap, key); + Integer status = StatusType.IN_PROGRESS.getValue(); if (this.getIsSuccess(apiNGResponseDTO.getCode())) { - ApiExchangeTransferStatusResponseDTO apiNGResponseDTOData = apiNGResponseDTO.getData(); - List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( - GameExchangeMoney.builder() - .platformCode(GamePlatforms.PG.getCode()) - .transactionId(exchangeTransferMoneyRequestDTO.getOrderId()) - .build() - ); - - for (GameExchangeMoney exchangeMoney : gameExchangeMonies) { - //更新数据 - exchangeMoney.setBalance(apiNGResponseDTOData.getAmount().abs()); - exchangeMoney.setCoinBefore(NumberUtil.sub(apiNGResponseDTOData.getAfterBalance(), apiNGResponseDTOData.getAmount())); - exchangeMoney.setCoinAfter(apiNGResponseDTOData.getAfterBalance()); - exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore()); - exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter()); - exchangeMoney.setStatus(apiNGResponseDTOData.getStatus()); - gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); - } - return Boolean.TRUE; + status = StatusType.SUCCESS.getValue(); } else { - log.error("GamesPGServiceImpl [exchangeTransferStatus]错误代码{},错误信息{}", apiNGResponseDTO.getCode(), apiNGResponseDTO.getMsg()); - return Boolean.FALSE; + status = StatusType.FAILURE.getValue(); + } + ExchangeTransferStatusResponseDTO transferStatusResponseDTO = ExchangeTransferStatusResponseDTO.builder() + .statusType(status) + .build(); + ApiExchangeTransferStatusResponseDTO apiNGResponseDTOData = apiNGResponseDTO.getData(); + if (!ObjectUtils.isEmpty(apiNGResponseDTOData)) { + transferStatusResponseDTO.setBalance(apiNGResponseDTOData.getAmount()); + transferStatusResponseDTO.setCoinBefore(NumberUtil.sub(apiNGResponseDTOData.getAmount(), apiNGResponseDTOData.getAfterBalance()).abs()); + transferStatusResponseDTO.setCoinAfter(apiNGResponseDTOData.getAfterBalance()); } + return transferStatusResponseDTO; } @@ -455,14 +404,6 @@ public class GamesPGServiceImpl implements IGamesService { @Override public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { -// GameSecretKeyCurrencyDTO gameSecretKeyDTO = new GameSecretKeyCurrencyDTO(); -// gameSecretKeyDTO.setPlatformCodes(NGPlatforms.getAllPlatforms()); -// List currencyDTOList = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(gameSecretKeyDTO); -// List currencys = currencyDTOList.stream() -// .map(GameSecretKeyCurrencyDTO::getCurrency) -// .distinct() -// .collect(Collectors.toList()); - Platform platform = betRecordByTimeDTO.getVendor(); Set cacheSet = redisCache.getCacheSet(CacheConstants.PG_GAMES_BET_CURRENCY); @@ -480,14 +421,7 @@ public class GamesPGServiceImpl implements IGamesService { String firstCurrency = currencys.get(0); -// GameSecretKeyCurrencyDTO currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(GamePlatforms.PG.getCode()) -// .currency(firstCurrency) -// .build()); - -// betRecordByTimeDTO.setAgentId(currencyDTO.getCode()); -// betRecordByTimeDTO.setAgentKey(currencyDTO.getKey()); int pageNo = 1; int pageSize = 2000; Map paramsMap = new HashMap<>(); @@ -753,10 +687,6 @@ public class GamesPGServiceImpl implements IGamesService { return null; } Game gamesDataDTO = games.get(0); -// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCodes(NGPlatforms.getAllPlatforms()) -// .currency(resultBean.getCurrency()) -// .build()); Member member = memberService.selectMemberByGameAccount(resultBean.getPlayerId()); if (ObjectUtils.isEmpty(member)) { diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/address/MyPGTAddressSource.java b/ff-game/src/main/java/com/ff/game/api/pgt/address/MyPGTAddressSource.java index be49b4c..f8e4654 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/address/MyPGTAddressSource.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/address/MyPGTAddressSource.java @@ -4,7 +4,9 @@ import com.dtflys.forest.callback.AddressSource; import com.dtflys.forest.http.ForestAddress; import com.dtflys.forest.http.ForestRequest; import com.ff.base.constant.Constants; +import com.ff.base.enums.GamePlatforms; import com.ff.base.system.service.ISysConfigService; +import com.ff.game.service.IPlatformService; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -18,13 +20,16 @@ import javax.annotation.Resource; */ @Component public class MyPGTAddressSource implements AddressSource { - + @Resource + private IPlatformService platformService; @Resource private ISysConfigService configService; @Override public ForestAddress getAddress(ForestRequest request) { - return new ForestAddress("https","test.ambsuperapi.com", 443,""); + String apiBaseUrl = platformService.get(GamePlatforms.PGT.getCode()) + .getUrlInfo().getUrl(); + return new ForestAddress("https",apiBaseUrl, 443,""); } } \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java b/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java index 186d702..14952d5 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java @@ -64,8 +64,8 @@ public interface PGTClient { * @param headerMap 标题映射 * @return {@link PGTGameListResponse } */ - @Get("/GetGameIconList") - PGTGameListResponse getGameList(@JSONBody Map parameters, @Header Map headerMap); + @Get("/games?${parameters}") + PGTGameListResponse getGameList(@Var("parameters") String parameters, @Header Map headerMap); /** @@ -111,6 +111,15 @@ public interface PGTClient { PGTTransactionDetailsResponse getBetRecordByTime(@Var("parameters") String parameters, @Header Map headerMap); + /** + * 投注交易回放 + * + * @param parameters 范围 + * @param headerMap 标题映射 + * @return {@link PGTReplayUrlResponseDTO } + */ + @Get(url = "/betTransactionReplay?{parameters}") + PGTReplayUrlResponseDTO betTransactionReplay(@Var("parameters") String parameters, @Header Map headerMap); diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTReplayUrlResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTReplayUrlResponseDTO.java new file mode 100644 index 0000000..1389e4f --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTReplayUrlResponseDTO.java @@ -0,0 +1,50 @@ +package com.ff.game.api.pgt.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * pgtreplay url响应dto + * + * @author shi + * @date 2025/04/08 + */ +@Data +public class PGTReplayUrlResponseDTO { + /** + * 请求 ID + */ + @JsonProperty("reqId") + private String reqId; + + /** + * 响应代码,0 表示成功 + */ + @JsonProperty("code") + private int code; + + /** + * 响应消息,描述请求的状态 + */ + @JsonProperty("message") + private String message; + + /** + * 数据,包含重播 URL 信息 + */ + @JsonProperty("data") + private Datas data; + + /** + * 内部数据类,包含重播 URL + */ + @Data + public static class Datas { + + /** + * 重播链接 + */ + @JsonProperty("url") + private String url; + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTTransactionResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTTransactionResponse.java index d0776f9..d794122 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTTransactionResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTTransactionResponse.java @@ -3,6 +3,8 @@ package com.ff.game.api.pgt.dto; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; +import java.math.BigDecimal; + /** * pgtt交易响应 * @@ -73,18 +75,18 @@ public class PGTTransactionResponse { * 当前交易的金额 */ @JsonProperty("amount") - private String amount; + private BigDecimal amount; /** * 交易前的余额 */ @JsonProperty("beforeBalance") - private String beforeBalance; + private BigDecimal beforeBalance; /** * 交易后的余额 */ @JsonProperty("afterBalance") - private String afterBalance; + private BigDecimal afterBalance; } } diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java index 4deda5f..02f89a9 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java @@ -13,6 +13,7 @@ import com.ff.base.exception.base.BaseException; import com.ff.base.system.service.ISysConfigService; import com.ff.base.utils.DateUtils; import com.ff.base.utils.JsonUtil; +import com.ff.base.utils.StringUtils; import com.ff.base.utils.sign.Base64; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; @@ -24,6 +25,7 @@ import com.ff.game.api.request.*; import com.ff.game.api.xk.dto.XKBetRecordResponseDTO; import com.ff.game.api.xk.dto.XKGamesDTO; import com.ff.game.domain.*; +import com.ff.game.dto.GameBettingDetailsDTO; import com.ff.game.service.*; import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; @@ -37,6 +39,7 @@ import org.springframework.util.ObjectUtils; import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.RoundingMode; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.TimeUnit; @@ -64,9 +67,6 @@ public class GamesPGTServiceImpl implements IGamesService { private IGameExchangeMoneyService gameExchangeMoneyService; - - - @Resource private IGameService gameService; @@ -89,6 +89,8 @@ public class GamesPGTServiceImpl implements IGamesService { private IGameBettingDetailsService gameBettingDetailsService; + String productId = "PGSOFT"; + /** * 获得就是成功 * @@ -115,7 +117,6 @@ public class GamesPGTServiceImpl implements IGamesService { return headerMap; } - String productId = "PGSOFT"; /** * 创建成员 @@ -211,7 +212,7 @@ public class GamesPGTServiceImpl implements IGamesService { log.info("GamesPGTServiceImpl [getGameList] 请求参数 {}", gamesBaseRequestDTO); Map paramsMap = new HashMap<>(); paramsMap.put("productId", productId); - PGTGameListResponse gameList = pgtClient.getGameList(paramsMap, this.getKey(gamesBaseRequestDTO)); + PGTGameListResponse gameList = pgtClient.getGameList(JsonUtil.mapToQueryString(paramsMap), this.getKey(gamesBaseRequestDTO)); if (this.getIsSuccess(gameList.getCode())) { @@ -233,13 +234,11 @@ public class GamesPGTServiceImpl implements IGamesService { game.setPlatformCode(GamePlatforms.PGT.getCode()); game.setPlatformType(platformType); game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.PGT.getCode()) + 1); - game.setGameName(gameIdKey.getLocale().getCn()); + game.setGameName(gameIdKey.getName()); game.setCreateBy(Constants.SYSTEM); - + game.setGameId(StringUtils.addSuffix(GamePlatforms.PGT.getCode(), gameIdKey.getCode())); List nameInfos = new ArrayList<>(); - nameInfos.add(NameInfo.builder().lang("zh-CN").name(gameIdKey.getLocale().getCn()).build()); - nameInfos.add(NameInfo.builder().lang("en-US").name(gameIdKey.getLocale().getEn()).build()); - nameInfos.add(NameInfo.builder().lang("th-TH").name(gameIdKey.getLocale().getTh()).build()); + nameInfos.add(NameInfo.builder().lang("en-US").name(gameIdKey.getName()).build()); game.setNameInfo(nameInfos); gameService.insertGame(game); } else { @@ -297,7 +296,10 @@ public class GamesPGTServiceImpl implements IGamesService { .platformCode(GamePlatforms.PGT.getInfo()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); - + exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue()); + exchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); BigDecimal amount = exchangeTransferMoneyRequestDTO.getAmount(); BigDecimal amountBefore = BigDecimal.ZERO; @@ -319,7 +321,7 @@ public class GamesPGTServiceImpl implements IGamesService { Map paramsMap = new LinkedHashMap<>(); paramsMap.put("username", exchangeTransferMoneyRequestDTO.getAccount()); - paramsMap.put("amount", amount); + paramsMap.put("amount", amount.setScale(2, RoundingMode.DOWN).toString()); paramsMap.put("transactionRef", transactionId); paramsMap.put("productId", productId); Map key = this.getKey(exchangeTransferMoneyRequestDTO); @@ -339,17 +341,14 @@ public class GamesPGTServiceImpl implements IGamesService { exchangeMoney.setCoinAfter(data.getBalance()); exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore()); exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter()); - exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue()); - gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); - //查询交易状态 - ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO(); - exchangeTransferStatusRequestDTO.setAccount(exchangeTransferMoneyRequestDTO.getAccount()); - exchangeTransferStatusRequestDTO.setCurrency(currency); - exchangeTransferStatusRequestDTO.setOrderId(transactionId); - exchangeTransferStatusRequestDTO.setAgentId(exchangeTransferMoneyRequestDTO.getAgentId()); - exchangeTransferStatusRequestDTO.setAgentKey(exchangeTransferMoneyRequestDTO.getAgentKey()); - this.exchangeTransferStatus(exchangeTransferStatusRequestDTO); + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); + } else { + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); log.error("GamesPGTServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{}", errorResponse.getCode()); throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); } @@ -363,7 +362,7 @@ public class GamesPGTServiceImpl implements IGamesService { * @return {@link Boolean } */ @Override - public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { log.info("GamesPGTServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO); GameExchangeMoney gameExchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeMoneyId()); Map paramsMap = new LinkedHashMap<>(); @@ -377,24 +376,21 @@ public class GamesPGTServiceImpl implements IGamesService { } Map key = this.getKey(exchangeTransferMoneyRequestDTO); PGTTransactionResponse transactionResponse = pgtClient.exchangeTransferStatus(paramsMap, key); + Integer status = StatusType.IN_PROGRESS.getValue(); if (this.getIsSuccess(transactionResponse.getCode())) { - List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( - GameExchangeMoney.builder() - .platformCode(GamePlatforms.PGT.getCode()) - .transactionId(exchangeTransferMoneyRequestDTO.getOrderId()) - .build() - ); - - for (GameExchangeMoney exchangeMoney : gameExchangeMonies) { - //更新数据 - exchangeMoney.setStatus(transactionResponse.getData().isSuccess() ? StatusType.SUCCESS.getValue() : StatusType.FAILURE.getValue()); - gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); - } - return Boolean.TRUE; + status = transactionResponse.getData().isSuccess() ? StatusType.SUCCESS.getValue() : StatusType.FAILURE.getValue(); } else { - log.error("GamesPGTServiceImpl [exchangeTransferStatus]错误代码{},错误信息{}", transactionResponse.getCode(), transactionResponse.getMessage()); - return Boolean.FALSE; + status = StatusType.FAILURE.getValue(); } + ExchangeTransferStatusResponseDTO transferStatusResponseDTO = ExchangeTransferStatusResponseDTO.builder() + .statusType(status) + .build(); + if (!ObjectUtils.isEmpty(transactionResponse.getData())) { + transferStatusResponseDTO.setBalance(transactionResponse.getData().getAmount()); + transferStatusResponseDTO.setCoinBefore(transactionResponse.getData().getBeforeBalance()); + transferStatusResponseDTO.setCoinAfter(transactionResponse.getData().getAfterBalance()); + } + return transferStatusResponseDTO; } @@ -409,8 +405,8 @@ public class GamesPGTServiceImpl implements IGamesService { //请求参数 log.info("GamesPGTServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO); - String startTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT_Z, "GMT+8"); - String endTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT_Z, "GMT+8"); + String startTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT_Z, "GMT+0"); + String endTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT_Z, "GMT+0"); String nextId = redisCache.getCacheObject(CacheConstants.PGT_NEXT_ID); @@ -444,7 +440,34 @@ public class GamesPGTServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { - throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + //请求参数 + log.info("GamesPGTServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO); + + String startTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT_Z, "GMT+0"); + String endTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT_Z, "GMT+0"); + + String nextId = redisCache.getCacheObject(CacheConstants.PGT_NEXT_ID); + + + Map paramsMap = new LinkedHashMap<>(); + paramsMap.put("productId", productId); + paramsMap.put("startTime", startTime); + paramsMap.put("endTime", endTime); + paramsMap.put("nextId", nextId); + Map key = this.getKey(betRecordByTimeDTO); + + PGTTransactionDetailsResponse betRecordByTime = pgtClient.getBetRecordByTime(JsonUtil.mapToQueryString(paramsMap), key); + + if (this.getIsSuccess(betRecordByTime.getCode())) { + List txns = betRecordByTime.getData().getTxns(); + this.batchInsert(txns, betRecordByTimeDTO); + //保存本次请求的id + redisCache.setCacheObject(CacheConstants.PGT_NEXT_ID, betRecordByTime.getData().getNextId()); + return Boolean.TRUE; + } else { + log.error("GamesPGXServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getCode(), betRecordByTime.getMessage()); + throw new BaseException(betRecordByTime.getMessage()); + } } /** @@ -466,7 +489,34 @@ public class GamesPGTServiceImpl implements IGamesService { */ @Override public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) { - throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + //请求参数 + log.info("GamesPGTServiceImpl [getGameDetail] 请求参数 {}", getGameDetailRequestDTO); + + List gameBettingDetails = gameBettingDetailsService.selectGameBettingDetailsList(GameBettingDetailsDTO.builder() + .wagersId(getGameDetailRequestDTO.getWagersId()) + .platformCode(GamePlatforms.PGT.getCode()) + .build()); + if (CollectionUtils.isEmpty(gameBettingDetails)) { + return null; + } + GameBettingDetails bettingDetails = gameBettingDetails.get(0); + + + Map paramsMap = new LinkedHashMap<>(); + paramsMap.put("productId", productId); + paramsMap.put("betId", getGameDetailRequestDTO.getWagersId()); + paramsMap.put("username", bettingDetails.getAccount()); + Map key = this.getKey(getGameDetailRequestDTO); + + PGTReplayUrlResponseDTO pgtReplayUrlResponseDTO = pgtClient.betTransactionReplay(JsonUtil.mapToQueryString(paramsMap), key); + + if (this.getIsSuccess(pgtReplayUrlResponseDTO.getCode())) { + return GetGameDetailResponseDTO.builder() + .url(pgtReplayUrlResponseDTO.getData().getUrl()) + .build(); + } else { + return null; + } } /** @@ -477,18 +527,7 @@ public class GamesPGTServiceImpl implements IGamesService { */ @Override public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) { - log.info("GamesPGTServiceImpl [kickMember] 请求参数 {}", kickMemberRequestDTO); - Map paramsMap = new HashMap<>(); - paramsMap.put("username", kickMemberRequestDTO.getAccount()); - paramsMap.put("productId", productId); - Map key = this.getKey(kickMemberRequestDTO); - - PGTKickMemberResponse pgtKickMemberResponse = pgtClient.kickMember(paramsMap, key); - if (this.getIsSuccess(pgtKickMemberResponse.getCode())&&"SUCCESS".equals(pgtKickMemberResponse.getData().getStatus())) { - return Boolean.TRUE; - } else { - throw new ApiException(ErrorCode.KICK_OUT_AILED.getCode()); - } + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } /** @@ -541,7 +580,7 @@ public class GamesPGTServiceImpl implements IGamesService { * * @param dataBean 数据bean */ - private void batchInsert(List dataBean, GamesBaseRequestDTO gamesBaseRequestDTO) { + private synchronized void batchInsert(List dataBean, GamesBaseRequestDTO gamesBaseRequestDTO) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); @@ -616,11 +655,11 @@ public class GamesPGTServiceImpl implements IGamesService { .account(resultBean.getUsername()) .wagersId(resultBean.getBetId()) .wagersTime(resultBean.getAccountingDate().getTime()) - .betAmount(resultBean.getPayout()) + .betAmount(resultBean.getStake()) .payoffTime(resultBean.getAccountingDate().getTime()) - .payoffAmount(resultBean.getStake()) + .payoffAmount(resultBean.getPayout()) .settlementTime(resultBean.getAccountingDate().getTime()) - .turnover(resultBean.getPayout()) + .turnover(resultBean.getStake()) .orderNo(resultBean.getRoundId()) .settlementStatus(SettlementStatusEnum.COMPLETED.getCode()) .build(); diff --git a/ff-game/src/main/java/com/ff/game/api/pgx/impl/GamesPGXServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/pgx/impl/GamesPGXServiceImpl.java index b8439e5..bf99cec 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgx/impl/GamesPGXServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/pgx/impl/GamesPGXServiceImpl.java @@ -12,6 +12,7 @@ import com.ff.base.exception.base.BaseException; import com.ff.base.system.service.ISysConfigService; import com.ff.base.utils.DateUtils; import com.ff.base.utils.JsonUtil; +import com.ff.base.utils.StringUtils; import com.ff.base.utils.sign.Md5Utils; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; @@ -142,7 +143,6 @@ public class GamesPGXServiceImpl implements IGamesService { @Override public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO memberInfoRequestDTO) { log.info("GamesPGXServiceImpl [getMemberInfo] 请求参数 {}", memberInfoRequestDTO); -// GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(memberInfoRequestDTO.getAgentId()); Map params = new LinkedHashMap<>(); params.put("operatorcode", memberInfoRequestDTO.getAgentId()); KeyInfo keyInfo = memberInfoRequestDTO.getKeyInfo(); @@ -174,7 +174,6 @@ public class GamesPGXServiceImpl implements IGamesService { @Override public String loginWithoutRedirect(GamesLogin gamesLogin) { log.info("GamesPGXServiceImpl [loginWithoutRedirect] 请求参数 {}", gamesLogin); -// GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(gamesLogin.getAgentId()); KeyInfo keyInfo = gamesLogin.getKeyInfo(); Map params = new LinkedHashMap<>(); @@ -213,7 +212,6 @@ public class GamesPGXServiceImpl implements IGamesService { return CacheConstants.PGX_GAMES; } -// GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(gamesBaseRequestDTO.getAgentId()); KeyInfo keyInfo = gamesBaseRequestDTO.getKeyInfo(); Map params = new LinkedHashMap<>(); params.put("operatorcode", gamesBaseRequestDTO.getAgentId()); @@ -230,23 +228,8 @@ public class GamesPGXServiceImpl implements IGamesService { List gameLists = JSON.parseArray(gameList.getGamelist(), PGXGameListResponse.Game.class); for (PGXGameListResponse.Game gamesDataDTO : gameLists) { - /* GamePlatform gamePlatform = GamePlatform.builder() - .platformType(GPXGameType.SL.getSystemCode()) - .platformCode(GamePlatforms.PGX.getInfo()) - .build(); - List gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform); - //没有此平台就新增一个平台 - if (CollectionUtils.isEmpty(gamePlatforms)) { - gamePlatform.setPlatformName(GamePlatforms.PGX.getInfo() + XKGameType.findInfoByCode(GPXGameType.SL.getSystemCode())); - gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1); - gamePlatform.setCreateBy(Constants.SYSTEM); - gamePlatformService.insertGamePlatform(gamePlatform); - } else { - gamePlatform = gamePlatforms.get(0); - }*/ Integer platformType = GPXGameType.findSystemByCode(gamesDataDTO.getGameCode()); Game game = Game.builder() - //.platformId(gamePlatform.getId()) .gameCode(gamesDataDTO.getGameId()) .platformCode(GamePlatforms.PGX.getCode()) .platformType(platformType) @@ -261,24 +244,21 @@ public class GamesPGXServiceImpl implements IGamesService { game.setCreateBy(Constants.SYSTEM); game.setPlatformCode(GamePlatforms.PGX.getCode()); game.setPlatformType(platformType); + game.setGameId(StringUtils.addSuffix(GamePlatforms.PGX.getCode(), gamesDataDTO.getGameId())); List nameInfos = new ArrayList<>(); nameInfos.add(new NameInfo(gamesDataDTO.getGameName(), "en-US")); game.setNameInfo(nameInfos); gameService.insertGame(game); } else { game = games.get(0); + game.setPlatformType(platformType); + game.setGameId(StringUtils.addSuffix(GamePlatforms.PGX.getCode(), gamesDataDTO.getGameId())); + List nameInfos = new ArrayList<>(); + nameInfos.add(new NameInfo(gamesDataDTO.getGameName(), "en-US")); + game.setNameInfo(nameInfos); + gameService.updateGame(game); } gamesDataDTO.setSystemGameId(game.getId()); - /*List gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(game.getGameName()).build()); - if (CollectionUtils.isEmpty(gameNames)) { - gameNameService.insertGameName(GameName.builder() - .gameId(game.getId()) - .gameName(game.getGameName()) - .langCode("en-US") - .createBy(Constants.SYSTEM) - .build()); - }*/ - } @@ -406,7 +386,7 @@ public class GamesPGXServiceImpl implements IGamesService { * @return {@link Boolean } */ @Override - public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { log.info("GamesPGXServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO); Map paramsMap = new LinkedHashMap<>(); paramsMap.put("operatorcode", exchangeTransferMoneyRequestDTO.getAgentId()); @@ -428,10 +408,10 @@ public class GamesPGXServiceImpl implements IGamesService { exchangeMoney.setStatus(PGXTransactionStatus.findValueByCode(exchangeTransferStatusResponse.getStatus())); gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); } - return Boolean.TRUE; + return new ExchangeTransferStatusResponseDTO(); } else { log.error("GamesPGXServiceImpl [exchangeTransferStatus]错误代码{},错误信息{}", exchangeTransferStatusResponse.getErrCode(), exchangeTransferStatusResponse.getErrMsg()); - return Boolean.FALSE; + return new ExchangeTransferStatusResponseDTO(); } } diff --git a/ff-game/src/main/java/com/ff/game/api/request/ExchangeTransferStatusResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/request/ExchangeTransferStatusResponseDTO.java new file mode 100644 index 0000000..7f4a698 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/request/ExchangeTransferStatusResponseDTO.java @@ -0,0 +1,41 @@ +package com.ff.game.api.request; + +import com.ff.base.annotation.Excel; +import com.ff.base.enums.StatusType; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * 交易所转账状态响应数据 + * + * @author shi + * @date 2025/04/08 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ExchangeTransferStatusResponseDTO { + + + /** + * 状态类型 StatusType 枚举 + */ + private Integer statusType; + + + /** 操作金额 */ + private BigDecimal balance; + + /** 转账前金额(游戏币) */ + private BigDecimal coinBefore; + + /** 转账后金额(游戏币) */ + private BigDecimal coinAfter; + + +} diff --git a/ff-game/src/main/java/com/ff/game/api/request/GetGameDetailResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/request/GetGameDetailResponseDTO.java index 373d4ed..b3debb2 100644 --- a/ff-game/src/main/java/com/ff/game/api/request/GetGameDetailResponseDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/request/GetGameDetailResponseDTO.java @@ -1,5 +1,7 @@ package com.ff.game.api.request; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @@ -11,6 +13,8 @@ import lombok.NoArgsConstructor; */ @NoArgsConstructor @Data +@AllArgsConstructor +@Builder public class GetGameDetailResponseDTO { diff --git a/ff-game/src/main/java/com/ff/game/api/sa/impl/GamesSAServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/sa/impl/GamesSAServiceImpl.java index 8ad3da3..779c1b2 100644 --- a/ff-game/src/main/java/com/ff/game/api/sa/impl/GamesSAServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/sa/impl/GamesSAServiceImpl.java @@ -377,7 +377,7 @@ public class GamesSAServiceImpl implements IGamesService { * @return {@link Boolean } */ @Override - public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); } diff --git a/ff-game/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java index cef2595..88d4365 100644 --- a/ff-game/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java @@ -369,8 +369,8 @@ public class GamesXKServiceImpl implements IGamesService { * @return {@link Boolean } */ @Override - public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { - return Boolean.TRUE; + public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + return new ExchangeTransferStatusResponseDTO(); } diff --git a/ff-game/src/main/java/com/ff/game/domain/Game.java b/ff-game/src/main/java/com/ff/game/domain/Game.java index 673c71c..5b65e5b 100644 --- a/ff-game/src/main/java/com/ff/game/domain/Game.java +++ b/ff-game/src/main/java/com/ff/game/domain/Game.java @@ -94,5 +94,13 @@ public class Game extends BaseEntity { */ private Integer platformType; + /** + * 名称信息 + */ private List nameInfo; + + /** + * 游戏id + */ + private String gameId; } diff --git a/ff-game/src/main/java/com/ff/game/domain/GameExchangeMoney.java b/ff-game/src/main/java/com/ff/game/domain/GameExchangeMoney.java index 6721e0b..336dd12 100644 --- a/ff-game/src/main/java/com/ff/game/domain/GameExchangeMoney.java +++ b/ff-game/src/main/java/com/ff/game/domain/GameExchangeMoney.java @@ -90,5 +90,13 @@ public class GameExchangeMoney extends BaseEntity @Excel(name = "状态 1 成功 2失败") private Integer status; + /** + * 步 GameExchangeStep 枚举 + */ + private Integer step; + /** + * 步骤状态 GameExchangeStepStatus 枚举 + */ + private Integer stepStatus; } diff --git a/ff-game/src/main/java/com/ff/game/domain/NameInfo.java b/ff-game/src/main/java/com/ff/game/domain/NameInfo.java index 76c12d8..f5896a9 100644 --- a/ff-game/src/main/java/com/ff/game/domain/NameInfo.java +++ b/ff-game/src/main/java/com/ff/game/domain/NameInfo.java @@ -15,6 +15,12 @@ import java.io.Serializable; @Builder @NoArgsConstructor public class NameInfo implements Serializable { + /** + * 名称 + */ private String name; + /** + * 长 + */ private String lang; } diff --git a/ff-game/src/main/java/com/ff/game/mapper/GameMapper.java b/ff-game/src/main/java/com/ff/game/mapper/GameMapper.java index c6deaeb..09ed960 100644 --- a/ff-game/src/main/java/com/ff/game/mapper/GameMapper.java +++ b/ff-game/src/main/java/com/ff/game/mapper/GameMapper.java @@ -23,6 +23,15 @@ public interface GameMapper { */ Game selectGameById(Long id); + + /** + * 按游戏id选择游戏 + * + * @param gameId 游戏id + * @return {@link Game } + */ + Game selectGameByGameId(String gameId); + /** * 查询平台子游戏管理列表 * diff --git a/ff-game/src/main/java/com/ff/game/service/IGameService.java b/ff-game/src/main/java/com/ff/game/service/IGameService.java index 47d8f05..bab4681 100644 --- a/ff-game/src/main/java/com/ff/game/service/IGameService.java +++ b/ff-game/src/main/java/com/ff/game/service/IGameService.java @@ -22,6 +22,15 @@ public interface IGameService { */ Game selectGameById(Long id); + + /** + * 按游戏id选择游戏 + * + * @param gameId 游戏id + * @return {@link Game } + */ + Game selectGameByGameId(String gameId); + /** * 查询平台子游戏管理列表 * diff --git a/ff-game/src/main/java/com/ff/game/service/impl/GameServiceImpl.java b/ff-game/src/main/java/com/ff/game/service/impl/GameServiceImpl.java index 95df45c..4a1a969 100644 --- a/ff-game/src/main/java/com/ff/game/service/impl/GameServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/service/impl/GameServiceImpl.java @@ -48,6 +48,17 @@ public class GameServiceImpl implements IGameService { return gameMapper.selectGameById(id); } + /** + * 按游戏id选择游戏 + * + * @param gameId 游戏id + * @return {@link Game } + */ + @Override + public Game selectGameByGameId(String gameId) { + return gameMapper.selectGameByGameId(gameId); + } + /** * 查询平台子游戏管理列表 * diff --git a/ff-game/src/main/java/com/ff/member/service/impl/MemberServiceImpl.java b/ff-game/src/main/java/com/ff/member/service/impl/MemberServiceImpl.java index 248cd38..a21b96a 100644 --- a/ff-game/src/main/java/com/ff/member/service/impl/MemberServiceImpl.java +++ b/ff-game/src/main/java/com/ff/member/service/impl/MemberServiceImpl.java @@ -131,7 +131,7 @@ public class MemberServiceImpl implements IMemberService { */ @Override public Member selectMemberByGameAccount(String gameAccount) { - return memberMapper.selectMemberByGameAccount(gameAccount.toLowerCase()); + return memberMapper.selectMemberByGameAccount(gameAccount); } /** diff --git a/ff-game/src/main/java/com/ff/quartz/task/GameTask.java b/ff-game/src/main/java/com/ff/quartz/task/GameTask.java index afd632e..7bcead7 100644 --- a/ff-game/src/main/java/com/ff/quartz/task/GameTask.java +++ b/ff-game/src/main/java/com/ff/quartz/task/GameTask.java @@ -206,9 +206,6 @@ public class GameTask { List gameExchangeMoneyList = gameExchangeMoneyService.selectGameExchangeMoneyList(GameExchangeMoney.builder().status(StatusType.IN_PROGRESS.getValue()).build()); for (GameExchangeMoney exchangeMoney : gameExchangeMoneyList) { try { -// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(exchangeMoney.getPlatformCode()) -// .systemCurrency(exchangeMoney.getCurrencyCode()).build()); Platform platform = platformService.get(exchangeMoney.getPlatformCode()); if (null == platform) { log.error("平台不存在platformCode:{}", exchangeMoney.getPlatformCode()); diff --git a/ff-game/src/main/resources/mapper/game/GameExchangeMoneyMapper.xml b/ff-game/src/main/resources/mapper/game/GameExchangeMoneyMapper.xml index 2783b81..306cb37 100644 --- a/ff-game/src/main/resources/mapper/game/GameExchangeMoneyMapper.xml +++ b/ff-game/src/main/resources/mapper/game/GameExchangeMoneyMapper.xml @@ -23,6 +23,8 @@ + + @@ -48,6 +50,8 @@ + + @@ -69,7 +73,9 @@ create_by, create_time, update_by, - update_time + update_time, + step, + step_status from ff_game_exchange_money @@ -275,6 +281,12 @@ update_time, + + step, + + + step_status, +
@@ -334,6 +346,12 @@ #{updateTime}, + + #{step}, + + + #{stepStatus}, +
@@ -394,6 +412,12 @@ update_time = #{updateTime}, + + step = #{step}, + + + step_status = #{stepStatus}, + where id = #{id} diff --git a/ff-game/src/main/resources/mapper/game/GameMapper.xml b/ff-game/src/main/resources/mapper/game/GameMapper.xml index 3baffbe..48f1b77 100644 --- a/ff-game/src/main/resources/mapper/game/GameMapper.xml +++ b/ff-game/src/main/resources/mapper/game/GameMapper.xml @@ -7,12 +7,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + + + @@ -23,7 +25,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, sort_no, platform_id, game_code,ingress, game_source_type, game_name, freespin, demo_status, stop_status, create_by, create_time, update_by, update_time from ff_game + select id, sort_no, game_code,ingress, game_source_type, game_name, freespin, demo_status, stop_status, create_by, create_time, update_by, update_time, name_info, game_id, platform_code, platform_type from ff_game @@ -33,7 +35,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and sort_no = #{sortNo} - and platform_id = #{platformId} and game_code = #{gameCode} and ingress = #{ingress} and game_source_type = #{gameSourceType} @@ -50,7 +51,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" @@ -93,11 +86,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} + + insert into ff_game id, sort_no, - platform_id, game_code, ingress, game_source_type, @@ -109,10 +106,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" create_time, update_by, update_time, + name_info, + game_id, + platform_code, + platform_type, #{id}, #{sortNo}, - #{platformId}, #{gameCode}, #{ingress}, #{gameSourceType}, @@ -124,6 +124,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{createTime}, #{updateBy}, #{updateTime}, + #{nameInfo, typeHandler=com.ff.base.handler.JsonListHandler,javaType=com.ff.game.domain.NameInfo}, + #{gameId}, + #{platformCode}, + #{platformType}, @@ -131,7 +135,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update ff_game sort_no = #{sortNo}, - platform_id = #{platformId}, game_code = #{gameCode}, ingress = #{ingress}, game_source_type = #{gameSourceType}, @@ -143,6 +146,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" create_time = #{createTime}, update_by = #{updateBy}, update_time = #{updateTime}, + name_info = #{nameInfo, typeHandler=com.ff.base.handler.JsonListHandler,javaType=com.ff.game.domain.NameInfo}, + game_id = #{gameId}, + platform_code = #{platformCode}, + platform_type = #{platformType}, where id = #{id} @@ -159,11 +166,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - + - + + @@ -205,7 +209,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and sort_no = #{sortNo} - and platform_id = #{platformId} and game_code = #{gameCode} and ingress = #{ingress} and game_source_type = #{gameSourceType} From c45f69fcb2cb322b933c7be958c266861b26ce84 Mon Sep 17 00:00:00 2001 From: shi Date: Wed, 9 Apr 2025 09:16:58 +0800 Subject: [PATCH 39/62] =?UTF-8?q?refactor(game):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=88=97=E8=A1=A8=E5=92=8C=E9=87=91=E9=A2=9D?= =?UTF-8?q?=E8=BD=AC=E7=A7=BB=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新了 PGX、SA 和 XK游戏平台的游戏列表获取逻辑- 优化了游戏数据插入和更新的处理流程 - 改进了金额转移的处理方式,增加了状态和步骤记录 -调整了投注记录获取的接口调用方式 - 优化了代码结构,移除了不必要的注释和冗余代码 --- .../com/ff/game/api/pgx/client/PGXClient.java | 8 +- .../PGXExchangeTransferStatusResponse.java | 4 +- .../api/pgx/impl/GamesPGXServiceImpl.java | 77 +++++++--------- .../game/api/sa/impl/GamesSAServiceImpl.java | 87 +++++++++++-------- .../xk/service/impl/GamesXKServiceImpl.java | 26 +----- .../main/java/com/ff/game/domain/UrlInfo.java | 4 + .../java/com/ff/quartz/task/GameTask.java | 3 +- 7 files changed, 94 insertions(+), 115 deletions(-) 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 bf99cec..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 @@ -228,22 +228,22 @@ public class GamesPGXServiceImpl implements IGamesService { List gameLists = JSON.parseArray(gameList.getGamelist(), PGXGameListResponse.Game.class); for (PGXGameListResponse.Game gamesDataDTO : gameLists) { - Integer platformType = GPXGameType.findSystemByCode(gamesDataDTO.getGameCode()); + Game game = Game.builder() .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")); @@ -251,12 +251,6 @@ public class GamesPGXServiceImpl implements IGamesService { gameService.insertGame(game); } else { game = games.get(0); - game.setPlatformType(platformType); - game.setGameId(StringUtils.addSuffix(GamePlatforms.PGX.getCode(), gamesDataDTO.getGameId())); - List nameInfos = new ArrayList<>(); - nameInfos.add(new NameInfo(gamesDataDTO.getGameName(), "en-US")); - game.setNameInfo(nameInfos); - gameService.updateGame(game); } gamesDataDTO.setSystemGameId(game.getId()); @@ -283,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); @@ -299,7 +288,6 @@ public class GamesPGXServiceImpl implements IGamesService { ); Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); -// GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(exchangeTransferMoneyRequestDTO.getAgentId()); //获取下一个自增id GameExchangeMoney exchangeMoney = GameExchangeMoney @@ -315,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(); @@ -326,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(); @@ -363,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()); } @@ -395,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 new ExchangeTransferStatusResponseDTO(); + status= PGXTransactionStatus.findValueByCode(exchangeTransferStatusResponse.getStatus()); } else { - log.error("GamesPGXServiceImpl [exchangeTransferStatus]错误代码{},错误信息{}", exchangeTransferStatusResponse.getErrCode(), exchangeTransferStatusResponse.getErrMsg()); - return new ExchangeTransferStatusResponseDTO(); + status = StatusType.FAILURE.getValue(); } + return ExchangeTransferStatusResponseDTO.builder() + .statusType(status) + .balance(exchangeTransferStatusResponse.getAmount()) + .build(); } @@ -431,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); @@ -458,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); @@ -603,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/sa/impl/GamesSAServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/sa/impl/GamesSAServiceImpl.java index 779c1b2..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()); } @@ -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/xk/service/impl/GamesXKServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java index 88d4365..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); 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/quartz/task/GameTask.java b/ff-game/src/main/java/com/ff/quartz/task/GameTask.java index 7bcead7..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(); From 6e1afc61b0465dd1721bab510e3878b1cc3faac3 Mon Sep 17 00:00:00 2001 From: shi Date: Wed, 9 Apr 2025 09:18:47 +0800 Subject: [PATCH 40/62] =?UTF-8?q?refactor(game):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=88=97=E8=A1=A8=E5=92=8C=E9=87=91=E9=A2=9D?= =?UTF-8?q?=E8=BD=AC=E7=A7=BB=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新了 PGX、SA 和 XK游戏平台的游戏列表获取逻辑- 优化了游戏数据插入和更新的处理流程 - 改进了金额转移的处理方式,增加了状态和步骤记录 -调整了投注记录获取的接口调用方式 - 优化了代码结构,移除了不必要的注释和冗余代码 --- .../java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java | 1 - 1 file changed, 1 deletion(-) 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 c916bb1..3a39919 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 @@ -229,7 +229,6 @@ public class GamesXKServiceImpl implements IGamesService { for (XKGamesDTO.DataBean gamesDataDTO : xkGamesDTO.getData()) { Integer platformType = XKGameType.findSystemByCode(gamesDataDTO.getGameCategoryId()); Game game = Game.builder() - //.platformId(gamePlatform.getId()) .platformCode(GamePlatforms.XK.getCode()) .platformType(platformType) .gameCode(String.valueOf(gamesDataDTO.getGameId())) From 9d88f8e08f52962de43421e100c44c32e0f32852 Mon Sep 17 00:00:00 2001 From: cengy Date: Wed, 9 Apr 2025 11:18:49 +0800 Subject: [PATCH 41/62] =?UTF-8?q?feat(fb-sports):=20=E5=AE=9E=E7=8E=B0=20F?= =?UTF-8?q?B=20=E4=BD=93=E8=82=B2=E6=95=B0=E6=8D=AE=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 FB 体育类型枚举类 FBSportsType - 实现 FB 体育客户端接口,包括获取 token、订单文件列表和订单数据- 重构 FBSportsServiceImpl 类,支持按时间和历史时间获取投注记录 - 优化数据处理逻辑,实现批量插入功能 -移除不必要的定时任务配置 --- .../java/com/ff/base/enums/GamePlatforms.java | 2 + .../sports/fb/impl/FBSportsServiceImpl.java | 57 +++++++++++-------- 2 files changed, 35 insertions(+), 24 deletions(-) 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 89a6973..bbe4be7 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 @@ -15,6 +15,8 @@ public enum GamePlatforms { AE("AE", "AE"), KM("KM", "KM"), PGT("PGT", "PGT"), + FBSports("FBSports", "FB体育"), + SV388("SV388", "SV388"), ; private final String code; diff --git a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java index 8cc5533..01f3dfe 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java +++ b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java @@ -415,36 +415,45 @@ public class FBSportsServiceImpl implements IGamesService { * @return {@link Boolean } */ @Override - public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO requestDTO) { + public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO requestDTO) { GameExchangeMoney gameExchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(requestDTO.getGameExchangeMoneyId()); if (null == gameExchangeMoney) { throw new ApiException(ErrorCode.Transfer_Not_Exist.getCode()); } - if (Objects.equals(gameExchangeMoney.getStatus(), StatusType.SUCCESS.getValue())) { - return Boolean.TRUE; + Integer status = StatusType.IN_PROGRESS.getValue(); + + if (!Objects.equals(gameExchangeMoney.getStatus(), StatusType.SUCCESS.getValue())) { + TransferDetailRequest request = new TransferDetailRequest(); + request.setMerchantUserId(requestDTO.getAccount()); + request.setTransferType(Objects.equals(gameExchangeMoney.getExchangeType(), TransferType.GAMES.getCode()) + ? "IN" : "OUT"); + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + TransferDetailResponse response = fbSportsClient.transferDetail( + request, + sign, + timestamp, + requestDTO.getAgentId() + ); + if (this.isSuccess(response.getCode())) { + status = StatusType.SUCCESS.getValue(); + }else { + status = StatusType.FAILURE.getValue(); + } } - TransferDetailRequest request = new TransferDetailRequest(); - request.setMerchantUserId(requestDTO.getAccount()); - request.setTransferType(Objects.equals(gameExchangeMoney.getExchangeType(), TransferType.GAMES.getCode()) - ? "IN" : "OUT"); - long timestamp = System.currentTimeMillis(); - String jsonBody = request.toJSON(); - String sign = getSign(jsonBody, - requestDTO.getAgentId(), - requestDTO.getAgentKey(), - timestamp - ); - TransferDetailResponse response = fbSportsClient.transferDetail( - request, - sign, - timestamp, - requestDTO.getAgentId() - ); - if (this.isSuccess(response.getCode())) { - return Boolean.TRUE; - } - return Boolean.FALSE; + + return ExchangeTransferStatusResponseDTO.builder() + .statusType(status) + .balance(gameExchangeMoney.getBalance()) + .coinBefore(gameExchangeMoney.getCoinBefore()) + .coinAfter(gameExchangeMoney.getCoinAfter()) + .build(); } From 6410c6bb561887b3a59f8f7d5571a1b6036fc3c5 Mon Sep 17 00:00:00 2001 From: cengy Date: Wed, 9 Apr 2025 15:14:06 +0800 Subject: [PATCH 42/62] =?UTF-8?q?feat(game):=20=E6=B7=BB=E5=8A=A0=20SV388?= =?UTF-8?q?=20=E6=B8=B8=E6=88=8F=E5=B9=B3=E5=8F=B0=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 SV388 游戏平台的 API 客户端和服务实现 - 添加 SV388 相关的 DTO 类和枚举定义 - 实现 SV388 的会员管理、资金转移、投注记录查询等功能 --- .../game/api/sv388/address/SV388Adrress.java | 31 + .../ff/game/api/sv388/client/SV388Client.java | 134 ++++ .../sv388/dto/SV388AETransactionResponse.java | 60 ++ .../api/sv388/dto/SV388BetRecordResponse.java | 186 ++++++ .../SV388ExchangeTransferStatusResponse.java | 56 ++ .../api/sv388/dto/SV388LoginResponse.java | 41 ++ .../sv388/dto/SV388LogoutUserResponse.java | 33 + .../game/api/sv388/dto/SV388MemberInfo.java | 64 ++ .../ff/game/api/sv388/dto/SV388Response.java | 26 + .../api/sv388/impl/SV388GamesServiceImpl.java | 587 ++++++++++++++++++ .../main/java/com/ff/game/domain/ExtInfo.java | 2 + 11 files changed, 1220 insertions(+) create mode 100644 ff-game/src/main/java/com/ff/game/api/sv388/address/SV388Adrress.java create mode 100644 ff-game/src/main/java/com/ff/game/api/sv388/client/SV388Client.java create mode 100644 ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388AETransactionResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388BetRecordResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388ExchangeTransferStatusResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388LoginResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388LogoutUserResponse.java create mode 100644 ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388MemberInfo.java create mode 100644 ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388Response.java create mode 100644 ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java diff --git a/ff-game/src/main/java/com/ff/game/api/sv388/address/SV388Adrress.java b/ff-game/src/main/java/com/ff/game/api/sv388/address/SV388Adrress.java new file mode 100644 index 0000000..4474614 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/sv388/address/SV388Adrress.java @@ -0,0 +1,31 @@ +package com.ff.game.api.sv388.address; + +import com.dtflys.forest.callback.AddressSource; +import com.dtflys.forest.http.ForestAddress; +import com.dtflys.forest.http.ForestRequest; +import com.ff.base.enums.GamePlatforms; +import com.ff.game.service.IPlatformService; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + + +/** + * 我jili address来源 + * + * @author shi + * @date 2025/02/10 + */ +@Component +public class SV388Adrress implements AddressSource { + + @Resource + private IPlatformService platformService; + + @Override + public ForestAddress getAddress(ForestRequest request) { + String apiBaseUrl = platformService.get(GamePlatforms.SV388.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/sv388/client/SV388Client.java b/ff-game/src/main/java/com/ff/game/api/sv388/client/SV388Client.java new file mode 100644 index 0000000..10043a8 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/sv388/client/SV388Client.java @@ -0,0 +1,134 @@ +package com.ff.game.api.sv388.client; + +import com.dtflys.forest.annotation.*; +import com.ff.game.api.jili.dto.JILIExchangeMoneyResponseDTO; +import com.ff.game.api.jili.dto.JILIKickMemberAllDTO; +import com.ff.game.api.jili.dto.JILIKickMemberDTO; +import com.ff.game.api.sv388.address.SV388Adrress; +import com.ff.game.api.sv388.dto.*; +import com.ff.game.api.xk.dto.XKKickMemberAllDTO; +import com.ff.game.api.xk.dto.XKKickMemberDTO; + +import java.util.Map; + +/** + * xk 请求 + * + * @author shi + * @date 2025/02/10 + */ +@Address(source = SV388Adrress.class) +public interface SV388Client { + /** + * 创建成员 + * + * @param params 参数 + * @return {@link String } + */ + @Post(url ="/wallet/createMember", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + SV388Response createMember(@Body Map params); + + /** + * 获取会员信息 + * + * @param params 参数 + * @return {@link SV388MemberInfo } + */ + @Post(url ="/wallet/getBalance", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + SV388MemberInfo getMemberInfo(@Body Map params); + + /** + * 无重定向登录 + * + * @param params 参数 + * @return {@link SV388LoginResponse } + */ + @Post("/wallet/login") + SV388LoginResponse loginWithoutRedirect(@Body Map params); + + + + /** + * 按代理id进行交换转账 + * + * @param params 参数 + * @return {@link JILIExchangeMoneyResponseDTO } + */ + @Post(url ="/wallet/deposit", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + SV388AETransactionResponse deposit(@Body Map params); + + + @Post(url ="/wallet/withdraw", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + SV388AETransactionResponse withdraw(@Body Map params); + + + /** + * 汇兑转移状态 + * + * @param params 参数 + * @return {@link SV388ExchangeTransferStatusResponse } + */ + @Post(url ="/wallet/checkTransferOperation", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + SV388ExchangeTransferStatusResponse exchangeTransferStatus(@Body Map params); + + /** + * 按时间获取投注记录 + * + * @param params 参数 + * @return {@link SV388BetRecordResponse } + */ + @Post(url ="https://tttfetch.apihub55.com/fetch/gzip/getTransactionByUpdateDate", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + SV388BetRecordResponse getBetRecordByTime(@Body Map params); + + /** + * 按时间获取投注历史记录 + * + * @param params 参数 + * @return {@link SV388BetRecordResponse } + */ + @Post(url ="https://tttfetch.apihub55.com/fetch/gzip/getTransactionByTxTime", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + SV388BetRecordResponse getBetHistoryRecordByTime(@Body Map params); + /** + * 踢出队员 + * + * @param params 参数 + * @return {@link JILIKickMemberDTO } + */ + @Post(url ="/wallet/logout", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + XKKickMemberDTO kickMember(@Body Map params); + + /** + * 踢出所有队员 + * + * @param params 参数 + * @return {@link JILIKickMemberAllDTO } + */ + @Get("/kickMemberAll") + XKKickMemberAllDTO kickMemberAll(@JSONBody Map params); + + +} diff --git a/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388AETransactionResponse.java b/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388AETransactionResponse.java new file mode 100644 index 0000000..5e029e0 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388AETransactionResponse.java @@ -0,0 +1,60 @@ +package com.ff.game.api.sv388.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.ZonedDateTime; + +/** + * 电子交易响应 + * + * @author shi + * @date 2025/04/01 + */ +@Data +public class SV388AETransactionResponse { + + /** + * 响应状态 + */ + @JsonProperty("status") + private String status; + + + /** + * 金额 + */ + @JsonProperty("amount") + private BigDecimal amount; + + /** + * 交易方法(如:DEPOSIT, WITHDRAW) + */ + @JsonProperty("method") + private String method; + + /** + * 数据库ID + */ + @JsonProperty("databaseId") + private int databaseId; + + /** + * 当前余额 + */ + @JsonProperty("currentBalance") + private BigDecimal currentBalance; + + /** + * 最后修改时间 + */ + @JsonProperty("lastModified") + private ZonedDateTime lastModified; + + /** + * 交易代码 + */ + @JsonProperty("txCode") + private String txCode; +} diff --git a/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388BetRecordResponse.java b/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388BetRecordResponse.java new file mode 100644 index 0000000..0303e08 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388BetRecordResponse.java @@ -0,0 +1,186 @@ +package com.ff.game.api.sv388.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * sv388记录响应 + * + * @author shi + * @date 2025/04/01 + */ +@Data +public class SV388BetRecordResponse { + + /** + * 状态代码 + */ + @JsonProperty("status") + private Integer status; + + /** + * 描述信息 (String类型) + * "Success" - 请求成功 + * 其他 - 错误信息 + */ + private String desc; + /** + * 交易记录 + */ + @JsonProperty("transactions") + private List transactions; + + @Data + public static class Transaction { + + /** + * 游戏类型 + */ + @JsonProperty("gameType") + private String gameType; + + /** + * 返还金额(包含下注金额) + */ + @JsonProperty("winAmount") + private BigDecimal winAmount; + + /** + * 交易时间 + */ + @JsonProperty("txTime") + private Date txTime; + + /** + * 结算状态 + */ + @JsonProperty("settleStatus") + private Integer settleStatus; + + /** + * 游戏信息 + */ + @JsonProperty("gameInfo") + private String gameInfo; + + /** + * 真实返还金额 + */ + @JsonProperty("realWinAmount") + private BigDecimal realWinAmount; + + /** + * 更新时间 + */ + @JsonProperty("updateTime") + private String updateTime; + + /** + * 真实下注金额 + */ + @JsonProperty("realBetAmount") + private BigDecimal realBetAmount; + + /** + * 用户ID + */ + @JsonProperty("userId") + private String userId; + + /** + * 下注类型 + */ + @JsonProperty("betType") + private String betType; + + /** + * 平台名称 + */ + @JsonProperty("platform") + private String platform; + + /** + * 交易状态 + */ + @JsonProperty("txStatus") + private Integer txStatus; + + /** + * 下注金额 + */ + @JsonProperty("betAmount") + private BigDecimal betAmount; + + /** + * 游戏名称 + */ + @JsonProperty("gameName") + private String gameName; + + /** + * 平台注单号 + */ + @JsonProperty("platformTxId") + private String platformTxId; + + /** + * 下注时间 + */ + @JsonProperty("betTime") + private Date betTime; + + /** + * 平台游戏代码 + */ + @JsonProperty("gameCode") + private String gameCode; + + /** + * 玩家货币代码 + */ + @JsonProperty("currency") + private String currency; + + /** + * 累积奖金的获胜金额 + */ + @JsonProperty("jackpotWinAmount") + private BigDecimal jackpotWinAmount; + + /** + * 累积奖金贡献金额 + */ + @JsonProperty("jackpotBetAmount") + private BigDecimal jackpotBetAmount; + + /** + * 平台有效投注 + */ + @JsonProperty("turnover") + private BigDecimal turnover; + + /** + * 游戏商的回合识别码 + */ + @JsonProperty("roundId") + private String roundId; + + + + /** + * 子注单号 + */ + @JsonProperty("refPlatformTxId") + private String refPlatformTxId; + + /** + * 是否为特殊收费游戏 + */ + @JsonProperty("isPremium") + private Boolean isPremium; + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388ExchangeTransferStatusResponse.java b/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388ExchangeTransferStatusResponse.java new file mode 100644 index 0000000..a773ad1 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388ExchangeTransferStatusResponse.java @@ -0,0 +1,56 @@ +package com.ff.game.api.sv388.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; + + +/** + * aeexchange传输状态响应 + * + * @author shi + * @date 2025/04/01 + */ +@Data +public class SV388ExchangeTransferStatusResponse { + + /** + * 响应状态 + */ + @JsonProperty("status") + private String status; + + /** + * 情境 1:响应 status = 0000 & txStatus = 1 表示存款/提款成功 + * 情境 2:响应 status = 0000 & txStatus = 0 表示存款/提款失败 + * 情境 3:响应 status = 0000 & txStatus = 2 表示存款/提款处理中,可 3 秒后调用 checkTransferOperation API 确认回覆直到 txStatus = 0 或 1 的回覆 + * 情境 4:响应 status = 1017 表示交易不存在 + */ + @JsonProperty("txStatus") + private String txStatus; + + /** + * 当前余额 + */ + @JsonProperty("balance") + private BigDecimal balance; + + /** + * 转账金额 + */ + @JsonProperty("transferAmount") + private BigDecimal transferAmount; + + /** + * 转账类型(如:DEPOSIT 或 WITHDRAW) + */ + @JsonProperty("transferType") + private String transferType; + + /** + * 交易代码 + */ + @JsonProperty("txCode") + private String txCode; +} diff --git a/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388LoginResponse.java b/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388LoginResponse.java new file mode 100644 index 0000000..033abbf --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388LoginResponse.java @@ -0,0 +1,41 @@ +package com.ff.game.api.sv388.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +/** + * aelogin回应 + * + * @author shi + * @date 2025/04/01 + */ +@Data +public class SV388LoginResponse { + /** + * 响应状态 + */ + @JsonProperty("status") + private Integer status; + + + /** + * 描述信息 (String类型) + * "Success" - 请求成功 + * 其他 - 错误信息 + */ + private String desc; + + /** + * 登录 URL + */ + @JsonProperty("url") + private String url; + + /** + * 扩展字段,类型为列表,可以存储多项数据 + */ + @JsonProperty("extension") + private List extension; +} diff --git a/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388LogoutUserResponse.java b/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388LogoutUserResponse.java new file mode 100644 index 0000000..b345034 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388LogoutUserResponse.java @@ -0,0 +1,33 @@ +package com.ff.game.api.sv388.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +/** + * 注销用户响应 + * + * @author shi + * @date 2025/04/01 + */ +@Data +public class SV388LogoutUserResponse { + /** + * 状态代码 + */ + @JsonProperty("status") + private String status; + + /** + * 已注销的用户列表 + */ + @JsonProperty("logoutUsers") + private List logoutUsers; + + /** + * 用户数量 + */ + @JsonProperty("count") + private Integer count; +} diff --git a/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388MemberInfo.java b/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388MemberInfo.java new file mode 100644 index 0000000..f50c61f --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388MemberInfo.java @@ -0,0 +1,64 @@ +package com.ff.game.api.sv388.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * AEMEMBER信息 + * + * @author shi + * @date 2025/03/31 + */ +@Data +public class SV388MemberInfo { + /** + * 响应结果列表,包含用户信息 + */ + @JsonProperty("results") + private List result; + + /** + * 记录数量 + */ + @JsonProperty("count") + private int count; + + /** + * 查询时间 + */ + @JsonProperty("querytime") + private Date queryTime; + + /** + * 响应状态 + */ + @JsonProperty("status") + private Integer status; + + @Data + public static class UserInfo { + + /** + * 用户ID + */ + @JsonProperty("userId") + private String userId; + + /** + * 用户余额 + */ + @JsonProperty("balance") + private BigDecimal balance; + + /** + * 最后修改时间 + */ + @JsonProperty("lastModified") + private Date lastModified; + } + +} diff --git a/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388Response.java b/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388Response.java new file mode 100644 index 0000000..85bc006 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/sv388/dto/SV388Response.java @@ -0,0 +1,26 @@ +package com.ff.game.api.sv388.dto; + +import lombok.Data; + +/** + * 航空响应 + * + * @author shi + * @date 2025/03/28 + */ +@Data +public class SV388Response { + /** + * 状态码 (String类型) + * 0000 - 成功 + * 其他 - 错误状态码 + */ + private String status; + + /** + * 描述信息 (String类型) + * "Success" - 请求成功 + * 其他 - 错误信息 + */ + private String desc; +} diff --git a/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java new file mode 100644 index 0000000..08e19c3 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java @@ -0,0 +1,587 @@ +package com.ff.game.api.sv388.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; +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.utils.DateUtils; +import com.ff.base.utils.JsonUtil; +import com.ff.base.utils.StringUtils; +import com.ff.base.utils.uuid.IdUtils; +import com.ff.game.api.IGamesService; +import com.ff.game.api.request.*; +import com.ff.game.api.sv388.client.SV388Client; +import com.ff.game.api.sv388.dto.*; +import com.ff.game.api.xk.dto.XKKickMemberDTO; +import com.ff.game.domain.*; +import com.ff.game.service.IGameBettingDetailsService; +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 lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + + +/** + * AE 游戏 impl + * + * @author shi + * @date 2024/11/12 + */ +@Service("SV388Service") +@Slf4j +public class SV388GamesServiceImpl implements IGamesService { + + + @Resource + private RedisCache redisCache; + + @Resource + private IGameExchangeMoneyService gameExchangeMoneyService; + + @Resource + private IGameService gameService; + + @Resource + private IMemberService memberService; + + @Resource + private SV388Client sv388Client; + + @Resource + private IGameBettingDetailsService gameBettingDetailsService; + + /** + * 游戏id + */ + private static final Long GAME_ID = 1122L; + + + /** + * 获得就是成功 + * + * @param errorCode 错误代码 + * @return {@link Boolean } + */ + private Boolean getIsSuccess(Integer errorCode) { + return 0 == errorCode; + } + + + /** + * 获取密钥 + * + * @param gamesBaseRequestDTO 游戏请求dto + * @return {@link Map }<{@link String }, {@link Object }> + */ + private Map getKey(GamesBaseRequestDTO gamesBaseRequestDTO) { + Map params = new LinkedHashMap<>(); + params.put("cert", gamesBaseRequestDTO.getAgentKey()); + params.put("agentId", gamesBaseRequestDTO.getAgentId()); + return params; + } + + /** + * 创建成员 + * + * @param createMemberRequestDTO 创建成员请求dto + * @return {@link Boolean } + */ + @Override + public Boolean createMember(CreateMemberRequestDTO createMemberRequestDTO) { + + Platform platform = createMemberRequestDTO.getVendor(); + Object betLimit = platform.getExtInfo().getBetLimit().get(createMemberRequestDTO.getSystemCurrency()); + Map params = this.getKey(createMemberRequestDTO); + params.put("userId", createMemberRequestDTO.getAccount()); + params.put("currency", createMemberRequestDTO.getCurrency()); + params.put("betLimit", JsonUtil.objToString(betLimit)); + SV388Response aeResponse = sv388Client.createMember(params); + String errorCode = aeResponse.getStatus(); + if (this.getIsSuccess(Integer.valueOf(errorCode))) { + return Boolean.TRUE; + } + //判断是否获取成功 + return Boolean.FALSE; + } + + + /** + * 获取会员信息 + * + * @param memberInfoRequestDTO 会员信息请求dto + * @return {@link MemberInfoResponseDTO } + */ + @Override + public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO memberInfoRequestDTO) { + Map params = this.getKey(memberInfoRequestDTO); + params.put("alluser", 0); + params.put("userIds", memberInfoRequestDTO.getAccounts()); + SV388MemberInfo memberInfo = sv388Client.getMemberInfo(params); + //判断是否获取成功 + if (this.getIsSuccess(memberInfo.getStatus())) { + SV388MemberInfo.UserInfo userInfo = memberInfo.getResult().get(0); + return MemberInfoResponseDTO.builder() + .status(GameMemberStatus.UNKNOWN.getCode()) + .balance(userInfo.getBalance()) + .account(memberInfoRequestDTO.getAccounts()) + .build(); + } else { + throw new ApiException(ErrorCode.ERROR.getCode()); + } + } + + /** + * 无重定向登录 + * + * @param gamesLogin 游戏登录 + * @return {@link String } + */ + @Override + public String loginWithoutRedirect(GamesLogin gamesLogin) { + Map params = this.getKey(gamesLogin); + params.put("userId", gamesLogin.getAccount()); + params.put("externalURL", gamesLogin.getHomeUrl()); + params.put("language", gamesLogin.getLang()); + params.put("betLimit", gamesLogin.getBetLimit()); + SV388LoginResponse aeLoginResponse = sv388Client.loginWithoutRedirect(params); + //判断是否获取成功 + if (this.getIsSuccess(aeLoginResponse.getStatus())) { + return aeLoginResponse.getUrl(); + } else { + throw new BaseException(aeLoginResponse.getDesc()); + } + } + + + /** + * 获取游戏列表 + * + * @param gamesBaseRequestDTO 游戏请求dto + * @return {@link String } + */ + @Transactional + @Override + public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) { + int platformType = PlatformType.VIDEO.getCode(); + Game condition = new Game(); + condition.setPlatformCode(GamePlatforms.SV388.getCode()); + condition.setPlatformType(platformType); + List gameList = gameService.selectGameList(condition); + Platform platform = gamesBaseRequestDTO.getVendor(); + //不存在这个游戏 + if (ObjectUtils.isEmpty(gameList)) { + Game game = new Game(); + game.setId(IdUtil.getSnowflakeNextId()); + game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.SV388.getCode()) + 1); + game.setPlatformCode(platform.getPlatformCode()); + game.setPlatformType(platformType); + game.setGameCode("1"); + game.setGameSourceType(String.valueOf(1)); + game.setGameName("SV388真人"); + game.setCreateBy(Constants.SYSTEM); + NameInfo nameInfo = new NameInfo(); + nameInfo.setLang("zh-CN"); + nameInfo.setName("SV388真人"); + game.setNameInfo(Collections.singletonList(nameInfo)); + game.setGameId(StringUtils.addSuffix(GamePlatforms.SV388.getCode(), 1)); + gameService.insertGame(game); + } + return CacheConstants.AE_GAMES; + } + + /** + * 按代理id进行交换转账 + * + * @param exchangeTransferMoneyRequestDTO 外汇转账moeny dto + * @return {@link Long } + */ + @Override + @Transactional + public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { + + Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); + String transactionId = GamePlatforms.SV388.getCode() + IdUtils.simpleUUID(); + 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(exchangeTransferMoneyRequestDTO.getSystemCurrency()) + .memberId(member.getId()) + .transactionId(transactionId) + .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); + SV388AETransactionResponse deposit = null; + try { + if (TransferType.GAMES.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) { + + params.put("userId", exchangeTransferMoneyRequestDTO.getAccount()); + params.put("txCode", transactionId); + params.put("transferAmount", exchangeTransferMoneyRequestDTO.getAmount()); + deposit = sv388Client.deposit(params); + + } else { + params.put("userId", exchangeTransferMoneyRequestDTO.getAccount()); + params.put("txCode", transactionId); + params.put("withdrawType", 1); + deposit = sv388Client.withdraw(params); + } + } 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()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); + } + + return exchangeMoney.getId(); + } + + /** + * 汇兑转移状态 + * + * @param exchangeTransferMoneyRequestDTO 兑换转账请求dto + * @return {@link ExchangeTransferStatusResponseDTO } + */ + @Override + public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + + Map paramsMap = this.getKey(exchangeTransferMoneyRequestDTO); + paramsMap.put("txCode", exchangeTransferMoneyRequestDTO.getOrderId()); + + SV388ExchangeTransferStatusResponse exchangeTransferStatusResponse = sv388Client.exchangeTransferStatus(paramsMap); + Integer status = StatusType.IN_PROGRESS.getValue(); + if ("0000".equals(exchangeTransferStatusResponse.getStatus()) && "1".equals(exchangeTransferStatusResponse.getTxStatus())) { + status = StatusType.SUCCESS.getValue(); + } else if ("0000".equals(exchangeTransferStatusResponse.getStatus()) && "0".equals(exchangeTransferStatusResponse.getTxStatus())) { + status = StatusType.FAILURE.getValue(); + } else if ("1017".equals(exchangeTransferStatusResponse.getStatus())) { + status = StatusType.FAILURE.getValue(); + } + GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeMoneyId()); + //更新 + BigDecimal coinBefore; + if (TransferType.GAMES.getCode().equals(exchangeMoney.getExchangeType())) { + coinBefore = NumberUtil.sub(exchangeTransferStatusResponse.getBalance(), exchangeTransferStatusResponse.getTransferAmount()); + } else { + coinBefore = NumberUtil.add(exchangeTransferStatusResponse.getBalance(), exchangeTransferStatusResponse.getTransferAmount()); + } + + + return ExchangeTransferStatusResponseDTO.builder() + .statusType(status) + .balance(exchangeTransferStatusResponse.getTransferAmount()) + .coinBefore(coinBefore) + .coinAfter(exchangeTransferStatusResponse.getBalance()) + .build(); + } + + + /** + * 按时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link List }<{@link GameBettingDetails }> + */ + @Override + public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { + //请求参数 + Map params = this.getKey(betRecordByTimeDTO); + + String timeFrom = redisCache.getCacheObject(CacheConstants.AE_TIME_FROM); + if (StringUtils.isEmpty(timeFrom)) { + timeFrom = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00"; + } + + + params.put("timeFrom", timeFrom); + params.put("platform", GamePlatforms.SV388.getCode()); + params.put("delayTime", 10000); + SV388BetRecordResponse aeBetRecordResponse = sv388Client.getBetRecordByTime(params); + + //判断是否获取成功 + if (this.getIsSuccess(aeBetRecordResponse.getStatus())) { + //数据组装 + this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO); + return Boolean.TRUE; + } else { + redisCache.deleteObject(CacheConstants.AE_TIME_FROM); + log.error("获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc()); + throw new BaseException(aeBetRecordResponse.getDesc()); + } + + } + + /** + * 按历史时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link Boolean } + */ + @Override + public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { + Map params = this.getKey(betRecordByTimeDTO); + 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"; + + + params.put("startTime", startTime); + params.put("endTime", endTime); + params.put("platform", /*"SEXYBCRT"*/ GamePlatforms.SV388.getCode()); + SV388BetRecordResponse aeBetRecordResponse = sv388Client.getBetHistoryRecordByTime(params); + + //判断是否获取成功 + if (this.getIsSuccess(aeBetRecordResponse.getStatus())) { + //数据组装 + this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO); + return Boolean.TRUE; + } else { + log.error("获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc()); + throw new BaseException(aeBetRecordResponse.getDesc()); + } + } + + /** + * 赠送免费局数 + * + * @param createFreeSpinRequest 创建自由旋转请求 + * @return {@link Boolean } + */ + @Override + public Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + /** + * 获取游戏详细信息 + * + * @param getGameDetailRequestDTO 获取游戏详细信息请求dto + * @return {@link GetGameDetailResponseDTO } + */ + @Override + public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + /** + * 强制会员从游戏注销 + * + * @param kickMemberRequestDTO 踢会员请求dto + * @return {@link Boolean } + */ + @Override + public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) { + log.info("GamesAEServiceImpl [kickMember] 请求参数 {}", kickMemberRequestDTO); + Map params = this.getKey(kickMemberRequestDTO); + params.put("userIds", kickMemberRequestDTO.getAccount()); + XKKickMemberDTO xkKickMemberDTO = sv388Client.kickMember(params); + //判断是否获取成功 + if (this.getIsSuccess(xkKickMemberDTO.getCode())) { + return Boolean.TRUE; + } else { + throw new BaseException(xkKickMemberDTO.getMsg()); + } + } + + /** + * 踢成员全部 + * + * @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 aeBetRecordResponse ae下注记录响应dto + */ + private synchronized void batchInsert(SV388BetRecordResponse aeBetRecordResponse, BetRecordByTimeDTO betRecordByTimeDTO) { + List gameBettingDetails = new ArrayList<>(); + List wagersIds = new ArrayList<>(); + //数据组装 + List dataBean = aeBetRecordResponse.getTransactions(); + + String timeFrom = null; + //数据转化 + for (SV388BetRecordResponse.Transaction bean : dataBean) { + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder() + .platform(betRecordByTimeDTO.getVendor()) + .data(bean).build()); + if (!ObjectUtils.isEmpty(bettingDetails)) { + bettingDetails.setId(IdUtil.getSnowflakeNextId()); + gameBettingDetails.add(bettingDetails); + } + wagersIds.add(bean.getPlatform() + bean.getPlatformTxId()); + timeFrom = bean.getUpdateTime(); + } + if (!CollectionUtils.isEmpty(gameBettingDetails)) { + //查询重复数据id + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.AE.getInfo()); + //用steam流清除list中与wagersIds集合相同的数据 + gameBettingDetails = gameBettingDetails.stream() + .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) + .collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(gameBettingDetails)) { + gameBettingDetailsService.batchInsert(gameBettingDetails); + } + } + if (StringUtils.isEmpty(timeFrom)) { + timeFrom = DateUtils.convertTimestampToFormattedDate(DateUtils.getNowDate(), DateUtils.ISO_8601_FORMAT, "UTC+8") + "+08:00"; + } + redisCache.setCacheObject(CacheConstants.AE_TIME_FROM, timeFrom); + } + + /** + * 数据构建 + * + * @param gamesDataBuildDTO 数据 + * @return {@link GameBettingDetails } + */ + @Override + public GameBettingDetails dataBuild(GamesDataBuildDTO gamesDataBuildDTO) { + //转化类 + SV388BetRecordResponse.Transaction resultBean = (SV388BetRecordResponse.Transaction) gamesDataBuildDTO.getData(); + + + Member member = memberService.selectMemberByGameAccount(resultBean.getUserId()); + if (ObjectUtils.isEmpty(member)) { + return null; + } + + + // 判断输赢 + Integer gameStatus = GameStatus.FLAT.getCode(); + BigDecimal payoffAmount = BigDecimal.ZERO; + if (resultBean.getRealWinAmount().compareTo(resultBean.getRealBetAmount()) > 0) { + gameStatus = GameStatus.WIN.getCode(); + payoffAmount = resultBean.getRealWinAmount().subtract(resultBean.getRealBetAmount()); + } else if (resultBean.getRealWinAmount().compareTo(resultBean.getRealBetAmount()) < 0) { + gameStatus = GameStatus.FAIL.getCode(); + payoffAmount = resultBean.getRealWinAmount().subtract(resultBean.getRealBetAmount()).abs(); + } + + //结算状态 + int settlementStatus = SettlementStatusEnum.REVOKED.getCode(); + if (resultBean.getTxStatus() == 1) { + settlementStatus = SettlementStatusEnum.COMPLETED.getCode(); + } + + //数据构造 + GameBettingDetails gameBettingDetails = GameBettingDetails.builder() + .tenantKey(member.getTenantKey()) + //保存我们的币种id + .currencyCode(gamesDataBuildDTO.getPlatform().getOurCurrency(resultBean.getCurrency())) + .memberId(member.getId()) + .gameCode(resultBean.getGameCode()) + .gameType(PlatformType.VIDEO.getCode()) + .platformCode(GamePlatforms.SV388.getCode()) + .gameId(GAME_ID) + .gameName(resultBean.getGameName()) + .gameStatus(gameStatus) + .gameStatusType(resultBean.getSettleStatus()) + .gameCurrencyCode(resultBean.getCurrency()) + .account(resultBean.getUserId()) + .wagersId(resultBean.getPlatform() + resultBean.getPlatformTxId()) + .wagersTime(resultBean.getBetTime().getTime()) + .betAmount(resultBean.getRealBetAmount()) + .payoffTime(resultBean.getTxTime().getTime()) + .payoffAmount(payoffAmount) + .betContent(resultBean.getGameInfo()) + .settlementTime(resultBean.getTxTime().getTime()) + .turnover(resultBean.getTurnover()) + .orderNo(String.valueOf(resultBean.getRoundId())) + .settlementStatus(settlementStatus) + .build(); + gameBettingDetails.setCreateBy(Constants.SYSTEM); + gameBettingDetails.setCreateTime(DateUtils.getNowDate()); + return gameBettingDetails; + } +} diff --git a/ff-game/src/main/java/com/ff/game/domain/ExtInfo.java b/ff-game/src/main/java/com/ff/game/domain/ExtInfo.java index c86d5f9..da61f05 100644 --- a/ff-game/src/main/java/com/ff/game/domain/ExtInfo.java +++ b/ff-game/src/main/java/com/ff/game/domain/ExtInfo.java @@ -14,6 +14,8 @@ public class ExtInfo implements Serializable { // 币种信息,key为其它平台的币种id,value为我们自己的币种 private Map currency; + private Map betLimit; + public String getOurCurrency(String currencyId) { return currency == null ? null : currency.get(currencyId); } From ff36a4079945613ba76dfa6587a9a46cc1d1fc4a Mon Sep 17 00:00:00 2001 From: cengy Date: Wed, 9 Apr 2025 20:05:22 +0800 Subject: [PATCH 43/62] =?UTF-8?q?feat(sports):=20=E6=96=B0=E5=A2=9E=20DB?= =?UTF-8?q?=E4=BD=93=E8=82=B2=E5=B9=B3=E5=8F=B0=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 DB体育相关的缓存常量、数据传输对象、接口客户端等 - 实现 DB 体育平台的服务逻辑,包括用户创建、资金转账、获取会员信息等功能 - 新增延迟任务处理机制,用于处理异步任务 - 修改错误码枚举,增加新的错误类型 - 更新游戏平台枚举,添加 DB 体育选项 --- .../com/ff/base/constant/CacheConstants.java | 14 + .../java/com/ff/base/enums/ErrorCode.java | 3 +- .../java/com/ff/base/enums/GamePlatforms.java | 4 +- .../main/java/com/ff/delay/DelayService.java | 65 ++ .../src/main/java/com/ff/delay/DelayTask.java | 44 + .../meitian/impl/MeiTianGameServiceImpl.java | 93 ++- .../ff/game/api/sv388/client/SV388Client.java | 10 +- .../api/sv388/impl/SV388GamesServiceImpl.java | 31 +- .../ff/sports/db/address/DBSportsAddress.java | 32 + .../ff/sports/db/client/DBSportsClient.java | 100 +++ .../ff/sports/db/dto/CreateUserRequest.java | 30 + .../ff/sports/db/dto/CreateUserResponse.java | 19 + .../main/java/com/ff/sports/db/dto/Enums.java | 9 + .../sports/db/dto/GetMemberInfoRequest.java | 27 + .../sports/db/dto/GetMemberInfoResponse.java | 38 + .../com/ff/sports/db/dto/GetTokenRequest.java | 30 + .../ff/sports/db/dto/GetTokenResponse.java | 49 ++ .../com/ff/sports/db/dto/GetUrlRequest.java | 17 + .../com/ff/sports/db/dto/GetUrlResponse.java | 33 + .../ff/sports/db/dto/OrderFilesRequest.java | 41 + .../ff/sports/db/dto/OrderFilesResponse.java | 27 + .../ff/sports/db/dto/OrderInfoRequest.java | 26 + .../ff/sports/db/dto/OrderInfoResponse.java | 115 +++ .../sports/db/dto/TransferDetailRequest.java | 39 + .../sports/db/dto/TransferDetailResponse.java | 39 + .../ff/sports/db/dto/TransferInRequest.java | 46 ++ .../ff/sports/db/dto/TransferInResponse.java | 20 + .../ff/sports/db/dto/TransferOutRequest.java | 46 ++ .../ff/sports/db/dto/TransferOutResponse.java | 20 + .../sports/db/impl/DBSportsServiceImpl.java | 757 ++++++++++++++++++ .../sports/fb/impl/FBSportsServiceImpl.java | 2 +- 31 files changed, 1773 insertions(+), 53 deletions(-) create mode 100644 ff-game/src/main/java/com/ff/delay/DelayService.java create mode 100644 ff-game/src/main/java/com/ff/delay/DelayTask.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/address/DBSportsAddress.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/CreateUserResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/Enums.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/GetTokenRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/GetTokenResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/GetUrlRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/GetUrlResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferInRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferInResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferOutRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferOutResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java 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 27a3135..01d8620 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 @@ -96,6 +96,11 @@ public class CacheConstants { * fb体育 */ public static final String FB_Sports = "fp_sports:"; + + /** + * db体育 + */ + public static final String DB_Sports = "db_sports:"; /** * pg游戏投注货币 */ @@ -125,6 +130,15 @@ public class CacheConstants { */ public static final String KM_USER_TOKEN = "km:user:token:"; + + /** + * ae时间从 + */ + public static final String SV388_TIME_FROM= "sv388:time:from"; + + public static final String SV388_GAMES = "sv388_games:"; + + } diff --git a/ff-base/src/main/java/com/ff/base/enums/ErrorCode.java b/ff-base/src/main/java/com/ff/base/enums/ErrorCode.java index 29e6031..d13589b 100644 --- a/ff-base/src/main/java/com/ff/base/enums/ErrorCode.java +++ b/ff-base/src/main/java/com/ff/base/enums/ErrorCode.java @@ -35,7 +35,8 @@ public enum ErrorCode { Transfer_Out_Failure(1019, "转出失败"), Get_Member_Info_Failure(1020, "获取会员信息失败"), Transfer_Not_Exist(1021, "转帐操作不存在"), - Get_Url_Failure(1022, "获取URL失败") + Get_Url_Failure(1022, "获取URL失败"), + Miss_Config(1023, "缺少配置"), ; // 获取错误码 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 bbe4be7..e8ffc5e 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 @@ -16,8 +16,8 @@ public enum GamePlatforms { KM("KM", "KM"), PGT("PGT", "PGT"), FBSports("FBSports", "FB体育"), - SV388("SV388", "SV388"), - ; + SV388("SV388", "SV388真人"), + DBSports("DBSports", "DB体育"); private final String code; private final String info; diff --git a/ff-game/src/main/java/com/ff/delay/DelayService.java b/ff-game/src/main/java/com/ff/delay/DelayService.java new file mode 100644 index 0000000..c880667 --- /dev/null +++ b/ff-game/src/main/java/com/ff/delay/DelayService.java @@ -0,0 +1,65 @@ +package com.ff.delay; + +import com.ff.base.manager.AsyncManager; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.util.concurrent.DelayQueue; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +/** + * @author cengy + */ +@Service +@Slf4j +public class DelayService { + private DelayQueue delayQueue = new DelayQueue<>(); + + private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + + public void addTask(DelayTask delayTask) { + delayQueue.put(delayTask); + } + + // 启动延迟队列任务处理 + @PostConstruct + public void startProcessing() { + // 每 1 秒钟执行一次任务检查 + scheduler.scheduleAtFixedRate(this::processTasks, 10, 1, TimeUnit.SECONDS); + } + + // 处理过期任务 + private void processTasks() { + DelayTask task = null; // 阻塞,直到队列中有任务到期 + try { + task = delayQueue.take(); + } catch (InterruptedException e) { + log.error("获取过期任务失败", e); + } + if (null == task) { + return; + } + AsyncManager.me().execute(new DelayRunnable(task)); + } + + public static class DelayRunnable implements Runnable { + + DelayTask delayTask; + + public DelayRunnable(DelayTask delayTask) { + this.delayTask = delayTask; + } + + @Override + public void run() { + try { + delayTask.execute(); + } catch (Exception e) { + log.error("处理过期任务出错", e); + } + } + } +} diff --git a/ff-game/src/main/java/com/ff/delay/DelayTask.java b/ff-game/src/main/java/com/ff/delay/DelayTask.java new file mode 100644 index 0000000..e32cc7d --- /dev/null +++ b/ff-game/src/main/java/com/ff/delay/DelayTask.java @@ -0,0 +1,44 @@ +package com.ff.delay; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.concurrent.Delayed; +import java.util.concurrent.TimeUnit; + +/** + * @author cengy + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public abstract class DelayTask implements Delayed { + private long delayTime; + private long expireTime; + + public DelayTask(long delayTime) { + this.delayTime = delayTime; + this.expireTime = System.currentTimeMillis() + delayTime; // 设置过期时间 + } + + @Override + public long getDelay(TimeUnit unit) { + long diff = expireTime - System.currentTimeMillis(); + return unit.convert(diff, TimeUnit.MILLISECONDS); + } + + @Override + public int compareTo(Delayed o) { + if (this.expireTime < ((DelayTask) o).expireTime) { + return -1; + } + if (this.expireTime > ((DelayTask) o).expireTime) { + return 1; + } + return 0; + } + + abstract public void execute(); +} + 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 c01c1aa..c67b7ae 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 @@ -10,14 +10,14 @@ 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.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.delay.DelayService; +import com.ff.delay.DelayTask; 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.*; @@ -80,6 +80,9 @@ public class MeiTianGameServiceImpl implements IGamesService { @Autowired private SysConfigServiceImpl sysConfigServiceImpl; + @Autowired + private DelayService delayService; + /** * 获得就是成功 * @@ -301,7 +304,7 @@ public class MeiTianGameServiceImpl implements IGamesService { String merchantId = exchangeTransferMoneyRequestDTO.getAgentId(); String playerName = exchangeTransferMoneyRequestDTO.getAccount(); String coins = exchangeTransferMoneyRequestDTO.getAmount().setScale(4, RoundingMode.DOWN).toString(); - if (exchangeTransferMoneyRequestDTO.getTransferType().equals(TransferType.ALL.getCode())){ + if (exchangeTransferMoneyRequestDTO.getTransferType().equals(TransferType.ALL.getCode())) { MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder() .accounts(member.getGameAccount()) .agentId(exchangeTransferMoneyRequestDTO.getAgentId()) @@ -341,7 +344,7 @@ public class MeiTianGameServiceImpl implements IGamesService { //判断是否转移成功 if (this.isSuccess(exchangeMoneyResponse.getErrorCode())) { //更新数据 - BigDecimal transAmount =new BigDecimal(coins); + BigDecimal transAmount = new BigDecimal(coins); exchangeMoney.setBalance(transAmount); exchangeMoney.setCoinBefore(exchangeMoneyResponse.getBalance().subtract(transAmount)); @@ -374,7 +377,7 @@ public class MeiTianGameServiceImpl implements IGamesService { //判断是否转移成功 if (this.isSuccess(exchangeMoneyResponse.getErrorCode())) { //更新数据 - BigDecimal transAmount =new BigDecimal(coins); + BigDecimal transAmount = new BigDecimal(coins); exchangeMoney.setBalance(transAmount); exchangeMoney.setCoinBefore(exchangeMoneyResponse.getBalance().add(transAmount)); @@ -414,7 +417,7 @@ public class MeiTianGameServiceImpl implements IGamesService { exchangeTransferMoneyRequestDTO.getOrderId() ); Integer status = StatusType.IN_PROGRESS.getValue(); - if (this.isSuccess(meiTianBalanceTransferStatusResponseDTO.getResultCode())&& "1".equals(meiTianBalanceTransferStatusResponseDTO.getStatus())) { + if (this.isSuccess(meiTianBalanceTransferStatusResponseDTO.getResultCode()) && "1".equals(meiTianBalanceTransferStatusResponseDTO.getStatus())) { status = StatusType.SUCCESS.getValue(); } else { status = StatusType.FAILURE.getValue(); @@ -428,6 +431,34 @@ public class MeiTianGameServiceImpl implements IGamesService { } + class GetRecordByTimeTask extends DelayTask { + + BetRecordByTimeDTO betRecordByTimeDTO; + + public GetRecordByTimeTask(BetRecordByTimeDTO betRecordByTimeDTO) { + this.betRecordByTimeDTO = betRecordByTimeDTO; + } + + @Override + public void execute() { + doSyncRecordByRecordID(betRecordByTimeDTO); + } + } + + class GetRecordByHistoryTimeTask extends DelayTask { + + BetRecordByTimeDTO betRecordByTimeDTO; + + public GetRecordByHistoryTimeTask(BetRecordByTimeDTO betRecordByTimeDTO) { + this.betRecordByTimeDTO = betRecordByTimeDTO; + } + + @Override + public void execute() { + doSyncRecordByDate(betRecordByTimeDTO, 1); + } + } + /** * 按时间获取投注记录 * @@ -436,18 +467,21 @@ public class MeiTianGameServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { - return doSyncRecordByRecordID(betRecordByTimeDTO); + delayService.addTask(new GetRecordByTimeTask(betRecordByTimeDTO)); + return Boolean.TRUE; + //return doSyncRecordByRecordID(betRecordByTimeDTO); } boolean doSyncRecordByRecordID(BetRecordByTimeDTO betRecordByTimeDTO) { - String configKey = GamePlatforms.MT.getCode() + ":lastRecordID"; - String lastRecordID = sysConfigServiceImpl.selectConfigByKey(configKey); - long recordID = 0; - if (lastRecordID == null || lastRecordID.isEmpty()) { + String configKey = GamePlatforms.MT.getCode() + ":lastSyncRecordID"; + long recordID = redisCache.getCacheObject(configKey); + + //String lastRecordID = sysConfigServiceImpl.selectConfigByKey(configKey); + /*if (lastRecordID == null || lastRecordID.isEmpty()) { } else { recordID = Long.parseLong(lastRecordID); - } + }*/ String merchantId = betRecordByTimeDTO.getAgentId(); Map rawMap = new LinkedHashMap<>(); rawMap.put("recordID", recordID); @@ -473,7 +507,9 @@ public class MeiTianGameServiceImpl implements IGamesService { //数据插入 this.batchInsert(recordResponse, betRecordByTimeDTO); MeiTianBetRecordResponseDTO.DataBean dataBean = dataList.get(dataList.size() - 1); - SysConfig config = sysConfigServiceImpl.getByConfigKey(configKey); + redisCache.setCacheObject(configKey, Long.parseLong(dataBean.getRowID())); + + /*SysConfig config = sysConfigServiceImpl.getByConfigKey(configKey); if (config == null) { config = new SysConfig(); config.setConfigKey(configKey); @@ -482,7 +518,7 @@ public class MeiTianGameServiceImpl implements IGamesService { } else { config.setConfigValue(dataBean.getRecordID()); sysConfigServiceImpl.updateConfig(config); - } + }*/ // 它每次返回25000条,所以需要判断,如果大于25000条,则继续拉取 if (dataList.size() >= 25000) { doSyncRecordByRecordID(betRecordByTimeDTO); @@ -498,22 +534,7 @@ public class MeiTianGameServiceImpl implements IGamesService { String date = getDateStr(daysToSubtract); String configKey = GamePlatforms.MT.getCode() + ":lastSyncDate"; - String syncDateStr = sysConfigServiceImpl.selectConfigByKey(configKey); - Map syncDateMap = new HashMap<>(); - long recordID = 0; - if (syncDateStr == null || syncDateStr.isEmpty()) { - } else { - syncDateMap = JSON.parseObject(syncDateStr, Map.class); - } - if (syncDateMap.containsKey(date)) { - recordID = syncDateMap.get(date); - if (syncDateMap.size() > 10) { - syncDateMap.clear(); - syncDateMap.put(date, recordID); - } - } else { - syncDateMap.put(date, recordID); - } + long recordID = redisCache.getCacheObject(configKey); String merchantId = betRecordByTimeDTO.getAgentId(); Map rawMap = new LinkedHashMap<>(); rawMap.put("rowID", recordID); @@ -541,8 +562,9 @@ public class MeiTianGameServiceImpl implements IGamesService { //数据插入 this.batchInsert(recordResponse, betRecordByTimeDTO); MeiTianBetRecordResponseDTO.DataBean dataBean = dataList.get(dataList.size() - 1); - syncDateMap.put(date, Long.parseLong(dataBean.getRowID())); - SysConfig config = sysConfigServiceImpl.getByConfigKey(configKey); + //syncDateMap.put(date, Long.parseLong(dataBean.getRowID())); + redisCache.setCacheObject(configKey, Long.parseLong(dataBean.getRowID())); + /*SysConfig config = sysConfigServiceImpl.getByConfigKey(configKey); if (null == config) { config = new SysConfig(); config.setConfigKey(configKey); @@ -551,7 +573,7 @@ public class MeiTianGameServiceImpl implements IGamesService { } else { config.setConfigValue(JSON.toJSONString(syncDateMap)); sysConfigServiceImpl.updateConfig(config); - } + }*/ // 它每次返回25000条,所以需要判断,如果大于25000条,则继续拉取 if (dataList.size() >= 25000) { @@ -572,9 +594,10 @@ public class MeiTianGameServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { - doSyncRecordByDate(betRecordByTimeDTO, 0); - doSyncRecordByDate(betRecordByTimeDTO, 1); // yesterday + //doSyncRecordByDate(betRecordByTimeDTO, 0); + //doSyncRecordByDate(betRecordByTimeDTO, 1); // yesterday + delayService.addTask(new GetRecordByHistoryTimeTask(betRecordByTimeDTO)); return true; } diff --git a/ff-game/src/main/java/com/ff/game/api/sv388/client/SV388Client.java b/ff-game/src/main/java/com/ff/game/api/sv388/client/SV388Client.java index 10043a8..7f57520 100644 --- a/ff-game/src/main/java/com/ff/game/api/sv388/client/SV388Client.java +++ b/ff-game/src/main/java/com/ff/game/api/sv388/client/SV388Client.java @@ -92,11 +92,12 @@ public interface SV388Client { * @param params 参数 * @return {@link SV388BetRecordResponse } */ - @Post(url ="https://tttfetch.apihub55.com/fetch/gzip/getTransactionByUpdateDate", + @Post(url ="{fetchUrl}/fetch/gzip/getTransactionByUpdateDate", headers = { "Content-type: application/x-www-form-urlencoded" }) - SV388BetRecordResponse getBetRecordByTime(@Body Map params); + SV388BetRecordResponse getBetRecordByTime(@Body Map params, + @Var("fetchUrl") String fetchUrl); /** * 按时间获取投注历史记录 @@ -104,11 +105,12 @@ public interface SV388Client { * @param params 参数 * @return {@link SV388BetRecordResponse } */ - @Post(url ="https://tttfetch.apihub55.com/fetch/gzip/getTransactionByTxTime", + @Post(url ="{fetchUrl}/fetch/gzip/getTransactionByTxTime", headers = { "Content-type: application/x-www-form-urlencoded" }) - SV388BetRecordResponse getBetHistoryRecordByTime(@Body Map params); + SV388BetRecordResponse getBetHistoryRecordByTime(@Body Map params, + @Var("fetchUrl") String fetchUrl); /** * 踢出队员 * diff --git a/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java index 08e19c3..a49ef4b 100644 --- a/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java @@ -105,7 +105,17 @@ public class SV388GamesServiceImpl implements IGamesService { public Boolean createMember(CreateMemberRequestDTO createMemberRequestDTO) { Platform platform = createMemberRequestDTO.getVendor(); - Object betLimit = platform.getExtInfo().getBetLimit().get(createMemberRequestDTO.getSystemCurrency()); + Object o = platform.getExtInfo().getBetLimit().get(createMemberRequestDTO.getSystemCurrency()); + if (!(o instanceof Map)) { + throw new ApiException(ErrorCode.Miss_Config.getCode()); + } + Map betLimit = new HashMap<>(); + betLimit.put(GamePlatforms.SV388.getCode(), new HashMap() {{ + put("LIVE", new HashMap((Map) o) {{ + remove("@type"); + }}); + }} + ); Map params = this.getKey(createMemberRequestDTO); params.put("userId", createMemberRequestDTO.getAccount()); params.put("currency", createMemberRequestDTO.getCurrency()); @@ -201,7 +211,7 @@ public class SV388GamesServiceImpl implements IGamesService { game.setGameId(StringUtils.addSuffix(GamePlatforms.SV388.getCode(), 1)); gameService.insertGame(game); } - return CacheConstants.AE_GAMES; + return CacheConstants.SV388_GAMES; } /** @@ -235,7 +245,7 @@ public class SV388GamesServiceImpl implements IGamesService { .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) - .platformCode(GamePlatforms.AE.getInfo()) + .platformCode(GamePlatforms.SV388.getCode()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue()); @@ -338,16 +348,16 @@ public class SV388GamesServiceImpl implements IGamesService { //请求参数 Map params = this.getKey(betRecordByTimeDTO); - String timeFrom = redisCache.getCacheObject(CacheConstants.AE_TIME_FROM); + String timeFrom = redisCache.getCacheObject(CacheConstants.SV388_TIME_FROM); if (StringUtils.isEmpty(timeFrom)) { - timeFrom = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00"; + timeFrom = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00"; } params.put("timeFrom", timeFrom); params.put("platform", GamePlatforms.SV388.getCode()); params.put("delayTime", 10000); - SV388BetRecordResponse aeBetRecordResponse = sv388Client.getBetRecordByTime(params); + SV388BetRecordResponse aeBetRecordResponse = sv388Client.getBetRecordByTime(params, betRecordByTimeDTO.getVendor().getUrlInfo().getBetUrl()); //判断是否获取成功 if (this.getIsSuccess(aeBetRecordResponse.getStatus())) { @@ -355,7 +365,7 @@ public class SV388GamesServiceImpl implements IGamesService { this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO); return Boolean.TRUE; } else { - redisCache.deleteObject(CacheConstants.AE_TIME_FROM); + redisCache.deleteObject(CacheConstants.SV388_TIME_FROM); log.error("获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc()); throw new BaseException(aeBetRecordResponse.getDesc()); } @@ -378,7 +388,8 @@ public class SV388GamesServiceImpl implements IGamesService { params.put("startTime", startTime); params.put("endTime", endTime); params.put("platform", /*"SEXYBCRT"*/ GamePlatforms.SV388.getCode()); - SV388BetRecordResponse aeBetRecordResponse = sv388Client.getBetHistoryRecordByTime(params); + + SV388BetRecordResponse aeBetRecordResponse = sv388Client.getBetHistoryRecordByTime(params, betRecordByTimeDTO.getVendor().getUrlInfo().getBetUrl()); //判断是否获取成功 if (this.getIsSuccess(aeBetRecordResponse.getStatus())) { @@ -504,7 +515,7 @@ public class SV388GamesServiceImpl implements IGamesService { } if (!CollectionUtils.isEmpty(gameBettingDetails)) { //查询重复数据id - List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.AE.getInfo()); + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.SV388.getCode()); //用steam流清除list中与wagersIds集合相同的数据 gameBettingDetails = gameBettingDetails.stream() .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) @@ -516,7 +527,7 @@ public class SV388GamesServiceImpl implements IGamesService { if (StringUtils.isEmpty(timeFrom)) { timeFrom = DateUtils.convertTimestampToFormattedDate(DateUtils.getNowDate(), DateUtils.ISO_8601_FORMAT, "UTC+8") + "+08:00"; } - redisCache.setCacheObject(CacheConstants.AE_TIME_FROM, timeFrom); + redisCache.setCacheObject(CacheConstants.SV388_TIME_FROM, timeFrom); } /** diff --git a/ff-game/src/main/java/com/ff/sports/db/address/DBSportsAddress.java b/ff-game/src/main/java/com/ff/sports/db/address/DBSportsAddress.java new file mode 100644 index 0000000..c2e1843 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/address/DBSportsAddress.java @@ -0,0 +1,32 @@ +package com.ff.sports.db.address; + +import com.dtflys.forest.callback.AddressSource; +import com.dtflys.forest.http.ForestAddress; +import com.dtflys.forest.http.ForestRequest; +import com.ff.base.enums.GamePlatforms; +import com.ff.game.service.IPlatformService; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + + +/** + * DB体育对接文档 + * 账号: api + * 密码: a12345678 + * + * @author cengy + */ +@Component +public class DBSportsAddress implements AddressSource { + + @Resource + private IPlatformService platformService; + + @Override + public ForestAddress getAddress(ForestRequest request) { + String apiBaseUrl = platformService.get(GamePlatforms.DBSports.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/sports/db/client/DBSportsClient.java b/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java new file mode 100644 index 0000000..6fabff8 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java @@ -0,0 +1,100 @@ +package com.ff.sports.db.client; + +import com.dtflys.forest.annotation.*; +import com.ff.sports.db.address.DBSportsAddress; +import com.ff.sports.db.dto.*; + +/** + * + * @author cengy + */ +@Address(source = DBSportsAddress.class) +public interface DBSportsClient { + /** + * 创建投注用户 + * + * @return {@link CreateUserResponse} + */ + @Post(url = "/api/v2/new/user/create") + CreateUserResponse createMember(@JSONBody CreateUserRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); + + /** + * 用户金额转入到FB体育平台,支持两位小数,最小0.01,必须是正数 + * + * @param request + * @param sign + * @param timestamp + * @param merchantId + * @return {@link TransferInResponse} + */ + @Post(url = "/api/v2/new/transfer/in") + TransferInResponse transferIn(@JSONBody TransferInRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); + + @Post(url = "/api/v2/new/transfer/out") + TransferOutResponse transferOut(@JSONBody TransferOutRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); + + @Post(url = "/api/v2/new/user/detail") + GetMemberInfoResponse getMemberInfo(@JSONBody GetMemberInfoRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); + + /** + * 查询转账详情,当转入/转出接口遇到异常,可查询某次转账是否成功 + */ + @Post(url = "/api/v2/transfer/detail") + TransferDetailResponse transferDetail(@JSONBody TransferDetailRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); + + @Post(url = "/api/v2/service/domain/list") + GetUrlResponse getUrl(@JSONBody GetUrlRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); + + /** + * FB体育用拉取订单文件的方式同步订单数据,FB体育每5分钟生成一次订单文件, + * 通过此接口获取某一段时间内的文件ID列表,再通过文件ID获取具体订单数据 + */ + @Post(url = "/api/v2/order/file/ids") + OrderFilesResponse orderFiles(@JSONBody OrderFilesRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); + + /** + * 拉取订单Json数据 + */ + @Post(url = "/api/v2/order/list") + OrderInfoResponse getOrderJsonData(@JSONBody OrderInfoRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); + + + /** + * 获取用户app端鉴权token和相关服务url,获取到的token用于app调用接口鉴权 + * + * @param request + * @param sign + * @param timestamp + * @param merchantId + * @return + */ + @Post(url = "/api/v2/token/get") + GetTokenResponse getToken(@JSONBody GetTokenRequest request, + @Header("sign") @Var("sign") String sign, + @Header("timestamp") @Var("timestamp") long timestamp, + @Header("merchantId") @Var("merchantId") String merchantId); +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java new file mode 100644 index 0000000..fd466fb --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java @@ -0,0 +1,30 @@ +package com.ff.sports.db.dto; + +import com.alibaba.fastjson2.JSON; +import lombok.Data; + +import java.io.Serializable; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cengy + */ +@Data +public class CreateUserRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + private String merchantUserId;// 渠道用户id,支持40位字符串,必须唯一 + private List currencyIds = null; // 币种id集合 , see enum: currency + private Integer oddsLevel = null; // 赔率级别,不传则为默认, see enum: user_odds_level_enum + + public String toJSON() { + Map map = new LinkedHashMap<>(); + map.put("currencyIds", currencyIds); + map.put("merchantUserId", merchantUserId); + map.put("oddsLevel", oddsLevel); + return JSON.toJSONString(map); + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserResponse.java new file mode 100644 index 0000000..6098450 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserResponse.java @@ -0,0 +1,19 @@ +package com.ff.sports.db.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cengy + */ +@Data +public class CreateUserResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + private Boolean success; + private Integer data; + private Integer code; + private String message; +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/Enums.java b/ff-game/src/main/java/com/ff/sports/db/dto/Enums.java new file mode 100644 index 0000000..5cbd46b --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/Enums.java @@ -0,0 +1,9 @@ +package com.ff.sports.db.dto; + +/** + * @author cengy + */ +public class Enums { + + +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoRequest.java new file mode 100644 index 0000000..015bc89 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoRequest.java @@ -0,0 +1,27 @@ +package com.ff.sports.db.dto; + +import com.alibaba.fastjson2.JSON; +import lombok.Data; + +import java.io.Serializable; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author cengy + */ +@Data +public class GetMemberInfoRequest implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 渠道用户id,不能为空 + */ + private String merchantUserId; + + public String toJSON() { + Map map = new LinkedHashMap<>(); + map.put("merchantUserId", merchantUserId); + return JSON.toJSONString(map); + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoResponse.java new file mode 100644 index 0000000..60cb4c7 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoResponse.java @@ -0,0 +1,38 @@ +package com.ff.sports.db.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * @author cengy + */ +@Data +public class GetMemberInfoResponse implements Serializable { + private static final long serialVersionUID = 1L; + + private Boolean success; + private String message; + private MemberInfo data; + private Integer code; + + @Data + public static class MemberInfo implements Serializable{ + private static final long serialVersionUID = 1L; + private String merchantUserId; + private Integer userId; // FB体育用户id + private Integer walletType; // 用户钱包类型 , see enum: wallet_type + private Integer currencyType; // 用户币种类型 , see enum: currency_type + private List wallets; // 钱包集合 + private Integer oddsLevel;// 赔率级别 , see enum: user_odds_level_enum + } + @Data + public static class Wallet implements Serializable{ + private static final long serialVersionUID = 1L; + private Integer currencyType; // 币种类型 , see enum: currency_type + private BigDecimal balance; // 余额 + private Integer currencyId; // 币种id , see enum: currency + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenRequest.java new file mode 100644 index 0000000..83bfe60 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenRequest.java @@ -0,0 +1,30 @@ +package com.ff.sports.db.dto; + +import com.alibaba.fastjson2.JSON; +import lombok.Data; + +import java.io.Serializable; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author cengy + */ +@Data +public class GetTokenRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + private String merchantUserId; + // 平台类型,pc,h5, mobile , see enum: plat_form_enum + private String platForm; + // 客户端用户ip地址,尽可能提供,我们用于风控 + private String ip; // 可选 + + public String toJSON() { + Map map = new LinkedHashMap<>(); + map.put("merchantUserId", merchantUserId); + map.put("platForm", platForm); + return JSON.toJSONString(map); + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenResponse.java new file mode 100644 index 0000000..3dfb0df --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenResponse.java @@ -0,0 +1,49 @@ +package com.ff.sports.db.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author cengy + */ +@Data +public class GetTokenResponse implements Serializable { + private static final long serialVersionUID = 1L; + + private Boolean success; + private String message; + private Integer code; + private TokenDTO data; + + @Data + public static class TokenDTO implements Serializable { + private String token; // 用户鉴权token,用于客户端鉴权 + private ServerInfo serverInfo; // 服务器地址信息 + private List domains; // 全部服务器地址信息 + private String themeBgColor; // 主题背景色 + private String themeFgColor; // 主题前景色 + private Integer userId; // FB用户ID + } + + @Data + public static class ServerInfo implements Serializable { + private static final long serialVersionUID = 1L; + private String apiServerAddress; // app接口服务地址 + private String apiEmbeddedServerAddress; // app内嵌网页地址 + private String pushServerAddress; // 推送服务地址 + private String pcAddress; // PC投注网站地址 + private String h5Address; // h5投注网站地址 + private String virtualAddress; // 虚拟体育投注网站地址 + private String virtualMatchVideoAddress; // 虚拟赛事视频地址 + private String ouH5Address; // 欧版h5地址 + private String ouPcAddress; // 欧版pc地址 + } + + @Data + public static class Domain { + private Integer type; // 域名类型 + private List domains; // 域名集合 + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetUrlRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetUrlRequest.java new file mode 100644 index 0000000..4ccc4d6 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/GetUrlRequest.java @@ -0,0 +1,17 @@ +package com.ff.sports.db.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cengy + */ +@Data +public class GetUrlRequest implements Serializable { + private static final long serialVersionUID = 1L; + + public String toJSON() { + return "{}"; + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetUrlResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetUrlResponse.java new file mode 100644 index 0000000..d622169 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/GetUrlResponse.java @@ -0,0 +1,33 @@ +package com.ff.sports.db.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author cengy + */ +@Data +public class GetUrlResponse implements Serializable { + private static final long serialVersionUID = 1L; + + private Boolean success; + private String message; + private List data; + private Integer code; + + @Data + public static class UrlDTO implements Serializable { + private static final long serialVersionUID = 1L; + private int type; //域名类型,1:API,2:PUSH,3:H5,4:PC,5:IMAGE , see enum: domain_type_enum + private List domainList; // 域名集合 + } + + @Data + public static class DomainDTO implements Serializable { + private static final long serialVersionUID = 1L; + private String domain; // 域名 + private int weight; // 权限值 + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesRequest.java new file mode 100644 index 0000000..315b698 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesRequest.java @@ -0,0 +1,41 @@ +package com.ff.sports.db.dto; + +import com.alibaba.fastjson2.JSON; +import lombok.Data; + +import java.io.Serializable; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author cengy + */ +@Data +public class OrderFilesRequest implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 开始时间戳,13位数字,不能为null + */ + private Long startTime; + + /** + * 结束时间戳,13位数字,不能为null + */ + private Long endTime; + + public String toJSON() { + Map map = new LinkedHashMap<>(); + map.put("endTime", endTime); + map.put("startTime", startTime); + return JSON.toJSONString(map); +// String endTimeStr = endTime ; // 转换为字符串 +// String startTimeStr = startTime; // 转换为字符串 +// +// String json = "{" + +// "\"endTime\": \"" + endTimeStr + "\", " + +// "\"startTime\": \"" + startTimeStr + "\"" + +// "}"; +// return json; + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesResponse.java new file mode 100644 index 0000000..2367773 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesResponse.java @@ -0,0 +1,27 @@ +package com.ff.sports.db.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author cengy + */ +@Data +public class OrderFilesResponse implements Serializable { + private static final long serialVersionUID = 1L; + + private Boolean success; + private String message; + private Integer code; + + private List data; + + @Data + public static class FileId implements Serializable { + private static final long serialVersionUID = 1L; + private Long fileId; + } + +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoRequest.java new file mode 100644 index 0000000..9d51d78 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoRequest.java @@ -0,0 +1,26 @@ +package com.ff.sports.db.dto; + +import com.alibaba.fastjson2.JSON; +import lombok.Data; + +import java.io.Serializable; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author cengy + */ +@Data +public class OrderInfoRequest implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 文件Id,需要从/order/file/ids接口获取到 + */ + private Long fileId; + + public String toJSON() { + Map map = new LinkedHashMap<>(); + map.put("fileId", fileId); + return JSON.toJSONString(map); + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoResponse.java new file mode 100644 index 0000000..b6910f6 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoResponse.java @@ -0,0 +1,115 @@ +package com.ff.sports.db.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author cengy + */ +@Data +public class OrderInfoResponse implements Serializable { + private static final long serialVersionUID = 1L; + + private Boolean success; + private String message; + private Integer code; + + private List data; + + @Data + public static class OrderDTO implements Serializable { + private static final long serialVersionUID = 1L; + private String id; // 订单号 + private Integer rejectReason; // 拒单原因码 see enum: order_reject_type + private String rejectReasonStr; // 拒单原因 + private String userId; // FB平台用户ID + private String merchantId; // 渠道ID + private String merchantUserId; // 渠道用户ID + private Integer currency; // 币种 see enum: currency + private String exchangeRate; // 汇率快照 + private Integer seriesType; // 关次类型 ,0 单关、1 串关, see enum: series_type + private String betType; // 投注类型 + private Integer allUp; // 总关数 + private Integer allUpAlive; // 存活关数 + private String stakeAmount; // 投注额(本金) + private String liabilityStake; // 名义投注额(名义本金) + private String settleAmount; // 结算派奖金额 + private Integer orderStatus; // 订单状态 see enum: order_status + private Integer payStatus; // 付款状态 + private Integer oddsChange; // 是否接受赔率变更 0不接受,1 接受更好赔率,2接受任意赔率 , see enum: odds_change_enum + private String device; // 设备类型 (pc、h5、mobile) , see enum: plat_form_enum + private String ip; // 投注IP地址 + private String settleTime; // 订单结算时间 + private String createTime; // 订单创建时间 + private String modifyTime; // 订单确认时间 + private String cancelTime; // 订单取消时间 + private String thirdRemark; // 第三方备注 + private String relatedId; // 三方关联ID + private String maxWinAmount; // 最大可赢金额 + private String loseAmount; // 最大赔付金额 + private Integer rollBackCount; // 回滚次数 + private Integer itemCount; // 选项数 + private Integer seriesValue; // 串几关 + private Integer betNum; // 子单数 + private String cashOutTotalStake; // 提前结算总本金 + private String liabilityCashoutStake; // 提前结算名义总本金 + private String cashOutPayoutStake; // 提前结算总派奖额 + private String reserveId; // 预约订单单号 + private Integer cashOutCount; // 提前结算次数 + private String unitStake; // 每单金额 + private Integer reserveVersion; // 预约订单版本号 + private List betList; // 注单集合 + } + + @Data + public static class BetDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private String id; // ID + private String orderId; // 订单ID + private Integer sportId; // 运动ID + private String matchId; // 比赛ID + private String matchName; // 比赛名称 + private Integer period; // 阶段ID + private String marketId; // 玩法ID + private Integer marketType; // 玩法类型 + private Integer optionType; // 投注项类型 + private String optionName; // 选项名称 + private String marketName; // 玩法名称 + private String tournamentId; // 联赛ID + private String tournamentName; // 联赛名称 + private String odds; // 欧式赔率 + private Integer oddsFormat; // 投注时赔率类型 + private String betOdds; // 投注时赔率 + private Integer settleStatus; // 结算状态 + private Integer settleResult; // 结算结果 + private Boolean isInplay; // 是否滚球 + private String remark; // 备注 + private Double p1; // 变量1 (例如:让几个球) + private Double p2; // 变量2 + private Double p3; // 变量3 + private String extendedParameter; // 亚洲让球线 + private String extraInfo; // 当前比分 + private String pendingTime; // 延迟等待时间 + private String betScore; // 下注当时比分 + private Integer cancelReason; // 取消原因 + private String cancelReasonName; // 取消原因文本 + private Integer matchType; // 赛事类型 + private String matchTime; // 开赛时间 + private Integer virtualMatchDay; // 轮次 + private Integer virtualChampId; // 赛季 + private Integer virtualLegOrder; // 淘汰赛回合 + private Integer virtualWeekDay; // 小组赛比赛日 + private Integer virtualBlockId; // 期 + private Integer leaguePhase; // 联赛阶段 + private String maxStake; // 最大投注额 + private String validSettleStakeAmount; // 有效已结算投注额 + private String validSettleAmount; // 有效返还额 + private String cashOutCancelStake; // 提前结算取消总额 + private Integer walletType; // 钱包类型 + private Integer version; // 数据变更标记 + } + +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailRequest.java new file mode 100644 index 0000000..8bb2c9e --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailRequest.java @@ -0,0 +1,39 @@ +package com.ff.sports.db.dto; + +import com.alibaba.fastjson2.JSON; +import lombok.Data; + +import java.io.Serializable; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author cengy + */ +@Data +public class TransferDetailRequest implements Serializable { + + + /** + * 业务id,不能为null + */ + private String businessId; + + /** + * 渠道用户ID,不能为null + */ + private String merchantUserId; + + /** + * 转账类型 , see enum: transfer_type_enum 不能为空 + */ + private String transferType; + + public String toJSON() { + Map map = new LinkedHashMap<>(); + map.put("businessId", businessId); + map.put("merchantUserId", merchantUserId); + map.put("transferType", transferType); + return JSON.toJSONString(map); + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailResponse.java new file mode 100644 index 0000000..8f56651 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailResponse.java @@ -0,0 +1,39 @@ +package com.ff.sports.db.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author cengy + */ +@Data +public class TransferDetailResponse implements Serializable { + private static final long serialVersionUID = 1L; + + private Boolean success; + private String message; + private TransferDetail data; + private Integer code; + + @Data + public static class TransferDetail implements Serializable { + private static final long serialVersionUID = 1L; + + private Integer id; + private Integer userId; + private String merchantUserId; + private String businessId; + // IN 转入 + // OUT 转出 + private String transferType; + private BigDecimal beforeTransferAmount; + private BigDecimal afterTransferAmount; + private Integer status; // 状态 , see enum: transfer_status_enum, 1 Successful 0 Failure + private Long createTime; // 记录创建时间 + private Integer currencyId;// 币种id , see enum: currency + + } + +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferInRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferInRequest.java new file mode 100644 index 0000000..31f13a4 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/TransferInRequest.java @@ -0,0 +1,46 @@ +package com.ff.sports.db.dto; + +import com.alibaba.fastjson2.JSON; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author cengy + */ +@Data +public class TransferInRequest implements Serializable { + + /** + * 转账金额,不能为null + * 必须大於或等於0 + */ + private BigDecimal amount; + + /** + * 业务id,不能为null + */ + private String businessId; + + /** + * 渠道用户ID,不能为null + */ + private String merchantUserId; + + /** + * 币种id,可不传入 + */ + private Integer currencyId; + + public String toJSON() { + Map map = new LinkedHashMap<>(); + map.put("amount", amount); + map.put("businessId", businessId); + map.put("currencyId", currencyId); + map.put("merchantUserId", merchantUserId); + return JSON.toJSONString(map); + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferInResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferInResponse.java new file mode 100644 index 0000000..3de12e9 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/TransferInResponse.java @@ -0,0 +1,20 @@ +package com.ff.sports.db.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author cengy + */ +@Data +public class TransferInResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + private Boolean success; + private BigDecimal data; + private Integer code; + private String message; +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutRequest.java new file mode 100644 index 0000000..bd26537 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutRequest.java @@ -0,0 +1,46 @@ +package com.ff.sports.db.dto; + +import com.alibaba.fastjson2.JSON; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author cengy + */ +@Data +public class TransferOutRequest implements Serializable { + + /** + * 转账金额,不能为null + * 必须大於或等於0 + */ + private BigDecimal amount; + + /** + * 业务id,不能为null + */ + private String businessId; + + /** + * 渠道用户ID,不能为null + */ + private String merchantUserId; + + /** + * 币种id,可不传入 + */ + private Integer currencyId; + + public String toJSON() { + Map map = new LinkedHashMap<>(); + map.put("amount", amount); + map.put("businessId", businessId); + map.put("currencyId", currencyId); + map.put("merchantUserId", merchantUserId); + return JSON.toJSONString(map); + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutResponse.java new file mode 100644 index 0000000..da1590c --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutResponse.java @@ -0,0 +1,20 @@ +package com.ff.sports.db.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author cengy + */ +@Data +public class TransferOutResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + private Boolean success; + private BigDecimal data; + private Integer code; + private String message; +} diff --git a/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java b/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java new file mode 100644 index 0000000..3df555c --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java @@ -0,0 +1,757 @@ +package com.ff.sports.db.impl; + +import cn.hutool.core.util.IdUtil; +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.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.request.*; +import com.ff.game.domain.*; +import com.ff.game.service.IGameBettingDetailsService; +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.sports.db.client.DBSportsClient; +import com.ff.sports.db.dto.*; +import com.ff.utils.TimestampFromString; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + + +/** + * FB体育 + * + * @author shi + * @date 2024/10/21 + */ +@Service("DBSportsService") +@Slf4j +public class DBSportsServiceImpl implements IGamesService { + + @Resource + private RedisCache redisCache; + + @Resource + private IGameExchangeMoneyService gameExchangeMoneyService; + + @Resource + private IGameService gameService; + + + @Resource + private IMemberService memberService; + + @Resource + private DBSportsClient dbSportsClient; + + @Resource + private IGameBettingDetailsService gameBettingDetailsService; + + /** + * 获得就是成功 + * + * @param errorCode 错误代码 + * @return {@link Boolean } + */ + private Boolean isSuccess(Integer errorCode) { + return 0 == errorCode; + } + + String getSign(String bodyJsonString, String merchantId, String merchantApiSecret, long requestTimestamp) { + + String stringThatNeedsToBeSigned = bodyJsonString + "." + merchantId + "." + requestTimestamp + "." + merchantApiSecret; + String sign = Md5Utils.md5New(stringThatNeedsToBeSigned); + return sign; + } + + /** + * 创建成员 + * + * @param createMemberRequestDTO 创建成员请求dto + * @return {@link Boolean } + */ + @Override + public Boolean createMember(CreateMemberRequestDTO createMemberRequestDTO) { + + long timestamp = System.currentTimeMillis(); + CreateUserRequest request = new CreateUserRequest(); + request.setMerchantUserId(createMemberRequestDTO.getAccount()); + ArrayList currencyIds = new ArrayList<>(); + currencyIds.add(Integer.parseInt(createMemberRequestDTO.getCurrency())); + request.setCurrencyIds(currencyIds); + String jsonBody = /*SortByAttributeNameASC.get(request)*/ request.toJSON(); + String sign = getSign(jsonBody, + createMemberRequestDTO.getAgentId(), + createMemberRequestDTO.getAgentKey(), + timestamp + ); + + CreateUserResponse response = dbSportsClient.createMember( + request, + sign, + timestamp, createMemberRequestDTO.getAgentId()); + if (isSuccess(response.getCode())) { + log.info("创建会员成功, account:{}->{}", createMemberRequestDTO.getAccount(), response.getData()); + return Boolean.TRUE; + } + + log.error("创建会员失败, errorCode:{}, errorMessage:{}", response.getCode(), response.getMessage()); + throw new ApiException(ErrorCode.Create_Member_Failure.getCode()); + } + + + /** + * 按代理id进行交换转账 + * + * @param requestDTO 外汇转账moeny dto + * @return {@link Long } + */ + @Override + @Transactional + public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO requestDTO) { + + Member member = memberService.selectMemberByGameAccount(requestDTO.getAccount()); + String transactionId = GamePlatforms.DBSports.getCode() + IdUtils.simpleUUID(); + List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( + GameExchangeMoney.builder() + .tenantKey(requestDTO.getTenantKey()) + .orderId(requestDTO.getOrderId()) + .build() + ); + Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); +//获取下一个自增id + GameExchangeMoney exchangeMoney = GameExchangeMoney + .builder() + .orderId(requestDTO.getOrderId()) + .tenantKey(requestDTO.getTenantKey()) + .quota(requestDTO.getQuota()) + .balance(requestDTO.getAmount()) + .exchangeType(requestDTO.getTransferType()) + .currencyCode(requestDTO.getSystemCurrency()) + .memberId(member.getId()) + .transactionId(transactionId) + .platformCode(GamePlatforms.DBSports.getCode()) + .build(); + exchangeMoney.setCreateBy(Constants.SYSTEM); + //接口限制限制50字符 + exchangeMoney.setTransactionId(transactionId); + // 转入 + if (requestDTO.getTransferType().equals(TransferType.GAMES.getCode())) { + TransferInRequest request = new TransferInRequest(); + request.setMerchantUserId(requestDTO.getAccount()); + request.setAmount(requestDTO.getAmount()); + request.setBusinessId(requestDTO.getOrderId()); + request.setCurrencyId(Integer.parseInt(requestDTO.getCurrency())); + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + + TransferInResponse response = dbSportsClient.transferIn( + request, + sign, + timestamp, + requestDTO.getAgentId()); + if (isSuccess(response.getCode())) { + + exchangeMoney.setBalance(response.getData()); + BigDecimal transAmount = requestDTO.getAmount(); + exchangeMoney.setCoinBefore(response.getData().subtract(transAmount)); + exchangeMoney.setCoinAfter(response.getData()); + exchangeMoney.setCurrencyBefore(response.getData().subtract(transAmount)); + exchangeMoney.setCurrencyAfter(response.getData()); + exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); // SUCCESS + gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + } else { + throw new ApiException(ErrorCode.Transfer_In_Failure.getCode()); + } + } else { + // 获取第三方钱包余额 + MemberInfoRequestDTO memberInfoRequestDTO = MemberInfoRequestDTO.builder() + .accounts(member.getGameAccount()) + .agentId(requestDTO.getAgentId()) + .agentKey(requestDTO.getAgentKey()) + .build(); + BigDecimal balance = this.getMemberInfo(memberInfoRequestDTO).getBalance(); + + TransferOutRequest request = new TransferOutRequest(); + request.setMerchantUserId(requestDTO.getAccount()); + request.setAmount(/*requestDTO.getAmount()*/ balance); + request.setBusinessId(requestDTO.getOrderId()); + request.setCurrencyId(Integer.parseInt(requestDTO.getCurrency())); + + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + + TransferOutResponse response = dbSportsClient + .transferOut( + request, + sign, + timestamp, + requestDTO.getAgentId() + ); + + + //判断是否转移成功 + if (this.isSuccess(response.getCode())) { + //更新数据 + exchangeMoney.setBalance(response.getData()); + BigDecimal transAmount = balance; + exchangeMoney.setCoinBefore(response.getData().add(transAmount)); + exchangeMoney.setCoinAfter(response.getData()); + exchangeMoney.setCurrencyBefore(response.getData().add(transAmount)); + exchangeMoney.setCurrencyAfter(response.getData()); + exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); // SUCCESS + gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); + } else { + throw new ApiException(ErrorCode.Transfer_Out_Failure.getCode()); + } + } + return exchangeMoney.getId(); + } + + /** + * 获取会员信息 + * + * @param requestDTO 会员信息请求dto + * @return {@link MemberInfoResponseDTO } + */ + @Override + public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO requestDTO) { + GetMemberInfoRequest request = new GetMemberInfoRequest(); + request.setMerchantUserId(requestDTO.getAccounts()); + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + GetMemberInfoResponse response = dbSportsClient.getMemberInfo( + request, + sign, + timestamp, + requestDTO.getAgentId() + ); + //判断是否获取成功 + if (this.isSuccess(response.getCode())) { + BigDecimal balance = new BigDecimal("0.00"); + + for (GetMemberInfoResponse.Wallet wallet : response.getData().getWallets()) { + balance = balance.add(wallet.getBalance()); + } + return MemberInfoResponseDTO.builder() + .status(GameMemberStatus.UNKNOWN.getCode()) + .balance(balance) + .account(requestDTO.getAccounts()) + .build(); + } else { + throw new ApiException(ErrorCode.Get_Member_Info_Failure.getCode()); + } + } + + /** + * 无重定向登录 + * + * @param requestDTO 游戏登录 + * @return {@link String } + */ + @Override + public String loginWithoutRedirect(GamesLogin requestDTO) { + GetTokenRequest request = new GetTokenRequest(); + request.setMerchantUserId(requestDTO.getAccount()); + request.setPlatForm(/*requestDTO.getPlatform()*/ "mobile"); // pc,h5, mobile , see enum: plat_form_enum + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + + GetTokenResponse response = dbSportsClient.getToken( + request, + sign, + timestamp, + requestDTO.getAgentId() + ); + + if (this.isSuccess(response.getCode())) { + String token = response.getData().getToken(); + Integer userId = response.getData().getUserId(); + GetTokenResponse.ServerInfo serverInfo = response.getData().getServerInfo(); + String h5Address = serverInfo.getH5Address(); + if (StringUtils.isEmpty(h5Address)) { + throw new ApiException(ErrorCode.Get_Url_Failure.getCode()); + } + + return h5Address + + "/index.html#/" + + "?token=" + + token + + "&nickname=" + + userId + + "&apiSrc=" + + serverInfo.getApiServerAddress() + + "&pushSrc=" + + serverInfo.getPushServerAddress() + + "&virtualSrc=" + + serverInfo.getVirtualAddress() + + "&platformName=XK体育"; + } + + + /*GetUrlRequest request = new GetUrlRequest(); + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + GetUrlResponse response = fbSportsClient.getUrl( + request, + sign, + timestamp, + requestDTO.getAgentId() + ); + //判断是否获取成功 + if (this.isSuccess(response.getCode())) { + List urlDTOS = new ArrayList<>(); + for (GetUrlResponse.UrlDTO urlDTO : response.getData()) { + if (urlDTO.getType() == 3) { // 3:h5 + urlDTOS.add(urlDTO); + } + } + if (urlDTOS.isEmpty()){ + throw new ApiException(ErrorCode.Get_Url_Failure.getCode()); + } + int randomIndex = new Random().nextInt(urlDTOS.size()); + GetUrlResponse.UrlDTO urlDTO = urlDTOS.get(randomIndex); + Collections.shuffle(urlDTO.getDomainList()); + return urlDTO.getDomainList().get(0).getDomain(); + }*/ + throw new ApiException(ErrorCode.Get_Url_Failure.getCode()); + } + + private static final Long GAME_ID = 11111L; + + /** + * 获取游戏列表 + * + * @param gamesBaseRequestDTO 游戏请求dto + * @return {@link String } + */ + @Transactional + @Override + public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) { + + Platform platform = gamesBaseRequestDTO.getVendor(); + Game condition = new Game(); + condition.setPlatformCode(platform.getPlatformCode()); + condition.setPlatformType(PlatformType.SPORTS.getCode()); + List gameList = gameService.selectGameList(condition); + //不存在这个游戏 + if (ObjectUtils.isEmpty(gameList)) { + Game game = new Game(); + game.setId(IdUtil.getSnowflakeNextId()); + game.setSortNo(1); + game.setPlatformCode(platform.getPlatformCode()); + game.setPlatformType(PlatformType.SPORTS.getCode()); + game.setGameCode("1"); + game.setGameSourceType(String.valueOf(1)); + game.setGameName("DB体育"); + game.setCreateBy(Constants.SYSTEM); + NameInfo nameInfo = new NameInfo(); + nameInfo.setLang("zh-CN"); + nameInfo.setName("DB体育"); + game.setNameInfo(Collections.singletonList(nameInfo)); + 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.DB_Sports; + } + + /** + * 汇兑转移状态 + * + * @param requestDTO 兑换转账请求dto + * @return {@link Boolean } + */ + @Override + public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO requestDTO) { + + GameExchangeMoney gameExchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(requestDTO.getGameExchangeMoneyId()); + if (null == gameExchangeMoney) { + throw new ApiException(ErrorCode.Transfer_Not_Exist.getCode()); + } + Integer status = StatusType.IN_PROGRESS.getValue(); + + if (!Objects.equals(gameExchangeMoney.getStatus(), StatusType.SUCCESS.getValue())) { + TransferDetailRequest request = new TransferDetailRequest(); + request.setMerchantUserId(requestDTO.getAccount()); + request.setTransferType(Objects.equals(gameExchangeMoney.getExchangeType(), TransferType.GAMES.getCode()) + ? "IN" : "OUT"); + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + TransferDetailResponse response = dbSportsClient.transferDetail( + request, + sign, + timestamp, + requestDTO.getAgentId() + ); + if (this.isSuccess(response.getCode())) { + status = StatusType.SUCCESS.getValue(); + } else { + status = StatusType.FAILURE.getValue(); + } + } + + return ExchangeTransferStatusResponseDTO.builder() + .statusType(status) + .balance(gameExchangeMoney.getBalance()) + .coinBefore(gameExchangeMoney.getCoinBefore()) + .coinAfter(gameExchangeMoney.getCoinAfter()) + .build(); + } + + + /** + * 按时间获取投注记录 + * + * @param requestDTO 按时间dto投注记录 + * @return {@link Boolean } + */ + @Override + public Boolean getBetRecordByTime(BetRecordByTimeDTO requestDTO) { + Long lend = requestDTO.getEndTime(); + Long lstart = requestDTO.getStartTime(); + //betRecordByTimeDTO.setStartTime(lstart); + //betRecordByTimeDTO.setEndTime(lend); + + OrderFilesRequest request = new OrderFilesRequest(); + request.setStartTime(lstart); + request.setEndTime(lend); + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + OrderFilesResponse orderFilesResponse = dbSportsClient.orderFiles( + request, + sign, + timestamp, + requestDTO.getAgentId() + ); + if (this.isSuccess(orderFilesResponse.getCode())) { + for (OrderFilesResponse.FileId fileId : orderFilesResponse.getData()) { + try { + getOrderData(fileId.getFileId(), requestDTO); + } catch (Exception e) { + log.error("获取订单数据失败,fileId:{},agentId:{}", fileId, requestDTO.getAgentId()); + } + } + return true; + } + log.error("获取订单文件失败,agentId:{}", requestDTO.getAgentId()); + return false; + } + + void getOrderData(Long fileId, BetRecordByTimeDTO requestDTO) { + OrderInfoRequest request = new OrderInfoRequest(); + request.setFileId(fileId); + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + + OrderInfoResponse orderInfoResponse = dbSportsClient.getOrderJsonData( + request, + sign, + timestamp, + requestDTO.getAgentId() + ); + if (!this.isSuccess(orderInfoResponse.getCode())) { + return; + } + List settledOrderList = new ArrayList<>(); + for (OrderInfoResponse.OrderDTO orderDTO : orderInfoResponse.getData()) { +// 0 Created 未确认 +// 1 Confirming 确认中 +// 2 Rejected 已拒单 +// 3 Canceled 已取消 +// 4 Confirmed 已接单 +// 5 Settled 已结算 + if (!orderDTO.getOrderStatus().equals(5)) { // 已结算 + continue; + } + settledOrderList.add(orderDTO); + } + this.batchInsert(settledOrderList, requestDTO); + } + + /** + * 按历史时间获取投注记录 + * + * @param requestDTO 按时间dto投注记录 + * @return {@link Boolean } + */ + @Override + public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO requestDTO) { + Long lend = requestDTO.getEndTime(); + Long lstart = requestDTO.getStartTime(); + //betRecordByTimeDTO.setStartTime(lstart); + //betRecordByTimeDTO.setEndTime(lend); + + OrderFilesRequest request = new OrderFilesRequest(); + request.setStartTime(lstart); + request.setEndTime(lend); + long timestamp = System.currentTimeMillis(); + String jsonBody = request.toJSON(); + String sign = getSign(jsonBody, + requestDTO.getAgentId(), + requestDTO.getAgentKey(), + timestamp + ); + OrderFilesResponse orderFilesResponse = dbSportsClient.orderFiles( + request, + sign, + timestamp, + requestDTO.getAgentId() + ); + if (this.isSuccess(orderFilesResponse.getCode())) { + for (OrderFilesResponse.FileId fileId : orderFilesResponse.getData()) { + try { + getOrderData(fileId.getFileId(), requestDTO); + } catch (Exception e) { + log.error("获取订单数据失败,fileId:{},agentId:{}", fileId, requestDTO.getAgentId()); + } + } + return true; + } + log.error("获取订单文件失败,agentId:{}", requestDTO.getAgentId()); + return false; + } + + + /** + * 赠送免费局数 + * + * @param createFreeSpinRequest 创建自由旋转请求 + * @return {@link Boolean } + */ + @Override + public Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest) { + throw new BaseException("暂不支持免费局数"); + } + + /** + * 获取游戏详细信息 + * + * @param getGameDetailRequestDTO 获取游戏详细信息请求dto + * @return {@link GetGameDetailResponseDTO } + */ + @Override + public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + /** + * 强制会员从游戏注销 + * + * @param kickMemberRequestDTO 踢会员请求dto + * @return {@link Boolean } + */ + @Override + public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) { + + return Boolean.FALSE; + } + + /** + * 踢成员全部 + * + * @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 settledOrderList 投注记录 + */ + private void batchInsert(List settledOrderList, BetRecordByTimeDTO betRecordByTimeDTO) { + List gameBettingDetails = new ArrayList<>(); + List wagersIds = new ArrayList<>(); + //数据组装 + List dataList = settledOrderList; + if (CollectionUtils.isEmpty(dataList)) { + return; + } + + //数据转化 + for (OrderInfoResponse.OrderDTO dataBean : dataList) { + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder() + .platform(betRecordByTimeDTO.getVendor()) + .data(dataBean).build()); + if (!ObjectUtils.isEmpty(bettingDetails)) { + bettingDetails.setId(IdUtil.getSnowflakeNextId()); + gameBettingDetails.add(bettingDetails); + } + wagersIds.add(dataBean.getId()); + } + if (CollectionUtils.isEmpty(gameBettingDetails)) { + return; + } + //查询重复数据id + List removeWagersIds = gameBettingDetailsService + .selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.DBSports.getCode()); + //用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) { + + //转化类 + OrderInfoResponse.OrderDTO dataBean = (OrderInfoResponse.OrderDTO) gamesDataBuildDTO.getData(); + Member member = memberService.selectMemberByGameAccount(dataBean.getMerchantUserId()); + if (ObjectUtils.isEmpty(member)) { + return null; + } + List gameList = redisCache.getCacheList(CacheConstants.DB_Sports); + Game game = gameList.get(0); + BigDecimal originPayoffAmount = new BigDecimal(dataBean.getSettleAmount()); + BigDecimal betAmount = new BigDecimal(dataBean.getStakeAmount()); + + int compareResult = originPayoffAmount.compareTo(betAmount); + long payoffTime = TimestampFromString.to(dataBean.getSettleTime()); + long createTime = TimestampFromString.to(dataBean.getCreateTime()); + Platform platform = gamesDataBuildDTO.getPlatform(); + String systemCurrency = platform.getOurCurrency(dataBean.getCurrency().toString()); + //数据构造 + GameBettingDetails gameBettingDetails = GameBettingDetails.builder() + .tenantKey(member.getTenantKey()) + //保存我们的币种id + .currencyCode(systemCurrency) + .memberId(member.getId()) + .gameCode(game.getGameCode()) + .gameType(PlatformType.SPORTS.getCode()) // 体育 + .platformCode(GamePlatforms.DBSports.getCode()) + .gameId(game.getId()) + .gameName(game.getGameName()) + .gameStatus(compareResult > 0 ? GameStatus.WIN.getCode() : compareResult < 0 ? GameStatus.FAIL.getCode() : GameStatus.FLAT.getCode()) + .gameStatusType(1) // 一般下注 + .gameCurrencyCode(dataBean.getCurrency().toString()) + .account(dataBean.getMerchantUserId()) + .wagersId(dataBean.getId()) + .wagersTime(createTime) + .betAmount(betAmount) + .payoffTime(payoffTime) + .payoffAmount(originPayoffAmount.abs()) + .settlementTime(payoffTime) + .turnover(betAmount) + .orderNo(dataBean.getId()) + .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/sports/fb/impl/FBSportsServiceImpl.java b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java index 01f3dfe..9e84d4d 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java +++ b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java @@ -383,7 +383,7 @@ public class FBSportsServiceImpl implements IGamesService { game.setSortNo(1); //game.setPlatformId(gamePlatform.getId()); game.setPlatformCode(platform.getPlatformCode()); - game.setPlatformType(PlatformType.GAME_HALL.getCode()); + game.setPlatformType(PlatformType.SPORTS.getCode()); game.setGameCode("1"); game.setGameSourceType(String.valueOf(1)); game.setGameName("FB体育"); From b0c058345dd5b9a4cd3ea34e219bb7f5b6158776 Mon Sep 17 00:00:00 2001 From: cengy Date: Wed, 9 Apr 2025 20:25:57 +0800 Subject: [PATCH 44/62] =?UTF-8?q?refactor(ff-game):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=20SV388=20=E6=8A=95=E6=B3=A8=E8=AE=B0=E5=BD=95=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 引入 DelayService 和 DelayTask 机制,实现异步处理投注记录请求 -将原有的同步方法拆分为实时记录和历史记录两个异步任务- 优化了错误处理逻辑,移除了不必要的异常抛出 - 调整了参数处理和日志记录,提高了代码可读性和维护性 --- .../api/sv388/impl/SV388GamesServiceImpl.java | 82 +++++++++++++------ 1 file changed, 58 insertions(+), 24 deletions(-) diff --git a/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java index a49ef4b..75ea9f0 100644 --- a/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java @@ -12,6 +12,8 @@ import com.ff.base.utils.DateUtils; import com.ff.base.utils.JsonUtil; import com.ff.base.utils.StringUtils; import com.ff.base.utils.uuid.IdUtils; +import com.ff.delay.DelayService; +import com.ff.delay.DelayTask; import com.ff.game.api.IGamesService; import com.ff.game.api.request.*; import com.ff.game.api.sv388.client.SV388Client; @@ -65,6 +67,9 @@ public class SV388GamesServiceImpl implements IGamesService { @Resource private IGameBettingDetailsService gameBettingDetailsService; + @Resource + private DelayService delayService; + /** * 游戏id */ @@ -337,14 +342,20 @@ public class SV388GamesServiceImpl implements IGamesService { } - /** - * 按时间获取投注记录 - * - * @param betRecordByTimeDTO 按时间dto投注记录 - * @return {@link List }<{@link GameBettingDetails }> - */ - @Override - public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { + class GetRealtimeRecordTask extends DelayTask { + BetRecordByTimeDTO betRecordByTimeDTO; + + public GetRealtimeRecordTask(BetRecordByTimeDTO betRecordByTimeDTO) { + this.betRecordByTimeDTO = betRecordByTimeDTO; + } + + @Override + public void execute() { + getRealtimeRecord(betRecordByTimeDTO); + } + } + + void getRealtimeRecord(BetRecordByTimeDTO betRecordByTimeDTO) { //请求参数 Map params = this.getKey(betRecordByTimeDTO); @@ -353,7 +364,6 @@ public class SV388GamesServiceImpl implements IGamesService { timeFrom = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00"; } - params.put("timeFrom", timeFrom); params.put("platform", GamePlatforms.SV388.getCode()); params.put("delayTime", 10000); @@ -363,27 +373,16 @@ public class SV388GamesServiceImpl implements IGamesService { if (this.getIsSuccess(aeBetRecordResponse.getStatus())) { //数据组装 this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO); - return Boolean.TRUE; } else { redisCache.deleteObject(CacheConstants.SV388_TIME_FROM); log.error("获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc()); - throw new BaseException(aeBetRecordResponse.getDesc()); } - } - /** - * 按历史时间获取投注记录 - * - * @param betRecordByTimeDTO 按时间dto投注记录 - * @return {@link Boolean } - */ - @Override - public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { + void getHistoryRecord(BetRecordByTimeDTO betRecordByTimeDTO) { Map params = this.getKey(betRecordByTimeDTO); 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"; - + String endTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00"; params.put("startTime", startTime); params.put("endTime", endTime); @@ -395,13 +394,48 @@ public class SV388GamesServiceImpl implements IGamesService { if (this.getIsSuccess(aeBetRecordResponse.getStatus())) { //数据组装 this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO); - return Boolean.TRUE; } else { log.error("获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc()); - throw new BaseException(aeBetRecordResponse.getDesc()); } } + class GetHistoryRecordTask extends DelayTask { + BetRecordByTimeDTO betRecordByTimeDTO; + + public GetHistoryRecordTask(BetRecordByTimeDTO betRecordByTimeDTO) { + this.betRecordByTimeDTO = betRecordByTimeDTO; + } + + @Override + public void execute() { + getHistoryRecord(betRecordByTimeDTO); + } + } + + /** + * 按时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link List }<{@link GameBettingDetails }> + */ + @Override + public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { + delayService.addTask(new GetRealtimeRecordTask(betRecordByTimeDTO)); + return Boolean.TRUE; + } + + /** + * 按历史时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link Boolean } + */ + @Override + public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { + delayService.addTask(new GetHistoryRecordTask(betRecordByTimeDTO)); + return Boolean.TRUE; + } + /** * 赠送免费局数 * From fb6138f9a08a0a6803158aeeba2be4666925c480 Mon Sep 17 00:00:00 2001 From: cengy Date: Thu, 10 Apr 2025 10:20:05 +0800 Subject: [PATCH 45/62] =?UTF-8?q?refactor(game):=20=E9=87=8D=E6=9E=84=20AE?= =?UTF-8?q?=20=E5=92=8C=20SV388=20=E7=9A=84=E6=8A=95=E6=B3=A8=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E8=8E=B7=E5=8F=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 为 GamesAEServiceImpl 和 SV388GamesServiceImpl 类添加 DelayService 依赖 - 实现 GetRealtimeRecordTask 和 GetHistoryRecordTask 类继承 DelayTask - 重写 getBetRecordByTime 和 getBetRecordByHistoryTime 方法,使用延迟任务处理大量数据 - 优化 batchInsert 方法,增加空数据判断和日志记录 - 调整 kickMember 方法,移除不必要的日志输出 --- .../game/api/ae/impl/GamesAEServiceImpl.java | 87 ++++++++++++++----- .../api/sv388/impl/SV388GamesServiceImpl.java | 16 +++- 2 files changed, 80 insertions(+), 23 deletions(-) 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 612c597..9b3eb1e 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 @@ -16,10 +16,13 @@ import com.ff.base.utils.uuid.IdUtils; import com.ff.common.dto.GameBalanceExchange; import com.ff.common.service.ITenantGameQuotaService; import com.ff.config.KeyConfig; +import com.ff.delay.DelayService; +import com.ff.delay.DelayTask; import com.ff.game.api.IGamesService; import com.ff.game.api.ae.client.AEClient; import com.ff.game.api.ae.dto.*; import com.ff.game.api.request.*; +import com.ff.game.api.sv388.impl.SV388GamesServiceImpl; import com.ff.game.api.xk.dto.XKKickMemberDTO; import com.ff.game.domain.*; import com.ff.game.service.IGameBettingDetailsService; @@ -79,6 +82,9 @@ public class GamesAEServiceImpl implements IGamesService { @Resource private IGameBettingDetailsService gameBettingDetailsService; + @Resource + private DelayService delayService; + /** * 游戏id */ @@ -345,15 +351,20 @@ public class GamesAEServiceImpl implements IGamesService { .build(); } + class GetRealtimeRecordTask extends DelayTask { + BetRecordByTimeDTO betRecordByTimeDTO; - /** - * 按时间获取投注记录 - * - * @param betRecordByTimeDTO 按时间dto投注记录 - * @return {@link List }<{@link GameBettingDetails }> - */ - @Override - public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { + public GetRealtimeRecordTask(BetRecordByTimeDTO betRecordByTimeDTO) { + this.betRecordByTimeDTO = betRecordByTimeDTO; + } + + @Override + public void execute() { + getRealtimeRecord(betRecordByTimeDTO); + } + } + + void getRealtimeRecord(BetRecordByTimeDTO betRecordByTimeDTO) { //请求参数 log.info("GamesAEServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO); Map params = this.getKey(betRecordByTimeDTO); @@ -373,23 +384,32 @@ public class GamesAEServiceImpl implements IGamesService { if (this.getIsSuccess(aeBetRecordResponse.getStatus())) { //数据组装 this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO); - return Boolean.TRUE; + if (aeBetRecordResponse.getTransactions().size() >= 20000) { + delayService.addTask(new GetRealtimeRecordTask(betRecordByTimeDTO)); + } + //return Boolean.TRUE; } else { redisCache.deleteObject(CacheConstants.AE_TIME_FROM); log.error("GamesAEServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc()); - throw new BaseException(aeBetRecordResponse.getDesc()); + //throw new BaseException(aeBetRecordResponse.getDesc()); } } - /** - * 按历史时间获取投注记录 - * - * @param betRecordByTimeDTO 按时间dto投注记录 - * @return {@link Boolean } - */ - @Override - public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { + class GetHistoryRecordTask extends DelayTask { + BetRecordByTimeDTO betRecordByTimeDTO; + + public GetHistoryRecordTask(BetRecordByTimeDTO betRecordByTimeDTO) { + this.betRecordByTimeDTO = betRecordByTimeDTO; + } + + @Override + public void execute() { + getHistoryRecord(betRecordByTimeDTO); + } + } + + void getHistoryRecord(BetRecordByTimeDTO betRecordByTimeDTO) { log.info("GamesAEServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", betRecordByTimeDTO); Map params = this.getKey(betRecordByTimeDTO); String startTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00"; @@ -405,13 +425,40 @@ public class GamesAEServiceImpl implements IGamesService { if (this.getIsSuccess(aeBetRecordResponse.getStatus())) { //数据组装 this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO); - return Boolean.TRUE; + if (aeBetRecordResponse.getTransactions().size() >= 20000) { + delayService.addTask(new GetHistoryRecordTask(betRecordByTimeDTO)); + } +// return Boolean.TRUE; } else { log.error("GamesAEServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc()); - throw new BaseException(aeBetRecordResponse.getDesc()); +// throw new BaseException(aeBetRecordResponse.getDesc()); } } + /** + * 按时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link List }<{@link GameBettingDetails }> + */ + @Override + public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { + delayService.addTask(new GetRealtimeRecordTask(betRecordByTimeDTO)); + return Boolean.TRUE; + } + + /** + * 按历史时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link Boolean } + */ + @Override + public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { + delayService.addTask(new GetHistoryRecordTask(betRecordByTimeDTO)); + return Boolean.TRUE; + } + /** * 赠送免费局数 * diff --git a/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java index 75ea9f0..851b650 100644 --- a/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java @@ -201,7 +201,7 @@ public class SV388GamesServiceImpl implements IGamesService { //不存在这个游戏 if (ObjectUtils.isEmpty(gameList)) { Game game = new Game(); - game.setId(IdUtil.getSnowflakeNextId()); + game.setId(/*IdUtil.getSnowflakeNextId()*/GAME_ID); game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.SV388.getCode()) + 1); game.setPlatformCode(platform.getPlatformCode()); game.setPlatformType(platformType); @@ -373,6 +373,9 @@ public class SV388GamesServiceImpl implements IGamesService { if (this.getIsSuccess(aeBetRecordResponse.getStatus())) { //数据组装 this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO); + if (aeBetRecordResponse.getTransactions().size() >= 20000) { + delayService.addTask(new GetRealtimeRecordTask(betRecordByTimeDTO)); + } } else { redisCache.deleteObject(CacheConstants.SV388_TIME_FROM); log.error("获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc()); @@ -394,6 +397,9 @@ public class SV388GamesServiceImpl implements IGamesService { if (this.getIsSuccess(aeBetRecordResponse.getStatus())) { //数据组装 this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO); + if (aeBetRecordResponse.getTransactions().size() >= 20000) { + delayService.addTask(new GetHistoryRecordTask(betRecordByTimeDTO)); + } } else { log.error("获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc()); } @@ -466,7 +472,6 @@ public class SV388GamesServiceImpl implements IGamesService { */ @Override public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) { - log.info("GamesAEServiceImpl [kickMember] 请求参数 {}", kickMemberRequestDTO); Map params = this.getKey(kickMemberRequestDTO); params.put("userIds", kickMemberRequestDTO.getAccount()); XKKickMemberDTO xkKickMemberDTO = sv388Client.kickMember(params); @@ -528,12 +533,16 @@ public class SV388GamesServiceImpl implements IGamesService { * * @param aeBetRecordResponse ae下注记录响应dto */ - private synchronized void batchInsert(SV388BetRecordResponse aeBetRecordResponse, BetRecordByTimeDTO betRecordByTimeDTO) { + private void batchInsert(SV388BetRecordResponse aeBetRecordResponse, BetRecordByTimeDTO betRecordByTimeDTO) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 List dataBean = aeBetRecordResponse.getTransactions(); + if (CollectionUtils.isEmpty(dataBean)) { + return; + } + String timeFrom = null; //数据转化 for (SV388BetRecordResponse.Transaction bean : dataBean) { @@ -562,6 +571,7 @@ public class SV388GamesServiceImpl implements IGamesService { timeFrom = DateUtils.convertTimestampToFormattedDate(DateUtils.getNowDate(), DateUtils.ISO_8601_FORMAT, "UTC+8") + "+08:00"; } redisCache.setCacheObject(CacheConstants.SV388_TIME_FROM, timeFrom); + } /** From bf955ed14bf2f5ca7ecc3697f9a69a36e15cbf3b Mon Sep 17 00:00:00 2001 From: cengy Date: Thu, 10 Apr 2025 13:50:46 +0800 Subject: [PATCH 46/62] =?UTF-8?q?refactor(game):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3=E5=92=8C?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改游戏 ID 类型从 Long 到 String - 更新游戏创建和验证逻辑 - 调整游戏数据传输对象结构 - 优化游戏列表响应格式 --- .../game/api/ae/impl/GamesAEServiceImpl.java | 2 +- .../dg/service/impl/GamesDGServiceImpl.java | 3 +- .../api/fc/dto/ApiFCGameListResponseDTO.java | 2 +- .../game/api/fc/impl/GamesFCServiceImpl.java | 2 +- .../game/api/jili/dto/JILIGamesDataDTO.java | 2 +- .../service/impl/GamesJILIServiceImpl.java | 4 +- .../ff/game/api/km/dto/KMGameResponse.java | 2 +- .../game/api/km/impl/GamesKMServiceImpl.java | 2 +- .../api/meitian/dto/MeiTianGameDataDTO.java | 2 +- .../meitian/impl/MeiTianGameServiceImpl.java | 7 +--- .../ng/service/impl/GamesPGServiceImpl.java | 2 +- .../game/api/pgt/dto/PGTGameListResponse.java | 2 +- .../api/pgt/impl/GamesPGTServiceImpl.java | 3 +- .../game/api/pgx/dto/PGXGameListResponse.java | 2 +- .../api/pgx/impl/GamesPGXServiceImpl.java | 2 +- .../game/api/sa/impl/GamesSAServiceImpl.java | 2 +- .../api/sv388/impl/SV388GamesServiceImpl.java | 4 +- .../com/ff/game/api/xk/dto/XKGamesDTO.java | 2 +- .../xk/service/impl/GamesXKServiceImpl.java | 2 +- .../ff/game/domain/GameBettingDetails.java | 2 +- .../ff/sports/db/client/DBSportsClient.java | 14 ++++--- .../ff/sports/db/dto/CreateUserRequest.java | 24 ++++++------ .../sports/db/impl/DBSportsServiceImpl.java | 39 +++++++------------ .../sports/fb/impl/FBSportsServiceImpl.java | 2 +- 24 files changed, 59 insertions(+), 71 deletions(-) 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 9b3eb1e..9cc6c0b 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 @@ -631,7 +631,7 @@ public class GamesAEServiceImpl implements IGamesService { .gameCode(resultBean.getGameCode()) .gameType(PlatformType.GAME_HALL.getCode()) .platformCode(GamePlatforms.AE.getCode()) - .gameId(GAME_ID) + .gameId(/*GAME_ID*/ StringUtils.addSuffix(GamePlatforms.AE.getCode(), 1)) .gameName(resultBean.getGameName()) .gameStatus(gameStatus) .gameStatusType(resultBean.getSettleStatus()) 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 b4315e9..f7383c1 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 @@ -578,7 +578,8 @@ public class GamesDGServiceImpl implements IGamesService { .gameCode(String.valueOf(resultBean.getGameId())) .gameType(PlatformType.CARD_GAME.getCode()) .platformCode(GamePlatforms.DG.getCode()) - .gameId(GAME_ID) + //.gameId(GAME_ID) + .gameId(game.getGameId()) .gameName(game.getGameName()) .gameStatus(gameStatus) .gameStatusType(resultBean.getGameType()) diff --git a/ff-game/src/main/java/com/ff/game/api/fc/dto/ApiFCGameListResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/fc/dto/ApiFCGameListResponseDTO.java index 784fd18..879d51b 100644 --- a/ff-game/src/main/java/com/ff/game/api/fc/dto/ApiFCGameListResponseDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/fc/dto/ApiFCGameListResponseDTO.java @@ -37,7 +37,7 @@ public class ApiFCGameListResponseDTO { /** * 系统游戏id */ - private Long systemGameId; + private String systemGameId; /** * 游戏id */ 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 1c4a951..2a20a3e 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 @@ -285,7 +285,7 @@ public class GamesFCServiceImpl implements IGamesService { game = games.get(0); } - gameDetails.setSystemGameId(game.getId()); + gameDetails.setSystemGameId(game.getGameId()); gameDetails.setGameId(gameIdKey); gameDetailsList.add(gameDetails); } diff --git a/ff-game/src/main/java/com/ff/game/api/jili/dto/JILIGamesDataDTO.java b/ff-game/src/main/java/com/ff/game/api/jili/dto/JILIGamesDataDTO.java index 55a35da..f653ae0 100644 --- a/ff-game/src/main/java/com/ff/game/api/jili/dto/JILIGamesDataDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/jili/dto/JILIGamesDataDTO.java @@ -22,7 +22,7 @@ public class JILIGamesDataDTO { /** *自己系统游戏id */ - private Long systemGameId; + private String systemGameId; /** * 名称 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 f82a544..f2c36d3 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 @@ -253,7 +253,7 @@ public class GamesJILIServiceImpl implements IGamesService { } else { game = games.get(0); } - gamesDataDTO.setSystemGameId(game.getId()); + gamesDataDTO.setSystemGameId(game.getGameId()); } @@ -813,7 +813,7 @@ public class GamesJILIServiceImpl implements IGamesService { .gameCode(jiliBetRecordDataResponseDTO.getGameId()) .gameType(JILIGameType.findSystemByCode(jiliBetRecordDataResponseDTO.getGameCategoryId())) .platformCode(GamePlatforms.JILI.getInfo()) - .gameId(gamesDataDTO.getSystemGameId()) + .gameId(/*gamesDataDTO.getSystemGameId()*/gamesDataDTO.getSystemGameId()) .gameName(gamesDataDTO.getName().getZhCN()) .gameStatus(jiliBetRecordDataResponseDTO.getStatus()) .gameStatusType(jiliBetRecordDataResponseDTO.getType()) diff --git a/ff-game/src/main/java/com/ff/game/api/km/dto/KMGameResponse.java b/ff-game/src/main/java/com/ff/game/api/km/dto/KMGameResponse.java index cd160d1..57eb949 100644 --- a/ff-game/src/main/java/com/ff/game/api/km/dto/KMGameResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/km/dto/KMGameResponse.java @@ -91,7 +91,7 @@ public class KMGameResponse { /** * 系统游戏id */ - private Long systemGameId; + private String systemGameId; /** * 游戏是否提供试玩 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 6029bbc..189ca02 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 @@ -302,7 +302,7 @@ public class GamesKMServiceImpl implements IGamesService { } else { game = games.get(0); } - gamesDataDTO.setSystemGameId(game.getId()); + gamesDataDTO.setSystemGameId(game.getGameId()); } return gameList.getGames(); } diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianGameDataDTO.java b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianGameDataDTO.java index 2a89a6b..45cccf1 100644 --- a/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianGameDataDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianGameDataDTO.java @@ -22,7 +22,7 @@ public class MeiTianGameDataDTO { /** *自己系统游戏id */ - private Long systemGameId; + private String systemGameId; private String gameId; private String cnName; private String enName; 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 c67b7ae..25e3e91 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 @@ -248,8 +248,7 @@ public class MeiTianGameServiceImpl implements IGamesService { } else { game = games.get(0); } - gamesDataDTO.setSystemGameId(game.getId()); - + gamesDataDTO.setSystemGameId(game.getGameId()); } redisCache.deleteObject(CacheConstants.MeiTian_GAMES); @@ -827,10 +826,6 @@ public class MeiTianGameServiceImpl implements IGamesService { } } - public LocalDate getDate(int daysToSubtract) { - return LocalDate.now().minusDays(daysToSubtract); // 获取当前日期减去两天 - } - public String getDateStr(int daysToSubtract) { // 获取当前日期减去指定天数 LocalDate date = LocalDate.now().minusDays(daysToSubtract); 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 c1b9208..6f04a19 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 @@ -711,7 +711,7 @@ public class GamesPGServiceImpl implements IGamesService { .gameCode(gamesDataDTO.getGameCode()) .gameType(NGGameType.findSystemByCode(resultBean.getGameType())) .platformCode(NGPlatforms.getByCode(resultBean.getPlatType()).getPlatform()) - .gameId(gamesDataDTO.getId()) + .gameId(gamesDataDTO.getGameId()) .gameName(gamesDataDTO.getGameName()) .gameStatus(gameStatus) .gameStatusType(1) 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 index 28d0704..717680e 100644 --- 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 @@ -83,7 +83,7 @@ public class PGTGameListResponse { /** * 系统游戏id */ - private Long systemGameId; + private String systemGameId; /** * 游戏排名 diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java index 02f89a9..48c42cf 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java @@ -244,7 +244,7 @@ public class GamesPGTServiceImpl implements IGamesService { } else { game = games.get(0); } - gameIdKey.setSystemGameId(game.getId()); + gameIdKey.setSystemGameId(game.getGameId()); } @@ -647,6 +647,7 @@ public class GamesPGTServiceImpl implements IGamesService { .gameCode(resultBean.getGameCode()) .gameType(PGTGameType.findSystemByCode(gamesDataDTO.getCategory())) .platformCode(GamePlatforms.PGT.getCode()) + //.gameId(gamesDataDTO.getSystemGameId()) .gameId(gamesDataDTO.getSystemGameId()) .gameName(gamesDataDTO.getName()) .gameStatus(PGTPayoutStatus.getByCode(resultBean.getPayoutStatus()).getSystemCode()) diff --git a/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXGameListResponse.java b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXGameListResponse.java index f53e146..500a792 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXGameListResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXGameListResponse.java @@ -48,7 +48,7 @@ public class PGXGameListResponse { /** * 系统游戏id */ - private Long systemGameId; + private String systemGameId; /** 游戏代码 (字符串类型) */ @JsonProperty("gameCode") 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 65c4e08..ed72b4a 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 @@ -252,7 +252,7 @@ public class GamesPGXServiceImpl implements IGamesService { } else { game = games.get(0); } - gamesDataDTO.setSystemGameId(game.getId()); + gamesDataDTO.setSystemGameId(game.getGameId()); } 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 c697f95..984a0ba 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 @@ -612,7 +612,7 @@ public class GamesSAServiceImpl implements IGamesService { .gameCode(resultBean.getGameID()) .gameType(PlatformType.CARD_GAME.getCode()) .platformCode(GamePlatforms.SA.getInfo()) - .gameId(GAME_ID) + .gameId(/*GAME_ID*/game.getGameId()) .gameName(game.getGameName()) .gameStatus(gameStatus) .gameStatusType(1) diff --git a/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java index 851b650..b2ca059 100644 --- a/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java @@ -201,7 +201,7 @@ public class SV388GamesServiceImpl implements IGamesService { //不存在这个游戏 if (ObjectUtils.isEmpty(gameList)) { Game game = new Game(); - game.setId(/*IdUtil.getSnowflakeNextId()*/GAME_ID); + game.setId(IdUtil.getSnowflakeNextId()); game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.SV388.getCode()) + 1); game.setPlatformCode(platform.getPlatformCode()); game.setPlatformType(platformType); @@ -618,7 +618,7 @@ public class SV388GamesServiceImpl implements IGamesService { .gameCode(resultBean.getGameCode()) .gameType(PlatformType.VIDEO.getCode()) .platformCode(GamePlatforms.SV388.getCode()) - .gameId(GAME_ID) + .gameId(/*GAME_ID*/GamePlatforms.SV388.getCode() + "_" + 1) .gameName(resultBean.getGameName()) .gameStatus(gameStatus) .gameStatusType(resultBean.getSettleStatus()) diff --git a/ff-game/src/main/java/com/ff/game/api/xk/dto/XKGamesDTO.java b/ff-game/src/main/java/com/ff/game/api/xk/dto/XKGamesDTO.java index da08376..d430ae8 100644 --- a/ff-game/src/main/java/com/ff/game/api/xk/dto/XKGamesDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/xk/dto/XKGamesDTO.java @@ -43,7 +43,7 @@ public class XKGamesDTO { /** *自己系统游戏id */ - private Long systemGameId; + private String systemGameId; /** * jp */ 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 c916bb1..70a4f36 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 @@ -253,7 +253,7 @@ public class GamesXKServiceImpl implements IGamesService { } else { game = games.get(0); } - gamesDataDTO.setSystemGameId(game.getId()); + gamesDataDTO.setSystemGameId(game.getGameId()); } redisCache.deleteObject(CacheConstants.XK_GAMES); 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 76a5785..3853137 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 @@ -53,7 +53,7 @@ public class GameBettingDetails extends BaseEntity /** 游戏id */ @Excel(name = "游戏id") @JsonSerialize(using = ToStringSerializer.class) - private Long gameId; + private String gameId; /** 游戏类型 ff_game_type 字典 */ @Excel(name = "游戏类型 ff_game_type 字典") diff --git a/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java b/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java index 6fabff8..8d58440 100644 --- a/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java +++ b/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java @@ -5,7 +5,6 @@ import com.ff.sports.db.address.DBSportsAddress; import com.ff.sports.db.dto.*; /** - * * @author cengy */ @Address(source = DBSportsAddress.class) @@ -15,11 +14,14 @@ public interface DBSportsClient { * * @return {@link CreateUserResponse} */ - @Post(url = "/api/v2/new/user/create") - CreateUserResponse createMember(@JSONBody CreateUserRequest request, - @Header("sign") @Var("sign") String sign, - @Header("timestamp") @Var("timestamp") long timestamp, - @Header("merchantId") @Var("merchantId") String merchantId); + @Post(url = "/api/user/create", + headers = { + "Content-type: application/x-www-form-urlencoded" + } + ) + CreateUserResponse createMember(@Body CreateUserRequest request, + @Header("requestId") @Var("requestId") String requestId, + @Header("lang") @Var("lang") String lang); /** * 用户金额转入到FB体育平台,支持两位小数,最小0.01,必须是正数 diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java index fd466fb..e985d26 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java +++ b/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java @@ -1,12 +1,9 @@ package com.ff.sports.db.dto; -import com.alibaba.fastjson2.JSON; +import com.ff.base.utils.sign.Md5Utils; import lombok.Data; import java.io.Serializable; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; /** * @author cengy @@ -16,15 +13,16 @@ public class CreateUserRequest implements Serializable { private static final long serialVersionUID = 1L; - private String merchantUserId;// 渠道用户id,支持40位字符串,必须唯一 - private List currencyIds = null; // 币种id集合 , see enum: currency - private Integer oddsLevel = null; // 赔率级别,不传则为默认, see enum: user_odds_level_enum + private String userName; // 用户名(可以包含但是不要等同于特殊字符或者空格,长度控制在30个字符以下) + private String merchantCode; // 商户code + private String timestamp = System.currentTimeMillis() + ""; // 13位时间戳 + private String currency; // 币种 + private String nickname; // N 昵称 + private String agentId; // N 信用网(代理id) + private String sign; // 签名 signature =MD5(MD5(userName +”&”+ merchantCode +”&”+ timestamp) + ”&”+ key) - public String toJSON() { - Map map = new LinkedHashMap<>(); - map.put("currencyIds", currencyIds); - map.put("merchantUserId", merchantUserId); - map.put("oddsLevel", oddsLevel); - return JSON.toJSONString(map); + public void calcSign(String key) { + String signature = Md5Utils.md5New(Md5Utils.md5New(userName + "&" + merchantCode + "&" + timestamp) + "&" + key); + this.sign = signature; } } diff --git a/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java b/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java index 3df555c..6aa4fef 100644 --- a/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java +++ b/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java @@ -87,31 +87,22 @@ public class DBSportsServiceImpl implements IGamesService { /** * 创建成员 * - * @param createMemberRequestDTO 创建成员请求dto + * @param requestDTO 创建成员请求dto * @return {@link Boolean } */ @Override - public Boolean createMember(CreateMemberRequestDTO createMemberRequestDTO) { + public Boolean createMember(CreateMemberRequestDTO requestDTO) { - long timestamp = System.currentTimeMillis(); CreateUserRequest request = new CreateUserRequest(); - request.setMerchantUserId(createMemberRequestDTO.getAccount()); - ArrayList currencyIds = new ArrayList<>(); - currencyIds.add(Integer.parseInt(createMemberRequestDTO.getCurrency())); - request.setCurrencyIds(currencyIds); - String jsonBody = /*SortByAttributeNameASC.get(request)*/ request.toJSON(); - String sign = getSign(jsonBody, - createMemberRequestDTO.getAgentId(), - createMemberRequestDTO.getAgentKey(), - timestamp - ); + request.setUserName(requestDTO.getAccount()); + request.setMerchantCode(requestDTO.getAgentId()); + request.setCurrency(requestDTO.getCurrency()); + request.calcSign(requestDTO.getAgentKey()); - CreateUserResponse response = dbSportsClient.createMember( - request, - sign, - timestamp, createMemberRequestDTO.getAgentId()); + String lang = "zh"; + String requestId = IdUtils.fastUUID(); + CreateUserResponse response = dbSportsClient.createMember(request, requestId, lang); if (isSuccess(response.getCode())) { - log.info("创建会员成功, account:{}->{}", createMemberRequestDTO.getAccount(), response.getData()); return Boolean.TRUE; } @@ -388,7 +379,7 @@ public class DBSportsServiceImpl implements IGamesService { game.setPlatformType(PlatformType.SPORTS.getCode()); game.setGameCode("1"); game.setGameSourceType(String.valueOf(1)); - game.setGameName("DB体育"); + game.setGameName(GamePlatforms.DBSports.getInfo()); game.setCreateBy(Constants.SYSTEM); NameInfo nameInfo = new NameInfo(); nameInfo.setLang("zh-CN"); @@ -715,8 +706,8 @@ public class DBSportsServiceImpl implements IGamesService { if (ObjectUtils.isEmpty(member)) { return null; } - List gameList = redisCache.getCacheList(CacheConstants.DB_Sports); - Game game = gameList.get(0); + //List gameList = redisCache.getCacheList(CacheConstants.DB_Sports); + //Game game = gameList.get(0); BigDecimal originPayoffAmount = new BigDecimal(dataBean.getSettleAmount()); BigDecimal betAmount = new BigDecimal(dataBean.getStakeAmount()); @@ -731,11 +722,11 @@ public class DBSportsServiceImpl implements IGamesService { //保存我们的币种id .currencyCode(systemCurrency) .memberId(member.getId()) - .gameCode(game.getGameCode()) + .gameCode("1") .gameType(PlatformType.SPORTS.getCode()) // 体育 .platformCode(GamePlatforms.DBSports.getCode()) - .gameId(game.getId()) - .gameName(game.getGameName()) + .gameId(GamePlatforms.DBSports.getCode() + "_1") + .gameName(GamePlatforms.DBSports.getInfo()) .gameStatus(compareResult > 0 ? GameStatus.WIN.getCode() : compareResult < 0 ? GameStatus.FAIL.getCode() : GameStatus.FLAT.getCode()) .gameStatusType(1) // 一般下注 .gameCurrencyCode(dataBean.getCurrency().toString()) diff --git a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java index 9e84d4d..3f5f6d9 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java +++ b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java @@ -732,7 +732,7 @@ public class FBSportsServiceImpl implements IGamesService { .gameCode(game.getGameCode()) .gameType(8) // 体育 .platformCode(GamePlatforms.FBSports.getCode()) - .gameId(game.getId()) + .gameId(game.getGameId()) .gameName(game.getGameName()) .gameStatus(compareResult > 0 ? GameStatus.WIN.getCode() : compareResult < 0 ? GameStatus.FAIL.getCode() : GameStatus.FLAT.getCode()) .gameStatusType(1) // 一般下注 From f32794285a65e075cca2fa9a43c4d50babc29384 Mon Sep 17 00:00:00 2001 From: shi Date: Fri, 11 Apr 2025 10:52:17 +0800 Subject: [PATCH 47/62] =?UTF-8?q?refactor(game):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E4=BD=99=E9=A2=9D=E8=BD=AC=E7=A7=BB=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增抽象步进处理类 AbstractStepProcessor 实现通用的处理和回滚逻辑- 新增具体步进处理实现类 CreateOrderServiceImpl、DeductBalanceServiceImpl 和 AddBalanceServiceImpl -优化 ApiGameController 中的余额转移接口,采用异步处理方式- 重构 GameExchangeMoneyService 中的插入逻辑,支持更新 - 新增 GameExchangeDTO 用于游戏兑换货币的相关操作 - 更新相关枚举类和 DTO 类以支持新的业务逻辑 --- .../java/com/ff/base/enums/ErrorCode.java | 1 + .../com/ff/base/enums/GameExchangeStep.java | 18 +- .../java/com/ff/base/enums/GamePlatforms.java | 16 ++ .../java/com/ff/base/enums/TimeOutType.java | 25 ++ .../java/com/ff/base/enums/TriggerType.java | 21 ++ .../com/ff/base/manager/AsyncManager.java | 48 +++- .../ff/api/controller/ApiGameController.java | 123 ++++++---- .../ff/common/dto/GameBalanceExchange.java | 5 + .../impl/TenantGameQuotaServiceImpl.java | 24 +- .../game/api/ae/impl/GamesAEServiceImpl.java | 32 +-- .../dg/service/impl/GamesDGServiceImpl.java | 33 +-- .../api/exchange/AbstractStepProcessor.java | 118 ++++++++++ .../api/exchange/StepProcessorFactory.java | 47 ++++ .../api/exchange/StepProcessorService.java | 56 +++++ .../api/exchange/dto/GameExchangeDTO.java | 32 +++ .../exchange/impl/AddBalanceServiceImpl.java | 170 ++++++++++++++ .../exchange/impl/CreateOrderServiceImpl.java | 146 ++++++++++++ .../impl/DeductBalanceServiceImpl.java | 189 +++++++++++++++ .../impl/PlatformTransactionServiceImpl.java | 221 ++++++++++++++++++ .../game/api/fc/impl/GamesFCServiceImpl.java | 33 +-- .../service/impl/GamesJILIServiceImpl.java | 29 +-- .../game/api/km/impl/GamesKMServiceImpl.java | 34 +-- .../meitian/impl/MeiTianGameServiceImpl.java | 35 +-- .../ng/service/impl/GamesPGServiceImpl.java | 32 +-- .../api/pgt/impl/GamesPGTServiceImpl.java | 32 +-- .../api/pgx/impl/GamesPGXServiceImpl.java | 30 +-- .../ExchangeTransferMoneyRequestDTO.java | 17 +- .../game/api/sa/impl/GamesSAServiceImpl.java | 36 +-- .../com/ff/game/api/xk/client/XKClient.java | 10 + .../XKCheckTransferByTransactionIdDTO.java | 76 ++++++ .../xk/service/impl/GamesXKServiceImpl.java | 122 +++++++--- .../main/java/com/ff/game/domain/ExtInfo.java | 19 ++ .../impl/GameExchangeMoneyServiceImpl.java | 5 +- .../common/TenantGameQuotaFlowMapper.xml | 3 + 34 files changed, 1431 insertions(+), 407 deletions(-) create mode 100644 ff-base/src/main/java/com/ff/base/enums/TimeOutType.java create mode 100644 ff-base/src/main/java/com/ff/base/enums/TriggerType.java create mode 100644 ff-game/src/main/java/com/ff/game/api/exchange/AbstractStepProcessor.java create mode 100644 ff-game/src/main/java/com/ff/game/api/exchange/StepProcessorFactory.java create mode 100644 ff-game/src/main/java/com/ff/game/api/exchange/StepProcessorService.java create mode 100644 ff-game/src/main/java/com/ff/game/api/exchange/dto/GameExchangeDTO.java create mode 100644 ff-game/src/main/java/com/ff/game/api/exchange/impl/AddBalanceServiceImpl.java create mode 100644 ff-game/src/main/java/com/ff/game/api/exchange/impl/CreateOrderServiceImpl.java create mode 100644 ff-game/src/main/java/com/ff/game/api/exchange/impl/DeductBalanceServiceImpl.java create mode 100644 ff-game/src/main/java/com/ff/game/api/exchange/impl/PlatformTransactionServiceImpl.java create mode 100644 ff-game/src/main/java/com/ff/game/api/xk/dto/XKCheckTransferByTransactionIdDTO.java diff --git a/ff-base/src/main/java/com/ff/base/enums/ErrorCode.java b/ff-base/src/main/java/com/ff/base/enums/ErrorCode.java index ddb5bb7..89bfeb4 100644 --- a/ff-base/src/main/java/com/ff/base/enums/ErrorCode.java +++ b/ff-base/src/main/java/com/ff/base/enums/ErrorCode.java @@ -30,6 +30,7 @@ public enum ErrorCode { ACCOUNT_NOT_ONLINE(1014, "账号不在线"), FREQUENT_BALANCE_TRANSFER(1015, "当前游戏账号余额转移频繁"), PLATFORM_NOT_METHODS(1016, "游戏平台不支持的方法"), + DUPLICATE_ORDER_ID (1017, "重复的订单id"), ; // 获取错误码 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 index 2f13939..31257c4 100644 --- a/ff-base/src/main/java/com/ff/base/enums/GameExchangeStep.java +++ b/ff-base/src/main/java/com/ff/base/enums/GameExchangeStep.java @@ -15,10 +15,20 @@ import lombok.Getter; @AllArgsConstructor public enum GameExchangeStep { CREATE_ORDER(1, "创建订单"), - PLATFORM_TRANSACTION(2, "平台交易成功"), - PLATFORM_TRANSACTION_CONFIRM(3, "平台交易状态确认"), - TENANT_QUOTA_DEDUCTED(4, "租户额度扣减成功"); + DEDUCT_BALANCE(2, "转入提前扣租户余额"), + PLATFORM_TRANSACTION(3, "平台交易成功"), + TENANT_QUOTA_DEDUCTED(4, "转出租户额度增加成功"); - private final int code; + private final Integer code; private final String description; + + // 根据 code 获取对应的枚举 + public static GameExchangeStep getByCode(int code) { + for (GameExchangeStep step : GameExchangeStep.values()) { + if (step.getCode() == code) { + return step; + } + } + return null; + } } 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 89a6973..5036923 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 @@ -1,5 +1,7 @@ package com.ff.base.enums; +import com.ff.base.exception.base.ApiException; + import java.util.ArrayList; import java.util.List; @@ -25,6 +27,20 @@ public enum GamePlatforms { this.info = info; } + /** + * 通过代码获取 + * + * @param code 代码 + * @return {@link GamePlatforms } + */ + public static GamePlatforms getByCode(String code) { + for (GamePlatforms platform : GamePlatforms.values()) { + if (platform.getCode().equals(code)) { + return platform; + } + } + throw new ApiException(ErrorCode.PLATFORM_NOT_EXIST.getCode()); + } public static List getCodes() { List result = new ArrayList<>(); diff --git a/ff-base/src/main/java/com/ff/base/enums/TimeOutType.java b/ff-base/src/main/java/com/ff/base/enums/TimeOutType.java new file mode 100644 index 0000000..d1ea786 --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/enums/TimeOutType.java @@ -0,0 +1,25 @@ +package com.ff.base.enums; + +import com.alibaba.druid.filter.AutoLoad; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 超时类型 + * + * @author shi + * @date 2025/04/09 + */ +@AllArgsConstructor +@Getter +public enum TimeOutType { + GAME_EXCHANGE_MONEY("gameExchangeMoney", "游戏余额转移"); + /** + * 代码 + */ + private final String code; + /** + * 信息 + */ + private final String info; +} diff --git a/ff-base/src/main/java/com/ff/base/enums/TriggerType.java b/ff-base/src/main/java/com/ff/base/enums/TriggerType.java new file mode 100644 index 0000000..86edf54 --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/enums/TriggerType.java @@ -0,0 +1,21 @@ +package com.ff.base.enums; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; + +/** + * 触发类型 + * + * @author shi + * @date 2025/04/09 + */ +@Getter +@AllArgsConstructor +public enum TriggerType { + MANUAL(1, "用户调用手动触发"), + TIMER(2, "定时器触发"); + + private final int code; + private final String description; +} diff --git a/ff-base/src/main/java/com/ff/base/manager/AsyncManager.java b/ff-base/src/main/java/com/ff/base/manager/AsyncManager.java index 4e2458f..c68be3c 100644 --- a/ff-base/src/main/java/com/ff/base/manager/AsyncManager.java +++ b/ff-base/src/main/java/com/ff/base/manager/AsyncManager.java @@ -2,11 +2,12 @@ package com.ff.base.manager; import com.ff.base.utils.Threads; import com.ff.base.utils.spring.SpringUtils; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.ArrayList; +import java.util.List; import java.util.TimerTask; -import java.util.concurrent.Callable; -import java.util.concurrent.Future; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; /** * 异步任务管理器 @@ -24,10 +25,33 @@ public class AsyncManager { */ private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService"); + + /** + * 顺序执行线程池 + */ + private List orderedExecutor = new ArrayList<>(); + /** + * 最大线程数 + */ + public static final int MAX_THREAD_COUNT = 16; + + /** + * 线程池 + */ + private ThreadPoolTaskExecutor taskExecutor; + + + /** * 单例模式 */ private AsyncManager() { + for (int i = 0; i < MAX_THREAD_COUNT; i++) { + orderedExecutor.add(Executors.newSingleThreadExecutor()); + } + executor = SpringUtils.getBean("scheduledExecutorService"); + taskExecutor = SpringUtils.getBean("threadPoolTaskExecutor"); + } private static AsyncManager me = new AsyncManager(); @@ -36,6 +60,22 @@ public class AsyncManager { return me; } + + + + public void executeOrdered(String key, Runnable task) { + + if (null == key || key.isEmpty()) { + taskExecutor.execute(task); + return; + } + + int hash = key.hashCode(); + int index = Math.abs(hash % MAX_THREAD_COUNT); + orderedExecutor.get(index).execute(task); + } + + /** * 执行任务 * diff --git a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java index 2cac157..8740bba 100644 --- a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java +++ b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java @@ -1,6 +1,7 @@ package com.ff.api.controller; +import cn.hutool.core.util.IdUtil; import com.ff.annotation.CheckHeader; import com.ff.api.request.*; import com.ff.api.response.*; @@ -8,9 +9,9 @@ import com.ff.base.constant.Constants; import com.ff.base.core.controller.BaseController; import com.ff.base.core.domain.AjaxResult; import com.ff.base.core.page.TableDataInfo; -import com.ff.base.enums.ErrorCode; -import com.ff.base.enums.TransferType; +import com.ff.base.enums.*; import com.ff.base.exception.base.ApiException; +import com.ff.base.manager.AsyncManager; import com.ff.base.system.domain.TenantSecretKey; import com.ff.base.utils.StringUtils; import com.ff.base.utils.bean.BeanUtils; @@ -19,6 +20,8 @@ import com.ff.common.service.ITenantGameQuotaFlowService; import com.ff.common.service.ITenantGameQuotaService; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; +import com.ff.game.api.exchange.StepProcessorFactory; +import com.ff.game.api.exchange.dto.GameExchangeDTO; import com.ff.game.api.request.*; import com.ff.game.domain.*; import com.ff.game.dto.GameBettingDetailsDTO; @@ -30,8 +33,10 @@ import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.http.ResponseEntity; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; import org.springframework.validation.annotation.Validated; @@ -39,12 +44,14 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.context.request.async.DeferredResult; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; /** * api控制器 @@ -94,6 +101,10 @@ public class ApiGameController extends BaseController { @Resource private IPlatformService platformService; + + @Resource + private StepProcessorFactory stepProcessorFactory; + /** * 列表 * @@ -185,8 +196,7 @@ public class ApiGameController extends BaseController { * @return {@link AjaxResult } */ @PostMapping("/exchange/balance") - @Transactional - public AjaxResult exchangeBalance(@Validated @RequestBody GameExchangeBalanceRequest gameExchangeBalanceRequest) { + public DeferredResult exchangeBalance(@Validated @RequestBody GameExchangeBalanceRequest gameExchangeBalanceRequest) { IGamesService iGamesService = gamesService.get(gameExchangeBalanceRequest.getPlatformCode() + Constants.SERVICE); ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode()); @@ -210,51 +220,77 @@ 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()); - } - // 获取用户信息 Member member = memberService.selectMemberByAccount(gameExchangeBalanceRequest.getAccount(), gameExchangeBalanceRequest.getCurrencyCode(), gameExchangeBalanceRequest.getPlatformCode()); ApiException.notNull(member, ErrorCode.ACCOUNT_NOT_EXIST.getCode()); + List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( + GameExchangeMoney.builder() + .tenantKey(tenantSecretKey.getTenantKey()) + .orderId(gameExchangeBalanceRequest.getOrderId()) + .build() + ); - //操作第三方额度接口 - ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO = ExchangeTransferMoneyRequestDTO.builder() - .agentId(keyInfo.getCode()) - .agentKey(keyInfo.getKey()) - .orderId(gameExchangeBalanceRequest.getOrderId()) - .account(member.getGameAccount()) - .currency(targetCurrency) + ApiException.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), ErrorCode.DUPLICATE_ORDER_ID.getCode()); + + + Long gameExchangeMoneyId = IdUtil.getSnowflakeNextId(); + GameExchangeDTO exchangeMoney = GameExchangeDTO.builder() + .id(gameExchangeMoneyId) .tenantKey(tenantSecretKey.getTenantKey()) - .quota(quota) - .amount(gameExchangeBalanceRequest.getAmount()) - .transferType(gameExchangeBalanceRequest.getTransferType()) - .vendor(platform) - .keyInfo(keyInfo) - .systemCurrency(gameExchangeBalanceRequest.getCurrencyCode()) + .memberId(member.getId()) + .gameAccount(member.getGameAccount()) + .memberAccount(member.getMemberAccount()) + .exchangeType(gameExchangeBalanceRequest.getTransferType()) + .currencyCode(gameExchangeBalanceRequest.getCurrencyCode()) + .orderId(gameExchangeBalanceRequest.getOrderId()) + .balance(gameExchangeBalanceRequest.getAmount()) + .triggerType(TriggerType.MANUAL.getCode()) + .platformCode(gameExchangeBalanceRequest.getPlatformCode()).build(); - .build(); - Long exchangeTransferId = iGamesService.exchangeTransferByAgentId(exchangeTransferMoneyRequestDTO); - GameExchangeMoney gameExchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferId); - GameExchangeBalanceResponse gameExchangeBalanceResponse = new GameExchangeBalanceResponse(); - BeanUtils.copyProperties(gameExchangeMoney, gameExchangeBalanceResponse); - return AjaxResult.success(gameExchangeBalanceResponse); + + //转出设置转出金额为0 + if (TransferType.ALL.getCode().equals(gameExchangeBalanceRequest.getTransferType())){ + exchangeMoney.setBalance(BigDecimal.ZERO); + } + + + ExtInfo extInfo = platform.getExtInfo(); + Long timeout = 5000L; + if (extInfo != null) { + timeout = extInfo.getTimeout(TimeOutType.GAME_EXCHANGE_MONEY.getCode()); + } + + + DeferredResult output = new DeferredResult<>(timeout); + AsyncManager.me().executeOrdered( + exchangeMoney.getOrderId(), + () -> { + try { + stepProcessorFactory.getStepProcessor(GameExchangeStep.CREATE_ORDER).process(exchangeMoney); + + GameExchangeMoney gameExchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(gameExchangeMoneyId); + GameExchangeBalanceResponse gameExchangeBalanceResponse = new GameExchangeBalanceResponse(); + BeanUtils.copyProperties(gameExchangeMoney, gameExchangeBalanceResponse); + output.setResult(AjaxResult.success(gameExchangeBalanceResponse)); + + } catch (Exception e) { + log.error("ApiGameController [exchangeBalance] 余额转移失败 gameExchangeMoneyId {}", gameExchangeMoneyId,e); + stepProcessorFactory.getStepProcessor(GameExchangeStep.getByCode(exchangeMoney.getStep())).rollBack(exchangeMoney); + output.setErrorResult(AjaxResult.error(ErrorCode.BALANCE_TRANSFER_FAILED.getCode(), ErrorCode.BALANCE_TRANSFER_FAILED.getMessage())); + } + + } + ); + // 超时时间处理逻辑 + output.onTimeout(() -> { + GameExchangeMoney gameExchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(gameExchangeMoneyId); + GameExchangeBalanceResponse gameExchangeBalanceResponse = new GameExchangeBalanceResponse(); + BeanUtils.copyProperties(gameExchangeMoney, gameExchangeBalanceResponse); + output.setErrorResult(AjaxResult.success(gameExchangeBalanceResponse)); + }); + return output; } @@ -294,11 +330,6 @@ public class ApiGameController extends BaseController { ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode()); -// TenantSecretKey tenantSecretKey = keyConfig.get(); -// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(gameCreateFreeSpinRequest.getPlatformCode()) -// .systemCurrency(gameCreateFreeSpinRequest.getCurrencyCode()).build()); -// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); Platform platform = platformService.get(gameCreateFreeSpinRequest.getPlatformCode()); ApiException.notNull(platform, ErrorCode.PLATFORM_NOT_EXIST.getCode()); 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 15c82ff..ae9260b 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 @@ -67,4 +67,9 @@ public class GameBalanceExchange extends GamesBaseRequestDTO implements Serializ */ private String sourceId; + /** + * 就是全部 + */ + private Boolean isAll; + } 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 25f5253..cf85cf6 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 @@ -152,7 +152,7 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService { BigDecimal balance = balanceChangesDTO.getBalance(); //如果有汇率 则需要计算真实扣除额度 if (!ObjectUtils.isEmpty(balanceChangesDTO.getActualBalance())) { - balance = NumberUtil.div(balance, balanceChangesDTO.getActualBalance(), 2, RoundingMode.FLOOR); + balance = NumberUtil.div(balance, balanceChangesDTO.getActualBalance(), 5, RoundingMode.FLOOR); } if (BigDecimal.ZERO.compareTo(balance) >= 0) { @@ -222,7 +222,7 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService { BigDecimal balance = balanceRealChangesDTO.getBalance(); //如果有汇率 则需要计算真实扣除额度 if (!ObjectUtils.isEmpty(balanceRealChangesDTO.getActualBalance())) { - balance = NumberUtil.div(balance, balanceRealChangesDTO.getActualBalance(), 2, RoundingMode.FLOOR); + balance = NumberUtil.div(balance, balanceRealChangesDTO.getActualBalance(), 5, RoundingMode.FLOOR); } if (BigDecimal.ZERO.compareTo(balance) >= 0) { @@ -317,14 +317,18 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService { // 如果是出账操作 if (isOut) { - // 获取第三方钱包余额 - MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder() - .accounts(member.getGameAccount()) - .agentId(gameBalanceExchange.getAgentId()) - .currency(gameBalanceExchange.getCurrency()) - .agentKey(gameBalanceExchange.getAgentKey()) - .build(); - balanceRequestAmount = iGamesService.getMemberInfo(gamesBaseRequestDTO).getBalance(); + if (ObjectUtils.isEmpty(gameBalanceExchange.getIsAll())||gameBalanceExchange.getIsAll()){ + // 获取第三方钱包余额 + MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder() + .accounts(member.getGameAccount()) + .agentId(gameBalanceExchange.getAgentId()) + .currency(gameBalanceExchange.getCurrency()) + .agentKey(gameBalanceExchange.getAgentKey()) + .build(); + balanceRequestAmount = iGamesService.getMemberInfo(gamesBaseRequestDTO).getBalance(); + } + + balanceRequestAmount = NumberUtil.add(balanceRequestAmount, NumberUtil.mul(balanceRequestAmount, NumberUtil.div(tenantPlatform.getUseCost(), Constants.HUNDRED))); // 计算累计转入和转出金额 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 612c597..67a09dd 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 @@ -228,34 +228,8 @@ public class GamesAEServiceImpl implements IGamesService { log.info("GamesAEServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); - Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); - String transactionId = GamePlatforms.AE.getCode() + IdUtils.simpleUUID(); - List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( - GameExchangeMoney.builder() - .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) - .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) - .build() - ); - Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); + GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId()); - //获取下一个自增id - GameExchangeMoney exchangeMoney = GameExchangeMoney - .builder() - .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) - .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) - .quota(exchangeTransferMoneyRequestDTO.getQuota()) - .balance(exchangeTransferMoneyRequestDTO.getAmount()) - .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) - .memberId(member.getId()) - .transactionId(transactionId) - .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); @@ -264,13 +238,13 @@ public class GamesAEServiceImpl implements IGamesService { if (TransferType.GAMES.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) { params.put("userId", exchangeTransferMoneyRequestDTO.getAccount()); - params.put("txCode", transactionId); + params.put("txCode", exchangeTransferMoneyRequestDTO.getTransactionId()); params.put("transferAmount", exchangeTransferMoneyRequestDTO.getAmount()); deposit = AEClient.deposit(params); } else { params.put("userId", exchangeTransferMoneyRequestDTO.getAccount()); - params.put("txCode", transactionId); + params.put("txCode", exchangeTransferMoneyRequestDTO.getTransactionId()); params.put("withdrawType", 1); deposit = AEClient.withdraw(params); } 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 b4315e9..ca49446 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 @@ -220,39 +220,14 @@ public class GamesDGServiceImpl implements IGamesService { log.info("GamesDGServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); - Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); - String transactionId = GamePlatforms.DG.getInfo() + IdUtils.simpleUUID(); - List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( - GameExchangeMoney.builder() - .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) - .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) - .build() - ); - Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); + GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId()); + - //获取下一个自增id - GameExchangeMoney exchangeMoney = GameExchangeMoney - .builder() - .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) - .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) - .quota(exchangeTransferMoneyRequestDTO.getQuota()) - .balance(exchangeTransferMoneyRequestDTO.getAmount()) - .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) - .memberId(member.getId()) - .transactionId(transactionId) - .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())) { // 获取第三方钱包余额 MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder() - .accounts(member.getGameAccount()) + .accounts(exchangeTransferMoneyRequestDTO.getAccount()) .agentId(exchangeTransferMoneyRequestDTO.getAgentId()) .currency(exchangeTransferMoneyRequestDTO.getCurrency()) .agentKey(exchangeTransferMoneyRequestDTO.getAgentKey()) @@ -265,7 +240,7 @@ public class GamesDGServiceImpl implements IGamesService { Map params = new LinkedHashMap<>(); params.put("username", exchangeTransferMoneyRequestDTO.getAccount()); params.put("amount", amount); - params.put("serial", transactionId); + params.put("serial", exchangeTransferMoneyRequestDTO.getTransactionId()); Map headerMap = this.getKey(exchangeTransferMoneyRequestDTO); DGTransactionResponseDTO dgTransactionResponseDTO = DGClient.exchangeTransferByAgentId(params, headerMap); diff --git a/ff-game/src/main/java/com/ff/game/api/exchange/AbstractStepProcessor.java b/ff-game/src/main/java/com/ff/game/api/exchange/AbstractStepProcessor.java new file mode 100644 index 0000000..6e0713f --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/exchange/AbstractStepProcessor.java @@ -0,0 +1,118 @@ +package com.ff.game.api.exchange; + +import com.ff.base.enums.GameExchangeStep; +import com.ff.base.enums.GameExchangeStepStatus; +import com.ff.base.exception.base.BaseException; +import com.ff.game.api.exchange.dto.GameExchangeDTO; +import com.ff.game.domain.GameExchangeMoney; +import com.ff.game.service.IGameExchangeMoneyService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; + +/** + * 抽象步进处理机 + * + * @author shi + * @date 2025/04/09 + */ +@Slf4j +public abstract class AbstractStepProcessor implements StepProcessorService { + + + @Resource + private StepProcessorFactory stepProcessorFactory; + + + @Resource + private IGameExchangeMoneyService gameExchangeMoneyService; + + /** + * 过程 + * + * @param gameExchangeMoney 游戏兑换货币 + */ + @Override + public void process(GameExchangeDTO gameExchangeMoney) { + boolean processResult = false; + try { + processResult = doProcess(gameExchangeMoney); + } catch (Exception e) { + log.error("游戏余额转移{}-步骤任务{}-执行异常", gameExchangeMoney.getId(), stepKey().getDescription(), e); + throw new BaseException("游戏余额转移"+gameExchangeMoney.getId()+"-步骤任务"+stepKey().getDescription()+"-执行异常" ); + } + //更新状态 + if (processResult) { + log.info("游戏余额转移{}-步骤任务{}-执行成功", gameExchangeMoney.getId(), stepKey().getDescription()); + triggerNextStep(gameExchangeMoney); + } + } + + + + /** + * 降低 + * + * @param gameExchangeMoney 游戏兑换货币 + */ + @Override + public void rollBack(GameExchangeDTO gameExchangeMoney){ + boolean processResult = false; + try { + processResult = doRollBack(gameExchangeMoney); + } catch (Exception e) { + log.error("游戏余额转移{}-步骤任务{}-回滚异常", gameExchangeMoney.getId(), stepKey().getDescription(), e); + } + if (processResult) { + log.info("游戏余额转移{}-步骤任务{}-回滚成功", gameExchangeMoney.getId(), stepKey().getDescription()); + triggerBackStep(gameExchangeMoney); + } + } + + + /** + * 触发后退 + * + * @param exchangeMoney 兑换货币 + */ + private void triggerBackStep(GameExchangeDTO exchangeMoney) { + GameExchangeStep nextStep = backStepProcessor(); + if (nextStep != null) { + stepProcessorFactory.getStepProcessor(nextStep).rollBack(exchangeMoney); + } + } + + + + /** + * 触发下一步 + * + * @param exchangeMoney 兑换货币 + */ + private void triggerNextStep(GameExchangeDTO exchangeMoney) { + GameExchangeStep nextStep = nextStepProcessor(); + if (nextStep != null) { + stepProcessorFactory.getStepProcessor(nextStep).process(exchangeMoney); + } + } + + /** + * 一定要回滚 + * + * @param gameExchangeMoney 游戏兑换货币 + * @return boolean + * @throws Exception 例外 + */ + abstract public boolean doRollBack(GameExchangeDTO gameExchangeMoney) throws Exception; + + /** + * do过程 + * + * @param gameExchangeMoney 游戏兑换货币 + * @return boolean + * @throws Exception 例外 + */ + abstract public boolean doProcess(GameExchangeDTO gameExchangeMoney) throws Exception; +} diff --git a/ff-game/src/main/java/com/ff/game/api/exchange/StepProcessorFactory.java b/ff-game/src/main/java/com/ff/game/api/exchange/StepProcessorFactory.java new file mode 100644 index 0000000..7db1768 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/exchange/StepProcessorFactory.java @@ -0,0 +1,47 @@ +package com.ff.game.api.exchange; + +import com.ff.base.enums.GameExchangeStep; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 步进处理机厂 + * + * @author shi + * @date 2025/04/09 + */ +@Component +public class StepProcessorFactory { + + @Autowired + List stepProcessors; + + private Map processorMap; + + @PostConstruct + public void init() { + Map map = new HashMap<>(); + for (StepProcessorService stepProcessor : stepProcessors) { + map.put(stepProcessor.stepKey(), stepProcessor); + } + + processorMap = Collections.unmodifiableMap(map); + } + + /** + * 获取步进处理器 + * + * @param stepKey 步进键 + * @return {@link StepProcessorService } + */ + public StepProcessorService getStepProcessor(GameExchangeStep stepKey) { + return processorMap.get(stepKey); + } + +} diff --git a/ff-game/src/main/java/com/ff/game/api/exchange/StepProcessorService.java b/ff-game/src/main/java/com/ff/game/api/exchange/StepProcessorService.java new file mode 100644 index 0000000..be5efb8 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/exchange/StepProcessorService.java @@ -0,0 +1,56 @@ +package com.ff.game.api.exchange; + +import com.ff.base.enums.GameExchangeStep; +import com.ff.game.api.exchange.dto.GameExchangeDTO; + +/** + * 步进处理机 + * + * @author shi + * @date 2025/04/09 + */ +public interface StepProcessorService { + + /** + * 返回处理器类型 + * + * @return {@link GameExchangeStep } + */ + GameExchangeStep stepKey(); + + + /** + * 过程 + * + * @param gameExchangeMoney 游戏兑换货币 + */ + void process(GameExchangeDTO gameExchangeMoney); + + + /** + * 回退 + * + * @param gameExchangeMoney 游戏兑换货币 + */ + void rollBack(GameExchangeDTO gameExchangeMoney); + + + /** + * 步骤之间有依赖 + * 找出下一个步骤处理器进行处理 + * + * @return + */ + GameExchangeStep nextStepProcessor(); + + + /** + * 步骤之间有依赖 + * 找出上一个步骤处理器进行处理 + * + * @return {@link GameExchangeStep } + */ + GameExchangeStep backStepProcessor(); + + +} diff --git a/ff-game/src/main/java/com/ff/game/api/exchange/dto/GameExchangeDTO.java b/ff-game/src/main/java/com/ff/game/api/exchange/dto/GameExchangeDTO.java new file mode 100644 index 0000000..584e9f6 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/exchange/dto/GameExchangeDTO.java @@ -0,0 +1,32 @@ +package com.ff.game.api.exchange.dto; + +import com.ff.base.annotation.Excel; +import com.ff.game.domain.GameExchangeMoney; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * 游戏兑换货币dto + * + * @author shi + * @date 2025/04/09 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +public class GameExchangeDTO extends GameExchangeMoney { + /** + * 触发类型 1 用户调用手动触发 2 定时器触发 + */ + private Integer triggerType; + + /** 会员账号 */ + private String memberAccount; + + /** 游戏账号 */ + private String gameAccount; + +} diff --git a/ff-game/src/main/java/com/ff/game/api/exchange/impl/AddBalanceServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/exchange/impl/AddBalanceServiceImpl.java new file mode 100644 index 0000000..b45e7d3 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/exchange/impl/AddBalanceServiceImpl.java @@ -0,0 +1,170 @@ +package com.ff.game.api.exchange.impl; + +import com.ff.base.constant.Constants; +import com.ff.base.enums.*; +import com.ff.base.exception.base.ApiException; +import com.ff.base.utils.StringUtils; +import com.ff.common.domain.TenantGameQuotaFlow; +import com.ff.common.dto.BalanceChangesDTO; +import com.ff.common.dto.GameBalanceExchange; +import com.ff.common.service.ITenantGameQuotaFlowService; +import com.ff.common.service.ITenantGameQuotaService; +import com.ff.game.api.IGamesService; +import com.ff.game.api.exchange.AbstractStepProcessor; +import com.ff.game.api.exchange.dto.GameExchangeDTO; +import com.ff.game.api.request.ExchangeTransferMoneyRequestDTO; +import com.ff.game.api.request.ExchangeTransferStatusRequestDTO; +import com.ff.game.api.request.ExchangeTransferStatusResponseDTO; +import com.ff.game.domain.KeyInfo; +import com.ff.game.domain.Platform; +import com.ff.game.service.IGameExchangeMoneyService; +import com.ff.game.service.IPlatformService; +import com.ff.member.domain.Member; +import com.ff.member.service.IMemberService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + + +/** + * 增加余额 + * + * @author shi + * @date 2025/04/09 + */ +@Service +@Order(4) +public class AddBalanceServiceImpl extends AbstractStepProcessor { + + + @Resource + private IMemberService memberService; + + @Resource + private ITenantGameQuotaService tenantGameQuotaService; + @Resource + private IGameExchangeMoneyService gameExchangeMoneyService; + @Resource + private PlatformTransactionManager transactionManager; + @Resource + private IPlatformService platformService; + /** + * 步进键 + * + * @return {@link GameExchangeStep } + */ + @Override + public GameExchangeStep stepKey() { + return GameExchangeStep.TENANT_QUOTA_DEDUCTED; + } + + + /** + * do过程 + * + * @param gameExchangeMoney 游戏兑换货币 + * @return boolean + */ + @Override + public boolean doProcess(GameExchangeDTO gameExchangeMoney) { + //如果不是之前的步骤代码执行过了 或者是转入操作 + if (!gameExchangeMoney.getStep().equals(GameExchangeStep.PLATFORM_TRANSACTION.getCode()) ) { + return Boolean.TRUE; + } + if (!gameExchangeMoney.getStepStatus().equals(StatusType.SUCCESS.getValue())){ + return Boolean.TRUE; + } + + TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); + transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); + Boolean result = transactionTemplate.execute(transactionStatus -> { + //不是转入操作 + if (!TransferType.ALL.getCode().equals(gameExchangeMoney.getExchangeType())) { + gameExchangeMoney.setStep(GameExchangeStep.DEDUCT_BALANCE.getCode()); + gameExchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoney.setStatus(StatusType.SUCCESS.getValue()); + return gameExchangeMoneyService.updateGameExchangeMoney(gameExchangeMoney) > 0; + } + + Platform platform = platformService.get(gameExchangeMoney.getPlatformCode()); + KeyInfo keyInfo = null; + for (KeyInfo keyData : platform.getKeyInfo()) { + if (StringUtils.isNotEmpty(gameExchangeMoney.getCurrencyCode())) { + if (keyData.getCurrency().equalsIgnoreCase(gameExchangeMoney.getCurrencyCode())) { + keyInfo = keyData; + break; + } + } + } + + + BigDecimal decimal = tenantGameQuotaService.gameBalanceExchange(GameBalanceExchange.builder() + .platformCode(gameExchangeMoney.getPlatformCode()) + .sourceId(String.valueOf(gameExchangeMoney.getId())) + .currencyCode(gameExchangeMoney.getCurrencyCode()) + .currency(gameExchangeMoney.getCurrencyCode()) + .transferType(gameExchangeMoney.getExchangeType()) + .amount(gameExchangeMoney.getBalance()) + .isAll(Boolean.FALSE) + .account(memberService.selectMemberById(gameExchangeMoney.getMemberId()).getMemberAccount()) + .tenantKey(gameExchangeMoney.getTenantKey()) + .systemCurrency(gameExchangeMoney.getCurrencyCode()) + .agentId(keyInfo.getCode()) + .agentKey(keyInfo.getKey()) + .build()); + + gameExchangeMoney.setQuota(decimal); + gameExchangeMoney.setStep(GameExchangeStep.TENANT_QUOTA_DEDUCTED.getCode()); + gameExchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + gameExchangeMoney.setStatus(StatusType.SUCCESS.getValue()); + return gameExchangeMoneyService.updateGameExchangeMoney(gameExchangeMoney) > 0; + + }); + return Boolean.TRUE.equals(result); + + + } + + + /** + * 一定要回滚 最后一步成功了就结束了 + * + * @param gameExchangeMoney 游戏兑换货币 + * @return boolean + */ + @Override + public boolean doRollBack(GameExchangeDTO gameExchangeMoney) { + return Boolean.TRUE; + } + + /** + * 下一步处理器 + * + * @return {@link GameExchangeStep } + */ + @Override + public GameExchangeStep nextStepProcessor() { + return null; + } + + /** + * 后级处理器 最后一步无法回滚 + * + * @return {@link GameExchangeStep } + */ + @Override + public GameExchangeStep backStepProcessor() { + { + return null; + } + } + +} diff --git a/ff-game/src/main/java/com/ff/game/api/exchange/impl/CreateOrderServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/exchange/impl/CreateOrderServiceImpl.java new file mode 100644 index 0000000..15701b0 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/exchange/impl/CreateOrderServiceImpl.java @@ -0,0 +1,146 @@ +package com.ff.game.api.exchange.impl; + +import com.ff.base.constant.Constants; +import com.ff.base.enums.*; +import com.ff.base.exception.base.ApiException; +import com.ff.base.manager.AsyncManager; +import com.ff.base.utils.DateUtils; +import com.ff.base.utils.uuid.IdUtils; +import com.ff.game.api.exchange.AbstractStepProcessor; +import com.ff.game.api.exchange.StepProcessorFactory; +import com.ff.game.api.exchange.StepProcessorService; +import com.ff.game.api.exchange.dto.GameExchangeDTO; +import com.ff.game.api.request.ExchangeTransferStatusRequestDTO; +import com.ff.game.domain.GameExchangeMoney; +import com.ff.game.service.IGameExchangeMoneyService; +import com.ff.member.domain.Member; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.crypto.spec.SecretKeySpec; +import java.util.Base64; + +/** + * 创建订单impl + * + * @author shi + * @date 2025/04/09 + */ +@Service +@Order(1) +public class CreateOrderServiceImpl extends AbstractStepProcessor { + + @Resource + private IGameExchangeMoneyService gameExchangeMoneyService; + + + @Resource + private StepProcessorFactory stepProcessorFactory; + + /** + * 步进键 + * + * @return {@link GameExchangeStep } + */ + @Override + public GameExchangeStep stepKey() { + return GameExchangeStep.CREATE_ORDER; + } + + + /** + * do过程 + * + * @param gameExchangeMoney 游戏兑换货币 + * @return boolean + */ + @Override + public boolean doProcess(GameExchangeDTO gameExchangeMoney) { + + + gameExchangeMoney.setTransactionId(this.getTransactionId(GamePlatforms.getByCode(gameExchangeMoney.getPlatformCode()),gameExchangeMoney.getExchangeType(),gameExchangeMoney.getGameAccount())); + gameExchangeMoney.setCreateBy(Constants.SYSTEM); + gameExchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue()); + gameExchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode()); + gameExchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + return gameExchangeMoneyService.insertGameExchangeMoney(gameExchangeMoney) > 0; + } + + /** + * 获取交易id + * + * @return {@link String } + */ + private String getTransactionId(GamePlatforms gamePlatforms,Integer exchangeType ,String account) { + switch (gamePlatforms) { + case AE: + return GamePlatforms.AE.getCode() + IdUtils.simpleUUID(); + case JILI: + return GamePlatforms.JILI.getInfo() + IdUtils.simpleUUID(); + case XK: + return GamePlatforms.XK.getCode() + IdUtils.simpleUUID(); + case PG: + return gameExchangeMoneyService.getTransactionId(GamePlatforms.PG.getCode(), 32); + case PGX: + return gameExchangeMoneyService.getTransactionId(GamePlatforms.PGX.getInfo(), 17); + case FC: + return gameExchangeMoneyService.getTransactionId(GamePlatforms.FC.getInfo(), 30); + case DG: + return GamePlatforms.DG.getInfo() + IdUtils.simpleUUID(); + + case MT: + return GamePlatforms.MT.getCode() + IdUtils.simpleUUID(); + case SA: + //判断是转入还是转出 + String transactionId = "OUT" + DateUtils.dateTimeNow() + account; + if (!TransferType.ALL.getCode().equals(exchangeType)) { + transactionId = "IN" + DateUtils.dateTimeNow() + account; + } + + return transactionId; + case KM: + return GamePlatforms.KM.getInfo() + IdUtils.simpleUUID(); + case PGT: + return gameExchangeMoneyService.getTransactionId(GamePlatforms.PGT.getInfo(), 17); + } + throw new ApiException(ErrorCode.PLATFORM_NOT_EXIST.getCode()); + } + + + /** + * 一定要回滚 + * + * @param gameExchangeMoney 游戏兑换货币 + * @return boolean + */ + @Override + public boolean doRollBack(GameExchangeDTO gameExchangeMoney) { + gameExchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode()); + gameExchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode()); + gameExchangeMoney.setStatus(StatusType.FAILURE.getValue()); + gameExchangeMoney.setUpdateBy(Constants.SYSTEM); + gameExchangeMoney.setUpdateTime(DateUtils.getNowDate()); + return gameExchangeMoneyService.updateGameExchangeMoney(gameExchangeMoney) > 0; + } + + /** + * 下一步处理器 + * + * @return {@link GameExchangeStep } + */ + @Override + public GameExchangeStep nextStepProcessor() { + return GameExchangeStep.DEDUCT_BALANCE; + } + + /** + * 后级处理器 + * + * @return {@link GameExchangeStep } + */ + @Override + public GameExchangeStep backStepProcessor() { + return null; + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/exchange/impl/DeductBalanceServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/exchange/impl/DeductBalanceServiceImpl.java new file mode 100644 index 0000000..5407d80 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/exchange/impl/DeductBalanceServiceImpl.java @@ -0,0 +1,189 @@ +package com.ff.game.api.exchange.impl; + +import com.ff.base.constant.Constants; +import com.ff.base.enums.*; +import com.ff.base.exception.base.ApiException; +import com.ff.base.utils.DateUtils; +import com.ff.base.utils.QuotaUtils; +import com.ff.base.utils.StringUtils; +import com.ff.base.utils.uuid.IdUtils; +import com.ff.common.domain.TenantGameQuota; +import com.ff.common.domain.TenantGameQuotaFlow; +import com.ff.common.dto.BalanceChangesDTO; +import com.ff.common.dto.GameBalanceExchange; +import com.ff.common.service.ITenantGameQuotaFlowService; +import com.ff.common.service.ITenantGameQuotaService; +import com.ff.game.api.exchange.AbstractStepProcessor; +import com.ff.game.api.exchange.StepProcessorFactory; +import com.ff.game.api.exchange.dto.GameExchangeDTO; +import com.ff.game.domain.GameExchangeMoney; +import com.ff.game.domain.KeyInfo; +import com.ff.game.domain.Platform; +import com.ff.game.service.IGameExchangeMoneyService; +import com.ff.game.service.IPlatformService; +import com.ff.member.service.IMemberService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.List; + + +/** + * 转入提前扣租户余额impl + * + * @author shi + * @date 2025/04/09 + */ +@Service +@Order(2) +public class DeductBalanceServiceImpl extends AbstractStepProcessor { + + @Resource + private IGameExchangeMoneyService gameExchangeMoneyService; + + @Resource + private ITenantGameQuotaService tenantGameQuotaService; + + @Resource + private IMemberService memberService; + + @Resource + private IPlatformService platformService; + @Resource + private ITenantGameQuotaFlowService tenantGameQuotaFlowService; + @Autowired + private PlatformTransactionManager transactionManager; + + /** + * 步进键 + * + * @return {@link GameExchangeStep } + */ + @Override + public GameExchangeStep stepKey() { + return GameExchangeStep.DEDUCT_BALANCE; + } + + + /** + * do过程 + * + * @param gameExchangeMoney 游戏兑换货币 + * @return boolean + */ + @Override + public boolean doProcess(GameExchangeDTO gameExchangeMoney) { + TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); + transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); + Boolean result = transactionTemplate.execute(transactionStatus -> { + + //如果不是之前的步骤代码执行过了 + if (!gameExchangeMoney.getStep().equals(this.backStepProcessor().getCode())) { + return Boolean.TRUE; + } + //不是转入操作 + if (!TransferType.GAMES.getCode().equals(gameExchangeMoney.getExchangeType())) { + gameExchangeMoney.setStep(GameExchangeStep.DEDUCT_BALANCE.getCode()); + gameExchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + return gameExchangeMoneyService.updateGameExchangeMoney(gameExchangeMoney) > 0; + } + + Platform platform = platformService.get(gameExchangeMoney.getPlatformCode()); + KeyInfo keyInfo = null; + for (KeyInfo keyData : platform.getKeyInfo()) { + if (StringUtils.isNotEmpty(gameExchangeMoney.getCurrencyCode())) { + if (keyData.getCurrency().equalsIgnoreCase(gameExchangeMoney.getCurrencyCode())) { + keyInfo = keyData; + break; + } + } + } + BigDecimal decimal = tenantGameQuotaService.gameBalanceExchange(GameBalanceExchange.builder() + .platformCode(gameExchangeMoney.getPlatformCode()) + .sourceId(String.valueOf(gameExchangeMoney.getId())) + .currencyCode(gameExchangeMoney.getCurrencyCode()) + .currency(gameExchangeMoney.getCurrencyCode()) + .transferType(gameExchangeMoney.getExchangeType()) + .amount(gameExchangeMoney.getBalance()) + .account(memberService.selectMemberById(gameExchangeMoney.getMemberId()).getMemberAccount()) + .tenantKey(gameExchangeMoney.getTenantKey()) + .systemCurrency(gameExchangeMoney.getCurrencyCode()) + .agentId(keyInfo.getCode()) + .isAll(Boolean.TRUE) + .agentKey(keyInfo.getKey()) + .build()); + + gameExchangeMoney.setQuota(decimal); + + + gameExchangeMoney.setStep(GameExchangeStep.DEDUCT_BALANCE.getCode()); + gameExchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + return gameExchangeMoneyService.updateGameExchangeMoney(gameExchangeMoney) > 0; + }); + return Boolean.TRUE.equals(result); + } + + + /** + * 一定要回滚 + * + * @param gameExchangeMoney 游戏兑换货币 + * @return boolean + */ + @Override + public boolean doRollBack(GameExchangeDTO gameExchangeMoney) { + //如果不是之前的步骤代码执行过了 或者是转入操作 + if (!gameExchangeMoney.getStep().equals(this.stepKey().getCode())) { + return Boolean.TRUE; + } + TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); + transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); + List tenantGameQuotaFlows = tenantGameQuotaFlowService.selectTenantGameQuotaFlowList( + TenantGameQuotaFlow.builder() + .sourceId(String.valueOf(gameExchangeMoney.getId())) + .isOut(Boolean.FALSE) + .build()); + //取出第一个 + TenantGameQuotaFlow tenantGameQuotaFlow = tenantGameQuotaFlows.get(0); + return tenantGameQuotaService.balanceChanges(BalanceChangesDTO.builder() + .isOut(Boolean.TRUE) + .platformCode(tenantGameQuotaFlow.getPlatformCode()) + .currencyCode(tenantGameQuotaFlow.getCurrencyCode()) + .tenantKey(tenantGameQuotaFlow.getTenantKey()) + .balance(tenantGameQuotaFlow.getBalance()) + .sourceId(tenantGameQuotaFlow.getSourceId()) + .memberId(gameExchangeMoney.getMemberId()) + .operationType(OperationType.API_BALANCE.getCode()) + .remark(OperationType.API_BALANCE.getDescription()) + .quotaType(tenantGameQuotaFlow.getQuotaType()).build()); + } + + /** + * 下一步处理器 + * + * @return {@link GameExchangeStep } + */ + @Override + public GameExchangeStep nextStepProcessor() { + return GameExchangeStep.PLATFORM_TRANSACTION; + } + + /** + * 后级处理器 + * + * @return {@link GameExchangeStep } + */ + @Override + public GameExchangeStep backStepProcessor() { + { + return GameExchangeStep.CREATE_ORDER; + } + } + +} diff --git a/ff-game/src/main/java/com/ff/game/api/exchange/impl/PlatformTransactionServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/exchange/impl/PlatformTransactionServiceImpl.java new file mode 100644 index 0000000..104decc --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/exchange/impl/PlatformTransactionServiceImpl.java @@ -0,0 +1,221 @@ +package com.ff.game.api.exchange.impl; + +import com.ff.base.constant.Constants; +import com.ff.base.enums.*; +import com.ff.base.exception.base.ApiException; +import com.ff.base.utils.StringUtils; +import com.ff.common.domain.TenantGameQuotaFlow; +import com.ff.common.dto.BalanceChangesDTO; +import com.ff.common.dto.GameBalanceExchange; +import com.ff.common.service.ITenantGameQuotaFlowService; +import com.ff.common.service.ITenantGameQuotaService; +import com.ff.game.api.IGamesService; +import com.ff.game.api.exchange.AbstractStepProcessor; +import com.ff.game.api.exchange.dto.GameExchangeDTO; +import com.ff.game.api.request.ExchangeTransferMoneyRequestDTO; +import com.ff.game.api.request.ExchangeTransferStatusRequestDTO; +import com.ff.game.api.request.ExchangeTransferStatusResponseDTO; +import com.ff.game.domain.GameExchangeMoney; +import com.ff.game.domain.KeyInfo; +import com.ff.game.domain.Platform; +import com.ff.game.service.IGameExchangeMoneyService; +import com.ff.game.service.IPlatformService; +import com.ff.member.domain.Member; +import com.ff.member.service.IMemberService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + + +/** + * 操作第三方扣减 + * + * @author shi + * @date 2025/04/09 + */ +@Service +@Order(3) +public class PlatformTransactionServiceImpl extends AbstractStepProcessor { + + + @Resource + private IGameExchangeMoneyService gameExchangeMoneyService; + + @Resource + private IMemberService memberService; + + @Resource + private IPlatformService platformService; + + @Autowired + private Map gamesService; + + /** + * 步进键 + * + * @return {@link GameExchangeStep } + */ + @Override + public GameExchangeStep stepKey() { + return GameExchangeStep.PLATFORM_TRANSACTION; + } + + + /** + * do过程 + * + * @param gameExchangeMoney 游戏兑换货币 + * @return boolean + */ + @Override + public boolean doProcess(GameExchangeDTO gameExchangeMoney) { + //如果不是之前的步骤代码执行过了 + if (!gameExchangeMoney.getStep().equals(this.backStepProcessor().getCode())) { + return Boolean.TRUE; + } + + + Platform platform = platformService.get(gameExchangeMoney.getPlatformCode()); + + String targetCurrency = platform.getCurrencyInfo().get(gameExchangeMoney.getCurrencyCode()); + ApiException.notNull(targetCurrency, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + + KeyInfo keyInfo = null; + for (KeyInfo keyData : platform.getKeyInfo()) { + if (StringUtils.isNotEmpty(gameExchangeMoney.getCurrencyCode())) { + if (keyData.getCurrency().equalsIgnoreCase(gameExchangeMoney.getCurrencyCode())) { + keyInfo = keyData; + break; + } + } + } + Member member = memberService.selectMemberById(gameExchangeMoney.getMemberId()); + IGamesService iGamesService = gamesService.get(gameExchangeMoney.getPlatformCode() + Constants.SERVICE); + + //查询订单详情 + if (TriggerType.TIMER.getCode() == gameExchangeMoney.getTriggerType()) { + ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO(); + exchangeTransferStatusRequestDTO.setAccount(member.getGameAccount()); + exchangeTransferStatusRequestDTO.setCurrency(targetCurrency); + exchangeTransferStatusRequestDTO.setOrderId(gameExchangeMoney.getTransactionId()); + exchangeTransferStatusRequestDTO.setAgentId(keyInfo.getCode()); + exchangeTransferStatusRequestDTO.setAgentKey(keyInfo.getKey()); + exchangeTransferStatusRequestDTO.setGameExchangeMoneyId(gameExchangeMoney.getId()); + exchangeTransferStatusRequestDTO.setVendor(platform); + exchangeTransferStatusRequestDTO.setKeyInfo(keyInfo); + exchangeTransferStatusRequestDTO.setSystemCurrency(gameExchangeMoney.getCurrencyCode()); + ExchangeTransferStatusResponseDTO statusResponseDTO = iGamesService.exchangeTransferStatus(exchangeTransferStatusRequestDTO); + //订单已成功 + if (StatusType.SUCCESS.getValue().equals(statusResponseDTO.getStatusType())) { + return Boolean.TRUE; + } + } + + try { + //操作第三方额度接口 + ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO = ExchangeTransferMoneyRequestDTO.builder() + .agentId(keyInfo.getCode()) + .agentKey(keyInfo.getKey()) + .account(member.getGameAccount()) + .currency(targetCurrency) + .amount(gameExchangeMoney.getBalance()) + .transferType(gameExchangeMoney.getExchangeType()) + .transactionId(gameExchangeMoney.getTransactionId()) + .gameExchangeId(gameExchangeMoney.getId()) + .vendor(platform) + .keyInfo(keyInfo) + .build(); + Long id = iGamesService.exchangeTransferByAgentId(exchangeTransferMoneyRequestDTO); + }catch (Exception e){ + //做二次确认调订单详情接口 + this.doRollBack(gameExchangeMoney); + if (GameExchangeStepStatus.FAILURE.getCode() == gameExchangeMoney.getStepStatus()){ + throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); + } + } + + + GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(gameExchangeMoney.getId()); + gameExchangeMoney.setBalance(exchangeMoney.getBalance()); + gameExchangeMoney.setStep(exchangeMoney.getStep()); + gameExchangeMoney.setStepStatus(exchangeMoney.getStepStatus()); + return gameExchangeMoneyService.updateGameExchangeMoney(gameExchangeMoney) > 0; + } + + + /** + * 一定要回滚 + * + * @param gameExchangeMoney 游戏兑换货币 + * @return boolean + */ + @Override + public boolean doRollBack(GameExchangeDTO gameExchangeMoney) { + + Platform platform = platformService.get(gameExchangeMoney.getPlatformCode()); + + String targetCurrency = platform.getCurrencyInfo().get(gameExchangeMoney.getCurrencyCode()); + ApiException.notNull(targetCurrency, ErrorCode.CURRENCY_NOT_EXIST.getCode()); + + KeyInfo keyInfo = null; + for (KeyInfo keyData : platform.getKeyInfo()) { + if (StringUtils.isNotEmpty(gameExchangeMoney.getCurrencyCode())) { + if (keyData.getCurrency().equalsIgnoreCase(gameExchangeMoney.getCurrencyCode())) { + keyInfo = keyData; + break; + } + } + } + Member member = memberService.selectMemberById(gameExchangeMoney.getMemberId()); + IGamesService iGamesService = gamesService.get(gameExchangeMoney.getPlatformCode() + Constants.SERVICE); + + ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO(); + exchangeTransferStatusRequestDTO.setAccount(member.getGameAccount()); + exchangeTransferStatusRequestDTO.setCurrency(targetCurrency); + exchangeTransferStatusRequestDTO.setOrderId(gameExchangeMoney.getTransactionId()); + exchangeTransferStatusRequestDTO.setAgentId(keyInfo.getCode()); + exchangeTransferStatusRequestDTO.setAgentKey(keyInfo.getKey()); + exchangeTransferStatusRequestDTO.setGameExchangeMoneyId(gameExchangeMoney.getId()); + exchangeTransferStatusRequestDTO.setVendor(platform); + exchangeTransferStatusRequestDTO.setKeyInfo(keyInfo); + exchangeTransferStatusRequestDTO.setSystemCurrency(gameExchangeMoney.getCurrencyCode()); + ExchangeTransferStatusResponseDTO statusResponseDTO = iGamesService.exchangeTransferStatus(exchangeTransferStatusRequestDTO); + //订单已成功 + if (StatusType.SUCCESS.getValue().equals(statusResponseDTO.getStatusType())) { + gameExchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + gameExchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); + return gameExchangeMoneyService.updateGameExchangeMoney(gameExchangeMoney) > 0; + } + gameExchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + gameExchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode()); + return gameExchangeMoneyService.updateGameExchangeMoney(gameExchangeMoney) > 0; + } + + /** + * 下一步处理器 + * + * @return {@link GameExchangeStep } + */ + @Override + public GameExchangeStep nextStepProcessor() { + return GameExchangeStep.TENANT_QUOTA_DEDUCTED; + } + + /** + * 后级处理器 + * + * @return {@link GameExchangeStep } + */ + @Override + public GameExchangeStep backStepProcessor() { + { + return GameExchangeStep.DEDUCT_BALANCE; + } + } + +} 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 1c4a951..d5a4f85 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 @@ -313,34 +313,7 @@ public class GamesFCServiceImpl implements IGamesService { log.info("GamesFCServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); - Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); - String transactionId = gameExchangeMoneyService.getTransactionId(GamePlatforms.FC.getInfo(), 30); - 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(exchangeTransferMoneyRequestDTO.getSystemCurrency()) - .memberId(member.getId()) - .transactionId(transactionId) - .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); + GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId()); //获取余额 @@ -352,7 +325,7 @@ public class GamesFCServiceImpl implements IGamesService { //获取当前游戏币 MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder() - .accounts(member.getGameAccount()) + .accounts(exchangeTransferMoneyRequestDTO.getAccount()) .agentId(exchangeTransferMoneyRequestDTO.getAgentId()) .agentKey(exchangeTransferMoneyRequestDTO.getAgentKey()) .currency(exchangeTransferMoneyRequestDTO.getCurrency()) @@ -366,7 +339,7 @@ public class GamesFCServiceImpl implements IGamesService { Map paramsMap = new HashMap<>(); paramsMap.put("MemberAccount", exchangeTransferMoneyRequestDTO.getAccount()); - paramsMap.put("TrsID", transactionId); + paramsMap.put("TrsID", exchangeTransferMoneyRequestDTO.getTransactionId()); paramsMap.put("AllOut", type); paramsMap.put("Points", amount); paramsMap.putAll(getKeyMap(paramsMap, gamesBaseRequestDTO.getAgentKey(), gamesBaseRequestDTO.getCurrency(), gamesBaseRequestDTO.getAgentId())); 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 f82a544..367f30e 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 @@ -280,35 +280,10 @@ public class GamesJILIServiceImpl implements IGamesService { public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); - String transactionId = GamePlatforms.JILI.getInfo() + IdUtils.simpleUUID(); - - List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( - GameExchangeMoney.builder() - .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) - .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) - .build() - ); - Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); + GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId()); + - //获取下一个自增id - GameExchangeMoney exchangeMoney = GameExchangeMoney - .builder() - .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) - .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) - .quota(exchangeTransferMoneyRequestDTO.getQuota()) - .balance(exchangeTransferMoneyRequestDTO.getAmount()) - .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) - .memberId(member.getId()) - .transactionId(transactionId) - .platformCode(GamePlatforms.JILI.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 query = "Account=" + exchangeTransferMoneyRequestDTO.getAccount() 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 6029bbc..07fb272 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 @@ -319,41 +319,17 @@ public class GamesKMServiceImpl implements IGamesService { log.info("GamesKMServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); - Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); - String transactionId = GamePlatforms.KM.getInfo() + IdUtils.simpleUUID(); - List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( - GameExchangeMoney.builder() - .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) - .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) - .build() - ); - Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); + GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId()); + + - //获取下一个自增id - GameExchangeMoney exchangeMoney = GameExchangeMoney - .builder() - .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) - .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) - .quota(exchangeTransferMoneyRequestDTO.getQuota()) - .balance(exchangeTransferMoneyRequestDTO.getAmount()) - .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) - .memberId(member.getId()) - .transactionId(transactionId) - .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())) { // 获取第三方钱包余额 MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder() - .accounts(member.getGameAccount()) + .accounts(exchangeTransferMoneyRequestDTO.getAccount()) .agentId(exchangeTransferMoneyRequestDTO.getAgentId()) .currency(exchangeTransferMoneyRequestDTO.getCurrency()) .agentKey(exchangeTransferMoneyRequestDTO.getAgentKey()) @@ -366,7 +342,7 @@ public class GamesKMServiceImpl implements IGamesService { params.put("userid", exchangeTransferMoneyRequestDTO.getAccount()); params.put("amt", amount); params.put("cur", exchangeTransferMoneyRequestDTO.getCurrency()); - params.put("txid", transactionId); + params.put("txid", exchangeTransferMoneyRequestDTO.getTransactionId()); Map headerMap = this.getKey(exchangeTransferMoneyRequestDTO); KMTransactionResponse kmTransactionResponse; 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 c01c1aa..8ebe789 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 @@ -267,35 +267,10 @@ public class MeiTianGameServiceImpl implements IGamesService { public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); - String transactionId = GamePlatforms.MT.getCode() + IdUtils.simpleUUID(); - - List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( - GameExchangeMoney.builder() - .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) - .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) - .build() - ); - Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); + GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId()); + - //获取下一个自增id - GameExchangeMoney exchangeMoney = GameExchangeMoney - .builder() - .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) - .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) - .quota(exchangeTransferMoneyRequestDTO.getQuota()) - .balance(exchangeTransferMoneyRequestDTO.getAmount()) - .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) - .memberId(member.getId()) - .transactionId(transactionId) - .platformCode(GamePlatforms.MT.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 key = exchangeTransferMoneyRequestDTO.getAgentKey(); String merchantId = exchangeTransferMoneyRequestDTO.getAgentId(); @@ -314,7 +289,7 @@ public class MeiTianGameServiceImpl implements IGamesService { Map rawMap = new LinkedHashMap<>(); rawMap.put("merchantId", merchantId); rawMap.put("playerName", playerName); - rawMap.put("extTransId", transactionId); + rawMap.put("extTransId", exchangeTransferMoneyRequestDTO.getTransactionId()); rawMap.put("coins", coins); String rawData = JSON.toJSONString(rawMap); String data = null; @@ -333,7 +308,7 @@ public class MeiTianGameServiceImpl implements IGamesService { merchantId, playerName, coins, - transactionId, + exchangeTransferMoneyRequestDTO.getTransactionId(), md5Code, data ); @@ -366,7 +341,7 @@ public class MeiTianGameServiceImpl implements IGamesService { merchantId, playerName, coins, - transactionId, + exchangeTransferMoneyRequestDTO.getTransactionId(), md5Code, data ); 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 c1b9208..9c950c5 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 @@ -285,41 +285,15 @@ public class GamesPGServiceImpl implements IGamesService { log.info("GamesNGServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); - Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); - String transactionId = gameExchangeMoneyService.getTransactionId(GamePlatforms.PG.getCode(), 32); - List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( - GameExchangeMoney.builder() - .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) - .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) - .build() - ); - Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); + GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId()); - //获取下一个自增id - GameExchangeMoney exchangeMoney = GameExchangeMoney - .builder() - .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) - .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) - .quota(exchangeTransferMoneyRequestDTO.getQuota()) - .balance(exchangeTransferMoneyRequestDTO.getAmount()) - .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) - .memberId(member.getId()) - .transactionId(transactionId) - .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(); //获取当前游戏币 MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder() - .accounts(member.getGameAccount()) + .accounts(exchangeTransferMoneyRequestDTO.getAccount()) .agentId(exchangeTransferMoneyRequestDTO.getAgentId()) .agentKey(exchangeTransferMoneyRequestDTO.getAgentKey()) .currency(exchangeTransferMoneyRequestDTO.getCurrency()) @@ -337,7 +311,7 @@ public class GamesPGServiceImpl implements IGamesService { paramsMap.put("currency", exchangeTransferMoneyRequestDTO.getCurrency()); paramsMap.put("type", type); paramsMap.put("amount", exchangeTransferMoneyRequestDTO.getAmount()); - paramsMap.put("orderId", transactionId); + paramsMap.put("orderId", exchangeTransferMoneyRequestDTO.getTransactionId()); Map key = this.getKey(exchangeTransferMoneyRequestDTO); diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java index 02f89a9..f95ced5 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java @@ -268,39 +268,11 @@ public class GamesPGTServiceImpl implements IGamesService { 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), "订单号重复"); + GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId()); - //获取下一个自增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; @@ -322,7 +294,7 @@ public class GamesPGTServiceImpl implements IGamesService { Map paramsMap = new LinkedHashMap<>(); paramsMap.put("username", exchangeTransferMoneyRequestDTO.getAccount()); paramsMap.put("amount", amount.setScale(2, RoundingMode.DOWN).toString()); - paramsMap.put("transactionRef", transactionId); + paramsMap.put("transactionRef", exchangeTransferMoneyRequestDTO.getTransactionId()); paramsMap.put("productId", productId); Map key = this.getKey(exchangeTransferMoneyRequestDTO); PGTExchangeTransferResponse errorResponse; 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 65c4e08..a125396 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 @@ -278,35 +278,9 @@ public class GamesPGXServiceImpl implements IGamesService { log.info("GamesPGXServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); - 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), "订单号重复"); + GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId()); - //获取下一个自增id - GameExchangeMoney exchangeMoney = GameExchangeMoney - .builder() - .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) - .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) - .quota(exchangeTransferMoneyRequestDTO.getQuota()) - .balance(exchangeTransferMoneyRequestDTO.getAmount()) - .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) - .memberId(member.getId()) - .transactionId(transactionId) - .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(); @@ -339,7 +313,7 @@ public class GamesPGXServiceImpl implements IGamesService { paramsMap.put("operatorcode", exchangeTransferMoneyRequestDTO.getAgentId()); paramsMap.put("password", keyInfo.getPassword()); paramsMap.put("providercode", keyInfo.getProviderCode()); - paramsMap.put("referenceid", transactionId); + paramsMap.put("referenceid", exchangeTransferMoneyRequestDTO.getTransactionId()); paramsMap.put("type", type); paramsMap.put("username", exchangeTransferMoneyRequestDTO.getAccount()); String key = this.getKey(paramsMap, exchangeTransferMoneyRequestDTO); diff --git a/ff-game/src/main/java/com/ff/game/api/request/ExchangeTransferMoneyRequestDTO.java b/ff-game/src/main/java/com/ff/game/api/request/ExchangeTransferMoneyRequestDTO.java index b9b1dfa..fcd104c 100644 --- a/ff-game/src/main/java/com/ff/game/api/request/ExchangeTransferMoneyRequestDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/request/ExchangeTransferMoneyRequestDTO.java @@ -27,15 +27,7 @@ public class ExchangeTransferMoneyRequestDTO extends GamesBaseRequestDTO { */ private String account; - /** - * 租户密钥 - */ - private String tenantKey; - /** - * 订单id - */ - private String orderId; /** * 金额 */ @@ -43,9 +35,14 @@ public class ExchangeTransferMoneyRequestDTO extends GamesBaseRequestDTO { /** - * 租户额度 + * 游戏交换id */ - private BigDecimal quota; + private Long gameExchangeId; + + /** + * 交易编号 + */ + private String transactionId; /** 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 c697f95..8b44bdc 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 @@ -256,45 +256,15 @@ public class GamesSAServiceImpl implements IGamesService { public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { log.info("GamesSAServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); - Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); - List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( - GameExchangeMoney.builder() - .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) - .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) - .build() - ); - Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); - //判断是转入还是转出 - String transactionId = "OUT" + DateUtils.dateTimeNow() + exchangeTransferMoneyRequestDTO.getAccount(); - if (!TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) { - transactionId = "IN" + DateUtils.dateTimeNow() + exchangeTransferMoneyRequestDTO.getAccount(); - } + GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId()); - //获取下一个自增id - GameExchangeMoney exchangeMoney = GameExchangeMoney - .builder() - .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) - .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) - .quota(exchangeTransferMoneyRequestDTO.getQuota()) - .balance(exchangeTransferMoneyRequestDTO.getAmount()) - .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) - .memberId(member.getId()) - .transactionId(transactionId) - .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()); - params.put("OrderId", exchangeMoney.getTransactionId()); + params.put("OrderId", exchangeTransferMoneyRequestDTO.getTransactionId()); String query = JsonUtil.mapToQueryString(params); exchangeTransferMoneyRequestDTO.setQuery(query); String key = this.getKey(exchangeTransferMoneyRequestDTO, "DebitAllBalanceDV"); @@ -324,7 +294,7 @@ public class GamesSAServiceImpl implements IGamesService { } else { Map params = new LinkedHashMap<>(); params.put("Username", exchangeTransferMoneyRequestDTO.getAccount()); - params.put("OrderId", exchangeMoney.getTransactionId()); + params.put("OrderId", exchangeTransferMoneyRequestDTO.getTransactionId()); params.put("CreditAmount", exchangeTransferMoneyRequestDTO.getAmount().stripTrailingZeros().toPlainString()); params.put("CurrencyType", exchangeTransferMoneyRequestDTO.getCurrency()); String query = JsonUtil.mapToQueryString(params); diff --git a/ff-game/src/main/java/com/ff/game/api/xk/client/XKClient.java b/ff-game/src/main/java/com/ff/game/api/xk/client/XKClient.java index af567fd..d84a42f 100644 --- a/ff-game/src/main/java/com/ff/game/api/xk/client/XKClient.java +++ b/ff-game/src/main/java/com/ff/game/api/xk/client/XKClient.java @@ -61,6 +61,16 @@ public interface XKClient { @Post(url = "/exchangeTransferByAgentId") XKExchangeMoneyResponseDTO exchangeTransferByAgentId( @JSONBody Map params); + + /** + * 按代理id进行交换转账 + * + * @param params 参数 + * @return {@link XKCheckTransferByTransactionIdDTO } + */ + @Post(url = "/getTransferRecordByTransactionId") + XKCheckTransferByTransactionIdDTO checkTransferByTransactionId( @JSONBody Map params); + /** * 按时间获取投注记录 * diff --git a/ff-game/src/main/java/com/ff/game/api/xk/dto/XKCheckTransferByTransactionIdDTO.java b/ff-game/src/main/java/com/ff/game/api/xk/dto/XKCheckTransferByTransactionIdDTO.java new file mode 100644 index 0000000..8c8cabd --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/xk/dto/XKCheckTransferByTransactionIdDTO.java @@ -0,0 +1,76 @@ +package com.ff.game.api.xk.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * xkcheck按交易id dto转账 + * + * @author shi + * @date 2025/04/09 + */ +@Data +public class XKCheckTransferByTransactionIdDTO { + /** + * 响应码 + */ + @JsonProperty("code") + private Integer code; + + /** + * 响应消息 + */ + @JsonProperty("msg") + private String msg; + + /** + * 响应数据 + */ + @JsonProperty("data") + private TransactionData data; + + /** + * 交易数据 + */ + @Data + public static class TransactionData { + + /** + * 会员唯一识别值 + */ + @JsonProperty("account") + private String account; + + /** + * 交易序号,额度转移纪录唯一值 + */ + @JsonProperty("transactionId") + private String transactionId; + + /** + * 交易时间(时间戳,单位毫秒) + */ + @JsonProperty("transferTime") + private Long transferTime; + + /** + * 交易金额(Decimal(16,4)) + */ + @JsonProperty("amount") + private BigDecimal amount; + + /** + * 转账类型 + */ + @JsonProperty("transferType") + private Integer transferType; + + /** + * 状态 + */ + @JsonProperty("status") + private Integer status; + } +} 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 3a39919..ce73a29 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 @@ -188,7 +188,7 @@ public class GamesXKServiceImpl implements IGamesService { params.put("key", key); params.put("disableFullScreen", gamesLogin.getDisableFullScreen()); params.put("homeUrl", gamesLogin.getHomeUrl()); - params.put("platform", gamesLogin.getVendor()); + params.put("platform", gamesLogin.getPlatform()); XKLoginWithoutRedirectResponseDTO xkLoginWithoutRedirectResponseDTO = xkClient.loginWithoutRedirect(params); //判断是否获取成功 if (this.getIsSuccess(xkLoginWithoutRedirectResponseDTO.getCode())) { @@ -243,7 +243,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)); + game.setGameId(StringUtils.addSuffix(GamePlatforms.XK.getCode(), gamesDataDTO.getGameId())); List nameInfos = new ArrayList<>(); nameInfos.add(new NameInfo(gamesDataDTO.getName(), "zh-CN")); game.setNameInfo(nameInfos); @@ -276,40 +276,16 @@ public class GamesXKServiceImpl implements IGamesService { @Transactional public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { log.info("GamesXKServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); -// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(GamePlatforms.XK.getInfo()) -// .code(exchangeTransferMoneyRequestDTO.getAgentId()) -// .build()); - Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); - String transactionId = GamePlatforms.XK.getCode() + IdUtils.simpleUUID(); - 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(exchangeTransferMoneyRequestDTO.getSystemCurrency()) - .memberId(member.getId()) - .transactionId(transactionId) - .platformCode(GamePlatforms.XK.getCode()) - .build(); - exchangeMoney.setCreateBy(Constants.SYSTEM); - //接口限制限制50字符 - exchangeMoney.setTransactionId(GamePlatforms.XK.getCode() + IdUtils.simpleUUID()); + GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId()); + + + + Map params = new LinkedHashMap<>(); params.put("account", exchangeTransferMoneyRequestDTO.getAccount()); - params.put("transactionId", exchangeMoney.getTransactionId()); + params.put("transactionId", exchangeTransferMoneyRequestDTO.getTransactionId()); params.put("amount", exchangeTransferMoneyRequestDTO.getAmount().stripTrailingZeros().toPlainString()); params.put("transferType", exchangeTransferMoneyRequestDTO.getTransferType()); params.put("agentId", exchangeTransferMoneyRequestDTO.getAgentId()); @@ -329,9 +305,16 @@ public class GamesXKServiceImpl 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(exchangeMoneyResponseData.getStatus()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); + } else { + exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); + exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); + log.error("GamesXKServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{},错误信息{}", exchangeMoneyResponse.getCode(), exchangeMoneyResponse.getMsg()); throw new BaseException(exchangeMoneyResponse.getMsg()); } @@ -347,7 +330,27 @@ public class GamesXKServiceImpl implements IGamesService { */ @Override public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { - return new ExchangeTransferStatusResponseDTO(); + Map params = new LinkedHashMap<>(); + params.put("transactionId", exchangeTransferMoneyRequestDTO.getOrderId()); + params.put("agentId", exchangeTransferMoneyRequestDTO.getAgentId()); + String query = JsonUtil.mapToQueryString(params); + exchangeTransferMoneyRequestDTO.setQuery(query); + String key = this.getKey(exchangeTransferMoneyRequestDTO); + params.put("key", key); + XKCheckTransferByTransactionIdDTO xkCheckTransferByTransactionIdDTO = xkClient.checkTransferByTransactionId(params); + //判断是否转移成功 + if (this.getIsSuccess(xkCheckTransferByTransactionIdDTO.getCode())) { + XKCheckTransferByTransactionIdDTO.TransactionData data = xkCheckTransferByTransactionIdDTO.getData(); + return ExchangeTransferStatusResponseDTO.builder() + .statusType(data.getStatus()) + .balance(data.getAmount()) + .build(); + } else { + return ExchangeTransferStatusResponseDTO.builder() + .statusType(StatusType.FAILURE.getValue()) + .build(); + } + } @@ -359,7 +362,6 @@ public class GamesXKServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { -// List gameBettingDetails = new ArrayList<>(); //请求参数 log.info("GamesXKServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO); Map params = new LinkedHashMap<>(); @@ -416,7 +418,51 @@ public class GamesXKServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { - return null; + //请求参数 + log.info("GamesXKServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", betRecordByTimeDTO); + Map params = new LinkedHashMap<>(); + params.put("startTime", betRecordByTimeDTO.getStartTime()); + params.put("endTime", betRecordByTimeDTO.getEndTime()); + params.put("page", betRecordByTimeDTO.getPage()); + params.put("pageLimit", betRecordByTimeDTO.getPageLimit()); + params.put("agentId", betRecordByTimeDTO.getAgentId()); + String query = JsonUtil.mapToQueryString(params); + betRecordByTimeDTO.setQuery(query); + String key = this.getKey(betRecordByTimeDTO); + params.put("key", key); + XKBetRecordResponseDTO xkBetRecordResponseDTO = xkClient.getBetRecordByTime(params); + + //判断是否获取成功 + if (this.getIsSuccess(xkBetRecordResponseDTO.getCode())) { + //数据组装 + XKBetRecordResponseDTO.DataBean dataBean = xkBetRecordResponseDTO.getData(); + this.batchInsert(xkBetRecordResponseDTO, betRecordByTimeDTO); + + //获取下一页数据 + while (!Objects.equals(dataBean.getCurrentPage(), dataBean.getTotalPages()) && dataBean.getTotalPages() > 0) { + betRecordByTimeDTO.setPage(dataBean.getCurrentPage() + 1); + //请求参数 + params = new LinkedHashMap<>(); + params.put("startTime", betRecordByTimeDTO.getStartTime()); + params.put("endTime", betRecordByTimeDTO.getEndTime()); + params.put("page", betRecordByTimeDTO.getPage()); + params.put("pageLimit", betRecordByTimeDTO.getPageLimit()); + params.put("agentId", betRecordByTimeDTO.getAgentId()); + query = JsonUtil.mapToQueryString(params); + betRecordByTimeDTO.setQuery(query); + key = this.getKey(betRecordByTimeDTO); + params.put("key", key); + xkBetRecordResponseDTO = xkClient.getBetRecordByTime(params); + dataBean = xkBetRecordResponseDTO.getData(); + this.batchInsert(xkBetRecordResponseDTO, betRecordByTimeDTO); + } + + + return Boolean.TRUE; + } else { + log.error("GamesXKServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", xkBetRecordResponseDTO.getCode(), xkBetRecordResponseDTO.getMsg()); + throw new BaseException(xkBetRecordResponseDTO.getMsg()); + } } /** @@ -516,7 +562,7 @@ public class GamesXKServiceImpl implements IGamesService { * * @param xkBetRecordResponseDTO xk下注记录响应dto */ - private void batchInsert(XKBetRecordResponseDTO xkBetRecordResponseDTO, BetRecordByTimeDTO betRecordByTimeDTO) { + private synchronized void batchInsert(XKBetRecordResponseDTO xkBetRecordResponseDTO, BetRecordByTimeDTO betRecordByTimeDTO) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 diff --git a/ff-game/src/main/java/com/ff/game/domain/ExtInfo.java b/ff-game/src/main/java/com/ff/game/domain/ExtInfo.java index c86d5f9..2736dba 100644 --- a/ff-game/src/main/java/com/ff/game/domain/ExtInfo.java +++ b/ff-game/src/main/java/com/ff/game/domain/ExtInfo.java @@ -1,6 +1,7 @@ package com.ff.game.domain; import lombok.Data; +import org.springframework.util.ObjectUtils; import java.io.Serializable; import java.util.Map; @@ -13,8 +14,26 @@ public class ExtInfo implements Serializable { // 币种信息,key为其它平台的币种id,value为我们自己的币种 private Map currency; + /** + * 超时时间 + */ + private Map timeout; public String getOurCurrency(String currencyId) { return currency == null ? null : currency.get(currencyId); } + + /** + * 获取超时 + * + * @param key 钥匙 + * @return {@link Long } + */ + public Long getTimeout(String key) { + Map timeout = this.timeout; + if (!ObjectUtils.isEmpty(timeout) && timeout.containsKey(key)) { + return timeout.get(key); + } + return 5000L; + } } diff --git a/ff-game/src/main/java/com/ff/game/service/impl/GameExchangeMoneyServiceImpl.java b/ff-game/src/main/java/com/ff/game/service/impl/GameExchangeMoneyServiceImpl.java index 9018a3f..059ede3 100644 --- a/ff-game/src/main/java/com/ff/game/service/impl/GameExchangeMoneyServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/service/impl/GameExchangeMoneyServiceImpl.java @@ -14,6 +14,7 @@ import com.ff.game.mapper.GameExchangeMoneyMapper; import com.ff.game.domain.GameExchangeMoney; import com.ff.game.service.IGameExchangeMoneyService; import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; /** * 会员金额转移记录Service业务层处理 @@ -65,7 +66,9 @@ public class GameExchangeMoneyServiceImpl implements IGameExchangeMoneyService @Override public int insertGameExchangeMoney(GameExchangeMoney gameExchangeMoney) { - gameExchangeMoney.setId(IdUtil.getSnowflakeNextId()); + if (ObjectUtils.isEmpty(gameExchangeMoney.getId())){ + gameExchangeMoney.setId(IdUtil.getSnowflakeNextId()); + } gameExchangeMoney.setCreateTime(DateUtils.getNowDate()); return gameExchangeMoneyMapper.insertGameExchangeMoney(gameExchangeMoney); } diff --git a/ff-game/src/main/resources/mapper/common/TenantGameQuotaFlowMapper.xml b/ff-game/src/main/resources/mapper/common/TenantGameQuotaFlowMapper.xml index 398b666..a20678d 100644 --- a/ff-game/src/main/resources/mapper/common/TenantGameQuotaFlowMapper.xml +++ b/ff-game/src/main/resources/mapper/common/TenantGameQuotaFlowMapper.xml @@ -57,6 +57,9 @@ and quota_type = #{quotaType} + + and source_id = #{sourceId} + and member_id = #{memberId} From 0ce67f08ab33709254e337b639c87966cb2e6d0c Mon Sep 17 00:00:00 2001 From: cengy Date: Fri, 11 Apr 2025 10:59:27 +0800 Subject: [PATCH 48/62] =?UTF-8?q?feat(sports):=20=E9=87=8D=E6=9E=84=20DB?= =?UTF-8?q?=E4=BD=93=E8=82=B2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改了 CreateUserRequest 和 CreateUserResponse 的字段名称 - 重写了 DBSportsClient 接口中的方法 - 更新了 DBSportsServiceImpl 中的实现逻辑 - 新增了 GetBetListRequest 和 GetBetListResponse 类 -调整了 GetMemberInfoRequest 的结构 --- ff-game/pom.xml | 5 + .../ff/sports/db/client/DBSportsClient.java | 128 +++--- .../ff/sports/db/dto/CreateUserRequest.java | 6 +- .../ff/sports/db/dto/CreateUserResponse.java | 15 +- .../ff/sports/db/dto/GetBetListRequest.java | 93 ++++ .../ff/sports/db/dto/GetBetListResponse.java | 194 ++++++++ .../sports/db/dto/GetMemberInfoRequest.java | 27 +- .../sports/db/dto/GetMemberInfoResponse.java | 27 +- .../com/ff/sports/db/dto/GetTokenRequest.java | 30 -- .../ff/sports/db/dto/GetTokenResponse.java | 49 --- .../com/ff/sports/db/dto/GetUrlResponse.java | 33 -- .../com/ff/sports/db/dto/KickUserRequest.java | 24 + ...tUrlRequest.java => KickUserResponse.java} | 11 +- .../com/ff/sports/db/dto/LoginRequest.java | 57 +++ .../com/ff/sports/db/dto/LoginResponse.java | 34 ++ .../ff/sports/db/dto/OrderFilesRequest.java | 41 -- .../ff/sports/db/dto/OrderFilesResponse.java | 27 -- .../ff/sports/db/dto/OrderInfoRequest.java | 26 -- .../ff/sports/db/dto/OrderInfoResponse.java | 115 ----- .../sports/db/dto/TransferDetailRequest.java | 41 +- .../sports/db/dto/TransferDetailResponse.java | 34 +- .../ff/sports/db/dto/TransferInRequest.java | 46 -- .../ff/sports/db/dto/TransferInResponse.java | 20 - .../ff/sports/db/dto/TransferOutRequest.java | 46 -- .../ff/sports/db/dto/TransferOutResponse.java | 20 - .../com/ff/sports/db/dto/TransferRequest.java | 28 ++ .../ff/sports/db/dto/TransferResponse.java | 25 ++ .../sports/db/impl/DBSportsServiceImpl.java | 413 ++++++------------ .../sports/fb/impl/FBSportsServiceImpl.java | 8 +- 29 files changed, 754 insertions(+), 869 deletions(-) create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/GetBetListRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/GetBetListResponse.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/GetTokenRequest.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/GetTokenResponse.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/GetUrlResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/KickUserRequest.java rename ff-game/src/main/java/com/ff/sports/db/dto/{GetUrlRequest.java => KickUserResponse.java} (50%) create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/LoginRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/LoginResponse.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesRequest.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesResponse.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoRequest.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoResponse.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferInRequest.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferInResponse.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferOutRequest.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferOutResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferResponse.java diff --git a/ff-game/pom.xml b/ff-game/pom.xml index 0751207..abeced9 100644 --- a/ff-game/pom.xml +++ b/ff-game/pom.xml @@ -16,6 +16,11 @@ + org.springframework.boot diff --git a/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java b/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java index 8d58440..c144449 100644 --- a/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java +++ b/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java @@ -20,83 +20,87 @@ public interface DBSportsClient { } ) CreateUserResponse createMember(@Body CreateUserRequest request, - @Header("requestId") @Var("requestId") String requestId, - @Header("lang") @Var("lang") String lang); + @Header("requestId") @Var("requestId") String requestId); /** - * 用户金额转入到FB体育平台,支持两位小数,最小0.01,必须是正数 + * 用户登录接口(注册和登录合并为一个接口) * * @param request - * @param sign - * @param timestamp - * @param merchantId - * @return {@link TransferInResponse} + * @param requestId + * @return */ - @Post(url = "/api/v2/new/transfer/in") - TransferInResponse transferIn(@JSONBody TransferInRequest request, - @Header("sign") @Var("sign") String sign, - @Header("timestamp") @Var("timestamp") long timestamp, - @Header("merchantId") @Var("merchantId") String merchantId); - - @Post(url = "/api/v2/new/transfer/out") - TransferOutResponse transferOut(@JSONBody TransferOutRequest request, - @Header("sign") @Var("sign") String sign, - @Header("timestamp") @Var("timestamp") long timestamp, - @Header("merchantId") @Var("merchantId") String merchantId); - - @Post(url = "/api/v2/new/user/detail") - GetMemberInfoResponse getMemberInfo(@JSONBody GetMemberInfoRequest request, - @Header("sign") @Var("sign") String sign, - @Header("timestamp") @Var("timestamp") long timestamp, - @Header("merchantId") @Var("merchantId") String merchantId); + @Post(url = "/api/user/login", + headers = { + "Content-type: application/x-www-form-urlencoded" + } + ) + LoginResponse login(@Body LoginRequest request, + @Header("requestId") String requestId); /** - * 查询转账详情,当转入/转出接口遇到异常,可查询某次转账是否成功 + * 用户金额转入到DB体育平台,支持两位小数,最小0.01,必须是正数 + * + * @param request + * @return {@link TransferResponse} */ - @Post(url = "/api/v2/transfer/detail") - TransferDetailResponse transferDetail(@JSONBody TransferDetailRequest request, - @Header("sign") @Var("sign") String sign, - @Header("timestamp") @Var("timestamp") long timestamp, - @Header("merchantId") @Var("merchantId") String merchantId); + @Post(url = "/api/fund/transfer", + headers = { + "Content-type: application/x-www-form-urlencoded" + } + ) + TransferResponse transferIn(@Body TransferRequest request, + @Header("requestId") @Var("requestId") String requestId + ); - @Post(url = "/api/v2/service/domain/list") - GetUrlResponse getUrl(@JSONBody GetUrlRequest request, - @Header("sign") @Var("sign") String sign, - @Header("timestamp") @Var("timestamp") long timestamp, - @Header("merchantId") @Var("merchantId") String merchantId); + @Post(url = "/api/fund/transfer", + headers = { + "Content-type: application/x-www-form-urlencoded" + } + ) + TransferResponse transferOut(@Body TransferRequest request, + @Header("requestId") String requestId + ); + + @Post(url = "/api/fund/checkBalance", + headers = { + "Content-type: application/x-www-form-urlencoded" + } + ) + GetMemberInfoResponse getMemberInfo(@Body GetMemberInfoRequest request, + @Header("requestId") String requestId); /** - * FB体育用拉取订单文件的方式同步订单数据,FB体育每5分钟生成一次订单文件, - * 通过此接口获取某一段时间内的文件ID列表,再通过文件ID获取具体订单数据 + * 根据转账ID查询交易记录接口。 */ - @Post(url = "/api/v2/order/file/ids") - OrderFilesResponse orderFiles(@JSONBody OrderFilesRequest request, - @Header("sign") @Var("sign") String sign, - @Header("timestamp") @Var("timestamp") long timestamp, - @Header("merchantId") @Var("merchantId") String merchantId); + @Post(url = "/api/fund/getTransferRecord", + headers = { + "Content-type: application/x-www-form-urlencoded" + } + ) + TransferDetailResponse transferDetail(@Body TransferDetailRequest request, + @Header("requestId") String requestId); + + /** + * 剔用户 + * + * @param request + * @param requestId + * @return + */ + @Post(value = "/api/user/kickOutUser", + headers = { + "Content-type: application/x-www-form-urlencoded" + } + ) + KickUserResponse kickUser(@Body KickUserRequest request, + @Header("requestId") String requestId); + /** * 拉取订单Json数据 */ - @Post(url = "/api/v2/order/list") - OrderInfoResponse getOrderJsonData(@JSONBody OrderInfoRequest request, - @Header("sign") @Var("sign") String sign, - @Header("timestamp") @Var("timestamp") long timestamp, - @Header("merchantId") @Var("merchantId") String merchantId); + @Post(url = "/api/bet/queryBetListV2") + GetBetListResponse getBetList(@Body GetBetListRequest request, + @Header("requestId") String requestId); - - /** - * 获取用户app端鉴权token和相关服务url,获取到的token用于app调用接口鉴权 - * - * @param request - * @param sign - * @param timestamp - * @param merchantId - * @return - */ - @Post(url = "/api/v2/token/get") - GetTokenResponse getToken(@JSONBody GetTokenRequest request, - @Header("sign") @Var("sign") String sign, - @Header("timestamp") @Var("timestamp") long timestamp, - @Header("merchantId") @Var("merchantId") String merchantId); } diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java index e985d26..b8e3366 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java +++ b/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java @@ -19,10 +19,10 @@ public class CreateUserRequest implements Serializable { private String currency; // 币种 private String nickname; // N 昵称 private String agentId; // N 信用网(代理id) - private String sign; // 签名 signature =MD5(MD5(userName +”&”+ merchantCode +”&”+ timestamp) + ”&”+ key) + private String signature; // 签名 signature =MD5(MD5(userName +”&”+ merchantCode +”&”+ timestamp) + ”&”+ key) - public void calcSign(String key) { + public void buildSignature(String key) { String signature = Md5Utils.md5New(Md5Utils.md5New(userName + "&" + merchantCode + "&" + timestamp) + "&" + key); - this.sign = signature; + this.signature = signature; } } diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserResponse.java index 6098450..ce2c62e 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserResponse.java +++ b/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserResponse.java @@ -12,8 +12,15 @@ public class CreateUserResponse implements Serializable { private static final long serialVersionUID = 1L; - private Boolean success; - private Integer data; - private Integer code; - private String message; + private Boolean status; + private String msg; + private String code; + private Long serverTime; + private UserDTO data; + + @Data + public static class UserDTO { + private String userId; + } + } diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListRequest.java new file mode 100644 index 0000000..13f95cd --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListRequest.java @@ -0,0 +1,93 @@ +package com.ff.sports.db.dto; + +import com.ff.base.utils.sign.Md5Utils; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cengy + */ +@Data +public class GetBetListRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 用户名(可选) + */ + private String userName; + + /** + * 开始时间(13位时间戳,必填) + */ + private String startTime; + + /** + * 结束时间(13位时间戳,必填) + */ + private String endTime; + + /** + * 商户编码(必填) + */ + private String merchantCode; + + /** + * 赛种ID(可选) + */ + private Integer sportId; + + /** + * 联赛ID(可选) + */ + private Long tournamentId; + + /** + * 结算状态(可选) + * 0: 未结算 + * 1: 已结算 + * 2: 取消人工 + * 3: 待确认 + * 4: 风控拒单 + * 5: 撤单(赛事取消) + */ + private Integer settleStatus; + + /** + * 页面编号,从1开始(可选) + */ + private Integer pageNum; + + /** + * 每页条数(最大1000,可选) + */ + private Integer pageSize; + + /** + * 请求时间戳(13位,必填) + */ + private String timestamp; + + /** + * 排序方式(可选) + * 1: 订单创建时间(投注时间) + * 2: 订单更新时间 + */ + private Integer orderBy; + + /** + * 语言(可选,默认中文,传"en"返回英文) + */ + private String language; + + /** + * 签名(必填) + */ + private String signature; + + public void buildSignature(String key) { + String signature = Md5Utils.md5New(Md5Utils.md5New(merchantCode + "&" + startTime + "&" + endTime + "&" + timestamp) + "&" + key); + this.signature = signature; + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListResponse.java new file mode 100644 index 0000000..aace488 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListResponse.java @@ -0,0 +1,194 @@ +package com.ff.sports.db.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * @author cengy + */ +@Data +public class GetBetListResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + private Boolean status; + private String msg; + private String code; + private Long serverTime; + + + // 当前页码 + private Integer pageNum; + // 每页条数 + private Integer pageSize; + // 总条数 + private Integer totalCount; + // 注单列表 + private List list; + + @Data + public static class OrderItemDTO { + // 用户名 + private String userName; + + // 商户编码 + private String merchantCode; + + // 订单ID + private String orderNo; + + // 订单状态,具体见参数字段映射 + private Integer orderStatus; + + // 投注时间(13位时间戳) + private Long createTime; + + // 订单更新时间(13位时间戳) + private Long modifyTime; + + // 实际投注金额 + private String orderAmount; + + // 注单项数量 + private Integer betCount; + + // 结算时间(13位时间戳) + private Long settleTime; + + // 结算金额 + private Double settleAmount; + + // 提前结算投注金额 + private Double preBetAmount; + + // 盈利金额 + private Double profitAmount; + + // 注单结算结果 + // 2:走水,3:输,4:赢,5:赢半,6:输半,7:赛事取消,8:赛事延期 + private Integer outcome; + + // 串关类型 + private Integer seriesType; + + // 串关值 + private String seriesValue; + + // 结算次数 + private Integer settleTimes; + + // 设备类型:1-H5,2-PC,3-Android,4-IOS + private String deviceType; + + // 移动设备标识 + private String deviceImei; + + // 用户IP地址 + private String ip; + + // 币种 + private String currency; + + // 汇率 + private BigDecimal exchangeRate; + + // 最大中奖金额 + private Double maxWinAmount; + + // VIP等级 + private Integer vipLevel; + + // 投注前余额 + private BigDecimal beforeTransfer; + + // 投注后余额 + private BigDecimal afterTransfer; + + // 有效投注金额 + private BigDecimal validOrderAmount; + + // 注单详情列表 + private List detailList; + } + + @Data + public static class DetailItemDTO { + // 投注项编号 + private Long betNo; + + // 投注项ID + private Long playOptionsId; + + // 赛事ID + private Long matchId; + + // 比赛开始时间(13位时间戳) + private Long beginTime; + + // 注单金额 + private Double betAmount; + + // 联赛名称 + private String matchName; + + // 比赛对阵 + private String matchInfo; + + // 投注类型: + // 1:早盘,2:滚球盘,3:冠军盘,4:虚拟赛事,5:电竞赛事 + private Integer matchType; + + // 赛种ID + private Integer sportId; + + // 玩法ID + private Integer playId; + + // 投注项(如主客队) + private String playOptions; + + // 游戏名称 + private String sportName; + + // 联赛ID + private Long tournamentId; + + // 投注项名称 + private String playOptionName; + + // 玩法名称 + private String playName; + + // 盘口类型 + private String marketType; + + // 盘口值 + private String marketValue; + + // 让球值 + private BigDecimal handicap; + + // 结算比分(我方处理后所得,数据商可能未提供) + private String settleScore; + + // 基准分 + private String scoreBenchmark; + + // 当前赔率(欧洲盘表示) + private BigDecimal oddsValue; + + // 注单结算结果: + // 0:无结果,2:走水,3:输,4:赢,5:赢一半,6:输一半, + // 7:赛事取消,8:赛事延期,11:比赛延迟,12:比赛中断, + // 13:未知,15:比赛放弃,16:异常盘口,17:未知状态, + // 18:比赛取消,19:比赛延期 + private String betResult; + + // 最终赔率(按盘口类型) + private BigDecimal oddFinally; + } + +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoRequest.java index 015bc89..5255cb6 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoRequest.java +++ b/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoRequest.java @@ -1,11 +1,9 @@ package com.ff.sports.db.dto; -import com.alibaba.fastjson2.JSON; +import com.ff.base.utils.sign.Md5Utils; import lombok.Data; import java.io.Serializable; -import java.util.LinkedHashMap; -import java.util.Map; /** * @author cengy @@ -15,13 +13,24 @@ public class GetMemberInfoRequest implements Serializable { private static final long serialVersionUID = 1L; /** - * 渠道用户id,不能为空 + * 用户名,不能为空 */ - private String merchantUserId; + private String userName; - public String toJSON() { - Map map = new LinkedHashMap<>(); - map.put("merchantUserId", merchantUserId); - return JSON.toJSONString(map); + /** + * 商户编码 + */ + private String merchantCode; + /** + * Long型时间戳(13位) + */ + private String timestamp = System.currentTimeMillis() + ""; + + private String signature; + + public void buildSignature(String key) { + + String signature = Md5Utils.md5New(Md5Utils.md5New(merchantCode + "&" + userName + "&" + timestamp) + "&" + key); + this.signature = signature; } } diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoResponse.java index 60cb4c7..1f329c0 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoResponse.java +++ b/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoResponse.java @@ -13,26 +13,15 @@ import java.util.List; public class GetMemberInfoResponse implements Serializable { private static final long serialVersionUID = 1L; - private Boolean success; - private String message; - private MemberInfo data; - private Integer code; + private Boolean status; + private String msg; + private String code; + private Long serverTime; + private MemberInfoDTO data; @Data - public static class MemberInfo implements Serializable{ - private static final long serialVersionUID = 1L; - private String merchantUserId; - private Integer userId; // FB体育用户id - private Integer walletType; // 用户钱包类型 , see enum: wallet_type - private Integer currencyType; // 用户币种类型 , see enum: currency_type - private List wallets; // 钱包集合 - private Integer oddsLevel;// 赔率级别 , see enum: user_odds_level_enum - } - @Data - public static class Wallet implements Serializable{ - private static final long serialVersionUID = 1L; - private Integer currencyType; // 币种类型 , see enum: currency_type - private BigDecimal balance; // 余额 - private Integer currencyId; // 币种id , see enum: currency + public static class MemberInfoDTO { + private BigDecimal balance; + private String userName; } } diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenRequest.java deleted file mode 100644 index 83bfe60..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenRequest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.ff.sports.db.dto; - -import com.alibaba.fastjson2.JSON; -import lombok.Data; - -import java.io.Serializable; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * @author cengy - */ -@Data -public class GetTokenRequest implements Serializable { - - private static final long serialVersionUID = 1L; - - private String merchantUserId; - // 平台类型,pc,h5, mobile , see enum: plat_form_enum - private String platForm; - // 客户端用户ip地址,尽可能提供,我们用于风控 - private String ip; // 可选 - - public String toJSON() { - Map map = new LinkedHashMap<>(); - map.put("merchantUserId", merchantUserId); - map.put("platForm", platForm); - return JSON.toJSONString(map); - } -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenResponse.java deleted file mode 100644 index 3dfb0df..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenResponse.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.ff.sports.db.dto; - -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * @author cengy - */ -@Data -public class GetTokenResponse implements Serializable { - private static final long serialVersionUID = 1L; - - private Boolean success; - private String message; - private Integer code; - private TokenDTO data; - - @Data - public static class TokenDTO implements Serializable { - private String token; // 用户鉴权token,用于客户端鉴权 - private ServerInfo serverInfo; // 服务器地址信息 - private List domains; // 全部服务器地址信息 - private String themeBgColor; // 主题背景色 - private String themeFgColor; // 主题前景色 - private Integer userId; // FB用户ID - } - - @Data - public static class ServerInfo implements Serializable { - private static final long serialVersionUID = 1L; - private String apiServerAddress; // app接口服务地址 - private String apiEmbeddedServerAddress; // app内嵌网页地址 - private String pushServerAddress; // 推送服务地址 - private String pcAddress; // PC投注网站地址 - private String h5Address; // h5投注网站地址 - private String virtualAddress; // 虚拟体育投注网站地址 - private String virtualMatchVideoAddress; // 虚拟赛事视频地址 - private String ouH5Address; // 欧版h5地址 - private String ouPcAddress; // 欧版pc地址 - } - - @Data - public static class Domain { - private Integer type; // 域名类型 - private List domains; // 域名集合 - } -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetUrlResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetUrlResponse.java deleted file mode 100644 index d622169..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetUrlResponse.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.ff.sports.db.dto; - -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * @author cengy - */ -@Data -public class GetUrlResponse implements Serializable { - private static final long serialVersionUID = 1L; - - private Boolean success; - private String message; - private List data; - private Integer code; - - @Data - public static class UrlDTO implements Serializable { - private static final long serialVersionUID = 1L; - private int type; //域名类型,1:API,2:PUSH,3:H5,4:PC,5:IMAGE , see enum: domain_type_enum - private List domainList; // 域名集合 - } - - @Data - public static class DomainDTO implements Serializable { - private static final long serialVersionUID = 1L; - private String domain; // 域名 - private int weight; // 权限值 - } -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/KickUserRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/KickUserRequest.java new file mode 100644 index 0000000..809825d --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/KickUserRequest.java @@ -0,0 +1,24 @@ +package com.ff.sports.db.dto; + +import com.ff.base.utils.sign.Md5Utils; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cengy + */ +@Data +public class KickUserRequest implements Serializable { + + private static final long serialVersionUID = 1L; + private String userName; + private String merchantCode; + private String timestamp = System.currentTimeMillis() + ""; + private String signature; + + public void buildSignature(String key) { + String signature = Md5Utils.md5New(Md5Utils.md5New(merchantCode + "&" + userName + "&" + timestamp) + "&" + key); + this.signature = signature; + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetUrlRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/KickUserResponse.java similarity index 50% rename from ff-game/src/main/java/com/ff/sports/db/dto/GetUrlRequest.java rename to ff-game/src/main/java/com/ff/sports/db/dto/KickUserResponse.java index 4ccc4d6..065e66a 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetUrlRequest.java +++ b/ff-game/src/main/java/com/ff/sports/db/dto/KickUserResponse.java @@ -8,10 +8,13 @@ import java.io.Serializable; * @author cengy */ @Data -public class GetUrlRequest implements Serializable { +public class KickUserResponse implements Serializable { + private static final long serialVersionUID = 1L; - public String toJSON() { - return "{}"; - } + private Boolean status; + private String msg; + private String code; + private Long serverTime; + } diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/LoginRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/LoginRequest.java new file mode 100644 index 0000000..f120b9b --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/LoginRequest.java @@ -0,0 +1,57 @@ +package com.ff.sports.db.dto; + +import com.ff.base.utils.sign.Md5Utils; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author cengy + */ +@Data +public class LoginRequest implements Serializable { + + private static final long serialVersionUID = 1L; + private String userName; + private String merchantCode; + private String timestamp = System.currentTimeMillis() + ""; + private String signature; + + // 不能传错,用户可能受到设备类型相关风控措施的错误限制,进而影响正常用户货量,并产生客诉 + private String terminal; // 终端类型:【电脑传值:pc】,【移动设备传值:mobile】 注:这个参数传值必须是pc或者mobile, + private BigDecimal balance; // 用户余额,N + private String currency; // 币种(见参数映射:支持币种 )会员首次登录,必须填写币种参数,否则注册失败 + + private String callbackUrl; // 玩家会话失效跳转的商户地址url(非必传) + private String stoken; // 非必传字段(商户方用户会话) + + // 非必传字段(支持体育游戏其他端的跳转) , + // C端⽀持跳转的游戏,如果C端⽀持跳转多个游戏 , + // 则使⽤逗号区分。 具体字段可查看:参数字段映射第6条 参数字段映射 + private String jumpsupport; + private String jumpfrom; // 非必传字段,同上 + + private String agentId; // 信用网(代理id),N + // 用户语种: + //zh:中文 + //en:英文 + //vi:越南语 + //tw:中文繁体 + //th:泰语 + //ms:马来语 + //ad:印尼语 + //ko:韩语 + //mya:缅甸语 + //pt:葡萄牙语 + //es:西班牙语 + //非必传字段 + private String language; + private String ip; // 非必传字段 说明:商户端在该字段上传入用户登陆时端ip + + public void buildSignature(String key) { + String signature = Md5Utils.md5New(Md5Utils.md5New(merchantCode + "&" + userName + "&" + terminal + "&" + timestamp) + "&" + key); + + this.signature = signature; + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/LoginResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/LoginResponse.java new file mode 100644 index 0000000..eafb9ba --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/LoginResponse.java @@ -0,0 +1,34 @@ +package com.ff.sports.db.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author cengy + */ +@Data +public class LoginResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + private Boolean status; + private String msg; + private String code; + private Long serverTime; + private LoginRespDTO data; + + @Data + public static class LoginRespDTO { + private String domain; // 体育游戏前端URL + private String token; // 带有登录状态的token + private String apiDomain;// 赛事API的域名(若没有对接赛事API,为空) + private String imgDomain; // 静态资源域名 + private String loginUrl; // 登录体育URL,可直接跳转 + private String userId; // 用户id + private String url; // 参加活动的商户使用,客户端域名和参数拼接后提供商户使用 + private List loginUrlArr; // loginUrl数组,多个域名,调试使用 + } + +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesRequest.java deleted file mode 100644 index 315b698..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesRequest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ff.sports.db.dto; - -import com.alibaba.fastjson2.JSON; -import lombok.Data; - -import java.io.Serializable; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * @author cengy - */ -@Data -public class OrderFilesRequest implements Serializable { - private static final long serialVersionUID = 1L; - - /** - * 开始时间戳,13位数字,不能为null - */ - private Long startTime; - - /** - * 结束时间戳,13位数字,不能为null - */ - private Long endTime; - - public String toJSON() { - Map map = new LinkedHashMap<>(); - map.put("endTime", endTime); - map.put("startTime", startTime); - return JSON.toJSONString(map); -// String endTimeStr = endTime ; // 转换为字符串 -// String startTimeStr = startTime; // 转换为字符串 -// -// String json = "{" + -// "\"endTime\": \"" + endTimeStr + "\", " + -// "\"startTime\": \"" + startTimeStr + "\"" + -// "}"; -// return json; - } -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesResponse.java deleted file mode 100644 index 2367773..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesResponse.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.ff.sports.db.dto; - -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * @author cengy - */ -@Data -public class OrderFilesResponse implements Serializable { - private static final long serialVersionUID = 1L; - - private Boolean success; - private String message; - private Integer code; - - private List data; - - @Data - public static class FileId implements Serializable { - private static final long serialVersionUID = 1L; - private Long fileId; - } - -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoRequest.java deleted file mode 100644 index 9d51d78..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoRequest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.ff.sports.db.dto; - -import com.alibaba.fastjson2.JSON; -import lombok.Data; - -import java.io.Serializable; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * @author cengy - */ -@Data -public class OrderInfoRequest implements Serializable { - private static final long serialVersionUID = 1L; - /** - * 文件Id,需要从/order/file/ids接口获取到 - */ - private Long fileId; - - public String toJSON() { - Map map = new LinkedHashMap<>(); - map.put("fileId", fileId); - return JSON.toJSONString(map); - } -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoResponse.java deleted file mode 100644 index b6910f6..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoResponse.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.ff.sports.db.dto; - -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * @author cengy - */ -@Data -public class OrderInfoResponse implements Serializable { - private static final long serialVersionUID = 1L; - - private Boolean success; - private String message; - private Integer code; - - private List data; - - @Data - public static class OrderDTO implements Serializable { - private static final long serialVersionUID = 1L; - private String id; // 订单号 - private Integer rejectReason; // 拒单原因码 see enum: order_reject_type - private String rejectReasonStr; // 拒单原因 - private String userId; // FB平台用户ID - private String merchantId; // 渠道ID - private String merchantUserId; // 渠道用户ID - private Integer currency; // 币种 see enum: currency - private String exchangeRate; // 汇率快照 - private Integer seriesType; // 关次类型 ,0 单关、1 串关, see enum: series_type - private String betType; // 投注类型 - private Integer allUp; // 总关数 - private Integer allUpAlive; // 存活关数 - private String stakeAmount; // 投注额(本金) - private String liabilityStake; // 名义投注额(名义本金) - private String settleAmount; // 结算派奖金额 - private Integer orderStatus; // 订单状态 see enum: order_status - private Integer payStatus; // 付款状态 - private Integer oddsChange; // 是否接受赔率变更 0不接受,1 接受更好赔率,2接受任意赔率 , see enum: odds_change_enum - private String device; // 设备类型 (pc、h5、mobile) , see enum: plat_form_enum - private String ip; // 投注IP地址 - private String settleTime; // 订单结算时间 - private String createTime; // 订单创建时间 - private String modifyTime; // 订单确认时间 - private String cancelTime; // 订单取消时间 - private String thirdRemark; // 第三方备注 - private String relatedId; // 三方关联ID - private String maxWinAmount; // 最大可赢金额 - private String loseAmount; // 最大赔付金额 - private Integer rollBackCount; // 回滚次数 - private Integer itemCount; // 选项数 - private Integer seriesValue; // 串几关 - private Integer betNum; // 子单数 - private String cashOutTotalStake; // 提前结算总本金 - private String liabilityCashoutStake; // 提前结算名义总本金 - private String cashOutPayoutStake; // 提前结算总派奖额 - private String reserveId; // 预约订单单号 - private Integer cashOutCount; // 提前结算次数 - private String unitStake; // 每单金额 - private Integer reserveVersion; // 预约订单版本号 - private List betList; // 注单集合 - } - - @Data - public static class BetDTO implements Serializable { - private static final long serialVersionUID = 1L; - - private String id; // ID - private String orderId; // 订单ID - private Integer sportId; // 运动ID - private String matchId; // 比赛ID - private String matchName; // 比赛名称 - private Integer period; // 阶段ID - private String marketId; // 玩法ID - private Integer marketType; // 玩法类型 - private Integer optionType; // 投注项类型 - private String optionName; // 选项名称 - private String marketName; // 玩法名称 - private String tournamentId; // 联赛ID - private String tournamentName; // 联赛名称 - private String odds; // 欧式赔率 - private Integer oddsFormat; // 投注时赔率类型 - private String betOdds; // 投注时赔率 - private Integer settleStatus; // 结算状态 - private Integer settleResult; // 结算结果 - private Boolean isInplay; // 是否滚球 - private String remark; // 备注 - private Double p1; // 变量1 (例如:让几个球) - private Double p2; // 变量2 - private Double p3; // 变量3 - private String extendedParameter; // 亚洲让球线 - private String extraInfo; // 当前比分 - private String pendingTime; // 延迟等待时间 - private String betScore; // 下注当时比分 - private Integer cancelReason; // 取消原因 - private String cancelReasonName; // 取消原因文本 - private Integer matchType; // 赛事类型 - private String matchTime; // 开赛时间 - private Integer virtualMatchDay; // 轮次 - private Integer virtualChampId; // 赛季 - private Integer virtualLegOrder; // 淘汰赛回合 - private Integer virtualWeekDay; // 小组赛比赛日 - private Integer virtualBlockId; // 期 - private Integer leaguePhase; // 联赛阶段 - private String maxStake; // 最大投注额 - private String validSettleStakeAmount; // 有效已结算投注额 - private String validSettleAmount; // 有效返还额 - private String cashOutCancelStake; // 提前结算取消总额 - private Integer walletType; // 钱包类型 - private Integer version; // 数据变更标记 - } - -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailRequest.java index 8bb2c9e..342144d 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailRequest.java +++ b/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailRequest.java @@ -1,11 +1,9 @@ package com.ff.sports.db.dto; -import com.alibaba.fastjson2.JSON; +import com.ff.base.utils.sign.Md5Utils; import lombok.Data; import java.io.Serializable; -import java.util.LinkedHashMap; -import java.util.Map; /** * @author cengy @@ -13,27 +11,28 @@ import java.util.Map; @Data public class TransferDetailRequest implements Serializable { + /** + * 用户名,N + */ + private String userName; + /** + * 商户code + */ + private String merchantCode; + /** + * 交易id(19位数字) + */ + private String transferId; + + private String timestamp = System.currentTimeMillis() + ""; /** - * 业务id,不能为null + * 签名 */ - private String businessId; + private String signature; - /** - * 渠道用户ID,不能为null - */ - private String merchantUserId; - - /** - * 转账类型 , see enum: transfer_type_enum 不能为空 - */ - private String transferType; - - public String toJSON() { - Map map = new LinkedHashMap<>(); - map.put("businessId", businessId); - map.put("merchantUserId", merchantUserId); - map.put("transferType", transferType); - return JSON.toJSONString(map); + public void buildSignature(String key) { + String signature = Md5Utils.md5New(Md5Utils.md5New(merchantCode + "&" + transferId + "&" + timestamp) + "&" + key); + this.signature = signature; } } diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailResponse.java index 8f56651..77fba58 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailResponse.java +++ b/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailResponse.java @@ -12,27 +12,27 @@ import java.math.BigDecimal; public class TransferDetailResponse implements Serializable { private static final long serialVersionUID = 1L; - private Boolean success; - private String message; - private TransferDetail data; - private Integer code; + private TransferDetailDTO data; + private Boolean status; + private String msg; + private String code; + private Long serverTime; @Data - public static class TransferDetail implements Serializable { + public static class TransferDetailDTO implements Serializable { private static final long serialVersionUID = 1L; - private Integer id; - private Integer userId; - private String merchantUserId; - private String businessId; - // IN 转入 - // OUT 转出 - private String transferType; - private BigDecimal beforeTransferAmount; - private BigDecimal afterTransferAmount; - private Integer status; // 状态 , see enum: transfer_status_enum, 1 Successful 0 Failure - private Long createTime; // 记录创建时间 - private Integer currencyId;// 币种id , see enum: currency + private String transferId; // 交易id + private String merchantCode; // 商户代码 + private Long userId; // 用户id + private Integer transferType; // 交易类型 1:加款,2:扣款 + private BigDecimal amount; // 交易金额 + private BigDecimal beforeTransfer; // 转账前余额 + private Integer afterTransfer; // 转账后余额 + private Integer status; // 转账成功与否(0:失败,1:成功) + private String mag; // 转账模式 1:免转,2:转账 + private Integer transferMode; // 转账涉及订单(transferMode为2时,该字段为空) + private Long createTime; // 交易时间 } diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferInRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferInRequest.java deleted file mode 100644 index 31f13a4..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/TransferInRequest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.ff.sports.db.dto; - -import com.alibaba.fastjson2.JSON; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * @author cengy - */ -@Data -public class TransferInRequest implements Serializable { - - /** - * 转账金额,不能为null - * 必须大於或等於0 - */ - private BigDecimal amount; - - /** - * 业务id,不能为null - */ - private String businessId; - - /** - * 渠道用户ID,不能为null - */ - private String merchantUserId; - - /** - * 币种id,可不传入 - */ - private Integer currencyId; - - public String toJSON() { - Map map = new LinkedHashMap<>(); - map.put("amount", amount); - map.put("businessId", businessId); - map.put("currencyId", currencyId); - map.put("merchantUserId", merchantUserId); - return JSON.toJSONString(map); - } -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferInResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferInResponse.java deleted file mode 100644 index 3de12e9..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/TransferInResponse.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.ff.sports.db.dto; - -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * @author cengy - */ -@Data -public class TransferInResponse implements Serializable { - - private static final long serialVersionUID = 1L; - - private Boolean success; - private BigDecimal data; - private Integer code; - private String message; -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutRequest.java deleted file mode 100644 index bd26537..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutRequest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.ff.sports.db.dto; - -import com.alibaba.fastjson2.JSON; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * @author cengy - */ -@Data -public class TransferOutRequest implements Serializable { - - /** - * 转账金额,不能为null - * 必须大於或等於0 - */ - private BigDecimal amount; - - /** - * 业务id,不能为null - */ - private String businessId; - - /** - * 渠道用户ID,不能为null - */ - private String merchantUserId; - - /** - * 币种id,可不传入 - */ - private Integer currencyId; - - public String toJSON() { - Map map = new LinkedHashMap<>(); - map.put("amount", amount); - map.put("businessId", businessId); - map.put("currencyId", currencyId); - map.put("merchantUserId", merchantUserId); - return JSON.toJSONString(map); - } -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutResponse.java deleted file mode 100644 index da1590c..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutResponse.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.ff.sports.db.dto; - -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * @author cengy - */ -@Data -public class TransferOutResponse implements Serializable { - - private static final long serialVersionUID = 1L; - - private Boolean success; - private BigDecimal data; - private Integer code; - private String message; -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferRequest.java new file mode 100644 index 0000000..9b500d3 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/TransferRequest.java @@ -0,0 +1,28 @@ +package com.ff.sports.db.dto; + +import com.ff.base.utils.sign.Md5Utils; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cengy + */ +@Data +public class TransferRequest implements Serializable { + + private String userName; + private String merchantCode; + private int transferType; // 1:加款 2:扣款 + + private String amount; // 金额,小数2位 + private String transferId; // 交易的讯息号,唯一标示,不可重复,19位长度的字符串 + private String timestamp = String.valueOf(System.currentTimeMillis()); + private String signature; + + public void buildSignature(String key) { + String signature = Md5Utils.md5New(Md5Utils.md5New(merchantCode + "&" + userName + "&" + transferType + "&" + amount + "&" + transferId + "&" + timestamp) + "&" + key); + this.signature = signature; + } + +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferResponse.java new file mode 100644 index 0000000..1ada1ab --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/TransferResponse.java @@ -0,0 +1,25 @@ +package com.ff.sports.db.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cengy + */ +@Data +public class TransferResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + private Boolean status; + private String msg; + private String code; + private Long serverTime; + private TransferDTO data; + + @Data + public static class TransferDTO { + private String userName; + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java b/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java index 6aa4fef..2b74435 100644 --- a/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java +++ b/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java @@ -21,7 +21,6 @@ import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; import com.ff.sports.db.client.DBSportsClient; import com.ff.sports.db.dto.*; -import com.ff.utils.TimestampFromString; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -39,9 +38,9 @@ import java.util.stream.Collectors; /** - * FB体育 + * DB体育 * - * @author shi + * @author cengy * @date 2024/10/21 */ @Service("DBSportsService") @@ -73,8 +72,8 @@ public class DBSportsServiceImpl implements IGamesService { * @param errorCode 错误代码 * @return {@link Boolean } */ - private Boolean isSuccess(Integer errorCode) { - return 0 == errorCode; + private Boolean isSuccess(String errorCode) { + return "0000".equals(errorCode); } String getSign(String bodyJsonString, String merchantId, String merchantApiSecret, long requestTimestamp) { @@ -97,16 +96,16 @@ public class DBSportsServiceImpl implements IGamesService { request.setUserName(requestDTO.getAccount()); request.setMerchantCode(requestDTO.getAgentId()); request.setCurrency(requestDTO.getCurrency()); - request.calcSign(requestDTO.getAgentKey()); + request.buildSignature(requestDTO.getAgentKey()); - String lang = "zh"; + //String lang = requestDTO.getLan String requestId = IdUtils.fastUUID(); - CreateUserResponse response = dbSportsClient.createMember(request, requestId, lang); + CreateUserResponse response = dbSportsClient.createMember(request, requestId); if (isSuccess(response.getCode())) { return Boolean.TRUE; } - log.error("创建会员失败, errorCode:{}, errorMessage:{}", response.getCode(), response.getMessage()); + log.error("创建会员失败, errorCode:{}, errorMessage:{}", response.getCode(), response.getMsg()); throw new ApiException(ErrorCode.Create_Member_Failure.getCode()); } @@ -114,7 +113,7 @@ public class DBSportsServiceImpl implements IGamesService { /** * 按代理id进行交换转账 * - * @param requestDTO 外汇转账moeny dto + * @param requestDTO 外汇转账 * @return {@link Long } */ @Override @@ -148,32 +147,38 @@ public class DBSportsServiceImpl implements IGamesService { exchangeMoney.setTransactionId(transactionId); // 转入 if (requestDTO.getTransferType().equals(TransferType.GAMES.getCode())) { - TransferInRequest request = new TransferInRequest(); - request.setMerchantUserId(requestDTO.getAccount()); - request.setAmount(requestDTO.getAmount()); - request.setBusinessId(requestDTO.getOrderId()); - request.setCurrencyId(Integer.parseInt(requestDTO.getCurrency())); - long timestamp = System.currentTimeMillis(); - String jsonBody = request.toJSON(); - String sign = getSign(jsonBody, - requestDTO.getAgentId(), - requestDTO.getAgentKey(), - timestamp + TransferRequest request = new TransferRequest(); + request.setUserName(requestDTO.getAccount()); + request.setTransferType(1); + request.setTransferId(requestDTO.getOrderId()); + request.setMerchantCode(requestDTO.getAgentId()); + request.setAmount(requestDTO.getAmount().toString()); + request.buildSignature(requestDTO.getAgentKey()); + + TransferResponse response = dbSportsClient.transferIn( + request, IdUtils.fastUUID() ); - - TransferInResponse response = dbSportsClient.transferIn( - request, - sign, - timestamp, - requestDTO.getAgentId()); if (isSuccess(response.getCode())) { - - exchangeMoney.setBalance(response.getData()); - BigDecimal transAmount = requestDTO.getAmount(); - exchangeMoney.setCoinBefore(response.getData().subtract(transAmount)); - exchangeMoney.setCoinAfter(response.getData()); - exchangeMoney.setCurrencyBefore(response.getData().subtract(transAmount)); - exchangeMoney.setCurrencyAfter(response.getData()); + GetMemberInfoRequest queryMemberRequest = new GetMemberInfoRequest(); + queryMemberRequest.setUserName(requestDTO.getAccount()); + queryMemberRequest.setMerchantCode(requestDTO.getAgentId()); + queryMemberRequest.buildSignature(requestDTO.getAgentKey()); + String requestId = IdUtils.fastUUID(); + try { + GetMemberInfoResponse queryMemberResponse = dbSportsClient.getMemberInfo(queryMemberRequest, requestId); + if (this.isSuccess(queryMemberResponse.getCode())) { + BigDecimal transAmount = requestDTO.getAmount(); + BigDecimal afterAmount = queryMemberResponse.getData().getBalance(); + BigDecimal beforeAmount = afterAmount.subtract(transAmount); + exchangeMoney.setBalance(transAmount); + exchangeMoney.setCoinBefore(beforeAmount); + exchangeMoney.setCoinAfter(afterAmount); + exchangeMoney.setCurrencyBefore(beforeAmount); + exchangeMoney.setCurrencyAfter(afterAmount); + } + } catch (Exception e) { + log.error("查询会员失败, errorCode:{}, errorMessage:{}", response.getCode(), response.getMsg(), e); + } exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); // SUCCESS gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); } else { @@ -187,39 +192,35 @@ public class DBSportsServiceImpl implements IGamesService { .agentKey(requestDTO.getAgentKey()) .build(); BigDecimal balance = this.getMemberInfo(memberInfoRequestDTO).getBalance(); + if (balance.compareTo(BigDecimal.ZERO) <= 0) { + throw new ApiException(ErrorCode.INSUFFICIENT_PLAYER_BALANCE.getCode()); + } - TransferOutRequest request = new TransferOutRequest(); - request.setMerchantUserId(requestDTO.getAccount()); - request.setAmount(/*requestDTO.getAmount()*/ balance); - request.setBusinessId(requestDTO.getOrderId()); - request.setCurrencyId(Integer.parseInt(requestDTO.getCurrency())); + TransferRequest request = new TransferRequest(); + request.setUserName(requestDTO.getAccount()); + request.setTransferType(2); // 转出 + request.setTransferId(requestDTO.getOrderId()); + request.setMerchantCode(requestDTO.getAgentId()); + request.setAmount(/*requestDTO.getAmount().toString()*/ balance.toString()); + request.buildSignature(requestDTO.getAgentKey()); - long timestamp = System.currentTimeMillis(); - String jsonBody = request.toJSON(); - String sign = getSign(jsonBody, - requestDTO.getAgentId(), - requestDTO.getAgentKey(), - timestamp - ); - - TransferOutResponse response = dbSportsClient + TransferResponse response = dbSportsClient .transferOut( - request, - sign, - timestamp, - requestDTO.getAgentId() + request, IdUtils.fastUUID() ); - //判断是否转移成功 if (this.isSuccess(response.getCode())) { - //更新数据 - exchangeMoney.setBalance(response.getData()); BigDecimal transAmount = balance; - exchangeMoney.setCoinBefore(response.getData().add(transAmount)); - exchangeMoney.setCoinAfter(response.getData()); - exchangeMoney.setCurrencyBefore(response.getData().add(transAmount)); - exchangeMoney.setCurrencyAfter(response.getData()); + BigDecimal beforeAmount = balance; + BigDecimal afterAmount = BigDecimal.ZERO; + + //更新数据 + exchangeMoney.setBalance(transAmount); + exchangeMoney.setCoinBefore(beforeAmount); + exchangeMoney.setCoinAfter(afterAmount); + exchangeMoney.setCurrencyBefore(beforeAmount); + exchangeMoney.setCurrencyAfter(afterAmount); exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); // SUCCESS gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); } else { @@ -238,35 +239,20 @@ public class DBSportsServiceImpl implements IGamesService { @Override public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO requestDTO) { GetMemberInfoRequest request = new GetMemberInfoRequest(); - request.setMerchantUserId(requestDTO.getAccounts()); - long timestamp = System.currentTimeMillis(); - String jsonBody = request.toJSON(); - String sign = getSign(jsonBody, - requestDTO.getAgentId(), - requestDTO.getAgentKey(), - timestamp - ); - GetMemberInfoResponse response = dbSportsClient.getMemberInfo( - request, - sign, - timestamp, - requestDTO.getAgentId() - ); + request.setUserName(requestDTO.getAccounts()); + request.setMerchantCode(requestDTO.getAgentId()); + request.buildSignature(requestDTO.getAgentKey()); + String requestId = IdUtils.fastUUID(); + GetMemberInfoResponse response = dbSportsClient.getMemberInfo(request, requestId); //判断是否获取成功 if (this.isSuccess(response.getCode())) { - BigDecimal balance = new BigDecimal("0.00"); - - for (GetMemberInfoResponse.Wallet wallet : response.getData().getWallets()) { - balance = balance.add(wallet.getBalance()); - } return MemberInfoResponseDTO.builder() .status(GameMemberStatus.UNKNOWN.getCode()) - .balance(balance) + .balance(response.getData().getBalance()) .account(requestDTO.getAccounts()) .build(); - } else { - throw new ApiException(ErrorCode.Get_Member_Info_Failure.getCode()); } + throw new ApiException(ErrorCode.Get_Member_Info_Failure.getCode()); } /** @@ -277,84 +263,36 @@ public class DBSportsServiceImpl implements IGamesService { */ @Override public String loginWithoutRedirect(GamesLogin requestDTO) { - GetTokenRequest request = new GetTokenRequest(); - request.setMerchantUserId(requestDTO.getAccount()); - request.setPlatForm(/*requestDTO.getPlatform()*/ "mobile"); // pc,h5, mobile , see enum: plat_form_enum - long timestamp = System.currentTimeMillis(); - String jsonBody = request.toJSON(); - String sign = getSign(jsonBody, - requestDTO.getAgentId(), - requestDTO.getAgentKey(), - timestamp - ); - - GetTokenResponse response = dbSportsClient.getToken( - request, - sign, - timestamp, - requestDTO.getAgentId() - ); - - if (this.isSuccess(response.getCode())) { - String token = response.getData().getToken(); - Integer userId = response.getData().getUserId(); - GetTokenResponse.ServerInfo serverInfo = response.getData().getServerInfo(); - String h5Address = serverInfo.getH5Address(); - if (StringUtils.isEmpty(h5Address)) { - throw new ApiException(ErrorCode.Get_Url_Failure.getCode()); - } - - return h5Address + - "/index.html#/" + - "?token=" + - token + - "&nickname=" + - userId + - "&apiSrc=" + - serverInfo.getApiServerAddress() + - "&pushSrc=" + - serverInfo.getPushServerAddress() + - "&virtualSrc=" + - serverInfo.getVirtualAddress() + - "&platformName=XK体育"; + LoginRequest request = new LoginRequest(); + request.setUserName(requestDTO.getAccount()); + request.setMerchantCode(requestDTO.getAgentId()); + if (requestDTO.getPlatform().equalsIgnoreCase("web")) { + request.setTerminal("pc"); + } else { + request.setTerminal("mobile"); } + request.setLanguage(requestDTO.getLang()); + request.setCurrency(requestDTO.getCurrency()); + request.buildSignature(requestDTO.getAgentKey()); - /*GetUrlRequest request = new GetUrlRequest(); - long timestamp = System.currentTimeMillis(); - String jsonBody = request.toJSON(); - String sign = getSign(jsonBody, - requestDTO.getAgentId(), - requestDTO.getAgentKey(), - timestamp + LoginResponse response = dbSportsClient.login( + request, IdUtils.fastUUID() ); - GetUrlResponse response = fbSportsClient.getUrl( - request, - sign, - timestamp, - requestDTO.getAgentId() - ); - //判断是否获取成功 + if (this.isSuccess(response.getCode())) { - List urlDTOS = new ArrayList<>(); - for (GetUrlResponse.UrlDTO urlDTO : response.getData()) { - if (urlDTO.getType() == 3) { // 3:h5 - urlDTOS.add(urlDTO); - } - } - if (urlDTOS.isEmpty()){ + LoginResponse.LoginRespDTO respDTO = response.getData(); + + String loginURL = respDTO.getLoginUrl(); + if (StringUtils.isEmpty(loginURL)) { throw new ApiException(ErrorCode.Get_Url_Failure.getCode()); } - int randomIndex = new Random().nextInt(urlDTOS.size()); - GetUrlResponse.UrlDTO urlDTO = urlDTOS.get(randomIndex); - Collections.shuffle(urlDTO.getDomainList()); - return urlDTO.getDomainList().get(0).getDomain(); - }*/ + + return loginURL; + } throw new ApiException(ErrorCode.Get_Url_Failure.getCode()); } - private static final Long GAME_ID = 11111L; - /** * 获取游戏列表 * @@ -418,23 +356,13 @@ public class DBSportsServiceImpl implements IGamesService { if (!Objects.equals(gameExchangeMoney.getStatus(), StatusType.SUCCESS.getValue())) { TransferDetailRequest request = new TransferDetailRequest(); - request.setMerchantUserId(requestDTO.getAccount()); - request.setTransferType(Objects.equals(gameExchangeMoney.getExchangeType(), TransferType.GAMES.getCode()) - ? "IN" : "OUT"); - long timestamp = System.currentTimeMillis(); - String jsonBody = request.toJSON(); - String sign = getSign(jsonBody, - requestDTO.getAgentId(), - requestDTO.getAgentKey(), - timestamp - ); + request.setMerchantCode(requestDTO.getAgentId()); + request.setTransferId(gameExchangeMoney.getOrderId()); + request.buildSignature(requestDTO.getAgentKey()); TransferDetailResponse response = dbSportsClient.transferDetail( - request, - sign, - timestamp, - requestDTO.getAgentId() + request, IdUtils.fastUUID() ); - if (this.isSuccess(response.getCode())) { + if (this.isSuccess(response.getCode()) && response.getData().getStatus() == 1) { status = StatusType.SUCCESS.getValue(); } else { status = StatusType.FAILURE.getValue(); @@ -458,75 +386,34 @@ public class DBSportsServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByTime(BetRecordByTimeDTO requestDTO) { - Long lend = requestDTO.getEndTime(); - Long lstart = requestDTO.getStartTime(); - //betRecordByTimeDTO.setStartTime(lstart); - //betRecordByTimeDTO.setEndTime(lend); - OrderFilesRequest request = new OrderFilesRequest(); - request.setStartTime(lstart); - request.setEndTime(lend); - long timestamp = System.currentTimeMillis(); - String jsonBody = request.toJSON(); - String sign = getSign(jsonBody, - requestDTO.getAgentId(), - requestDTO.getAgentKey(), - timestamp - ); - OrderFilesResponse orderFilesResponse = dbSportsClient.orderFiles( - request, - sign, - timestamp, - requestDTO.getAgentId() - ); - if (this.isSuccess(orderFilesResponse.getCode())) { - for (OrderFilesResponse.FileId fileId : orderFilesResponse.getData()) { - try { - getOrderData(fileId.getFileId(), requestDTO); - } catch (Exception e) { - log.error("获取订单数据失败,fileId:{},agentId:{}", fileId, requestDTO.getAgentId()); - } - } - return true; - } - log.error("获取订单文件失败,agentId:{}", requestDTO.getAgentId()); - return false; + this.getRealtimeRecord(requestDTO, 1); + + return Boolean.TRUE; } - void getOrderData(Long fileId, BetRecordByTimeDTO requestDTO) { - OrderInfoRequest request = new OrderInfoRequest(); - request.setFileId(fileId); - long timestamp = System.currentTimeMillis(); - String jsonBody = request.toJSON(); - String sign = getSign(jsonBody, - requestDTO.getAgentId(), - requestDTO.getAgentKey(), - timestamp + void getRealtimeRecord(BetRecordByTimeDTO requestDTO, int pageNum) { + + GetBetListRequest request = new GetBetListRequest(); + request.setStartTime(String.valueOf(requestDTO.getStartTime())); + request.setEndTime(String.valueOf(requestDTO.getEndTime())); + request.setMerchantCode(requestDTO.getAgentId()); + request.setPageNum(pageNum); + request.setPageSize(1000); + request.buildSignature(requestDTO.getAgentKey()); + + GetBetListResponse response = dbSportsClient.getBetList( + request, IdUtils.fastUUID() ); - OrderInfoResponse orderInfoResponse = dbSportsClient.getOrderJsonData( - request, - sign, - timestamp, - requestDTO.getAgentId() - ); - if (!this.isSuccess(orderInfoResponse.getCode())) { - return; - } - List settledOrderList = new ArrayList<>(); - for (OrderInfoResponse.OrderDTO orderDTO : orderInfoResponse.getData()) { -// 0 Created 未确认 -// 1 Confirming 确认中 -// 2 Rejected 已拒单 -// 3 Canceled 已取消 -// 4 Confirmed 已接单 -// 5 Settled 已结算 - if (!orderDTO.getOrderStatus().equals(5)) { // 已结算 - continue; + if (this.isSuccess(response.getCode())) { + List list = response.getList(); + if (CollectionUtils.isEmpty(list)) { + return; } - settledOrderList.add(orderDTO); + this.batchInsert(list, requestDTO); + getRealtimeRecord(requestDTO, ++pageNum); } - this.batchInsert(settledOrderList, requestDTO); } /** @@ -537,39 +424,8 @@ public class DBSportsServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO requestDTO) { - Long lend = requestDTO.getEndTime(); - Long lstart = requestDTO.getStartTime(); - //betRecordByTimeDTO.setStartTime(lstart); - //betRecordByTimeDTO.setEndTime(lend); - OrderFilesRequest request = new OrderFilesRequest(); - request.setStartTime(lstart); - request.setEndTime(lend); - long timestamp = System.currentTimeMillis(); - String jsonBody = request.toJSON(); - String sign = getSign(jsonBody, - requestDTO.getAgentId(), - requestDTO.getAgentKey(), - timestamp - ); - OrderFilesResponse orderFilesResponse = dbSportsClient.orderFiles( - request, - sign, - timestamp, - requestDTO.getAgentId() - ); - if (this.isSuccess(orderFilesResponse.getCode())) { - for (OrderFilesResponse.FileId fileId : orderFilesResponse.getData()) { - try { - getOrderData(fileId.getFileId(), requestDTO); - } catch (Exception e) { - log.error("获取订单数据失败,fileId:{},agentId:{}", fileId, requestDTO.getAgentId()); - } - } - return true; - } - log.error("获取订单文件失败,agentId:{}", requestDTO.getAgentId()); - return false; + return Boolean.TRUE; } @@ -604,6 +460,14 @@ public class DBSportsServiceImpl implements IGamesService { @Override public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) { + KickUserRequest request = new KickUserRequest(); + request.setUserName(kickMemberRequestDTO.getAccount()); + request.setMerchantCode(kickMemberRequestDTO.getAgentId()); + request.buildSignature(kickMemberRequestDTO.getAgentKey()); + KickUserResponse kickUserResponse = dbSportsClient.kickUser(request, IdUtils.fastUUID()); + if (this.isSuccess(kickUserResponse.getCode())) { + return Boolean.TRUE; + } return Boolean.FALSE; } @@ -656,17 +520,20 @@ public class DBSportsServiceImpl implements IGamesService { * * @param settledOrderList 投注记录 */ - private void batchInsert(List settledOrderList, BetRecordByTimeDTO betRecordByTimeDTO) { + private void batchInsert(List settledOrderList, BetRecordByTimeDTO betRecordByTimeDTO) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 - List dataList = settledOrderList; + List dataList = settledOrderList; if (CollectionUtils.isEmpty(dataList)) { return; } //数据转化 - for (OrderInfoResponse.OrderDTO dataBean : dataList) { + for (GetBetListResponse.OrderItemDTO dataBean : dataList) { + if (dataBean.getOrderStatus() != 1) { // 只关心结算的 + continue; + } GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder() .platform(betRecordByTimeDTO.getVendor()) .data(dataBean).build()); @@ -674,7 +541,7 @@ public class DBSportsServiceImpl implements IGamesService { bettingDetails.setId(IdUtil.getSnowflakeNextId()); gameBettingDetails.add(bettingDetails); } - wagersIds.add(dataBean.getId()); + wagersIds.add(dataBean.getOrderNo()); } if (CollectionUtils.isEmpty(gameBettingDetails)) { return; @@ -701,21 +568,21 @@ public class DBSportsServiceImpl implements IGamesService { public GameBettingDetails dataBuild(GamesDataBuildDTO gamesDataBuildDTO) { //转化类 - OrderInfoResponse.OrderDTO dataBean = (OrderInfoResponse.OrderDTO) gamesDataBuildDTO.getData(); - Member member = memberService.selectMemberByGameAccount(dataBean.getMerchantUserId()); + GetBetListResponse.OrderItemDTO dataBean = (GetBetListResponse.OrderItemDTO) gamesDataBuildDTO.getData(); + Member member = memberService.selectMemberByGameAccount(dataBean.getUserName()); if (ObjectUtils.isEmpty(member)) { return null; } //List gameList = redisCache.getCacheList(CacheConstants.DB_Sports); //Game game = gameList.get(0); - BigDecimal originPayoffAmount = new BigDecimal(dataBean.getSettleAmount()); - BigDecimal betAmount = new BigDecimal(dataBean.getStakeAmount()); + BigDecimal originPayoffAmount = BigDecimal.valueOf(dataBean.getSettleAmount()); + BigDecimal betAmount = new BigDecimal(dataBean.getOrderAmount()); int compareResult = originPayoffAmount.compareTo(betAmount); - long payoffTime = TimestampFromString.to(dataBean.getSettleTime()); - long createTime = TimestampFromString.to(dataBean.getCreateTime()); + long payoffTime = dataBean.getSettleTime(); + long createTime = dataBean.getCreateTime(); Platform platform = gamesDataBuildDTO.getPlatform(); - String systemCurrency = platform.getOurCurrency(dataBean.getCurrency().toString()); + String systemCurrency = platform.getOurCurrency(dataBean.getCurrency()); //数据构造 GameBettingDetails gameBettingDetails = GameBettingDetails.builder() .tenantKey(member.getTenantKey()) @@ -729,16 +596,16 @@ public class DBSportsServiceImpl implements IGamesService { .gameName(GamePlatforms.DBSports.getInfo()) .gameStatus(compareResult > 0 ? GameStatus.WIN.getCode() : compareResult < 0 ? GameStatus.FAIL.getCode() : GameStatus.FLAT.getCode()) .gameStatusType(1) // 一般下注 - .gameCurrencyCode(dataBean.getCurrency().toString()) - .account(dataBean.getMerchantUserId()) - .wagersId(dataBean.getId()) + .gameCurrencyCode(dataBean.getCurrency()) + .account(dataBean.getUserName()) + .wagersId(dataBean.getOrderNo()) .wagersTime(createTime) .betAmount(betAmount) .payoffTime(payoffTime) .payoffAmount(originPayoffAmount.abs()) .settlementTime(payoffTime) .turnover(betAmount) - .orderNo(dataBean.getId()) + .orderNo(dataBean.getOrderNo()) .settlementStatus(SettlementStatusEnum.COMPLETED.getCode()) .build(); gameBettingDetails.setCreateBy(Constants.SYSTEM); diff --git a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java index 3f5f6d9..15232d8 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java +++ b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java @@ -176,9 +176,9 @@ public class FBSportsServiceImpl implements IGamesService { timestamp, requestDTO.getAgentId()); if (isSuccess(response.getCode())) { - - exchangeMoney.setBalance(response.getData()); BigDecimal transAmount = requestDTO.getAmount(); + + exchangeMoney.setBalance(transAmount); exchangeMoney.setCoinBefore(response.getData().subtract(transAmount)); exchangeMoney.setCoinAfter(response.getData()); exchangeMoney.setCurrencyBefore(response.getData().subtract(transAmount)); @@ -222,9 +222,9 @@ public class FBSportsServiceImpl implements IGamesService { //判断是否转移成功 if (this.isSuccess(response.getCode())) { - //更新数据 - exchangeMoney.setBalance(response.getData()); BigDecimal transAmount = balance; + //更新数据 + exchangeMoney.setBalance(transAmount); exchangeMoney.setCoinBefore(response.getData().add(transAmount)); exchangeMoney.setCoinAfter(response.getData()); exchangeMoney.setCurrencyBefore(response.getData().add(transAmount)); From 537b23a420dcc642b9b5bbf641935b88e7b819a1 Mon Sep 17 00:00:00 2001 From: shi Date: Fri, 11 Apr 2025 11:03:24 +0800 Subject: [PATCH 49/62] =?UTF-8?q?refactor(ff-game):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=20FB=20=E5=92=8C=20SV388=20=E5=B9=B3=E5=8F=B0=E7=9A=84?= =?UTF-8?q?=E8=BD=AC=E8=B4=A6=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 FBSports 和 SV388 平台的重复代码 - 优化交易 ID 生成逻辑,支持不同平台的格式 -调整 CreateOrderServiceImpl 中的平台判断逻辑 - 重构 FBSportsServiceImpl 和 SV388GamesServiceImpl 中的转账方法 --- .../exchange/impl/CreateOrderServiceImpl.java | 4 +++ .../api/sv388/impl/SV388GamesServiceImpl.java | 32 ++----------------- .../sports/fb/impl/FBSportsServiceImpl.java | 28 ++-------------- 3 files changed, 10 insertions(+), 54 deletions(-) diff --git a/ff-game/src/main/java/com/ff/game/api/exchange/impl/CreateOrderServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/exchange/impl/CreateOrderServiceImpl.java index 15701b0..4f31570 100644 --- a/ff-game/src/main/java/com/ff/game/api/exchange/impl/CreateOrderServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/exchange/impl/CreateOrderServiceImpl.java @@ -103,6 +103,10 @@ public class CreateOrderServiceImpl extends AbstractStepProcessor { return GamePlatforms.KM.getInfo() + IdUtils.simpleUUID(); case PGT: return gameExchangeMoneyService.getTransactionId(GamePlatforms.PGT.getInfo(), 17); + case FBSports: + return GamePlatforms.FBSports.getCode() + IdUtils.simpleUUID(); + case SV388: + return GamePlatforms.SV388.getCode() + IdUtils.simpleUUID(); } throw new ApiException(ErrorCode.PLATFORM_NOT_EXIST.getCode()); } diff --git a/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java index b2ca059..4c17c2e 100644 --- a/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java @@ -229,34 +229,8 @@ public class SV388GamesServiceImpl implements IGamesService { @Transactional public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { - Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); - String transactionId = GamePlatforms.SV388.getCode() + IdUtils.simpleUUID(); - List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( - GameExchangeMoney.builder() - .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) - .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) - .build() - ); - Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); + GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId()); - //获取下一个自增id - GameExchangeMoney exchangeMoney = GameExchangeMoney - .builder() - .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) - .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) - .quota(exchangeTransferMoneyRequestDTO.getQuota()) - .balance(exchangeTransferMoneyRequestDTO.getAmount()) - .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) - .currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency()) - .memberId(member.getId()) - .transactionId(transactionId) - .platformCode(GamePlatforms.SV388.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); Map params = this.getKey(exchangeTransferMoneyRequestDTO); @@ -265,13 +239,13 @@ public class SV388GamesServiceImpl implements IGamesService { if (TransferType.GAMES.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) { params.put("userId", exchangeTransferMoneyRequestDTO.getAccount()); - params.put("txCode", transactionId); + params.put("txCode", exchangeTransferMoneyRequestDTO.getTransactionId()); params.put("transferAmount", exchangeTransferMoneyRequestDTO.getAmount()); deposit = sv388Client.deposit(params); } else { params.put("userId", exchangeTransferMoneyRequestDTO.getAccount()); - params.put("txCode", transactionId); + params.put("txCode", exchangeTransferMoneyRequestDTO.getTransactionId()); params.put("withdrawType", 1); deposit = sv388Client.withdraw(params); } diff --git a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java index 3f5f6d9..e5d1d0c 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java +++ b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java @@ -130,31 +130,9 @@ public class FBSportsServiceImpl implements IGamesService { @Transactional public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO requestDTO) { - Member member = memberService.selectMemberByGameAccount(requestDTO.getAccount()); - String transactionId = GamePlatforms.FBSports.getCode() + IdUtils.simpleUUID(); - List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( - GameExchangeMoney.builder() - .tenantKey(requestDTO.getTenantKey()) - .orderId(requestDTO.getOrderId()) - .build() - ); - Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); -//获取下一个自增id - GameExchangeMoney exchangeMoney = GameExchangeMoney - .builder() - .orderId(requestDTO.getOrderId()) - .tenantKey(requestDTO.getTenantKey()) - .quota(requestDTO.getQuota()) - .balance(requestDTO.getAmount()) - .exchangeType(requestDTO.getTransferType()) - .currencyCode(requestDTO.getSystemCurrency()) - .memberId(member.getId()) - .transactionId(transactionId) - .platformCode(GamePlatforms.FBSports.getCode()) - .build(); - exchangeMoney.setCreateBy(Constants.SYSTEM); - //接口限制限制50字符 - exchangeMoney.setTransactionId(transactionId); + + GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(requestDTO.getGameExchangeId()); + // 转入 if (requestDTO.getTransferType().equals(TransferType.GAMES.getCode())) { TransferInRequest request = new TransferInRequest(); From 10c9601bbecf8c138446fa2bfb33442479af41ab Mon Sep 17 00:00:00 2001 From: cengy Date: Fri, 11 Apr 2025 11:23:33 +0800 Subject: [PATCH 50/62] =?UTF-8?q?refactor(ff-game):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=B3=A8=E5=8D=95=E6=8B=89=E5=8F=96=E6=8E=A5=E5=8F=A3=E5=92=8C?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86-=20=E5=9C=A8=20DBSportsCli?= =?UTF-8?q?ent=20=E4=B8=AD=E4=B8=BA=20getBetList=20=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20Content-type=20=E5=A4=B4=20-=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20DBSportsServiceImpl=20=E4=B8=AD=E7=9A=84=20getRealt?= =?UTF-8?q?imeRecord=20=E6=96=B9=E6=B3=95=EF=BC=8C=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E5=9B=BA=E5=AE=9A=E7=9A=84=E6=97=B6=E9=97=B4=E6=88=B3=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E6=B5=8B=E8=AF=95=20-=20=E6=9B=B4=E6=96=B0=20GetBetLi?= =?UTF-8?q?stRequest=20=E4=B8=AD=E7=9A=84=20timestamp=20=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=80=BC=E4=B8=BA=E5=BD=93=E5=89=8D=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=88=B3=20-=20=E9=87=8D=E6=9E=84=20GetBetListRespons?= =?UTF-8?q?e=20=E7=BB=93=E6=9E=84=EF=BC=8C=E5=B0=86=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=B0=81=E8=A3=85=E5=88=B0=20DataDTO=20?= =?UTF-8?q?=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ff/sports/db/client/DBSportsClient.java | 6 +++++- .../ff/sports/db/dto/GetBetListRequest.java | 2 +- .../ff/sports/db/dto/GetBetListResponse.java | 21 ++++++++++++------- .../sports/db/impl/DBSportsServiceImpl.java | 6 +++--- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java b/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java index c144449..bbcc535 100644 --- a/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java +++ b/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java @@ -99,7 +99,11 @@ public interface DBSportsClient { /** * 拉取订单Json数据 */ - @Post(url = "/api/bet/queryBetListV2") + @Post(url = "/api/bet/queryBetListV2", + headers = { + "Content-type: application/x-www-form-urlencoded" + } + ) GetBetListResponse getBetList(@Body GetBetListRequest request, @Header("requestId") String requestId); diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListRequest.java index 13f95cd..c0736f2 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListRequest.java +++ b/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListRequest.java @@ -67,7 +67,7 @@ public class GetBetListRequest implements Serializable { /** * 请求时间戳(13位,必填) */ - private String timestamp; + private String timestamp = String.valueOf(System.currentTimeMillis()); /** * 排序方式(可选) diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListResponse.java index aace488..a05a0d3 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListResponse.java +++ b/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListResponse.java @@ -18,16 +18,21 @@ public class GetBetListResponse implements Serializable { private String msg; private String code; private Long serverTime; + private DataDTO data; + + @Data + public static class DataDTO { - // 当前页码 - private Integer pageNum; - // 每页条数 - private Integer pageSize; - // 总条数 - private Integer totalCount; - // 注单列表 - private List list; + // 当前页码 + private Integer pageNum; + // 每页条数 + private Integer pageSize; + // 总条数 + private Integer totalCount; + // 注单列表 + private List list; + } @Data public static class OrderItemDTO { diff --git a/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java b/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java index 2b74435..2e183d5 100644 --- a/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java +++ b/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java @@ -395,8 +395,8 @@ public class DBSportsServiceImpl implements IGamesService { void getRealtimeRecord(BetRecordByTimeDTO requestDTO, int pageNum) { GetBetListRequest request = new GetBetListRequest(); - request.setStartTime(String.valueOf(requestDTO.getStartTime())); - request.setEndTime(String.valueOf(requestDTO.getEndTime())); + request.setStartTime(/*String.valueOf(requestDTO.getStartTime())*/ "1744333220000"); + request.setEndTime(/*String.valueOf(requestDTO.getEndTime())*/ "1744335020000"); request.setMerchantCode(requestDTO.getAgentId()); request.setPageNum(pageNum); request.setPageSize(1000); @@ -407,7 +407,7 @@ public class DBSportsServiceImpl implements IGamesService { ); if (this.isSuccess(response.getCode())) { - List list = response.getList(); + List list = response.getData().getList(); if (CollectionUtils.isEmpty(list)) { return; } From 3236b4ab558f58958bea14979b6d4658c6cfc450 Mon Sep 17 00:00:00 2001 From: shi Date: Fri, 11 Apr 2025 15:20:45 +0800 Subject: [PATCH 51/62] =?UTF-8?q?refactor(game):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=B9=B3=E5=8F=B0=E4=BA=A4=E6=98=93ID?= =?UTF-8?q?=E7=94=9F=E6=88=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 CreateOrderServiceImpl 中的 getTransactionId 方法 - 在每个游戏平台的实现类中添加 getTransactionId 方法,具体实现如下: - GamesAEServiceImpl - GamesDGServiceImpl - GamesFCServiceImpl - GamesJILIServiceImpl - GamesKMServiceImpl - GamesPGServiceImpl - GamesPGTServiceImpl - GamesPGXServiceImpl - GamesSAServiceImpl - 更新 DBSportsServiceImpl 和 FBSportsServiceImpl 中的交易ID生成逻辑 - 重构后的交易ID生成逻辑更清晰,每个平台有自己的实现方式 --- .../java/com/ff/base/utils/DateUtils.java | 44 +++++++++++-- .../java/com/ff/game/api/IGamesService.java | 8 +++ .../game/api/ae/impl/GamesAEServiceImpl.java | 17 +++++ .../api}/db/address/DBSportsAddress.java | 2 +- .../api}/db/client/DBSportsClient.java | 6 +- .../api}/db/dto/CreateUserRequest.java | 2 +- .../api}/db/dto/CreateUserResponse.java | 2 +- .../{sports/fb => game/api/db}/dto/Enums.java | 2 +- .../api}/db/dto/GetBetListRequest.java | 2 +- .../api}/db/dto/GetBetListResponse.java | 2 +- .../api}/db/dto/GetMemberInfoRequest.java | 2 +- .../api}/db/dto/GetMemberInfoResponse.java | 2 +- .../api}/db/dto/KickUserRequest.java | 2 +- .../api}/db/dto/KickUserResponse.java | 2 +- .../api}/db/dto/LoginRequest.java | 2 +- .../api}/db/dto/LoginResponse.java | 2 +- .../api}/db/dto/TransferDetailRequest.java | 2 +- .../api}/db/dto/TransferDetailResponse.java | 2 +- .../api}/db/dto/TransferRequest.java | 2 +- .../api}/db/dto/TransferResponse.java | 2 +- .../api}/db/impl/DBSportsServiceImpl.java | 65 +++++++++---------- .../dg/service/impl/GamesDGServiceImpl.java | 18 +++++ .../exchange/impl/CreateOrderServiceImpl.java | 58 +++-------------- .../api}/fb/address/FBSportsAddress.java | 2 +- .../api}/fb/client/FBSportsClient.java | 6 +- .../api}/fb/dto/CreateUserRequest.java | 2 +- .../api}/fb/dto/CreateUserResponse.java | 2 +- .../{sports/db => game/api/fb}/dto/Enums.java | 2 +- .../api}/fb/dto/GetMemberInfoRequest.java | 2 +- .../api}/fb/dto/GetMemberInfoResponse.java | 2 +- .../api}/fb/dto/GetTokenRequest.java | 2 +- .../api}/fb/dto/GetTokenResponse.java | 2 +- .../api}/fb/dto/GetUrlRequest.java | 2 +- .../api}/fb/dto/GetUrlResponse.java | 2 +- .../api}/fb/dto/OrderFilesRequest.java | 2 +- .../api}/fb/dto/OrderFilesResponse.java | 2 +- .../api}/fb/dto/OrderInfoRequest.java | 2 +- .../api}/fb/dto/OrderInfoResponse.java | 2 +- .../api}/fb/dto/TransferDetailRequest.java | 2 +- .../api}/fb/dto/TransferDetailResponse.java | 2 +- .../api}/fb/dto/TransferInRequest.java | 2 +- .../api}/fb/dto/TransferInResponse.java | 2 +- .../api}/fb/dto/TransferOutRequest.java | 2 +- .../api}/fb/dto/TransferOutResponse.java | 2 +- .../api}/fb/impl/FBSportsServiceImpl.java | 44 +++++++++---- .../game/api/fc/impl/GamesFCServiceImpl.java | 18 +++++ .../service/impl/GamesJILIServiceImpl.java | 16 +++++ .../game/api/km/impl/GamesKMServiceImpl.java | 18 +++++ .../meitian/impl/MeiTianGameServiceImpl.java | 16 +++++ .../ng/service/impl/GamesPGServiceImpl.java | 43 +++++++++++- .../api/pgt/impl/GamesPGTServiceImpl.java | 16 ++++- .../api/pgx/dto/PGXBetHistoryResponse.java | 4 +- .../api/pgx/impl/GamesPGXServiceImpl.java | 26 +++++++- .../api/request/TransactionIdRequestDTO.java | 25 +++++++ .../game/api/sa/impl/GamesSAServiceImpl.java | 24 +++++++ .../api/sv388/impl/SV388GamesServiceImpl.java | 22 ++++++- .../xk/service/impl/GamesXKServiceImpl.java | 16 ++++- 57 files changed, 428 insertions(+), 154 deletions(-) rename ff-game/src/main/java/com/ff/{sports => game/api}/db/address/DBSportsAddress.java (95%) rename ff-game/src/main/java/com/ff/{sports => game/api}/db/client/DBSportsClient.java (96%) rename ff-game/src/main/java/com/ff/{sports => game/api}/db/dto/CreateUserRequest.java (96%) rename ff-game/src/main/java/com/ff/{sports => game/api}/db/dto/CreateUserResponse.java (92%) rename ff-game/src/main/java/com/ff/{sports/fb => game/api/db}/dto/Enums.java (61%) rename ff-game/src/main/java/com/ff/{sports => game/api}/db/dto/GetBetListRequest.java (98%) rename ff-game/src/main/java/com/ff/{sports => game/api}/db/dto/GetBetListResponse.java (99%) rename ff-game/src/main/java/com/ff/{sports => game/api}/db/dto/GetMemberInfoRequest.java (95%) rename ff-game/src/main/java/com/ff/{sports => game/api}/db/dto/GetMemberInfoResponse.java (94%) rename ff-game/src/main/java/com/ff/{sports => game/api}/db/dto/KickUserRequest.java (94%) rename ff-game/src/main/java/com/ff/{sports => game/api}/db/dto/KickUserResponse.java (90%) rename ff-game/src/main/java/com/ff/{sports => game/api}/db/dto/LoginRequest.java (98%) rename ff-game/src/main/java/com/ff/{sports => game/api}/db/dto/LoginResponse.java (96%) rename ff-game/src/main/java/com/ff/{sports => game/api}/db/dto/TransferDetailRequest.java (95%) rename ff-game/src/main/java/com/ff/{sports => game/api}/db/dto/TransferDetailResponse.java (97%) rename ff-game/src/main/java/com/ff/{sports => game/api}/db/dto/TransferRequest.java (96%) rename ff-game/src/main/java/com/ff/{sports => game/api}/db/dto/TransferResponse.java (92%) rename ff-game/src/main/java/com/ff/{sports => game/api}/db/impl/DBSportsServiceImpl.java (91%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/address/FBSportsAddress.java (95%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/client/FBSportsClient.java (97%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/CreateUserRequest.java (96%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/CreateUserResponse.java (90%) rename ff-game/src/main/java/com/ff/{sports/db => game/api/fb}/dto/Enums.java (61%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/GetMemberInfoRequest.java (94%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/GetMemberInfoResponse.java (97%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/GetTokenRequest.java (95%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/GetTokenResponse.java (98%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/GetUrlRequest.java (88%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/GetUrlResponse.java (96%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/OrderFilesRequest.java (96%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/OrderFilesResponse.java (93%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/OrderInfoRequest.java (94%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/OrderInfoResponse.java (99%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/TransferDetailRequest.java (96%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/TransferDetailResponse.java (96%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/TransferInRequest.java (96%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/TransferInResponse.java (91%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/TransferOutRequest.java (96%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/dto/TransferOutResponse.java (91%) rename ff-game/src/main/java/com/ff/{sports => game/api}/fb/impl/FBSportsServiceImpl.java (94%) create mode 100644 ff-game/src/main/java/com/ff/game/api/request/TransactionIdRequestDTO.java 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 4f598c9..a473e18 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 @@ -38,11 +38,10 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { public static String DAY_END_TIME = "23:59:59"; - public static final String ISO_8601_FORMAT= "yyyy-MM-dd'T'HH:mm:ss"; + 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'"; + public static final String ISO_8601_FORMAT_Z = "yyyy-MM-dd'T'HH:mm:ss'Z'"; /** @@ -213,8 +212,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { * 将时间戳转换为指定格式的时间字符串 * * @param timestamp 时间戳(毫秒) - * @param format 目标时间格式,例如:yyyy-MM-dd'T'HH:mm:ssXXX - * @param timeZone 时区,例如:GMT+8,UTC等 + * @param format 目标时间格式,例如:yyyy-MM-dd'T'HH:mm:ssXXX + * @param timeZone 时区,例如:GMT+8,UTC等 * @return 格式化后的时间字符串 */ public static String convertTimestampToFormattedDate(long timestamp, String format, String timeZone) { @@ -251,7 +250,6 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { } - /** * 增加 LocalDate ==> Date */ @@ -943,4 +941,38 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { public static boolean isBetween(Long value, Long minValue, Long maxValue) { return value >= minValue && value <= maxValue; } + + /** + * 将日期字符串转换为指定时区的毫秒时间戳 + * + * @param dateString 日期字符串,格式为 "yyyy-MM-dd'T'HH:mm:ss.SSS" + * @param timezone 时区(如 UTC、Asia/Shanghai) + * @return 时区下的毫秒时间戳 + * @throws Exception 日期解析异常 + */ + public static long convertToMillisWithTimezone(String dateString, String timezone) { + try { + // 设置日期格式 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); + + // 设置解析时使用的时区 + sdf.setTimeZone(TimeZone.getTimeZone(timezone)); + + // 解析日期字符串为 Date 对象 + Date date = sdf.parse(dateString); + + // 获取项目默认时区 + TimeZone defaultTimeZone = TimeZone.getDefault(); + + // 使用默认时区的 Calendar 计算 + Calendar calendar = Calendar.getInstance(defaultTimeZone); + calendar.setTime(date); + + // 返回该时区对应的毫秒时间戳 + return calendar.getTimeInMillis(); + } catch (Exception e) { + return 0; + } + + } } 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 d8ed023..00585dd 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 @@ -52,6 +52,14 @@ public interface IGamesService { */ String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO); + /** + * 获取交易id + * + * @param transactionIdRequestDTO 事务id请求dto + * @return {@link String } + */ + String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO); + /** * 按代理id进行交换转账 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 8aeaee6..df220be 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 @@ -218,10 +218,27 @@ public class GamesAEServiceImpl implements IGamesService { game.setNameInfo(Collections.singletonList(nameInfo)); game.setGameId(StringUtils.addSuffix(GamePlatforms.AE.getCode(), 1)); gameService.insertGame(game); + }else { + NameInfo nameInfo = new NameInfo(); + nameInfo.setLang("zh-CN"); + nameInfo.setName("AE大厅"); + game.setNameInfo(Collections.singletonList(nameInfo)); + gameService.updateGame(game); } return CacheConstants.AE_GAMES; } + /** + * 获取交易id + * + * @param transactionIdRequestDTO 事务id请求dto + * @return {@link String } + */ + @Override + public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) { + return GamePlatforms.AE.getCode() + IdUtils.simpleUUID(); + } + /** * 按代理id进行交换转账 * diff --git a/ff-game/src/main/java/com/ff/sports/db/address/DBSportsAddress.java b/ff-game/src/main/java/com/ff/game/api/db/address/DBSportsAddress.java similarity index 95% rename from ff-game/src/main/java/com/ff/sports/db/address/DBSportsAddress.java rename to ff-game/src/main/java/com/ff/game/api/db/address/DBSportsAddress.java index c2e1843..f32e3a0 100644 --- a/ff-game/src/main/java/com/ff/sports/db/address/DBSportsAddress.java +++ b/ff-game/src/main/java/com/ff/game/api/db/address/DBSportsAddress.java @@ -1,4 +1,4 @@ -package com.ff.sports.db.address; +package com.ff.game.api.db.address; import com.dtflys.forest.callback.AddressSource; import com.dtflys.forest.http.ForestAddress; diff --git a/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java b/ff-game/src/main/java/com/ff/game/api/db/client/DBSportsClient.java similarity index 96% rename from ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java rename to ff-game/src/main/java/com/ff/game/api/db/client/DBSportsClient.java index c144449..8e62ece 100644 --- a/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java +++ b/ff-game/src/main/java/com/ff/game/api/db/client/DBSportsClient.java @@ -1,8 +1,8 @@ -package com.ff.sports.db.client; +package com.ff.game.api.db.client; import com.dtflys.forest.annotation.*; -import com.ff.sports.db.address.DBSportsAddress; -import com.ff.sports.db.dto.*; +import com.ff.game.api.db.address.DBSportsAddress; +import com.ff.game.api.db.dto.*; /** * @author cengy diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java b/ff-game/src/main/java/com/ff/game/api/db/dto/CreateUserRequest.java similarity index 96% rename from ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java rename to ff-game/src/main/java/com/ff/game/api/db/dto/CreateUserRequest.java index b8e3366..e80f80a 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java +++ b/ff-game/src/main/java/com/ff/game/api/db/dto/CreateUserRequest.java @@ -1,4 +1,4 @@ -package com.ff.sports.db.dto; +package com.ff.game.api.db.dto; import com.ff.base.utils.sign.Md5Utils; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserResponse.java b/ff-game/src/main/java/com/ff/game/api/db/dto/CreateUserResponse.java similarity index 92% rename from ff-game/src/main/java/com/ff/sports/db/dto/CreateUserResponse.java rename to ff-game/src/main/java/com/ff/game/api/db/dto/CreateUserResponse.java index ce2c62e..e299ed2 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/db/dto/CreateUserResponse.java @@ -1,4 +1,4 @@ -package com.ff.sports.db.dto; +package com.ff.game.api.db.dto; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/Enums.java b/ff-game/src/main/java/com/ff/game/api/db/dto/Enums.java similarity index 61% rename from ff-game/src/main/java/com/ff/sports/fb/dto/Enums.java rename to ff-game/src/main/java/com/ff/game/api/db/dto/Enums.java index cf2bd48..618297b 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/Enums.java +++ b/ff-game/src/main/java/com/ff/game/api/db/dto/Enums.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.db.dto; /** * @author cengy diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListRequest.java b/ff-game/src/main/java/com/ff/game/api/db/dto/GetBetListRequest.java similarity index 98% rename from ff-game/src/main/java/com/ff/sports/db/dto/GetBetListRequest.java rename to ff-game/src/main/java/com/ff/game/api/db/dto/GetBetListRequest.java index 13f95cd..9ec24af 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListRequest.java +++ b/ff-game/src/main/java/com/ff/game/api/db/dto/GetBetListRequest.java @@ -1,4 +1,4 @@ -package com.ff.sports.db.dto; +package com.ff.game.api.db.dto; import com.ff.base.utils.sign.Md5Utils; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListResponse.java b/ff-game/src/main/java/com/ff/game/api/db/dto/GetBetListResponse.java similarity index 99% rename from ff-game/src/main/java/com/ff/sports/db/dto/GetBetListResponse.java rename to ff-game/src/main/java/com/ff/game/api/db/dto/GetBetListResponse.java index aace488..08db342 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/db/dto/GetBetListResponse.java @@ -1,4 +1,4 @@ -package com.ff.sports.db.dto; +package com.ff.game.api.db.dto; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoRequest.java b/ff-game/src/main/java/com/ff/game/api/db/dto/GetMemberInfoRequest.java similarity index 95% rename from ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoRequest.java rename to ff-game/src/main/java/com/ff/game/api/db/dto/GetMemberInfoRequest.java index 5255cb6..98f5e5b 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoRequest.java +++ b/ff-game/src/main/java/com/ff/game/api/db/dto/GetMemberInfoRequest.java @@ -1,4 +1,4 @@ -package com.ff.sports.db.dto; +package com.ff.game.api.db.dto; import com.ff.base.utils.sign.Md5Utils; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoResponse.java b/ff-game/src/main/java/com/ff/game/api/db/dto/GetMemberInfoResponse.java similarity index 94% rename from ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoResponse.java rename to ff-game/src/main/java/com/ff/game/api/db/dto/GetMemberInfoResponse.java index 1f329c0..c10cf48 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/db/dto/GetMemberInfoResponse.java @@ -1,4 +1,4 @@ -package com.ff.sports.db.dto; +package com.ff.game.api.db.dto; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/KickUserRequest.java b/ff-game/src/main/java/com/ff/game/api/db/dto/KickUserRequest.java similarity index 94% rename from ff-game/src/main/java/com/ff/sports/db/dto/KickUserRequest.java rename to ff-game/src/main/java/com/ff/game/api/db/dto/KickUserRequest.java index 809825d..33bcf0e 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/KickUserRequest.java +++ b/ff-game/src/main/java/com/ff/game/api/db/dto/KickUserRequest.java @@ -1,4 +1,4 @@ -package com.ff.sports.db.dto; +package com.ff.game.api.db.dto; import com.ff.base.utils.sign.Md5Utils; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/KickUserResponse.java b/ff-game/src/main/java/com/ff/game/api/db/dto/KickUserResponse.java similarity index 90% rename from ff-game/src/main/java/com/ff/sports/db/dto/KickUserResponse.java rename to ff-game/src/main/java/com/ff/game/api/db/dto/KickUserResponse.java index 065e66a..0f27fd3 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/KickUserResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/db/dto/KickUserResponse.java @@ -1,4 +1,4 @@ -package com.ff.sports.db.dto; +package com.ff.game.api.db.dto; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/LoginRequest.java b/ff-game/src/main/java/com/ff/game/api/db/dto/LoginRequest.java similarity index 98% rename from ff-game/src/main/java/com/ff/sports/db/dto/LoginRequest.java rename to ff-game/src/main/java/com/ff/game/api/db/dto/LoginRequest.java index f120b9b..d2dc47e 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/LoginRequest.java +++ b/ff-game/src/main/java/com/ff/game/api/db/dto/LoginRequest.java @@ -1,4 +1,4 @@ -package com.ff.sports.db.dto; +package com.ff.game.api.db.dto; import com.ff.base.utils.sign.Md5Utils; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/LoginResponse.java b/ff-game/src/main/java/com/ff/game/api/db/dto/LoginResponse.java similarity index 96% rename from ff-game/src/main/java/com/ff/sports/db/dto/LoginResponse.java rename to ff-game/src/main/java/com/ff/game/api/db/dto/LoginResponse.java index eafb9ba..10ef3c6 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/LoginResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/db/dto/LoginResponse.java @@ -1,4 +1,4 @@ -package com.ff.sports.db.dto; +package com.ff.game.api.db.dto; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailRequest.java b/ff-game/src/main/java/com/ff/game/api/db/dto/TransferDetailRequest.java similarity index 95% rename from ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailRequest.java rename to ff-game/src/main/java/com/ff/game/api/db/dto/TransferDetailRequest.java index 342144d..4a6a2a1 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailRequest.java +++ b/ff-game/src/main/java/com/ff/game/api/db/dto/TransferDetailRequest.java @@ -1,4 +1,4 @@ -package com.ff.sports.db.dto; +package com.ff.game.api.db.dto; import com.ff.base.utils.sign.Md5Utils; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailResponse.java b/ff-game/src/main/java/com/ff/game/api/db/dto/TransferDetailResponse.java similarity index 97% rename from ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailResponse.java rename to ff-game/src/main/java/com/ff/game/api/db/dto/TransferDetailResponse.java index 77fba58..42866b1 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/db/dto/TransferDetailResponse.java @@ -1,4 +1,4 @@ -package com.ff.sports.db.dto; +package com.ff.game.api.db.dto; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferRequest.java b/ff-game/src/main/java/com/ff/game/api/db/dto/TransferRequest.java similarity index 96% rename from ff-game/src/main/java/com/ff/sports/db/dto/TransferRequest.java rename to ff-game/src/main/java/com/ff/game/api/db/dto/TransferRequest.java index 9b500d3..03991af 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/TransferRequest.java +++ b/ff-game/src/main/java/com/ff/game/api/db/dto/TransferRequest.java @@ -1,4 +1,4 @@ -package com.ff.sports.db.dto; +package com.ff.game.api.db.dto; import com.ff.base.utils.sign.Md5Utils; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferResponse.java b/ff-game/src/main/java/com/ff/game/api/db/dto/TransferResponse.java similarity index 92% rename from ff-game/src/main/java/com/ff/sports/db/dto/TransferResponse.java rename to ff-game/src/main/java/com/ff/game/api/db/dto/TransferResponse.java index 1ada1ab..5e563f5 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/TransferResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/db/dto/TransferResponse.java @@ -1,4 +1,4 @@ -package com.ff.sports.db.dto; +package com.ff.game.api.db.dto; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/db/impl/DBSportsServiceImpl.java similarity index 91% rename from ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java rename to ff-game/src/main/java/com/ff/game/api/db/impl/DBSportsServiceImpl.java index 2b74435..321695d 100644 --- a/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/db/impl/DBSportsServiceImpl.java @@ -1,4 +1,4 @@ -package com.ff.sports.db.impl; +package com.ff.game.api.db.impl; import cn.hutool.core.util.IdUtil; import com.ff.base.constant.CacheConstants; @@ -12,6 +12,7 @@ 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.db.dto.*; import com.ff.game.api.request.*; import com.ff.game.domain.*; import com.ff.game.service.IGameBettingDetailsService; @@ -19,12 +20,10 @@ 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.sports.db.client.DBSportsClient; -import com.ff.sports.db.dto.*; +import com.ff.game.api.db.client.DBSportsClient; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; @@ -120,37 +119,13 @@ public class DBSportsServiceImpl implements IGamesService { @Transactional public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO requestDTO) { - Member member = memberService.selectMemberByGameAccount(requestDTO.getAccount()); - String transactionId = GamePlatforms.DBSports.getCode() + IdUtils.simpleUUID(); - List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( - GameExchangeMoney.builder() - .tenantKey(requestDTO.getTenantKey()) - .orderId(requestDTO.getOrderId()) - .build() - ); - Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); -//获取下一个自增id - GameExchangeMoney exchangeMoney = GameExchangeMoney - .builder() - .orderId(requestDTO.getOrderId()) - .tenantKey(requestDTO.getTenantKey()) - .quota(requestDTO.getQuota()) - .balance(requestDTO.getAmount()) - .exchangeType(requestDTO.getTransferType()) - .currencyCode(requestDTO.getSystemCurrency()) - .memberId(member.getId()) - .transactionId(transactionId) - .platformCode(GamePlatforms.DBSports.getCode()) - .build(); - exchangeMoney.setCreateBy(Constants.SYSTEM); - //接口限制限制50字符 - exchangeMoney.setTransactionId(transactionId); + GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(requestDTO.getGameExchangeId()); // 转入 if (requestDTO.getTransferType().equals(TransferType.GAMES.getCode())) { TransferRequest request = new TransferRequest(); request.setUserName(requestDTO.getAccount()); request.setTransferType(1); - request.setTransferId(requestDTO.getOrderId()); + request.setTransferId(requestDTO.getTransactionId()); request.setMerchantCode(requestDTO.getAgentId()); request.setAmount(requestDTO.getAmount().toString()); request.buildSignature(requestDTO.getAgentKey()); @@ -179,15 +154,19 @@ public class DBSportsServiceImpl implements IGamesService { } catch (Exception e) { log.error("查询会员失败, errorCode:{}, errorMessage:{}", response.getCode(), response.getMsg(), e); } - 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 ApiException(ErrorCode.Transfer_In_Failure.getCode()); } } else { // 获取第三方钱包余额 MemberInfoRequestDTO memberInfoRequestDTO = MemberInfoRequestDTO.builder() - .accounts(member.getGameAccount()) + .accounts(requestDTO.getAccount()) .agentId(requestDTO.getAgentId()) .agentKey(requestDTO.getAgentKey()) .build(); @@ -199,7 +178,7 @@ public class DBSportsServiceImpl implements IGamesService { TransferRequest request = new TransferRequest(); request.setUserName(requestDTO.getAccount()); request.setTransferType(2); // 转出 - request.setTransferId(requestDTO.getOrderId()); + request.setTransferId(requestDTO.getTransactionId()); request.setMerchantCode(requestDTO.getAgentId()); request.setAmount(/*requestDTO.getAmount().toString()*/ balance.toString()); request.buildSignature(requestDTO.getAgentKey()); @@ -221,14 +200,28 @@ public class DBSportsServiceImpl implements IGamesService { exchangeMoney.setCoinAfter(afterAmount); exchangeMoney.setCurrencyBefore(beforeAmount); exchangeMoney.setCurrencyAfter(afterAmount); - 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 ApiException(ErrorCode.Transfer_Out_Failure.getCode()); } } return exchangeMoney.getId(); } + /** + * 获取交易id + * + * @param transactionIdRequestDTO 事务id请求dto + * @return {@link String } + */ + @Override + public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) { + return gameExchangeMoneyService.getTransactionId(GamePlatforms.DBSports.getInfo(), 11); + } /** * 获取会员信息 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 a8c1730..9f5f776 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 @@ -204,10 +204,28 @@ public class GamesDGServiceImpl implements IGamesService { game.setNameInfo(Collections.singletonList(new NameInfo("真人棋牌", "zh-CN"))); game.setGameId(StringUtils.addSuffix(GamePlatforms.DG.getCode(), 1)); gameService.insertGame(game); + }else { + game.setNameInfo(Collections.singletonList(new NameInfo("真人棋牌", "zh-CN"))); + gameService.updateGame(game); } return CacheConstants.DG_GAMES; } + + + /** + * 获取交易id + * + * @param transactionIdRequestDTO 事务id请求dto + * @return {@link String } + */ + @Override + public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) { + return GamePlatforms.DG.getInfo() + IdUtils.simpleUUID(); + } + + + /** * 按代理id进行交换转账 * diff --git a/ff-game/src/main/java/com/ff/game/api/exchange/impl/CreateOrderServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/exchange/impl/CreateOrderServiceImpl.java index 4f31570..9909e68 100644 --- a/ff-game/src/main/java/com/ff/game/api/exchange/impl/CreateOrderServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/exchange/impl/CreateOrderServiceImpl.java @@ -6,20 +6,24 @@ import com.ff.base.exception.base.ApiException; import com.ff.base.manager.AsyncManager; import com.ff.base.utils.DateUtils; import com.ff.base.utils.uuid.IdUtils; +import com.ff.game.api.IGamesService; import com.ff.game.api.exchange.AbstractStepProcessor; import com.ff.game.api.exchange.StepProcessorFactory; import com.ff.game.api.exchange.StepProcessorService; import com.ff.game.api.exchange.dto.GameExchangeDTO; import com.ff.game.api.request.ExchangeTransferStatusRequestDTO; +import com.ff.game.api.request.TransactionIdRequestDTO; import com.ff.game.domain.GameExchangeMoney; import com.ff.game.service.IGameExchangeMoneyService; import com.ff.member.domain.Member; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.crypto.spec.SecretKeySpec; import java.util.Base64; +import java.util.Map; /** * 创建订单impl @@ -33,11 +37,12 @@ public class CreateOrderServiceImpl extends AbstractStepProcessor { @Resource private IGameExchangeMoneyService gameExchangeMoneyService; - - @Resource private StepProcessorFactory stepProcessorFactory; + @Autowired + private Map gamesService; + /** * 步进键 * @@ -56,10 +61,10 @@ public class CreateOrderServiceImpl extends AbstractStepProcessor { * @return boolean */ @Override - public boolean doProcess(GameExchangeDTO gameExchangeMoney) { + public boolean doProcess(GameExchangeDTO gameExchangeMoney) { - - gameExchangeMoney.setTransactionId(this.getTransactionId(GamePlatforms.getByCode(gameExchangeMoney.getPlatformCode()),gameExchangeMoney.getExchangeType(),gameExchangeMoney.getGameAccount())); + String transactionId = gamesService.get(gameExchangeMoney.getPlatformCode()+Constants.SERVICE).getTransactionId(TransactionIdRequestDTO.builder().exchangeType(gameExchangeMoney.getExchangeType()).gameAccount(gameExchangeMoney.getGameAccount()).build()); + gameExchangeMoney.setTransactionId(transactionId); gameExchangeMoney.setCreateBy(Constants.SYSTEM); gameExchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue()); gameExchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode()); @@ -67,49 +72,6 @@ public class CreateOrderServiceImpl extends AbstractStepProcessor { return gameExchangeMoneyService.insertGameExchangeMoney(gameExchangeMoney) > 0; } - /** - * 获取交易id - * - * @return {@link String } - */ - private String getTransactionId(GamePlatforms gamePlatforms,Integer exchangeType ,String account) { - switch (gamePlatforms) { - case AE: - return GamePlatforms.AE.getCode() + IdUtils.simpleUUID(); - case JILI: - return GamePlatforms.JILI.getInfo() + IdUtils.simpleUUID(); - case XK: - return GamePlatforms.XK.getCode() + IdUtils.simpleUUID(); - case PG: - return gameExchangeMoneyService.getTransactionId(GamePlatforms.PG.getCode(), 32); - case PGX: - return gameExchangeMoneyService.getTransactionId(GamePlatforms.PGX.getInfo(), 17); - case FC: - return gameExchangeMoneyService.getTransactionId(GamePlatforms.FC.getInfo(), 30); - case DG: - return GamePlatforms.DG.getInfo() + IdUtils.simpleUUID(); - - case MT: - return GamePlatforms.MT.getCode() + IdUtils.simpleUUID(); - case SA: - //判断是转入还是转出 - String transactionId = "OUT" + DateUtils.dateTimeNow() + account; - if (!TransferType.ALL.getCode().equals(exchangeType)) { - transactionId = "IN" + DateUtils.dateTimeNow() + account; - } - - return transactionId; - case KM: - return GamePlatforms.KM.getInfo() + IdUtils.simpleUUID(); - case PGT: - return gameExchangeMoneyService.getTransactionId(GamePlatforms.PGT.getInfo(), 17); - case FBSports: - return GamePlatforms.FBSports.getCode() + IdUtils.simpleUUID(); - case SV388: - return GamePlatforms.SV388.getCode() + IdUtils.simpleUUID(); - } - throw new ApiException(ErrorCode.PLATFORM_NOT_EXIST.getCode()); - } /** diff --git a/ff-game/src/main/java/com/ff/sports/fb/address/FBSportsAddress.java b/ff-game/src/main/java/com/ff/game/api/fb/address/FBSportsAddress.java similarity index 95% rename from ff-game/src/main/java/com/ff/sports/fb/address/FBSportsAddress.java rename to ff-game/src/main/java/com/ff/game/api/fb/address/FBSportsAddress.java index e0aaa84..86974ec 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/address/FBSportsAddress.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/address/FBSportsAddress.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.address; +package com.ff.game.api.fb.address; import com.dtflys.forest.callback.AddressSource; import com.dtflys.forest.http.ForestAddress; diff --git a/ff-game/src/main/java/com/ff/sports/fb/client/FBSportsClient.java b/ff-game/src/main/java/com/ff/game/api/fb/client/FBSportsClient.java similarity index 97% rename from ff-game/src/main/java/com/ff/sports/fb/client/FBSportsClient.java rename to ff-game/src/main/java/com/ff/game/api/fb/client/FBSportsClient.java index dc28d2d..78dbf29 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/client/FBSportsClient.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/client/FBSportsClient.java @@ -1,8 +1,8 @@ -package com.ff.sports.fb.client; +package com.ff.game.api.fb.client; import com.dtflys.forest.annotation.*; -import com.ff.sports.fb.address.FBSportsAddress; -import com.ff.sports.fb.dto.*; +import com.ff.game.api.fb.address.FBSportsAddress; +import com.ff.game.api.fb.dto.*; /** * 数据接口文档
diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/CreateUserRequest.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/CreateUserRequest.java similarity index 96% rename from ff-game/src/main/java/com/ff/sports/fb/dto/CreateUserRequest.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/CreateUserRequest.java index 95c942d..58ba958 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/CreateUserRequest.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/CreateUserRequest.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import com.alibaba.fastjson2.JSON; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/CreateUserResponse.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/CreateUserResponse.java similarity index 90% rename from ff-game/src/main/java/com/ff/sports/fb/dto/CreateUserResponse.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/CreateUserResponse.java index 015abf1..0599c91 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/CreateUserResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/CreateUserResponse.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/Enums.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/Enums.java similarity index 61% rename from ff-game/src/main/java/com/ff/sports/db/dto/Enums.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/Enums.java index 5cbd46b..378f03c 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/Enums.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/Enums.java @@ -1,4 +1,4 @@ -package com.ff.sports.db.dto; +package com.ff.game.api.fb.dto; /** * @author cengy diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/GetMemberInfoRequest.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/GetMemberInfoRequest.java similarity index 94% rename from ff-game/src/main/java/com/ff/sports/fb/dto/GetMemberInfoRequest.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/GetMemberInfoRequest.java index 51e7129..42d187a 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/GetMemberInfoRequest.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/GetMemberInfoRequest.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import com.alibaba.fastjson2.JSON; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/GetMemberInfoResponse.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/GetMemberInfoResponse.java similarity index 97% rename from ff-game/src/main/java/com/ff/sports/fb/dto/GetMemberInfoResponse.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/GetMemberInfoResponse.java index 0911248..632dfd2 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/GetMemberInfoResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/GetMemberInfoResponse.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/GetTokenRequest.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/GetTokenRequest.java similarity index 95% rename from ff-game/src/main/java/com/ff/sports/fb/dto/GetTokenRequest.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/GetTokenRequest.java index 1f46602..eefab72 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/GetTokenRequest.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/GetTokenRequest.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import com.alibaba.fastjson2.JSON; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/GetTokenResponse.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/GetTokenResponse.java similarity index 98% rename from ff-game/src/main/java/com/ff/sports/fb/dto/GetTokenResponse.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/GetTokenResponse.java index 32a5029..1780037 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/GetTokenResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/GetTokenResponse.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/GetUrlRequest.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/GetUrlRequest.java similarity index 88% rename from ff-game/src/main/java/com/ff/sports/fb/dto/GetUrlRequest.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/GetUrlRequest.java index 15d3213..8228a41 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/GetUrlRequest.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/GetUrlRequest.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/GetUrlResponse.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/GetUrlResponse.java similarity index 96% rename from ff-game/src/main/java/com/ff/sports/fb/dto/GetUrlResponse.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/GetUrlResponse.java index e0ea5f8..1471461 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/GetUrlResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/GetUrlResponse.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesRequest.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/OrderFilesRequest.java similarity index 96% rename from ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesRequest.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/OrderFilesRequest.java index 5cbbeed..7ac25bc 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesRequest.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/OrderFilesRequest.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import com.alibaba.fastjson2.JSON; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesResponse.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/OrderFilesResponse.java similarity index 93% rename from ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesResponse.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/OrderFilesResponse.java index 8d9f1b5..f600fdd 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderFilesResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/OrderFilesResponse.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoRequest.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/OrderInfoRequest.java similarity index 94% rename from ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoRequest.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/OrderInfoRequest.java index 251dc02..2197629 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoRequest.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/OrderInfoRequest.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import com.alibaba.fastjson2.JSON; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoResponse.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/OrderInfoResponse.java similarity index 99% rename from ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoResponse.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/OrderInfoResponse.java index fb48ce7..106ffb5 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/OrderInfoResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/OrderInfoResponse.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferDetailRequest.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/TransferDetailRequest.java similarity index 96% rename from ff-game/src/main/java/com/ff/sports/fb/dto/TransferDetailRequest.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/TransferDetailRequest.java index 85f678d..0c4edfd 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferDetailRequest.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/TransferDetailRequest.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import com.alibaba.fastjson2.JSON; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferDetailResponse.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/TransferDetailResponse.java similarity index 96% rename from ff-game/src/main/java/com/ff/sports/fb/dto/TransferDetailResponse.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/TransferDetailResponse.java index 614edd0..af870bc 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferDetailResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/TransferDetailResponse.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferInRequest.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/TransferInRequest.java similarity index 96% rename from ff-game/src/main/java/com/ff/sports/fb/dto/TransferInRequest.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/TransferInRequest.java index 52b4c62..bc35430 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferInRequest.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/TransferInRequest.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import com.alibaba.fastjson2.JSON; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferInResponse.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/TransferInResponse.java similarity index 91% rename from ff-game/src/main/java/com/ff/sports/fb/dto/TransferInResponse.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/TransferInResponse.java index e5ab6ca..562aca6 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferInResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/TransferInResponse.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferOutRequest.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/TransferOutRequest.java similarity index 96% rename from ff-game/src/main/java/com/ff/sports/fb/dto/TransferOutRequest.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/TransferOutRequest.java index 37fc465..795f00b 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferOutRequest.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/TransferOutRequest.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import com.alibaba.fastjson2.JSON; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferOutResponse.java b/ff-game/src/main/java/com/ff/game/api/fb/dto/TransferOutResponse.java similarity index 91% rename from ff-game/src/main/java/com/ff/sports/fb/dto/TransferOutResponse.java rename to ff-game/src/main/java/com/ff/game/api/fb/dto/TransferOutResponse.java index 9fb8897..c784222 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/dto/TransferOutResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/dto/TransferOutResponse.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.dto; +package com.ff.game.api.fb.dto; import lombok.Data; diff --git a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/fb/impl/FBSportsServiceImpl.java similarity index 94% rename from ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java rename to ff-game/src/main/java/com/ff/game/api/fb/impl/FBSportsServiceImpl.java index 6049dc0..bc3f65b 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/fb/impl/FBSportsServiceImpl.java @@ -1,4 +1,4 @@ -package com.ff.sports.fb.impl; +package com.ff.game.api.fb.impl; import cn.hutool.core.util.IdUtil; import com.ff.base.constant.CacheConstants; @@ -12,6 +12,7 @@ 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.fb.dto.*; import com.ff.game.api.request.*; import com.ff.game.domain.*; import com.ff.game.service.IGameBettingDetailsService; @@ -19,13 +20,11 @@ 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.sports.fb.client.FBSportsClient; -import com.ff.sports.fb.dto.*; +import com.ff.game.api.fb.client.FBSportsClient; import com.ff.utils.TimestampFromString; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; @@ -138,7 +137,7 @@ public class FBSportsServiceImpl implements IGamesService { TransferInRequest request = new TransferInRequest(); request.setMerchantUserId(requestDTO.getAccount()); request.setAmount(requestDTO.getAmount()); - request.setBusinessId(requestDTO.getOrderId()); + request.setBusinessId(requestDTO.getTransactionId()); request.setCurrencyId(Integer.parseInt(requestDTO.getCurrency())); long timestamp = System.currentTimeMillis(); String jsonBody = request.toJSON(); @@ -161,15 +160,19 @@ public class FBSportsServiceImpl implements IGamesService { exchangeMoney.setCoinAfter(response.getData()); exchangeMoney.setCurrencyBefore(response.getData().subtract(transAmount)); exchangeMoney.setCurrencyAfter(response.getData()); - 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 ApiException(ErrorCode.Transfer_In_Failure.getCode()); } } else { // 获取第三方钱包余额 MemberInfoRequestDTO memberInfoRequestDTO = MemberInfoRequestDTO.builder() - .accounts(member.getGameAccount()) + .accounts(requestDTO.getAccount()) .agentId(requestDTO.getAgentId()) .agentKey(requestDTO.getAgentKey()) .build(); @@ -178,7 +181,7 @@ public class FBSportsServiceImpl implements IGamesService { TransferOutRequest request = new TransferOutRequest(); request.setMerchantUserId(requestDTO.getAccount()); request.setAmount(/*requestDTO.getAmount()*/ balance); - request.setBusinessId(requestDTO.getOrderId()); + request.setBusinessId(requestDTO.getTransactionId()); request.setCurrencyId(Integer.parseInt(requestDTO.getCurrency())); long timestamp = System.currentTimeMillis(); @@ -207,9 +210,13 @@ public class FBSportsServiceImpl implements IGamesService { exchangeMoney.setCoinAfter(response.getData()); exchangeMoney.setCurrencyBefore(response.getData().add(transAmount)); exchangeMoney.setCurrencyAfter(response.getData()); - 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 ApiException(ErrorCode.Transfer_Out_Failure.getCode()); } } @@ -256,6 +263,19 @@ public class FBSportsServiceImpl implements IGamesService { } } + + /** + * 获取交易id + * + * @param transactionIdRequestDTO 事务id请求dto + * @return {@link String } + */ + @Override + public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) { + return GamePlatforms.FBSports.getCode() + IdUtils.simpleUUID(); + } + + /** * 无重定向登录 * @@ -421,7 +441,7 @@ public class FBSportsServiceImpl implements IGamesService { ); if (this.isSuccess(response.getCode())) { status = StatusType.SUCCESS.getValue(); - }else { + } else { status = StatusType.FAILURE.getValue(); } } 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 209e0d2..3e39e79 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 @@ -283,6 +283,11 @@ public class GamesFCServiceImpl implements IGamesService { gameService.insertGame(game); } else { game = games.get(0); + 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); + gameService.updateGame(game); } gameDetails.setSystemGameId(game.getGameId()); @@ -366,6 +371,19 @@ public class GamesFCServiceImpl implements IGamesService { return exchangeMoney.getId(); } + + /** + * 获取交易id + * + * @param transactionIdRequestDTO 事务id请求dto + * @return {@link String } + */ + @Override + public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) { + return gameExchangeMoneyService.getTransactionId(GamePlatforms.FC.getInfo(), 30); + } + + /** * 汇兑转移状态 * 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 954330a..ed3cb96 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 @@ -252,6 +252,11 @@ public class GamesJILIServiceImpl implements IGamesService { gameService.insertGame(game); } else { game = games.get(0); + List nameInfos = new ArrayList<>(); + nameInfos.add(new NameInfo(gamesDataDTO.getName().getZhCN(), "zh-CN")); + nameInfos.add(new NameInfo(gamesDataDTO.getName().getEnUS(), "en-US")); + game.setNameInfo(nameInfos); + gameService.updateGame(game); } gamesDataDTO.setSystemGameId(game.getGameId()); @@ -269,6 +274,17 @@ public class GamesJILIServiceImpl implements IGamesService { return CacheConstants.JILI_GAMES; } + /** + * 获取交易id + * + * @param transactionIdRequestDTO 事务id请求dto + * @return {@link String } + */ + @Override + public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) { + return GamePlatforms.JILI.getInfo() + IdUtils.simpleUUID(); + } + /** * 按代理id进行交换转账 * 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 fcbd8c0..f510799 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 @@ -301,12 +301,30 @@ public class GamesKMServiceImpl implements IGamesService { gameService.insertGame(game); } else { game = games.get(0); + List nameInfos = new ArrayList<>(); + nameInfos.add(new NameInfo(gamesDataDTO.getName(), "zh-CN")); + game.setNameInfo(nameInfos); + gameService.updateGame(game); } gamesDataDTO.setSystemGameId(game.getGameId()); } return gameList.getGames(); } + + /** + * 获取交易id + * + * @param transactionIdRequestDTO 事务id请求dto + * @return {@link String } + */ + @Override + public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) { + return GamePlatforms.KM.getInfo() + IdUtils.simpleUUID(); + } + + + /** * 按代理id进行交换转账 * 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 84ef3d9..62c5742 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 @@ -247,6 +247,11 @@ public class MeiTianGameServiceImpl implements IGamesService { gameService.insertGame(game); } else { game = games.get(0); + List nameInfos = new ArrayList<>(); + nameInfos.add(new NameInfo(gamesDataDTO.getCnName(), "zh-CN")); + nameInfos.add(new NameInfo(gamesDataDTO.getEnName(), "en-US")); + game.setNameInfo(nameInfos); + gameService.updateGame(game); } gamesDataDTO.setSystemGameId(game.getGameId()); } @@ -258,6 +263,17 @@ public class MeiTianGameServiceImpl implements IGamesService { return CacheConstants.MeiTian_GAMES; } + + /** + * 获取交易id + * + * @param transactionIdRequestDTO 事务id请求dto + * @return {@link String } + */ + @Override + public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) { + return GamePlatforms.MT.getCode() + IdUtils.simpleUUID(); + } /** * 按代理id进行交换转账 * 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 878b9c0..f7694ce 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 @@ -13,6 +13,7 @@ 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.ng.client.NGClient; @@ -258,6 +259,12 @@ public class GamesPGServiceImpl implements IGamesService { gameService.insertGame(game); } else { game = games.get(0); + 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")); + nameInfos.add(new NameInfo(apiGameInfoResponseDTO.getGameName().get("en"), "en-US")); + game.setNameInfo(nameInfos); + gameService.updateGame(game); } apiGameInfoResponseDTO.setSystemGameId(game.getId()); @@ -273,6 +280,19 @@ public class GamesPGServiceImpl implements IGamesService { return CacheConstants.PG_GAMES; } + /** + * 获取交易id + * + * @param transactionIdRequestDTO 事务id请求dto + * @return {@link String } + */ + @Override + public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) { + return gameExchangeMoneyService.getTransactionId(GamePlatforms.PG.getCode(), 32); + } + + + /** * 按代理id进行交换转账 * @@ -298,10 +318,14 @@ public class GamesPGServiceImpl implements IGamesService { .agentKey(exchangeTransferMoneyRequestDTO.getAgentKey()) .currency(exchangeTransferMoneyRequestDTO.getCurrency()) .build(); - MemberInfoResponseDTO memberInfo = this.getMemberInfo(gamesBaseRequestDTO); + //判断是不是转出 if (NGTransferType.TRANSFER_OUT.getValue().equals(type)) { + MemberInfoResponseDTO memberInfo = this.getMemberInfo(gamesBaseRequestDTO); exchangeTransferMoneyRequestDTO.setAmount(memberInfo.getBalance()); + if (exchangeTransferMoneyRequestDTO.getAmount().compareTo(BigDecimal.ZERO) <= 0) { + throw new ApiException(ErrorCode.INSUFFICIENT_PLAYER_BALANCE.getCode()); + } } @@ -322,6 +346,20 @@ public class GamesPGServiceImpl implements IGamesService { exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode()); gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); + ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO(); + exchangeTransferStatusRequestDTO.setAccount(exchangeTransferMoneyRequestDTO.getAccount()); + exchangeTransferStatusRequestDTO.setCurrency(exchangeTransferMoneyRequestDTO.getCurrency()); + exchangeTransferStatusRequestDTO.setOrderId(exchangeTransferMoneyRequestDTO.getTransactionId()); + exchangeTransferStatusRequestDTO.setAgentId(exchangeTransferMoneyRequestDTO.getAgentId()); + exchangeTransferStatusRequestDTO.setAgentKey(exchangeTransferMoneyRequestDTO.getAgentKey()); + ExchangeTransferStatusResponseDTO statusResponseDTO = this.exchangeTransferStatus(exchangeTransferStatusRequestDTO); + //更新钱 + exchangeMoney.setBalance(statusResponseDTO.getBalance()); + exchangeMoney.setCoinBefore(statusResponseDTO.getCoinBefore()); + exchangeMoney.setCoinAfter(statusResponseDTO.getCoinAfter()); + exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore()); + exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter()); + gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); } else { exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode()); exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode()); @@ -341,6 +379,7 @@ public class GamesPGServiceImpl implements IGamesService { @Override public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + SleepUtil.sleep(1000); Map paramsMap = new HashMap<>(); paramsMap.put("playerId", exchangeTransferMoneyRequestDTO.getAccount()); @@ -359,7 +398,7 @@ public class GamesPGServiceImpl implements IGamesService { .build(); ApiExchangeTransferStatusResponseDTO apiNGResponseDTOData = apiNGResponseDTO.getData(); if (!ObjectUtils.isEmpty(apiNGResponseDTOData)) { - transferStatusResponseDTO.setBalance(apiNGResponseDTOData.getAmount()); + transferStatusResponseDTO.setBalance(apiNGResponseDTOData.getAmount().abs()); transferStatusResponseDTO.setCoinBefore(NumberUtil.sub(apiNGResponseDTOData.getAmount(), apiNGResponseDTOData.getAfterBalance()).abs()); transferStatusResponseDTO.setCoinAfter(apiNGResponseDTOData.getAfterBalance()); } diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java index 5523c06..9f58d3b 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java @@ -15,6 +15,7 @@ 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.base.utils.uuid.IdUtils; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; import com.ff.game.api.fc.dto.ApiFCGameListResponseDTO; @@ -243,6 +244,10 @@ public class GamesPGTServiceImpl implements IGamesService { gameService.insertGame(game); } else { game = games.get(0); + List nameInfos = new ArrayList<>(); + nameInfos.add(NameInfo.builder().lang("en-US").name(gameIdKey.getName()).build()); + game.setNameInfo(nameInfos); + gameService.updateGame(game); } gameIdKey.setSystemGameId(game.getGameId()); } @@ -256,7 +261,16 @@ public class GamesPGTServiceImpl implements IGamesService { } return CacheConstants.PGT_GAMES; } - + /** + * 获取交易id + * + * @param transactionIdRequestDTO 事务id请求dto + * @return {@link String } + */ + @Override + public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) { + return gameExchangeMoneyService.getTransactionId(GamePlatforms.PGT.getInfo(), 17); + } /** * 按代理id进行交换转账 * diff --git a/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXBetHistoryResponse.java b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXBetHistoryResponse.java index 3dc564e..3a587da 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXBetHistoryResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXBetHistoryResponse.java @@ -79,13 +79,13 @@ public class PGXBetHistoryResponse { * 下注时间 (玩家实际的投注时间) 依据 GMT/UTC +0 时区 */ @JsonProperty("start_time") - private Date startTime; + private String startTime; /** * 结算时间 (String类型) 依据 GMT/UTC +0 时区 */ @JsonProperty("end_time") - private Date endTime; + private String endTime; /** * 开赛时间 (String类型) 依据 GMT/UTC +0 时区 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 0492158..7469ef3 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 @@ -251,6 +251,10 @@ public class GamesPGXServiceImpl implements IGamesService { gameService.insertGame(game); } else { game = games.get(0); + List nameInfos = new ArrayList<>(); + nameInfos.add(new NameInfo(gamesDataDTO.getGameName(), "en-US")); + game.setNameInfo(nameInfos); + gameService.updateGame(game); } gamesDataDTO.setSystemGameId(game.getGameId()); @@ -430,6 +434,21 @@ public class GamesPGXServiceImpl implements IGamesService { } } + + + /** + * 获取交易id + * + * @param transactionIdRequestDTO 事务id请求dto + * @return {@link String } + */ + @Override + public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) { + return gameExchangeMoneyService.getTransactionId(GamePlatforms.PGX.getInfo(), 17); + } + + + /** * 赠送免费局数 * @@ -585,6 +604,7 @@ public class GamesPGXServiceImpl implements IGamesService { payoffAmount = NumberUtil.sub(payout, resultBean.getBet()).negate(); gameStatus = GameStatus.FAIL.getCode(); } + long endTime = DateUtils.convertToMillisWithTimezone(resultBean.getEndTime(), "UTC"); //数据构造 GameBettingDetails gameBettingDetails = GameBettingDetails.builder() .tenantKey(member.getTenantKey()) @@ -602,11 +622,11 @@ public class GamesPGXServiceImpl implements IGamesService { .gameCurrencyCode(/*currencyDTO.getCurrency()*/gamesDataBuildDTO.getCurrencyCode()) .account(resultBean.getMember()) .wagersId(String.valueOf(resultBean.getId())) - .wagersTime(resultBean.getStartTime().getTime()) + .wagersTime(DateUtils.convertToMillisWithTimezone(resultBean.getStartTime(),"UTC")) .betAmount(resultBean.getBet()) - .payoffTime(resultBean.getEndTime().getTime()) + .payoffTime(endTime) .payoffAmount(payoffAmount) - .settlementTime(resultBean.getEndTime().getTime()) + .settlementTime(endTime) .turnover(resultBean.getTurnover()) .settlementStatus(PGXBetRecordStatus.findSystemCodeByCode(resultBean.getStatus())) .build(); diff --git a/ff-game/src/main/java/com/ff/game/api/request/TransactionIdRequestDTO.java b/ff-game/src/main/java/com/ff/game/api/request/TransactionIdRequestDTO.java new file mode 100644 index 0000000..2a285fa --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/request/TransactionIdRequestDTO.java @@ -0,0 +1,25 @@ +package com.ff.game.api.request; + +import com.ff.base.annotation.Excel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 事务id请求dto + * + * @author shi + * @date 2025/04/11 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class TransactionIdRequestDTO { + /** 转出类型 1游戏商转入到用户全部转出 2 用户转移到游戏商 3 游戏商转移额度到平台商 */ + private Integer exchangeType; + + /** 游戏账号 */ + private String gameAccount; +} 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 9011d9d..060055c 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 @@ -10,6 +10,7 @@ import com.ff.base.exception.base.ApiException; import com.ff.base.system.service.ISysConfigService; import com.ff.base.utils.*; 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.request.*; @@ -240,11 +241,34 @@ public class GamesSAServiceImpl implements IGamesService { game.setGameId(StringUtils.addSuffix(GamePlatforms.SA.getCode(), 1)); game.setNameInfo(nameInfos); gameService.updateGame(game); + }else { + List nameInfos = new ArrayList<>(); + nameInfos.add(new NameInfo("真人棋牌", "zh-CN"));; + game.setNameInfo(nameInfos); + gameService.updateGame(game); } return CacheConstants.SA_GAMES; } + /** + * 获取交易id + * + * @param transactionIdRequestDTO 事务id请求dto + * @return {@link String } + */ + @Override + public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) { + //判断是转入还是转出 + String transactionId = "OUT" + DateUtils.dateTimeNow() + transactionIdRequestDTO.getGameAccount(); + if (!TransferType.ALL.getCode().equals(transactionIdRequestDTO.getExchangeType())) { + transactionId = "IN" + DateUtils.dateTimeNow() + transactionIdRequestDTO.getGameAccount(); + } + + return transactionId; + } + + /** * 按代理id进行交换转账 * diff --git a/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java index 4c17c2e..97fc897 100644 --- a/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/sv388/impl/SV388GamesServiceImpl.java @@ -199,7 +199,7 @@ public class SV388GamesServiceImpl implements IGamesService { List gameList = gameService.selectGameList(condition); Platform platform = gamesBaseRequestDTO.getVendor(); //不存在这个游戏 - if (ObjectUtils.isEmpty(gameList)) { + if (CollectionUtils.isEmpty(gameList)) { Game game = new Game(); game.setId(IdUtil.getSnowflakeNextId()); game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.SV388.getCode()) + 1); @@ -215,6 +215,15 @@ public class SV388GamesServiceImpl implements IGamesService { game.setNameInfo(Collections.singletonList(nameInfo)); game.setGameId(StringUtils.addSuffix(GamePlatforms.SV388.getCode(), 1)); gameService.insertGame(game); + }else { + for (Game game : gameList) { + NameInfo nameInfo = new NameInfo(); + nameInfo.setLang("zh-CN"); + nameInfo.setName("SV388真人"); + game.setNameInfo(Collections.singletonList(nameInfo)); + gameService.updateGame(game); + } + } return CacheConstants.SV388_GAMES; } @@ -275,6 +284,17 @@ public class SV388GamesServiceImpl implements IGamesService { return exchangeMoney.getId(); } + /** + * 获取交易id + * + * @param transactionIdRequestDTO 事务id请求dto + * @return {@link String } + */ + @Override + public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) { + return GamePlatforms.SV388.getCode() + IdUtils.simpleUUID(); + } + /** * 汇兑转移状态 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 ba9de37..3aea090 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 @@ -197,7 +197,16 @@ public class GamesXKServiceImpl implements IGamesService { throw new BaseException(xkLoginWithoutRedirectResponseDTO.getMsg()); } } - + /** + * 获取交易id + * + * @param transactionIdRequestDTO 事务id请求dto + * @return {@link String } + */ + @Override + public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) { + return GamePlatforms.XK.getCode() + IdUtils.simpleUUID(); + } /** * 获取游戏列表 @@ -251,6 +260,11 @@ public class GamesXKServiceImpl implements IGamesService { gameService.insertGame(game); } else { game = games.get(0); + List nameInfos = new ArrayList<>(); + nameInfos.add(new NameInfo(gamesDataDTO.getName(), "zh-CN")); + game.setNameInfo(nameInfos); + + gameService.updateGame(game); } gamesDataDTO.setSystemGameId(game.getGameId()); } From 88bdfc9c16113ec6d181c62c11b1cd4807e5cd30 Mon Sep 17 00:00:00 2001 From: shi Date: Fri, 11 Apr 2025 15:20:58 +0800 Subject: [PATCH 52/62] =?UTF-8?q?refactor(ff-game):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E4=BD=99=E9=A2=9D=E8=BD=AC=E7=A7=BB=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除冗余的平台和货币信息查询逻辑 - 使用 GameExchangeDTO封装余额转移数据 -引入 StepProcessorFactory 处理余额转移步骤 - 实现异步执行余额转移操作 -优化错误处理和日志记录 --- .../java/com/ff/quartz/task/GameTask.java | 63 ++++++++----------- 1 file changed, 27 insertions(+), 36 deletions(-) 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 882bbf0..e229e60 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 @@ -1,11 +1,16 @@ package com.ff.quartz.task; +import com.ff.api.response.GameExchangeBalanceResponse; import com.ff.base.constant.Constants; -import com.ff.base.enums.GamePlatforms; -import com.ff.base.enums.StatusType; +import com.ff.base.core.domain.AjaxResult; +import com.ff.base.enums.*; +import com.ff.base.manager.AsyncManager; import com.ff.base.utils.DateUtils; import com.ff.base.utils.StringUtils; +import com.ff.base.utils.bean.BeanUtils; import com.ff.game.api.IGamesService; +import com.ff.game.api.exchange.StepProcessorFactory; +import com.ff.game.api.exchange.dto.GameExchangeDTO; import com.ff.game.api.ng.client.NGClient; import com.ff.game.api.request.BetRecordByTimeDTO; import com.ff.game.api.request.ExchangeTransferStatusRequestDTO; @@ -52,6 +57,9 @@ public class GameTask { @Resource private IPlatformService platformService; + + @Resource + private StepProcessorFactory stepProcessorFactory; /** * 同步游戏列表 */ @@ -207,42 +215,25 @@ public class GameTask { List gameExchangeMoneyList = gameExchangeMoneyService.selectGameExchangeMoneyList(GameExchangeMoney.builder().status(StatusType.IN_PROGRESS.getValue()).build()); for (GameExchangeMoney exchangeMoney : gameExchangeMoneyList) { try { - Platform platform = platformService.get(exchangeMoney.getPlatformCode()); - if (null == platform) { - log.error("平台不存在platformCode:{}", exchangeMoney.getPlatformCode()); - continue; - } - - List keyInfos = platform.getKeyInfo(); - KeyInfo keyInfo = null; - for (KeyInfo keyData : keyInfos) { - if (keyData.getCurrency().equalsIgnoreCase(exchangeMoney.getCurrencyCode())) { - keyInfo = keyData; - break; - } - } - if (null == keyInfo) { - log.error("平台不存在currencyCode:{}", exchangeMoney.getCurrencyCode()); - continue; - } - String targetCurrency = platform.getCurrencyInfo().get(exchangeMoney.getCurrencyCode()); - if (StringUtils.isEmpty(targetCurrency)) { - log.error("平台不存在currencyCode:{}", exchangeMoney.getCurrencyCode()); - continue; - } Member member = memberService.selectMemberById(exchangeMoney.getMemberId()); - ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO(); - exchangeTransferStatusRequestDTO.setAccount(member.getGameAccount()); - exchangeTransferStatusRequestDTO.setCurrency(targetCurrency); - exchangeTransferStatusRequestDTO.setOrderId(exchangeMoney.getTransactionId()); - exchangeTransferStatusRequestDTO.setAgentId(keyInfo.getCode()); - exchangeTransferStatusRequestDTO.setAgentKey(keyInfo.getKey()); - exchangeTransferStatusRequestDTO.setGameExchangeMoneyId(exchangeMoney.getId()); - exchangeTransferStatusRequestDTO.setVendor(platform); - exchangeTransferStatusRequestDTO.setKeyInfo(keyInfo); - exchangeTransferStatusRequestDTO.setSystemCurrency(exchangeMoney.getCurrencyCode()); - gamesService.get(exchangeMoney.getPlatformCode() + Constants.SERVICE).exchangeTransferStatus(exchangeTransferStatusRequestDTO); + GameExchangeDTO gameExchangeDTO=new GameExchangeDTO(); + BeanUtils.copyProperties(exchangeMoney,gameExchangeDTO); + gameExchangeDTO.setTriggerType(TriggerType.TIMER.getCode()); + gameExchangeDTO.setGameAccount(member.getGameAccount()); + gameExchangeDTO.setMemberAccount(member.getMemberAccount()); + AsyncManager.me().executeOrdered( + exchangeMoney.getOrderId(), + () -> { + try { + stepProcessorFactory.getStepProcessor(GameExchangeStep.CREATE_ORDER).process(gameExchangeDTO); + } catch (Exception e) { + log.error("GameTask [updateGameExchangeMoney] 余额转移失败 gameExchangeMoneyId {}", gameExchangeDTO.getId(),e); + stepProcessorFactory.getStepProcessor(GameExchangeStep.getByCode(exchangeMoney.getStep())).rollBack(gameExchangeDTO); + } + + } + ); } catch (Exception e) { log.error("查询 更新交易记录失败,错误信息 {}", e); } From 724d5f8f060e1eaab3a4926df485a36a9dd5f15d Mon Sep 17 00:00:00 2001 From: shi Date: Fri, 11 Apr 2025 15:47:42 +0800 Subject: [PATCH 53/62] =?UTF-8?q?feat(game):=20=E5=AE=9E=E7=8E=B0=E4=BD=99?= =?UTF-8?q?=E9=A2=9D=E8=BD=AC=E7=A7=BB=E7=8A=B6=E6=80=81=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增余额转移状态查询接口和相关 DTO 类- 完善定时任务处理逻辑,增加步进状态处理 - 优化游戏兑换货币相关逻辑,增加空列表判断 - 修复美天游戏同步记录方法中的类型转换问题 - 完善平台交易服务中的异常处理 --- .../impl/DeductBalanceServiceImpl.java | 4 + .../impl/PlatformTransactionServiceImpl.java | 3 + .../meitian/impl/MeiTianGameServiceImpl.java | 2 +- .../com/ff/game/api/sa/client/SAClient.java | 8 ++ .../sa/dto/SACheckOrderDetailsResponse.java | 74 +++++++++++++++++++ .../game/api/sa/impl/GamesSAServiceImpl.java | 23 +++++- .../com/ff/game/dto/GameExchangeMoneyDTO.java | 6 ++ .../java/com/ff/quartz/task/GameTask.java | 16 +++- 8 files changed, 132 insertions(+), 4 deletions(-) create mode 100644 ff-game/src/main/java/com/ff/game/api/sa/dto/SACheckOrderDetailsResponse.java diff --git a/ff-game/src/main/java/com/ff/game/api/exchange/impl/DeductBalanceServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/exchange/impl/DeductBalanceServiceImpl.java index 5407d80..984a9a9 100644 --- a/ff-game/src/main/java/com/ff/game/api/exchange/impl/DeductBalanceServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/exchange/impl/DeductBalanceServiceImpl.java @@ -28,6 +28,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.support.TransactionTemplate; +import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.math.BigDecimal; @@ -149,6 +150,9 @@ public class DeductBalanceServiceImpl extends AbstractStepProcessor { .sourceId(String.valueOf(gameExchangeMoney.getId())) .isOut(Boolean.FALSE) .build()); + if (CollectionUtils.isEmpty(tenantGameQuotaFlows)) { + return Boolean.TRUE; + } //取出第一个 TenantGameQuotaFlow tenantGameQuotaFlow = tenantGameQuotaFlows.get(0); return tenantGameQuotaService.balanceChanges(BalanceChangesDTO.builder() diff --git a/ff-game/src/main/java/com/ff/game/api/exchange/impl/PlatformTransactionServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/exchange/impl/PlatformTransactionServiceImpl.java index 104decc..d0e5a2e 100644 --- a/ff-game/src/main/java/com/ff/game/api/exchange/impl/PlatformTransactionServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/exchange/impl/PlatformTransactionServiceImpl.java @@ -113,6 +113,9 @@ public class PlatformTransactionServiceImpl extends AbstractStepProcessor { //订单已成功 if (StatusType.SUCCESS.getValue().equals(statusResponseDTO.getStatusType())) { return Boolean.TRUE; + }else { + //定时任务失败直接回滚 + throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); } } 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 62c5742..22cb71f 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 @@ -464,7 +464,7 @@ public class MeiTianGameServiceImpl implements IGamesService { boolean doSyncRecordByRecordID(BetRecordByTimeDTO betRecordByTimeDTO) { String configKey = GamePlatforms.MT.getCode() + ":lastSyncRecordID"; - long recordID = redisCache.getCacheObject(configKey); + Long recordID = redisCache.getCacheObject(configKey); //String lastRecordID = sysConfigServiceImpl.selectConfigByKey(configKey); /*if (lastRecordID == null || lastRecordID.isEmpty()) { diff --git a/ff-game/src/main/java/com/ff/game/api/sa/client/SAClient.java b/ff-game/src/main/java/com/ff/game/api/sa/client/SAClient.java index 8631f0d..886e95d 100644 --- a/ff-game/src/main/java/com/ff/game/api/sa/client/SAClient.java +++ b/ff-game/src/main/java/com/ff/game/api/sa/client/SAClient.java @@ -65,6 +65,14 @@ public interface SAClient { String exchangeTransferByInto(@Body String params); + + @Post( url ="/api.aspx/CheckOrderDetailsDV", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + String exchangeTransferStatus(@Body String params); + + /** * 外汇转出 * diff --git a/ff-game/src/main/java/com/ff/game/api/sa/dto/SACheckOrderDetailsResponse.java b/ff-game/src/main/java/com/ff/game/api/sa/dto/SACheckOrderDetailsResponse.java new file mode 100644 index 0000000..0132407 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/sa/dto/SACheckOrderDetailsResponse.java @@ -0,0 +1,74 @@ +package com.ff.game.api.sa.dto; + +import lombok.Data; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.math.BigDecimal; +import java.util.Date; + +/** + * CheckOrderDetailsResponse - XML 响应的 Java 类映射 + */ +@Data +@XmlAccessorType(XmlAccessType.FIELD) +@XmlRootElement(name = "CheckOrderDetailsResponse") +public class SACheckOrderDetailsResponse { + + /** + * 错误消息ID + */ + @XmlElement(name = "ErrorMsgId") + private Integer errorMsgId; + + /** + * 错误消息 + */ + @XmlElement(name = "ErrorMsg") + private String errorMsg; + + /** + * 是否存在 + */ + @XmlElement(name = "isExist") + private Boolean isExist; + + /** + * 日期 + */ + @XmlElement(name = "Date") + private Date date; + + /** + * 类型 + */ + @XmlElement(name = "Type") + private Integer type; + + /** + * 货币 + */ + @XmlElement(name = "Currency") + private String currency; + + /** + * 金额 + */ + @XmlElement(name = "Amount") + private BigDecimal amount; + + /** + * 上一余额 + */ + @XmlElement(name = "PreviousBalance") + private BigDecimal previousBalance; + + /** + * 当前余额 + */ + @XmlElement(name = "Balance") + private BigDecimal balance; + +} \ No newline at end of file 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 060055c..36ee3c7 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 @@ -361,7 +361,28 @@ public class GamesSAServiceImpl implements IGamesService { */ @Override public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { - throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + Map params = new LinkedHashMap<>(); + params.put("OrderId", exchangeTransferMoneyRequestDTO.getOrderId()); + String query = JsonUtil.mapToQueryString(params); + exchangeTransferMoneyRequestDTO.setQuery(query); + String key = this.getKey(exchangeTransferMoneyRequestDTO, "CheckOrderDetailsDV"); + String result = SAClient.exchangeTransferByInto(key); + SACheckOrderDetailsResponse saCheckOrderDetailsResponse = XmlUtils.xmlDecrypt(result, SACheckOrderDetailsResponse.class); + Integer errorCode = saCheckOrderDetailsResponse.getErrorMsgId(); + //判断是否转移成功 + Integer status = StatusType.IN_PROGRESS.getValue(); + if (this.getIsSuccess(errorCode)) { + status = StatusType.SUCCESS.getValue(); + } else { + status = StatusType.FAILURE.getValue(); + } + + return ExchangeTransferStatusResponseDTO.builder() + .statusType(status) + .balance(saCheckOrderDetailsResponse.getAmount()) + .coinBefore(saCheckOrderDetailsResponse.getPreviousBalance()) + .coinAfter(saCheckOrderDetailsResponse.getBalance()) + .build(); } diff --git a/ff-game/src/main/java/com/ff/game/dto/GameExchangeMoneyDTO.java b/ff-game/src/main/java/com/ff/game/dto/GameExchangeMoneyDTO.java index f505d6b..066940c 100644 --- a/ff-game/src/main/java/com/ff/game/dto/GameExchangeMoneyDTO.java +++ b/ff-game/src/main/java/com/ff/game/dto/GameExchangeMoneyDTO.java @@ -2,7 +2,10 @@ package com.ff.game.dto; import com.ff.game.domain.GameBettingDetails; import com.ff.game.domain.GameExchangeMoney; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; /** * 游戏兑换货币dto @@ -11,6 +14,9 @@ import lombok.Data; * @date 2025/02/27 */ @Data +@SuperBuilder +@AllArgsConstructor +@NoArgsConstructor public class GameExchangeMoneyDTO extends GameExchangeMoney { /** * 会员帐户 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 e229e60..50e40be 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 @@ -28,6 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -212,11 +213,17 @@ public class GameTask { } public void updateGameExchangeMoney() { - List gameExchangeMoneyList = gameExchangeMoneyService.selectGameExchangeMoneyList(GameExchangeMoney.builder().status(StatusType.IN_PROGRESS.getValue()).build()); + GameExchangeMoney gameExchangeMoney = GameExchangeMoney.builder().status(StatusType.IN_PROGRESS.getValue()).build(); + Map params=new HashMap<>(); + params.put("endTime",DateUtils.addOrSubtractMinutes( DateUtils.getNowDate(),-30)); + gameExchangeMoney.setParams(params); + List gameExchangeMoneyList = gameExchangeMoneyService.selectGameExchangeMoneyList(gameExchangeMoney); for (GameExchangeMoney exchangeMoney : gameExchangeMoneyList) { try { Member member = memberService.selectMemberById(exchangeMoney.getMemberId()); + Integer step = exchangeMoney.getStep(); + Integer stepStatus = exchangeMoney.getStepStatus(); GameExchangeDTO gameExchangeDTO=new GameExchangeDTO(); BeanUtils.copyProperties(exchangeMoney,gameExchangeDTO); gameExchangeDTO.setTriggerType(TriggerType.TIMER.getCode()); @@ -226,7 +233,12 @@ public class GameTask { exchangeMoney.getOrderId(), () -> { try { - stepProcessorFactory.getStepProcessor(GameExchangeStep.CREATE_ORDER).process(gameExchangeDTO); + GameExchangeStep gameExchangeStep = GameExchangeStep.getByCode(step); + if (stepStatus == GameExchangeStepStatus.SUCCESS.getCode()){ + gameExchangeStep = stepProcessorFactory.getStepProcessor(GameExchangeStep.getByCode(step)).nextStepProcessor(); + } + + stepProcessorFactory.getStepProcessor(gameExchangeStep).process(gameExchangeDTO); } catch (Exception e) { log.error("GameTask [updateGameExchangeMoney] 余额转移失败 gameExchangeMoneyId {}", gameExchangeDTO.getId(),e); stepProcessorFactory.getStepProcessor(GameExchangeStep.getByCode(exchangeMoney.getStep())).rollBack(gameExchangeDTO); From 39dcd026c004f6df227677cdb41365f0f8a04fa0 Mon Sep 17 00:00:00 2001 From: shi Date: Fri, 11 Apr 2025 16:13:15 +0800 Subject: [PATCH 54/62] =?UTF-8?q?fix(game):=20=E4=BF=AE=E5=A4=8D=E6=B8=B8?= =?UTF-8?q?=E6=88=8F=E4=BD=99=E9=A2=9D=E6=89=A3=E9=99=A4=E5=92=8C=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=9B=9E=E6=BB=9A=E7=9B=B8=E5=85=B3=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在扣除余额时增加检查,避免重复回滚增加余额 -调整订单状态更新的定时任务执行频率,从每30分钟改为每5分钟 -优化平台交易状态查询逻辑,避免不必要的错误提示 --- .../impl/DeductBalanceServiceImpl.java | 14 ++++++++++ .../impl/PlatformTransactionServiceImpl.java | 26 ++++++------------- .../java/com/ff/quartz/task/GameTask.java | 2 +- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/ff-game/src/main/java/com/ff/game/api/exchange/impl/DeductBalanceServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/exchange/impl/DeductBalanceServiceImpl.java index 984a9a9..a400b1c 100644 --- a/ff-game/src/main/java/com/ff/game/api/exchange/impl/DeductBalanceServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/exchange/impl/DeductBalanceServiceImpl.java @@ -145,7 +145,21 @@ public class DeductBalanceServiceImpl extends AbstractStepProcessor { } TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); + + //如果该订单已经回滚过增加余额 List tenantGameQuotaFlows = tenantGameQuotaFlowService.selectTenantGameQuotaFlowList( + TenantGameQuotaFlow.builder() + .sourceId(String.valueOf(gameExchangeMoney.getId())) + .isOut(Boolean.TRUE) + .build()); + if (!CollectionUtils.isEmpty(tenantGameQuotaFlows)){ + return Boolean.TRUE; + } + + + + + tenantGameQuotaFlows = tenantGameQuotaFlowService.selectTenantGameQuotaFlowList( TenantGameQuotaFlow.builder() .sourceId(String.valueOf(gameExchangeMoney.getId())) .isOut(Boolean.FALSE) diff --git a/ff-game/src/main/java/com/ff/game/api/exchange/impl/PlatformTransactionServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/exchange/impl/PlatformTransactionServiceImpl.java index d0e5a2e..f0c5798 100644 --- a/ff-game/src/main/java/com/ff/game/api/exchange/impl/PlatformTransactionServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/exchange/impl/PlatformTransactionServiceImpl.java @@ -74,8 +74,11 @@ public class PlatformTransactionServiceImpl extends AbstractStepProcessor { */ @Override public boolean doProcess(GameExchangeDTO gameExchangeMoney) { - //如果不是之前的步骤代码执行过了 - if (!gameExchangeMoney.getStep().equals(this.backStepProcessor().getCode())) { + //如果不是之前的步骤代码执行过了 或者当前步骤成功的 + if (!gameExchangeMoney.getStep().equals(this.backStepProcessor().getCode())&& + (GameExchangeStep.PLATFORM_TRANSACTION.getCode().equals(gameExchangeMoney.getStep())&& + gameExchangeMoney.getStepStatus().equals(GameExchangeStepStatus.SUCCESS.getCode())) + ) { return Boolean.TRUE; } @@ -99,22 +102,9 @@ public class PlatformTransactionServiceImpl extends AbstractStepProcessor { //查询订单详情 if (TriggerType.TIMER.getCode() == gameExchangeMoney.getTriggerType()) { - ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO(); - exchangeTransferStatusRequestDTO.setAccount(member.getGameAccount()); - exchangeTransferStatusRequestDTO.setCurrency(targetCurrency); - exchangeTransferStatusRequestDTO.setOrderId(gameExchangeMoney.getTransactionId()); - exchangeTransferStatusRequestDTO.setAgentId(keyInfo.getCode()); - exchangeTransferStatusRequestDTO.setAgentKey(keyInfo.getKey()); - exchangeTransferStatusRequestDTO.setGameExchangeMoneyId(gameExchangeMoney.getId()); - exchangeTransferStatusRequestDTO.setVendor(platform); - exchangeTransferStatusRequestDTO.setKeyInfo(keyInfo); - exchangeTransferStatusRequestDTO.setSystemCurrency(gameExchangeMoney.getCurrencyCode()); - ExchangeTransferStatusResponseDTO statusResponseDTO = iGamesService.exchangeTransferStatus(exchangeTransferStatusRequestDTO); - //订单已成功 - if (StatusType.SUCCESS.getValue().equals(statusResponseDTO.getStatusType())) { - return Boolean.TRUE; - }else { - //定时任务失败直接回滚 + //做二次确认调订单详情接口 + this.doRollBack(gameExchangeMoney); + if (GameExchangeStepStatus.FAILURE.getCode() == gameExchangeMoney.getStepStatus()){ throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); } } 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 50e40be..0a7ec13 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 @@ -215,7 +215,7 @@ public class GameTask { public void updateGameExchangeMoney() { GameExchangeMoney gameExchangeMoney = GameExchangeMoney.builder().status(StatusType.IN_PROGRESS.getValue()).build(); Map params=new HashMap<>(); - params.put("endTime",DateUtils.addOrSubtractMinutes( DateUtils.getNowDate(),-30)); + params.put("endTime",DateUtils.addOrSubtractMinutes( DateUtils.getNowDate(),-5)); gameExchangeMoney.setParams(params); List gameExchangeMoneyList = gameExchangeMoneyService.selectGameExchangeMoneyList(gameExchangeMoney); for (GameExchangeMoney exchangeMoney : gameExchangeMoneyList) { From d2ced1154d1e7c759eb591bb61ebb6fdfa7ee3c1 Mon Sep 17 00:00:00 2001 From: shi Date: Fri, 11 Apr 2025 16:58:57 +0800 Subject: [PATCH 55/62] =?UTF-8?q?refactor(game):=20=E6=81=A2=E5=A4=8D=20DB?= =?UTF-8?q?Sports=20=E5=AE=9E=E6=97=B6=E8=AE=B0=E5=BD=95=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=8F=82=E6=95=B0=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重新启用 getRealtimeRecord 接口中 startTime 和 endTime 参数 - 移除测试用的硬编码时间值 -优化代码格式和缩进 --- .../java/com/ff/game/api/db/impl/DBSportsServiceImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ff-game/src/main/java/com/ff/game/api/db/impl/DBSportsServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/db/impl/DBSportsServiceImpl.java index 3c6db7f..a2d158b 100644 --- a/ff-game/src/main/java/com/ff/game/api/db/impl/DBSportsServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/db/impl/DBSportsServiceImpl.java @@ -212,6 +212,7 @@ public class DBSportsServiceImpl implements IGamesService { } return exchangeMoney.getId(); } + /** * 获取交易id * @@ -220,7 +221,7 @@ public class DBSportsServiceImpl implements IGamesService { */ @Override public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) { - return gameExchangeMoneyService.getTransactionId(GamePlatforms.DBSports.getInfo(), 11); + return gameExchangeMoneyService.getTransactionId(GamePlatforms.DBSports.getInfo(), 11); } /** @@ -388,8 +389,8 @@ public class DBSportsServiceImpl implements IGamesService { void getRealtimeRecord(BetRecordByTimeDTO requestDTO, int pageNum) { GetBetListRequest request = new GetBetListRequest(); - request.setStartTime(/*String.valueOf(requestDTO.getStartTime())*/ "1744333220000"); - request.setEndTime(/*String.valueOf(requestDTO.getEndTime())*/ "1744335020000"); + request.setStartTime(String.valueOf(requestDTO.getStartTime())); + request.setEndTime(String.valueOf(requestDTO.getEndTime())); request.setMerchantCode(requestDTO.getAgentId()); request.setPageNum(pageNum); request.setPageSize(1000); From dda84a866ecde19deee8257a63593745395cd3d2 Mon Sep 17 00:00:00 2001 From: shi Date: Fri, 11 Apr 2025 17:28:38 +0800 Subject: [PATCH 56/62] =?UTF-8?q?refactor(game):=20=E6=81=A2=E5=A4=8D=20DB?= =?UTF-8?q?Sports=20=E5=AE=9E=E6=97=B6=E8=AE=B0=E5=BD=95=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=8F=82=E6=95=B0=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重新启用 getRealtimeRecord 接口中 startTime 和 endTime 参数 - 移除测试用的硬编码时间值 -优化代码格式和缩进 --- .../com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java index 9f58d3b..5a5d076 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java @@ -622,7 +622,12 @@ public class GamesPGTServiceImpl implements IGamesService { 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()); - + Integer gameStatus =GameStatus.FLAT.getCode(); + if (resultBean.getPayout().compareTo(resultBean.getStake())>0){ + gameStatus=GameStatus.WIN.getCode(); + }else if (resultBean.getPayout().compareTo(resultBean.getStake())<0){ + gameStatus=GameStatus.FAIL.getCode(); + } //数据构造 GameBettingDetails gameBettingDetails = GameBettingDetails.builder() @@ -636,7 +641,7 @@ public class GamesPGTServiceImpl implements IGamesService { //.gameId(gamesDataDTO.getSystemGameId()) .gameId(gamesDataDTO.getSystemGameId()) .gameName(gamesDataDTO.getName()) - .gameStatus(PGTPayoutStatus.getByCode(resultBean.getPayoutStatus()).getSystemCode()) + .gameStatus(gameStatus) .gameStatusType(1) .gameCurrencyCode(resultBean.getCurrency()) .account(resultBean.getUsername()) From 908194d767dd8ffcba75b826d42dbddc75e3d586 Mon Sep 17 00:00:00 2001 From: shi Date: Fri, 11 Apr 2025 18:14:42 +0800 Subject: [PATCH 57/62] =?UTF-8?q?refactor(game):=20=E6=81=A2=E5=A4=8D=20DB?= =?UTF-8?q?Sports=20=E5=AE=9E=E6=97=B6=E8=AE=B0=E5=BD=95=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=8F=82=E6=95=B0=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重新启用 getRealtimeRecord 接口中 startTime 和 endTime 参数 - 移除测试用的硬编码时间值 -优化代码格式和缩进 --- ff-game/src/main/resources/mapper/game/GameMapper.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ff-game/src/main/resources/mapper/game/GameMapper.xml b/ff-game/src/main/resources/mapper/game/GameMapper.xml index 48f1b77..3728538 100644 --- a/ff-game/src/main/resources/mapper/game/GameMapper.xml +++ b/ff-game/src/main/resources/mapper/game/GameMapper.xml @@ -11,7 +11,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + @@ -181,7 +181,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + From 82cd1456a5c61218c0bede95a41360d19c69bf89 Mon Sep 17 00:00:00 2001 From: shi Date: Fri, 11 Apr 2025 19:08:48 +0800 Subject: [PATCH 58/62] =?UTF-8?q?refactor(game):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=20ID=20=E7=B1=BB=E5=9E=8B=E5=B9=B6=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -将 ApiGameInfoResponseDTO 中的 systemGameId 字段类型从 Long 改为 String - 在 GameMapper.xml 中添加 game_id 字段的查询 - 更新 GamesPGServiceImpl 中的代码,使用 game.getGameId() 替代 game.getId() --- .../java/com/ff/game/api/ng/dto/ApiGameInfoResponseDTO.java | 2 +- .../com/ff/game/api/ng/service/impl/GamesPGServiceImpl.java | 2 +- ff-game/src/main/resources/mapper/game/GameMapper.xml | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ff-game/src/main/java/com/ff/game/api/ng/dto/ApiGameInfoResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/ng/dto/ApiGameInfoResponseDTO.java index b4e75db..1e31c30 100644 --- a/ff-game/src/main/java/com/ff/game/api/ng/dto/ApiGameInfoResponseDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/ng/dto/ApiGameInfoResponseDTO.java @@ -37,5 +37,5 @@ public class ApiGameInfoResponseDTO { /** * 系统游戏id */ - private Long systemGameId; + private String systemGameId; } 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 f7694ce..8109635 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 @@ -266,7 +266,7 @@ public class GamesPGServiceImpl implements IGamesService { game.setNameInfo(nameInfos); gameService.updateGame(game); } - apiGameInfoResponseDTO.setSystemGameId(game.getId()); + apiGameInfoResponseDTO.setSystemGameId(game.getGameId()); } diff --git a/ff-game/src/main/resources/mapper/game/GameMapper.xml b/ff-game/src/main/resources/mapper/game/GameMapper.xml index 3728538..0a3d659 100644 --- a/ff-game/src/main/resources/mapper/game/GameMapper.xml +++ b/ff-game/src/main/resources/mapper/game/GameMapper.xml @@ -61,7 +61,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" g.create_by, g.create_time, g.update_by, - g.update_time + g.update_time, + g.game_id from ff_game g From f097c0f8aadd424b190a016266b72fcc6719398e Mon Sep 17 00:00:00 2001 From: shi Date: Fri, 11 Apr 2025 19:15:47 +0800 Subject: [PATCH 59/62] =?UTF-8?q?refactor(game):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=20ID=20=E7=B1=BB=E5=9E=8B=E5=B9=B6=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -将 ApiGameInfoResponseDTO 中的 systemGameId 字段类型从 Long 改为 String - 在 GameMapper.xml 中添加 game_id 字段的查询 - 更新 GamesPGServiceImpl 中的代码,使用 game.getGameId() 替代 game.getId() --- .../java/com/ff/api/response/GameBettingDetailsResponse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ff-game/src/main/java/com/ff/api/response/GameBettingDetailsResponse.java b/ff-game/src/main/java/com/ff/api/response/GameBettingDetailsResponse.java index 8e6b3b5..4ad32de 100644 --- a/ff-game/src/main/java/com/ff/api/response/GameBettingDetailsResponse.java +++ b/ff-game/src/main/java/com/ff/api/response/GameBettingDetailsResponse.java @@ -38,7 +38,7 @@ public class GameBettingDetailsResponse implements Serializable /** 游戏id */ - private Long gameId; + private String gameId; /** 游戏类型 ff_game_type 字典 */ private Integer gameType; From e12fd287be4a284766a882aeedd958cc5dc8cefb Mon Sep 17 00:00:00 2001 From: shi Date: Fri, 11 Apr 2025 19:43:01 +0800 Subject: [PATCH 60/62] =?UTF-8?q?refactor(game):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=20ID=20=E7=B1=BB=E5=9E=8B=E5=B9=B6=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -将 ApiGameInfoResponseDTO 中的 systemGameId 字段类型从 Long 改为 String - 在 GameMapper.xml 中添加 game_id 字段的查询 - 更新 GamesPGServiceImpl 中的代码,使用 game.getGameId() 替代 game.getId() --- ff-base/src/main/java/com/ff/base/enums/PlatformType.java | 2 +- .../main/java/com/ff/game/api/ae/impl/GamesAEServiceImpl.java | 4 ++-- .../com/ff/game/api/dg/service/impl/GamesDGServiceImpl.java | 2 +- .../main/java/com/ff/game/api/sa/impl/GamesSAServiceImpl.java | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ff-base/src/main/java/com/ff/base/enums/PlatformType.java b/ff-base/src/main/java/com/ff/base/enums/PlatformType.java index 06385cf..530d9e6 100644 --- a/ff-base/src/main/java/com/ff/base/enums/PlatformType.java +++ b/ff-base/src/main/java/com/ff/base/enums/PlatformType.java @@ -18,7 +18,7 @@ public enum PlatformType { GAME_HALL(3, "游戏大厅"), FISHING(4, "捕鱼"), BETTING_MACHINE(5, "押分机 (含宾果)"), - VIDEO(6, "视讯"), + VIDEO(6, "真人视讯"), LOTTERY(7, "彩票"), SPORTS(8, "体育"), HUNTING(9, "捕猎"), 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 df220be..7804bda 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 @@ -205,9 +205,9 @@ public class GamesAEServiceImpl implements IGamesService { if (ObjectUtils.isEmpty(game)) { game = new Game(); game.setId(GAME_ID); - game.setSortNo(gameService.selectMaxSortNo(PlatformType.GAME_HALL.getCode(), GamePlatforms.AE.getCode()) + 1); + game.setSortNo(gameService.selectMaxSortNo(PlatformType.VIDEO.getCode(), GamePlatforms.AE.getCode()) + 1); game.setPlatformCode(platform.getPlatformCode()); - game.setPlatformType(PlatformType.GAME_HALL.getCode()); + game.setPlatformType(PlatformType.VIDEO.getCode()); game.setGameCode("1"); game.setGameSourceType(String.valueOf(1)); game.setGameName("AE大厅"); 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 9f5f776..e1e9a1d 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 @@ -196,7 +196,7 @@ public class GamesDGServiceImpl implements IGamesService { game.setId(GAME_ID); game.setSortNo(1); game.setPlatformCode(GamePlatforms.DG.getCode()); - game.setPlatformType(PlatformType.GAME_HALL.getCode()); + game.setPlatformType(PlatformType.VIDEO.getCode()); game.setGameCode("1"); game.setGameSourceType(String.valueOf(1)); game.setGameName("真人棋牌"); 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 36ee3c7..5b78a26 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 @@ -224,7 +224,7 @@ public class GamesSAServiceImpl implements IGamesService { public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) { Game game = gameService.selectGameById(GAME_ID); - Integer platformType = PlatformType.CARD_GAME.getCode(); + Integer platformType = PlatformType.VIDEO.getCode(); //不存在这个游戏 if (ObjectUtils.isEmpty(game)) { game = new Game(); From 16f83851e58d8bcda4bd34d1f2ae007d62174651 Mon Sep 17 00:00:00 2001 From: shi Date: Sat, 12 Apr 2025 09:38:51 +0800 Subject: [PATCH 61/62] =?UTF-8?q?feat(fc):=20=E4=BC=98=E5=8C=96=20FC=20?= =?UTF-8?q?=E5=9C=B0=E5=9D=80=E6=9D=A5=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 UrlInfo 类中添加 https 和 host 字段,用于存储 HTTPS 协议和端口信息 - 修改 MyFCAddressSource 类中的 getAddress 方法,使用新的 https 和 host 字段 -通过这些改动,提高了地址信息的灵活性和可配置性 --- .../com/ff/game/api/fc/address/MyFCAddressSource.java | 6 +++++- ff-game/src/main/java/com/ff/game/domain/UrlInfo.java | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/ff-game/src/main/java/com/ff/game/api/fc/address/MyFCAddressSource.java b/ff-game/src/main/java/com/ff/game/api/fc/address/MyFCAddressSource.java index a7edbdf..529c7c9 100644 --- a/ff-game/src/main/java/com/ff/game/api/fc/address/MyFCAddressSource.java +++ b/ff-game/src/main/java/com/ff/game/api/fc/address/MyFCAddressSource.java @@ -20,6 +20,10 @@ public class MyFCAddressSource implements AddressSource { public ForestAddress getAddress(ForestRequest request) { String apiBaseUrl = platformService.get(GamePlatforms.FC.getCode()) .getUrlInfo().getUrl(); - return new ForestAddress("https", apiBaseUrl, 443, ""); + String https = platformService.get(GamePlatforms.FC.getCode()) + .getUrlInfo().getHttps(); + String host = platformService.get(GamePlatforms.FC.getCode()) + .getUrlInfo().getHost(); + return new ForestAddress(https, apiBaseUrl, Integer.valueOf(host), ""); } } 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 2dfb5bf..e76a9b5 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,6 +13,15 @@ public class UrlInfo implements Serializable { private String url; private String loginUrl; private String hallCode; + /** + * HTTPS协议 + */ + private String https; + + /** + * 端口 + */ + private String host; /** * 投注网址 */ From 5a62a0c6a5dd80f4cc0b73acdd1aecf8caf5088a Mon Sep 17 00:00:00 2001 From: shi Date: Sat, 12 Apr 2025 10:13:27 +0800 Subject: [PATCH 62/62] =?UTF-8?q?feat(game):=20=E6=B7=BB=E5=8A=A0=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E7=AE=A1=E7=90=86=E5=85=A8=E9=83=A8=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=B9=B6=E4=BC=98=E5=8C=96=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 GamePlatformController 中添加了获取所有平台信息的接口 - 优化了 SysLoginController 中的验证码校验逻辑 - 新增了平台服务的依赖注入 - 添加了权限控制注解 --- .../controller/GamePlatformController.java | 19 +++++++++++++++++++ .../com/ff/system/SysLoginController.java | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/ff-game/src/main/java/com/ff/game/controller/GamePlatformController.java b/ff-game/src/main/java/com/ff/game/controller/GamePlatformController.java index cc87b71..cca88be 100644 --- a/ff-game/src/main/java/com/ff/game/controller/GamePlatformController.java +++ b/ff-game/src/main/java/com/ff/game/controller/GamePlatformController.java @@ -3,10 +3,14 @@ package com.ff.game.controller; import com.ff.base.core.controller.BaseController; import com.ff.base.core.domain.AjaxResult; import com.ff.base.enums.GamePlatforms; +import com.ff.game.service.IPlatformService; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.annotation.Resource; + /** * 平台管理Controller * @@ -18,6 +22,9 @@ import org.springframework.web.bind.annotation.RestController; public class GamePlatformController extends BaseController { + @Resource + private IPlatformService platformService; + /** * 选择 * @@ -28,4 +35,16 @@ public class GamePlatformController extends BaseController { return AjaxResult.success(GamePlatforms.getCodes()); } + + /** + * 所有 + * + * @return {@link AjaxResult } + */ + @PreAuthorize("@ss.hasPermi('game:platform:all')") + @GetMapping("/all") + public AjaxResult all() { + platformService.loadToCache(); + return AjaxResult.success(); + } } diff --git a/ff-game/src/main/java/com/ff/system/SysLoginController.java b/ff-game/src/main/java/com/ff/system/SysLoginController.java index 848d244..e67eb1a 100644 --- a/ff-game/src/main/java/com/ff/system/SysLoginController.java +++ b/ff-game/src/main/java/com/ff/system/SysLoginController.java @@ -67,7 +67,7 @@ public class SysLoginController { // 生成令牌 String token = ""; // 验证码校验 - loginService.validateCaptcha(loginBody.getUsername(), loginBody.getCode(), loginBody.getUuid()); + // loginService.validateCaptcha(loginBody.getUsername(), loginBody.getCode(), loginBody.getUuid()); // 登录前置校验 loginService.loginPreCheck(loginBody.getUsername(), loginBody.getPassword()); if (LoginType.TENANT.getValue().equals(loginBody.getLoginType())) {