土耳其新政策上麦时长单独记录
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
}
|
@@ -14,5 +14,6 @@ public class MicRecordVo {
|
||||
private Long guildMemberId;
|
||||
private Long statTimeStamp;
|
||||
private Long roomId;
|
||||
private Long roomUid;
|
||||
private Integer pos;
|
||||
}
|
||||
|
@@ -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);
|
||||
|
||||
}
|
@@ -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());
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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) {
|
||||
|
@@ -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}
|
||||
|
@@ -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>
|
Reference in New Issue
Block a user