From de802fb8ebee47087827126f6ddfc964a99eb0c6 Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Wed, 4 Mar 2026 14:31:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=BF=E9=97=B4=E9=87=91=E5=B8=81=E5=A4=A7?= =?UTF-8?q?=E6=94=BE=E9=80=81-=E4=B8=8A=E4=B8=8B=E9=BA=A6=E5=85=8B?= =?UTF-8?q?=E9=A3=8E=E5=BF=83=E8=B7=B3=E9=80=BB=E8=BE=91=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../team/TeamMemberHeartbeatCmdExe.java | 76 ++++++++++++++----- 1 file changed, 57 insertions(+), 19 deletions(-) diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/TeamMemberHeartbeatCmdExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/TeamMemberHeartbeatCmdExe.java index 618d75ed..110cc073 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/TeamMemberHeartbeatCmdExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/TeamMemberHeartbeatCmdExe.java @@ -6,6 +6,8 @@ import com.red.circle.framework.core.asserts.ResponseAssert; import com.red.circle.mq.business.model.event.task.TaskApprovalEvent; import com.red.circle.mq.rocket.business.producer.TaskMqMessage; import com.red.circle.other.app.dto.clientobject.team.TeamMemberWorkDailyTargetCO; +import com.red.circle.other.app.dto.cmd.task.RoomDailyTaskProgressUpdateCmd; +import com.red.circle.other.app.service.task.RoomDailyTaskProgressService; import com.red.circle.other.app.service.task.TaskService; import com.red.circle.other.infra.common.team.TeamTargetCommon; import com.red.circle.other.infra.database.mongo.entity.live.RoomProfile; @@ -22,6 +24,7 @@ import java.util.Objects; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import com.red.circle.other.inner.enums.task.RoomDailyTaskType; import com.red.circle.other.inner.enums.team.TeamMemberTargetIndex; import com.red.circle.tool.core.date.LocalDateTimeUtils; import com.red.circle.tool.core.date.ZonedDateTimeAsiaRiyadhUtils; @@ -48,31 +51,49 @@ public class TeamMemberHeartbeatCmdExe { private final TaskMqMessage taskMqMessage; private final AdministratorService administratorService; private final TaskService taskService; + private final RedisService redisService; + private final RoomDailyTaskProgressService roomDailyTaskProgressService; + + private static final int HEARTBEAT_INTERVAL_SECONDS = 60; public void execute(AppRoomIdCmd cmd) { - //心跳mic 每日任务 - taskMqMessage.sendTask(TaskApprovalEvent.builder() - .taskId(1) - .userId(cmd.requiredReqUserId()) - .day(LocalDateTimeUtils.nowFormat("yyyy-MM-dd")) - .build()); - - boolean admin = administratorService.existsAdmin(cmd.requiredReqUserId()); - if (admin) { - taskMqMessage.sendTask(TaskApprovalEvent.builder() - .taskId(12) - .userId(cmd.requiredReqUserId()) - .day(LocalDateTimeUtils.nowFormat("yyyy-MM-dd")) - .build()); - } - -// redisService.increment("team:heartbeat:"+cmd.requiredReqUserId(), 1); - if (Boolean.FALSE.equals(teamMemberService.existsMember(cmd.requiredReqUserId()))) { + if (!tryAcquireMinuteTick(cmd.requiredReqUserId())) { return; } - if (isOneselfRoom(cmd)) { + //心跳mic 每日任务 + taskMqMessage.sendTask(TaskApprovalEvent.builder() + .taskId(1) + .userId(cmd.requiredReqUserId()) + .day(LocalDateTimeUtils.nowFormat("yyyy-MM-dd")) + .build()); + + boolean admin = administratorService.existsAdmin(cmd.requiredReqUserId()); + if (admin) { + taskMqMessage.sendTask(TaskApprovalEvent.builder() + .taskId(12) + .userId(cmd.requiredReqUserId()) + .day(LocalDateTimeUtils.nowFormat("yyyy-MM-dd")) + .build()); + } + + boolean oneselfRoom = isOneselfRoom(cmd); + + // 在他人房间上麦 + if (!oneselfRoom) { + updateDailyTask(cmd, RoomDailyTaskType.MIC_IN_ROOM); + } else { + // 房主自己上麦 + updateDailyTask(cmd, RoomDailyTaskType.OWNER_MIC_TIME); + } + + + if (!teamMemberService.existsMember(cmd.requiredReqUserId())) { + return; + } + + if (oneselfRoom) { teamTargetCommon.incrementBroadcastTime(cmd.requiredReqUserId()); incrEffectiveDay(cmd); return; @@ -81,6 +102,23 @@ public class TeamMemberHeartbeatCmdExe { incrEffectiveDay(cmd); } + private void updateDailyTask(AppRoomIdCmd cmd, RoomDailyTaskType taskType) { + roomDailyTaskProgressService.updateTaskProgress( + new RoomDailyTaskProgressUpdateCmd() + .setUserId(cmd.requiredReqUserId()) + .setTaskCode(taskType.name()) + .setProgressValue(1) + ); + } + + /** + * 限流:60秒内只允许累加一次,返回 true 表示本次可以计算 + */ + private boolean tryAcquireMinuteTick(Long userId) { + String key = "team:heartbeat:tick:" + userId; + return redisService.setIfAbsent(key, "1", HEARTBEAT_INTERVAL_SECONDS, TimeUnit.SECONDS); + } + /** * 根据特定的条件判断是否达成有效天数 */