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.PlatformTransactionManager;
|
||||||
import org.springframework.transaction.TransactionDefinition;
|
import org.springframework.transaction.TransactionDefinition;
|
||||||
import org.springframework.transaction.support.TransactionTemplate;
|
import org.springframework.transaction.support.TransactionTemplate;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
@ -149,6 +150,9 @@ public class DeductBalanceServiceImpl extends AbstractStepProcessor {
|
||||||
.sourceId(String.valueOf(gameExchangeMoney.getId()))
|
.sourceId(String.valueOf(gameExchangeMoney.getId()))
|
||||||
.isOut(Boolean.FALSE)
|
.isOut(Boolean.FALSE)
|
||||||
.build());
|
.build());
|
||||||
|
if (CollectionUtils.isEmpty(tenantGameQuotaFlows)) {
|
||||||
|
return Boolean.TRUE;
|
||||||
|
}
|
||||||
//取出第一个
|
//取出第一个
|
||||||
TenantGameQuotaFlow tenantGameQuotaFlow = tenantGameQuotaFlows.get(0);
|
TenantGameQuotaFlow tenantGameQuotaFlow = tenantGameQuotaFlows.get(0);
|
||||||
return tenantGameQuotaService.balanceChanges(BalanceChangesDTO.builder()
|
return tenantGameQuotaService.balanceChanges(BalanceChangesDTO.builder()
|
||||||
|
|
|
@ -113,6 +113,9 @@ public class PlatformTransactionServiceImpl extends AbstractStepProcessor {
|
||||||
//订单已成功
|
//订单已成功
|
||||||
if (StatusType.SUCCESS.getValue().equals(statusResponseDTO.getStatusType())) {
|
if (StatusType.SUCCESS.getValue().equals(statusResponseDTO.getStatusType())) {
|
||||||
return Boolean.TRUE;
|
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) {
|
boolean doSyncRecordByRecordID(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||||
String configKey = GamePlatforms.MT.getCode() + ":lastSyncRecordID";
|
String configKey = GamePlatforms.MT.getCode() + ":lastSyncRecordID";
|
||||||
long recordID = redisCache.getCacheObject(configKey);
|
Long recordID = redisCache.getCacheObject(configKey);
|
||||||
|
|
||||||
//String lastRecordID = sysConfigServiceImpl.selectConfigByKey(configKey);
|
//String lastRecordID = sysConfigServiceImpl.selectConfigByKey(configKey);
|
||||||
/*if (lastRecordID == null || lastRecordID.isEmpty()) {
|
/*if (lastRecordID == null || lastRecordID.isEmpty()) {
|
||||||
|
|
|
@ -65,6 +65,14 @@ public interface SAClient {
|
||||||
String exchangeTransferByInto(@Body String params);
|
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
|
@Override
|
||||||
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
|
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.GameBettingDetails;
|
||||||
import com.ff.game.domain.GameExchangeMoney;
|
import com.ff.game.domain.GameExchangeMoney;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.experimental.SuperBuilder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 游戏兑换货币dto
|
* 游戏兑换货币dto
|
||||||
|
@ -11,6 +14,9 @@ import lombok.Data;
|
||||||
* @date 2025/02/27
|
* @date 2025/02/27
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
|
@SuperBuilder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
public class GameExchangeMoneyDTO extends GameExchangeMoney {
|
public class GameExchangeMoneyDTO extends GameExchangeMoney {
|
||||||
/**
|
/**
|
||||||
* 会员帐户
|
* 会员帐户
|
||||||
|
|
|
@ -28,6 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
@ -212,11 +213,17 @@ public class GameTask {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateGameExchangeMoney() {
|
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) {
|
for (GameExchangeMoney exchangeMoney : gameExchangeMoneyList) {
|
||||||
try {
|
try {
|
||||||
Member member = memberService.selectMemberById(exchangeMoney.getMemberId());
|
Member member = memberService.selectMemberById(exchangeMoney.getMemberId());
|
||||||
|
|
||||||
|
Integer step = exchangeMoney.getStep();
|
||||||
|
Integer stepStatus = exchangeMoney.getStepStatus();
|
||||||
GameExchangeDTO gameExchangeDTO=new GameExchangeDTO();
|
GameExchangeDTO gameExchangeDTO=new GameExchangeDTO();
|
||||||
BeanUtils.copyProperties(exchangeMoney,gameExchangeDTO);
|
BeanUtils.copyProperties(exchangeMoney,gameExchangeDTO);
|
||||||
gameExchangeDTO.setTriggerType(TriggerType.TIMER.getCode());
|
gameExchangeDTO.setTriggerType(TriggerType.TIMER.getCode());
|
||||||
|
@ -226,7 +233,12 @@ public class GameTask {
|
||||||
exchangeMoney.getOrderId(),
|
exchangeMoney.getOrderId(),
|
||||||
() -> {
|
() -> {
|
||||||
try {
|
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) {
|
} catch (Exception e) {
|
||||||
log.error("GameTask [updateGameExchangeMoney] 余额转移失败 gameExchangeMoneyId {}", gameExchangeDTO.getId(),e);
|
log.error("GameTask [updateGameExchangeMoney] 余额转移失败 gameExchangeMoneyId {}", gameExchangeDTO.getId(),e);
|
||||||
stepProcessorFactory.getStepProcessor(GameExchangeStep.getByCode(exchangeMoney.getStep())).rollBack(gameExchangeDTO);
|
stepProcessorFactory.getStepProcessor(GameExchangeStep.getByCode(exchangeMoney.getStep())).rollBack(gameExchangeDTO);
|
||||||
|
|
Loading…
Reference in New Issue