From f91bd9fdf459a38ba3fe759284186747369a1e7e Mon Sep 17 00:00:00 2001 From: khalil <842328916@qq.com> Date: Tue, 23 Sep 2025 17:10:35 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=81=E7=A4=BC=E8=AE=B0=E5=BD=95-=E9=9B=AA?= =?UTF-8?q?=E8=8A=B1=E4=B8=BB=E9=94=AE-=E6=97=A0=E9=94=81=E5=8C=96?= =?UTF-8?q?=E5=94=AF=E4=B8=80=E4=B8=BB=E9=94=AE=E6=8F=92=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sharding/model/GiftSendRecord.java | 2 +- .../sharding/mapper/GiftSendRecordMapper.java | 5 +- .../sqlmappers/GiftSendRecordMapper.xml | 42 +++++- .../business/message/GiftMessage.java | 1 + .../service/gift/GiftMessageService.java | 126 +++++++++++++++++- .../service/gift/GiftSendRecordService.java | 5 +- .../service/gift/GiftSendService.java | 4 + .../business/service/mq/RocketMQService.java | 2 +- .../com/accompany/mq/constant/MqConstant.java | 3 + .../mq/consumer/GiftMessageV2Consumer.java | 29 ++++ 10 files changed, 206 insertions(+), 13 deletions(-) create mode 100644 accompany-mq/accompany-mq-web/src/main/java/com/accompany/mq/consumer/GiftMessageV2Consumer.java diff --git a/accompany-base/accompany-sharding/accompany-sharding-sdk/src/main/java/com/accompany/sharding/model/GiftSendRecord.java b/accompany-base/accompany-sharding/accompany-sharding-sdk/src/main/java/com/accompany/sharding/model/GiftSendRecord.java index ec00fb85a..701a56a32 100644 --- a/accompany-base/accompany-sharding/accompany-sharding-sdk/src/main/java/com/accompany/sharding/model/GiftSendRecord.java +++ b/accompany-base/accompany-sharding/accompany-sharding-sdk/src/main/java/com/accompany/sharding/model/GiftSendRecord.java @@ -8,7 +8,7 @@ import java.util.Date; @Data public class GiftSendRecord { - @TableId(type = IdType.AUTO) + @TableId(type = IdType.INPUT) private Long sendRecordId; private Long uid; diff --git a/accompany-base/accompany-sharding/accompany-sharding-service/src/main/java/com/accompany/sharding/mapper/GiftSendRecordMapper.java b/accompany-base/accompany-sharding/accompany-sharding-service/src/main/java/com/accompany/sharding/mapper/GiftSendRecordMapper.java index 1cdb52d2e..d33cf2a44 100644 --- a/accompany-base/accompany-sharding/accompany-sharding-service/src/main/java/com/accompany/sharding/mapper/GiftSendRecordMapper.java +++ b/accompany-base/accompany-sharding/accompany-sharding-service/src/main/java/com/accompany/sharding/mapper/GiftSendRecordMapper.java @@ -2,7 +2,8 @@ package com.accompany.sharding.mapper; import com.accompany.sharding.model.GiftSendRecord; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; public interface GiftSendRecordMapper extends BaseMapper { - -} + int insertIgnore(@Param("record") GiftSendRecord record); +} \ No newline at end of file diff --git a/accompany-base/accompany-sharding/accompany-sharding-service/src/main/resources/sharding/sqlmappers/GiftSendRecordMapper.xml b/accompany-base/accompany-sharding/accompany-sharding-service/src/main/resources/sharding/sqlmappers/GiftSendRecordMapper.xml index 242215528..b0af50d14 100644 --- a/accompany-base/accompany-sharding/accompany-sharding-service/src/main/resources/sharding/sqlmappers/GiftSendRecordMapper.xml +++ b/accompany-base/accompany-sharding/accompany-sharding-service/src/main/resources/sharding/sqlmappers/GiftSendRecordMapper.xml @@ -1,5 +1,43 @@ - - + + INSERT IGNORE INTO gift_send_record ( + send_record_id, + uid, + partition_id, + recive_uid, + recive_type, + send_env, + room_uid, + room_type, + gift_id, + gift_num, + gift_type, + play_effect, + total_gold_num, + total_diamond_num, + create_time, + gift_source, + mess_id + ) VALUES ( + #{record.sendRecordId}, + #{record.uid}, + #{record.partitionId}, + #{record.reciveUid}, + #{record.reciveType}, + #{record.sendEnv}, + #{record.roomUid}, + #{record.roomType}, + #{record.giftId}, + #{record.giftNum}, + #{record.giftType}, + #{record.playEffect}, + #{record.totalGoldNum}, + #{record.totalDiamondNum}, + #{record.createTime}, + #{record.giftSource}, + #{record.messId} + ) + + \ No newline at end of file diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/message/GiftMessage.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/message/GiftMessage.java index 4e52ccbf1..b8c3ef924 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/message/GiftMessage.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/message/GiftMessage.java @@ -9,6 +9,7 @@ import lombok.Data; */ @Data public class GiftMessage extends BaseMqMessage { + private Long id; private String messId; // 消息唯一标识 private Long messTime; // 消息创建时间 private Long sendUid; // 发送者UID diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/gift/GiftMessageService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/gift/GiftMessageService.java index a24309e57..49992fc6e 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/gift/GiftMessageService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/gift/GiftMessageService.java @@ -1,14 +1,12 @@ package com.accompany.business.service.gift; import com.accompany.business.event.ActivityOfDayConsumeEvent; -import com.accompany.business.event.AnchorFansSendGiftEvent; import com.accompany.business.event.GiftMessageEvent; import com.accompany.business.event.RoomPKEvent; import com.accompany.business.message.ActivityOfDayConsumeMessage; import com.accompany.business.message.GiftMessage; import com.accompany.business.model.Gift; import com.accompany.business.model.vip.VipAuthItem; -import com.accompany.business.service.activity.h5.ActivityUserLevelExpService; import com.accompany.business.service.record.BillRecordService; import com.accompany.business.service.vip.VipAuthItemService; import com.accompany.business.util.VipUtil; @@ -20,6 +18,7 @@ import com.accompany.core.service.base.BaseService; import com.accompany.core.vo.vip.VipBaseInfoVO; import com.accompany.sharding.model.GiftSendRecord; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; @@ -45,9 +44,9 @@ public class GiftMessageService extends BaseService { @Autowired private GiftEarnAllotService giftEarnAllotService; @Autowired - private ActivityUserLevelExpService activityUserLevelExpService; - @Autowired private GiftRateService giftRateService; + @Autowired + private IdentifierGenerator identifierGenerator; public void handleGiftMessage(GiftMessage giftMessage) { // 防止消息被重复消费 @@ -132,7 +131,92 @@ public class GiftMessageService extends BaseService { //发布事件 applicationContext.publishEvent(new GiftMessageEvent(giftMessage)); applicationContext.publishEvent(new RoomPKEvent(giftMessage)); - applicationContext.publishEvent(new AnchorFansSendGiftEvent(giftSendRecord)); + // applicationContext.publishEvent(new AnchorFansSendGiftEvent(giftSendRecord)); + + // 删除该标识,表示消息已经消费过 + jedisService.hdel(RedisKey.mq_gift_status.getKey(), giftMessage.getMessId()); + } + + public void handleGiftMessageV2(GiftMessage giftMessage) { + + logger.info("【处理礼物mq】 giftMessage: {}", giftMessage); + + long totalGoldNum = giftMessage.getGoldNum(); + byte giftType = giftMessage.getGiftType(); + giftMessage.setRealGoldNum(totalGoldNum); + if (Constant.GiftType.SUPER_LUCKY == giftType + || Constant.GiftType.LUCKY_24 == giftType + || Constant.GiftType.BRAVO_GIFT == giftType + || Constant.GiftType.LUCKY_25 == giftType){ + giftMessage.setGoldNum(0L); + } + + //只用来insert,下面还会算一次普通礼物的钻石流水,这里的流水不给事件消费,因为幸运礼物是单独走的消费 + Double diamondFlow = giftRateService.calDiamondFlow(giftMessage.getPartitionId(), giftMessage.getRoomUid(), giftType, giftMessage.getRealGoldNum()); + + GiftSendRecord giftSendRecord = buildGiftSendRecord(giftMessage, diamondFlow); + + // 先插入giftSendRecord + int row = giftSendRecordService.insertRecordIgnore(giftSendRecord); + if (row <= 0){ + return; + } + + logger.info("【处理礼物mq】 giftMessageId {} 插入gift_send_record {}", giftMessage.getMessId(), JSON.toJSONString(giftSendRecord)); + + String objId = giftSendRecord.getSendRecordId().toString(); + double amount = giftMessage.getRealGoldNum().doubleValue(); + BillObjTypeEnum inEnum = BillObjTypeEnum.GIFT_PERSON_INCOME; + BillObjTypeEnum outEnum = BillObjTypeEnum.GIFT_PERSON_PAY; + if (giftMessage.getRoomUid() != null && giftMessage.getRoomUid() > 0) { + inEnum = BillObjTypeEnum.GIFT_ROOM_INCOME; + outEnum = BillObjTypeEnum.GIFT_ROOM_PAY; + } + if (giftMessage.getGiftType() == GiftTypeEnum.LUCKY_24.getType()){ + outEnum = BillObjTypeEnum.LUCKY_24_GIFT_PAY; + } else if (giftMessage.getGiftType() == GiftTypeEnum.BRAVO.getType()) { + outEnum = BillObjTypeEnum.BRAVO_GIFT_PAY; + } else if (giftMessage.getGiftType() == GiftTypeEnum.LUCKY_25.getType()) { + outEnum = BillObjTypeEnum.LUCKY_25_GIFT_PAY; + } + + Date giftSendTime = new Date(giftMessage.getMessTime()); + + // 背包送礼不算钱 + if (null != giftMessage.getGiftSource() && Constant.GiftSource.BACKPACK == giftMessage.getGiftSource()) { + amount = 0D; + if (null != giftMessage.getAfterPurse()){ + giftMessage.getAfterPurse().setUpdateTime(giftSendTime); + } + } + + // 插入账单记录表(发送礼物用户) + billRecordService.insertGiftSendBillRecord(giftMessage.getSendUid(), giftMessage.getRecvUid(), + giftMessage.getRoomUid(), objId, outEnum, amount, + giftMessage.getGiftId(), giftMessage.getGiftNum(), totalGoldNum, giftSendTime, + giftMessage.getAfterPurse()); + + Double diamondNum = 0D;//钻石流水 + //处理逻辑 + if (Constant.GiftType.SUPER_LUCKY != giftType + && Constant.GiftType.LUCKY_24 != giftType + && Constant.GiftType.BRAVO_GIFT != giftType + && Constant.GiftType.LUCKY_25 != giftType) { + //按配置比例分配主播、 会长、房主收益 + diamondNum = giftEarnAllotService.allotGiftEarn(giftSendRecord, objId, inEnum); + //增加送礼用户和收礼用户的财富或魅力经验 + addUserExperience(giftMessage); + + applicationContext.publishEvent(new ActivityOfDayConsumeEvent(ActivityOfDayConsumeMessage.builder() + .sendUid(giftMessage.getSendUid()) + .messTime(new Date(giftMessage.getMessTime())) + .totalDiamondNum(giftMessage.getGoldNum().doubleValue()).consumeType("Normal Gift").build())); + } + giftMessage.setDiamondNum(diamondNum); + //发布事件 + applicationContext.publishEvent(new GiftMessageEvent(giftMessage)); + applicationContext.publishEvent(new RoomPKEvent(giftMessage)); + // applicationContext.publishEvent(new AnchorFansSendGiftEvent(giftSendRecord)); // 删除该标识,表示消息已经消费过 jedisService.hdel(RedisKey.mq_gift_status.getKey(), giftMessage.getMessId()); @@ -200,6 +284,35 @@ public class GiftMessageService extends BaseService { return new BigDecimal(goldNum).multiply(BigDecimal.valueOf(1 + Double.parseDouble(levelBuff.getItemValue()))).setScale(0, BigDecimal.ROUND_DOWN).longValue(); } + /** + * 组装礼物赠送记录对象 + * + * @param giftMessage 礼物消息 + * @param diamondFlow 钻石流水 + * @return GiftSendRecord对象 + */ + private GiftSendRecord buildGiftSendRecord(GiftMessage giftMessage, Double diamondFlow) { + // 插入送礼物记录 + final GiftSendRecord giftSendRecord = new GiftSendRecord(); + giftSendRecord.setSendRecordId(null != giftMessage.getId()? giftMessage.getId(): identifierGenerator.nextId(null).longValue()); + giftSendRecord.setGiftId(giftMessage.getGiftId()); + giftSendRecord.setReciveUid(giftMessage.getRecvUid()); + giftSendRecord.setRoomUid(giftMessage.getRoomUid()); + giftSendRecord.setRoomType(giftMessage.getRoomType()); + giftSendRecord.setGiftNum(giftMessage.getGiftNum()); + giftSendRecord.setSendEnv(giftMessage.getSendType()); + giftSendRecord.setUid(giftMessage.getSendUid()); + giftSendRecord.setPartitionId(giftMessage.getPartitionId()); + giftSendRecord.setTotalGoldNum(giftMessage.getGoldNum()); + giftSendRecord.setTotalDiamondNum(diamondFlow); + giftSendRecord.setGiftType(giftMessage.getGiftType()); + giftSendRecord.setCreateTime(new Date(giftMessage.getMessTime())); + giftSendRecord.setGiftSource(giftMessage.getGiftSource().byteValue()); + giftSendRecord.setMessId(giftMessage.getMessId()); + + return giftSendRecord; + } + /** * 插入礼物赠送记录 * @@ -208,6 +321,7 @@ public class GiftMessageService extends BaseService { private GiftSendRecord insertGiftSendRecord(GiftMessage giftMessage, Double diamondFlow) { // 插入送礼物记录 final GiftSendRecord giftSendRecord = new GiftSendRecord(); + giftSendRecord.setSendRecordId(null != giftMessage.getId()? giftMessage.getId(): identifierGenerator.nextId(null).longValue()); giftSendRecord.setGiftId(giftMessage.getGiftId()); giftSendRecord.setReciveUid(giftMessage.getRecvUid()); giftSendRecord.setRoomUid(giftMessage.getRoomUid()); @@ -226,7 +340,7 @@ public class GiftMessageService extends BaseService { giftSendRecordService.insertGiftSendRecord(giftSendRecord); logger.info("[处理礼物mq] insert giftSendRecored finish, sendUid:{}, partitionId:{}, recvUid:{}, goldNum:{}, messId:{}" + - ", giftRecordId:{}", giftMessage.getSendUid(), giftMessage.getPartitionId(), giftMessage.getRecvUid(), + ", giftRecordId:{}", giftMessage.getSendUid(), giftMessage.getPartitionId(), giftMessage.getRecvUid(), giftMessage.getGoldNum(), giftMessage.getMessId(), giftSendRecord.getSendRecordId()); return giftSendRecord; diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/gift/GiftSendRecordService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/gift/GiftSendRecordService.java index 2e347d4ad..268d1ef54 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/gift/GiftSendRecordService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/gift/GiftSendRecordService.java @@ -1,6 +1,5 @@ package com.accompany.business.service.gift; -import com.accompany.business.model.userevent.UserEventData; import com.accompany.common.constant.Constant; import com.accompany.common.result.BusiResult; import com.accompany.common.status.BusiStatus; @@ -36,6 +35,10 @@ public class GiftSendRecordService extends ServiceImpl> messageList = giftMessages.stream() .map(giftMessage -> MessageBuilder.withPayload(JSON.toJSONString(giftMessage)).build()) .collect(Collectors.toList()); - mqMessageProducer.send(MqConstant.GIFT_TOPIC, messageList, + mqMessageProducer.send(MqConstant.GIFT_TOPIC_V2, messageList, sendResult -> log.info("sendGiftMessage success result: {} message: {}", JSON.toJSONString(sendResult), messageList), throwable -> log.error("sendGiftMessage fail message: {}", messageList, 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 0ffc9f161..64bc6adb8 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 @@ -5,6 +5,9 @@ public interface MqConstant { String GIFT_TOPIC = "gift_topic"; String GIFT_CONSUME_GROUP = "gift_consume_group"; + String GIFT_TOPIC_V2 = "gift_topic_v2"; + String GIFT_CONSUME_V2_GROUP = "gift_consume_v2_group"; + String OPEN_BOX_TOPIC = "open_box_topic"; String OPEN_BOX_CONSUME_GROUP = "open_box_consume_group"; diff --git a/accompany-mq/accompany-mq-web/src/main/java/com/accompany/mq/consumer/GiftMessageV2Consumer.java b/accompany-mq/accompany-mq-web/src/main/java/com/accompany/mq/consumer/GiftMessageV2Consumer.java new file mode 100644 index 000000000..de1ab4df8 --- /dev/null +++ b/accompany-mq/accompany-mq-web/src/main/java/com/accompany/mq/consumer/GiftMessageV2Consumer.java @@ -0,0 +1,29 @@ +package com.accompany.mq.consumer; + +import com.accompany.business.message.GiftMessage; +import com.accompany.business.service.gift.GiftMessageService; +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.stereotype.Component; + +@Slf4j +@Component +@ConditionalOnProperty(name = "spring.application.name", havingValue = "web") +@RocketMQMessageListener(topic = MqConstant.GIFT_TOPIC_V2, consumerGroup = MqConstant.GIFT_CONSUME_V2_GROUP) +//@RocketMQMessageListener(topic = MqConstant.GIFT_TOPIC, consumerGroup = MqConstant.GIFT_CONSUME_GROUP, consumeMode = ConsumeMode.ORDERLY) +public class GiftMessageV2Consumer extends AbstractMessageListener { + + @Autowired + private GiftMessageService giftMessageService; + + @Override + public void onMessage(GiftMessage giftMessage) { + log.info("onMessage giftMessage: {}", giftMessage.toString()); + giftMessageService.handleGiftMessageV2(giftMessage); + } + +}