feat(game): 添加游戏相关API接口和功能

- 新增免费旋转相关功能:赠送免费局数、获取免费旋转记录等
- 新增游戏记录查询功能:获取游戏详情、获取投注记录等
- 新增游戏踢人功能:踢出指定玩家、踢出所有玩家
- 优化游戏账户创建逻辑
main-p
shi 2025-02-13 15:43:13 +08:00
parent 22a7943b33
commit 02388446db
35 changed files with 1577 additions and 469 deletions

View File

@ -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<String, Object> params = gameBettingDetails.getParams();
params.put("beginTime", gameCreateFreeSpinRequest.getBeginTime());
params.put("endTime", gameCreateFreeSpinRequest.getEndTime());
List<GameBettingDetails> 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<GameFreeRecord> 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);
}
}

View File

@ -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<Member> 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 {
}
}

View File

@ -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;
}

View File

@ -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<Long> gameIds;
/**
* ;
* , 使
*/
private BigDecimal betValue;
/**
* 使
* , 使
*/
private Long startTime;
}

View File

@ -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;
/**
* 2002000
*/
@Min(value = 1, message = "pageSize最小值为1")
@Max(value = 2000, message = "pageSize最大值为2000")
private Integer pageSize=200;
}

View File

@ -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;
}

View File

@ -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;
/**
* 2002000
*/
@Min(value = 1, message = "pageSize最小值为1")
@Max(value = 2000, message = "pageSize最大值为2000")
private Integer pageSize=200;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -69,13 +69,14 @@ public interface IGamesService {
*/
String exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO);
/**
*
*
* @param betRecordByTimeDTO dto
* @return {@link List }<{@link GameBettingDetails }>
* @return {@link Boolean }
*/
List<GameBettingDetails> getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO);
Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO);
/**

View File

@ -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);
}

View File

@ -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<GameBettingDetails> 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> 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<GameFreeRecord> 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<GameFreeRecord> 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<GameFreeRecord> 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<GameFreeRecord> 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> gameBettingDetails = new ArrayList<>();
List<Long> 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<Long> 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;
}

View File

@ -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

View File

@ -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 {
/**

View File

@ -23,9 +23,6 @@ public class GamesDataBuildDTO
*/
private Object data;
/**
* key
*/
private String gamesKey;
}

View File

@ -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 {
/**

View File

@ -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;
}

View File

@ -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 {
/**

View File

@ -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");
}
}

View File

@ -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<String, Object> params);
/**
*
*
* @param params
* @return {@link XKMemberInfoDTO }
*/
@Post("/getMemberInfo")
XKMemberInfoDTO getMemberInfo(@JSONBody Map<String, Object> params);
/**
*
*
* @param params
* @return {@link JILILoginWithoutRedirectResponseDTO }
*/
@Post("/loginWithoutRedirect")
XKLoginWithoutRedirectResponseDTO loginWithoutRedirect(@JSONBody Map<String, Object> params);
/**
*
*
* @param params
* @return {@link JILIGamesDTO }
*/
@Post("/getGameList")
XKGamesDTO getGameList(@JSONBody Map<String, Object> params);
/**
* id
*
* @param params
* @return {@link JILIExchangeMoneyResponseDTO }
*/
@Post(url = "/exchangeTransferByAgentId")
XKExchangeMoneyResponseDTO exchangeTransferByAgentId( @JSONBody Map<String, Object> params);
/**
*
*
* @param params
* @return {@link XKBetRecordResponseDTO }
*/
@Post(url = "/getGameRecordByTime")
XKBetRecordResponseDTO getBetRecordByTime( @JSONBody Map<String, Object> params);
/**
*
*
* @param params
* @return {@link JILIKickMemberDTO }
*/
@Post("/kickMember")
XKKickMemberDTO kickMember(@JSONBody Map<String, Object> params);
/**
*
*
* @param params
* @return {@link JILIKickMemberAllDTO }
*/
@Get("/kickMemberAll")
XKKickMemberAllDTO kickMemberAll(@JSONBody Map<String, Object> params);
}

View File

@ -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<String, Object> 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<MemberInfoResponseDTO> 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<MemberInfoResponseDTO> 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<XKGamesDTO.DataBean> gamesDatas = redisCache.getCacheList(CacheConstants.XK_GAMES);
if (!CollectionUtils.isEmpty(gamesDatas)) {
return CacheConstants.XK_GAMES;
}
Map<String, Object> 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<Long, GamePlatform> 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<GamePlatform> 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<Game> 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<GamePlatform> 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<Game> 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<GameExchangeMoney> 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<GameBettingDetails> getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) {
public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) {
List<GameBettingDetails> 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<String, Object> 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 xkdto
*/
private void batchInsert(XKBetRecordResponseDTO xkBetRecordResponseDTO) {
List<GameBettingDetails> gameBettingDetails = new ArrayList<>();
List<Long> 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<Long> 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<XKGamesDTO.DataBean> gamesDatas = redisCache.getCacheList(CacheConstants.XK_GAMES);
Map<Integer, XKGamesDTO.DataBean> 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();
}
//数据构造

View File

@ -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;
/** 免费局数记录更新时间 */

View File

@ -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;

View File

@ -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<Long> selectGameBettingDetailsByWagersId(@Param("wagersIds") List<Long> wagersIds);
/**
*
*
@ -58,4 +69,12 @@ public interface GameBettingDetailsMapper
* @return
*/
int deleteGameBettingDetailsByIds(Long[] ids);
/**
*
*
* @param bettingDetails
* @return int
*/
int batchInsert(List<GameBettingDetails> bettingDetails);
}

View File

@ -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<Long> selectGameBettingDetailsByWagersId(List<Long> wagersIds);
/**
*
*
@ -35,6 +48,15 @@ public interface IGameBettingDetailsService
*/
int insertGameBettingDetails(GameBettingDetails gameBettingDetails);
/**
*
*
* @param bettingDetails
* @return int
*/
int batchInsert(List<GameBettingDetails> bettingDetails);
/**
*
*

View File

@ -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<Long> selectGameBettingDetailsByWagersId(List<Long> 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<GameBettingDetails> bettingDetails) {
return gameBettingDetailsMapper.batchInsert(bettingDetails);
}
/**
*
*

View File

@ -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<String, IGamesService> gamesService;
@Resource
private IGameSecretKeyService gameSecretKeyService;
/**
*
*/
public void insertGameBettingDetails(Integer backTime) {
//捞取指定分钟前的数据
Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTime);
Long endTime = DateUtils.getNowDate();
Map<Object, DataSource> resolvedDataSources = DynamicDataSourceContextHolder.getAllDataSource();
for (Map.Entry<Object, DataSource> entry : resolvedDataSources.entrySet()) {
Object key = entry.getKey();
// 设置数据源类型
DynamicDataSourceContextHolder.setDataSourceType(key.toString());
for (String gameKey : gamesService.keySet()) {
List<GameSecretKey> 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<Object, DataSource> resolvedDataSources = DynamicDataSourceContextHolder.getAllDataSource();
for (Map.Entry<Object, DataSource> entry : resolvedDataSources.entrySet()) {
Object key = entry.getKey();
// 设置数据源类型
DynamicDataSourceContextHolder.setDataSourceType(key.toString());
Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), -70);
for (String gameKey : gamesService.keySet()) {
List<GameSecretKey> 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());
}
}
}
}
}
}

View File

@ -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<? extends Payload>[] payload() default {};
/**
*
*
* @return int
*/
int maxSize() default 200;
}

View File

@ -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<ListSizeCheck, List<?>> {
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;
}
}

View File

@ -59,6 +59,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="turnover != null "> and turnover = #{turnover}</if>
<if test="orderNo != null and orderNo != ''"> and order_no = #{orderNo}</if>
<if test="settlementStatus != null "> and settlement_status = #{settlementStatus}</if>
<if test="params.beginTime != null">
AND wagers_time &gt;= #{params.beginTime}
</if>
<if test="params.endTime != null">
AND wagers_time &lt;= #{params.endTime}
</if>
</where>
</select>
@ -67,6 +74,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where id = #{id}
</select>
<select id="selectGameBettingDetailsByWagersId" resultType="java.lang.Long">
select wagers_id from ff_game_betting_details
where wagers_id in
<foreach item="wagersId" collection="wagersIds" open="(" separator="," close=")">
#{wagersId}
</foreach>
</select>
<insert id="insertGameBettingDetails" parameterType="GameBettingDetails" useGeneratedKeys="true" keyProperty="id">
insert into ff_game_betting_details
<trim prefix="(" suffix=")" suffixOverrides=",">
@ -164,4 +183,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{id}
</foreach>
</delete>
<insert id="batchInsert" parameterType="list" useGeneratedKeys="true" keyProperty="id">
insert into ff_game_betting_details
<trim prefix="(" suffix=")" suffixOverrides=",">
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
</trim>
values
<foreach collection="list" item="item" separator=",">
<trim prefix="(" suffix=")" suffixOverrides=",">
#{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}
</trim>
</foreach>
</insert>
</mapper>

View File

@ -7,6 +7,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<resultMap type="GameFreeRecord" id="GameFreeRecordResult">
<result property="id" column="id" />
<result property="currencyCode" column="currency_code" />
<result property="platformCode" column="platform_code" />
<result property="referenceId" column="reference_id" />
<result property="memberId" column="member_id" />
<result property="memberAccount" column="member_account" />
@ -26,13 +27,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<sql id="selectGameFreeRecordVo">
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
</sql>
<select id="selectGameFreeRecordList" parameterType="GameFreeRecord" resultMap="GameFreeRecordResult">
<include refid="selectGameFreeRecordVo"/>
<where>
<if test="currencyCode != null and currencyCode != ''"> and currency_code = #{currencyCode}</if>
<if test="platformCode != null and platformCode != ''"> and platform_code = #{platformCode}</if>
<if test="referenceId != null and referenceId != ''"> and reference_id = #{referenceId}</if>
<if test="memberId != null "> and member_id = #{memberId}</if>
<if test="memberAccount != null and memberAccount != ''"> and member_account = #{memberAccount}</if>
@ -57,6 +59,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
insert into ff_game_free_record
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="currencyCode != null">currency_code,</if>
<if test="platformCode != null">platform_code,</if>
<if test="referenceId != null">reference_id,</if>
<if test="memberId != null">member_id,</if>
<if test="memberAccount != null">member_account,</if>
@ -76,6 +79,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="currencyCode != null">#{currencyCode},</if>
<if test="platformCode != null">#{platformCode},</if>
<if test="referenceId != null">#{referenceId},</if>
<if test="memberId != null">#{memberId},</if>
<if test="memberAccount != null">#{memberAccount},</if>
@ -99,6 +103,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
update ff_game_free_record
<trim prefix="SET" suffixOverrides=",">
<if test="currencyCode != null">currency_code = #{currencyCode},</if>
<if test="platformCode != null">platform_code = #{platformCode},</if>
<if test="referenceId != null">reference_id = #{referenceId},</if>
<if test="memberId != null">member_id = #{memberId},</if>
<if test="memberAccount != null">member_account = #{memberAccount},</if>

View File

@ -59,6 +59,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="turnover != null "> and turnover = #{turnover}</if>
<if test="orderNo != null and orderNo != ''"> and order_no = #{orderNo}</if>
<if test="settlementStatus != null "> and settlement_status = #{settlementStatus}</if>
<if test="params.beginTime != null">
AND wagers_time &gt;= #{params.beginTime}
</if>
<if test="params.endTime != null">
AND wagers_time &lt;= #{params.endTime}
</if>
</where>
</select>
@ -67,6 +74,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where id = #{id}
</select>
<select id="selectGameBettingDetailsByWagersId" resultType="java.lang.Long">
select wagers_id from ff_game_betting_details
where wagers_id in
<foreach item="wagersId" collection="wagersIds" open="(" separator="," close=")">
#{wagersId}
</foreach>
</select>
<insert id="insertGameBettingDetails" parameterType="GameBettingDetails" useGeneratedKeys="true" keyProperty="id">
insert into ff_game_betting_details
<trim prefix="(" suffix=")" suffixOverrides=",">
@ -164,4 +183,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{id}
</foreach>
</delete>
<insert id="batchInsert" parameterType="list" useGeneratedKeys="true" keyProperty="id">
insert into ff_game_betting_details
<trim prefix="(" suffix=")" suffixOverrides=",">
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
</trim>
values
<foreach collection="list" item="item" separator=",">
<trim prefix="(" suffix=")" suffixOverrides=",">
#{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}
</trim>
</foreach>
</insert>
</mapper>

View File

@ -7,6 +7,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<resultMap type="GameFreeRecord" id="GameFreeRecordResult">
<result property="id" column="id" />
<result property="currencyCode" column="currency_code" />
<result property="platformCode" column="platform_code" />
<result property="referenceId" column="reference_id" />
<result property="memberId" column="member_id" />
<result property="memberAccount" column="member_account" />
@ -26,13 +27,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<sql id="selectGameFreeRecordVo">
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
</sql>
<select id="selectGameFreeRecordList" parameterType="GameFreeRecord" resultMap="GameFreeRecordResult">
<include refid="selectGameFreeRecordVo"/>
<where>
<if test="currencyCode != null and currencyCode != ''"> and currency_code = #{currencyCode}</if>
<if test="platformCode != null and platformCode != ''"> and platform_code = #{platformCode}</if>
<if test="referenceId != null and referenceId != ''"> and reference_id = #{referenceId}</if>
<if test="memberId != null "> and member_id = #{memberId}</if>
<if test="memberAccount != null and memberAccount != ''"> and member_account = #{memberAccount}</if>
@ -57,6 +59,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
insert into ff_game_free_record
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="currencyCode != null">currency_code,</if>
<if test="platformCode != null">platform_code,</if>
<if test="referenceId != null">reference_id,</if>
<if test="memberId != null">member_id,</if>
<if test="memberAccount != null">member_account,</if>
@ -76,6 +79,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="currencyCode != null">#{currencyCode},</if>
<if test="platformCode != null">#{platformCode},</if>
<if test="referenceId != null">#{referenceId},</if>
<if test="memberId != null">#{memberId},</if>
<if test="memberAccount != null">#{memberAccount},</if>
@ -99,6 +103,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
update ff_game_free_record
<trim prefix="SET" suffixOverrides=",">
<if test="currencyCode != null">currency_code = #{currencyCode},</if>
<if test="platformCode != null">platform_code = #{platformCode},</if>
<if test="referenceId != null">reference_id = #{referenceId},</if>
<if test="memberId != null">member_id = #{memberId},</if>
<if test="memberAccount != null">member_account = #{memberAccount},</if>

View File

@ -15,9 +15,9 @@ public enum XKGameType {
ELECTRON(1, 1L,"电子"),
CHESS(2, 2L,"棋牌"),
GAME_HALL(3, 0L,"游戏大厅"),
GAME_HALL(3, 3L,"游戏大厅"),
CATCH_FISH(5, 4L,"捕鱼"),
MACHINE(8, 2L,"棋牌")
MACHINE(8, 5L,"押分机 (含宾果)")
;