小游戏推送MQ

This commit is contained in:
2025-04-23 16:40:57 +08:00
parent 6602b11c98
commit baf74889ae
7 changed files with 130 additions and 46 deletions

View File

@@ -0,0 +1,29 @@
package com.accompany.business.message;
import com.accompany.mq.model.BaseMqMessage;
import lombok.Data;
import com.accompany.business.enums.resource.ResourceCodeEnum ;
import java.util.Date;
@Data
public class GameMsgMessage extends BaseMqMessage {
private Boolean pushScreen;
private String gameId;
private Long roomUid;
private Long uid;
private Integer type;
private Double coin;
private ResourceCodeEnum resourceCodeEnum;
private String configId;
private Date createTime;
}

View File

@@ -1,20 +1,18 @@
package com.accompany.business.event.listener.miniGame;
import com.accompany.business.event.miniGame.MiniGameChangeCurrencyEvent;
import com.accompany.business.message.GameMsgMessage;
import com.accompany.business.service.rank.miniGame.MiniGameWeekJackpotRankService;
import com.accompany.business.service.user.UsersService;
import com.accompany.common.constant.Constant;
import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.model.Users;
import com.accompany.sharding.model.BaiShunGameRecord;
import com.accompany.sharding.model.GameGoldLog;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -35,24 +33,13 @@ public class MiniGameWeekJackpotRankListener implements ApplicationListener<Mini
@Override
public void onApplicationEvent(MiniGameChangeCurrencyEvent event) {
Object source = event.getSource();
if (source instanceof BaiShunGameRecord){
BaiShunGameRecord record = (BaiShunGameRecord) source;
if (record.getCurrencyDiff() >= 0){
GameMsgMessage gameMsgMessage = (GameMsgMessage) source;
if (Constant.GameGoldType.ADD == gameMsgMessage.getType()){
return;
}
Double score = BigDecimal.valueOf(Math.abs(record.getCurrencyDiff())).doubleValue();
updateRank(record.getUid(), score, record.getCreateTime());
} else if (source instanceof GameGoldLog) {
GameGoldLog log = (GameGoldLog) source;
if (Constant.GameGoldType.ADD == log.getType() || log.getCoin() < 0){
return;
}
Double score = BigDecimal.valueOf(log.getCoin()).doubleValue();
updateRank(log.getUid(), score, log.getCreateTime());
}
Double score = Math.abs(gameMsgMessage.getCoin());
updateRank(gameMsgMessage.getUid(), score, gameMsgMessage.getCreateTime());
}
private void updateRank(Long uid, Double score, Date createTime){

View File

@@ -1,11 +1,11 @@
package com.accompany.business.service.game;
import cn.hutool.core.date.DateUtil;
import com.accompany.business.config.LeaderccMiniGameConfig;
import com.accompany.business.enums.resource.ResourceCodeEnum;
import com.accompany.business.event.miniGame.MiniGameChangeCurrencyEvent;
import com.accompany.business.message.GameMsgMessage;
import com.accompany.business.model.UserPurse;
import com.accompany.business.model.game.GameFeeRateConfig;
import com.accompany.business.service.mq.RocketMQService;
import com.accompany.business.service.purse.UserPurseService;
import com.accompany.business.service.record.BillRecordService;
import com.accompany.business.service.user.UsersService;
@@ -71,6 +71,8 @@ public class GameService {
private BaseGameMessageService baseGameMessageService;
@Autowired
private GameFeeRateConfigService gameFeeRateConfigService;
@Autowired
private RocketMQService rocketMQService;
public final String ALL = "All";
@@ -167,30 +169,36 @@ public class GameService {
// 记录流水
gameGoldLogService.insertGameGoldLog(log);
UserPurse userPurse = userPurseService.queryUserPurse(uid);
double goldNum = param.getCoin().doubleValue();
Double remainGold = userPurse.getDiamonds();
UserPurse afterPurse = null;
GameMsgMessage gameMsgMessage = new GameMsgMessage();
if (param.getType() == Constant.GameGoldType.ADD) {
// 扣减用户钻石
userPurseService.addDiamond(uid, goldNum, BillObjTypeEnum.LEADERCC_GAME_IN,
afterPurse = userPurseService.addDiamond(uid, goldNum, BillObjTypeEnum.LEADERCC_GAME_IN,
(up) -> billRecordService.insertGeneralBillRecord(uid, param.getOrderId(), BillObjTypeEnum.LEADERCC_GAME_IN, goldNum, up));
remainGold = userPurse.getDiamonds() + goldNum;
taskExecutor.execute(() -> {
baseGameMessageService.sendGameMessage(param.getGameId(), log.getRoomUid(), uid, param.getCoin().doubleValue(), ResourceCodeEnum.LEADERCC, Constant.SysConfId.MINI_GAME_FOR_LEADERCC);
});
gameMsgMessage.setPushScreen(Boolean.TRUE);
}
if (param.getType() == Constant.GameGoldType.REDUCT) {
// 扣减用户钻石
userPurseService.subDiamond(uid, param.getCoin().doubleValue(), BillObjTypeEnum.LEADERCC_GAME_OUT,
afterPurse = userPurseService.subDiamond(uid, param.getCoin().doubleValue(), BillObjTypeEnum.LEADERCC_GAME_OUT,
(up)-> billRecordService.insertGeneralBillRecord(uid, param.getOrderId(), BillObjTypeEnum.LEADERCC_GAME_OUT, param.getCoin().doubleValue(), up));
remainGold = userPurse.getDiamonds() - goldNum;
}
//todo 跟 record 整合到mq后置处理
applicationContext.publishEvent(new MiniGameChangeCurrencyEvent(log));
gameMsgMessage.setCoin(goldNum);
gameMsgMessage.setGameId(log.getGameId());
gameMsgMessage.setType(log.getType());
gameMsgMessage.setUid(uid);
gameMsgMessage.setResourceCodeEnum(ResourceCodeEnum.LEADERCC);
gameMsgMessage.setConfigId(Constant.SysConfId.MINI_GAME_FOR_LEADERCC);
gameMsgMessage.setCreateTime(log.getCreateTime());
rocketMQService.sendGameMsgPushMessage(gameMsgMessage);
JSONObject jsonObject = new JSONObject();
jsonObject.put("coin", remainGold.longValue());
jsonObject.put("coin", afterPurse.getDiamonds().longValue());
return new GameResponseVO<>(jsonObject);
}

View File

@@ -1,23 +1,18 @@
package com.accompany.business.service.game;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.accompany.business.config.BaiShunMiniGameConfig;
import com.accompany.business.dto.miniGame.MiniGameForBaiShunDto;
import com.accompany.business.dto.miniGame.baishun.*;
import com.accompany.business.enums.resource.ResourceCodeEnum;
import com.accompany.business.event.miniGame.MiniGameChangeCurrencyEvent;
import com.accompany.business.event.miniGame.MiniGameForBaiShunEvent;
import com.accompany.business.message.GameMsgMessage;
import com.accompany.business.model.UserPurse;
import com.accompany.business.mybatismapper.miniGame.MiniGameRoundMapper;
import com.accompany.business.service.mq.RocketMQService;
import com.accompany.business.service.purse.UserPurseService;
import com.accompany.business.service.record.BillRecordService;
import com.accompany.business.vo.game.GameResponseVO;
import com.accompany.common.constant.Constant;
import com.accompany.common.redis.RedisKey;
import com.accompany.common.status.BusiStatus;
import com.accompany.common.utils.DateTimeUtil;
import com.accompany.core.base.SpringContextHolder;
import com.accompany.core.enumeration.BillObjTypeEnum;
import com.accompany.core.enumeration.CurrencyEnum;
import com.accompany.core.exception.ServiceException;
@@ -34,7 +29,6 @@ import org.redisson.api.RSet;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.StringCodec;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -82,10 +76,11 @@ public class MiniGameForBaiShunServiceImpl implements MiniGameForBaiShunService
@Autowired
private BaseGameMessageService baseGameMessageService;
@Autowired
private RocketMQService rocketMQService;
@Resource(name = "bizExecutor")
private ThreadPoolExecutor taskExecutor;
@Autowired
private ApplicationContext applicationContext;
public void check(BaiShunBaseReq req) {
String appKey = baiShunMiniGameConfig.getAppKey();
@@ -244,10 +239,13 @@ public class MiniGameForBaiShunServiceImpl implements MiniGameForBaiShunService
double diamondNum = Math.abs(currencyDiff);
UserPurse afterPurse = null;
GameMsgMessage gameMsgMessage = new GameMsgMessage();
if (currencyDiff > 0) {
//增加钱包
afterPurse = userPurseService.addDiamond(uid, diamondNum, BillObjTypeEnum.MINI_GAME_IN,
(userPurse -> billRecordService.insertGeneralBillRecord(uid, orderId, BillObjTypeEnum.MINI_GAME_IN, diamondNum, userPurse)));
gameMsgMessage.setPushScreen(Boolean.TRUE);
gameMsgMessage.setType(Constant.GameGoldType.ADD);
taskExecutor.execute(() -> {
//公屏与飘屏消息
baseGameMessageService.sendGameMessage(String.valueOf(gameId), roomUid, uid, diamondNum, ResourceCodeEnum.BAISHUN, Constant.SysConfId.MINI_GAME_FOR_BAI_SHUN);
@@ -255,10 +253,17 @@ public class MiniGameForBaiShunServiceImpl implements MiniGameForBaiShunService
} else {
afterPurse = userPurseService.subDiamond(uid, diamondNum, BillObjTypeEnum.MINI_GAME_OUT, BusiStatus.BAI_SHUN_CURRENCY_NUM_NOT_ENOUGH,
(userPurse)-> billRecordService.insertGeneralBillRecord(uid, orderId, BillObjTypeEnum.MINI_GAME_OUT, diamondNum, userPurse));
gameMsgMessage.setType(Constant.GameGoldType.REDUCT);
}
//todo 跟 record 整合到mq后置处理
applicationContext.publishEvent(new MiniGameChangeCurrencyEvent(record));
gameMsgMessage.setCoin(currencyDiff.doubleValue());
gameMsgMessage.setGameId(record.getGameId().toString());
gameMsgMessage.setUid(uid);
gameMsgMessage.setResourceCodeEnum(ResourceCodeEnum.BAISHUN);
gameMsgMessage.setConfigId(Constant.SysConfId.MINI_GAME_FOR_BAI_SHUN);
gameMsgMessage.setCreateTime(record.getCreateTime());
rocketMQService.sendGameMsgPushMessage(gameMsgMessage);
//查询当前金币
changeBalance = new BaiShunChangeBalanceResp();

View File

@@ -139,4 +139,14 @@ public class RocketMQService {
log.error("sendMiniGameMatchRoundMsg fail message: {}", JSON.toJSONString(msg), throwable), 4);
}
/**
* 发送游戏推送消息发送到MQ
*/
public void sendGameMsgPushMessage(GameMsgMessage gameMsgMessage) {
mqMessageProducer.send(MqConstant.GAME_MSG_PUSH_TOPIC, gameMsgMessage,
sendResult -> log.info("sendGameMsgPushMessage success message: {} queue {}", JSON.toJSONString(gameMsgMessage), sendResult.getMessageQueue().getQueueId()),
throwable -> log.error("sendGameMsgPushMessage fail message: {}", JSON.toJSONString(gameMsgMessage), throwable));
}
}

View File

@@ -41,4 +41,9 @@ public interface MqConstant {
String MINI_GAME_MATCH_ROUND_TOPIC = "mini_game_match_round_topic";
String MINI_GAME_MATCH_ROUND_CONSUME_GROUP = "mini_game_match_round_consume_group";
String GAME_MSG_PUSH_TOPIC = "game_msg_push_topic";
String GAME_MSG_PUSH_CONSUME_GROUP = "game_msg_push_consume_group";
}

View File

@@ -0,0 +1,40 @@
package com.accompany.mq.consumer;
import com.accompany.business.enums.resource.ResourceCodeEnum;
import com.accompany.business.event.miniGame.MiniGameChangeCurrencyEvent;
import com.accompany.business.message.BillMessage;
import com.accompany.business.message.GameMsgMessage;
import com.accompany.business.service.game.BaseGameMessageService;
import com.accompany.business.service.gift.BillMessageService;
import com.accompany.common.constant.Constant;
import com.accompany.mq.constant.MqConstant;
import com.accompany.mq.listener.AbstractMessageListener;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@ConditionalOnProperty(name = "spring.application.name", havingValue = "web")
@RocketMQMessageListener(topic = MqConstant.GAME_MSG_PUSH_TOPIC, consumerGroup = MqConstant.GAME_MSG_PUSH_CONSUME_GROUP)
public class GameMsgPushMessageConsumer extends AbstractMessageListener<GameMsgMessage> {
@Autowired
private BaseGameMessageService baseGameMessageService;
@Autowired
private ApplicationContext applicationContext;
@Override
public void onMessage(GameMsgMessage gameMsgMessage) {
log.info("onMessage gameMsgMessage: {}", gameMsgMessage.toString());
if (gameMsgMessage.getPushScreen()) {
baseGameMessageService.sendGameMessage(gameMsgMessage.getGameId(), gameMsgMessage.getRoomUid(), gameMsgMessage.getUid(), Math.abs(gameMsgMessage.getCoin()),
gameMsgMessage.getResourceCodeEnum(), gameMsgMessage.getConfigId());
}
applicationContext.publishEvent(new MiniGameChangeCurrencyEvent(gameMsgMessage));
}
}