优化定时刷新上麦时间逻辑

This commit is contained in:
2025-09-05 17:01:39 +08:00
parent d53a574fba
commit 6aec5657e6
4 changed files with 76 additions and 41 deletions

View File

@@ -32,6 +32,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.*;
@@ -173,30 +174,56 @@ public class GuildPolicy2Service {
}
public void statMicSecond(GuildMember guildMember, Long entreTimestamp, Long timestamp) {
if(timestamp <= entreTimestamp){
public void statMicSecond(GuildMember guildMember, Long upTimestamp, Long downTimestamp) {
if(downTimestamp <= upTimestamp){
return;
}
Map<String, Integer> durationMap = roomMicService.calUserUpMicDuration(entreTimestamp, timestamp, guildMember.getPartitionId());
if (durationMap.size() <= 0) {
return;
}
for (Map.Entry<String, Integer> entry : durationMap.entrySet()) {
Integer micMinutes = entry.getValue();
String statDate = entry.getKey();
Date date = DateUtil.parseDate(statDate);
String cycleDate;
Integer partitionId = guildMember.getPartitionId();
if (PartitionEnum.getByPartitionId(partitionId).getClanMode().equals(Constant.ClanMode.GUILD)) {
cycleDate = CycleTimeUtil.getAgencyCycleBeginDateStr(date);
} else {
cycleDate = FullMonthCycleTimeUtil.getAgencyCycleBeginDateStr(date);
}
guildMicStatisticsPolicy2Service.updateDayMicStatistics(cycleDate, statDate, guildMember, micMinutes);
if (PartitionEnum.ENGLISH2.getId() == partitionId) {
guildMemberWeekLevelRewardV2Service.addDayDuration(partitionId, statDate, guildMember.getId(), micMinutes * 60);
}
int upMinutes = Instant.ofEpochMilli(upTimestamp)
.atZone(ZoneId.systemDefault())
.toLocalDateTime().getMinute();
Instant downInstant = Instant.ofEpochMilli(downTimestamp);
int downMinutes = downInstant.atZone(ZoneId.systemDefault())
.toLocalDateTime().getMinute();
int upRightScheduleMinute = upMinutes + 5 - (upMinutes%5);
int downLeftScheduleMinute = downMinutes - (downMinutes%5);
int addMinutes;
if (downLeftScheduleMinute < upRightScheduleMinute) {
addMinutes = downMinutes - upMinutes;
} else {
addMinutes = downMinutes - downLeftScheduleMinute;
}
if (addMinutes <= 0) {
return;
}
Integer partitionId = guildMember.getPartitionId();
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId);
// 转换为带时区的 ZonedDateTime
Date date = Date.from(downInstant);
ZonedDateTime nowZoneDateTime = DateTimeUtil.convertWithZoneId(date, partitionEnum.getZoneId());
String statDate = nowZoneDateTime.format(DateTimeUtil.dateFormatter);
String cycleDate;
if (PartitionEnum.getByPartitionId(partitionId).getClanMode().equals(Constant.ClanMode.GUILD)) {
cycleDate = CycleTimeUtil.getAgencyCycleBeginDateStr(date);
} else {
cycleDate = FullMonthCycleTimeUtil.getAgencyCycleBeginDateStr(date);
}
this.updateDayMicStatistics(cycleDate, statDate, guildMember, addMinutes);
}
public void updateDayMicStatistics(String cycleDate, String statDate, GuildMember guildMember, Integer micMinutes) {
Integer partitionId = guildMember.getPartitionId();
guildMicStatisticsPolicy2Service.updateDayMicStatistics(cycleDate, statDate, guildMember, micMinutes);
if (PartitionEnum.ENGLISH2.getId() == partitionId) {
guildMemberWeekLevelRewardV2Service.addDayDuration(partitionId, statDate, guildMember.getId(), micMinutes * 60);
}
}

View File

@@ -6,10 +6,13 @@ import com.accompany.business.model.guild.GuildMember;
import com.accompany.business.param.MicQueueParam;
import com.accompany.business.service.guild.GuildMemberService;
import com.accompany.business.service.guildpolicy2.GuildPolicy2Service;
import com.accompany.business.util.CycleTimeUtil;
import com.accompany.business.util.FullMonthCycleTimeUtil;
import com.accompany.business.vo.MicRecordVo;
import com.accompany.business.vo.MicUserVo;
import com.accompany.business.vo.home.PlayRoomVo;
import com.accompany.common.constant.ApplicationConstant;
import com.accompany.common.constant.Constant;
import com.accompany.common.redis.RedisKey;
import com.accompany.common.utils.DateTimeUtil;
import com.accompany.common.utils.GsonUtil;
@@ -34,6 +37,7 @@ import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.ZonedDateTime;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -169,14 +173,7 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl<GuildMemberRoom
record.setRemainTime(remainMillisecond);
save(record);
if (statMicMinutes) {
Long beginTime = entreTimestamp;
MicRecordVo micRecordVo = this.getMicRecordMap().get(uid);
if (null != micRecordVo && micRecordVo.getRoomId().equals(roomId)
&& micRecordVo.getPos().equals(pos) && micRecordVo.getStatTimeStamp() >= entreTimestamp) {
this.getMicRecordMap().remove(uid);
beginTime = micRecordVo.getStatTimeStamp() > entreTimestamp ? micRecordVo.getStatTimeStamp() : entreTimestamp;
}
guildPolicy2Service.statMicSecond(guildMember, beginTime, timestamp);
guildPolicy2Service.statMicSecond(guildMember, entreTimestamp, timestamp);
this.getMicRecordMap().remove(uid);
}
}
@@ -322,7 +319,7 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl<GuildMemberRoom
/**
* 每5分钟统计一次上麦时间
*/
public void statMicRecordTask4GuildPolicy2() {
public void statMicRecordTask4GuildPolicy2(Date date) {
RMap<Long, MicRecordVo> micRecordMap = getMicRecordMap();
if (micRecordMap.isEmpty()) {
return;
@@ -340,7 +337,7 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl<GuildMemberRoom
.map(str-> GsonUtil.getGson().fromJson(str, PlayRoomVo.class)).collect(Collectors.toMap(PlayRoomVo::getUid, v->v));
}
Long timeInMillis = Calendar.getInstance().getTimeInMillis();
Long timeInMillis = date.getTime();
for (Long uid : uids) {
MicRecordVo micRecordVo = micRecordMap.get(uid);
if (ObjectUtil.isNull(micRecordVo)) {
@@ -380,17 +377,26 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl<GuildMemberRoom
return;
}
Long maxUpTime = lastUpMic.get();
if (maxUpTime == null) {
if (maxUpTime == null || maxUpTime < timeInMillis) {
micRecordMap.remove(uid);
return;
}
if (maxUpTime < timeInMillis) {
guildPolicy2Service.statMicSecond(guildMember, micRecordVo.getStatTimeStamp(), timeInMillis);
micRecordVo.setStatTimeStamp(timeInMillis);
} else {
micRecordVo.setStatTimeStamp(maxUpTime);
Integer partitionId = guildMember.getPartitionId();
ZonedDateTime nowzonedDateTime = DateTimeUtil.convertWithZoneId(date, PartitionEnum.getByPartitionId(partitionId).getZoneId());
if (nowzonedDateTime.getHour() == 0 && nowzonedDateTime.getMinute() == 0) {//0点0分统计前一天的数据
nowzonedDateTime = nowzonedDateTime.minusDays(1);
}
micRecordMap.put(micRecordVo.getUid(), micRecordVo);
String cycleDate;
String statDate = nowzonedDateTime.format(DateTimeUtil.dateFormatter);
if (PartitionEnum.getByPartitionId(partitionId).getClanMode().equals(Constant.ClanMode.GUILD)) {
cycleDate = CycleTimeUtil.getAgencyCycleBeginDateStr(date);
} else {
cycleDate = FullMonthCycleTimeUtil.getAgencyCycleBeginDateStr(date);
}
long splitMinutes = (timeInMillis - maxUpTime)/1000/60;
Integer addMinutes = splitMinutes > 5 ? 5 : (int) splitMinutes;
guildPolicy2Service.updateDayMicStatistics(cycleDate, statDate, guildMember, addMinutes);
} catch (Exception e) {
log.error("statMicRecordTask uid {} roomId {} pos {} timeInMillis {}", uid, roomId, pos, timeInMillis, e);
} finally {

View File

@@ -50,8 +50,8 @@ public class GuildPolicy2Controller {
@Authorization
@GetMapping("/test")
public BusiResult<List<CycleDateVo>> listBusiResult(@RequestHeader(PUB_UID) Long uid) {
guildMemberRoomMicRecordService.statMicRecordTask4GuildPolicy2();;
public BusiResult<List<CycleDateVo>> listBusiResult(@RequestHeader(PUB_UID) Long uid, String nowDateTime) {
guildMemberRoomMicRecordService.statMicRecordTask4GuildPolicy2(DateUtil.parseDateTime(nowDateTime));
return guildPolicy2Service.getCycleDates(uid);
}

View File

@@ -6,6 +6,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
@Slf4j
public class GuildMemberMicTask {
@@ -16,7 +18,7 @@ public class GuildMemberMicTask {
@Scheduled(cron = "0 0/5 * * * ?")
public void micStatTask() {
log.info("micStatTask start");
guildMemberRoomMicRecordService.statMicRecordTask4GuildPolicy2();
guildMemberRoomMicRecordService.statMicRecordTask4GuildPolicy2(new Date());
log.info("micStatTask end");
}
}