refactor(game): 重构游戏平台交易ID生成逻辑

- 移除 CreateOrderServiceImpl 中的 getTransactionId 方法
- 在每个游戏平台的实现类中添加 getTransactionId 方法,具体实现如下:
  - GamesAEServiceImpl
  - GamesDGServiceImpl
  - GamesFCServiceImpl
  - GamesJILIServiceImpl
  - GamesKMServiceImpl - GamesPGServiceImpl
  - GamesPGTServiceImpl
  - GamesPGXServiceImpl
  - GamesSAServiceImpl
- 更新 DBSportsServiceImpl 和 FBSportsServiceImpl 中的交易ID生成逻辑
- 重构后的交易ID生成逻辑更清晰,每个平台有自己的实现方式
main-pgt
shi 2025-04-11 15:20:45 +08:00
parent 265b626b6e
commit 3236b4ab55
57 changed files with 428 additions and 154 deletions

View File

@ -38,11 +38,10 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
public static String DAY_END_TIME = "23:59:59";
public static final String ISO_8601_FORMAT= "yyyy-MM-dd'T'HH:mm:ss";
public static final String ISO_8601_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
public static final String ISO_8601_FORMAT_Z= "yyyy-MM-dd'T'HH:mm:ss'Z'";
public static final String ISO_8601_FORMAT_Z = "yyyy-MM-dd'T'HH:mm:ss'Z'";
/**
@ -213,8 +212,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
*
*
* @param timestamp
* @param format yyyy-MM-dd'T'HH:mm:ssXXX
* @param timeZone GMT+8UTC
* @param format yyyy-MM-dd'T'HH:mm:ssXXX
* @param timeZone GMT+8UTC
* @return
*/
public static String convertTimestampToFormattedDate(long timestamp, String format, String timeZone) {
@ -251,7 +250,6 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
}
/**
* LocalDate ==> Date
*/
@ -943,4 +941,38 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
public static boolean isBetween(Long value, Long minValue, Long maxValue) {
return value >= minValue && value <= maxValue;
}
/**
*
*
* @param dateString "yyyy-MM-dd'T'HH:mm:ss.SSS"
* @param timezone UTCAsia/Shanghai
* @return
* @throws Exception
*/
public static long convertToMillisWithTimezone(String dateString, String timezone) {
try {
// 设置日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
// 设置解析时使用的时区
sdf.setTimeZone(TimeZone.getTimeZone(timezone));
// 解析日期字符串为 Date 对象
Date date = sdf.parse(dateString);
// 获取项目默认时区
TimeZone defaultTimeZone = TimeZone.getDefault();
// 使用默认时区的 Calendar 计算
Calendar calendar = Calendar.getInstance(defaultTimeZone);
calendar.setTime(date);
// 返回该时区对应的毫秒时间戳
return calendar.getTimeInMillis();
} catch (Exception e) {
return 0;
}
}
}

View File

@ -52,6 +52,14 @@ public interface IGamesService {
*/
String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO);
/**
* id
*
* @param transactionIdRequestDTO iddto
* @return {@link String }
*/
String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO);
/**
* id

View File

@ -218,10 +218,27 @@ public class GamesAEServiceImpl implements IGamesService {
game.setNameInfo(Collections.singletonList(nameInfo));
game.setGameId(StringUtils.addSuffix(GamePlatforms.AE.getCode(), 1));
gameService.insertGame(game);
}else {
NameInfo nameInfo = new NameInfo();
nameInfo.setLang("zh-CN");
nameInfo.setName("AE大厅");
game.setNameInfo(Collections.singletonList(nameInfo));
gameService.updateGame(game);
}
return CacheConstants.AE_GAMES;
}
/**
* id
*
* @param transactionIdRequestDTO iddto
* @return {@link String }
*/
@Override
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
return GamePlatforms.AE.getCode() + IdUtils.simpleUUID();
}
/**
* id
*

View File

@ -1,4 +1,4 @@
package com.ff.sports.db.address;
package com.ff.game.api.db.address;
import com.dtflys.forest.callback.AddressSource;
import com.dtflys.forest.http.ForestAddress;

View File

@ -1,8 +1,8 @@
package com.ff.sports.db.client;
package com.ff.game.api.db.client;
import com.dtflys.forest.annotation.*;
import com.ff.sports.db.address.DBSportsAddress;
import com.ff.sports.db.dto.*;
import com.ff.game.api.db.address.DBSportsAddress;
import com.ff.game.api.db.dto.*;
/**
* @author cengy

View File

@ -1,4 +1,4 @@
package com.ff.sports.db.dto;
package com.ff.game.api.db.dto;
import com.ff.base.utils.sign.Md5Utils;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.db.dto;
package com.ff.game.api.db.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.db.dto;
/**
* @author cengy

View File

@ -1,4 +1,4 @@
package com.ff.sports.db.dto;
package com.ff.game.api.db.dto;
import com.ff.base.utils.sign.Md5Utils;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.db.dto;
package com.ff.game.api.db.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.db.dto;
package com.ff.game.api.db.dto;
import com.ff.base.utils.sign.Md5Utils;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.db.dto;
package com.ff.game.api.db.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.db.dto;
package com.ff.game.api.db.dto;
import com.ff.base.utils.sign.Md5Utils;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.db.dto;
package com.ff.game.api.db.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.db.dto;
package com.ff.game.api.db.dto;
import com.ff.base.utils.sign.Md5Utils;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.db.dto;
package com.ff.game.api.db.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.db.dto;
package com.ff.game.api.db.dto;
import com.ff.base.utils.sign.Md5Utils;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.db.dto;
package com.ff.game.api.db.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.db.dto;
package com.ff.game.api.db.dto;
import com.ff.base.utils.sign.Md5Utils;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.db.dto;
package com.ff.game.api.db.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.db.impl;
package com.ff.game.api.db.impl;
import cn.hutool.core.util.IdUtil;
import com.ff.base.constant.CacheConstants;
@ -12,6 +12,7 @@ import com.ff.base.utils.StringUtils;
import com.ff.base.utils.sign.Md5Utils;
import com.ff.base.utils.uuid.IdUtils;
import com.ff.game.api.IGamesService;
import com.ff.game.api.db.dto.*;
import com.ff.game.api.request.*;
import com.ff.game.domain.*;
import com.ff.game.service.IGameBettingDetailsService;
@ -19,12 +20,10 @@ import com.ff.game.service.IGameExchangeMoneyService;
import com.ff.game.service.IGameService;
import com.ff.member.domain.Member;
import com.ff.member.service.IMemberService;
import com.ff.sports.db.client.DBSportsClient;
import com.ff.sports.db.dto.*;
import com.ff.game.api.db.client.DBSportsClient;
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;
@ -120,37 +119,13 @@ public class DBSportsServiceImpl implements IGamesService {
@Transactional
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO requestDTO) {
Member member = memberService.selectMemberByGameAccount(requestDTO.getAccount());
String transactionId = GamePlatforms.DBSports.getCode() + IdUtils.simpleUUID();
List<GameExchangeMoney> gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList(
GameExchangeMoney.builder()
.tenantKey(requestDTO.getTenantKey())
.orderId(requestDTO.getOrderId())
.build()
);
Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复");
//获取下一个自增id
GameExchangeMoney exchangeMoney = GameExchangeMoney
.builder()
.orderId(requestDTO.getOrderId())
.tenantKey(requestDTO.getTenantKey())
.quota(requestDTO.getQuota())
.balance(requestDTO.getAmount())
.exchangeType(requestDTO.getTransferType())
.currencyCode(requestDTO.getSystemCurrency())
.memberId(member.getId())
.transactionId(transactionId)
.platformCode(GamePlatforms.DBSports.getCode())
.build();
exchangeMoney.setCreateBy(Constants.SYSTEM);
//接口限制限制50字符
exchangeMoney.setTransactionId(transactionId);
GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(requestDTO.getGameExchangeId());
// 转入
if (requestDTO.getTransferType().equals(TransferType.GAMES.getCode())) {
TransferRequest request = new TransferRequest();
request.setUserName(requestDTO.getAccount());
request.setTransferType(1);
request.setTransferId(requestDTO.getOrderId());
request.setTransferId(requestDTO.getTransactionId());
request.setMerchantCode(requestDTO.getAgentId());
request.setAmount(requestDTO.getAmount().toString());
request.buildSignature(requestDTO.getAgentKey());
@ -179,15 +154,19 @@ public class DBSportsServiceImpl implements IGamesService {
} catch (Exception e) {
log.error("查询会员失败, errorCode:{}, errorMessage:{}", response.getCode(), response.getMsg(), e);
}
exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); // SUCCESS
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
} else {
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
throw new ApiException(ErrorCode.Transfer_In_Failure.getCode());
}
} else {
// 获取第三方钱包余额
MemberInfoRequestDTO memberInfoRequestDTO = MemberInfoRequestDTO.builder()
.accounts(member.getGameAccount())
.accounts(requestDTO.getAccount())
.agentId(requestDTO.getAgentId())
.agentKey(requestDTO.getAgentKey())
.build();
@ -199,7 +178,7 @@ public class DBSportsServiceImpl implements IGamesService {
TransferRequest request = new TransferRequest();
request.setUserName(requestDTO.getAccount());
request.setTransferType(2); // 转出
request.setTransferId(requestDTO.getOrderId());
request.setTransferId(requestDTO.getTransactionId());
request.setMerchantCode(requestDTO.getAgentId());
request.setAmount(/*requestDTO.getAmount().toString()*/ balance.toString());
request.buildSignature(requestDTO.getAgentKey());
@ -221,14 +200,28 @@ public class DBSportsServiceImpl implements IGamesService {
exchangeMoney.setCoinAfter(afterAmount);
exchangeMoney.setCurrencyBefore(beforeAmount);
exchangeMoney.setCurrencyAfter(afterAmount);
exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); // SUCCESS
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
} else {
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
throw new ApiException(ErrorCode.Transfer_Out_Failure.getCode());
}
}
return exchangeMoney.getId();
}
/**
* id
*
* @param transactionIdRequestDTO iddto
* @return {@link String }
*/
@Override
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
return gameExchangeMoneyService.getTransactionId(GamePlatforms.DBSports.getInfo(), 11);
}
/**
*

View File

@ -204,10 +204,28 @@ public class GamesDGServiceImpl implements IGamesService {
game.setNameInfo(Collections.singletonList(new NameInfo("真人棋牌", "zh-CN")));
game.setGameId(StringUtils.addSuffix(GamePlatforms.DG.getCode(), 1));
gameService.insertGame(game);
}else {
game.setNameInfo(Collections.singletonList(new NameInfo("真人棋牌", "zh-CN")));
gameService.updateGame(game);
}
return CacheConstants.DG_GAMES;
}
/**
* id
*
* @param transactionIdRequestDTO iddto
* @return {@link String }
*/
@Override
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
return GamePlatforms.DG.getInfo() + IdUtils.simpleUUID();
}
/**
* id
*

View File

@ -6,20 +6,24 @@ import com.ff.base.exception.base.ApiException;
import com.ff.base.manager.AsyncManager;
import com.ff.base.utils.DateUtils;
import com.ff.base.utils.uuid.IdUtils;
import com.ff.game.api.IGamesService;
import com.ff.game.api.exchange.AbstractStepProcessor;
import com.ff.game.api.exchange.StepProcessorFactory;
import com.ff.game.api.exchange.StepProcessorService;
import com.ff.game.api.exchange.dto.GameExchangeDTO;
import com.ff.game.api.request.ExchangeTransferStatusRequestDTO;
import com.ff.game.api.request.TransactionIdRequestDTO;
import com.ff.game.domain.GameExchangeMoney;
import com.ff.game.service.IGameExchangeMoneyService;
import com.ff.member.domain.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Map;
/**
* impl
@ -33,11 +37,12 @@ public class CreateOrderServiceImpl extends AbstractStepProcessor {
@Resource
private IGameExchangeMoneyService gameExchangeMoneyService;
@Resource
private StepProcessorFactory stepProcessorFactory;
@Autowired
private Map<String, IGamesService> gamesService;
/**
*
*
@ -56,10 +61,10 @@ public class CreateOrderServiceImpl extends AbstractStepProcessor {
* @return boolean
*/
@Override
public boolean doProcess(GameExchangeDTO gameExchangeMoney) {
public boolean doProcess(GameExchangeDTO gameExchangeMoney) {
gameExchangeMoney.setTransactionId(this.getTransactionId(GamePlatforms.getByCode(gameExchangeMoney.getPlatformCode()),gameExchangeMoney.getExchangeType(),gameExchangeMoney.getGameAccount()));
String transactionId = gamesService.get(gameExchangeMoney.getPlatformCode()+Constants.SERVICE).getTransactionId(TransactionIdRequestDTO.builder().exchangeType(gameExchangeMoney.getExchangeType()).gameAccount(gameExchangeMoney.getGameAccount()).build());
gameExchangeMoney.setTransactionId(transactionId);
gameExchangeMoney.setCreateBy(Constants.SYSTEM);
gameExchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue());
gameExchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode());
@ -67,49 +72,6 @@ public class CreateOrderServiceImpl extends AbstractStepProcessor {
return gameExchangeMoneyService.insertGameExchangeMoney(gameExchangeMoney) > 0;
}
/**
* id
*
* @return {@link String }
*/
private String getTransactionId(GamePlatforms gamePlatforms,Integer exchangeType ,String account) {
switch (gamePlatforms) {
case AE:
return GamePlatforms.AE.getCode() + IdUtils.simpleUUID();
case JILI:
return GamePlatforms.JILI.getInfo() + IdUtils.simpleUUID();
case XK:
return GamePlatforms.XK.getCode() + IdUtils.simpleUUID();
case PG:
return gameExchangeMoneyService.getTransactionId(GamePlatforms.PG.getCode(), 32);
case PGX:
return gameExchangeMoneyService.getTransactionId(GamePlatforms.PGX.getInfo(), 17);
case FC:
return gameExchangeMoneyService.getTransactionId(GamePlatforms.FC.getInfo(), 30);
case DG:
return GamePlatforms.DG.getInfo() + IdUtils.simpleUUID();
case MT:
return GamePlatforms.MT.getCode() + IdUtils.simpleUUID();
case SA:
//判断是转入还是转出
String transactionId = "OUT" + DateUtils.dateTimeNow() + account;
if (!TransferType.ALL.getCode().equals(exchangeType)) {
transactionId = "IN" + DateUtils.dateTimeNow() + account;
}
return transactionId;
case KM:
return GamePlatforms.KM.getInfo() + IdUtils.simpleUUID();
case PGT:
return gameExchangeMoneyService.getTransactionId(GamePlatforms.PGT.getInfo(), 17);
case FBSports:
return GamePlatforms.FBSports.getCode() + IdUtils.simpleUUID();
case SV388:
return GamePlatforms.SV388.getCode() + IdUtils.simpleUUID();
}
throw new ApiException(ErrorCode.PLATFORM_NOT_EXIST.getCode());
}
/**

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.address;
package com.ff.game.api.fb.address;
import com.dtflys.forest.callback.AddressSource;
import com.dtflys.forest.http.ForestAddress;

View File

@ -1,8 +1,8 @@
package com.ff.sports.fb.client;
package com.ff.game.api.fb.client;
import com.dtflys.forest.annotation.*;
import com.ff.sports.fb.address.FBSportsAddress;
import com.ff.sports.fb.dto.*;
import com.ff.game.api.fb.address.FBSportsAddress;
import com.ff.game.api.fb.dto.*;
/**
* <a href="https://doc.newsportspro.com/apidoc_data.html"></a><br/>

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import com.alibaba.fastjson2.JSON;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.db.dto;
package com.ff.game.api.fb.dto;
/**
* @author cengy

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import com.alibaba.fastjson2.JSON;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import com.alibaba.fastjson2.JSON;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import com.alibaba.fastjson2.JSON;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import com.alibaba.fastjson2.JSON;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import com.alibaba.fastjson2.JSON;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import com.alibaba.fastjson2.JSON;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import com.alibaba.fastjson2.JSON;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.dto;
package com.ff.game.api.fb.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ff.sports.fb.impl;
package com.ff.game.api.fb.impl;
import cn.hutool.core.util.IdUtil;
import com.ff.base.constant.CacheConstants;
@ -12,6 +12,7 @@ import com.ff.base.utils.StringUtils;
import com.ff.base.utils.sign.Md5Utils;
import com.ff.base.utils.uuid.IdUtils;
import com.ff.game.api.IGamesService;
import com.ff.game.api.fb.dto.*;
import com.ff.game.api.request.*;
import com.ff.game.domain.*;
import com.ff.game.service.IGameBettingDetailsService;
@ -19,13 +20,11 @@ import com.ff.game.service.IGameExchangeMoneyService;
import com.ff.game.service.IGameService;
import com.ff.member.domain.Member;
import com.ff.member.service.IMemberService;
import com.ff.sports.fb.client.FBSportsClient;
import com.ff.sports.fb.dto.*;
import com.ff.game.api.fb.client.FBSportsClient;
import com.ff.utils.TimestampFromString;
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;
@ -138,7 +137,7 @@ public class FBSportsServiceImpl implements IGamesService {
TransferInRequest request = new TransferInRequest();
request.setMerchantUserId(requestDTO.getAccount());
request.setAmount(requestDTO.getAmount());
request.setBusinessId(requestDTO.getOrderId());
request.setBusinessId(requestDTO.getTransactionId());
request.setCurrencyId(Integer.parseInt(requestDTO.getCurrency()));
long timestamp = System.currentTimeMillis();
String jsonBody = request.toJSON();
@ -161,15 +160,19 @@ public class FBSportsServiceImpl implements IGamesService {
exchangeMoney.setCoinAfter(response.getData());
exchangeMoney.setCurrencyBefore(response.getData().subtract(transAmount));
exchangeMoney.setCurrencyAfter(response.getData());
exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); // SUCCESS
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
} else {
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
throw new ApiException(ErrorCode.Transfer_In_Failure.getCode());
}
} else {
// 获取第三方钱包余额
MemberInfoRequestDTO memberInfoRequestDTO = MemberInfoRequestDTO.builder()
.accounts(member.getGameAccount())
.accounts(requestDTO.getAccount())
.agentId(requestDTO.getAgentId())
.agentKey(requestDTO.getAgentKey())
.build();
@ -178,7 +181,7 @@ public class FBSportsServiceImpl implements IGamesService {
TransferOutRequest request = new TransferOutRequest();
request.setMerchantUserId(requestDTO.getAccount());
request.setAmount(/*requestDTO.getAmount()*/ balance);
request.setBusinessId(requestDTO.getOrderId());
request.setBusinessId(requestDTO.getTransactionId());
request.setCurrencyId(Integer.parseInt(requestDTO.getCurrency()));
long timestamp = System.currentTimeMillis();
@ -207,9 +210,13 @@ public class FBSportsServiceImpl implements IGamesService {
exchangeMoney.setCoinAfter(response.getData());
exchangeMoney.setCurrencyBefore(response.getData().add(transAmount));
exchangeMoney.setCurrencyAfter(response.getData());
exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); // SUCCESS
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
} else {
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
throw new ApiException(ErrorCode.Transfer_Out_Failure.getCode());
}
}
@ -256,6 +263,19 @@ public class FBSportsServiceImpl implements IGamesService {
}
}
/**
* id
*
* @param transactionIdRequestDTO iddto
* @return {@link String }
*/
@Override
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
return GamePlatforms.FBSports.getCode() + IdUtils.simpleUUID();
}
/**
*
*
@ -421,7 +441,7 @@ public class FBSportsServiceImpl implements IGamesService {
);
if (this.isSuccess(response.getCode())) {
status = StatusType.SUCCESS.getValue();
}else {
} else {
status = StatusType.FAILURE.getValue();
}
}

View File

@ -283,6 +283,11 @@ public class GamesFCServiceImpl implements IGamesService {
gameService.insertGame(game);
} else {
game = games.get(0);
List<NameInfo> nameInfos = new ArrayList<>();
nameInfos.add(NameInfo.builder().lang("zh-CN").name(gameDetails.getGameNameOfChinese()).build());
nameInfos.add(NameInfo.builder().lang("en-US").name(gameDetails.getGameNameOfEnglish()).build());
game.setNameInfo(nameInfos);
gameService.updateGame(game);
}
gameDetails.setSystemGameId(game.getGameId());
@ -366,6 +371,19 @@ public class GamesFCServiceImpl implements IGamesService {
return exchangeMoney.getId();
}
/**
* id
*
* @param transactionIdRequestDTO iddto
* @return {@link String }
*/
@Override
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
return gameExchangeMoneyService.getTransactionId(GamePlatforms.FC.getInfo(), 30);
}
/**
*
*

View File

@ -252,6 +252,11 @@ public class GamesJILIServiceImpl implements IGamesService {
gameService.insertGame(game);
} else {
game = games.get(0);
List<NameInfo> nameInfos = new ArrayList<>();
nameInfos.add(new NameInfo(gamesDataDTO.getName().getZhCN(), "zh-CN"));
nameInfos.add(new NameInfo(gamesDataDTO.getName().getEnUS(), "en-US"));
game.setNameInfo(nameInfos);
gameService.updateGame(game);
}
gamesDataDTO.setSystemGameId(game.getGameId());
@ -269,6 +274,17 @@ public class GamesJILIServiceImpl implements IGamesService {
return CacheConstants.JILI_GAMES;
}
/**
* id
*
* @param transactionIdRequestDTO iddto
* @return {@link String }
*/
@Override
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
return GamePlatforms.JILI.getInfo() + IdUtils.simpleUUID();
}
/**
* id
*

View File

@ -301,12 +301,30 @@ public class GamesKMServiceImpl implements IGamesService {
gameService.insertGame(game);
} else {
game = games.get(0);
List<NameInfo> nameInfos = new ArrayList<>();
nameInfos.add(new NameInfo(gamesDataDTO.getName(), "zh-CN"));
game.setNameInfo(nameInfos);
gameService.updateGame(game);
}
gamesDataDTO.setSystemGameId(game.getGameId());
}
return gameList.getGames();
}
/**
* id
*
* @param transactionIdRequestDTO iddto
* @return {@link String }
*/
@Override
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
return GamePlatforms.KM.getInfo() + IdUtils.simpleUUID();
}
/**
* id
*

View File

@ -247,6 +247,11 @@ public class MeiTianGameServiceImpl implements IGamesService {
gameService.insertGame(game);
} else {
game = games.get(0);
List<NameInfo> nameInfos = new ArrayList<>();
nameInfos.add(new NameInfo(gamesDataDTO.getCnName(), "zh-CN"));
nameInfos.add(new NameInfo(gamesDataDTO.getEnName(), "en-US"));
game.setNameInfo(nameInfos);
gameService.updateGame(game);
}
gamesDataDTO.setSystemGameId(game.getGameId());
}
@ -258,6 +263,17 @@ public class MeiTianGameServiceImpl implements IGamesService {
return CacheConstants.MeiTian_GAMES;
}
/**
* id
*
* @param transactionIdRequestDTO iddto
* @return {@link String }
*/
@Override
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
return GamePlatforms.MT.getCode() + IdUtils.simpleUUID();
}
/**
* id
*

View File

@ -13,6 +13,7 @@ import com.ff.base.utils.DateUtils;
import com.ff.base.utils.SleepUtil;
import com.ff.base.utils.StringUtils;
import com.ff.base.utils.sign.Md5Utils;
import com.ff.base.utils.uuid.IdUtils;
import com.ff.config.KeyConfig;
import com.ff.game.api.IGamesService;
import com.ff.game.api.ng.client.NGClient;
@ -258,6 +259,12 @@ public class GamesPGServiceImpl implements IGamesService {
gameService.insertGame(game);
} else {
game = games.get(0);
List<NameInfo> nameInfos = new ArrayList<>();
nameInfos.add(new NameInfo(apiGameInfoResponseDTO.getGameName().get("zh-hans"), "zh-CN"));
nameInfos.add(new NameInfo(apiGameInfoResponseDTO.getGameName().get("zh-hant"), "zh-TW"));
nameInfos.add(new NameInfo(apiGameInfoResponseDTO.getGameName().get("en"), "en-US"));
game.setNameInfo(nameInfos);
gameService.updateGame(game);
}
apiGameInfoResponseDTO.setSystemGameId(game.getId());
@ -273,6 +280,19 @@ public class GamesPGServiceImpl implements IGamesService {
return CacheConstants.PG_GAMES;
}
/**
* id
*
* @param transactionIdRequestDTO iddto
* @return {@link String }
*/
@Override
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
return gameExchangeMoneyService.getTransactionId(GamePlatforms.PG.getCode(), 32);
}
/**
* id
*
@ -298,10 +318,14 @@ public class GamesPGServiceImpl implements IGamesService {
.agentKey(exchangeTransferMoneyRequestDTO.getAgentKey())
.currency(exchangeTransferMoneyRequestDTO.getCurrency())
.build();
MemberInfoResponseDTO memberInfo = this.getMemberInfo(gamesBaseRequestDTO);
//判断是不是转出
if (NGTransferType.TRANSFER_OUT.getValue().equals(type)) {
MemberInfoResponseDTO memberInfo = this.getMemberInfo(gamesBaseRequestDTO);
exchangeTransferMoneyRequestDTO.setAmount(memberInfo.getBalance());
if (exchangeTransferMoneyRequestDTO.getAmount().compareTo(BigDecimal.ZERO) <= 0) {
throw new ApiException(ErrorCode.INSUFFICIENT_PLAYER_BALANCE.getCode());
}
}
@ -322,6 +346,20 @@ public class GamesPGServiceImpl implements IGamesService {
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO();
exchangeTransferStatusRequestDTO.setAccount(exchangeTransferMoneyRequestDTO.getAccount());
exchangeTransferStatusRequestDTO.setCurrency(exchangeTransferMoneyRequestDTO.getCurrency());
exchangeTransferStatusRequestDTO.setOrderId(exchangeTransferMoneyRequestDTO.getTransactionId());
exchangeTransferStatusRequestDTO.setAgentId(exchangeTransferMoneyRequestDTO.getAgentId());
exchangeTransferStatusRequestDTO.setAgentKey(exchangeTransferMoneyRequestDTO.getAgentKey());
ExchangeTransferStatusResponseDTO statusResponseDTO = this.exchangeTransferStatus(exchangeTransferStatusRequestDTO);
//更新钱
exchangeMoney.setBalance(statusResponseDTO.getBalance());
exchangeMoney.setCoinBefore(statusResponseDTO.getCoinBefore());
exchangeMoney.setCoinAfter(statusResponseDTO.getCoinAfter());
exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore());
exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
} else {
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
@ -341,6 +379,7 @@ public class GamesPGServiceImpl implements IGamesService {
@Override
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
SleepUtil.sleep(1000);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("playerId", exchangeTransferMoneyRequestDTO.getAccount());
@ -359,7 +398,7 @@ public class GamesPGServiceImpl implements IGamesService {
.build();
ApiExchangeTransferStatusResponseDTO apiNGResponseDTOData = apiNGResponseDTO.getData();
if (!ObjectUtils.isEmpty(apiNGResponseDTOData)) {
transferStatusResponseDTO.setBalance(apiNGResponseDTOData.getAmount());
transferStatusResponseDTO.setBalance(apiNGResponseDTOData.getAmount().abs());
transferStatusResponseDTO.setCoinBefore(NumberUtil.sub(apiNGResponseDTOData.getAmount(), apiNGResponseDTOData.getAfterBalance()).abs());
transferStatusResponseDTO.setCoinAfter(apiNGResponseDTOData.getAfterBalance());
}

View File

@ -15,6 +15,7 @@ import com.ff.base.utils.DateUtils;
import com.ff.base.utils.JsonUtil;
import com.ff.base.utils.StringUtils;
import com.ff.base.utils.sign.Base64;
import com.ff.base.utils.uuid.IdUtils;
import com.ff.config.KeyConfig;
import com.ff.game.api.IGamesService;
import com.ff.game.api.fc.dto.ApiFCGameListResponseDTO;
@ -243,6 +244,10 @@ public class GamesPGTServiceImpl implements IGamesService {
gameService.insertGame(game);
} else {
game = games.get(0);
List<NameInfo> nameInfos = new ArrayList<>();
nameInfos.add(NameInfo.builder().lang("en-US").name(gameIdKey.getName()).build());
game.setNameInfo(nameInfos);
gameService.updateGame(game);
}
gameIdKey.setSystemGameId(game.getGameId());
}
@ -256,7 +261,16 @@ public class GamesPGTServiceImpl implements IGamesService {
}
return CacheConstants.PGT_GAMES;
}
/**
* id
*
* @param transactionIdRequestDTO iddto
* @return {@link String }
*/
@Override
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
return gameExchangeMoneyService.getTransactionId(GamePlatforms.PGT.getInfo(), 17);
}
/**
* id
*

View File

@ -79,13 +79,13 @@ public class PGXBetHistoryResponse {
* () GMT/UTC +0
*/
@JsonProperty("start_time")
private Date startTime;
private String startTime;
/**
* (String) GMT/UTC +0
*/
@JsonProperty("end_time")
private Date endTime;
private String endTime;
/**
* (String) GMT/UTC +0

View File

@ -251,6 +251,10 @@ public class GamesPGXServiceImpl implements IGamesService {
gameService.insertGame(game);
} else {
game = games.get(0);
List<NameInfo> nameInfos = new ArrayList<>();
nameInfos.add(new NameInfo(gamesDataDTO.getGameName(), "en-US"));
game.setNameInfo(nameInfos);
gameService.updateGame(game);
}
gamesDataDTO.setSystemGameId(game.getGameId());
@ -430,6 +434,21 @@ public class GamesPGXServiceImpl implements IGamesService {
}
}
/**
* id
*
* @param transactionIdRequestDTO iddto
* @return {@link String }
*/
@Override
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
return gameExchangeMoneyService.getTransactionId(GamePlatforms.PGX.getInfo(), 17);
}
/**
*
*
@ -585,6 +604,7 @@ public class GamesPGXServiceImpl implements IGamesService {
payoffAmount = NumberUtil.sub(payout, resultBean.getBet()).negate();
gameStatus = GameStatus.FAIL.getCode();
}
long endTime = DateUtils.convertToMillisWithTimezone(resultBean.getEndTime(), "UTC");
//数据构造
GameBettingDetails gameBettingDetails = GameBettingDetails.builder()
.tenantKey(member.getTenantKey())
@ -602,11 +622,11 @@ public class GamesPGXServiceImpl implements IGamesService {
.gameCurrencyCode(/*currencyDTO.getCurrency()*/gamesDataBuildDTO.getCurrencyCode())
.account(resultBean.getMember())
.wagersId(String.valueOf(resultBean.getId()))
.wagersTime(resultBean.getStartTime().getTime())
.wagersTime(DateUtils.convertToMillisWithTimezone(resultBean.getStartTime(),"UTC"))
.betAmount(resultBean.getBet())
.payoffTime(resultBean.getEndTime().getTime())
.payoffTime(endTime)
.payoffAmount(payoffAmount)
.settlementTime(resultBean.getEndTime().getTime())
.settlementTime(endTime)
.turnover(resultBean.getTurnover())
.settlementStatus(PGXBetRecordStatus.findSystemCodeByCode(resultBean.getStatus()))
.build();

View File

@ -0,0 +1,25 @@
package com.ff.game.api.request;
import com.ff.base.annotation.Excel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* iddto
*
* @author shi
* @date 2025/04/11
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class TransactionIdRequestDTO {
/** 转出类型 1游戏商转入到用户全部转出 2 用户转移到游戏商 3 游戏商转移额度到平台商 */
private Integer exchangeType;
/** 游戏账号 */
private String gameAccount;
}

View File

@ -10,6 +10,7 @@ import com.ff.base.exception.base.ApiException;
import com.ff.base.system.service.ISysConfigService;
import com.ff.base.utils.*;
import com.ff.base.utils.sign.Md5Utils;
import com.ff.base.utils.uuid.IdUtils;
import com.ff.config.KeyConfig;
import com.ff.game.api.IGamesService;
import com.ff.game.api.request.*;
@ -240,11 +241,34 @@ public class GamesSAServiceImpl implements IGamesService {
game.setGameId(StringUtils.addSuffix(GamePlatforms.SA.getCode(), 1));
game.setNameInfo(nameInfos);
gameService.updateGame(game);
}else {
List<NameInfo> nameInfos = new ArrayList<>();
nameInfos.add(new NameInfo("真人棋牌", "zh-CN"));;
game.setNameInfo(nameInfos);
gameService.updateGame(game);
}
return CacheConstants.SA_GAMES;
}
/**
* id
*
* @param transactionIdRequestDTO iddto
* @return {@link String }
*/
@Override
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
//判断是转入还是转出
String transactionId = "OUT" + DateUtils.dateTimeNow() + transactionIdRequestDTO.getGameAccount();
if (!TransferType.ALL.getCode().equals(transactionIdRequestDTO.getExchangeType())) {
transactionId = "IN" + DateUtils.dateTimeNow() + transactionIdRequestDTO.getGameAccount();
}
return transactionId;
}
/**
* id
*

View File

@ -199,7 +199,7 @@ public class SV388GamesServiceImpl implements IGamesService {
List<Game> gameList = gameService.selectGameList(condition);
Platform platform = gamesBaseRequestDTO.getVendor();
//不存在这个游戏
if (ObjectUtils.isEmpty(gameList)) {
if (CollectionUtils.isEmpty(gameList)) {
Game game = new Game();
game.setId(IdUtil.getSnowflakeNextId());
game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.SV388.getCode()) + 1);
@ -215,6 +215,15 @@ public class SV388GamesServiceImpl implements IGamesService {
game.setNameInfo(Collections.singletonList(nameInfo));
game.setGameId(StringUtils.addSuffix(GamePlatforms.SV388.getCode(), 1));
gameService.insertGame(game);
}else {
for (Game game : gameList) {
NameInfo nameInfo = new NameInfo();
nameInfo.setLang("zh-CN");
nameInfo.setName("SV388真人");
game.setNameInfo(Collections.singletonList(nameInfo));
gameService.updateGame(game);
}
}
return CacheConstants.SV388_GAMES;
}
@ -275,6 +284,17 @@ public class SV388GamesServiceImpl implements IGamesService {
return exchangeMoney.getId();
}
/**
* id
*
* @param transactionIdRequestDTO iddto
* @return {@link String }
*/
@Override
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
return GamePlatforms.SV388.getCode() + IdUtils.simpleUUID();
}
/**
*

View File

@ -197,7 +197,16 @@ public class GamesXKServiceImpl implements IGamesService {
throw new BaseException(xkLoginWithoutRedirectResponseDTO.getMsg());
}
}
/**
* id
*
* @param transactionIdRequestDTO iddto
* @return {@link String }
*/
@Override
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
return GamePlatforms.XK.getCode() + IdUtils.simpleUUID();
}
/**
*
@ -251,6 +260,11 @@ public class GamesXKServiceImpl implements IGamesService {
gameService.insertGame(game);
} else {
game = games.get(0);
List<NameInfo> nameInfos = new ArrayList<>();
nameInfos.add(new NameInfo(gamesDataDTO.getName(), "zh-CN"));
game.setNameInfo(nameInfos);
gameService.updateGame(game);
}
gamesDataDTO.setSystemGameId(game.getGameId());
}