From baf74889ae85f529b83331e5e19ec2dd439c3164 Mon Sep 17 00:00:00 2001 From: hokli <2629910752@qq.com> Date: Wed, 23 Apr 2025 16:40:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E6=B8=B8=E6=88=8F=E6=8E=A8=E9=80=81MQ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/message/GameMsgMessage.java | 29 ++++++++++++++ .../MiniGameWeekJackpotRankListener.java | 25 +++--------- .../business/service/game/GameService.java | 38 +++++++++++------- .../game/MiniGameForBaiShunServiceImpl.java | 29 ++++++++------ .../business/service/mq/RocketMQService.java | 10 +++++ .../com/accompany/mq/constant/MqConstant.java | 5 +++ .../consumer/GameMsgPushMessageConsumer.java | 40 +++++++++++++++++++ 7 files changed, 130 insertions(+), 46 deletions(-) create mode 100644 accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/message/GameMsgMessage.java create mode 100644 accompany-mq/accompany-mq-web/src/main/java/com/accompany/mq/consumer/GameMsgPushMessageConsumer.java diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/message/GameMsgMessage.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/message/GameMsgMessage.java new file mode 100644 index 000000000..34f4f18d2 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/message/GameMsgMessage.java @@ -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; + +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/event/listener/miniGame/MiniGameWeekJackpotRankListener.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/event/listener/miniGame/MiniGameWeekJackpotRankListener.java index 76c138751..18d578352 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/event/listener/miniGame/MiniGameWeekJackpotRankListener.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/event/listener/miniGame/MiniGameWeekJackpotRankListener.java @@ -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= 0){ - return; - } + GameMsgMessage gameMsgMessage = (GameMsgMessage) source; - 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()); + if (Constant.GameGoldType.ADD == gameMsgMessage.getType()){ + return; } + Double score = Math.abs(gameMsgMessage.getCoin()); + updateRank(gameMsgMessage.getUid(), score, gameMsgMessage.getCreateTime()); } private void updateRank(Long uid, Double score, Date createTime){ diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/game/GameService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/game/GameService.java index 8d53005d5..f54708835 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/game/GameService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/game/GameService.java @@ -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, - (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); - }); + afterPurse = userPurseService.addDiamond(uid, goldNum, BillObjTypeEnum.LEADERCC_GAME_IN, + (up) -> billRecordService.insertGeneralBillRecord(uid, param.getOrderId(), BillObjTypeEnum.LEADERCC_GAME_IN, goldNum, up)); + 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); } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/game/MiniGameForBaiShunServiceImpl.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/game/MiniGameForBaiShunServiceImpl.java index 3a0dcfc77..d813bc13b 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/game/MiniGameForBaiShunServiceImpl.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/game/MiniGameForBaiShunServiceImpl.java @@ -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(); diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/mq/RocketMQService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/mq/RocketMQService.java index 80127d90e..c07e45652 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/mq/RocketMQService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/mq/RocketMQService.java @@ -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)); + } + + } diff --git a/accompany-mq/accompany-mq-sdk/src/main/java/com/accompany/mq/constant/MqConstant.java b/accompany-mq/accompany-mq-sdk/src/main/java/com/accompany/mq/constant/MqConstant.java index 714b0b666..4fa9801b3 100644 --- a/accompany-mq/accompany-mq-sdk/src/main/java/com/accompany/mq/constant/MqConstant.java +++ b/accompany-mq/accompany-mq-sdk/src/main/java/com/accompany/mq/constant/MqConstant.java @@ -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"; + + + } diff --git a/accompany-mq/accompany-mq-web/src/main/java/com/accompany/mq/consumer/GameMsgPushMessageConsumer.java b/accompany-mq/accompany-mq-web/src/main/java/com/accompany/mq/consumer/GameMsgPushMessageConsumer.java new file mode 100644 index 000000000..05f556bc0 --- /dev/null +++ b/accompany-mq/accompany-mq-web/src/main/java/com/accompany/mq/consumer/GameMsgPushMessageConsumer.java @@ -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 { + + @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)); + } + +}