fix(game): 修复游戏余额扣除和订单回滚相关问题

- 在扣除余额时增加检查,避免重复回滚增加余额
-调整订单状态更新的定时任务执行频率,从每30分钟改为每5分钟
-优化平台交易状态查询逻辑,避免不必要的错误提示
main-pgt
shi 2025-04-11 16:13:15 +08:00
parent 724d5f8f06
commit 39dcd026c0
3 changed files with 23 additions and 19 deletions

View File

@ -145,7 +145,21 @@ public class DeductBalanceServiceImpl extends AbstractStepProcessor {
}
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
//如果该订单已经回滚过增加余额
List<TenantGameQuotaFlow> tenantGameQuotaFlows = tenantGameQuotaFlowService.selectTenantGameQuotaFlowList(
TenantGameQuotaFlow.builder()
.sourceId(String.valueOf(gameExchangeMoney.getId()))
.isOut(Boolean.TRUE)
.build());
if (!CollectionUtils.isEmpty(tenantGameQuotaFlows)){
return Boolean.TRUE;
}
tenantGameQuotaFlows = tenantGameQuotaFlowService.selectTenantGameQuotaFlowList(
TenantGameQuotaFlow.builder()
.sourceId(String.valueOf(gameExchangeMoney.getId()))
.isOut(Boolean.FALSE)

View File

@ -74,8 +74,11 @@ public class PlatformTransactionServiceImpl extends AbstractStepProcessor {
*/
@Override
public boolean doProcess(GameExchangeDTO gameExchangeMoney) {
//如果不是之前的步骤代码执行过了
if (!gameExchangeMoney.getStep().equals(this.backStepProcessor().getCode())) {
//如果不是之前的步骤代码执行过了 或者当前步骤成功的
if (!gameExchangeMoney.getStep().equals(this.backStepProcessor().getCode())&&
(GameExchangeStep.PLATFORM_TRANSACTION.getCode().equals(gameExchangeMoney.getStep())&&
gameExchangeMoney.getStepStatus().equals(GameExchangeStepStatus.SUCCESS.getCode()))
) {
return Boolean.TRUE;
}
@ -99,22 +102,9 @@ public class PlatformTransactionServiceImpl extends AbstractStepProcessor {
//查询订单详情
if (TriggerType.TIMER.getCode() == gameExchangeMoney.getTriggerType()) {
ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO();
exchangeTransferStatusRequestDTO.setAccount(member.getGameAccount());
exchangeTransferStatusRequestDTO.setCurrency(targetCurrency);
exchangeTransferStatusRequestDTO.setOrderId(gameExchangeMoney.getTransactionId());
exchangeTransferStatusRequestDTO.setAgentId(keyInfo.getCode());
exchangeTransferStatusRequestDTO.setAgentKey(keyInfo.getKey());
exchangeTransferStatusRequestDTO.setGameExchangeMoneyId(gameExchangeMoney.getId());
exchangeTransferStatusRequestDTO.setVendor(platform);
exchangeTransferStatusRequestDTO.setKeyInfo(keyInfo);
exchangeTransferStatusRequestDTO.setSystemCurrency(gameExchangeMoney.getCurrencyCode());
ExchangeTransferStatusResponseDTO statusResponseDTO = iGamesService.exchangeTransferStatus(exchangeTransferStatusRequestDTO);
//订单已成功
if (StatusType.SUCCESS.getValue().equals(statusResponseDTO.getStatusType())) {
return Boolean.TRUE;
}else {
//定时任务失败直接回滚
//做二次确认调订单详情接口
this.doRollBack(gameExchangeMoney);
if (GameExchangeStepStatus.FAILURE.getCode() == gameExchangeMoney.getStepStatus()){
throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode());
}
}

View File

@ -215,7 +215,7 @@ public class GameTask {
public void updateGameExchangeMoney() {
GameExchangeMoney gameExchangeMoney = GameExchangeMoney.builder().status(StatusType.IN_PROGRESS.getValue()).build();
Map<String, Object> params=new HashMap<>();
params.put("endTime",DateUtils.addOrSubtractMinutes( DateUtils.getNowDate(),-30));
params.put("endTime",DateUtils.addOrSubtractMinutes( DateUtils.getNowDate(),-5));
gameExchangeMoney.setParams(params);
List<GameExchangeMoney> gameExchangeMoneyList = gameExchangeMoneyService.selectGameExchangeMoneyList(gameExchangeMoney);
for (GameExchangeMoney exchangeMoney : gameExchangeMoneyList) {