diff --git a/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/enums/task/RoomDailyTaskType.java b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/enums/task/RoomDailyTaskType.java new file mode 100644 index 00000000..33e9e5a2 --- /dev/null +++ b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/enums/task/RoomDailyTaskType.java @@ -0,0 +1,61 @@ +package com.red.circle.other.inner.enums.task; + +/** + * 每日任务类型. + * + * @author tf + */ +public enum RoomDailyTaskType { + + // ==================== Personal Tasks ==================== + + /** 进入他人房间活跃 */ + ACTIVE_IN_ROOM, + + /** 进入他人房间上麦 */ + MIC_IN_ROOM, + + /** 给用户送礼 */ + SEND_GIFT, + + /** 送幸运礼物赢得金币数 */ + LUCKY_GIFT_GOLD, + + /** 送魔法礼物赢得金币数 */ + MAGIC_GIFT_GOLD, + + /** 游戏消费 */ + GAME_CONSUME, + + // ==================== Room Owner Tasks ==================== + + /** 房间新增成员数 */ + NEW_MEMBER, + + /** 房主发红包 */ + OWNER_RED_PACKET, + + /** 房主给用户送礼物 */ + OWNER_SEND_GIFT, + + /** 房主累计送礼金币数 */ + OWNER_GIFT_GOLD, + + /** 房间用户累计送礼金币数 */ + ROOM_GIFT_GOLD, + + /** 累计在麦位的用户数(按时长区分档位) */ + MIC_USER_DURATION, + + /** 房间内同时在线用户数 */ + ONLINE_USER_COUNT, + + /** 房主成功邀请用户上麦 */ + OWNER_INVITE_MIC, + + /** 房主在房间上麦 */ + OWNER_MIC_TIME, + + ; + +} diff --git a/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/game/party3rd/GameHkysRestController.java b/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/game/party3rd/GameHkysRestController.java index a15895bf..811849cb 100644 --- a/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/game/party3rd/GameHkysRestController.java +++ b/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/game/party3rd/GameHkysRestController.java @@ -28,11 +28,13 @@ import com.red.circle.other.app.convertor.user.UserProfileAppConvertor; import com.red.circle.other.app.dto.cmd.activity.RankingDataUpdateCmd; import com.red.circle.other.app.dto.cmd.game.GameLxwlUpdateBalanceCmd; import com.red.circle.other.app.dto.cmd.game.GameLxwlUserInfoCmd; +import com.red.circle.other.app.dto.cmd.task.RoomDailyTaskProgressUpdateCmd; import com.red.circle.other.app.enums.violation.GameOriginEnum; import com.red.circle.other.app.enums.violation.ViolationTypeEnum; import com.red.circle.other.app.service.activity.ActivityRechargeTicketService; import com.red.circle.other.app.service.activity.RankingActivityService; import com.red.circle.other.app.service.game.GameActivityService; +import com.red.circle.other.app.service.task.RoomDailyTaskProgressService; import com.red.circle.other.app.util.DateTimeAsiaRiyadhUtils; import com.red.circle.other.app.util.OfficialNoticeUtils; import com.red.circle.other.domain.game.GameRankingIncrementCmd; @@ -46,6 +48,7 @@ import com.red.circle.other.infra.database.cache.service.other.GameListCacheServ import com.red.circle.other.infra.database.rds.entity.sys.GameListConfig; import com.red.circle.other.infra.database.rds.service.sys.GameListConfigService; import com.red.circle.other.inner.enums.config.EnumConfigKey; +import com.red.circle.other.inner.enums.task.RoomDailyTaskType; import com.red.circle.other.inner.enums.team.TeamPolicyTypeEnum; import com.red.circle.other.inner.model.dto.user.UserProfileDTO; import com.red.circle.tool.core.date.LocalDateTimeUtils; @@ -94,6 +97,7 @@ public class GameHkysRestController { private final GameActivityService gameActivityService; private final RedisService redisService; private final ActivityRechargeTicketService activityRechargeTicketService; + private final RoomDailyTaskProgressService roomDailyTaskProgressService; @IgnoreResultResponse @PostMapping("/getUserInfo") @@ -198,6 +202,15 @@ public class GameHkysRestController { // 累加用户获得的金币并发送抽奖券 activityRechargeTicketService.accumulatedRechargeAndAddTicket(userId, Math.abs(cmd.getCoin()), MonthlyRechargeType.UNDEFINED); + } else { + + RoomDailyTaskType taskType = RoomDailyTaskType.GAME_CONSUME; + roomDailyTaskProgressService.updateTaskProgress( + new RoomDailyTaskProgressUpdateCmd() + .setUserId(userId) + .setTaskCode(taskType.name()) + .setProgressValue(param.getCoin().intValue()) + ); } diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/common/gift/GameLuckyGiftCommon.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/common/gift/GameLuckyGiftCommon.java index 940fff2a..a2ac1a7a 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/common/gift/GameLuckyGiftCommon.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/common/gift/GameLuckyGiftCommon.java @@ -31,8 +31,10 @@ 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; import com.red.circle.other.app.dto.cmd.gift.GiveAwayGiftBatchCmd; +import com.red.circle.other.app.dto.cmd.task.RoomDailyTaskProgressUpdateCmd; import com.red.circle.other.app.service.activity.ActivityRechargeTicketService; import com.red.circle.other.app.service.activity.RankingActivityService; +import com.red.circle.other.app.service.task.RoomDailyTaskProgressService; import com.red.circle.other.domain.gateway.user.UserProfileGateway; import com.red.circle.other.domain.ranking.RankingActivityType; import com.red.circle.other.domain.ranking.RankingCycleType; @@ -59,6 +61,7 @@ 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.enums.task.RoomDailyTaskType; import com.red.circle.other.inner.model.dto.material.GiftConfigDTO; import com.red.circle.other.inner.model.dto.user.UserProfileDTO; import com.red.circle.other.inner.model.dto.user.props.UserPropsResourcesDTO; @@ -114,6 +117,7 @@ public class GameLuckyGiftCommon { private final GiftMqMessage giftMqMessage; private final GiftAppConvertor giftAppConvertor; private final ActivityRechargeTicketService activityRechargeTicketService; + private final RoomDailyTaskProgressService roomDailyTaskProgressService; /** * 发送幸运礼物抽奖mq. @@ -257,10 +261,25 @@ public class GameLuckyGiftCommon { GiveAwayGiftBatchEvent giftBatchEvent = buildGiftBatchEvent(cmd, timeId, param, giftConfigDTO); giftMqMessage.sendGift(timeId, giftBatchEvent); + + updateRoomDailyTask(param, rewardAmount, RoomDailyTaskType.MAGIC_GIFT_GOLD); + } else { + updateRoomDailyTask(param, rewardAmount, RoomDailyTaskType.LUCKY_GIFT_GOLD); } // 累加用户获得的金币并发送抽奖券 activityRechargeTicketService.accumulatedRechargeAndAddTicket(param.getUserId(), rewardAmount, MonthlyRechargeType.LUCKY_WIN); + + + } + + private void updateRoomDailyTask(GameLuckyGiftParam param, Long rewardAmount, RoomDailyTaskType taskType) { + roomDailyTaskProgressService.updateTaskProgress( + new RoomDailyTaskProgressUpdateCmd() + .setUserId(param.getUserId()) + .setTaskCode(taskType.name()) + .setProgressValue(rewardAmount.intValue()) + ); } @NotNull diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/listener/gift/strategy/GiftCountStrategy.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/listener/gift/strategy/GiftCountStrategy.java index 138bde1f..6d05757f 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/listener/gift/strategy/GiftCountStrategy.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/listener/gift/strategy/GiftCountStrategy.java @@ -19,7 +19,9 @@ import com.red.circle.other.app.dto.clientobject.dynamic.MessageItemCO; import com.red.circle.other.app.dto.clientobject.game.GameRoomPkUserCO; import com.red.circle.other.app.dto.cmd.SpinsTaskProgressUpdateCmd; import com.red.circle.other.app.dto.cmd.dynamic.DynamicLikeCmd; +import com.red.circle.other.app.dto.cmd.task.RoomDailyTaskProgressUpdateCmd; import com.red.circle.other.app.service.SpinsUserTaskProgressService; +import com.red.circle.other.app.service.task.RoomDailyTaskProgressService; import com.red.circle.other.app.util.DateTimeAsiaRiyadhUtils; import com.red.circle.other.domain.gateway.user.UserProfileGateway; import com.red.circle.other.domain.gateway.user.ability.UserRegionGateway; @@ -75,6 +77,7 @@ import com.red.circle.other.inner.enums.material.BadgeKeyEnum; import com.red.circle.other.inner.enums.material.GiftCurrencyType; import com.red.circle.other.inner.enums.material.GiftSpecialEnum; import com.red.circle.other.inner.enums.material.GiftTabEnum; +import com.red.circle.other.inner.enums.task.RoomDailyTaskType; import com.red.circle.other.inner.model.dto.material.GiftConfigDTO; import com.red.circle.tool.core.collection.CollectionUtils; import com.red.circle.tool.core.collection.MapBuilder; @@ -139,6 +142,7 @@ public class GiftCountStrategy implements GiftStrategy { private final OfficialNoticeClient officialService; private final TaskMqMessage taskMqMessage; private final SpinsUserTaskProgressService spinsUserTaskProgressService; + private final RoomDailyTaskProgressService roomDailyTaskProgressService; private final RedisService redisService; private final DynamicContentService dynamicContentService; private final DynamicGiftService dynamicGiftService; @@ -207,6 +211,9 @@ public class GiftCountStrategy implements GiftStrategy { // Spins 送礼物任务 handleSpinsGiftTask(runningWater); + // roomDailyTask + handleSendGiftTask(runningWater.getUserId(), runningWater.getAcceptUsers().stream().map(GiftAcceptUser::getAcceptUserId).toList()); + // giftGiveRunningWaterService.addLog(runningWater.getId(), "结束:礼物统计相关"); } @@ -709,6 +716,28 @@ public class GiftCountStrategy implements GiftStrategy { } } + private void handleSendGiftTask(Long userId, List acceptUserIds) { + RoomDailyTaskType taskType = RoomDailyTaskType.SEND_GIFT; + String redisKey = "room:daily:task:send_gift:users:" + userId + ":" + + ZonedDateTimeAsiaRiyadhUtils.now().toLocalDate(); + + // 将本次接收用户加入 set,返回新增数量(已存在的不计入) + long expireSeconds = DateTimeAsiaRiyadhUtils.getSecondsUntilMidnight(); + for (Long acceptUserId : acceptUserIds) { + redisService.setAdd(redisKey, acceptUserId, expireSeconds, TimeUnit.SECONDS); + } + + // 获取去重后的总人数 + int uniqueCount = (int) redisService.setSize(redisKey); + + roomDailyTaskProgressService.updateTaskProgress( + new RoomDailyTaskProgressUpdateCmd() + .setUserId(userId) + .setTaskCode(taskType.name()) + .setProgressValue(uniqueCount) + ); + } + /** * 增加用户每日送礼物数量 * @param userId 用户ID diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/game/GameBaishunServiceImpl.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/game/GameBaishunServiceImpl.java index 78bc8937..e148a3c3 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/game/GameBaishunServiceImpl.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/game/GameBaishunServiceImpl.java @@ -28,11 +28,13 @@ import com.red.circle.order.inner.model.enums.MonthlyRechargeType; import com.red.circle.other.app.convertor.user.UserProfileAppConvertor; import com.red.circle.other.app.dto.cmd.SpinsTaskProgressUpdateCmd; import com.red.circle.other.app.dto.cmd.activity.RankingDataUpdateCmd; +import com.red.circle.other.app.dto.cmd.task.RoomDailyTaskProgressUpdateCmd; import com.red.circle.other.app.enums.violation.GameOriginEnum; import com.red.circle.other.app.service.SpinsUserTaskProgressService; import com.red.circle.other.app.service.activity.ActivityRechargeService; import com.red.circle.other.app.service.activity.ActivityRechargeTicketService; import com.red.circle.other.app.service.activity.RankingActivityService; +import com.red.circle.other.app.service.task.RoomDailyTaskProgressService; import com.red.circle.other.app.service.task.TaskService; import com.red.circle.other.app.util.DateTimeAsiaRiyadhUtils; import com.red.circle.other.app.util.OfficialNoticeUtils; @@ -47,6 +49,7 @@ import com.red.circle.other.infra.database.cache.service.other.GameListCacheServ import com.red.circle.other.infra.database.rds.entity.sys.GameListConfig; import com.red.circle.other.infra.database.rds.service.sys.GameListConfigService; import com.red.circle.other.inner.enums.config.EnumConfigKey; +import com.red.circle.other.inner.enums.task.RoomDailyTaskType; import com.red.circle.other.inner.model.dto.user.UserProfileDTO; import com.red.circle.tool.core.date.DateUtils; import com.red.circle.tool.core.date.LocalDateTimeUtils; @@ -93,6 +96,7 @@ public class GameBaishunServiceImpl implements GameBaishunService { private final TaskService taskService; private final GameActivityService gameActivityService; private final ActivityRechargeTicketService activityRechargeTicketService; + private final RoomDailyTaskProgressService roomDailyTaskProgressService; @Value("${red-circle.game-rank.gameid}") private String gameId; @@ -228,6 +232,14 @@ public class GameBaishunServiceImpl implements GameBaishunService { // 累加用户获得的金币并发送抽奖券 activityRechargeTicketService.accumulatedRechargeAndAddTicket(userId, request.getCurrencyDiff(), MonthlyRechargeType.UNDEFINED); + } else { + RoomDailyTaskType taskType = RoomDailyTaskType.GAME_CONSUME; + roomDailyTaskProgressService.updateTaskProgress( + new RoomDailyTaskProgressUpdateCmd() + .setUserId(userId) + .setTaskCode(taskType.name()) + .setProgressValue(Math.abs(request.getCurrencyDiff().intValue())) + ); } } diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/game/HotGameServiceImpl.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/game/HotGameServiceImpl.java index f07eaecf..ca522a05 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/game/HotGameServiceImpl.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/game/HotGameServiceImpl.java @@ -24,12 +24,14 @@ import com.red.circle.other.app.convertor.user.UserProfileAppConvertor; import com.red.circle.other.app.dto.clientobject.game.HotGameUpdateRequest; import com.red.circle.other.app.dto.cmd.activity.RankingDataUpdateCmd; import com.red.circle.other.app.dto.cmd.game.GameLxwlUpdateBalanceCmd; +import com.red.circle.other.app.dto.cmd.task.RoomDailyTaskProgressUpdateCmd; import com.red.circle.other.app.enums.violation.GameOriginEnum; import com.red.circle.other.app.service.activity.ActivityRechargeTicketService; import com.red.circle.other.app.service.activity.RankingActivityService; import com.red.circle.other.app.service.game.GameActivityService; import com.red.circle.other.app.service.game.override.domain.HotGameUserProfile; import com.red.circle.other.app.service.game.override.service.HotGameService; +import com.red.circle.other.app.service.task.RoomDailyTaskProgressService; import com.red.circle.other.app.util.DateTimeAsiaRiyadhUtils; import com.red.circle.other.app.util.OfficialNoticeUtils; import com.red.circle.other.domain.game.GameRankingIncrementCmd; @@ -47,6 +49,7 @@ import com.red.circle.other.infra.database.rds.service.game.GameVipLevelWeeklySe import com.red.circle.other.infra.database.rds.service.sys.GameListConfigService; import com.red.circle.other.inner.enums.config.EnumConfigKey; import com.red.circle.other.inner.enums.game.VipLevelRule; +import com.red.circle.other.inner.enums.task.RoomDailyTaskType; import com.red.circle.other.inner.model.dto.user.UserProfileDTO; import com.red.circle.tool.core.date.LocalDateTimeUtils; import com.red.circle.tool.core.date.ZonedDateTimeAsiaRiyadhUtils; @@ -99,6 +102,7 @@ public class HotGameServiceImpl implements HotGameService { private final UserActivityRechargeService userActivityRechargeService; private final GameVipLevelWeeklyService gameVipLevelWeeklyService; private final ActivityRechargeTicketService activityRechargeTicketService; + private final RoomDailyTaskProgressService roomDailyTaskProgressService; @Value("${red-circle.game-rank.gameid}") private String gameId; @@ -335,6 +339,17 @@ public class HotGameServiceImpl implements HotGameService { activityRechargeTicketService.accumulatedRechargeAndAddTicket(userId, Math.abs(param.getCoin()), MonthlyRechargeType.UNDEFINED); } + // 处理游戏消费人任务 + else { + RoomDailyTaskType taskType = RoomDailyTaskType.GAME_CONSUME; + roomDailyTaskProgressService.updateTaskProgress( + new RoomDailyTaskProgressUpdateCmd() + .setUserId(userId) + .setTaskCode(taskType.name()) + .setProgressValue(param.getCoin().intValue()) + ); + } + return new HotGameResponse() .setData(new HotGameCoin() .setBalanceCoin(res.getBalance().getDollarAmount().longValue()) diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/game/YomiGameServiceImpl.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/game/YomiGameServiceImpl.java index c49d309e..63591545 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/game/YomiGameServiceImpl.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/game/YomiGameServiceImpl.java @@ -12,10 +12,12 @@ import com.red.circle.order.inner.model.enums.MonthlyRechargeType; import com.red.circle.other.app.convertor.user.UserProfileAppConvertor; import com.red.circle.other.app.dto.cmd.activity.RankingDataUpdateCmd; import com.red.circle.other.app.dto.cmd.party3rd.*; +import com.red.circle.other.app.dto.cmd.task.RoomDailyTaskProgressUpdateCmd; import com.red.circle.other.app.enums.violation.GameOriginEnum; import com.red.circle.other.app.service.activity.ActivityRechargeTicketService; import com.red.circle.other.app.service.activity.RankingActivityService; import com.red.circle.other.app.service.game.override.service.YomiGameService; +import com.red.circle.other.app.service.task.RoomDailyTaskProgressService; import com.red.circle.other.app.util.OfficialNoticeUtils; import com.red.circle.other.domain.game.GameRankingIncrementCmd; import com.red.circle.other.domain.gateway.game.GameRankingGateway; @@ -29,6 +31,7 @@ import com.red.circle.other.infra.database.cache.service.other.EnumConfigCacheSe import com.red.circle.other.infra.database.rds.entity.sys.GameListConfig; import com.red.circle.other.infra.database.rds.service.sys.GameListConfigService; import com.red.circle.other.inner.enums.config.EnumConfigKey; +import com.red.circle.other.inner.enums.task.RoomDailyTaskType; import com.red.circle.other.inner.model.dto.user.UserProfileDTO; import com.red.circle.tool.core.date.ZonedDateTimeAsiaRiyadhUtils; import com.red.circle.tool.core.num.ArithmeticUtils; @@ -70,6 +73,7 @@ public class YomiGameServiceImpl implements YomiGameService { private final GameActivityService gameActivityService; private final GameRankingGateway gameRankingGateway; private final ActivityRechargeTicketService activityRechargeTicketService; + private final RoomDailyTaskProgressService roomDailyTaskProgressService; @Override public YomiTokenCO getToken(YomiGetTokenCmd cmd) { @@ -180,6 +184,14 @@ public class YomiGameServiceImpl implements YomiGameService { // 累加用户获得的金币并发送抽奖券 activityRechargeTicketService.accumulatedRechargeAndAddTicket(userId, Math.abs(changeValue.longValue()), MonthlyRechargeType.UNDEFINED); + } else { + RoomDailyTaskType taskType = RoomDailyTaskType.GAME_CONSUME; + roomDailyTaskProgressService.updateTaskProgress( + new RoomDailyTaskProgressUpdateCmd() + .setUserId(userId) + .setTaskCode(taskType.name()) + .setProgressValue(cmd.getChangeValue()) + ); } return new YomiBalanceCO(currentBalance);