魔法发送礼物和中奖后消费逻辑处理

This commit is contained in:
tianfeng 2026-01-22 17:39:22 +08:00
parent 078e53e937
commit 39f8c63620
4 changed files with 83 additions and 20 deletions

View File

@ -258,6 +258,12 @@ public class GiveAwayGiftBatchEvent implements Serializable {
return Objects.nonNull(giftConfig) && Objects.equals(giftConfig.getGiftTab(), "ACTIVITY");
}
/**
* 是否是魔法礼物.
*/
public boolean checkMagicGift() {
return Objects.nonNull(giftConfig) && Objects.equals(giftConfig.getGiftTab(), "MAGIC");
}
/**

View File

@ -58,7 +58,8 @@ public class LuckyGiftGiveCmdExe {
// 判断版本号从而保证使用幸运礼物必须升级版本
ResponseAssert.isTrue(CommonErrorCode.NOT_ACCEPT_REQUEST,
Objects.equals(giftConfig.getGiftTab(), GiftTabEnum.LUCKY_GIFT.name()));
Objects.equals(giftConfig.getGiftTab(), GiftTabEnum.LUCKY_GIFT.name()) ||
Objects.equals(giftConfig.getGiftTab(), GiftTabEnum.MAGIC.name()));
// 过滤赠送人非法值
ResponseAssert.isTrue(ResponseErrorCode.REQUEST_PARAMETER_ERROR,
@ -72,9 +73,11 @@ public class LuckyGiftGiveCmdExe {
// 付钱
WalletReceiptResDTO receipt = consumeCandy(cmd, giftConfig);
// 礼物处理mq
giftMqMessage.sendGift(receipt.getAssetRecordId().toString(),
giftAppConvertor.toGiveAwayGiftBatchEvent(cmd, giftConfig, receipt.getAssetRecordId()));
// 礼物处理mq 魔法礼物不处理放到中奖后处理
if (!GiftTabEnum.MAGIC.name().equals(giftConfig.getGiftTab())) {
giftMqMessage.sendGift(receipt.getAssetRecordId().toString(),
giftAppConvertor.toGiveAwayGiftBatchEvent(cmd, giftConfig, receipt.getAssetRecordId()));
}
// 抽奖mq
gameLuckyGiftCommon.sendMq(cmd, giftConfig.getStandardId());

View File

@ -6,8 +6,10 @@ import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.google.common.collect.Lists;
import com.red.circle.common.business.core.enums.SysOriginPlatformEnum;
import com.red.circle.component.mq.MessageEvent;
import com.red.circle.component.mq.service.FixedTopic;
@ -19,8 +21,12 @@ import com.red.circle.framework.core.asserts.ResponseAssert;
import com.red.circle.framework.core.dto.ReqSysOrigin;
import com.red.circle.mq.business.model.event.gift.GameLuckyGiftBusinessEvent;
import com.red.circle.mq.business.model.event.gift.GameLuckyGiftUser;
import com.red.circle.mq.business.model.event.gift.GiveAwayGiftBatchEvent;
import com.red.circle.mq.business.model.event.gift.GiveAwayGiftRoomAccepts;
import com.red.circle.mq.rocket.business.producer.GiftMqMessage;
import com.red.circle.mq.rocket.business.service.MessageSenderService;
import com.red.circle.mq.rocket.business.streams.GameLuckyGiftBusinessSink;
import com.red.circle.other.app.convertor.material.GiftAppConvertor;
import com.red.circle.other.app.convertor.user.UserProfileAppConvertor;
import com.red.circle.other.app.dto.clientobject.game.GameLuckyGiftMsgCO;
import com.red.circle.other.app.dto.cmd.activity.RankingDataUpdateCmd;
@ -50,6 +56,7 @@ import com.red.circle.other.infra.database.rds.service.sys.EnumConfigService;
import com.red.circle.other.inner.enums.config.EnumConfigKey;
import com.red.circle.other.inner.enums.game.luckgift.GameLuckyGiftModeEnum;
import com.red.circle.other.inner.enums.game.luckgift.GameLuckyGiftMultipleEnum;
import com.red.circle.other.inner.enums.material.GiftTabEnum;
import com.red.circle.other.inner.enums.material.PropsCommodityType;
import com.red.circle.other.inner.model.dto.material.GiftConfigDTO;
import com.red.circle.other.inner.model.dto.user.UserProfileDTO;
@ -75,6 +82,7 @@ import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;
/**
@ -102,6 +110,8 @@ public class GameLuckyGiftCommon {
private final LuckyGiftProbabilityDetailsService luckyGiftProbabilityDetailsService;
private final LuckyGiftApiConfig luckyGiftApiConfig;
private final RankingActivityService rankingActivityService;
private final GiftMqMessage giftMqMessage;
private final GiftAppConvertor giftAppConvertor;
/**
* 发送幸运礼物抽奖mq.
@ -204,7 +214,6 @@ public class GameLuckyGiftCommon {
*/
public void run(GameLuckyGiftParamCmd cmd) {
// runLuckyGiftGame(cmd);
runLuckyGiftGameNew(cmd);
}
@ -225,7 +234,60 @@ public class GameLuckyGiftCommon {
Integer totalAwardAmount = apiResult.getOrderResults().stream().mapToInt(OrderResult::getRewardNum).sum();
// 保存幸运礼物流水
sendMessageNew(param, Long.valueOf(String.valueOf(totalAwardAmount)));
Long rewardAmount = Long.valueOf(String.valueOf(totalAwardAmount));
saveLuckGiftCount(param, rewardAmount);
if (totalAwardAmount <= 0) {
return;
}
// 发送中奖金币
BigDecimal balance = sendGold(param.getUserId(), param.getSysOrigin(), rewardAmount);
// 发送中奖通知
int multiple = getRewardMultiple(param, rewardAmount);
sendMsg(param, multiple, balance, rewardAmount);
// 魔法礼物中奖后处理
GiftConfigDTO giftConfigDTO = getGiftConfigDTO(cmd.getGiftId());
if (GiftTabEnum.MAGIC.name().equals(giftConfigDTO.getGiftTab())) {
String timeId = IdWorker.getIdStr();
GiveAwayGiftBatchEvent giftBatchEvent = buildGiftBatchEvent(cmd, timeId, param, giftConfigDTO);
giftMqMessage.sendGift(timeId, giftBatchEvent);
}
}
@NotNull
private GiveAwayGiftBatchEvent buildGiftBatchEvent(GameLuckyGiftParamCmd cmd, String timeId,
GameLuckyGiftParam param, GiftConfigDTO giftConfigDTO) {
return new GiveAwayGiftBatchEvent()
.setSysOrigin(SysOriginPlatformEnum.valueOf(param.getSysOrigin()))
.setRequestPlatform("Android")
.setSendUserId(cmd.getUserId())
.setAccepts(getAccepts(cmd))
.setQuantity(cmd.getQuantity())
.setGiftConfig(giftAppConvertor.toGiveGiftConfig(giftConfigDTO))
.setRoomId(cmd.getRoomId())
.setTrackId(Long.parseLong(timeId))
.setBagGift(Boolean.FALSE)
.setCreateTime(TimestampUtils.now());
}
private List<GiveAwayGiftRoomAccepts> getAccepts(GameLuckyGiftParamCmd cmd) {
List<GiveAwayGiftRoomAccepts> accepts = new ArrayList<>();
accepts.add(new GiveAwayGiftRoomAccepts()
.setAcceptUserId(cmd.getAcceptUserId()));
return accepts;
}
private static int getRewardMultiple(GameLuckyGiftParam param, Long rewardAmount) {
long payAmount = param.getQuantity() * param.getGift().getGiftCandy().longValue();
return (int) (rewardAmount / payAmount);
}
/**
@ -310,7 +372,7 @@ public class GameLuckyGiftCommon {
/**
* 处理用户连续赠送幸运礼物奖励逻辑
*/
private void sendMessageNew(GameLuckyGiftParam param, Long awardAmount) {
private void saveLuckGiftCount(GameLuckyGiftParam param, Long awardAmount) {
long payAmount = param.getQuantity() * param.getGift().getGiftCandy().longValue();
int multiple = (int) (awardAmount / payAmount);
@ -333,19 +395,6 @@ public class GameLuckyGiftCommon {
.setRegionCode(param.getRoomRegionCode())
.setDateNumber(ZonedDateTimeAsiaRiyadhUtils.nowDateToInt())
);
if (awardAmount <= 0) {
return;
}
// 发送中奖金币
BigDecimal balance = sendGold(param.getUserId(), param.getSysOrigin(), awardAmount);
// getDataUpdateCmd(param.getUserId(), awardAmount);
// 发送中奖通知
sendMsg(param, multiple, balance, awardAmount);
}
private void getDataUpdateCmd(Long userId, Long actualAmount) {

View File

@ -530,6 +530,11 @@ public class GiveGiftsListener implements MessageListener {
targetAmount = giftValue.getGiftValue().multiply(acceptAssistRatio.multiply(new BigDecimal("10")).min(new BigDecimal("0.7"))).setScale(0, RoundingMode.DOWN);
acceptAmount = giftValue.getGiftValue().multiply(acceptAssistRatio).setScale(0, RoundingMode.DOWN);
} else if (event.checkMagicGift()) {
// 魔法礼物
acceptAssistRatio = new BigDecimal("0.1");
targetAmount = giftValue.getGiftValue().multiply(acceptAssistRatio).setScale(0, RoundingMode.DOWN);
acceptAmount = giftValue.getGiftValue().multiply(acceptAssistRatio).setScale(0, RoundingMode.DOWN);
} else {
// 普通礼物
acceptAssistRatio = calculateAcceptAssistRatio(event, acceptRegion);