feat(game): 实现余额转移状态查询功能

- 新增余额转移状态查询接口和相关 DTO 类- 完善定时任务处理逻辑,增加步进状态处理
- 优化游戏兑换货币相关逻辑,增加空列表判断
- 修复美天游戏同步记录方法中的类型转换问题
- 完善平台交易服务中的异常处理
main-pgt
shi 2025-04-11 15:47:42 +08:00
parent 88bdfc9c16
commit 724d5f8f06
8 changed files with 132 additions and 4 deletions

View File

@ -28,6 +28,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
@ -149,6 +150,9 @@ public class DeductBalanceServiceImpl extends AbstractStepProcessor {
.sourceId(String.valueOf(gameExchangeMoney.getId()))
.isOut(Boolean.FALSE)
.build());
if (CollectionUtils.isEmpty(tenantGameQuotaFlows)) {
return Boolean.TRUE;
}
//取出第一个
TenantGameQuotaFlow tenantGameQuotaFlow = tenantGameQuotaFlows.get(0);
return tenantGameQuotaService.balanceChanges(BalanceChangesDTO.builder()

View File

@ -113,6 +113,9 @@ public class PlatformTransactionServiceImpl extends AbstractStepProcessor {
//订单已成功
if (StatusType.SUCCESS.getValue().equals(statusResponseDTO.getStatusType())) {
return Boolean.TRUE;
}else {
//定时任务失败直接回滚
throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode());
}
}

View File

@ -464,7 +464,7 @@ public class MeiTianGameServiceImpl implements IGamesService {
boolean doSyncRecordByRecordID(BetRecordByTimeDTO betRecordByTimeDTO) {
String configKey = GamePlatforms.MT.getCode() + ":lastSyncRecordID";
long recordID = redisCache.getCacheObject(configKey);
Long recordID = redisCache.getCacheObject(configKey);
//String lastRecordID = sysConfigServiceImpl.selectConfigByKey(configKey);
/*if (lastRecordID == null || lastRecordID.isEmpty()) {

View File

@ -65,6 +65,14 @@ public interface SAClient {
String exchangeTransferByInto(@Body String params);
@Post( url ="/api.aspx/CheckOrderDetailsDV",
headers = {
"Content-type: application/x-www-form-urlencoded"
})
String exchangeTransferStatus(@Body String params);
/**
*
*

View File

@ -0,0 +1,74 @@
package com.ff.game.api.sa.dto;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.math.BigDecimal;
import java.util.Date;
/**
* CheckOrderDetailsResponse - XML Java
*/
@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "CheckOrderDetailsResponse")
public class SACheckOrderDetailsResponse {
/**
* ID
*/
@XmlElement(name = "ErrorMsgId")
private Integer errorMsgId;
/**
*
*/
@XmlElement(name = "ErrorMsg")
private String errorMsg;
/**
*
*/
@XmlElement(name = "isExist")
private Boolean isExist;
/**
*
*/
@XmlElement(name = "Date")
private Date date;
/**
*
*/
@XmlElement(name = "Type")
private Integer type;
/**
*
*/
@XmlElement(name = "Currency")
private String currency;
/**
*
*/
@XmlElement(name = "Amount")
private BigDecimal amount;
/**
*
*/
@XmlElement(name = "PreviousBalance")
private BigDecimal previousBalance;
/**
*
*/
@XmlElement(name = "Balance")
private BigDecimal balance;
}

View File

@ -361,7 +361,28 @@ public class GamesSAServiceImpl implements IGamesService {
*/
@Override
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
Map<String, Object> params = new LinkedHashMap<>();
params.put("OrderId", exchangeTransferMoneyRequestDTO.getOrderId());
String query = JsonUtil.mapToQueryString(params);
exchangeTransferMoneyRequestDTO.setQuery(query);
String key = this.getKey(exchangeTransferMoneyRequestDTO, "CheckOrderDetailsDV");
String result = SAClient.exchangeTransferByInto(key);
SACheckOrderDetailsResponse saCheckOrderDetailsResponse = XmlUtils.xmlDecrypt(result, SACheckOrderDetailsResponse.class);
Integer errorCode = saCheckOrderDetailsResponse.getErrorMsgId();
//判断是否转移成功
Integer status = StatusType.IN_PROGRESS.getValue();
if (this.getIsSuccess(errorCode)) {
status = StatusType.SUCCESS.getValue();
} else {
status = StatusType.FAILURE.getValue();
}
return ExchangeTransferStatusResponseDTO.builder()
.statusType(status)
.balance(saCheckOrderDetailsResponse.getAmount())
.coinBefore(saCheckOrderDetailsResponse.getPreviousBalance())
.coinAfter(saCheckOrderDetailsResponse.getBalance())
.build();
}

View File

@ -2,7 +2,10 @@ package com.ff.game.dto;
import com.ff.game.domain.GameBettingDetails;
import com.ff.game.domain.GameExchangeMoney;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* dto
@ -11,6 +14,9 @@ import lombok.Data;
* @date 2025/02/27
*/
@Data
@SuperBuilder
@AllArgsConstructor
@NoArgsConstructor
public class GameExchangeMoneyDTO extends GameExchangeMoney {
/**
*

View File

@ -28,6 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -212,11 +213,17 @@ public class GameTask {
}
public void updateGameExchangeMoney() {
List<GameExchangeMoney> gameExchangeMoneyList = gameExchangeMoneyService.selectGameExchangeMoneyList(GameExchangeMoney.builder().status(StatusType.IN_PROGRESS.getValue()).build());
GameExchangeMoney gameExchangeMoney = GameExchangeMoney.builder().status(StatusType.IN_PROGRESS.getValue()).build();
Map<String, Object> params=new HashMap<>();
params.put("endTime",DateUtils.addOrSubtractMinutes( DateUtils.getNowDate(),-30));
gameExchangeMoney.setParams(params);
List<GameExchangeMoney> gameExchangeMoneyList = gameExchangeMoneyService.selectGameExchangeMoneyList(gameExchangeMoney);
for (GameExchangeMoney exchangeMoney : gameExchangeMoneyList) {
try {
Member member = memberService.selectMemberById(exchangeMoney.getMemberId());
Integer step = exchangeMoney.getStep();
Integer stepStatus = exchangeMoney.getStepStatus();
GameExchangeDTO gameExchangeDTO=new GameExchangeDTO();
BeanUtils.copyProperties(exchangeMoney,gameExchangeDTO);
gameExchangeDTO.setTriggerType(TriggerType.TIMER.getCode());
@ -226,7 +233,12 @@ public class GameTask {
exchangeMoney.getOrderId(),
() -> {
try {
stepProcessorFactory.getStepProcessor(GameExchangeStep.CREATE_ORDER).process(gameExchangeDTO);
GameExchangeStep gameExchangeStep = GameExchangeStep.getByCode(step);
if (stepStatus == GameExchangeStepStatus.SUCCESS.getCode()){
gameExchangeStep = stepProcessorFactory.getStepProcessor(GameExchangeStep.getByCode(step)).nextStepProcessor();
}
stepProcessorFactory.getStepProcessor(gameExchangeStep).process(gameExchangeDTO);
} catch (Exception e) {
log.error("GameTask [updateGameExchangeMoney] 余额转移失败 gameExchangeMoneyId {}", gameExchangeDTO.getId(),e);
stepProcessorFactory.getStepProcessor(GameExchangeStep.getByCode(exchangeMoney.getStep())).rollBack(gameExchangeDTO);