From 02388446db1e5452d262e0f74789e9c1ab75af82 Mon Sep 17 00:00:00 2001 From: shi Date: Thu, 13 Feb 2025 15:43:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(game):=20=E6=B7=BB=E5=8A=A0=E6=B8=B8?= =?UTF-8?q?=E6=88=8F=E7=9B=B8=E5=85=B3API=E6=8E=A5=E5=8F=A3=E5=92=8C?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增免费旋转相关功能:赠送免费局数、获取免费旋转记录等 - 新增游戏记录查询功能:获取游戏详情、获取投注记录等 - 新增游戏踢人功能:踢出指定玩家、踢出所有玩家 - 优化游戏账户创建逻辑 --- .../ff/api/controller/ApiGameController.java | 208 ++++++++- .../api/controller/ApiMemberController.java | 28 +- .../request/GameCancelFreeSpinRequest.java | 40 ++ .../request/GameCreateFreeSpinRequest.java | 83 ++++ .../api/request/GameGetBetRecordRequest.java | 66 +++ .../ff/api/request/GameGetDetailRequest.java | 49 +++ .../GameGetFreeSpinDashflowRequest.java | 57 +++ .../request/GameKickMemeberAllRequest.java | 35 ++ .../api/request/GameKickMemeberRequest.java | 44 ++ .../java/com/ff/game/api/IGamesService.java | 5 +- .../ff/game/api/jili/client/JILIClient.java | 74 +++- .../service/impl/GamesJILIServiceImpl.java | 361 +++++++-------- .../api/request/CancelFreeSpinRequestDTO.java | 6 + .../api/request/CreateFreeSpinRequestDTO.java | 7 + .../game/api/request/GamesDataBuildDTO.java | 5 +- .../api/request/GetGameDetailRequestDTO.java | 9 + .../ff/game/api/request/KickMemberAllDTO.java | 15 +- .../api/request/KickMemberRequestDTO.java | 7 + .../api/xk/address/MyXKAddressSource.java | 31 ++ .../com/ff/game/api/xk/client/XKClient.java | 93 ++++ .../xk/service/impl/GamesXKServiceImpl.java | 414 ++++++++---------- .../com/ff/game/domain/GameFreeRecord.java | 14 +- .../com/ff/game/domain/GameSecretKey.java | 7 + .../game/mapper/GameBettingDetailsMapper.java | 19 + .../service/IGameBettingDetailsService.java | 22 + .../impl/GameBettingDetailsServiceImpl.java | 23 + .../java/com/ff/quartz/task/GameTask.java | 117 +++++ .../java/com/ff/validation/ListSizeCheck.java | 48 ++ .../com/ff/validation/ListSizeValidator.java | 31 ++ .../mapper/game/GameBettingDetailsMapper.xml | 55 +++ .../mapper/game/GameFreeRecordMapper.xml | 7 +- .../mapper/game/GameBettingDetailsMapper.xml | 55 +++ .../mapper/game/GameFreeRecordMapper.xml | 7 +- .../java/com/ff/base/enums/XKGameType.java | 4 +- .../com/ff/base/enums/XKGameType.class | Bin 4090 -> 4137 bytes 35 files changed, 1577 insertions(+), 469 deletions(-) create mode 100644 ff-admin/src/main/java/com/ff/api/request/GameCancelFreeSpinRequest.java create mode 100644 ff-admin/src/main/java/com/ff/api/request/GameCreateFreeSpinRequest.java create mode 100644 ff-admin/src/main/java/com/ff/api/request/GameGetBetRecordRequest.java create mode 100644 ff-admin/src/main/java/com/ff/api/request/GameGetDetailRequest.java create mode 100644 ff-admin/src/main/java/com/ff/api/request/GameGetFreeSpinDashflowRequest.java create mode 100644 ff-admin/src/main/java/com/ff/api/request/GameKickMemeberAllRequest.java create mode 100644 ff-admin/src/main/java/com/ff/api/request/GameKickMemeberRequest.java create mode 100644 ff-admin/src/main/java/com/ff/game/api/xk/address/MyXKAddressSource.java create mode 100644 ff-admin/src/main/java/com/ff/game/api/xk/client/XKClient.java create mode 100644 ff-admin/src/main/java/com/ff/quartz/task/GameTask.java create mode 100644 ff-admin/src/main/java/com/ff/validation/ListSizeCheck.java create mode 100644 ff-admin/src/main/java/com/ff/validation/ListSizeValidator.java diff --git a/ff-admin/src/main/java/com/ff/api/controller/ApiGameController.java b/ff-admin/src/main/java/com/ff/api/controller/ApiGameController.java index ce3b7e1..b90de86 100644 --- a/ff-admin/src/main/java/com/ff/api/controller/ApiGameController.java +++ b/ff-admin/src/main/java/com/ff/api/controller/ApiGameController.java @@ -2,15 +2,14 @@ package com.ff.api.controller; import cn.hutool.core.util.NumberUtil; +import com.dtflys.forest.annotation.Post; import com.ff.annotation.CheckHeader; -import com.ff.api.request.GameExchangeBalanceRequest; -import com.ff.api.request.GameLoginRequest; -import com.ff.api.request.MemberCreateApiRequest; +import com.ff.api.request.*; 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.OperationType; -import com.ff.base.utils.SecurityUtils; import com.ff.base.utils.StringUtils; import com.ff.common.domain.TenantGameQuotaFlow; import com.ff.common.domain.TenantSecretKey; @@ -20,17 +19,15 @@ import com.ff.common.service.ITenantGameQuotaService; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; import com.ff.game.api.request.*; -import com.ff.game.domain.Game; -import com.ff.game.domain.GamePlatform; -import com.ff.game.domain.GameSecretKey; -import com.ff.game.service.IGamePlatformService; -import com.ff.game.service.IGameSecretKeyService; -import com.ff.game.service.IGameService; +import com.ff.game.domain.*; +import com.ff.game.service.*; import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; +import com.github.pagehelper.PageHelper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -39,6 +36,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.math.BigDecimal; +import java.util.List; import java.util.Map; /** @@ -80,6 +78,12 @@ public class ApiGameController extends BaseController { @Resource private ITenantGameQuotaFlowService tenantGameQuotaFlowService; + @Resource + private IGameBettingDetailsService gameBettingDetailsService; + + @Resource + private IGameFreeRecordService gameFreeRecordService; + /** * 登录 @@ -174,9 +178,9 @@ public class ApiGameController extends BaseController { .tenantKey(tenantSecretKey.getTenantKey()) .memberId(member.getId()) .build()); - //如果转入金额+本次转入金额 大于转出额度则取差值 - if (NumberUtil.add(balanceInto, balanceRequestAmount).compareTo(balanceOut) > 0){ - balanceRequestAmount=NumberUtil.sub(balanceOut, balanceInto); + //如果转入金额+本次转入金额 大于转出额度则取差值 + if (NumberUtil.add(balanceInto, balanceRequestAmount).compareTo(balanceOut) > 0) { + balanceRequestAmount = NumberUtil.sub(balanceOut, balanceInto); } } //余额扣除 @@ -205,4 +209,182 @@ public class ApiGameController extends BaseController { } + /** + * 赠送免费局数 + * + * @param gameCreateFreeSpinRequest 游戏创建免费旋转请求 + * @return {@link AjaxResult } + */ + @PostMapping("/create/free/spin") + public AjaxResult createFreeSpin(@Validated @RequestBody GameCreateFreeSpinRequest gameCreateFreeSpinRequest) { + + + IGamesService iGamesService = gamesService.get(gameCreateFreeSpinRequest.getPlatformCode() + Constants.SERVICE); + Assert.notNull(iGamesService, "游戏平台不存在"); + + + TenantSecretKey tenantSecretKey = keyConfig.get(); + GameSecretKey gameSecretKey = gameSecretKeyService.findSecretKeyByPlatformAndSystemCode(gameCreateFreeSpinRequest.getPlatformCode(), gameCreateFreeSpinRequest.getCurrencyCode()); + Assert.notNull(gameSecretKey, "货币游戏平台不存在"); + + + Member member = memberService.selectMemberByGameAccount(StringUtils.addSuffix(gameCreateFreeSpinRequest.getAccount(), gameCreateFreeSpinRequest.getCurrencyCode() + tenantSecretKey.getTenantSn())); + Assert.notNull(member, "会员不存在"); + CreateFreeSpinRequestDTO createFreeSpinRequestDTO = CreateFreeSpinRequestDTO.builder() + .account(member.getGameAccount()) + .currency(gameCreateFreeSpinRequest.getCurrencyCode()) + .agentId(gameSecretKey.getCode()) + .agentKey(gameSecretKey.getKey()) + .referenceId(gameCreateFreeSpinRequest.getReferenceId()) + .freeSpinValidity(gameCreateFreeSpinRequest.getFreeSpinValidity()) + .numberOfRounds(gameCreateFreeSpinRequest.getNumberOfRounds()) + .gameIds(gameCreateFreeSpinRequest.getGameIds()) + .betValue(gameCreateFreeSpinRequest.getBetValue()) + .startTime(gameCreateFreeSpinRequest.getStartTime()) + .build(); + + + return AjaxResult.success(iGamesService.createFreeSpin(createFreeSpinRequestDTO)); + } + + + /** + * 获取投注记录 + * + * @param gameCreateFreeSpinRequest 游戏创建免费旋转请求 + * @return {@link AjaxResult } + */ + @PostMapping("/get/bet/record") + public TableDataInfo createFreeSpin(@Validated @RequestBody GameGetBetRecordRequest gameCreateFreeSpinRequest) { + startPage(); + PageHelper.startPage(gameCreateFreeSpinRequest.getPageNo(), gameCreateFreeSpinRequest.getPageSize(), "wagers_time desc"); + GameBettingDetails gameBettingDetails = GameBettingDetails.builder() + .platformCode(gameCreateFreeSpinRequest.getPlatformCode()) + .currencyCode(gameCreateFreeSpinRequest.getCurrencyCode()) + .build(); + Map params = gameBettingDetails.getParams(); + params.put("beginTime", gameCreateFreeSpinRequest.getBeginTime()); + params.put("endTime", gameCreateFreeSpinRequest.getEndTime()); + List bettingDetails = gameBettingDetailsService.selectGameBettingDetailsList(gameBettingDetails); + return getDataTable(bettingDetails); + } + + + /** + * 获取详细信息 + * + * @param gameGetDetailRequest 游戏获取详细信息请求 + * @return {@link AjaxResult } + */ + @PostMapping("/get/detail") + public AjaxResult getDetail(@Validated @RequestBody GameGetDetailRequest gameGetDetailRequest) { + + GameSecretKey gameSecretKey = gameSecretKeyService.findSecretKeyByPlatformAndSystemCode(gameGetDetailRequest.getPlatformCode(), gameGetDetailRequest.getCurrencyCode()); + Assert.notNull(gameSecretKey, "货币游戏平台不存在"); + + + IGamesService iGamesService = gamesService.get(gameGetDetailRequest.getPlatformCode() + Constants.SERVICE); + Assert.notNull(iGamesService, "游戏平台不存在"); + + GameSecretKey gameSecretKeyLang = gameSecretKeyService.findByPlatformAndSystemLangCode(gameGetDetailRequest.getPlatformCode(), gameGetDetailRequest.getLangCode()); + Assert.notNull(gameSecretKeyLang, "当前语言不存在"); + + + GetGameDetailResponseDTO gameDetail = iGamesService.getGameDetail(GetGameDetailRequestDTO.builder() + .wagersId(gameGetDetailRequest.getWagersId()) + .lang(gameSecretKeyLang.getLang()) + .agentId(gameSecretKey.getCode()) + .agentKey(gameSecretKey.getKey()) + .build()); + return AjaxResult.success(gameDetail); + } + + /** + * 踢腿队员 + * + * @param gameKickMemeberRequest 游戏踢迷请求 + * @return {@link AjaxResult } + */ + @PostMapping("/kick/member") + public AjaxResult kickMember(@Validated @RequestBody GameKickMemeberRequest gameKickMemeberRequest) { + GameSecretKey gameSecretKey = gameSecretKeyService.findSecretKeyByPlatformAndSystemCode(gameKickMemeberRequest.getPlatformCode(), gameKickMemeberRequest.getCurrencyCode()); + Assert.notNull(gameSecretKey, "货币游戏平台不存在"); + + TenantSecretKey tenantSecretKey = keyConfig.get(); + Member member = memberService.selectMemberByGameAccount(StringUtils.addSuffix(gameKickMemeberRequest.getAccount(), gameKickMemeberRequest.getCurrencyCode() + tenantSecretKey.getTenantSn())); + Assert.notNull(member, "会员不存在"); + + IGamesService iGamesService = gamesService.get(gameKickMemeberRequest.getPlatformCode() + Constants.SERVICE); + Assert.notNull(iGamesService, "游戏平台不存在"); + + + return AjaxResult.success(iGamesService.kickMember(KickMemberRequestDTO.builder() + .account(member.getGameAccount()) + .agentId(gameSecretKey.getCode()) + .agentKey(gameSecretKey.getKey()) + .build())); + } + + @PostMapping("/kick/member/all") + public AjaxResult kickMemberAll(@Validated @RequestBody GameKickMemeberAllRequest gameKickMemeberAllRequest) { + GameSecretKey gameSecretKey = gameSecretKeyService.findSecretKeyByPlatformAndSystemCode(gameKickMemeberAllRequest.getPlatformCode(), gameKickMemeberAllRequest.getCurrencyCode()); + Assert.notNull(gameSecretKey, "货币游戏平台不存在"); + + IGamesService iGamesService = gamesService.get(gameKickMemeberAllRequest.getPlatformCode() + Constants.SERVICE); + Assert.notNull(iGamesService, "游戏平台不存在"); + + KickMemberAllDTO kickMemberAllDTO = KickMemberAllDTO.builder() + .agentId(gameSecretKey.getCode()) + .agentKey(gameSecretKey.getKey()) + .build(); + if (!ObjectUtils.isEmpty(gameKickMemeberAllRequest.getGameId())) { + Game game = gameService.selectGameById(gameKickMemeberAllRequest.getGameId()); + Assert.notNull(game, "游戏不存在"); + kickMemberAllDTO.setGameId(game.getGameCode()); + } + + + return AjaxResult.success(iGamesService.kickMemberAll(kickMemberAllDTO)); + + } + + /** + * 获得自由旋转气流 + * + * @param gameGetFreeSpinDashflowRequest 游戏获得免费旋转dashflow请求 + * @return {@link TableDataInfo } + */ + @PostMapping("/get/free/spin/dashflow") + public TableDataInfo getFreeSpinDashflow(@Validated @RequestBody GameGetFreeSpinDashflowRequest gameGetFreeSpinDashflowRequest) { + PageHelper.startPage(gameGetFreeSpinDashflowRequest.getPageNo(), gameGetFreeSpinDashflowRequest.getPageSize(), "free_update_time desc"); + List gameFreeRecords = gameFreeRecordService.selectGameFreeRecordList(GameFreeRecord.builder() + .gameId(gameGetFreeSpinDashflowRequest.getGameId()) + .platformCode(gameGetFreeSpinDashflowRequest.getPlatformCode()) + .currencyCode(gameGetFreeSpinDashflowRequest.getCurrencyCode()) + .build()); + return getDataTable(gameFreeRecords); + } + + + /** + * 取消自由旋转 + * + * @param gameGetFreeSpinDashflowRequest 游戏获得免费旋转dashflow请求 + * @return {@link TableDataInfo } + */ + @PostMapping("/cancel/free/spin") + public AjaxResult cancelFreeSpin(@Validated @RequestBody GameCancelFreeSpinRequest gameGetFreeSpinDashflowRequest) { + GameSecretKey gameSecretKey = gameSecretKeyService.findSecretKeyByPlatformAndSystemCode(gameGetFreeSpinDashflowRequest.getPlatformCode(), gameGetFreeSpinDashflowRequest.getCurrencyCode()); + Assert.notNull(gameSecretKey, "货币游戏平台不存在"); + + IGamesService iGamesService = gamesService.get(gameGetFreeSpinDashflowRequest.getPlatformCode() + Constants.SERVICE); + Assert.notNull(iGamesService, "游戏平台不存在"); + + Boolean cancelFreeSpin = iGamesService.cancelFreeSpin(CancelFreeSpinRequestDTO.builder() + .agentId(gameSecretKey.getCode()) + .agentKey(gameSecretKey.getKey()) + .referenceId(gameGetFreeSpinDashflowRequest.getReferenceId()) + .build()); + return AjaxResult.success(cancelFreeSpin); + } } diff --git a/ff-admin/src/main/java/com/ff/api/controller/ApiMemberController.java b/ff-admin/src/main/java/com/ff/api/controller/ApiMemberController.java index 33bdb11..92470ca 100644 --- a/ff-admin/src/main/java/com/ff/api/controller/ApiMemberController.java +++ b/ff-admin/src/main/java/com/ff/api/controller/ApiMemberController.java @@ -20,10 +20,12 @@ import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.util.List; import java.util.Map; /** @@ -82,15 +84,22 @@ public class ApiMemberController extends BaseController { .build(); Boolean result = iGamesService.createMember(gamesBaseRequestDTO); Assert.isTrue(result, "建立游戏账号失败"); - //注册本地账号 - Member member = Member.builder() - .tenantKey(tenantSecretKey.getTenantKey()) - .memberAccount(memberCreateApiRequest.getAccount()) - .gameAccount(gameAccount) - .platformCode(memberCreateApiRequest.getPlatformCode()) - .currencyCode(memberCreateApiRequest.getCurrencyCode()) - .build(); - return toAjax(memberService.insertMember(member)); + + List members = memberService.selectMemberList(Member.builder() + .tenantKey(tenantSecretKey.getTenantKey()).memberAccount(memberCreateApiRequest.getAccount()).build()); + if (CollectionUtils.isEmpty(members)) { + //注册本地账号 + Member member = Member.builder() + .tenantKey(tenantSecretKey.getTenantKey()) + .memberAccount(memberCreateApiRequest.getAccount()) + .gameAccount(gameAccount) + .platformCode(memberCreateApiRequest.getPlatformCode()) + .currencyCode(memberCreateApiRequest.getCurrencyCode()) + .build(); + return toAjax(memberService.insertMember(member)); + } + return toAjax(Boolean.TRUE); + } @@ -123,5 +132,4 @@ public class ApiMemberController extends BaseController { } - } diff --git a/ff-admin/src/main/java/com/ff/api/request/GameCancelFreeSpinRequest.java b/ff-admin/src/main/java/com/ff/api/request/GameCancelFreeSpinRequest.java new file mode 100644 index 0000000..6392be7 --- /dev/null +++ b/ff-admin/src/main/java/com/ff/api/request/GameCancelFreeSpinRequest.java @@ -0,0 +1,40 @@ +package com.ff.api.request; + +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 游戏获得免费游戏游玩记录 + * + * @author shi + * @date 2025/02/13 + */ +@Data +public class GameCancelFreeSpinRequest implements Serializable { + private static final long serialVersionUID = 1871368632132480179L; + + /** + * 货币代码 + */ + @NotBlank(message = "currencyCode不能为空") + private String currencyCode; + + /** + * 平台代码 + */ + @NotBlank(message = "platformCode不能为空") + private String platformCode; + + /** + * 取消免费赠送游戏id + */ + @NotBlank(message = "referenceId不能为空") + private String referenceId; + + + +} diff --git a/ff-admin/src/main/java/com/ff/api/request/GameCreateFreeSpinRequest.java b/ff-admin/src/main/java/com/ff/api/request/GameCreateFreeSpinRequest.java new file mode 100644 index 0000000..8fb6354 --- /dev/null +++ b/ff-admin/src/main/java/com/ff/api/request/GameCreateFreeSpinRequest.java @@ -0,0 +1,83 @@ +package com.ff.api.request; + + +import com.ff.validation.ListSizeCheck; +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.math.BigDecimal; +import java.util.List; + + +/** + * 游戏赠送免费的局数 + * + * @author shi + * @date 2025/02/12 + */ +@Data +public class GameCreateFreeSpinRequest implements Serializable { + private final static long serialVersionUID = -8079805496329012394L; + + /** + * 玩家账号 (JILI 新玩家则会自动创立账号) + */ + @NotBlank(message = "account不能为空") + private String account; + + /** + * 玩家游戏平台 + */ + @NotBlank(message = "platformCode不能为空") + private String platformCode; + + /** + * 玩家使用货币 + */ + @NotBlank(message = "currencyCode不能为空") + private String currencyCode; + + /** + * 免费局数序号, 长度上限 40 + */ + @NotBlank(message = "referenceId不能为空") + @Length(min = 1, max = 40, message = "referenceId长度不能超过40") + private String referenceId; + + /** + * 有效期限 + * + * + */ + @NotNull(message = "freeSpinValidity不能为空") + private Long freeSpinValidity; + + /** + * 局数 + */ + @NotNull(message = "numberOfRounds不能为空") + private Integer numberOfRounds; + + /** + * 可使用游戏 ID, + * 长度 上限 200 + */ + @NotNull(message = "gameIds不能为空") + @ListSizeCheck(message = "gameIds不得超过200", maxSize = 200) + private List gameIds; + + /** + * 指定投注额; + * 未指定时, 一律使用游戏中的最小投注额 + */ + private BigDecimal betValue; + + /** + * 免费游戏局数可使用的开始时间 + * 未带此参数时, 赠送后玩家可以立即使用 + */ + private Long startTime; +} diff --git a/ff-admin/src/main/java/com/ff/api/request/GameGetBetRecordRequest.java b/ff-admin/src/main/java/com/ff/api/request/GameGetBetRecordRequest.java new file mode 100644 index 0000000..d00f95b --- /dev/null +++ b/ff-admin/src/main/java/com/ff/api/request/GameGetBetRecordRequest.java @@ -0,0 +1,66 @@ +package com.ff.api.request; + + +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + + +/** + * 游戏获取投注记录请求 + * + * @author shi + * @date 2025/02/12 + */ +@Data +public class GameGetBetRecordRequest implements Serializable { + private final static long serialVersionUID = -8079805496329012394L; + + + /** + * 货币代码 + */ + @NotBlank(message = "currencyCode不能为空") + private String currencyCode; + + /** + * 平台代码 + */ + @NotBlank(message = "platformCode不能为空") + private String platformCode; + + /** + * 开始时间 毫秒时间戳 + */ + @NotNull(message = "beginTime不能为空") + private Long beginTime; + + /** + * 结束时间 毫秒时间戳 + */ + @NotNull(message = "endTime不能为空") + private Long endTime; + + + /** + * 页码,默认第1页,按订单更新时间正序返回数据 + */ + @Min(value = 1, message = "pageNo最小值为1") + private Integer pageNo=1; + + + + /** + * 页容量,默认200,最大2000 + */ + @Min(value = 1, message = "pageSize最小值为1") + @Max(value = 2000, message = "pageSize最大值为2000") + private Integer pageSize=200; + + + +} diff --git a/ff-admin/src/main/java/com/ff/api/request/GameGetDetailRequest.java b/ff-admin/src/main/java/com/ff/api/request/GameGetDetailRequest.java new file mode 100644 index 0000000..1f6ba5d --- /dev/null +++ b/ff-admin/src/main/java/com/ff/api/request/GameGetDetailRequest.java @@ -0,0 +1,49 @@ +package com.ff.api.request; + + +import com.ff.validation.ListSizeCheck; +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.math.BigDecimal; +import java.util.List; + + +/** + * 游戏赠送免费的局数 + * + * @author shi + * @date 2025/02/12 + */ +@Data +public class GameGetDetailRequest implements Serializable { + private final static long serialVersionUID = -8079805496329012394L; + + /** + * 平台代码 + */ + @NotBlank(message = "platformCode不能为空") + private String platformCode; + + /** + * 货币代码 + */ + @NotBlank(message = "currencyCode不能为空") + private String currencyCode; + + /** + * 投注id + */ + @NotNull(message = "wagersId不能为空") + private Long wagersId; + + /** + * 语言代码 + */ + @NotBlank(message = "langCode不能为空") + private String langCode; + +} diff --git a/ff-admin/src/main/java/com/ff/api/request/GameGetFreeSpinDashflowRequest.java b/ff-admin/src/main/java/com/ff/api/request/GameGetFreeSpinDashflowRequest.java new file mode 100644 index 0000000..bd30e66 --- /dev/null +++ b/ff-admin/src/main/java/com/ff/api/request/GameGetFreeSpinDashflowRequest.java @@ -0,0 +1,57 @@ +package com.ff.api.request; + +import com.dtflys.forest.annotation.BaseRequest; +import com.ff.base.core.domain.BaseEntity; +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 游戏获得免费游戏游玩记录 + * + * @author shi + * @date 2025/02/13 + */ +@Data +public class GameGetFreeSpinDashflowRequest implements Serializable { + private static final long serialVersionUID = 1871368632132480179L; + + /** + * 货币代码 + */ + @NotBlank(message = "currencyCode不能为空") + private String currencyCode; + + /** + * 平台代码 + */ + @NotBlank(message = "platformCode不能为空") + private String platformCode; + + + /** + * 游戏id + */ + private Long gameId; + + + /** + * 页码,默认第1页,按订单更新时间正序返回数据 + */ + @Min(value = 1, message = "pageNo最小值为1") + private Integer pageNo=1; + + + + /** + * 页容量,默认200,最大2000 + */ + @Min(value = 1, message = "pageSize最小值为1") + @Max(value = 2000, message = "pageSize最大值为2000") + private Integer pageSize=200; + +} diff --git a/ff-admin/src/main/java/com/ff/api/request/GameKickMemeberAllRequest.java b/ff-admin/src/main/java/com/ff/api/request/GameKickMemeberAllRequest.java new file mode 100644 index 0000000..00575d0 --- /dev/null +++ b/ff-admin/src/main/java/com/ff/api/request/GameKickMemeberAllRequest.java @@ -0,0 +1,35 @@ +package com.ff.api.request; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 游戏踢迷所有请求 + * + * @author shi + * @date 2025/02/12 + */ +@Data +public class GameKickMemeberAllRequest implements Serializable { + private static final long serialVersionUID = -5550133375734112801L; + + /** + * 玩家游戏平台 + */ + @NotBlank(message = "platformCode不能为空") + private String platformCode; + + /** + * 玩家使用货币 + */ + @NotBlank(message = "currencyCode不能为空") + private String currencyCode; + + /** + * 游戏id + */ + private Long gameId; +} diff --git a/ff-admin/src/main/java/com/ff/api/request/GameKickMemeberRequest.java b/ff-admin/src/main/java/com/ff/api/request/GameKickMemeberRequest.java new file mode 100644 index 0000000..0e950ac --- /dev/null +++ b/ff-admin/src/main/java/com/ff/api/request/GameKickMemeberRequest.java @@ -0,0 +1,44 @@ +package com.ff.api.request; + + +import com.ff.validation.ListSizeCheck; +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.math.BigDecimal; +import java.util.List; + + +/** + * 游戏赠送免费的局数 + * + * @author shi + * @date 2025/02/12 + */ +@Data +public class GameKickMemeberRequest implements Serializable { + private final static long serialVersionUID = 7977843394391031014L; + + /** + * 玩家账号 + */ + @NotBlank(message = "account不能为空") + private String account; + + /** + * 玩家游戏平台 + */ + @NotBlank(message = "platformCode不能为空") + private String platformCode; + + /** + * 玩家使用货币 + */ + @NotBlank(message = "currencyCode不能为空") + private String currencyCode; + + +} diff --git a/ff-admin/src/main/java/com/ff/game/api/IGamesService.java b/ff-admin/src/main/java/com/ff/game/api/IGamesService.java index e3ef627..7cb04de 100644 --- a/ff-admin/src/main/java/com/ff/game/api/IGamesService.java +++ b/ff-admin/src/main/java/com/ff/game/api/IGamesService.java @@ -69,13 +69,14 @@ public interface IGamesService { */ String exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO); + /** * 按时间获取投注记录 * * @param betRecordByTimeDTO 按时间dto投注记录 - * @return {@link List }<{@link GameBettingDetails }> + * @return {@link Boolean } */ - List getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO); + Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO); /** diff --git a/ff-admin/src/main/java/com/ff/game/api/jili/client/JILIClient.java b/ff-admin/src/main/java/com/ff/game/api/jili/client/JILIClient.java index 82afc1a..bcc4bae 100644 --- a/ff-admin/src/main/java/com/ff/game/api/jili/client/JILIClient.java +++ b/ff-admin/src/main/java/com/ff/game/api/jili/client/JILIClient.java @@ -61,5 +61,77 @@ public interface JILIClient { "Content-type: application/x-www-form-urlencoded" } ) - JILIExchangeMoneyResponseDTO exchangeTransferByAgentId(@Var("parameters") String parameters,@Body("AgentId") String username); + JILIExchangeMoneyResponseDTO exchangeTransferByAgentId(@Var("parameters") String parameters,@Body("AgentId") String agentId); + + /** + * 按时间获取投注记录 + * + * @param parameters 参数 + * @param agentId 代理id + * @return {@link JILIBetRecordResponseDTO } + */ + @Post( + url = "/GetBetRecordByTime?${parameters}", + headers = { + "Content-type: application/x-www-form-urlencoded" + } + ) + JILIBetRecordResponseDTO getBetRecordByTime(@Var("parameters") String parameters,@Body("AgentId") String agentId); + + /** + * 赠送免费局数 + * + * @param parameters 参数 + * @return {@link JILICreateFreeSpinResponseDTO } + */ + @Post( + url = "/CreateFreeSpin?${parameters}", + headers = { + "Content-type: application/x-www-form-urlencoded" + } + ) + JILICreateFreeSpinResponseDTO createFreeSpin(@Var("parameters") String parameters,@Body("AgentId") String agentId); + + /** + * 获取游戏详细信息 + * + * @param parameters 参数 + * @return {@link JILIGetGameDetailResponseDTO } + */ + @Get("/GetGameDetail?${parameters}") + JILIGetGameDetailResponseDTO getGameDetail(@Var("parameters") String parameters); + + /** + * 踢出队员 + * + * @param parameters 参数 + * @return {@link JILIKickMemberDTO } + */ + @Get("/KickMember?${parameters}") + JILIKickMemberDTO kickMember(@Var("parameters") String parameters); + + /** + * 踢出所有队员 + * + * @param parameters 参数 + * @return {@link JILIKickMemberAllDTO } + */ + @Get("/KickMemberAll?${parameters}") + JILIKickMemberAllDTO kickMemberAll(@Var("parameters") String parameters); + + /** + * 免费游戏玩家使用的纪录 + * + * @param parameters 参数 + * @return {@link JILIGetFreeSpinDashflowResponseDTO } + */ + @Post( + url = "/GetFreeSpinDashflow?${parameters}" + ) + JILIGetFreeSpinDashflowResponseDTO getFreeSpinDashflow(@Var("parameters") String parameters); + + @Post( + url = "/CancelFreeSpin?${parameters}" + ) + JILICancelFreeSpinResponseDTO cancelFreeSpin(@Var("parameters") String parameters); } diff --git a/ff-admin/src/main/java/com/ff/game/api/jili/service/impl/GamesJILIServiceImpl.java b/ff-admin/src/main/java/com/ff/game/api/jili/service/impl/GamesJILIServiceImpl.java index 4de956f..14c565e 100644 --- a/ff-admin/src/main/java/com/ff/game/api/jili/service/impl/GamesJILIServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/game/api/jili/service/impl/GamesJILIServiceImpl.java @@ -88,7 +88,8 @@ public class GamesJILIServiceImpl implements IGamesService { @Resource private KeyConfig keyConfig; - + @Resource + private IGameBettingDetailsService gameBettingDetailsService; /** @@ -302,8 +303,6 @@ public class GamesJILIServiceImpl implements IGamesService { Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); - - //获取下一个自增id GameExchangeMoney exchangeMoney = GameExchangeMoney .builder() @@ -359,70 +358,47 @@ public class GamesJILIServiceImpl implements IGamesService { * 按时间获取投注记录 * * @param betRecordByTimeDTO 按时间dto投注记录 - * @return {@link List }<{@link GameBettingDetails }> + * @return {@link Boolean } */ @Override - public List getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { + public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { String startTime = DateUtils.formatDateToGMT4(new Date(betRecordByTimeDTO.getStartTime())); String endTime = DateUtils.formatDateToGMT4(new Date(betRecordByTimeDTO.getEndTime())); - List gameBettingDetails = new ArrayList<>(); + //请求参数 String query = "StartTime=" + startTime + "&EndTime=" + endTime + "&Page=" + betRecordByTimeDTO.getPage() + "&PageLimit=" + betRecordByTimeDTO.getPageLimit() + "&AgentId=" + betRecordByTimeDTO.getAgentId(); log.info("GamesJILIServiceImpl [getBetRecordByTime] 请求参数 {}", query); betRecordByTimeDTO.setQuery(query); //获取key String key = this.getKey(betRecordByTimeDTO); - String apiBaseUrl = configService.selectConfigByKey(Constants.JILI_API_BASE_URL); - String result = null; - try { - result = HttpClientSslUtils.doPost(apiBaseUrl + "/GetBetRecordByTime?" + query + "&Key=" + key, "AgentId=" + betRecordByTimeDTO.getAgentId(), ContentType.APPLICATION_FORM_URLENCODED); - - JILIBetRecordResponseDTO betRecordJILIResponse = JSON.parseObject(result, JILIBetRecordResponseDTO.class); - - //判断是否获取成功 - if (this.getIsSuccess(betRecordJILIResponse.getErrorCode())) { - //数据组装 - JILIBetRecordResponseDTO.DataBean dataBean = betRecordJILIResponse.getData(); - for (JILIBetRecordDataResponseDTO jiliBetRecordDataResponseDTO : dataBean.getResult()) { - GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(jiliBetRecordDataResponseDTO).gamesKey(key).build()); - if (!ObjectUtils.isEmpty(bettingDetails)) { - gameBettingDetails.add(bettingDetails); - } + JILIBetRecordResponseDTO betRecordJILIResponse = jiliClient.getBetRecordByTime(query + "&Key=" + key, betRecordByTimeDTO.getAgentId()); + //判断是否获取成功 + if (this.getIsSuccess(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 = jiliClient.getBetRecordByTime(query + "&Key=" + key, betRecordByTimeDTO.getAgentId()); + if (this.getIsSuccess(betRecordJILIResponse.getErrorCode())) { + //数据插入 + this.batchInsert(betRecordJILIResponse); + } else { + log.error("GameBettingDataJILIServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordJILIResponse.getErrorCode(), betRecordJILIResponse.getMessage()); } - - //获取下一页数据 - 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); - result = HttpUtils.sendPost(apiBaseUrl + "/GetBetRecordByTime?" + query + "&Key=" + key, ""); - betRecordJILIResponse = JsonUtil.stringToObj(result, JILIBetRecordResponseDTO.class); - dataBean = betRecordJILIResponse.getData(); - for (JILIBetRecordDataResponseDTO jiliBetRecordDataResponseDTO : dataBean.getResult()) { - GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(jiliBetRecordDataResponseDTO).gamesKey(key).build()); - if (!ObjectUtils.isEmpty(bettingDetails)) { - gameBettingDetails.add(bettingDetails); - } - } - } - - - return gameBettingDetails; - } else { - log.error("GameBettingDataJILIServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordJILIResponse.getErrorCode(), betRecordJILIResponse.getMessage()); - throw new BaseException(MessageUtils.message("game.bet.record.retrieve.failed")); - } - } catch (Exception e) { - log.error("GameBettingDataJILIServiceImpl [getBetRecordByTime] 获取投注记录失败,错误信息{}", e); - throw new BaseException(MessageUtils.message("game.bet.record.retrieve.failed")); - + } else { + log.error("GameBettingDataJILIServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordJILIResponse.getErrorCode(), betRecordJILIResponse.getMessage()); + return Boolean.FALSE; } - + return Boolean.TRUE; } /** @@ -453,56 +429,58 @@ public class GamesJILIServiceImpl implements IGamesService { + "&FreeSpinValidity=" + freeSpinValidity + "&NumberOfRounds=" + createFreeSpinRequest.getNumberOfRounds() + "&GameIds=" + gameCodes; + + query += "&AgentId=" + createFreeSpinRequest.getAgentId(); + log.info("GamesJILIServiceImpl [createFreeSpin] 请求参数 {}", query); + createFreeSpinRequest.setQuery(query); + //获取key + String key = this.getKey(createFreeSpinRequest); //判断是否有免费游戏局数可使用的开始时间 if (!ObjectUtils.isEmpty(createFreeSpinRequest.getStartTime())) { String startTime = DateUtils.formatDateToGMT4(new Date(createFreeSpinRequest.getStartTime())); query += "&StartTime=" + startTime; } - query += "&AgentId=" + createFreeSpinRequest.getAgentId(); - ; - log.info("GamesJILIServiceImpl [createFreeSpin] 请求参数 {}", query); + //判断是否有免费游戏局数可使用的开始时间 + if (!ObjectUtils.isEmpty(createFreeSpinRequest.getStartTime())) { + String startTime = DateUtils.formatDateToGMT4(new Date(createFreeSpinRequest.getStartTime())); + query += "&StartTime=" + startTime; + } + //指定投注额 + if (ObjectUtils.isEmpty(createFreeSpinRequest.getBetValue())) { + query += "&BetValue=" + createFreeSpinRequest.getBetValue(); + } createFreeSpinRequest.setQuery(query); - //获取key - String key = this.getKey(createFreeSpinRequest); - String apiBaseUrl = configService.selectConfigByKey(Constants.JILI_API_BASE_URL); - String result = null; - try { - result = HttpClientSslUtils.doPost(apiBaseUrl + "/CreateFreeSpin?" + query + "&Key=" + key, "AgentId=" + createFreeSpinRequest.getAgentId(), ContentType.APPLICATION_FORM_URLENCODED); + JILICreateFreeSpinResponseDTO createFreeSpinResponseDTO = jiliClient.createFreeSpin(query + "&Key=" + key, createFreeSpinRequest.getAgentId()); - JILICreateFreeSpinResponseDTO createFreeSpinResponseDTO = JSON.parseObject(result, JILICreateFreeSpinResponseDTO.class); - //判断是否获取成功 - if (this.getIsSuccess(createFreeSpinResponseDTO.getErrorCode())) { - Member member = memberService.selectMemberByMemberAccount(createFreeSpinRequest.getAccount()); - if (ObjectUtils.isEmpty(member)) { - member = new Member(); - } - for (Game game : gameList) { - GameFreeRecord gameFreeRecord = GameFreeRecord.builder() - .currencyCode(gameSecretKeyService.findSystemByCode(createFreeSpinRequest.getAgentId(), GamePlatforms.JILI.getInfo())) - .referenceId(referenceId) - .memberId(member.getId()) - .memberAccount(createFreeSpinRequest.getAccount()) - .gameId(game.getId()) - .sendTime(createFreeSpinRequest.getStartTime()) - .expiredTime(createFreeSpinRequest.getFreeSpinValidity()) - .freeUpdateTime(DateUtils.getNowDate()) - .sendGame(game.getGameName()) - .sendAmount(createFreeSpinRequest.getNumberOfRounds()) - .unusedAmount(createFreeSpinRequest.getNumberOfRounds()) - .build(); - gameFreeRecord.setCreateBy(Constants.SYSTEM); - gameFreeRecordService.insertGameFreeRecord(gameFreeRecord); - } - - return Boolean.TRUE; - } else { - log.error("GameBettingDataJILIServiceImpl [createFreeSpin] 赠送免费局数,错误代码{},错误信息{}", createFreeSpinResponseDTO.getErrorCode(), createFreeSpinResponseDTO.getMessage()); - throw new BaseException(createFreeSpinResponseDTO.getMessage()); + //判断是否获取成功 + if (this.getIsSuccess(createFreeSpinResponseDTO.getErrorCode())) { + Member member = memberService.selectMemberByGameAccount(createFreeSpinRequest.getAccount()); + if (ObjectUtils.isEmpty(member)) { + member = new Member(); + } + for (Game game : gameList) { + GameFreeRecord gameFreeRecord = GameFreeRecord.builder() + .currencyCode(gameSecretKeyService.findSystemByCode(createFreeSpinRequest.getAgentId(), GamePlatforms.JILI.getInfo())) + .referenceId(referenceId) + .platformCode(GamePlatforms.JILI.getInfo()) + .memberId(member.getId()) + .memberAccount(createFreeSpinRequest.getAccount()) + .gameId(game.getId()) + .sendTime(createFreeSpinRequest.getStartTime()) + .expiredTime(createFreeSpinRequest.getFreeSpinValidity()) + .freeUpdateTime(DateUtils.getNowDate()) + .sendGame(game.getGameName()) + .sendAmount(createFreeSpinRequest.getNumberOfRounds()) + .unusedAmount(createFreeSpinRequest.getNumberOfRounds()) + .build(); + gameFreeRecord.setCreateBy(Constants.SYSTEM); + gameFreeRecordService.insertGameFreeRecord(gameFreeRecord); } - } catch (Exception e) { - log.error("GameBettingDataJILIServiceImpl [createFreeSpin] 赠送免费局数,错误信息{}", e); - throw new BaseException(MessageUtils.message("game.free.round.gift.failed")); + return Boolean.TRUE; + } else { + log.error("GameBettingDataJILIServiceImpl [createFreeSpin] 赠送免费局数,错误代码{},错误信息{}", createFreeSpinResponseDTO.getErrorCode(), createFreeSpinResponseDTO.getMessage()); + throw new BaseException(createFreeSpinResponseDTO.getMessage()); } } @@ -524,26 +502,15 @@ public class GamesJILIServiceImpl implements IGamesService { } getGameDetailRequestDTO.setQuery(query); log.info("GamesJILIServiceImpl [getGameDetail] 请求参数 {}", query); - - String apiBaseUrl = configService.selectConfigByKey(Constants.JILI_API_BASE_URL); - try { - - String result = HttpClientSslUtils.doGet(apiBaseUrl + "/GetGameDetailUrl?" + query + "&AgentId=" + getGameDetailRequestDTO.getAgentId() + "&Key=" + key); - JILIGetGameDetailResponseDTO jiliGetGameDetailResponseDTO = JsonUtil.stringToObj(result, JILIGetGameDetailResponseDTO.class); - //判断是否获取成功 - if (this.getIsSuccess(jiliGetGameDetailResponseDTO.getErrorCode())) { - GetGameDetailResponseDTO getGameDetailResponseDTO = new GetGameDetailResponseDTO(); - getGameDetailResponseDTO.setUrl(jiliGetGameDetailResponseDTO.getData().getUrl()); - return getGameDetailResponseDTO; - } else { - log.error("GameBettingDataJILIServiceImpl [getGameDetail] 获取游戏游玩详情失败,错误代码{},错误信息{}", jiliGetGameDetailResponseDTO.getErrorCode(), jiliGetGameDetailResponseDTO.getMessage()); - throw new BaseException(MessageUtils.message("game.play.details.retrieve.failed")); - - } - } catch (Exception e) { - log.error("GameBettingDataJILIServiceImpl [getGameDetail] 获取游戏游玩详情失败,错误信息{}", e); - throw new BaseException(MessageUtils.message("game.play.details.retrieve.failed")); - + JILIGetGameDetailResponseDTO jiliGetGameDetailResponseDTO = jiliClient.getGameDetail(query + "&AgentId=" + getGameDetailRequestDTO.getAgentId() + "&Key=" + key); + //判断是否获取成功 + if (this.getIsSuccess(jiliGetGameDetailResponseDTO.getErrorCode())) { + GetGameDetailResponseDTO getGameDetailResponseDTO = new GetGameDetailResponseDTO(); + getGameDetailResponseDTO.setUrl(jiliGetGameDetailResponseDTO.getData().getUrl()); + return getGameDetailResponseDTO; + } else { + log.error("GameBettingDataJILIServiceImpl [getGameDetail] 获取游戏游玩详情失败,错误代码{},错误信息{}", jiliGetGameDetailResponseDTO.getErrorCode(), jiliGetGameDetailResponseDTO.getMessage()); + throw new BaseException(jiliGetGameDetailResponseDTO.getMessage()); } } @@ -561,22 +528,12 @@ public class GamesJILIServiceImpl implements IGamesService { String key = this.getKey(kickMemberRequestDTO); log.info("GamesJILIServiceImpl [kickMember] 请求参数 {}", query); - String apiBaseUrl = configService.selectConfigByKey(Constants.JILI_API_BASE_URL); - try { - - String result = HttpClientSslUtils.doGet(apiBaseUrl + "/KickMember?" + query + "&AgentId=" + kickMemberRequestDTO.getAgentId() + "&Key=" + key); - JILIKickMemberDTO jiliKickMemberDTO = JsonUtil.stringToObj(result, JILIKickMemberDTO.class); - //判断是否获取成功 - if (this.getIsSuccess(jiliKickMemberDTO.getErrorCode())) { - return Boolean.TRUE; - } else { - log.error("GameBettingDataJILIServiceImpl [kickMember] 强制会员从游戏注销失败,错误代码{},错误信息{}", jiliKickMemberDTO.getErrorCode(), jiliKickMemberDTO.getMessage()); - throw new BaseException(MessageUtils.message("game.member.force.logout.failed")); - - } - } catch (Exception e) { - log.error("GameBettingDataJILIServiceImpl [kickMember] 强制会员从游戏注销失败,错误信息{}", e); - throw new BaseException(MessageUtils.message("game.member.force.logout.failed")); + JILIKickMemberDTO jiliKickMemberDTO = jiliClient.kickMember(query + "&AgentId=" + kickMemberRequestDTO.getAgentId() + "&Key=" + key); + //判断是否获取成功 + if (this.getIsSuccess(jiliKickMemberDTO.getErrorCode())) { + return Boolean.TRUE; + } else { + throw new BaseException(jiliKickMemberDTO.getMessage()); } } @@ -598,24 +555,12 @@ public class GamesJILIServiceImpl implements IGamesService { kickMemberAllDTO.setQuery(query); String key = this.getKey(kickMemberAllDTO); log.info("GamesJILIServiceImpl [kickMemberAll] 请求参数 {}", query); - - String apiBaseUrl = configService.selectConfigByKey(Constants.JILI_API_BASE_URL); - try { - - String result = HttpClientSslUtils.doGet(apiBaseUrl + "/KickMemberAll?" + query + "&Key=" + key); - JILIKickMemberAllDTO jiliKickMemberAllDTO = JsonUtil.stringToObj(result, JILIKickMemberAllDTO.class); - //判断是否获取成功 - if (this.getIsSuccess(jiliKickMemberAllDTO.getErrorCode())) { - return Boolean.TRUE; - } else { - log.error("GameBettingDataJILIServiceImpl [kickMemberAll] 强制全部会员从游戏注销失败,错误代码{},错误信息{}", jiliKickMemberAllDTO.getErrorCode(), jiliKickMemberAllDTO.getMessage()); - throw new BaseException(MessageUtils.message("game.members.force.logout.failed")); - - } - } catch (Exception e) { - log.error("GameBettingDataJILIServiceImpl [kickMemberAll] 强制全部会员从游戏注销失败,错误信息{}", e); - throw new BaseException(MessageUtils.message("game.members.force.logout.failed")); - + JILIKickMemberAllDTO jiliKickMemberAllDTO = jiliClient.kickMemberAll(query + "&AgentId=" + kickMemberAllDTO.getAgentId() + "&Key=" + key); + //判断是否获取成功 + if (this.getIsSuccess(jiliKickMemberAllDTO.getErrorCode())) { + return Boolean.TRUE; + } else { + throw new BaseException(jiliKickMemberAllDTO.getMessage()); } } @@ -636,40 +581,30 @@ public class GamesJILIServiceImpl implements IGamesService { getFreeSpinDashflowRequestDTO.setQuery(query); //获取key String key = this.getKey(getFreeSpinDashflowRequestDTO); - String apiBaseUrl = configService.selectConfigByKey(Constants.JILI_API_BASE_URL); - String result = null; - try { - result = HttpClientSslUtils.doPost(apiBaseUrl + "/GetFreeSpinDashflow?" + query + "&Key=" + key, "AgentId=" + getFreeSpinDashflowRequestDTO.getAgentId(), ContentType.APPLICATION_FORM_URLENCODED); - - JILIGetFreeSpinDashflowResponseDTO getFreeSpinDashflowResponseDTO = JSON.parseObject(result, JILIGetFreeSpinDashflowResponseDTO.class); - //判断是否获取成功 - if (this.getIsSuccess(getFreeSpinDashflowResponseDTO.getErrorCode())) { - for (JILIGetFreeSpinDashflowResponseDTO.DataBean data : getFreeSpinDashflowResponseDTO.getData()) { - List gameFreeRecords = gameFreeRecordService.selectGameFreeRecordList(GameFreeRecord.builder() - .referenceId(data.getReferenceID()) - .build()); - for (GameFreeRecord gameFreeRecord : gameFreeRecords) { - gameFreeRecord.setSendTime(data.getSendTime()); - gameFreeRecord.setExpiredTime(data.getExpiredTime()); - gameFreeRecord.setFreeUpdateTime(data.getUpdateTime()); - gameFreeRecord.setSendAmount(data.getSendAmount()); - gameFreeRecord.setUsedAmount(data.getUsedAmount()); - gameFreeRecord.setUnusedAmount(data.getUnusedAmount()); - gameFreeRecordService.updateGameFreeRecord(gameFreeRecord); - gameFreeRecordsResult.add(gameFreeRecord); - } + JILIGetFreeSpinDashflowResponseDTO getFreeSpinDashflowResponseDTO = jiliClient.getFreeSpinDashflow(query + "&Key=" + key); + //判断是否获取成功 + if (this.getIsSuccess(getFreeSpinDashflowResponseDTO.getErrorCode())) { + for (JILIGetFreeSpinDashflowResponseDTO.DataBean data : getFreeSpinDashflowResponseDTO.getData()) { + List gameFreeRecords = gameFreeRecordService.selectGameFreeRecordList(GameFreeRecord.builder() + .referenceId(data.getReferenceID()) + .build()); + for (GameFreeRecord gameFreeRecord : gameFreeRecords) { + gameFreeRecord.setSendTime(data.getSendTime()); + gameFreeRecord.setExpiredTime(data.getExpiredTime()); + gameFreeRecord.setFreeUpdateTime(data.getUpdateTime()); + gameFreeRecord.setSendAmount(data.getSendAmount()); + gameFreeRecord.setUsedAmount(data.getUsedAmount()); + gameFreeRecord.setUnusedAmount(data.getUnusedAmount()); + gameFreeRecordService.updateGameFreeRecord(gameFreeRecord); + gameFreeRecordsResult.add(gameFreeRecord); } - - return gameFreeRecordsResult; - } else { - log.error("GameBettingDataJILIServiceImpl [getFreeSpinDashflow] 查询免费游戏玩家使用的纪录,错误代码{},错误信息{}", getFreeSpinDashflowResponseDTO.getErrorCode(), getFreeSpinDashflowResponseDTO.getMessage()); - throw new BaseException(getFreeSpinDashflowResponseDTO.getMessage()); } - } catch (Exception e) { - log.error("GameBettingDataJILIServiceImpl [getFreeSpinDashflow] 查询免费游戏玩家使用的纪录,错误信息{}", e); - throw new BaseException(MessageUtils.message("game.free.play.record.query.failed")); + return gameFreeRecordsResult; + } else { + throw new BaseException(getFreeSpinDashflowResponseDTO.getMessage()); } + } /** @@ -688,34 +623,56 @@ public class GamesJILIServiceImpl implements IGamesService { cancelFreeSpinRequestDTO.setQuery(query); //获取key String key = this.getKey(cancelFreeSpinRequestDTO); - String apiBaseUrl = configService.selectConfigByKey(Constants.JILI_API_BASE_URL); - String result = null; - try { - result = HttpClientSslUtils.doPost(apiBaseUrl + "/CancelFreeSpin?" + query + "&Key=" + key, "AgentId=" + cancelFreeSpinRequestDTO.getAgentId(), ContentType.APPLICATION_FORM_URLENCODED); - - JILICancelFreeSpinResponseDTO cancelFreeSpinResponseDTO = JSON.parseObject(result, JILICancelFreeSpinResponseDTO.class); - //判断是否获取成功 - if (this.getIsSuccess(cancelFreeSpinResponseDTO.getErrorCode())) { - List gameFreeRecords = gameFreeRecordService.selectGameFreeRecordList(GameFreeRecord.builder() - .referenceId(cancelFreeSpinRequestDTO.getReferenceId()) - .build()); - for (GameFreeRecord gameFreeRecord : gameFreeRecords) { - gameFreeRecord.setFreeStatus(FreeStatus.CANCEL.getCode()); - gameFreeRecordService.updateGameFreeRecord(gameFreeRecord); - } - return Boolean.TRUE; - } else { - log.error("GameBettingDataJILIServiceImpl [cancelFreeSpin] 取消赠送免费局数,错误代码{},错误信息{}", cancelFreeSpinResponseDTO.getErrorCode(), cancelFreeSpinResponseDTO.getMessage()); - throw new BaseException(cancelFreeSpinResponseDTO.getMessage()); + JILICancelFreeSpinResponseDTO cancelFreeSpinResponseDTO = jiliClient.cancelFreeSpin(query + "&Key=" + key); + //判断是否获取成功 + if (this.getIsSuccess(cancelFreeSpinResponseDTO.getErrorCode())) { + List gameFreeRecords = gameFreeRecordService.selectGameFreeRecordList(GameFreeRecord.builder() + .referenceId(cancelFreeSpinRequestDTO.getReferenceId()) + .build()); + for (GameFreeRecord gameFreeRecord : gameFreeRecords) { + gameFreeRecord.setFreeStatus(FreeStatus.CANCEL.getCode()); + gameFreeRecordService.updateGameFreeRecord(gameFreeRecord); } - } catch (Exception e) { - log.error("GameBettingDataJILIServiceImpl [cancelFreeSpin] 取消赠送免费局数,错误信息{}", e); - throw new BaseException(MessageUtils.message("game.free.round.cancel.failed")); - + return Boolean.TRUE; + } else { + throw new BaseException(cancelFreeSpinResponseDTO.getMessage()); } } + /** + * 批量插入 + * + * @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)) { + 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); + } + } + + } + /** * 数据构建 * @@ -728,7 +685,7 @@ public class GamesJILIServiceImpl implements IGamesService { //转化类 JILIBetRecordDataResponseDTO jiliBetRecordDataResponseDTO = (JILIBetRecordDataResponseDTO) gamesDataBuildDTO.getData(); String systemByCode = gameSecretKeyService.findSystemByCode(jiliBetRecordDataResponseDTO.getAgentId(), GamePlatforms.JILI.getInfo()); - Member member = memberService.selectMemberByMemberAccount(jiliBetRecordDataResponseDTO.getAccount()); + Member member = memberService.selectMemberByGameAccount(jiliBetRecordDataResponseDTO.getAccount()); if (ObjectUtils.isEmpty(member)) { return null; } diff --git a/ff-admin/src/main/java/com/ff/game/api/request/CancelFreeSpinRequestDTO.java b/ff-admin/src/main/java/com/ff/game/api/request/CancelFreeSpinRequestDTO.java index f7297ae..d6cef1a 100644 --- a/ff-admin/src/main/java/com/ff/game/api/request/CancelFreeSpinRequestDTO.java +++ b/ff-admin/src/main/java/com/ff/game/api/request/CancelFreeSpinRequestDTO.java @@ -1,6 +1,9 @@ package com.ff.game.api.request; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; /** * 取消免费旋转请求 @@ -9,6 +12,9 @@ import lombok.Data; * @date 2024/11/11 */ @Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder public class CancelFreeSpinRequestDTO extends GamesBaseRequestDTO { /** * 取消免费赠送游戏id diff --git a/ff-admin/src/main/java/com/ff/game/api/request/CreateFreeSpinRequestDTO.java b/ff-admin/src/main/java/com/ff/game/api/request/CreateFreeSpinRequestDTO.java index 795e7de..c9b5587 100644 --- a/ff-admin/src/main/java/com/ff/game/api/request/CreateFreeSpinRequestDTO.java +++ b/ff-admin/src/main/java/com/ff/game/api/request/CreateFreeSpinRequestDTO.java @@ -1,6 +1,10 @@ package com.ff.game.api.request; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; import java.math.BigDecimal; import java.util.List; @@ -12,6 +16,9 @@ import java.util.List; * @date 2024/11/11 */ @Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder public class CreateFreeSpinRequestDTO extends GamesBaseRequestDTO { /** diff --git a/ff-admin/src/main/java/com/ff/game/api/request/GamesDataBuildDTO.java b/ff-admin/src/main/java/com/ff/game/api/request/GamesDataBuildDTO.java index 17efcd6..e67cbcc 100644 --- a/ff-admin/src/main/java/com/ff/game/api/request/GamesDataBuildDTO.java +++ b/ff-admin/src/main/java/com/ff/game/api/request/GamesDataBuildDTO.java @@ -23,9 +23,6 @@ public class GamesDataBuildDTO */ private Object data; - /** - * 游戏列表key - */ - private String gamesKey; + } diff --git a/ff-admin/src/main/java/com/ff/game/api/request/GetGameDetailRequestDTO.java b/ff-admin/src/main/java/com/ff/game/api/request/GetGameDetailRequestDTO.java index 7c082c3..055be35 100644 --- a/ff-admin/src/main/java/com/ff/game/api/request/GetGameDetailRequestDTO.java +++ b/ff-admin/src/main/java/com/ff/game/api/request/GetGameDetailRequestDTO.java @@ -1,6 +1,12 @@ package com.ff.game.api.request; +import com.alibaba.druid.filter.AutoLoad; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import javax.validation.constraints.NotNull; /** * 获取游戏详细信息请求dto @@ -9,6 +15,9 @@ import lombok.Data; * @date 2024/11/12 */ @Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder public class GetGameDetailRequestDTO extends GamesBaseRequestDTO { /** diff --git a/ff-admin/src/main/java/com/ff/game/api/request/KickMemberAllDTO.java b/ff-admin/src/main/java/com/ff/game/api/request/KickMemberAllDTO.java index 1d4fd8c..158621d 100644 --- a/ff-admin/src/main/java/com/ff/game/api/request/KickMemberAllDTO.java +++ b/ff-admin/src/main/java/com/ff/game/api/request/KickMemberAllDTO.java @@ -1,6 +1,12 @@ package com.ff.game.api.request; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import javax.validation.constraints.NotNull; /** * 踢成员全部dto @@ -9,7 +15,14 @@ import lombok.Data; * @date 2024/11/12 */ @Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder public class KickMemberAllDTO extends GamesBaseRequestDTO { - private Long gameId; + + /** + * 游戏id + */ + private Integer gameId; } diff --git a/ff-admin/src/main/java/com/ff/game/api/request/KickMemberRequestDTO.java b/ff-admin/src/main/java/com/ff/game/api/request/KickMemberRequestDTO.java index dbf144b..8b8d015 100644 --- a/ff-admin/src/main/java/com/ff/game/api/request/KickMemberRequestDTO.java +++ b/ff-admin/src/main/java/com/ff/game/api/request/KickMemberRequestDTO.java @@ -1,6 +1,10 @@ package com.ff.game.api.request; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; /** * 踢会员请求dto @@ -9,6 +13,9 @@ import lombok.Data; * @date 2024/11/12 */ @Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder public class KickMemberRequestDTO extends GamesBaseRequestDTO { /** diff --git a/ff-admin/src/main/java/com/ff/game/api/xk/address/MyXKAddressSource.java b/ff-admin/src/main/java/com/ff/game/api/xk/address/MyXKAddressSource.java new file mode 100644 index 0000000..56ecda7 --- /dev/null +++ b/ff-admin/src/main/java/com/ff/game/api/xk/address/MyXKAddressSource.java @@ -0,0 +1,31 @@ +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 org.springframework.stereotype.Component; + +import javax.annotation.Resource; + + +/** + * 我jili address来源 + * + * @author shi + * @date 2025/02/10 + */ +@Component +public class MyXKAddressSource implements AddressSource { + + @Resource + private ISysConfigService configService; + + + @Override + public ForestAddress getAddress(ForestRequest request) { + String apiBaseUrl = configService.selectConfigByKey(Constants.XK_API_BASE_URL); + return new ForestAddress("https",apiBaseUrl, 443,"api"); + } +} \ No newline at end of file diff --git a/ff-admin/src/main/java/com/ff/game/api/xk/client/XKClient.java b/ff-admin/src/main/java/com/ff/game/api/xk/client/XKClient.java new file mode 100644 index 0000000..af567fd --- /dev/null +++ b/ff-admin/src/main/java/com/ff/game/api/xk/client/XKClient.java @@ -0,0 +1,93 @@ +package com.ff.game.api.xk.client; + +import com.dtflys.forest.annotation.*; +import com.ff.game.api.jili.address.MyJILIAddressSource; +import com.ff.game.api.jili.dto.*; +import com.ff.game.api.xk.address.MyXKAddressSource; +import com.ff.game.api.xk.dto.*; + +import java.util.Map; + +/** + * xk 请求 + * + * @author shi + * @date 2025/02/10 + */ +@Address(source = MyXKAddressSource.class) +public interface XKClient { + /** + * 创建成员 + * + * @param params 参数 + * @return {@link String } + */ + @Post("/createMember") + XKCreateMemberResponseDTO createMember(@JSONBody 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-admin/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java b/ff-admin/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java index cf857b3..0b71be1 100644 --- a/ff-admin/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java @@ -17,8 +17,11 @@ import com.ff.base.utils.StringUtils; import com.ff.base.utils.http.HttpClientSslUtils; import com.ff.base.utils.sign.Md5Utils; import com.ff.base.utils.uuid.IdUtils; +import com.ff.common.domain.TenantSecretKey; +import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; 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.service.*; @@ -27,6 +30,7 @@ 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; @@ -66,8 +70,6 @@ public class GamesXKServiceImpl implements IGamesService { private IGameService gameService; - - @Resource private IMemberService memberService; @@ -75,6 +77,18 @@ public class GamesXKServiceImpl implements IGamesService { private IGameFreeRecordService gameFreeRecordService; @Resource private IGameSecretKeyService gameSecretKeyService; + + @Resource + private XKClient xkClient; + + + @Resource + private KeyConfig keyConfig; + + @Resource + private IGameBettingDetailsService gameBettingDetailsService; + + /** * 获得就是成功 * @@ -120,7 +134,6 @@ public class GamesXKServiceImpl implements IGamesService { public Boolean createMember(CreateMemberRequestDTO createMemberRequestDTO) { log.info("GamesXKServiceImpl [createMember] 请求参数 {}", createMemberRequestDTO); - String apiBaseUrl = configService.selectConfigByKey(Constants.XK_API_BASE_URL); Map params = new LinkedHashMap<>(); params.put("account", createMemberRequestDTO.getAccount()); params.put("agentId", createMemberRequestDTO.getAgentId()); @@ -128,16 +141,13 @@ public class GamesXKServiceImpl implements IGamesService { createMemberRequestDTO.setQuery(query); String key = this.getKey(createMemberRequestDTO); params.put("key", key); - try { - String result = HttpClientSslUtils.doPost(apiBaseUrl + "/api/createMember", JsonUtil.objToPrettyString(params)); - XKCreateMemberResponseDTO xkCreateMemberResponseDTO = JsonUtil.stringToObj(result, XKCreateMemberResponseDTO.class); - //判断是否获取成功 - return !this.getIsSuccess(xkCreateMemberResponseDTO.getCode()); - - } catch (Exception e) { - log.error("GamesXKServiceImpl [createMember] 建立游戏账号,错误信息{}", e); - throw new BaseException(MessageUtils.message("game.account.create.failed")); + XKCreateMemberResponseDTO xkCreateMemberResponseDTO = xkClient.createMember(params); + Boolean isSuccess = this.getIsSuccess(xkCreateMemberResponseDTO.getCode()); + if (!isSuccess) { + throw new BaseException(xkCreateMemberResponseDTO.getMsg()); } + //判断是否获取成功 + return isSuccess; } @@ -157,31 +167,21 @@ public class GamesXKServiceImpl implements IGamesService { memberInfoRequestDTO.setQuery(query); String key = this.getKey(memberInfoRequestDTO); params.put("key", key); - String apiBaseUrl = configService.selectConfigByKey(Constants.XK_API_BASE_URL); - try { - String result = HttpClientSslUtils.doPost(apiBaseUrl + "/api/getMemberInfo", JsonUtil.objToPrettyString(params)); - XKMemberInfoDTO xkMemberInfoDTO = JsonUtil.stringToObj(result, XKMemberInfoDTO.class); - //判断是否获取成功 - if (this.getIsSuccess(xkMemberInfoDTO.getCode())) { - List memberInfoResponseDTOS = new ArrayList<>(); - xkMemberInfoDTO.getData().forEach(e -> { - memberInfoResponseDTOS.add(MemberInfoResponseDTO.builder() - .status(e.getStatus()) - .balance(e.getBalance()) - .account(e.getAccount()) - .build()); - }); - return memberInfoResponseDTOS.get(0); - } else { - log.error("GamesXKServiceImpl [getMemberInfo] 查询游戏账号信息失败,错误代码{},错误信息{}", xkMemberInfoDTO.getCode(), xkMemberInfoDTO.getMsg()); - throw new BaseException(MessageUtils.message("game.account.query.failed")); - } - - } catch (Exception e) { - log.error("GamesXKServiceImpl [getMemberInfo] 查询游戏账号信息失败,错误信息{}", e); - throw new BaseException(MessageUtils.message("game.account.query.failed")); + XKMemberInfoDTO xkMemberInfoDTO = xkClient.getMemberInfo(params); + //判断是否获取成功 + if (this.getIsSuccess(xkMemberInfoDTO.getCode())) { + List memberInfoResponseDTOS = new ArrayList<>(); + xkMemberInfoDTO.getData().forEach(e -> { + memberInfoResponseDTOS.add(MemberInfoResponseDTO.builder() + .status(e.getStatus()) + .balance(e.getBalance()) + .account(e.getAccount()) + .build()); + }); + return memberInfoResponseDTOS.get(0); + } else { + throw new BaseException(xkMemberInfoDTO.getMsg()); } - } /** @@ -206,21 +206,12 @@ public class GamesXKServiceImpl implements IGamesService { params.put("disableFullScreen", gamesLogin.getDisableFullScreen()); params.put("homeUrl", gamesLogin.getHomeUrl()); params.put("platform", gamesLogin.getPlatform()); - String apiBaseUrl = configService.selectConfigByKey(Constants.XK_API_BASE_URL); - try { - - String result = HttpClientSslUtils.doPost(apiBaseUrl + "/api/loginWithoutRedirect", JsonUtil.objToPrettyString(params)); - XKLoginWithoutRedirectResponseDTO xkLoginWithoutRedirectResponseDTO = JsonUtil.stringToObj(result, XKLoginWithoutRedirectResponseDTO.class); - //判断是否获取成功 - if (this.getIsSuccess(xkLoginWithoutRedirectResponseDTO.getCode())) { - return xkLoginWithoutRedirectResponseDTO.getData(); - } else { - log.error("GamesXKServiceImpl [loginWithoutRedirect] 游戏登录失败,错误代码{},错误信息{}", xkLoginWithoutRedirectResponseDTO.getCode(), xkLoginWithoutRedirectResponseDTO.getMsg()); - throw new BaseException(MessageUtils.message("game.login.failed")); - } - } catch (Exception e) { - log.error("GamesXKServiceImpl [loginWithoutRedirect] 游戏登录失败,错误信息{}", e); - throw new BaseException(MessageUtils.message("game.login.failed")); + XKLoginWithoutRedirectResponseDTO xkLoginWithoutRedirectResponseDTO = xkClient.loginWithoutRedirect(params); + //判断是否获取成功 + if (this.getIsSuccess(xkLoginWithoutRedirectResponseDTO.getCode())) { + return xkLoginWithoutRedirectResponseDTO.getData(); + } else { + throw new BaseException(xkLoginWithoutRedirectResponseDTO.getMsg()); } } @@ -234,81 +225,69 @@ public class GamesXKServiceImpl implements IGamesService { @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); String key = this.getKey(gamesBaseRequestDTO); params.put("key", key); - String apiBaseUrl = configService.selectConfigByKey(Constants.XK_API_BASE_URL); - try { - - - String result = HttpClientSslUtils.doPost(apiBaseUrl + "/api/getGameList", JsonUtil.objToPrettyString(params)); - XKGamesDTO xkGamesDTO = JsonUtil.stringToObj(result, XKGamesDTO.class); - //判断是否获取成功 - if (this.getIsSuccess(xkGamesDTO.getCode())) { - - Map gamePlatformMap = new HashMap<>(); - - for (XKGamesDTO.DataBean gamesDataDTO : xkGamesDTO.getData()) { - if (XKGameType.GAME_HALL.getCode().equals(gamesDataDTO.getGameCategoryId())) { - continue; - } - - 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(gamesDataDTO.getGameId()) - .build(); - List games = gameService.selectGameList(game); - //不存在这个游戏 - if (CollectionUtils.isEmpty(games)) { - 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()); + XKGamesDTO xkGamesDTO = xkClient.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(gamesDataDTO.getGameId()) + .build(); + List games = gameService.selectGameList(game); + //不存在这个游戏 + if (CollectionUtils.isEmpty(games)) { + game.setGameSourceType(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()); - - redisCache.deleteObject(CacheConstants.XK_GAMES); - redisCache.setCacheList(CacheConstants.XK_GAMES, xkGamesDTO.getData()); - redisCache.expire(CacheConstants.XK_GAMES, 5L, TimeUnit.HOURS); - } else { - log.error("GamesXKServiceImpl [getGameList] 获取游戏列表失败,错误代码{},错误信息{}", xkGamesDTO.getCode(), xkGamesDTO.getMsg()); - throw new BaseException(MessageUtils.message("game.list.retrieve.failed")); } - } catch (Exception e) { - log.error("GamesXKServiceImpl [getGameList] 获取游戏列表失败,错误信息{}", e); - throw new BaseException(MessageUtils.message("game.list.retrieve.failed")); + + 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.JILI_GAMES; + + return CacheConstants.XK_GAMES; } /** @@ -321,16 +300,28 @@ public class GamesXKServiceImpl implements IGamesService { @Transactional public String exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { log.info("GamesXKServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); - String systemByCode = gameSecretKeyService.findSystemByCode(exchangeTransferMoneyRequestDTO.getAgentId(),GamePlatforms.XK.getInfo()); - Member member = memberService.selectMemberByMemberAccount(exchangeTransferMoneyRequestDTO.getAccount()); + String systemByCode = gameSecretKeyService.findSystemByCode(exchangeTransferMoneyRequestDTO.getAgentId(), GamePlatforms.XK.getInfo()); + Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); + String transactionId = GamePlatforms.XK.getCode() + IdUtils.simpleUUID(); + TenantSecretKey tenantSecretKey = keyConfig.get(); + List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( + GameExchangeMoney.builder() + .tenantKey(tenantSecretKey.getTenantKey()) + .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) + .build() + ); + Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); //获取下一个自增id GameExchangeMoney exchangeMoney = GameExchangeMoney .builder() + .tenantKey(tenantSecretKey.getTenantKey()) .quota(exchangeTransferMoneyRequestDTO.getQuota()) .balance(exchangeTransferMoneyRequestDTO.getAmount()) .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) .currencyCode(systemByCode) .memberId(member.getId()) + .transactionId(transactionId) + .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) .platformCode(GamePlatforms.XK.getCode()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); @@ -346,32 +337,24 @@ public class GamesXKServiceImpl implements IGamesService { exchangeTransferMoneyRequestDTO.setQuery(query); String key = this.getKey(exchangeTransferMoneyRequestDTO); params.put("key", key); - String apiBaseUrl = configService.selectConfigByKey(Constants.XK_API_BASE_URL); - try { - String result = HttpClientSslUtils.doPost(apiBaseUrl + "/api/exchangeTransferByAgentId", JsonUtil.objToPrettyString(params)); - - XKExchangeMoneyResponseDTO exchangeMoneyResponse = JsonUtil.stringToObj(result, XKExchangeMoneyResponseDTO.class); - //判断是否转移成功 - if (this.getIsSuccess(exchangeMoneyResponse.getCode())) { - XKExchangeMoneyResponseDTO.DataBean exchangeMoneyResponseData = exchangeMoneyResponse.getData(); - //更新数据 - 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(MessageUtils.message("game.account.balance.transfer.failed")); - } - } catch (Exception e) { - log.error("GamesXKServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误信息{}", e); + XKExchangeMoneyResponseDTO exchangeMoneyResponse = xkClient.exchangeTransferByAgentId(params); + //判断是否转移成功 + if (this.getIsSuccess(exchangeMoneyResponse.getCode())) { + XKExchangeMoneyResponseDTO.DataBean exchangeMoneyResponseData = exchangeMoneyResponse.getData(); + //更新数据 + 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(MessageUtils.message("game.account.balance.transfer.failed")); } - return exchangeMoney.getId().toString(); + return transactionId; } @@ -382,7 +365,7 @@ public class GamesXKServiceImpl implements IGamesService { * @return {@link List }<{@link GameBettingDetails }> */ @Override - public List getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { + public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { List gameBettingDetails = new ArrayList<>(); //请求参数 log.info("GamesXKServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO); @@ -396,54 +379,37 @@ public class GamesXKServiceImpl implements IGamesService { betRecordByTimeDTO.setQuery(query); String key = this.getKey(betRecordByTimeDTO); params.put("key", key); - String apiBaseUrl = configService.selectConfigByKey(Constants.XK_API_BASE_URL); - String result = null; - try { - result = HttpClientSslUtils.doPost(apiBaseUrl + "/api/getGameRecordByTime", JsonUtil.objToPrettyString(params)); + XKBetRecordResponseDTO xkBetRecordResponseDTO = xkClient.getBetRecordByTime(params); - XKBetRecordResponseDTO betRecordJILIResponse = JSON.parseObject(result, XKBetRecordResponseDTO.class); + //判断是否获取成功 + if (this.getIsSuccess(xkBetRecordResponseDTO.getCode())) { + //数据组装 + XKBetRecordResponseDTO.DataBean dataBean = xkBetRecordResponseDTO.getData(); + this.batchInsert(xkBetRecordResponseDTO); - //判断是否获取成功 - if (this.getIsSuccess(betRecordJILIResponse.getCode())) { - //数据组装 - XKBetRecordResponseDTO.DataBean dataBean = betRecordJILIResponse.getData(); - for (XKBetRecordResponseDTO.DataBean.ResultBean bean : dataBean.getResult()) { - GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean).gamesKey(key).build()); - gameBettingDetails.add(bettingDetails); - } - - //获取下一页数据 - 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); - result = HttpClientSslUtils.doPost(apiBaseUrl + "/api/getGameRecordByTime", JsonUtil.objToPrettyString(params)); - betRecordJILIResponse = JsonUtil.stringToObj(result, XKBetRecordResponseDTO.class); - dataBean = betRecordJILIResponse.getData(); - for (XKBetRecordResponseDTO.DataBean.ResultBean bean : dataBean.getResult()) { - GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean).gamesKey(key).build()); - gameBettingDetails.add(bettingDetails); - } - } - - - return gameBettingDetails; - } else { - log.error("GamesXKServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordJILIResponse.getCode(), betRecordJILIResponse.getMsg()); - throw new BaseException(MessageUtils.message("game.bet.record.retrieve.failed")); + //获取下一页数据 + 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); + this.batchInsert(xkBetRecordResponseDTO); } - } catch (Exception e) { - log.error("GamesXKServiceImpl [getBetRecordByTime] 获取投注记录失败,错误信息{}", e); - throw new BaseException(MessageUtils.message("game.bet.record.retrieve.failed")); + + + return Boolean.TRUE; + } else { + log.error("GamesXKServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", xkBetRecordResponseDTO.getCode(), xkBetRecordResponseDTO.getMsg()); + throw new BaseException(xkBetRecordResponseDTO.getMsg()); } } @@ -486,22 +452,12 @@ public class GamesXKServiceImpl implements IGamesService { kickMemberRequestDTO.setQuery(query); String key = this.getKey(kickMemberRequestDTO); params.put("key", key); - - String apiBaseUrl = configService.selectConfigByKey(Constants.XK_API_BASE_URL); - try { - - String result = HttpClientSslUtils.doPost(apiBaseUrl + "/api/kickMember", JsonUtil.objToPrettyString(params)); - XKKickMemberDTO xkKickMemberDTO = JsonUtil.stringToObj(result, XKKickMemberDTO.class); - //判断是否获取成功 - if (this.getIsSuccess(xkKickMemberDTO.getCode())) { - return Boolean.TRUE; - } else { - log.error("GamesXKServiceImpl [kickMember] 强制会员从游戏注销失败,错误代码{},错误信息{}", xkKickMemberDTO.getCode(), xkKickMemberDTO.getMsg()); - throw new BaseException(MessageUtils.message("game.member.force.logout.failed")); - } - } catch (Exception e) { - log.error("GamesXKServiceImpl [kickMember] 强制会员从游戏注销失败,错误信息{}", e); - throw new BaseException(MessageUtils.message("game.member.force.logout.failed")); + XKKickMemberDTO xkKickMemberDTO = xkClient.kickMember(params); + //判断是否获取成功 + if (this.getIsSuccess(xkKickMemberDTO.getCode())) { + return Boolean.TRUE; + } else { + throw new BaseException(xkKickMemberDTO.getMsg()); } } @@ -513,33 +469,7 @@ public class GamesXKServiceImpl implements IGamesService { */ @Override public Boolean kickMemberAll(KickMemberAllDTO kickMemberAllDTO) { - log.info("GamesXKServiceImpl [kickMemberAll] 请求参数 {}", kickMemberAllDTO); - Map params = new LinkedHashMap<>(); - params.put("agentId", kickMemberAllDTO.getAgentId()); - if (!ObjectUtils.isEmpty(kickMemberAllDTO.getGameId())) { - params.put("gameId", kickMemberAllDTO.getGameId()); - } - String query = JsonUtil.mapToQueryString(params); - kickMemberAllDTO.setQuery(query); - String key = this.getKey(kickMemberAllDTO); - params.put("key", key); - kickMemberAllDTO.setQuery(query); - String apiBaseUrl = configService.selectConfigByKey(Constants.XK_API_BASE_URL); - try { - - String result = HttpClientSslUtils.doPost(apiBaseUrl + "/api/kickMemberAll", JsonUtil.objToPrettyString(params)); - XKKickMemberAllDTO xkKickMemberAllDTO = JsonUtil.stringToObj(result, XKKickMemberAllDTO.class); - //判断是否获取成功 - if (this.getIsSuccess(xkKickMemberAllDTO.getCode())) { - return Boolean.TRUE; - } else { - log.error("GamesXKServiceImpl [kickMemberAll] 强制全部会员从游戏注销失败,错误代码{},错误信息{}", xkKickMemberAllDTO.getCode(), xkKickMemberAllDTO.getMsg()); - throw new BaseException(MessageUtils.message("game.members.force.logout.failed")); - } - } catch (Exception e) { - log.error("GamesXKServiceImpl [kickMemberAll] 强制全部会员从游戏注销失败,错误信息{}", e); - throw new BaseException(MessageUtils.message("game.members.force.logout.failed")); - } + throw new BaseException("当前平台不支持全部踢出"); } /** @@ -565,6 +495,38 @@ public class GamesXKServiceImpl implements IGamesService { } + /** + * 批量插入 + * + * @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)) { + gameBettingDetails.add(bettingDetails); + } + wagersIds.add(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); + } + } + + } + /** * 数据构建 * @@ -575,16 +537,16 @@ public class GamesXKServiceImpl implements IGamesService { public GameBettingDetails dataBuild(GamesDataBuildDTO gamesDataBuildDTO) { //转化类 XKBetRecordResponseDTO.DataBean.ResultBean resultBean = (XKBetRecordResponseDTO.DataBean.ResultBean) gamesDataBuildDTO.getData(); - String systemByCode = gameSecretKeyService.findSystemByCode(resultBean.getAgentId(),GamePlatforms.XK.getInfo()); - Member member = memberService.selectMemberByMemberAccount(resultBean.getAccount()); + String systemByCode = gameSecretKeyService.findSystemByCode(resultBean.getAgentId(), GamePlatforms.XK.getInfo()); + Member member = memberService.selectMemberByGameAccount(resultBean.getAccount()); 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; + 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())){ + } else if (GameStatus.FAIL.getCode().equals(resultBean.getStatus())) { payoffAmount = NumberUtil.sub(resultBean.getPayoffAmount(), resultBean.getTurnover()).negate(); } //数据构造 diff --git a/ff-admin/src/main/java/com/ff/game/domain/GameFreeRecord.java b/ff-admin/src/main/java/com/ff/game/domain/GameFreeRecord.java index 0636a82..0712140 100644 --- a/ff-admin/src/main/java/com/ff/game/domain/GameFreeRecord.java +++ b/ff-admin/src/main/java/com/ff/game/domain/GameFreeRecord.java @@ -1,24 +1,23 @@ package com.ff.game.domain; -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; 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_free_record * * @author shi - * @date 2025-02-10 + * @date 2025-02-13 */ @Data @AllArgsConstructor -@NoArgsConstructor @Builder +@NoArgsConstructor public class GameFreeRecord extends BaseEntity { private static final long serialVersionUID = 1L; @@ -30,6 +29,10 @@ public class GameFreeRecord extends BaseEntity @Excel(name = "币种编码") private String currencyCode; + /** 平台代码 */ + @Excel(name = "平台代码") + private String platformCode; + /** 免费局数序号(唯一标识符) */ @Excel(name = "免费局数序号", readConverterExp = "唯=一标识符") private String referenceId; @@ -51,8 +54,7 @@ public class GameFreeRecord extends BaseEntity private Long sendTime; /** 免费局数过期时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "免费局数过期时间", width = 30, dateFormat = "yyyy-MM-dd") + @Excel(name = "免费局数过期时间") private Long expiredTime; /** 免费局数记录更新时间 */ diff --git a/ff-admin/src/main/java/com/ff/game/domain/GameSecretKey.java b/ff-admin/src/main/java/com/ff/game/domain/GameSecretKey.java index 9ea4ae6..b7c963b 100644 --- a/ff-admin/src/main/java/com/ff/game/domain/GameSecretKey.java +++ b/ff-admin/src/main/java/com/ff/game/domain/GameSecretKey.java @@ -2,7 +2,11 @@ package com.ff.game.domain; 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; + /** * 游戏平台密钥管理对象 ff_game_secret_key * @@ -10,6 +14,9 @@ import lombok.Data; * @date 2025-02-10 */ @Data +@AllArgsConstructor +@NoArgsConstructor +@Builder public class GameSecretKey extends BaseEntity { private static final long serialVersionUID = 1L; diff --git a/ff-admin/src/main/java/com/ff/game/mapper/GameBettingDetailsMapper.java b/ff-admin/src/main/java/com/ff/game/mapper/GameBettingDetailsMapper.java index aa9bb9c..e233bcf 100644 --- a/ff-admin/src/main/java/com/ff/game/mapper/GameBettingDetailsMapper.java +++ b/ff-admin/src/main/java/com/ff/game/mapper/GameBettingDetailsMapper.java @@ -2,6 +2,7 @@ package com.ff.game.mapper; import java.util.List; import com.ff.game.domain.GameBettingDetails; +import org.apache.ibatis.annotations.Param; /** * 会员投注细目Mapper接口 @@ -19,6 +20,16 @@ public interface GameBettingDetailsMapper */ GameBettingDetails selectGameBettingDetailsById(Long id); + + /** + * 按投注id选择游戏投注详细信息 + * + * @param wagersIds 投注ID + * @return {@link List }<{@link Long }> + */ + List selectGameBettingDetailsByWagersId(@Param("wagersIds") List wagersIds); + + /** * 查询会员投注细目列表 * @@ -58,4 +69,12 @@ public interface GameBettingDetailsMapper * @return 结果 */ int deleteGameBettingDetailsByIds(Long[] ids); + + /** + * 批量插入 + * + * @param bettingDetails 投注详情 + * @return int + */ + int batchInsert(List bettingDetails); } diff --git a/ff-admin/src/main/java/com/ff/game/service/IGameBettingDetailsService.java b/ff-admin/src/main/java/com/ff/game/service/IGameBettingDetailsService.java index affec19..cb6d388 100644 --- a/ff-admin/src/main/java/com/ff/game/service/IGameBettingDetailsService.java +++ b/ff-admin/src/main/java/com/ff/game/service/IGameBettingDetailsService.java @@ -1,7 +1,10 @@ package com.ff.game.service; import java.util.List; + +import com.ff.game.domain.Game; import com.ff.game.domain.GameBettingDetails; +import org.apache.ibatis.annotations.Param; /** * 会员投注细目Service接口 @@ -19,6 +22,16 @@ public interface IGameBettingDetailsService */ GameBettingDetails selectGameBettingDetailsById(Long id); + /** + * 按投注id选择游戏投注详细信息 + * + * @param wagersIds 投注ID + * @return {@link List }<{@link Long }> + */ + List selectGameBettingDetailsByWagersId(List wagersIds); + + + /** * 查询会员投注细目列表 * @@ -35,6 +48,15 @@ public interface IGameBettingDetailsService */ int insertGameBettingDetails(GameBettingDetails gameBettingDetails); + + /** + * 批量插入 + * + * @param bettingDetails 投注详情 + * @return int + */ + int batchInsert(List bettingDetails); + /** * 修改会员投注细目 * diff --git a/ff-admin/src/main/java/com/ff/game/service/impl/GameBettingDetailsServiceImpl.java b/ff-admin/src/main/java/com/ff/game/service/impl/GameBettingDetailsServiceImpl.java index 23c1286..f84ab07 100644 --- a/ff-admin/src/main/java/com/ff/game/service/impl/GameBettingDetailsServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/game/service/impl/GameBettingDetailsServiceImpl.java @@ -1,5 +1,6 @@ package com.ff.game.service.impl; +import java.util.Collections; import java.util.List; import com.ff.base.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -32,6 +33,17 @@ public class GameBettingDetailsServiceImpl implements IGameBettingDetailsService return gameBettingDetailsMapper.selectGameBettingDetailsById(id); } + /** + * 按投注id选择游戏投注详细信息 + * + * @param wagersIds 投注ID + * @return {@link List }<{@link Long }> + */ + @Override + public List selectGameBettingDetailsByWagersId(List wagersIds) { + return gameBettingDetailsMapper.selectGameBettingDetailsByWagersId(wagersIds); + } + /** * 查询会员投注细目列表 * @@ -57,6 +69,17 @@ public class GameBettingDetailsServiceImpl implements IGameBettingDetailsService return gameBettingDetailsMapper.insertGameBettingDetails(gameBettingDetails); } + /** + * 批量插入 + * + * @param bettingDetails 投注详情 + * @return int + */ + @Override + public int batchInsert(List bettingDetails) { + return gameBettingDetailsMapper.batchInsert(bettingDetails); + } + /** * 修改会员投注细目 * diff --git a/ff-admin/src/main/java/com/ff/quartz/task/GameTask.java b/ff-admin/src/main/java/com/ff/quartz/task/GameTask.java new file mode 100644 index 0000000..2910122 --- /dev/null +++ b/ff-admin/src/main/java/com/ff/quartz/task/GameTask.java @@ -0,0 +1,117 @@ +package com.ff.quartz.task; + +import com.ff.base.constant.Constants; +import com.ff.base.datasource.DynamicDataSourceContextHolder; +import com.ff.base.enums.GamePlatforms; +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.GamesBaseRequestDTO; +import com.ff.game.api.request.GetFreeSpinDashflowRequestDTO; +import com.ff.game.domain.GameSecretKey; +import com.ff.game.service.IGameSecretKeyService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import javax.sql.DataSource; +import java.util.*; +import java.util.stream.Collectors; + + +/** + * 游戏任务 + * + * @author shi + * @date 2024/10/22 + */ +@Slf4j +@Component("gameTask") +public class GameTask { + + + @Autowired + private Map gamesService; + + @Resource + private IGameSecretKeyService gameSecretKeyService; + + /** + * 插入游戏投注详细信息 + */ + + public void insertGameBettingDetails(Integer backTime) { + + //捞取指定分钟前的数据 + Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTime); + Long endTime = DateUtils.getNowDate(); + + Map resolvedDataSources = DynamicDataSourceContextHolder.getAllDataSource(); + for (Map.Entry entry : resolvedDataSources.entrySet()) { + Object key = entry.getKey(); + // 设置数据源类型 + DynamicDataSourceContextHolder.setDataSourceType(key.toString()); + for (String gameKey : gamesService.keySet()) { + List gameSecretKeys = gameSecretKeyService.selectGameSecretKeyList(GameSecretKey.builder().platform(gameKey.replace(Constants.SERVICE, "")).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.getMessage()); + } + } + + } + } + } + + /** + * 插入免费游戏局数情况 + */ + public void insertFreeSpinDashflow() { + Map resolvedDataSources = DynamicDataSourceContextHolder.getAllDataSource(); + for (Map.Entry entry : resolvedDataSources.entrySet()) { + Object key = entry.getKey(); + // 设置数据源类型 + DynamicDataSourceContextHolder.setDataSourceType(key.toString()); + 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()); + } + } + + } + } + } +} + + + + + + diff --git a/ff-admin/src/main/java/com/ff/validation/ListSizeCheck.java b/ff-admin/src/main/java/com/ff/validation/ListSizeCheck.java new file mode 100644 index 0000000..b6a17c0 --- /dev/null +++ b/ff-admin/src/main/java/com/ff/validation/ListSizeCheck.java @@ -0,0 +1,48 @@ +package com.ff.validation; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 列表大小检查 + * + * @author shi + * @date 2025/02/12 + */ +@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = ListSizeValidator.class) +public @interface ListSizeCheck { + + /** + * 消息 + * + * @return {@link String } + */ + String message() default "列表不能为空,且大小不得超过200"; + + /** + * 组 + * + * @return {@link Class }<{@link ? }>{@link [] } + */ + Class[] groups() default {}; + + /** + * 有效载荷 + * + * @return {@link Class }<{@link ? } {@link extends } {@link Payload }>{@link [] } + */ + Class[] payload() default {}; + + /** + * 最大尺寸 + * + * @return int + */ + int maxSize() default 200; +} \ No newline at end of file diff --git a/ff-admin/src/main/java/com/ff/validation/ListSizeValidator.java b/ff-admin/src/main/java/com/ff/validation/ListSizeValidator.java new file mode 100644 index 0000000..2d7b0a2 --- /dev/null +++ b/ff-admin/src/main/java/com/ff/validation/ListSizeValidator.java @@ -0,0 +1,31 @@ +package com.ff.validation; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.List; + +/** + * 列表大小验证器 + * + * @author shi + * @date 2025/02/12 + */ +public class ListSizeValidator implements ConstraintValidator> { + + private int maxSize; + + @Override + public void initialize(ListSizeCheck constraintAnnotation) { + // 从注解中获取最大值 + this.maxSize = constraintAnnotation.maxSize(); + } + + @Override + public boolean isValid(List value, ConstraintValidatorContext context) { + if (value == null) { + return true; + } + // 判断列表是否为空且大小不超过 maxSize + return !value.isEmpty() && value.size() <= maxSize; + } +} \ No newline at end of file diff --git a/ff-admin/src/main/resources/mapper/game/GameBettingDetailsMapper.xml b/ff-admin/src/main/resources/mapper/game/GameBettingDetailsMapper.xml index 282e764..ccaf787 100644 --- a/ff-admin/src/main/resources/mapper/game/GameBettingDetailsMapper.xml +++ b/ff-admin/src/main/resources/mapper/game/GameBettingDetailsMapper.xml @@ -59,6 +59,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and turnover = #{turnover} and order_no = #{orderNo} and settlement_status = #{settlementStatus} + + AND wagers_time >= #{params.beginTime} + + + AND wagers_time <= #{params.endTime} + + @@ -67,6 +74,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} + + + + insert into ff_game_betting_details @@ -164,4 +183,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id} + + + insert into ff_game_betting_details + + game_id, currency_code, member_id, game_code, game_type, platform_code, + game_name, game_status, game_status_type, game_currency_code, account, + wagers_id, wagers_time, bet_amount, payoff_time, payoff_amount, + settlement_time, turnover, order_no, create_by, create_time + + values + + + #{item.gameId}, + #{item.currencyCode}, + #{item.memberId}, + #{item.gameCode}, + #{item.gameType}, + #{item.platformCode}, + #{item.gameName}, + #{item.gameStatus}, + #{item.gameStatusType}, + #{item.gameCurrencyCode}, + #{item.account}, + #{item.wagersId}, + #{item.wagersTime}, + #{item.betAmount}, + #{item.payoffTime}, + #{item.payoffAmount}, + #{item.settlementTime}, + #{item.turnover}, + #{item.orderNo}, + #{item.createBy}, + #{item.createTime} + + + \ No newline at end of file diff --git a/ff-admin/src/main/resources/mapper/game/GameFreeRecordMapper.xml b/ff-admin/src/main/resources/mapper/game/GameFreeRecordMapper.xml index fb12de8..42f0ce4 100644 --- a/ff-admin/src/main/resources/mapper/game/GameFreeRecordMapper.xml +++ b/ff-admin/src/main/resources/mapper/game/GameFreeRecordMapper.xml @@ -7,6 +7,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -26,13 +27,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, currency_code, reference_id, member_id, member_account, game_id, send_time, expired_time, free_update_time, send_game, send_amount, used_amount, unused_amount, free_status, create_by, create_time, update_by, update_time from ff_game_free_record + select id, currency_code, platform_code, reference_id, member_id, member_account, game_id, send_time, expired_time, free_update_time, send_game, send_amount, used_amount, unused_amount, free_status, create_by, create_time, update_by, update_time from ff_game_free_record @@ -67,6 +74,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} + + + + insert into ff_game_betting_details @@ -164,4 +183,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id} + + + insert into ff_game_betting_details + + game_id, currency_code, member_id, game_code, game_type, platform_code, + game_name, game_status, game_status_type, game_currency_code, account, + wagers_id, wagers_time, bet_amount, payoff_time, payoff_amount, + settlement_time, turnover, order_no, create_by, create_time + + values + + + #{item.gameId}, + #{item.currencyCode}, + #{item.memberId}, + #{item.gameCode}, + #{item.gameType}, + #{item.platformCode}, + #{item.gameName}, + #{item.gameStatus}, + #{item.gameStatusType}, + #{item.gameCurrencyCode}, + #{item.account}, + #{item.wagersId}, + #{item.wagersTime}, + #{item.betAmount}, + #{item.payoffTime}, + #{item.payoffAmount}, + #{item.settlementTime}, + #{item.turnover}, + #{item.orderNo}, + #{item.createBy}, + #{item.createTime} + + + \ No newline at end of file diff --git a/ff-admin/target/classes/mapper/game/GameFreeRecordMapper.xml b/ff-admin/target/classes/mapper/game/GameFreeRecordMapper.xml index fb12de8..42f0ce4 100644 --- a/ff-admin/target/classes/mapper/game/GameFreeRecordMapper.xml +++ b/ff-admin/target/classes/mapper/game/GameFreeRecordMapper.xml @@ -7,6 +7,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -26,13 +27,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, currency_code, reference_id, member_id, member_account, game_id, send_time, expired_time, free_update_time, send_game, send_amount, used_amount, unused_amount, free_status, create_by, create_time, update_by, update_time from ff_game_free_record + select id, currency_code, platform_code, reference_id, member_id, member_account, game_id, send_time, expired_time, free_update_time, send_game, send_amount, used_amount, unused_amount, free_status, create_by, create_time, update_by, update_time from ff_game_free_record