小游戏推送MQ
This commit is contained in:
@@ -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;
|
||||
|
||||
}
|
@@ -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){
|
||||
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){
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -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();
|
||||
|
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@@ -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";
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@@ -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));
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user