优化定时刷新上麦时间逻辑
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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 {
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -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");
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user