feat(game): 实现余额转移状态查询功能
- 新增余额转移状态查询接口和相关 DTO 类- 完善定时任务处理逻辑,增加步进状态处理 - 优化游戏兑换货币相关逻辑,增加空列表判断 - 修复美天游戏同步记录方法中的类型转换问题 - 完善平台交易服务中的异常处理main-pgt
parent
88bdfc9c16
commit
724d5f8f06
|
@ -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()
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
||||
/**
|
||||
* 外汇转出
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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 {
|
||||
/**
|
||||
* 会员帐户
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue