refactor(game): 重构 AE 和 SV388 的投注记录获取逻辑

- 为 GamesAEServiceImpl 和 SV388GamesServiceImpl 类添加 DelayService 依赖
- 实现 GetRealtimeRecordTask 和 GetHistoryRecordTask 类继承 DelayTask
- 重写 getBetRecordByTime 和 getBetRecordByHistoryTime 方法,使用延迟任务处理大量数据
- 优化 batchInsert 方法,增加空数据判断和日志记录
- 调整 kickMember 方法,移除不必要的日志输出
main-meitian
liaoyong 2025-04-10 10:20:05 +08:00
parent b0c058345d
commit fb6138f9a0
2 changed files with 80 additions and 23 deletions

View File

@ -16,10 +16,13 @@ import com.ff.base.utils.uuid.IdUtils;
import com.ff.common.dto.GameBalanceExchange;
import com.ff.common.service.ITenantGameQuotaService;
import com.ff.config.KeyConfig;
import com.ff.delay.DelayService;
import com.ff.delay.DelayTask;
import com.ff.game.api.IGamesService;
import com.ff.game.api.ae.client.AEClient;
import com.ff.game.api.ae.dto.*;
import com.ff.game.api.request.*;
import com.ff.game.api.sv388.impl.SV388GamesServiceImpl;
import com.ff.game.api.xk.dto.XKKickMemberDTO;
import com.ff.game.domain.*;
import com.ff.game.service.IGameBettingDetailsService;
@ -79,6 +82,9 @@ public class GamesAEServiceImpl implements IGamesService {
@Resource
private IGameBettingDetailsService gameBettingDetailsService;
@Resource
private DelayService delayService;
/**
* id
*/
@ -345,15 +351,20 @@ public class GamesAEServiceImpl implements IGamesService {
.build();
}
class GetRealtimeRecordTask extends DelayTask {
BetRecordByTimeDTO betRecordByTimeDTO;
/**
*
*
* @param betRecordByTimeDTO dto
* @return {@link List }<{@link GameBettingDetails }>
*/
@Override
public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) {
public GetRealtimeRecordTask(BetRecordByTimeDTO betRecordByTimeDTO) {
this.betRecordByTimeDTO = betRecordByTimeDTO;
}
@Override
public void execute() {
getRealtimeRecord(betRecordByTimeDTO);
}
}
void getRealtimeRecord(BetRecordByTimeDTO betRecordByTimeDTO) {
//请求参数
log.info("GamesAEServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO);
Map<String, Object> params = this.getKey(betRecordByTimeDTO);
@ -373,23 +384,32 @@ public class GamesAEServiceImpl implements IGamesService {
if (this.getIsSuccess(aeBetRecordResponse.getStatus())) {
//数据组装
this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO);
return Boolean.TRUE;
if (aeBetRecordResponse.getTransactions().size() >= 20000) {
delayService.addTask(new GetRealtimeRecordTask(betRecordByTimeDTO));
}
//return Boolean.TRUE;
} else {
redisCache.deleteObject(CacheConstants.AE_TIME_FROM);
log.error("GamesAEServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc());
throw new BaseException(aeBetRecordResponse.getDesc());
//throw new BaseException(aeBetRecordResponse.getDesc());
}
}
/**
*
*
* @param betRecordByTimeDTO dto
* @return {@link Boolean }
*/
@Override
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
class GetHistoryRecordTask extends DelayTask {
BetRecordByTimeDTO betRecordByTimeDTO;
public GetHistoryRecordTask(BetRecordByTimeDTO betRecordByTimeDTO) {
this.betRecordByTimeDTO = betRecordByTimeDTO;
}
@Override
public void execute() {
getHistoryRecord(betRecordByTimeDTO);
}
}
void getHistoryRecord(BetRecordByTimeDTO betRecordByTimeDTO) {
log.info("GamesAEServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", betRecordByTimeDTO);
Map<String, Object> params = this.getKey(betRecordByTimeDTO);
String startTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00";
@ -405,13 +425,40 @@ public class GamesAEServiceImpl implements IGamesService {
if (this.getIsSuccess(aeBetRecordResponse.getStatus())) {
//数据组装
this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO);
return Boolean.TRUE;
if (aeBetRecordResponse.getTransactions().size() >= 20000) {
delayService.addTask(new GetHistoryRecordTask(betRecordByTimeDTO));
}
// return Boolean.TRUE;
} else {
log.error("GamesAEServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc());
throw new BaseException(aeBetRecordResponse.getDesc());
// throw new BaseException(aeBetRecordResponse.getDesc());
}
}
/**
*
*
* @param betRecordByTimeDTO dto
* @return {@link List }<{@link GameBettingDetails }>
*/
@Override
public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) {
delayService.addTask(new GetRealtimeRecordTask(betRecordByTimeDTO));
return Boolean.TRUE;
}
/**
*
*
* @param betRecordByTimeDTO dto
* @return {@link Boolean }
*/
@Override
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
delayService.addTask(new GetHistoryRecordTask(betRecordByTimeDTO));
return Boolean.TRUE;
}
/**
*
*

View File

@ -201,7 +201,7 @@ public class SV388GamesServiceImpl implements IGamesService {
//不存在这个游戏
if (ObjectUtils.isEmpty(gameList)) {
Game game = new Game();
game.setId(IdUtil.getSnowflakeNextId());
game.setId(/*IdUtil.getSnowflakeNextId()*/GAME_ID);
game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.SV388.getCode()) + 1);
game.setPlatformCode(platform.getPlatformCode());
game.setPlatformType(platformType);
@ -373,6 +373,9 @@ public class SV388GamesServiceImpl implements IGamesService {
if (this.getIsSuccess(aeBetRecordResponse.getStatus())) {
//数据组装
this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO);
if (aeBetRecordResponse.getTransactions().size() >= 20000) {
delayService.addTask(new GetRealtimeRecordTask(betRecordByTimeDTO));
}
} else {
redisCache.deleteObject(CacheConstants.SV388_TIME_FROM);
log.error("获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc());
@ -394,6 +397,9 @@ public class SV388GamesServiceImpl implements IGamesService {
if (this.getIsSuccess(aeBetRecordResponse.getStatus())) {
//数据组装
this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO);
if (aeBetRecordResponse.getTransactions().size() >= 20000) {
delayService.addTask(new GetHistoryRecordTask(betRecordByTimeDTO));
}
} else {
log.error("获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc());
}
@ -466,7 +472,6 @@ public class SV388GamesServiceImpl implements IGamesService {
*/
@Override
public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) {
log.info("GamesAEServiceImpl [kickMember] 请求参数 {}", kickMemberRequestDTO);
Map<String, Object> params = this.getKey(kickMemberRequestDTO);
params.put("userIds", kickMemberRequestDTO.getAccount());
XKKickMemberDTO xkKickMemberDTO = sv388Client.kickMember(params);
@ -528,12 +533,16 @@ public class SV388GamesServiceImpl implements IGamesService {
*
* @param aeBetRecordResponse aedto
*/
private synchronized void batchInsert(SV388BetRecordResponse aeBetRecordResponse, BetRecordByTimeDTO betRecordByTimeDTO) {
private void batchInsert(SV388BetRecordResponse aeBetRecordResponse, BetRecordByTimeDTO betRecordByTimeDTO) {
List<GameBettingDetails> gameBettingDetails = new ArrayList<>();
List<String> wagersIds = new ArrayList<>();
//数据组装
List<SV388BetRecordResponse.Transaction> dataBean = aeBetRecordResponse.getTransactions();
if (CollectionUtils.isEmpty(dataBean)) {
return;
}
String timeFrom = null;
//数据转化
for (SV388BetRecordResponse.Transaction bean : dataBean) {
@ -562,6 +571,7 @@ public class SV388GamesServiceImpl implements IGamesService {
timeFrom = DateUtils.convertTimestampToFormattedDate(DateUtils.getNowDate(), DateUtils.ISO_8601_FORMAT, "UTC+8") + "+08:00";
}
redisCache.setCacheObject(CacheConstants.SV388_TIME_FROM, timeFrom);
}
/**