diff --git a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java index a3c2f70..dd8fb37 100644 --- a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java +++ b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java @@ -22,6 +22,7 @@ import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; import com.ff.game.api.request.*; import com.ff.game.domain.*; +import com.ff.game.dto.GameBettingDetailsDTO; import com.ff.game.dto.GameSecretKeyCurrencyDTO; import com.ff.game.dto.GameSecretKeyLangDTO; import com.ff.game.service.*; @@ -316,10 +317,11 @@ public class ApiGameController extends BaseController { startPage(); PageHelper.startPage(gameCreateFreeSpinRequest.getPageNo(), gameCreateFreeSpinRequest.getPageSize(), "wagers_time desc"); - GameBettingDetails gameBettingDetails = GameBettingDetails.builder() + GameBettingDetailsDTO gameBettingDetails = GameBettingDetailsDTO.builder() .platformCode(gameCreateFreeSpinRequest.getPlatformCode()) .currencyCode(gameCreateFreeSpinRequest.getCurrencyCode()) .tenantKey(tenantSecretKey.getTenantKey()) + .timeType(gameCreateFreeSpinRequest.getTimeType()) .build(); Map params = gameBettingDetails.getParams(); params.put("beginTime", gameCreateFreeSpinRequest.getBeginTime()); diff --git a/ff-game/src/main/java/com/ff/api/request/GameGetBetRecordRequest.java b/ff-game/src/main/java/com/ff/api/request/GameGetBetRecordRequest.java index d86a2b3..1ebc4ef 100644 --- a/ff-game/src/main/java/com/ff/api/request/GameGetBetRecordRequest.java +++ b/ff-game/src/main/java/com/ff/api/request/GameGetBetRecordRequest.java @@ -49,6 +49,12 @@ public class GameGetBetRecordRequest implements Serializable { private Long endTime; + /** + * 时间类型 1 按投注时间 2 按入库时间 + */ + private Integer timeType=1; + + /** * 页码,默认第1页,按订单更新时间正序返回数据 */ diff --git a/ff-game/src/main/java/com/ff/game/api/ng/client/NGClient.java b/ff-game/src/main/java/com/ff/game/api/ng/client/NGClient.java index 3f3f91f..13296fd 100644 --- a/ff-game/src/main/java/com/ff/game/api/ng/client/NGClient.java +++ b/ff-game/src/main/java/com/ff/game/api/ng/client/NGClient.java @@ -96,4 +96,16 @@ public interface NGClient { */ @Post(url = "server/recordAll") ApiNGResponseDTO getBetRecordByTime(@JSONBody Map parameters, @Header Map headerMap); + + /** + * 按历史时间获取投注记录 + * + * @param parameters 范围 + * @param headerMap 标题映射 + * @return {@link ApiNGResponseDTO }<{@link ApiGameBetRecordPageResponseDTO }> + */ + @Post(url = "server/recordHistory") + ApiNGResponseDTO getBetRecordByHistoryTime(@JSONBody Map parameters, @Header Map headerMap); + + } diff --git a/ff-game/src/main/java/com/ff/game/api/ng/service/impl/GamesPGServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/ng/service/impl/GamesPGServiceImpl.java index ea4b332..f6ba994 100644 --- a/ff-game/src/main/java/com/ff/game/api/ng/service/impl/GamesPGServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/ng/service/impl/GamesPGServiceImpl.java @@ -503,15 +503,88 @@ public class GamesPGServiceImpl implements IGamesService { .build()); -// String startTime = DateTimeFormatter -// .ofPattern("yyyy-MM-dd HH:mm:ss") -// .withZone(ZoneId.of("Asia/Shanghai")) -// .format(Instant.ofEpochMilli(betRecordByTimeDTO.getStartTime())); -// -// String endTime = DateTimeFormatter -// .ofPattern("yyyy-MM-dd HH:mm:ss") -// .withZone(ZoneId.of("Asia/Shanghai")) -// .format(Instant.ofEpochMilli(betRecordByTimeDTO.getEndTime())); + betRecordByTimeDTO.setAgentId(currencyDTO.getCode()); + betRecordByTimeDTO.setAgentKey(currencyDTO.getKey()); + int pageNo = 1; + int pageSize = 2000; + Map paramsMap = new HashMap<>(); + paramsMap.put("currency", currencyDTO.getCurrency()); + paramsMap.put("pageNo", pageNo); + paramsMap.put("pageSize", pageSize); + Map key = this.getKey(betRecordByTimeDTO); + + + ApiNGResponseDTO betRecordByTime = ngClient.getBetRecordByTime(paramsMap, key); + + if (this.getIsSuccess(betRecordByTime.getCode())) { + cacheSet.add(firstCurrency); + redisCache.setCacheSet(CacheConstants.PG_GAMES_BET_CURRENCY, cacheSet); + + ApiNGResponseDTO result = betRecordByTime; + AtomicInteger pageNoAtomic = new AtomicInteger(pageNo); + + + ApiGameBetRecordPageResponseDTO data = result.getData(); + //数据组装 + this.batchInsert(data); + + //总页数 + // 计算总页数,确保不会遗漏 + int totalPage = (int) Math.ceil((double) data.getTotal() / pageSize); + + // 获取下一页数据 + while (pageNoAtomic.get() < totalPage && data.getTotal() > 0) { + pageNoAtomic.incrementAndGet(); + //请求参数 + Map paramMap = new HashMap<>(); + paramMap.put("currency", currencyDTO.getCurrency()); + paramMap.put("pageNo", pageNoAtomic.get()); + paramMap.put("pageSize", pageSize); + SleepUtil.sleep(10000); + ApiNGResponseDTO betRecordByTimePage = ngClient.getBetRecordByTime(paramMap, key); + data = betRecordByTimePage.getData(); + //数据组装 + this.batchInsert(data); + } + + + } + getBetRecordByHistoryTime(betRecordByTimeDTO, currencyDTO); + return Boolean.TRUE; + } + + /** + * 按历史时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @param currencyDTO 货币dto + */ + private void getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO, GameSecretKeyCurrencyDTO currencyDTO) { + + //捞取指定30分钟前的数据 + Long startTimes = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), -30); + Long endTimes = DateUtils.getNowDate(); + betRecordByTimeDTO.setStartTime(startTimes); + betRecordByTimeDTO.setEndTime(endTimes); + + + int currentMinute = java.time.LocalTime.now().getMinute(); + // 判断当前分钟是否是 20 分、40 分或 0 分,如果不是,跳过当前执行 + if (currentMinute != 20 && currentMinute != 40 && currentMinute != 0) { + // 当前时间不是 20 分、40 分、0 分,跳过执行 + return; + } + + + String startTime = DateTimeFormatter + .ofPattern("yyyy-MM-dd HH:mm:ss") + .withZone(ZoneId.of("Asia/Shanghai")) + .format(Instant.ofEpochMilli(betRecordByTimeDTO.getStartTime())); + + String endTime = DateTimeFormatter + .ofPattern("yyyy-MM-dd HH:mm:ss") + .withZone(ZoneId.of("Asia/Shanghai")) + .format(Instant.ofEpochMilli(betRecordByTimeDTO.getEndTime())); betRecordByTimeDTO.setAgentId(currencyDTO.getCode()); @@ -522,17 +595,14 @@ public class GamesPGServiceImpl implements IGamesService { paramsMap.put("currency", currencyDTO.getCurrency()); paramsMap.put("pageNo", pageNo); paramsMap.put("pageSize", pageSize); -// paramsMap.put("startTime", startTime); -// paramsMap.put("endTime",endTime); + paramsMap.put("startTime", startTime); + paramsMap.put("endTime", endTime); Map key = this.getKey(betRecordByTimeDTO); - ApiNGResponseDTO betRecordByTime = ngClient.getBetRecordByTime(paramsMap, key); + ApiNGResponseDTO betRecordByTime = ngClient.getBetRecordByHistoryTime(paramsMap, key); if (this.getIsSuccess(betRecordByTime.getCode())) { - cacheSet.add(firstCurrency); - redisCache.setCacheSet(CacheConstants.PG_GAMES_BET_CURRENCY, cacheSet); - ApiNGResponseDTO result = betRecordByTime; AtomicInteger pageNoAtomic = new AtomicInteger(pageNo); @@ -554,8 +624,8 @@ public class GamesPGServiceImpl implements IGamesService { paramMap.put("currency", currencyDTO.getCurrency()); paramMap.put("pageNo", pageNoAtomic.get()); paramMap.put("pageSize", pageSize); -// paramMap.put("startTime", startTime); -// paramMap.put("endTime", endTime); + paramMap.put("startTime", startTime); + paramMap.put("endTime", endTime); SleepUtil.sleep(10000); ApiNGResponseDTO betRecordByTimePage = ngClient.getBetRecordByTime(paramMap, key); data = betRecordByTimePage.getData(); @@ -566,9 +636,9 @@ public class GamesPGServiceImpl implements IGamesService { } - return Boolean.TRUE; } + /** * 赠送免费局数 * @@ -591,7 +661,7 @@ public class GamesPGServiceImpl implements IGamesService { @Override public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) { - List gameBettingDetails = gameBettingDetailsService.selectGameBettingDetailsList(GameBettingDetails.builder().wagersId(getGameDetailRequestDTO.getWagersId()).build()); + List gameBettingDetails = gameBettingDetailsService.selectGameBettingDetailsList(GameBettingDetailsDTO.builder().wagersId(getGameDetailRequestDTO.getWagersId()).build()); if (!CollectionUtils.isEmpty(gameBettingDetails)) { GetGameDetailResponseDTO getGameDetailResponseDTO = new GetGameDetailResponseDTO(); getGameDetailResponseDTO.setUrl(gameBettingDetails.get(0).getBetContent()); @@ -732,7 +802,7 @@ public class GamesPGServiceImpl implements IGamesService { * * @param data 数据 */ - private void batchInsert(ApiGameBetRecordPageResponseDTO data) { + private synchronized void batchInsert(ApiGameBetRecordPageResponseDTO data) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据转化 diff --git a/ff-game/src/main/java/com/ff/game/controller/GameBettingDetailsController.java b/ff-game/src/main/java/com/ff/game/controller/GameBettingDetailsController.java index 9b46dc9..b05f2ba 100644 --- a/ff-game/src/main/java/com/ff/game/controller/GameBettingDetailsController.java +++ b/ff-game/src/main/java/com/ff/game/controller/GameBettingDetailsController.java @@ -2,6 +2,8 @@ package com.ff.game.controller; import java.util.List; import javax.servlet.http.HttpServletResponse; + +import com.ff.game.dto.GameBettingDetailsDTO; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -39,7 +41,7 @@ public class GameBettingDetailsController extends BaseController */ @PreAuthorize("@ss.hasPermi('game:details:list')") @GetMapping("/list") - public TableDataInfo list(GameBettingDetails gameBettingDetails) + public TableDataInfo list(GameBettingDetailsDTO gameBettingDetails) { startPage(); List list = gameBettingDetailsService.selectGameBettingDetailsList(gameBettingDetails); @@ -52,7 +54,7 @@ public class GameBettingDetailsController extends BaseController @PreAuthorize("@ss.hasPermi('game:details:export')") @Log(title = "会员投注细目", businessType = BusinessType.EXPORT) @PostMapping("/export") - public void export(HttpServletResponse response, GameBettingDetails gameBettingDetails) + public void export(HttpServletResponse response, GameBettingDetailsDTO gameBettingDetails) { List list = gameBettingDetailsService.selectGameBettingDetailsList(gameBettingDetails); ExcelUtil util = new ExcelUtil(GameBettingDetails.class); diff --git a/ff-game/src/main/java/com/ff/game/dto/GameBettingDetailsDTO.java b/ff-game/src/main/java/com/ff/game/dto/GameBettingDetailsDTO.java new file mode 100644 index 0000000..c7cdf0d --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/dto/GameBettingDetailsDTO.java @@ -0,0 +1,25 @@ +package com.ff.game.dto; + +import com.ff.game.domain.GameBettingDetails; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + + +/** + * 游戏投注详情dto + * + * @author shi + * @date 2025/03/24 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +public class GameBettingDetailsDTO extends GameBettingDetails { + /** + * 时间类型 1 按投注时间 2 按入库时间 + */ + private Integer timeType; +} diff --git a/ff-game/src/main/java/com/ff/game/mapper/GameBettingDetailsMapper.java b/ff-game/src/main/java/com/ff/game/mapper/GameBettingDetailsMapper.java index 9834bf6..b36844a 100644 --- a/ff-game/src/main/java/com/ff/game/mapper/GameBettingDetailsMapper.java +++ b/ff-game/src/main/java/com/ff/game/mapper/GameBettingDetailsMapper.java @@ -2,6 +2,7 @@ package com.ff.game.mapper; import java.util.List; import com.ff.game.domain.GameBettingDetails; +import com.ff.game.dto.GameBettingDetailsDTO; import org.apache.ibatis.annotations.Param; import org.springframework.security.core.parameters.P; @@ -34,10 +35,10 @@ public interface GameBettingDetailsMapper /** * 查询会员投注细目列表 * - * @param gameBettingDetails 会员投注细目 + * @param gameBettingDetailsDTO 会员投注细目 * @return 会员投注细目集合 */ - List selectGameBettingDetailsList(GameBettingDetails gameBettingDetails); + List selectGameBettingDetailsList(GameBettingDetailsDTO gameBettingDetailsDTO); /** * 新增会员投注细目 diff --git a/ff-game/src/main/java/com/ff/game/service/IGameBettingDetailsService.java b/ff-game/src/main/java/com/ff/game/service/IGameBettingDetailsService.java index d01f505..3e3b6c3 100644 --- a/ff-game/src/main/java/com/ff/game/service/IGameBettingDetailsService.java +++ b/ff-game/src/main/java/com/ff/game/service/IGameBettingDetailsService.java @@ -4,6 +4,7 @@ import java.util.List; import com.ff.game.domain.Game; import com.ff.game.domain.GameBettingDetails; +import com.ff.game.dto.GameBettingDetailsDTO; import org.apache.ibatis.annotations.Param; /** @@ -36,10 +37,10 @@ public interface IGameBettingDetailsService /** * 查询会员投注细目列表 * - * @param gameBettingDetails 会员投注细目 + * @param gameBettingDetailsDTO 会员投注细目 * @return 会员投注细目集合 */ - List selectGameBettingDetailsList(GameBettingDetails gameBettingDetails); + List selectGameBettingDetailsList(GameBettingDetailsDTO gameBettingDetailsDTO); /** * 新增会员投注细目 diff --git a/ff-game/src/main/java/com/ff/game/service/impl/GameBettingDetailsServiceImpl.java b/ff-game/src/main/java/com/ff/game/service/impl/GameBettingDetailsServiceImpl.java index 68ea26f..8dd5b2c 100644 --- a/ff-game/src/main/java/com/ff/game/service/impl/GameBettingDetailsServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/service/impl/GameBettingDetailsServiceImpl.java @@ -5,6 +5,7 @@ import java.util.List; import cn.hutool.core.util.IdUtil; import com.ff.base.utils.DateUtils; +import com.ff.game.dto.GameBettingDetailsDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ff.game.mapper.GameBettingDetailsMapper; @@ -49,13 +50,13 @@ public class GameBettingDetailsServiceImpl implements IGameBettingDetailsService /** * 查询会员投注细目列表 * - * @param gameBettingDetails 会员投注细目 + * @param gameBettingDetailsDTO 会员投注细目 * @return 会员投注细目 */ @Override - public List selectGameBettingDetailsList(GameBettingDetails gameBettingDetails) + public List selectGameBettingDetailsList(GameBettingDetailsDTO gameBettingDetailsDTO) { - return gameBettingDetailsMapper.selectGameBettingDetailsList(gameBettingDetails); + return gameBettingDetailsMapper.selectGameBettingDetailsList(gameBettingDetailsDTO); } /** diff --git a/ff-game/src/main/java/com/ff/tenant/controller/TenantBettingDetailsController.java b/ff-game/src/main/java/com/ff/tenant/controller/TenantBettingDetailsController.java index 41064d0..1b5f853 100644 --- a/ff-game/src/main/java/com/ff/tenant/controller/TenantBettingDetailsController.java +++ b/ff-game/src/main/java/com/ff/tenant/controller/TenantBettingDetailsController.java @@ -10,6 +10,7 @@ import com.ff.base.system.service.ITenantSecretKeyService; import com.ff.common.domain.TenantGameQuota; import com.ff.common.service.ITenantGameQuotaService; import com.ff.game.domain.GameBettingDetails; +import com.ff.game.dto.GameBettingDetailsDTO; import com.ff.game.service.IGameBettingDetailsService; import com.ff.tenant.dto.TenantDTO; import org.springframework.beans.factory.annotation.Autowired; @@ -45,7 +46,7 @@ public class TenantBettingDetailsController extends BaseController { */ @PreAuthorize("@ss.hasPermi('tenant:betting:list')") @GetMapping("/list") - public TableDataInfo list(GameBettingDetails gameBettingDetails) + public TableDataInfo list(GameBettingDetailsDTO gameBettingDetails) { gameBettingDetails.setTenantKey(getUsername()); startPage(); diff --git a/ff-game/src/main/java/com/ff/tenant/controller/TenantQuotaController.java b/ff-game/src/main/java/com/ff/tenant/controller/TenantQuotaController.java index 2812be4..2d10a79 100644 --- a/ff-game/src/main/java/com/ff/tenant/controller/TenantQuotaController.java +++ b/ff-game/src/main/java/com/ff/tenant/controller/TenantQuotaController.java @@ -3,6 +3,7 @@ package com.ff.tenant.controller; import com.ff.base.core.controller.BaseController; import com.ff.base.core.page.TableDataInfo; import com.ff.game.domain.GameBettingDetails; +import com.ff.game.dto.GameBettingDetailsDTO; import com.ff.game.service.IGameBettingDetailsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; @@ -37,7 +38,7 @@ public class TenantQuotaController extends BaseController { */ @PreAuthorize("@ss.hasPermi('tenant:betting:list')") @GetMapping("/list") - public TableDataInfo list(GameBettingDetails gameBettingDetails) + public TableDataInfo list(GameBettingDetailsDTO gameBettingDetails) { gameBettingDetails.setTenantKey(getUsername()); startPage(); diff --git a/ff-game/src/main/resources/mapper/game/GameBettingDetailsMapper.xml b/ff-game/src/main/resources/mapper/game/GameBettingDetailsMapper.xml index c40a586..290a6c2 100644 --- a/ff-game/src/main/resources/mapper/game/GameBettingDetailsMapper.xml +++ b/ff-game/src/main/resources/mapper/game/GameBettingDetailsMapper.xml @@ -42,7 +42,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select id,tenant_key, currency_code, member_id, game_code, game_id, game_type, platform_code, game_name, game_status, game_status_type, game_currency_code, account, round, `table`, seat, bet_content, wagers_id, wagers_time, bet_amount, payoff_time, payoff_amount, settlement_time, turnover, order_no, settlement_status, create_by, create_time, update_by, update_time from ff_game_betting_details - and tenant_key = #{tenantKey} @@ -66,13 +66,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and turnover = #{turnover} and order_no = #{orderNo} and settlement_status = #{settlementStatus} - + AND wagers_time >= #{params.beginTime} - + AND wagers_time <= #{params.endTime} + + AND create_time >= #{params.beginTime} + + + AND create_time <= #{params.endTime} + +