Compare commits

..

No commits in common. "1fd1e10339d35e5bd082edda5daa69d5787c2846" and "61ebcb15aa9948ec36cc70dba39a23cf79554609" have entirely different histories.

35 changed files with 40 additions and 1618 deletions

View File

@ -57,13 +57,6 @@ public class CacheConstants
*/ */
public static final String PG_GAMES= "pg_games:"; public static final String PG_GAMES= "pg_games:";
/**
* fc
*/
public static final String FC_GAMES= "fc_games:";
/** /**
* pg * pg
*/ */

View File

@ -188,11 +188,6 @@ public class Constants {
*/ */
public static final String NG_API_BASE_URL = "ng.api.base.url"; public static final String NG_API_BASE_URL = "ng.api.base.url";
/**
* fc-apiurl
*/
public static final String FC_API_BASE_URL = "fc.api.base.url";
/** /**
* *
*/ */

View File

@ -23,11 +23,7 @@ public enum ErrorCode {
FREQUENT_INTERFACE_REQUESTS (1007, "接口请求频繁"), FREQUENT_INTERFACE_REQUESTS (1007, "接口请求频繁"),
BALANCE_TRANSFER_FAILED (1008, "余额转移失败"), BALANCE_TRANSFER_FAILED (1008, "余额转移失败"),
LANG_NOT_EXIST(1009, "游戏平台不支持的语言"), LANG_NOT_EXIST(1009, "游戏平台不支持的语言"),
ORDER_NOT_EXIST(1010, "订单不存在"), ORDER_NOT_EXIST(1010, "订单不存在")
PLAYERS_ARE_PLAYING(1011, "玩家游玩中"),
INSUFFICIENT_PLAYER_BALANCE(1012, "玩家余额不足"),
KICK_OUT_AILED(1013, "玩家踢出失败"),
ACCOUNT_NOT_ONLINE(1014, "账号不在线"),
; ;
// 获取错误码 // 获取错误码

View File

@ -1,68 +0,0 @@
package com.ff.base.enums;
import lombok.Getter;
import java.util.HashMap;
import java.util.Optional;
import java.util.stream.Stream;
/**
* xkgame
*
* @author shi
* @date 2024/11/13
*/
@Getter
public enum FCGameType {
CATCH_FISH("fishing", 4,"捕鱼"),
ARCADE("arcade",1, "电子"),
SLOT("slot",1, "电子"),
TABLE("table", 1,"电子"),
CATCH_FISH_MEMBER("1", 4,"捕鱼"),
ARCADE_MEMBER("2", 1,"电子"),
SLOT_MEMBER("7", 1,"电子"),
TABLE_MEMBER("8", 1,"电子"),
;
private final String code;
private final Integer systemCode;
private final String info;
FCGameType(String code, Integer systemCode, String info)
{
this.code = code;
this.systemCode = systemCode;
this.info = info;
}
/**
*
*
* @param code
* @return {@link String }
*/
public static Integer findSystemByCode(String code) {
Optional<Integer> system = Stream.of(FCGameType.values())
.filter(gameType -> gameType.getCode().equals(code))
.map(FCGameType::getSystemCode)
.findFirst();
return system.orElse(null);
}
/**
*
*
* @param code
* @return {@link String }
*/
public static String findInfoByCode(String code) {
Optional<String> system = Stream.of(FCGameType.values())
.filter(gameType -> gameType.getCode().equals(code))
.map(FCGameType::getInfo)
.findFirst();
return system.orElse(null);
}
}

View File

@ -1,23 +0,0 @@
package com.ff.base.enums;
import lombok.Getter;
/**
*
*
* @author shi
* @date 2025/03/12
*/
@Getter
public enum FCTransferType {
TRANSFER_OUT("0", "不全部提领(默认值)"),
TRANSFER_OUT_ALL("1", "全部提领(包含所有小数字金额)");
private final String value;
private final String description;
FCTransferType(String value, String description) {
this.value = value;
this.description = description;
}
}

View File

@ -7,7 +7,6 @@ public enum GamePlatforms {
JILI("JILI", "JILI"), JILI("JILI", "JILI"),
XK("XK", "XK"), XK("XK", "XK"),
PG("PG", "PG"), PG("PG", "PG"),
FC("FC", "FC"),
; ;
private final String code; private final String code;

View File

@ -1,30 +0,0 @@
package com.ff.base.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
*
*
* @author shi
* @date 2025/03/25
*/
@Getter
@AllArgsConstructor
public enum PlatformType {
ELECTRONIC(1, "电子"),
CARD_GAME(2, "棋牌"),
GAME_HALL(3, "游戏大厅"),
FISHING(4, "捕鱼"),
BETTING_MACHINE(5, "押分机 (含宾果)"),
VIDEO(6, "视讯"),
LOTTERY(7, "彩票"),
SPORTS(8, "体育"),
HUNTING(9, "捕猎");
private final int code;
private final String name;
}

View File

@ -9,7 +9,8 @@ package com.ff.base.enums;
*/ */
public enum TransferType { public enum TransferType {
ALL(1, "从游戏商转移额度到平台商(不看amount值全部转出"), ALL(1, "从游戏商转移额度到平台商(不看amount值全部转出"),
GAMES(2, "从平台商转移额度到游戏商"); GAMES(2, "从平台商转移额度到游戏商"),
SYSTEM(3, "从游戏商转移额度到平台商 无用");
private final Integer code; private final Integer code;
private final String info; private final String info;

View File

@ -202,27 +202,6 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
return zdt.format(formatter); return zdt.format(formatter);
} }
/**
*
*
* @param timestampInMillis
* @param timeZone America/New_York
* @param format yyyy-MM-dd HH:mm:ss
* @return
*/
public static String convertTimeZone(long timestampInMillis, String timeZone, String format) {
// 将毫秒时间戳转换为 Instant
Instant instant = Instant.ofEpochMilli(timestampInMillis);
// 将 UTC 时间转换为指定时区的时间
ZonedDateTime zonedDateTime = instant.atZone(ZoneId.of(timeZone));
// 格式化输出为指定格式的时间字符串
return zonedDateTime.format(DateTimeFormatter.ofPattern(format));
}
/** /**
* LocalDate ==> Date * LocalDate ==> Date
*/ */

View File

@ -261,6 +261,7 @@ public class ApiGameController extends BaseController {
} }
/** /**
* *
* *
@ -351,6 +352,7 @@ public class ApiGameController extends BaseController {
public AjaxResult getDetail(@Validated @RequestBody GameGetDetailRequest gameGetDetailRequest) { public AjaxResult getDetail(@Validated @RequestBody GameGetDetailRequest gameGetDetailRequest) {
GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
.platformCode(gameGetDetailRequest.getPlatformCode()) .platformCode(gameGetDetailRequest.getPlatformCode())
.systemCurrency(gameGetDetailRequest.getCurrencyCode()).build()); .systemCurrency(gameGetDetailRequest.getCurrencyCode()).build());
@ -363,6 +365,7 @@ public class ApiGameController extends BaseController {
ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode()); ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode());
GameSecretKeyLangDTO gameSecretKeyLang = gameSecretKeyLangService.findGameSecretKeyLangDTO(GameSecretKeyLangDTO.builder() GameSecretKeyLangDTO gameSecretKeyLang = gameSecretKeyLangService.findGameSecretKeyLangDTO(GameSecretKeyLangDTO.builder()
.platformCode(gameGetDetailRequest.getPlatformCode()) .platformCode(gameGetDetailRequest.getPlatformCode())
.systemLangCode(gameGetDetailRequest.getLangCode()) .systemLangCode(gameGetDetailRequest.getLangCode())
@ -370,6 +373,7 @@ public class ApiGameController extends BaseController {
ApiException.notNull(gameSecretKeyLang, ErrorCode.LANG_NOT_EXIST.getCode()); ApiException.notNull(gameSecretKeyLang, ErrorCode.LANG_NOT_EXIST.getCode());
GetGameDetailResponseDTO gameDetail = iGamesService.getGameDetail(GetGameDetailRequestDTO.builder() GetGameDetailResponseDTO gameDetail = iGamesService.getGameDetail(GetGameDetailRequestDTO.builder()
.wagersId(gameGetDetailRequest.getWagersId()) .wagersId(gameGetDetailRequest.getWagersId())
.lang(gameSecretKeyLang.getLang()) .lang(gameSecretKeyLang.getLang())
@ -393,6 +397,7 @@ public class ApiGameController extends BaseController {
ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode());
Member member = memberService.selectMemberByAccount(gameKickMemeberRequest.getAccount(), gameKickMemeberRequest.getCurrencyCode(), gameKickMemeberRequest.getPlatformCode()); Member member = memberService.selectMemberByAccount(gameKickMemeberRequest.getAccount(), gameKickMemeberRequest.getCurrencyCode(), gameKickMemeberRequest.getPlatformCode());
ApiException.notNull(member, ErrorCode.ACCOUNT_NOT_EXIST.getCode()); ApiException.notNull(member, ErrorCode.ACCOUNT_NOT_EXIST.getCode());
@ -404,7 +409,6 @@ public class ApiGameController extends BaseController {
return AjaxResult.success(iGamesService.kickMember(KickMemberRequestDTO.builder() return AjaxResult.success(iGamesService.kickMember(KickMemberRequestDTO.builder()
.account(member.getGameAccount()) .account(member.getGameAccount())
.agentId(gameSecretKey.getCode()) .agentId(gameSecretKey.getCode())
.currency(gameSecretKey.getCurrency())
.agentKey(gameSecretKey.getKey()) .agentKey(gameSecretKey.getKey())
.build())); .build()));
} }
@ -420,12 +424,9 @@ public class ApiGameController extends BaseController {
IGamesService iGamesService = gamesService.get(gameKickMemeberAllRequest.getPlatformCode() + Constants.SERVICE); IGamesService iGamesService = gamesService.get(gameKickMemeberAllRequest.getPlatformCode() + Constants.SERVICE);
ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode()); ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode());
KickMemberAllDTO kickMemberAllDTO = KickMemberAllDTO.builder() KickMemberAllDTO kickMemberAllDTO = KickMemberAllDTO.builder()
.agentId(gameSecretKey.getCode()) .agentId(gameSecretKey.getCode())
.agentKey(gameSecretKey.getKey()) .agentKey(gameSecretKey.getKey())
.currency(gameSecretKey.getCurrency())
.build(); .build();
if (!ObjectUtils.isEmpty(gameKickMemeberAllRequest.getGameId())) { if (!ObjectUtils.isEmpty(gameKickMemeberAllRequest.getGameId())) {
Game game = gameService.selectGameById(gameKickMemeberAllRequest.getGameId()); Game game = gameService.selectGameById(gameKickMemeberAllRequest.getGameId());
@ -507,6 +508,9 @@ public class ApiGameController extends BaseController {
TenantSecretKey tenantSecretKey = keyConfig.get(); TenantSecretKey tenantSecretKey = keyConfig.get();
List<GameSecretKeyCurrencyDTO> gameSecretKeys = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO.builder() List<GameSecretKeyCurrencyDTO> gameSecretKeys = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO.builder()
.systemCurrency(gameExchangeBalanceAllRequest.getCurrencyCode()).build()); .systemCurrency(gameExchangeBalanceAllRequest.getCurrencyCode()).build());

View File

@ -39,8 +39,8 @@ public class GameGetDetailRequest implements Serializable {
/** /**
* id * id
*/ */
@NotBlank(message = "wagersId不能为空") @NotNull(message = "wagersId不能为空")
private String wagersId; private Long wagersId;
/** /**
* *

View File

@ -80,14 +80,6 @@ public interface IGamesService {
Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO); Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO);
/**
*
*
* @param betRecordByTimeDTO dto
* @return {@link Boolean }
*/
Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO);
/** /**
* *
* *

View File

@ -1,24 +0,0 @@
package com.ff.game.api.fc.address;
import com.dtflys.forest.callback.AddressSource;
import com.dtflys.forest.http.ForestAddress;
import com.dtflys.forest.http.ForestRequest;
import com.ff.base.constant.Constants;
import com.ff.base.system.service.ISysConfigService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class MyFCAddressSource implements AddressSource {
@Resource
private ISysConfigService configService;
@Override
public ForestAddress getAddress(ForestRequest request) {
String apiBaseUrl = configService.selectConfigByKey(Constants.FC_API_BASE_URL);
return new ForestAddress("https",apiBaseUrl, 443,"");
}
}

View File

@ -1,113 +0,0 @@
package com.ff.game.api.fc.client;
import com.dtflys.forest.annotation.Address;
import com.dtflys.forest.annotation.JSONBody;
import com.dtflys.forest.annotation.Post;
import com.ff.game.api.fc.dto.*;
import com.ff.game.api.fc.address.MyFCAddressSource;
import com.ff.game.api.ng.dto.*;
import java.util.Map;
/**
* ng
*
* @author shi
* @date 2025/03/11
*/
@Address(source = MyFCAddressSource.class)
public interface FCClient {
/**
*
*
* @param parameters
* @return {@link String }
*/
@Post("/AddMember")
ApiFCResult createMember(@JSONBody Map<String, Object> parameters);
/**
*
*
* @param parameters
* @return {@link ApiFCResult }
*/
@Post("/KickOut")
ApiFCResult kickMember(@JSONBody Map<String, Object> parameters);
/**
*
*
* @param parameters
* @return {@link ApiFCResult }
*/
@Post("/KickoutAll")
ApiFCResult kickMemberAll(@JSONBody Map<String, Object> parameters);
/**
*
*
* @param parameters
* @return {@link ApiNGResponseDTO }<{@link String }>
*/
@Post("/SearchMember")
ApiFCUserInfoResponseDTO getMemberInfo(@JSONBody Map<String, Object> parameters);
/**
*
*
* @param parameters
* @return {@link ApiFCGameListResponseDTO }
*/
@Post("/GetGameIconList")
ApiFCGameListResponseDTO getGameList(@JSONBody Map<String, Object> parameters);
/**
*
*
* @param parameters
* @return {@link ApiFCLoginResponseDTO }
*/
@Post("/Login")
ApiFCLoginResponseDTO loginWithoutRedirect(@JSONBody Map<String, Object> parameters);
/**
* id
*
* @param parameters
*/
@Post(url = "/SetPoints",connectTimeout = 70000)
ApiCFBalanceTransferResponseDTO exchangeTransferByAgentId(@JSONBody Map<String, Object> parameters);
/**
*
*
* @param parameters
*/
@Post(url = "/GetRecordList")
ApiFCBetRecordResponseDTO getBetRecordByTime(@JSONBody Map<String, Object> parameters);
/**
*
*
* @param parameters
* @return {@link ApiFCBetRecordResponseDTO }
*/
@Post(url = "/GetHistoryRecordList")
ApiFCBetRecordResponseDTO getBetRecordByHistoryTime(@JSONBody Map<String, Object> parameters);
}

View File

@ -1,47 +0,0 @@
package com.ff.game.api.fc.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* apidto
*
* @author shi
* @date 2025/03/25
*/
@Data
public class ApiCFBalanceTransferResponseDTO {
/**
* 0
*/
@JsonProperty("Result")
private int result;
/**
* ID
*/
@JsonProperty("BankID")
private int bankID;
/**
* ID
*/
@JsonProperty("TrsID")
private String trsID;
/**
*
*/
@JsonProperty("AfterPoint")
private BigDecimal afterPoint;
/**
*
*/
@JsonProperty("Points")
private BigDecimal points;
}

View File

@ -1,166 +0,0 @@
package com.ff.game.api.fc.dto;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
*
*/
@Data
public class ApiFCBetRecordResponseDTO {
/**
* 0
*/
@JsonProperty("Result")
private int Result;
/**
*
*/
@JsonProperty("Records")
private List<BetRecord> Records;
/**
*
*/
@Data
public static class BetRecord {
/**
*
*/
@JsonProperty("bet")
private BigDecimal bet;
/**
* ( Lucky9 Bet = validBet)
*/
@JsonProperty("validBet")
private BigDecimal validBet;
/**
*
*/
@JsonProperty("prize")
private BigDecimal prize;
/**
* 退 ( Lucky9 refund = win)
*/
@JsonProperty("refund")
private BigDecimal refund;
/**
* prize - validBet
*/
@JsonProperty("winlose")
private BigDecimal winlose;
/**
* ( Lucky9 0)
*/
@JsonProperty("commission")
private BigDecimal commission;
/**
*
*/
@JsonProperty("before")
private BigDecimal before;
/**
*
*/
@JsonProperty("after")
private BigDecimal after;
/**
* ()
*/
@JsonProperty("jptax")
private BigDecimal jptax;
/**
*
*/
@JsonProperty("jppoints")
private BigDecimal jppoints;
/**
*
*/
@JsonProperty("inGameJptax")
private BigDecimal inGameJptax;
/**
*
*/
@JsonProperty("inGameJppoints")
private BigDecimal inGameJppoints;
/**
* ()24
*/
@JsonProperty("recordID")
private String recordID;
/**
*
*/
@JsonProperty("account")
private String account;
/**
*
*/
@JsonProperty("gameID")
private String gameID;
/**
*
*/
@JsonProperty("gametype")
private String gametype;
/**
*
*/
@JsonProperty("jpmode")
private int jpmode;
/**
*
*/
@JsonProperty("inGameJpmode")
private int inGameJpmode;
/**
*
*/
@JsonProperty("bdate")
private Date bdate;
/**
*
*/
@JsonProperty("isBuyFeature")
private boolean isBuyFeature;
/**
*
*/
@JsonProperty("gameMode")
private int gameMode;
}
}

View File

@ -1,67 +0,0 @@
package com.ff.game.api.fc.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.Map;
/**
* API DTO
*/
@Data
public class ApiFCGameListResponseDTO {
/**
* 0
*/
@JsonProperty("Result")
private int result;
/**
*
*/
@JsonProperty("GetGameIconList")
private Map<String, Map<String, GameDetails>> getGameIconList;
/**
*
*/
@Data
public static class GameDetails {
/**
*
*/
private String status;
/**
* id
*/
private Long systemGameId;
/**
* id
*/
private String gameId;
/**
*
*/
private String gameNameOfChinese;
/**
*
*/
private String gameNameOfEnglish;
/**
* URL
*/
private String enUrl;
/**
* URL
*/
private String cnUrl;
}
}

View File

@ -1,24 +0,0 @@
package com.ff.game.api.fc.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* API DTO
*/
@Data
public class ApiFCLoginResponseDTO {
/**
* 0
*/
@JsonProperty("Result")
private int result;
/**
* URL
*/
@JsonProperty("Url")
private String url;
}

View File

@ -1,19 +0,0 @@
package com.ff.game.api.fc.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
*
*
* @author shi
* @date 2025/03/24
*/
@Data
public class ApiFCResult {
/**
* 0
*/
@JsonProperty("Result")
private int result;
}

View File

@ -1,35 +0,0 @@
package com.ff.game.api.fc.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* API DTO
*
* @author shi
* @date 2025/03/25
*/
@Data
public class ApiFCUserInfoResponseDTO {
/**
* 0
*/
@JsonProperty("Result")
private int result;
/**
* 线
*/
@JsonProperty("OnlineType")
private int onlineType;
/**
*
*/
@JsonProperty("Points")
private BigDecimal points;
}

View File

@ -1,68 +0,0 @@
package com.ff.game.api.fc.dto;
import lombok.Data;
import java.util.List;
/**
* API
*/
@Data
public class ApiKeyRequest {
/**
*
*/
private String params;
/**
*
*/
private ReParams reParams;
/**
*
*/
private String sign;
/**
* ReParams
*/
@Data
public static class ReParams {
/**
*
*/
private String memberAccount;
/**
* ID
*/
private int gameID;
/**
* ID
*/
private int languageID;
/**
*
*/
private String homeUrl;
/**
*
*/
private boolean jackpotStatus;
/**
*
*/
private boolean loginGameHall;
/**
*
*/
private List<Integer> gameHallGameType;
}
}

View File

@ -1,721 +0,0 @@
package com.ff.game.api.fc.impl;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.druid.support.json.JSONUtils;
import com.ff.base.constant.CacheConstants;
import com.ff.base.constant.Constants;
import com.ff.base.core.redis.RedisCache;
import com.ff.base.enums.*;
import com.ff.base.exception.base.ApiException;
import com.ff.base.exception.base.BaseException;
import com.ff.base.system.service.ISysConfigService;
import com.ff.base.utils.DateUtils;
import com.ff.base.utils.sign.Md5Utils;
import com.ff.config.KeyConfig;
import com.ff.game.api.IGamesService;
import com.ff.game.api.fc.dto.*;
import com.ff.game.api.fc.client.FCClient;
import com.ff.game.api.ng.client.NGClient;
import com.ff.game.api.request.*;
import com.ff.game.domain.*;
import com.ff.game.dto.GameBettingDetailsDTO;
import com.ff.game.dto.GameSecretKeyCurrencyDTO;
import com.ff.game.service.*;
import com.ff.member.domain.Member;
import com.ff.member.service.IMemberService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
*
*
* @author shi
* @date 2024/10/21
*/
@Service("FCService")
@Slf4j
public class GamesFCServiceImpl implements IGamesService {
@Resource
private ISysConfigService configService;
@Resource
private RedisCache redisCache;
@Resource
private IGameExchangeMoneyService gameExchangeMoneyService;
@Resource
private IGamePlatformService gamePlatformService;
@Resource
private IGameService gameService;
@Resource
private IMemberService memberService;
@Resource
private IGameFreeRecordService gameFreeRecordService;
@Resource
private IGameSecretKeyService gameSecretKeyService;
@Resource
private FCClient FCClient;
@Resource
private KeyConfig keyConfig;
@Resource
private IGameBettingDetailsService gameBettingDetailsService;
@Resource
private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService;
@Resource
private IGameNameService gameNameService;
@Resource
private IGameSecretKeyLangService gameSecretKeyLangService;
@Autowired
@Qualifier("threadPoolTaskExecutor")
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
/**
*
*
* @param errorCode
* @return {@link Boolean }
*/
private Boolean getIsSuccess(Integer errorCode) {
ApiException.isTrue(503 != errorCode, ErrorCode.PLAYERS_ARE_PLAYING.getCode());
ApiException.isTrue(203 != errorCode, ErrorCode.INSUFFICIENT_PLAYER_BALANCE.getCode());
ApiException.isTrue(504 != errorCode, ErrorCode.ACCOUNT_NOT_ONLINE.getCode());
return 0 == errorCode;
}
/**
*
*
* @param paramsMap
* @param agentKey
* @return {@link String }
*/
private static String getKey(Map<String, Object> paramsMap, String agentKey) {
try {
Base64.Encoder encoder = Base64.getEncoder();
SecretKeySpec keySpec = new SecretKeySpec(agentKey.getBytes(StandardCharsets.UTF_8), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
return encoder.encodeToString(cipher.doFinal(JSONUtils.toJSONString(paramsMap).getBytes(StandardCharsets.UTF_8)));
} catch (Exception e) {
throw new BaseException("加密失败");
}
}
/**
*
*
* @param paramsMap
* @param agentKey
* @param currency
* @return {@link Map }<{@link String },{@link Object }>
*/
private Map<String, Object> getKeyMap(Map<String, Object> paramsMap, String agentKey, String currency, String agentId) {
Map<String, Object> keyMap = new HashMap<>();
String key = getKey(paramsMap, agentKey);
keyMap.put("Sign", Md5Utils.md5New(JSONUtils.toJSONString(paramsMap)));
keyMap.put("AgentCode", agentId);
keyMap.put("Currency", currency);
keyMap.put("Params", key);
return keyMap;
}
/**
*
*
* @param gamesBaseRequestDTO dto
* @return {@link String }
*/
private String decryptKey(GamesBaseRequestDTO gamesBaseRequestDTO) {
try {
String val = "SBF6G5gFvW5n4aFSFCar9Im0CHgBMyU7OxFTuuB6InmRkm6Qt4K2pfktU=";
Base64.Decoder decoder = Base64.getDecoder();
SecretKeySpec keySpec = new SecretKeySpec("gamesBaseRequestDTO.getAgentKey()".getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, keySpec);
return new String(cipher.doFinal(decoder.decode(val)));
} catch (Exception e) {
throw new BaseException("解密失败");
}
}
/**
*
*
* @param createMemberRequestDTO dto
* @return {@link Boolean }
*/
@Override
public Boolean createMember(CreateMemberRequestDTO createMemberRequestDTO) {
log.info("GamesFCServiceImpl [createMember] 请求参数 {}", createMemberRequestDTO);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("MemberAccount", createMemberRequestDTO.getAccount());
paramsMap.putAll(getKeyMap(paramsMap, createMemberRequestDTO.getAgentKey(), createMemberRequestDTO.getCurrency(), createMemberRequestDTO.getAgentId()));
ApiFCResult apiFCResult = FCClient.createMember(paramsMap);
int errorCode = apiFCResult.getResult();
if (0 == errorCode) {
return Boolean.TRUE;
}
//判断是否获取成功
return Boolean.FALSE;
}
/**
*
*
* @param memberInfoRequestDTO dto
* @return {@link MemberInfoResponseDTO }
*/
@Override
public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO memberInfoRequestDTO) {
log.info("GamesFCServiceImpl [getMemberInfo] 请求参数 {}", memberInfoRequestDTO);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("MemberAccount", memberInfoRequestDTO.getAccounts());
paramsMap.putAll(getKeyMap(paramsMap, memberInfoRequestDTO.getAgentKey(), memberInfoRequestDTO.getCurrency(), memberInfoRequestDTO.getAgentId()));
ApiFCUserInfoResponseDTO apiFCUserInfoResponseDTO = FCClient.getMemberInfo(paramsMap);
int errorCode = apiFCUserInfoResponseDTO.getResult();
if (this.getIsSuccess(errorCode)) {
return MemberInfoResponseDTO.builder().account(memberInfoRequestDTO.getAccounts())
.balance(apiFCUserInfoResponseDTO.getPoints())
.status(apiFCUserInfoResponseDTO.getOnlineType() != 0 ? GameMemberStatus.ONLINE.getCode() : GameMemberStatus.OFFLINE.getCode()).build();
} else {
throw new ApiException(ErrorCode.ACCOUNT_NOT_EXIST.getCode());
}
}
/**
*
*
* @param gamesLogin
* @return {@link String }
*/
@Override
public String loginWithoutRedirect(GamesLogin gamesLogin) {
log.info("GamesFCServiceImpl [loginWithoutRedirect] 请求参数 {}", gamesLogin);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("MemberAccount", gamesLogin.getAccount());
paramsMap.put("GameID", gamesLogin.getGameId());
paramsMap.put("LanguageID", gamesLogin.getLang());
paramsMap.put("HomeUrl", gamesLogin.getHomeUrl());
paramsMap.putAll(getKeyMap(paramsMap, gamesLogin.getAgentKey(), gamesLogin.getCurrency(), gamesLogin.getAgentId()));
ApiFCLoginResponseDTO apiFCLoginResponseDTO = FCClient.loginWithoutRedirect(paramsMap);
if (this.getIsSuccess(apiFCLoginResponseDTO.getResult())) {
return apiFCLoginResponseDTO.getUrl();
} else {
throw new ApiException(ErrorCode.ACCOUNT_NOT_EXIST.getCode());
}
}
/**
*
*
* @param gamesBaseRequestDTO dto
* @return {@link String }
*/
@Transactional
@Override
public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) {
List<ApiFCGameListResponseDTO.GameDetails> apiGameInfoResponseDTOS = redisCache.getCacheList(CacheConstants.FC_GAMES);
if (!CollectionUtils.isEmpty(apiGameInfoResponseDTOS)) {
return CacheConstants.FC_GAMES;
}
gamesBaseRequestDTO.setCurrency("CNY");
log.info("GamesFCServiceImpl [getGameList] 请求参数 {}", gamesBaseRequestDTO);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.putAll(getKeyMap(paramsMap, gamesBaseRequestDTO.getAgentKey(), gamesBaseRequestDTO.getCurrency(), gamesBaseRequestDTO.getAgentId()));
ApiFCGameListResponseDTO gameList = FCClient.getGameList(paramsMap);
if (this.getIsSuccess(gameList.getResult())) {
List<ApiFCGameListResponseDTO.GameDetails> gameDetailsList = new ArrayList<>();
for (String gameTypeKey : gameList.getGetGameIconList().keySet()) {
Map<String, ApiFCGameListResponseDTO.GameDetails> integerGameDetailsMap = gameList.getGetGameIconList().get(gameTypeKey);
GamePlatform gamePlatform = GamePlatform.builder()
.platformType(FCGameType.findSystemByCode(gameTypeKey))
.platformCode(GamePlatforms.FC.getCode())
.build();
List<GamePlatform> gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform);
//没有此平台就新增一个平台
if (CollectionUtils.isEmpty(gamePlatforms)) {
gamePlatform.setPlatformName(GamePlatforms.FC.getInfo() + FCGameType.findInfoByCode(gameTypeKey));
gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1);
gamePlatform.setCreateBy(Constants.SYSTEM);
gamePlatformService.insertGamePlatform(gamePlatform);
} else {
gamePlatform = gamePlatforms.get(0);
}
//新增游戏
for (String gameIdKey : integerGameDetailsMap.keySet()) {
ApiFCGameListResponseDTO.GameDetails gameDetails = integerGameDetailsMap.get(gameIdKey);
Game game = Game.builder()
.platformId(gamePlatform.getId())
.gameCode(gameIdKey)
.build();
List<Game> games = gameService.selectGameList(game);
//不存在这个游戏
if (CollectionUtils.isEmpty(games)) {
game.setGameSourceType(PlatformType.ELECTRONIC.getCode());
game.setFreespin(Boolean.FALSE);
game.setDemoStatus(Boolean.TRUE);
game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1);
game.setGameName(gameDetails.getGameNameOfChinese());
game.setCreateBy(Constants.SYSTEM);
gameService.insertGame(game);
} else {
game = games.get(0);
}
gameDetails.setSystemGameId(game.getId());
List<GameName> gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(gameDetails.getGameNameOfChinese()).build());
if (CollectionUtils.isEmpty(gameNames)) {
gameNameService.insertGameName(GameName.builder()
.gameId(game.getId())
.gameName(gameDetails.getGameNameOfChinese())
.langCode("zh-CN")
.createBy(Constants.SYSTEM)
.build());
}
gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(gameDetails.getGameNameOfEnglish()).build());
if (CollectionUtils.isEmpty(gameNames)) {
gameNameService.insertGameName(GameName.builder()
.gameId(game.getId())
.gameName(gameDetails.getGameNameOfEnglish())
.langCode("en-US")
.createBy(Constants.SYSTEM)
.build());
}
gameDetails.setGameId(gameIdKey);
gameDetailsList.add(gameDetails);
}
}
redisCache.deleteObject(CacheConstants.FC_GAMES);
redisCache.setCacheList(CacheConstants.FC_GAMES, gameDetailsList);
redisCache.expire(CacheConstants.FC_GAMES, 5L, TimeUnit.HOURS);
} else {
throw new ApiException(ErrorCode.ERROR.getCode());
}
return CacheConstants.FC_GAMES;
}
/**
* id
*
* @param exchangeTransferMoneyRequestDTO moeny dto
* @return {@link Long }
*/
@Override
@Transactional
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) {
log.info("GamesFCServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO);
GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
.platformCode(GamePlatforms.FC.getCode())
.code(exchangeTransferMoneyRequestDTO.getAgentId())
.currency(exchangeTransferMoneyRequestDTO.getCurrency())
.build());
Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount());
String transactionId = gameExchangeMoneyService.getTransactionId(GamePlatforms.FC.getCode(), 30);
List<GameExchangeMoney> gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList(
GameExchangeMoney.builder()
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
.build()
);
Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复");
//获取下一个自增id
GameExchangeMoney exchangeMoney = GameExchangeMoney
.builder()
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
.quota(exchangeTransferMoneyRequestDTO.getQuota())
.balance(exchangeTransferMoneyRequestDTO.getAmount())
.exchangeType(exchangeTransferMoneyRequestDTO.getTransferType())
.currencyCode(currencyDTO.getSystemCurrency())
.memberId(member.getId())
.transactionId(transactionId)
.platformCode(GamePlatforms.FC.getCode())
.build();
exchangeMoney.setCreateBy(Constants.SYSTEM);
//获取余额
String type = TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType()) ? FCTransferType.TRANSFER_OUT_ALL.getValue() : FCTransferType.TRANSFER_OUT.getValue();
BigDecimal amount = exchangeTransferMoneyRequestDTO.getAmount();
//获取当前游戏币
MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder()
.accounts(member.getGameAccount())
.agentId(exchangeTransferMoneyRequestDTO.getAgentId())
.agentKey(exchangeTransferMoneyRequestDTO.getAgentKey())
.currency(currencyDTO.getCurrency())
.build();
MemberInfoResponseDTO memberInfo = this.getMemberInfo(gamesBaseRequestDTO);
//判断是不是转出
if (NGTransferType.TRANSFER_OUT.getValue().equals(type)) {
exchangeTransferMoneyRequestDTO.setAmount(memberInfo.getBalance());
}
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("MemberAccount", exchangeTransferMoneyRequestDTO.getAccount());
paramsMap.put("TrsID", transactionId);
paramsMap.put("AllOut", type);
paramsMap.put("Points", amount);
paramsMap.putAll(getKeyMap(paramsMap, gamesBaseRequestDTO.getAgentKey(), gamesBaseRequestDTO.getCurrency(), gamesBaseRequestDTO.getAgentId()));
ApiCFBalanceTransferResponseDTO transferResponseDTO = FCClient.exchangeTransferByAgentId(paramsMap);
if (this.getIsSuccess(transferResponseDTO.getResult())) {
//更新数据
exchangeMoney.setBalance(transferResponseDTO.getPoints().abs());
exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue());
exchangeMoney.setCoinBefore(NumberUtil.sub(transferResponseDTO.getAfterPoint(), exchangeMoney.getBalance()).abs());
exchangeMoney.setCoinAfter(transferResponseDTO.getAfterPoint());
exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore());
exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter());
exchangeMoney.setStatus(StatusType.SUCCESS.getValue());
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
} else {
log.error("GamesFCServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{}", transferResponseDTO.getResult());
throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode());
}
return exchangeMoney.getId();
}
/**
*
*
* @param exchangeTransferMoneyRequestDTO dto
* @return {@link Boolean }
*/
@Override
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
return Boolean.TRUE;
}
/**
*
*
* @param betRecordByTimeDTO dto
* @return {@link Boolean }
*/
@Override
public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) {
List<GameSecretKeyCurrencyDTO> gameSecretKeyCurrencies = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO.builder()
.platformCode(GamePlatforms.FC.getCode())
.build());
for (GameSecretKeyCurrency gameSecretKeyCurrency : gameSecretKeyCurrencies) {
String startTime = DateUtils.convertTimeZone(betRecordByTimeDTO.getStartTime(), "America/New_York", DateUtils.YYYY_MM_DD_HH_MM_SS);
String endTime = DateUtils.convertTimeZone(betRecordByTimeDTO.getEndTime(), "America/New_York", DateUtils.YYYY_MM_DD_HH_MM_SS);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("StartDate", startTime);
paramsMap.put("EndDate", endTime);
paramsMap.putAll(getKeyMap(paramsMap, betRecordByTimeDTO.getAgentKey(), gameSecretKeyCurrency.getCurrency(), betRecordByTimeDTO.getAgentId()));
ApiFCBetRecordResponseDTO betRecordByTime = FCClient.getBetRecordByTime(paramsMap);
if (this.getIsSuccess(betRecordByTime.getResult())) {
//数据组装
this.batchInsert(betRecordByTime, gameSecretKeyCurrency.getSystemCurrency(), gameSecretKeyCurrency.getCurrency());
}
}
return Boolean.TRUE;
}
/**
*
*
* @param betRecordByTimeDTO dto
* @return {@link Boolean }
*/
@Override
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
List<GameSecretKeyCurrencyDTO> gameSecretKeyCurrencies = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO.builder()
.platformCode(GamePlatforms.FC.getCode())
.build());
for (GameSecretKeyCurrency gameSecretKeyCurrency : gameSecretKeyCurrencies) {
//必须两个小时之前的数据
long startTimeLong = DateUtils.addOrSubtractMinutes(betRecordByTimeDTO.getStartTime(), -120);
long endTimeLong = DateUtils.addOrSubtractMinutes(betRecordByTimeDTO.getEndTime(), -120);
//查询一个小时内的数据一次最多15分钟
int timeWheel = 60;
while (timeWheel > 0) {
String startTime = DateUtils.convertTimeZone(startTimeLong, "America/New_York", DateUtils.YYYY_MM_DD_HH_MM_SS);
String endTime = DateUtils.convertTimeZone(endTimeLong, "America/New_York", DateUtils.YYYY_MM_DD_HH_MM_SS);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("StartDate", startTime);
paramsMap.put("EndDate", endTime);
paramsMap.putAll(getKeyMap(paramsMap, betRecordByTimeDTO.getAgentKey(), gameSecretKeyCurrency.getCurrency(), betRecordByTimeDTO.getAgentId()));
ApiFCBetRecordResponseDTO betRecordByTime = FCClient.getBetRecordByHistoryTime(paramsMap);
if (this.getIsSuccess(betRecordByTime.getResult())) {
//数据组装
this.batchInsert(betRecordByTime, gameSecretKeyCurrency.getSystemCurrency(), gameSecretKeyCurrency.getCurrency());
}
timeWheel -= 15;
}
}
return Boolean.TRUE;
}
/**
*
*
* @param createFreeSpinRequest
* @return {@link Boolean }
*/
@Override
public Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest) {
return null;
}
/**
*
*
* @param getGameDetailRequestDTO dto
* @return {@link GetGameDetailResponseDTO }
*/
@Override
public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) {
List<GameBettingDetails> gameBettingDetails = gameBettingDetailsService.selectGameBettingDetailsList(GameBettingDetailsDTO.builder().wagersId(getGameDetailRequestDTO.getWagersId()).build());
if (!CollectionUtils.isEmpty(gameBettingDetails)) {
GetGameDetailResponseDTO getGameDetailResponseDTO = new GetGameDetailResponseDTO();
getGameDetailResponseDTO.setUrl(gameBettingDetails.get(0).getBetContent());
return getGameDetailResponseDTO;
}
return null;
}
/**
*
*
* @param kickMemberRequestDTO dto
* @return {@link Boolean }
*/
@Override
public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) {
log.info("GamesFCServiceImpl [kickMember] 请求参数 {}", kickMemberRequestDTO);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("MemberAccount", kickMemberRequestDTO.getAccount());
paramsMap.putAll(getKeyMap(paramsMap, kickMemberRequestDTO.getAgentKey(), kickMemberRequestDTO.getCurrency(), kickMemberRequestDTO.getAgentId()));
ApiFCResult apiFCResult = FCClient.kickMember(paramsMap);
if (this.getIsSuccess(apiFCResult.getResult())) {
return Boolean.TRUE;
} else {
throw new ApiException(ErrorCode.KICK_OUT_AILED.getCode());
}
}
/**
*
*
* @param kickMemberAllDTO dto
* @return {@link Boolean }
*/
@Override
public Boolean kickMemberAll(KickMemberAllDTO kickMemberAllDTO) {
log.info("GamesFCServiceImpl [kickMemberAll] 请求参数 {}", kickMemberAllDTO);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.putAll(getKeyMap(paramsMap, kickMemberAllDTO.getAgentKey(), kickMemberAllDTO.getCurrency(), kickMemberAllDTO.getAgentId()));
ApiFCResult apiFCResult = FCClient.kickMemberAll(paramsMap);
if (this.getIsSuccess(apiFCResult.getResult())) {
return Boolean.TRUE;
} else {
throw new ApiException(ErrorCode.KICK_OUT_AILED.getCode());
}
}
/**
* 使
*
* @param getFreeSpinDashflowRequestDTO dashflowdto
* @return {@link List }<{@link GameFreeRecord }>
*/
@Override
public List<GameFreeRecord> getFreeSpinDashflow(GetFreeSpinDashflowRequestDTO getFreeSpinDashflowRequestDTO) {
return Collections.emptyList();
}
/**
*
*
* @param cancelFreeSpinRequestDTO
* @return {@link Boolean }
*/
@Override
public Boolean cancelFreeSpin(CancelFreeSpinRequestDTO cancelFreeSpinRequestDTO) {
return Boolean.FALSE;
}
/**
*
*
* @param gamesDataBuildDTO
* @return {@link GameBettingDetails }
*/
@Override
public GameBettingDetails dataBuild(GamesDataBuildDTO gamesDataBuildDTO) {
//转化类
ApiFCBetRecordResponseDTO.BetRecord resultBean = (ApiFCBetRecordResponseDTO.BetRecord) gamesDataBuildDTO.getData();
Member member = memberService.selectMemberByGameAccount(resultBean.getAccount());
if (ObjectUtils.isEmpty(member)) {
return null;
}
List<ApiFCGameListResponseDTO.GameDetails> gamesDatas = redisCache.getCacheList(CacheConstants.FC_GAMES);
Map<String, ApiFCGameListResponseDTO.GameDetails> dataDTOMap = gamesDatas.stream().collect(Collectors.toMap(ApiFCGameListResponseDTO.GameDetails::getGameId, e -> e));
ApiFCGameListResponseDTO.GameDetails gamesDataDTO = dataDTOMap.get(resultBean.getGameID());
// 判断输赢
Integer gameStatus = GameStatus.FLAT.getCode();
if (BigDecimal.ZERO.compareTo(resultBean.getWinlose()) > 0) {
gameStatus = GameStatus.FAIL.getCode();
} else if (BigDecimal.ZERO.compareTo(resultBean.getWinlose()) < 0) {
gameStatus = GameStatus.WIN.getCode();
}
//数据构造
GameBettingDetails gameBettingDetails = GameBettingDetails.builder()
.tenantKey(member.getTenantKey())
//保存我们的币种id
.currencyCode(gamesDataBuildDTO.getSystemCurrencyCode())
.memberId(member.getId())
.gameCode(resultBean.getGameID())
.gameType(FCGameType.findSystemByCode(resultBean.getGametype()))
.platformCode(GamePlatforms.FC.getCode())
.gameId(gamesDataDTO.getSystemGameId())
.gameName(gamesDataDTO.getGameNameOfChinese())
.gameStatus(gameStatus)
.gameStatusType(1)
.gameCurrencyCode(gamesDataBuildDTO.getCurrencyCode())
.account(resultBean.getAccount())
.wagersId(resultBean.getRecordID())
.wagersTime(resultBean.getBdate().getTime())
.betAmount(resultBean.getBet())
.payoffTime(resultBean.getBdate().getTime())
.payoffAmount(resultBean.getWinlose().abs())
.settlementTime(resultBean.getBdate().getTime())
.turnover(resultBean.getValidBet())
.settlementStatus(SettlementStatusEnum.COMPLETED.getCode())
.build();
gameBettingDetails.setCreateBy(Constants.SYSTEM);
gameBettingDetails.setCreateTime(DateUtils.getNowDate());
return gameBettingDetails;
}
/**
*
*
* @param data
* @param systemCurrencyCode
*/
private synchronized void batchInsert(ApiFCBetRecordResponseDTO data, String systemCurrencyCode, String currencyCode) {
List<GameBettingDetails> gameBettingDetails = new ArrayList<>();
List<String> wagersIds = new ArrayList<>();
//数据转化
for (ApiFCBetRecordResponseDTO.BetRecord bean : data.getRecords()) {
GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean).currencyCode(currencyCode).systemCurrencyCode(systemCurrencyCode).build());
if (!ObjectUtils.isEmpty(bettingDetails)) {
bettingDetails.setId(IdUtil.getSnowflakeNextId());
gameBettingDetails.add(bettingDetails);
}
wagersIds.add(bean.getRecordID());
}
if (!CollectionUtils.isEmpty(gameBettingDetails)) {
//查询重复数据id
List<String> 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);
}
}
}
}

View File

@ -25,7 +25,7 @@ public class JILIBetRecordDataResponseDTO {
* id * id
*/ */
@JsonProperty("WagersId") @JsonProperty("WagersId")
private String wagersId; private long wagersId;
/** /**
* id * id
*/ */

View File

@ -436,19 +436,6 @@ public class GamesJILIServiceImpl implements IGamesService {
return Boolean.TRUE; return Boolean.TRUE;
} }
/**
*
*
* @param betRecordByTimeDTO dto
* @return {@link Boolean }
*/
@Override
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
return null;
}
/** /**
* *
* *
@ -701,7 +688,7 @@ public class GamesJILIServiceImpl implements IGamesService {
*/ */
private void batchInsert(JILIBetRecordResponseDTO betRecordJILIResponse) { private void batchInsert(JILIBetRecordResponseDTO betRecordJILIResponse) {
List<GameBettingDetails> gameBettingDetails = new ArrayList<>(); List<GameBettingDetails> gameBettingDetails = new ArrayList<>();
List<String> wagersIds = new ArrayList<>(); List<Long> wagersIds = new ArrayList<>();
//数据组装 //数据组装
JILIBetRecordResponseDTO.DataBean dataBean = betRecordJILIResponse.getData(); JILIBetRecordResponseDTO.DataBean dataBean = betRecordJILIResponse.getData();
//数据转化 //数据转化
@ -715,7 +702,7 @@ public class GamesJILIServiceImpl implements IGamesService {
} }
if (!CollectionUtils.isEmpty(gameBettingDetails)) { if (!CollectionUtils.isEmpty(gameBettingDetails)) {
//查询重复数据id //查询重复数据id
List<String> removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds); List<Long> removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds);
//用steam流清除list中与wagersIds集合相同的数据 //用steam流清除list中与wagersIds集合相同的数据
gameBettingDetails = gameBettingDetails.stream() gameBettingDetails = gameBettingDetails.stream()
.filter(detail -> !removeWagersIds.contains(detail.getWagersId())) .filter(detail -> !removeWagersIds.contains(detail.getWagersId()))

View File

@ -637,16 +637,6 @@ public class GamesPGServiceImpl implements IGamesService {
} }
} }
/**
*
*
* @param betRecordByTimeDTO dto
* @return {@link Boolean }
*/
@Override
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
return null;
}
/** /**
@ -787,7 +777,7 @@ public class GamesPGServiceImpl implements IGamesService {
.gameStatusType(1) .gameStatusType(1)
.gameCurrencyCode(resultBean.getCurrency()) .gameCurrencyCode(resultBean.getCurrency())
.account(resultBean.getPlayerId()) .account(resultBean.getPlayerId())
.wagersId(String.valueOf(resultBean.getGameOrderId())) .wagersId(resultBean.getGameOrderId())
.wagersTime(resultBean.getBetTime().getTime()) .wagersTime(resultBean.getBetTime().getTime())
.betAmount(resultBean.getBetAmount().abs()) .betAmount(resultBean.getBetAmount().abs())
.payoffTime(resultBean.getLastUpdateTime().getTime()) .payoffTime(resultBean.getLastUpdateTime().getTime())
@ -814,7 +804,7 @@ public class GamesPGServiceImpl implements IGamesService {
*/ */
private synchronized void batchInsert(ApiGameBetRecordPageResponseDTO data) { private synchronized void batchInsert(ApiGameBetRecordPageResponseDTO data) {
List<GameBettingDetails> gameBettingDetails = new ArrayList<>(); List<GameBettingDetails> gameBettingDetails = new ArrayList<>();
List<String> wagersIds = new ArrayList<>(); List<Long> wagersIds = new ArrayList<>();
//数据转化 //数据转化
for (ApiGameBetRecordPageResponseDTO.GameBetRecord bean : data.getList()) { for (ApiGameBetRecordPageResponseDTO.GameBetRecord bean : data.getList()) {
GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean).build()); GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean).build());
@ -822,17 +812,17 @@ public class GamesPGServiceImpl implements IGamesService {
bettingDetails.setId(IdUtil.getSnowflakeNextId()); bettingDetails.setId(IdUtil.getSnowflakeNextId());
gameBettingDetails.add(bettingDetails); gameBettingDetails.add(bettingDetails);
} }
wagersIds.add(String.valueOf(bean.getGameOrderId())); wagersIds.add(bean.getGameOrderId());
} }
if (!CollectionUtils.isEmpty(gameBettingDetails)) { if (!CollectionUtils.isEmpty(gameBettingDetails)) {
//查询重复数据id //查询重复数据id
List<String> removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds); List<Long> removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds);
//用steam流清除list中与wagersIds集合相同的数据 //用steam流清除list中与wagersIds集合相同的数据
gameBettingDetails = gameBettingDetails.stream() gameBettingDetails = gameBettingDetails.stream()
.filter(detail -> !removeWagersIds.contains(detail.getWagersId())) .filter(detail -> !removeWagersIds.contains(detail.getWagersId()))
.collect(Collectors.toList()); .collect(Collectors.toList());
if (!CollectionUtils.isEmpty(gameBettingDetails)) { if (!CollectionUtils.isEmpty(gameBettingDetails)) {
List<String> wagersId = gameBettingDetails.stream().map(GameBettingDetails::getWagersId).collect(Collectors.toList()); List<Long> wagersId = gameBettingDetails.stream().map(GameBettingDetails::getWagersId).collect(Collectors.toList());
gameBettingDetailsService.deleteGameBettingDetailsByWagersId(wagersId); gameBettingDetailsService.deleteGameBettingDetailsByWagersId(wagersId);
gameBettingDetailsService.batchInsert(gameBettingDetails); gameBettingDetailsService.batchInsert(gameBettingDetails);
} }

View File

@ -24,15 +24,6 @@ public class GamesDataBuildDTO
*/ */
private Object data; private Object data;
/**
*
*/
private String systemCurrencyCode;
/**
*
*/
private String currencyCode;
} }

View File

@ -23,7 +23,7 @@ public class GetGameDetailRequestDTO extends GamesBaseRequestDTO {
/** /**
* id * id
*/ */
private String wagersId; private Long wagersId;
/** /**
* *
*/ */

View File

@ -444,17 +444,6 @@ public class GamesXKServiceImpl implements IGamesService {
} }
/**
*
*
* @param betRecordByTimeDTO dto
* @return {@link Boolean }
*/
@Override
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
return null;
}
/** /**
* *
* *
@ -543,7 +532,7 @@ public class GamesXKServiceImpl implements IGamesService {
*/ */
private void batchInsert(XKBetRecordResponseDTO xkBetRecordResponseDTO) { private void batchInsert(XKBetRecordResponseDTO xkBetRecordResponseDTO) {
List<GameBettingDetails> gameBettingDetails = new ArrayList<>(); List<GameBettingDetails> gameBettingDetails = new ArrayList<>();
List<String> wagersIds = new ArrayList<>(); List<Long> wagersIds = new ArrayList<>();
//数据组装 //数据组装
XKBetRecordResponseDTO.DataBean dataBean = xkBetRecordResponseDTO.getData(); XKBetRecordResponseDTO.DataBean dataBean = xkBetRecordResponseDTO.getData();
//数据转化 //数据转化
@ -553,11 +542,11 @@ public class GamesXKServiceImpl implements IGamesService {
bettingDetails.setId(IdUtil.getSnowflakeNextId()); bettingDetails.setId(IdUtil.getSnowflakeNextId());
gameBettingDetails.add(bettingDetails); gameBettingDetails.add(bettingDetails);
} }
wagersIds.add(String.valueOf(bean.getWagersId())); wagersIds.add(bean.getWagersId());
} }
if (!CollectionUtils.isEmpty(gameBettingDetails)) { if (!CollectionUtils.isEmpty(gameBettingDetails)) {
//查询重复数据id //查询重复数据id
List<String> removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds); List<Long> removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds);
//用steam流清除list中与wagersIds集合相同的数据 //用steam流清除list中与wagersIds集合相同的数据
gameBettingDetails = gameBettingDetails.stream() gameBettingDetails = gameBettingDetails.stream()
.filter(detail -> !removeWagersIds.contains(detail.getWagersId())) .filter(detail -> !removeWagersIds.contains(detail.getWagersId()))
@ -614,7 +603,7 @@ public class GamesXKServiceImpl implements IGamesService {
.gameStatusType(resultBean.getType()) .gameStatusType(resultBean.getType())
.gameCurrencyCode(resultBean.getAgentId()) .gameCurrencyCode(resultBean.getAgentId())
.account(String.valueOf(resultBean.getAccount())) .account(String.valueOf(resultBean.getAccount()))
.wagersId(String.valueOf(resultBean.getWagersId())) .wagersId(resultBean.getWagersId())
.wagersTime(resultBean.getWagersTime()) .wagersTime(resultBean.getWagersTime())
.betAmount(resultBean.getBetAmount().abs()) .betAmount(resultBean.getBetAmount().abs())
.payoffTime(resultBean.getPayoffTime()) .payoffTime(resultBean.getPayoffTime())

View File

@ -116,7 +116,8 @@ public class GameBettingDetails extends BaseEntity
/** 游戏注单唯一值 */ /** 游戏注单唯一值 */
@Excel(name = "游戏注单唯一值") @Excel(name = "游戏注单唯一值")
private String wagersId; @JsonSerialize(using = ToStringSerializer.class)
private Long wagersId;
/** 投注时间 (Unix 时间戳) */ /** 投注时间 (Unix 时间戳) */
@Excel(name = "投注时间 (Unix 时间戳)") @Excel(name = "投注时间 (Unix 时间戳)")

View File

@ -36,7 +36,7 @@ public class GamePlatform extends BaseEntity
@Excel(name = "平台编码") @Excel(name = "平台编码")
private String platformCode; private String platformCode;
/** 平台类型 ff_game_platform_type 字典 */ /** 平台类型 ff_game_type 字典 */
@Excel(name = "平台类型 ff_game_platform_type 字典") @Excel(name = "平台类型 ff_game_platform_type 字典")
private Integer platformType; private Integer platformType;

View File

@ -29,7 +29,7 @@ public interface GameBettingDetailsMapper
* @param wagersIds ID * @param wagersIds ID
* @return {@link List }<{@link Long }> * @return {@link List }<{@link Long }>
*/ */
List<String> selectGameBettingDetailsByWagersId(@Param("wagersIds") List<String> wagersIds); List<Long> selectGameBettingDetailsByWagersId(@Param("wagersIds") List<Long> wagersIds);
/** /**
@ -87,5 +87,5 @@ public interface GameBettingDetailsMapper
* @param wagersIds id * @param wagersIds id
* @return int * @return int
*/ */
int deleteGameBettingDetailsByWagersId(@Param("wagersIds") List<String> wagersIds); int deleteGameBettingDetailsByWagersId(@Param("wagersIds") List<Long> wagersIds);
} }

View File

@ -29,7 +29,7 @@ public interface IGameBettingDetailsService
* @param wagersIds ID * @param wagersIds ID
* @return {@link List }<{@link Long }> * @return {@link List }<{@link Long }>
*/ */
List<String> selectGameBettingDetailsByWagersId(List<String> wagersIds); List<Long> selectGameBettingDetailsByWagersId(List<Long> wagersIds);
@ -89,5 +89,5 @@ public interface IGameBettingDetailsService
* @param wagersId id * @param wagersId id
* @return int * @return int
*/ */
int deleteGameBettingDetailsByWagersId(List<String> wagersId); int deleteGameBettingDetailsByWagersId(List<Long> wagersId);
} }

View File

@ -43,7 +43,7 @@ public class GameBettingDetailsServiceImpl implements IGameBettingDetailsService
* @return {@link List }<{@link Long }> * @return {@link List }<{@link Long }>
*/ */
@Override @Override
public List<String> selectGameBettingDetailsByWagersId(List<String> wagersIds) { public List<Long> selectGameBettingDetailsByWagersId(List<Long> wagersIds) {
return gameBettingDetailsMapper.selectGameBettingDetailsByWagersId(wagersIds); return gameBettingDetailsMapper.selectGameBettingDetailsByWagersId(wagersIds);
} }
@ -128,7 +128,7 @@ public class GameBettingDetailsServiceImpl implements IGameBettingDetailsService
* @return int * @return int
*/ */
@Override @Override
public int deleteGameBettingDetailsByWagersId(List<String> wagersId) { public int deleteGameBettingDetailsByWagersId(List<Long> wagersId) {
return gameBettingDetailsMapper.deleteGameBettingDetailsByWagersId(wagersId); return gameBettingDetailsMapper.deleteGameBettingDetailsByWagersId(wagersId);
} }
} }

View File

@ -5,7 +5,6 @@ import com.ff.base.core.redis.RedisCache;
import com.ff.base.datasource.DynamicDataSourceContextHolder; import com.ff.base.datasource.DynamicDataSourceContextHolder;
import com.ff.base.enums.GamePlatforms; import com.ff.base.enums.GamePlatforms;
import com.ff.base.enums.NGPlatforms; import com.ff.base.enums.NGPlatforms;
import com.ff.base.enums.PlatformType;
import com.ff.base.enums.StatusType; import com.ff.base.enums.StatusType;
import com.ff.base.utils.DateUtils; import com.ff.base.utils.DateUtils;
import com.ff.game.api.IGamesService; import com.ff.game.api.IGamesService;
@ -92,8 +91,7 @@ public class GameTask {
for (String gameKey : gamesService.keySet()) { for (String gameKey : gamesService.keySet()) {
String platformCode = gameKey.replace(Constants.SERVICE, ""); String platformCode = gameKey.replace(Constants.SERVICE, "");
//特殊的平台跳过 if (NGPlatforms.exists(platformCode)) {
if (NGPlatforms.exists(platformCode)|| GamePlatforms.FC.getInfo().equals(platformCode)) {
continue; continue;
} }
@ -122,94 +120,6 @@ public class GameTask {
} }
/**
* cfbetting
*/
public void insertGameCFBettingDetails(Integer backTime) {
try {
//捞取指定分钟前的数据
Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTime);
Long endTime = DateUtils.getNowDate();
for (String gameKey : gamesService.keySet()) {
String platformCode = gameKey.replace(Constants.SERVICE, "");
//不是特殊的平台跳过
if (!GamePlatforms.FC.getInfo().equals(platformCode)) {
continue;
}
List<GameSecretKey> gameSecretKeys = gameSecretKeyService.selectGameSecretKeyList(GameSecretKey.builder().platform(platformCode).build());
for (GameSecretKey gameSecretKey : gameSecretKeys) {
try {
gamesService.get(gameKey).getGameList(GamesBaseRequestDTO.builder()
.agentId(gameSecretKey.getCode())
.agentKey(gameSecretKey.getKey())
.build());
BetRecordByTimeDTO betRecordByTimeDTO = new BetRecordByTimeDTO();
betRecordByTimeDTO.setGamePlatform(gameSecretKey.getPlatform());
betRecordByTimeDTO.setStartTime(startTime);
betRecordByTimeDTO.setEndTime(endTime);
betRecordByTimeDTO.setPage(1);
betRecordByTimeDTO.setPageLimit(1000);
betRecordByTimeDTO.setAgentId(gameSecretKey.getCode());
betRecordByTimeDTO.setAgentKey(gameSecretKey.getKey());
gamesService.get(gameKey).getBetRecordByTime(betRecordByTimeDTO);
} catch (Exception e) {
log.error("查询 平台 {} 投注记录失败,错误信息 {}", gameSecretKey.getCode(), e);
}
}
}
} catch (Exception e) {
log.error("查询 FC 投注记录失败,错误信息 {}", e);
}
}
/**
* 使
*
* @param backTime
*/
public void insertHistoryGameBettingDetails(Integer backTime) {
//捞取指定分钟前的数据
Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTime);
Long endTime = DateUtils.getNowDate();
for (String gameKey : gamesService.keySet()) {
String platformCode = gameKey.replace(Constants.SERVICE, "");
List<GameSecretKey> gameSecretKeys = gameSecretKeyService.selectGameSecretKeyList(GameSecretKey.builder().platform(platformCode).build());
for (GameSecretKey gameSecretKey : gameSecretKeys) {
try {
gamesService.get(gameKey).getGameList(GamesBaseRequestDTO.builder()
.agentId(gameSecretKey.getCode())
.agentKey(gameSecretKey.getKey())
.build());
BetRecordByTimeDTO betRecordByTimeDTO = new BetRecordByTimeDTO();
betRecordByTimeDTO.setGamePlatform(gameSecretKey.getPlatform());
betRecordByTimeDTO.setStartTime(startTime);
betRecordByTimeDTO.setEndTime(endTime);
betRecordByTimeDTO.setPage(1);
betRecordByTimeDTO.setPageLimit(1000);
betRecordByTimeDTO.setAgentId(gameSecretKey.getCode());
betRecordByTimeDTO.setAgentKey(gameSecretKey.getKey());
gamesService.get(gameKey).getBetRecordByHistoryTime(betRecordByTimeDTO);
} catch (Exception e) {
log.error("查询 平台 {} 投注记录失败,错误信息 {}", gameSecretKey.getCode(), e);
}
}
}
}
/** /**
* ngbetting * ngbetting
*/ */

View File

@ -89,7 +89,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select> </select>
<select id="selectGameBettingDetailsByWagersId" resultType="java.lang.String"> <select id="selectGameBettingDetailsByWagersId" resultType="java.lang.Long">
select wagers_id from ff_game_betting_details select wagers_id from ff_game_betting_details
where wagers_id in where wagers_id in