用户签到上下麦标识

This commit is contained in:
2025-05-21 19:01:31 +08:00
parent 589d23f5e3
commit 43391cdd38
5 changed files with 122 additions and 5 deletions

View File

@@ -1461,6 +1461,9 @@ public enum RedisKey {
joy_token,
user_up_mic_time,//用户上麦时间
user_day_mic_duration,//用户在麦时长
;
public String getKey() {

View File

@@ -28,6 +28,6 @@ public class MicChangeListener implements ApplicationListener<MicChangedEvent> {
public void onApplicationEvent(MicChangedEvent event) {
MicQueueParam param = (MicQueueParam) event.getSource();
log.info("MicChangeListener-event, message:{}", JSONObject.toJSONString(param));
roomMicService.micChange(param.getQEvent(), param.getRoomid(), param.getOperator());
roomMicService.micChange(param.getQEvent(), param.getRoomid(), param.getOperator(), param.getTimestamp());
}
}

View File

@@ -22,6 +22,7 @@ import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.exception.ServiceException;
import com.accompany.core.model.Users;
import org.apache.commons.collections.CollectionUtils;
import org.redisson.api.RBucket;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestHeader;

View File

@@ -1,16 +1,29 @@
package com.accompany.business.service.dailytask.handler;
import com.accompany.business.service.room.RoomMicService;
import com.accompany.business.vo.dailytask.DailyProgressContext;
import com.accompany.business.service.dailytask.AbstractDailyTaskHandler;
import com.accompany.business.vo.dailytask.DailyTaskContext;
import com.accompany.business.service.dailytask.annotation.DailyTaskHandlerType;
import com.accompany.business.constant.dailytask.DailyTaskTypeEnum;
import com.accompany.business.vo.dailytask.DailyTaskVo;
import org.redisson.api.RBucket;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.Duration;
import java.util.Calendar;
import java.util.Map;
import java.util.Optional;
@Component
@DailyTaskHandlerType(DailyTaskTypeEnum.UP_MIC)
public class UpMicHandler extends AbstractDailyTaskHandler {
@Autowired
private RoomMicService roomMicService;
@Override
public void executeProgress(DailyProgressContext progressContext) {
Long uid = progressContext.getUid();
@@ -19,7 +32,28 @@ public class UpMicHandler extends AbstractDailyTaskHandler {
@Override
public DailyTaskVo doHandle(DailyTaskContext context) {
// 实现上麦聊天任务逻辑
return null;
DailyTaskTypeEnum taskType = context.getTaskType();
Long uid = context.getUid();
String todayDate = context.getTodayDate();
RBucket<Integer> userDayUpMicDuration = roomMicService.userDayUpMicDuration(todayDate, uid);
Integer totalDuration = Optional.ofNullable(userDayUpMicDuration.get()).orElse(0);
RBucket<Long> longRBucket = roomMicService.userUpMicTime(uid);
Long upMicTime = longRBucket.get();
if (longRBucket.isExists()) {
Map<String, Integer> upMicDuration = roomMicService.calUserUpMicDuration(upMicTime, Calendar.getInstance().getTimeInMillis(), context.getPartitionId());
if (upMicDuration.isEmpty()) {
totalDuration += upMicDuration.getOrDefault(todayDate, 0);
}
}
if (totalDuration >= taskType.getReachNum()) {
taskStatus(uid, todayDate, taskType).set(1, Duration.ofDays(1));
}
return DailyTaskVo.builder()
.todayDate(todayDate)
.standardValue(taskType.getReachNum())
.taskType(taskType)
.goldBean(taskType.getReachGoldBean())
.receiveStatus(computeReceiveStatus(uid, todayDate, taskType))
.build();
}
}

View File

@@ -24,8 +24,10 @@ import com.accompany.common.netease.ErBanNetEaseService;
import com.accompany.common.redis.RedisKey;
import com.accompany.common.status.BusiStatus;
import com.accompany.common.utils.BlankUtil;
import com.accompany.common.utils.DateTimeUtil;
import com.accompany.common.utils.GsonUtil;
import com.accompany.common.utils.UUIDUtil;
import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.exception.ServiceException;
import com.accompany.core.model.Room;
import com.accompany.core.model.Users;
@@ -33,6 +35,8 @@ import com.accompany.core.service.base.BaseService;
import com.accompany.core.vo.UserVo;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.annotation.Async;
@@ -40,9 +44,14 @@ import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.time.Duration;
import java.time.ZonedDateTime;
import java.util.*;
import java.util.stream.Collectors;
import static com.accompany.common.redis.RedisKey.user_day_mic_duration;
import static com.accompany.common.redis.RedisKey.user_up_mic_time;
@Slf4j
@Service
@@ -65,6 +74,8 @@ public class RoomMicService extends BaseService {
private SendSysMsgService sendSysMsgService;
@Autowired
private UserChatBubbleService userChatBubbleService;
@Autowired
private RedissonClient redissonClient;
/**
* 上麦操作,测试时需要考虑上麦用户意外掉线时队列是否更新
@@ -354,8 +365,10 @@ public class RoomMicService extends BaseService {
}
}
public void micChange(Integer qEvent, Long roomId, Long uid) {
if (qEvent == 2) {
public void micChange(Integer qEvent, Long roomId, Long uid, Long timestamp) {
if (qEvent == 2) {//上麦
log.info("RoomMicService.upMic,upMicTime:{}", timestamp);
this.userUpMicTime(uid).set(timestamp, Duration.ofDays(1));
Room room = roomService.getRoomByRoomId(roomId);
Long roomUid = room.getUid();
String str = jedisService.hget(RedisKey.room_mic_up.getKey(), String.valueOf(roomUid));
@@ -401,6 +414,72 @@ public class RoomMicService extends BaseService {
log.info("micChange-uid:{},userInRoomScreenVo:{}", uid, JSONObject.toJSONString(userInRoomScreenVo));
sendSysMsgService.sendSingleRoomMessage(roomId, String.valueOf(roomUid), Constant.DefMsgType.ROOM_SCREEN, Constant.DefMsgType.ROOM_SCREEN_IN, userInRoomScreenVo);
} else if (5 == qEvent || 4 == qEvent) { //下麦
Long upMicTime = this.userUpMicTime(uid).get();
log.info("RoomMicService.downMic,upMicTime:{}, timestamp", upMicTime, timestamp);
if (upMicTime == null || upMicTime > timestamp) {
return;
}
this.userUpMicTime(uid).delete();
Users users = usersService.getUsersByUid(uid);
Map<String, Integer> upMicDuration = this.calUserUpMicDuration(upMicTime, timestamp, users.getPartitionId());
if (!upMicDuration.isEmpty()) {
for (String key : upMicDuration.keySet()) {
this.userDayUpMicDuration(key, uid);
}
}
}
}
public Map<String, Integer> calUserUpMicDuration(Long upMicTime, Long now, Integer partitionId) {
Map<String, Integer> result = new HashMap<>();
Date upDate = new Date(upMicTime);
Date nowDate = new Date(upMicTime);
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId);
// 转换为带时区的 ZonedDateTime
ZonedDateTime start = DateTimeUtil.convertWithZoneId(upDate, partitionEnum.getZoneId());
ZonedDateTime end = DateTimeUtil.convertWithZoneId(nowDate, partitionEnum.getZoneId());
// 如果开始时间 >= 结束时间,直接返回空 Map
if (!start.isBefore(end)) {
return result;
}
// 当前处理的时间点(初始化为开始时间)
ZonedDateTime current = start;
while (current.isBefore(end)) {
// 获取当前日期yyyy-MM-dd
String dateKey = current.format(DateTimeUtil.dateFormatter);
// 计算当前天的结束时间(当天的 23:59:59.999
ZonedDateTime endOfDay = current.withHour(23).withMinute(59).withSecond(59);
// 如果结束时间在本天内,直接计算差值并退出循环
if (end.isBefore(endOfDay)) {
long minutes = Duration.between(current, end).toMinutes();
result.put(dateKey, (int) minutes);
break;
}
// 计算从 current 到 endOfDay 的分钟数
long minutes = Duration.between(current, endOfDay).toMinutes();
result.put(dateKey, (int) minutes);
// 移动到下一天的 00:00:00
current = endOfDay.plusNanos(1);
log.info("RoomMicService.calUserUpMicDuration,dateKey:{},minutes:{}", dateKey, minutes);
}
return result;
}
public RBucket<Long> userUpMicTime(Long uid){
return redissonClient.getBucket(user_up_mic_time.getKey(uid.toString()));
}
public RBucket<Integer> userDayUpMicDuration(String todayDate, Long uid) {
return redissonClient.getBucket(user_day_mic_duration.getKey(uid.toString(), todayDate.replaceAll("-", "")));
}
}