diff --git a/ff-game/src/main/java/com/ff/game/api/exchange/impl/DeductBalanceServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/exchange/impl/DeductBalanceServiceImpl.java index 5407d80..984a9a9 100644 --- a/ff-game/src/main/java/com/ff/game/api/exchange/impl/DeductBalanceServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/exchange/impl/DeductBalanceServiceImpl.java @@ -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() diff --git a/ff-game/src/main/java/com/ff/game/api/exchange/impl/PlatformTransactionServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/exchange/impl/PlatformTransactionServiceImpl.java index 104decc..d0e5a2e 100644 --- a/ff-game/src/main/java/com/ff/game/api/exchange/impl/PlatformTransactionServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/exchange/impl/PlatformTransactionServiceImpl.java @@ -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()); } } diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/impl/MeiTianGameServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/meitian/impl/MeiTianGameServiceImpl.java index 62c5742..22cb71f 100644 --- a/ff-game/src/main/java/com/ff/game/api/meitian/impl/MeiTianGameServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/meitian/impl/MeiTianGameServiceImpl.java @@ -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()) { diff --git a/ff-game/src/main/java/com/ff/game/api/sa/client/SAClient.java b/ff-game/src/main/java/com/ff/game/api/sa/client/SAClient.java index 8631f0d..886e95d 100644 --- a/ff-game/src/main/java/com/ff/game/api/sa/client/SAClient.java +++ b/ff-game/src/main/java/com/ff/game/api/sa/client/SAClient.java @@ -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); + + /** * 外汇转出 * diff --git a/ff-game/src/main/java/com/ff/game/api/sa/dto/SACheckOrderDetailsResponse.java b/ff-game/src/main/java/com/ff/game/api/sa/dto/SACheckOrderDetailsResponse.java new file mode 100644 index 0000000..0132407 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/sa/dto/SACheckOrderDetailsResponse.java @@ -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; + +} \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/sa/impl/GamesSAServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/sa/impl/GamesSAServiceImpl.java index 060055c..36ee3c7 100644 --- a/ff-game/src/main/java/com/ff/game/api/sa/impl/GamesSAServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/sa/impl/GamesSAServiceImpl.java @@ -361,7 +361,28 @@ public class GamesSAServiceImpl implements IGamesService { */ @Override public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { - throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + Map 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(); } diff --git a/ff-game/src/main/java/com/ff/game/dto/GameExchangeMoneyDTO.java b/ff-game/src/main/java/com/ff/game/dto/GameExchangeMoneyDTO.java index f505d6b..066940c 100644 --- a/ff-game/src/main/java/com/ff/game/dto/GameExchangeMoneyDTO.java +++ b/ff-game/src/main/java/com/ff/game/dto/GameExchangeMoneyDTO.java @@ -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 { /** * 会员帐户 diff --git a/ff-game/src/main/java/com/ff/quartz/task/GameTask.java b/ff-game/src/main/java/com/ff/quartz/task/GameTask.java index e229e60..50e40be 100644 --- a/ff-game/src/main/java/com/ff/quartz/task/GameTask.java +++ b/ff-game/src/main/java/com/ff/quartz/task/GameTask.java @@ -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 gameExchangeMoneyList = gameExchangeMoneyService.selectGameExchangeMoneyList(GameExchangeMoney.builder().status(StatusType.IN_PROGRESS.getValue()).build()); + GameExchangeMoney gameExchangeMoney = GameExchangeMoney.builder().status(StatusType.IN_PROGRESS.getValue()).build(); + Map params=new HashMap<>(); + params.put("endTime",DateUtils.addOrSubtractMinutes( DateUtils.getNowDate(),-30)); + gameExchangeMoney.setParams(params); + List 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);