用户签到上下麦标识
This commit is contained in:
@@ -1461,6 +1461,9 @@ public enum RedisKey {
|
||||
joy_token,
|
||||
|
||||
|
||||
user_up_mic_time,//用户上麦时间
|
||||
user_day_mic_duration,//用户在麦时长
|
||||
|
||||
;
|
||||
|
||||
public String getKey() {
|
||||
|
@@ -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());
|
||||
}
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
|
@@ -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("-", "")));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user