土耳其新政策上麦时长单独记录

This commit is contained in:
2025-08-13 11:15:29 +08:00
parent 86772fde45
commit ffc4997580
8 changed files with 163 additions and 25 deletions

View File

@@ -0,0 +1,43 @@
package com.accompany.business.model.guildpolicy2;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 公会钻石流水统计按天实体类
*
* @author
* @since 2025-08-11
*/
@Data
public class GuildMicStatisticsPolicy2 implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String cycleDate;
private Integer partitionId;
/**
* 统计日期
*/
private String statDate;
private Long guildMemberId;
private Long uid;
/**
* 所属厅id
*/
private Integer guildId;
private Integer micSecond;
/**
* 创建时间
*/
private Date createTime;
private Date updateTime;
}

View File

@@ -14,5 +14,6 @@ public class MicRecordVo {
private Long guildMemberId;
private Long statTimeStamp;
private Long roomId;
private Long roomUid;
private Integer pos;
}

View File

@@ -0,0 +1,21 @@
package com.accompany.business.mybatismapper.guildpolicy2;
import com.accompany.business.model.guildpolicy2.GuildMicStatisticsPolicy2;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
/**
* 公会钻石流水统计按天 Mapper 接口
*
* @author
* @since 2025-08-11
*/
public interface GuildMicStatisticsPolicy2Mapper extends BaseMapper<GuildMicStatisticsPolicy2> {
int updateDayMicStatistics(@Param("cycleDate")String cycleDate, @Param("statDate")String statDate,
@Param("guildMemberId")Long guildMemberId, @Param("partitionId") Integer partitionId, @Param("guildId")Integer guildId, @Param("uid")Long uid,
@Param("micMinutes") Integer micMinutes, @Param("time") Date time);
}

View File

@@ -0,0 +1,24 @@
package com.accompany.business.service.guildpolicy2;
import com.accompany.business.model.guild.GuildMember;
import com.accompany.business.model.guildpolicy2.GuildMicStatisticsPolicy2;
import com.accompany.business.mybatismapper.guildpolicy2.GuildMicStatisticsPolicy2Mapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
* 公会钻石流水统计按天 服务实现类
*
* @author
* @since 2025-08-11
*/
@Service
public class GuildMicStatisticsPolicy2Service extends ServiceImpl<GuildMicStatisticsPolicy2Mapper, GuildMicStatisticsPolicy2> {
public int updateDayMicStatistics(String cycleDate, String statDate, GuildMember guildMember, int micMinutes) {
return baseMapper.updateDayMicStatistics(cycleDate, statDate, guildMember.getId(), guildMember.getPartitionId(),
guildMember.getGuildId(), guildMember.getUid(), micMinutes, new Date());
}
}

View File

@@ -41,6 +41,8 @@ public class GuildPolicy2Service {
private GuildAuthService guildAuthService;
@Autowired
private RoomMicService roomMicService;
@Autowired
private GuildMicStatisticsPolicy2Service guildMicStatisticsPolicy2Service;
public BusiResult<GuildPolicy2Vo> getGuildPolicy2(Long uid, String cycleBeginDate) {
GuildPolicy2Vo guildPolicy2Vo = new GuildPolicy2Vo();
@@ -127,7 +129,7 @@ public class GuildPolicy2Service {
String statDate = entry.getKey();
Date beginOfMonth = DateUtil.beginOfMonth(DateUtil.parseDate(statDate));
String cycleDate = DateUtil.formatDate(beginOfMonth);
guildDiamondStatisticsPolicy2Service.updateDayDiamondStatistics(cycleDate, statDate, guildMember, 0, micMinutes);
guildMicStatisticsPolicy2Service.updateDayMicStatistics(cycleDate, statDate, guildMember, micMinutes);
}
}
}

View File

@@ -7,15 +7,20 @@ import com.accompany.business.param.MicQueueParam;
import com.accompany.business.service.guild.GuildMemberService;
import com.accompany.business.service.guildpolicy2.GuildPolicy2Service;
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.redis.RedisKey;
import com.accompany.common.utils.DateTimeUtil;
import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.model.Room;
import com.accompany.core.service.common.JedisService;
import com.accompany.sharding.mapper.GuildMemberRoomMicRecordMapper;
import com.accompany.sharding.model.GuildMemberRoomMicRecord;
import com.accompany.sharding.vo.GuildMemberMicRemainTimeVo;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.gson.Gson;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
@@ -46,6 +51,10 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl<GuildMemberRoom
private GuildMemberService guildMemberService;
@Autowired
private GuildPolicy2Service guildPolicy2Service;
@Autowired
private JedisService jedisService;
private Gson gson = new Gson();
@SneakyThrows
public void cacheRecordAndSave(MicQueueParam micQueueParam) {
@@ -58,21 +67,21 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl<GuildMemberRoom
Long roomUid = null != room ? room.getUid() : null;
Long timestamp = micQueueParam.getTimestamp();
if (isDeleteMicActionAction(qEvent)){
Long uid = null != micQueueParam.getBelongTo()? micQueueParam.getBelongTo(): micQueueParam.getOperator();
if (isDeleteMicActionAction(qEvent)) {
Long uid = null != micQueueParam.getBelongTo() ? micQueueParam.getBelongTo() : micQueueParam.getOperator();
GuildMember guildMember = guildMemberService.getVaildGuildMemberByUid(uid);
if (null == guildMember){
if (null == guildMember) {
return;
}
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(guildMember.getPartitionId());
boolean guildPolicy2 = GUILD_POLICY2.equals(partitionEnum.getClanMode());
if (!guildPolicy2 && guildMember.getPartitionId() == PartitionEnum.ARAB.getId()){
if (!guildPolicy2 && guildMember.getPartitionId() == PartitionEnum.ARAB.getId()) {
return;
}
JSONArray keysJsonArray = new JSONArray(micQueueParam.getKeys());
for(int i = 0; i < keysJsonArray.length(); i++){
for (int i = 0; i < keysJsonArray.length(); i++) {
int pos = keysJsonArray.getInt(i);
record(qEvent, timestamp, guildMember, roomUid, roomId, pos, guildPolicy2);
}
@@ -86,17 +95,17 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl<GuildMemberRoom
Map<Long, GuildMember> guildMemberMap = guildMemberService.mapFamilyMember(micUserMap.values());
for (Map.Entry<Integer, Long> entry: micUserMap.entrySet()){
for (Map.Entry<Integer, Long> entry : micUserMap.entrySet()) {
Integer pos = entry.getKey();
Long uid = entry.getValue();
GuildMember guildMember = guildMemberMap.get(uid);
if (null == guildMember){
if (null == guildMember) {
return;
}
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(guildMember.getPartitionId());
boolean guildPolicy2 = GUILD_POLICY2.equals(partitionEnum.getClanMode());
if (!guildPolicy2 && guildMember.getPartitionId() == PartitionEnum.ARAB.getId()){
if (!guildPolicy2 && guildMember.getPartitionId() == PartitionEnum.ARAB.getId()) {
return;
}
@@ -104,7 +113,7 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl<GuildMemberRoom
}
}
public void record(Integer qEvent, Long timestamp, GuildMember guildMember, Long roomUid, Long roomId, Integer pos, boolean guildPolicy2){
public void record(Integer qEvent, Long timestamp, GuildMember guildMember, Long roomUid, Long roomId, Integer pos, boolean guildPolicy2) {
Long uid = guildMember.getUid();
RSet<Long> micSet = redissonClient.getSet(RedisKey.guild_member_room_mic_record.getKey(uid.toString(), roomId.toString(), pos.toString()));
if (isUpMicAction(qEvent)) {
@@ -114,6 +123,7 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl<GuildMemberRoom
this.getMicRecordMap().put(uid, MicRecordVo.builder().guildMemberId(guildMember.getId())
.uid(uid)
.roomId(roomId)
.roomUid(roomUid)
.pos(pos)
.statTimeStamp(timestamp).build());
}
@@ -190,17 +200,17 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl<GuildMemberRoom
}
public List<GuildMemberRoomMicRecord> listTotalRemainTimeGroupByGuildMember(String startDate, String endDate,
List<Long> uidList, Integer guildId) {
List<Long> uidList, Integer guildId) {
Date upTime = null;
Date startTime = null;
if (StringUtils.isNotBlank(startDate)){
if (StringUtils.isNotBlank(startDate)) {
startTime = DateTimeUtil.convertStrToDate(startDate);
upTime = DateTimeUtil.addDays(startTime, -1);
}
Date downTime = null;
Date endTime = null;
if (StringUtils.isNotBlank(startDate)){
if (StringUtils.isNotBlank(startDate)) {
endTime = DateTimeUtil.convertStrToDate(endDate);
downTime = DateTimeUtil.addDays(endTime, 1);
}
@@ -214,7 +224,7 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl<GuildMemberRoom
List<GuildMemberMicRemainTimeVo> withoutOverDateList =
this.baseMapper.listTotalRemainTimeByDateWithOutOverDate(startTime, endTime, uid, familyId);
for (GuildMemberMicRemainTimeVo po: withoutOverDateList){
for (GuildMemberMicRemainTimeVo po : withoutOverDateList) {
map.put(po.getDate(), po.getRemainTime());
}
@@ -223,13 +233,13 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl<GuildMemberRoom
List<GuildMemberMicRemainTimeVo> overDateList =
this.baseMapper.listTotalRemainTimeByDateOverDate(upTime, startTime, endTime, downTime, uid, familyId);
for (GuildMemberMicRemainTimeVo po: overDateList){
for (GuildMemberMicRemainTimeVo po : overDateList) {
Date start = po.getUpTime();
while (start.before(po.getDownTime())){
while (start.before(po.getDownTime())) {
String date = DateTimeUtil.convertDate(start, DateTimeUtil.DEFAULT_DATE_PATTERN);
Date end = DateTimeUtil.getEndTimeOfDay(start);
if (end.after(po.getDownTime())){
if (end.after(po.getDownTime())) {
start = DateTimeUtil.getBeginTimeOfDay(po.getDownTime());
end = po.getDownTime();
}
@@ -246,12 +256,12 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl<GuildMemberRoom
}
public Map<Long, Long> mapMicVaildDaysGroupByUid(Date startTime, Date endTime,
List<Long> uidList, Integer familyId) {
List<Long> uidList, Integer familyId) {
Map<Long, Map<String, Long>> map = new HashMap<>();
List<GuildMemberMicRemainTimeVo> withoutOverDateList =
this.baseMapper.listTotalRemainTimeByUidAndDateWithOutOverDate(startTime, endTime, uidList, familyId);
for (GuildMemberMicRemainTimeVo po: withoutOverDateList){
for (GuildMemberMicRemainTimeVo po : withoutOverDateList) {
Map<String, Long> dateMap = map.computeIfAbsent(po.getUid(), k -> new HashMap<>());
dateMap.put(po.getDate(), po.getRemainTime());
}
@@ -261,13 +271,13 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl<GuildMemberRoom
List<GuildMemberMicRemainTimeVo> overDateList =
this.baseMapper.listTotalRemainTimeByUidAndDateOverDate(upTime, startTime, endTime, downTime, uidList, familyId);
for (GuildMemberMicRemainTimeVo po: overDateList){
for (GuildMemberMicRemainTimeVo po : overDateList) {
Date start = po.getUpTime();
while (start.before(po.getDownTime())){
while (start.before(po.getDownTime())) {
String date = DateTimeUtil.convertDate(start, DateTimeUtil.DEFAULT_DATE_PATTERN);
Date end = DateTimeUtil.getEndTimeOfDay(start);
if (end.after(po.getDownTime())){
if (end.after(po.getDownTime())) {
start = DateTimeUtil.getBeginTimeOfDay(po.getDownTime());
end = po.getDownTime();
}
@@ -285,7 +295,7 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl<GuildMemberRoom
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().values().stream()
.filter(remainTime-> remainTime >= FamilyConstant.MIC_VAILD_SECONDS)
.filter(remainTime -> remainTime >= FamilyConstant.MIC_VAILD_SECONDS)
.count()
));
}
@@ -321,10 +331,28 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl<GuildMemberRoom
uids.forEach(uid -> {
MicRecordVo micRecordVo = micRecordMap.get(uid);
if (ObjectUtil.isNull(micRecordVo)) {
micRecordMap.remove(uid);
return;
}
Long roomId = micRecordVo.getRoomId();
Integer pos = micRecordVo.getPos();
Long roomUid = micRecordVo.getRoomUid();
String str = jedisService.hget(RedisKey.room_mic_up.getKey(), String.valueOf(roomUid));
if (com.accompany.common.utils.StringUtils.isEmpty(str)
|| ApplicationConstant.NULL_JSON_OBJECT.equalsIgnoreCase(str)) {
micRecordMap.remove(uid);
return;
}
PlayRoomVo playRoomVo = gson.fromJson(str, PlayRoomVo.class);
if (CollectionUtils.isEmpty(playRoomVo.getMicUsers())) {
micRecordMap.remove(uid);
return;
}
Set<Long> micUids = playRoomVo.getMicUsers().stream().map(MicUserVo::getUid).collect(Collectors.toSet());
if (!micUids.contains(uid)) {
micRecordMap.remove(uid);
return;
}
RLock lock = redissonClient.getLock(RedisKey.guild_member_room_mic_record_lock.getKey(uid.toString(), roomId.toString(), pos.toString()));
boolean locked = false;
@@ -332,16 +360,19 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl<GuildMemberRoom
locked = lock.tryLock(3, TimeUnit.SECONDS);
GuildMember guildMember = guildMemberMap.get(micRecordVo.getUid());
if (ObjectUtil.isNull(guildMember)) {
micRecordMap.remove(uid);
return;
}
RSet<Long> micSet = redissonClient.getSet(RedisKey.guild_member_room_mic_record.getKey(uid.toString(), roomId.toString(), pos.toString()));
Optional<Long> lastUpMic = micSet.stream().filter(inTime -> timeInMillis.compareTo(inTime) > 0).max(Comparator.comparingLong(Long::longValue));
if (lastUpMic.isEmpty()) {
log.error("[statMicRecordTask] 获取上麦时间异常 uid {} roomUid {} roomId {} pos {} timeInMillis {}", uid, roomId, pos, timeInMillis);
micRecordMap.remove(uid);
return;
}
Long maxUpTime = lastUpMic.get();
if (maxUpTime == null) {
micRecordMap.remove(uid);
return;
}
if (maxUpTime < timeInMillis) {

View File

@@ -36,9 +36,10 @@
u.avatar as avatar,
u.uid as uid,
ifnull(sum(gdsp.diamond_num), 0) as diamondNum,
COUNT(DISTINCT CASE WHEN gdsp.mic_minutes >= 120 THEN gdsp.stat_date END) AS micDay
COUNT(DISTINCT CASE WHEN gmp.mic_minutes >= 120 THEN gdsp.stat_date END) AS micDay
from guild_member gm
left join `guild_diamond_statistics_policy2` gdsp on gm.id = gdsp.guild_member_id and gdsp.cycle_date = #{cycleDate}
left join guild_mic_statistics_policy2 gmp on gmp.guild_member_id = gm.id and gmp.cycle_date = #{cycleDate}
left join users u on u.uid = gm.uid
where gm.guild_id = #{guildId}
and gm.`enable` = 1
@@ -50,8 +51,9 @@
gdsp.stat_date as statDate,
ifnull(sum(gdsp.diamond_num), 0) as diamondNum,
gdsp.mic_minutes as micMinute,
if(gdsp.mic_minutes >= 120, 1, 0) as validMicDay
if(gmp.mic_minutes >= 120, 1, 0) as validMicDay
from `guild_diamond_statistics_policy2` gdsp
left join guild_mic_statistics_policy2 gmp on gmp.guild_member_id = gdsp.guild_member_id and gmp.cycle_date = #{cycleDate}
left join guild_member gm on gm.id = gdsp.guild_member_id and gdsp.cycle_date = #{cycleDate}
where gdsp.cycle_date = #{cycleDate}
and gdsp.guild_member_id = #{guildMemberId}

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.accompany.business.mybatismapper.guildpolicy2.GuildMicStatisticsPolicy2Mapper">
<update id="updateDayMicStatistics">
INSERT INTO `guild_mic_statistics_policy2` (`cycle_date`, `stat_date`, `guild_member_id`, `partition_id`, `uid`,
`guild_id`, `mic_minutes`, `create_time`, `update_time`)
VALUES (#{cycleDate}, #{statDate}, #{guildMemberId}, #{partitionId}, #{uid}, #{guildId}, #{micMinutes}, #{time}, #{time})
ON DUPLICATE KEY
UPDATE
mic_minutes = mic_minutes + values (mic_minutes),
update_time = values (update_time)
</update>
</mapper>