diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildpolicy2/GuildMicStatisticsPolicy2.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildpolicy2/GuildMicStatisticsPolicy2.java new file mode 100644 index 000000000..86e59d77c --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildpolicy2/GuildMicStatisticsPolicy2.java @@ -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; + + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/MicRecordVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/MicRecordVo.java index 36a97af50..5b84610a4 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/MicRecordVo.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/MicRecordVo.java @@ -14,5 +14,6 @@ public class MicRecordVo { private Long guildMemberId; private Long statTimeStamp; private Long roomId; + private Long roomUid; private Integer pos; } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildpolicy2/GuildMicStatisticsPolicy2Mapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildpolicy2/GuildMicStatisticsPolicy2Mapper.java new file mode 100644 index 000000000..826f8a5d9 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildpolicy2/GuildMicStatisticsPolicy2Mapper.java @@ -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 { + + 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); + +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildMicStatisticsPolicy2Service.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildMicStatisticsPolicy2Service.java new file mode 100644 index 000000000..a913e4676 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildMicStatisticsPolicy2Service.java @@ -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 { + + 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()); + } +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildPolicy2Service.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildPolicy2Service.java index 0495459ad..3045615c8 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildPolicy2Service.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildPolicy2Service.java @@ -41,6 +41,8 @@ public class GuildPolicy2Service { private GuildAuthService guildAuthService; @Autowired private RoomMicService roomMicService; + @Autowired + private GuildMicStatisticsPolicy2Service guildMicStatisticsPolicy2Service; public BusiResult 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); } } } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/room/GuildMemberRoomMicRecordService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/room/GuildMemberRoomMicRecordService.java index e77e09424..55734f32d 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/room/GuildMemberRoomMicRecordService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/room/GuildMemberRoomMicRecordService.java @@ -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 guildMemberMap = guildMemberService.mapFamilyMember(micUserMap.values()); - for (Map.Entry entry: micUserMap.entrySet()){ + for (Map.Entry 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 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 listTotalRemainTimeGroupByGuildMember(String startDate, String endDate, - List uidList, Integer guildId) { + List 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 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 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 mapMicVaildDaysGroupByUid(Date startTime, Date endTime, - List uidList, Integer familyId) { + List uidList, Integer familyId) { Map> map = new HashMap<>(); List withoutOverDateList = this.baseMapper.listTotalRemainTimeByUidAndDateWithOutOverDate(startTime, endTime, uidList, familyId); - for (GuildMemberMicRemainTimeVo po: withoutOverDateList){ + for (GuildMemberMicRemainTimeVo po : withoutOverDateList) { Map dateMap = map.computeIfAbsent(po.getUid(), k -> new HashMap<>()); dateMap.put(po.getDate(), po.getRemainTime()); } @@ -261,13 +271,13 @@ public class GuildMemberRoomMicRecordService extends ServiceImpl 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 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 { 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 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 micSet = redissonClient.getSet(RedisKey.guild_member_room_mic_record.getKey(uid.toString(), roomId.toString(), pos.toString())); Optional 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) { diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildDiamondStatisticsPolicy2Mapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildDiamondStatisticsPolicy2Mapper.xml index c789f393a..710cd38f9 100644 --- a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildDiamondStatisticsPolicy2Mapper.xml +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildDiamondStatisticsPolicy2Mapper.xml @@ -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} diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildMicStatisticsPolicy2Mapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildMicStatisticsPolicy2Mapper.xml new file mode 100644 index 000000000..d38de8265 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildMicStatisticsPolicy2Mapper.xml @@ -0,0 +1,14 @@ + + + + + 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) + + +