房间小时流水统计

This commit is contained in:
2025-07-09 18:37:36 +08:00
parent 68ffdabb5d
commit aca127aede
13 changed files with 289 additions and 15 deletions

View File

@@ -1,7 +1,9 @@
package com.accompany.admin.controller.api;
import cn.hutool.core.date.DateUtil;
import com.accompany.admin.service.api.MyApiService;
import com.accompany.business.service.activity.h5.ActivityUserLevelExpService;
import com.accompany.business.service.room.RoomHourDiamondNumService;
import com.accompany.business.service.room.RoomService;
import com.accompany.business.vo.RoomVo;
import com.accompany.common.netease.neteaseacc.result.RoomMemberRet;
@@ -308,6 +310,15 @@ public class MyApiController {
return BusiResult.success();
}
@Autowired
private RoomHourDiamondNumService roomHourDiamondNumService;
@GetMapping("/refreshRoomHourDiamondNum")
public BusiResult<Void> refreshRoomHourDiamondNum(String date, Integer partitionId) {
roomHourDiamondNumService.taskInsertData(DateUtil.parseDateTime(date), partitionId);
return BusiResult.success();
}
@Autowired
private GoogleTokenVerifier googleTokenVerifier;

View File

@@ -0,0 +1,51 @@
package com.accompany.sharding.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 房间小时流水数据实体类
*
* @author
* @since 2025-07-09
*/
@Data
public class RoomHourDiamondNum implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id" , type = IdType.AUTO)
private Long id;
/**
* 分区id
*/
private Integer partitionId;
/**
* 房间room_uid
*/
private Long roomUid;
/**
* 流水日期yyyy-MM-dd HH:00:00
*/
private Date statDate;
/**
* 总送礼值
*/
private BigDecimal diamondNum;
/**
* 金币流水
*/
private BigDecimal goldNum;
/**
* 创建时间
*/
private Date createTime;
private Date updateTime;
}

View File

@@ -151,6 +151,11 @@ public class ShardingSphereConfig {
"create_time", "joyGameStrategy"));
tableConfigs.add(getShardingTableRuleConfiguration("room_hour_diamond_num",
"ds.room_hour_diamond_num_${2025..2026}${['01','02','03', '04','05','06', '07','08','09', '10','11','12']}",
"stat_date", "roomHourStrategy"));
Map<String, AlgorithmConfiguration> algorithmsConfigs = new HashMap<>();
// 账单按天分表
AlgorithmConfiguration billRecordShardingAlgorithm = getBillRecordShardingAlgorithmConfiguration();
@@ -189,9 +194,13 @@ public class ShardingSphereConfig {
AlgorithmConfiguration lucky25RecordShardingAlgorithm = getLucky25RecordShardingAlgorithmConfiguration();
algorithmsConfigs.put("lucky25RecordStrategy", lucky25RecordShardingAlgorithm);
//游戏日志
AlgorithmConfiguration joyGameShardingAlgorithm = getGameGoldLogShardingAlgorithmConfiguration();
AlgorithmConfiguration joyGameShardingAlgorithm = getjoyGameShardingAlgorithmConfiguration();
algorithmsConfigs.put("joyGameStrategy", joyGameShardingAlgorithm);
//房间小时流水数据
AlgorithmConfiguration roomHourShardingAlgorithm = getRoomHourDiamondShardingAlgorithmConfiguration();
algorithmsConfigs.put("roomHourStrategy", roomHourShardingAlgorithm);
ShardingRuleConfiguration config = new ShardingRuleConfiguration();
config.setTables(tableConfigs);
config.setAutoTables(autoTableConfigs);
@@ -266,6 +275,11 @@ public class ShardingSphereConfig {
return tableRuleConfiguration;
}
private AlgorithmConfiguration getRoomHourDiamondShardingAlgorithmConfiguration() {
AlgorithmConfiguration algorithmConfiguration = getMonthShardingAlgorithmConfiguration();
return algorithmConfiguration;
}
/**
* =====账单表分表策略=====
**/

View File

@@ -0,0 +1,14 @@
package com.accompany.sharding.mapper;
import com.accompany.sharding.model.RoomHourDiamondNum;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* 房间小时流水数据 Mapper 接口
*
* @author
* @since 2025-07-09
*/
public interface RoomHourDiamondNumMapper extends BaseMapper<RoomHourDiamondNum> {
}

View File

@@ -0,0 +1,5 @@
<?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.sharding.mapper.RoomHourDiamondNumMapper">
</mapper>

View File

@@ -14,6 +14,9 @@ public interface RoomConstant {
room_manage_user,//用户管理房间列表
room_hour_diamond_num,//仅用与统计数据,统计完删除
room_hour_gold_num,//仅用与统计数据,统计完删除
;
@Override

View File

@@ -7,7 +7,6 @@ import com.accompany.business.service.rank.RankService;
import com.accompany.business.service.room.*;
import com.accompany.business.service.user.UsersService;
import com.accompany.common.constant.Constant;
import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.model.Room;
import com.accompany.core.model.Users;
import com.alibaba.fastjson.JSONObject;
@@ -65,9 +64,7 @@ public class BravoGiftGoldIncomeListener implements ApplicationListener<BravoGif
jsonObject.put("serialValue", RoomServiceFactory.getServiceByType(room.getType()).roomSerialValue(roomUid, partitionId));
sendSysMsgService.sendSingleRoomMessage(room.getRoomId(), String.valueOf(roomUid), Constant.DefMsgType.RANK, Constant.DefMsgType.RANK_UPDATE, jsonObject);
}
if (PartitionEnum.ENGLISH2.getId() == partitionId || PartitionEnum.TURKEY.getId() == partitionId) {
roomDayDiamondNumService.addDiamondNum(partitionId, roomUid, messTime, 0D, totalDiamondNum);
}
roomDayDiamondNumService.addDiamondNum(partitionId, roomUid, messTime, 0D, totalDiamondNum);
} catch (Exception e) {
log.info("BravoGiftGoldIncomeListener updateAllRank-updateRoomRank:{}, e:{}", JSONObject.toJSONString(message), e.getMessage(), e);
}

View File

@@ -9,7 +9,6 @@ import com.accompany.business.service.rank.RankService;
import com.accompany.business.service.room.*;
import com.accompany.common.constant.Constant;
import com.accompany.common.utils.DateTimeUtil;
import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.model.Room;
import com.alibaba.fastjson.JSONObject;
import lombok.SneakyThrows;
@@ -19,7 +18,6 @@ import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -92,9 +90,7 @@ public class RankListener implements ApplicationListener<GiftMessageEvent> {
jsonObject.put("serialValue", RoomServiceFactory.getServiceByType(room.getType()).roomSerialValue(roomUid, partitionId));
sendSysMsgService.sendSingleRoomMessage(room.getRoomId(), String.valueOf(room.getUid()), Constant.DefMsgType.RANK, Constant.DefMsgType.RANK_UPDATE, jsonObject);
}
if (PartitionEnum.ENGLISH2.getId() == partitionId || PartitionEnum.TURKEY.getId() == partitionId) {
roomDayDiamondNumService.addDiamondNum(partitionId, roomUid, date, giftMessage.getDiamondNum(), giftGoldNum.doubleValue());
}
roomDayDiamondNumService.addDiamondNum(partitionId, roomUid, date, giftMessage.getDiamondNum(), giftGoldNum.doubleValue());
} catch (Exception e) {
log.info("RankListener.updateAllRank-updateRoomRank:{}, e:{}", JSONObject.toJSONString(giftMessage), e.getMessage(), e);
}

View File

@@ -7,7 +7,6 @@ import com.accompany.business.service.rank.RankService;
import com.accompany.business.service.room.*;
import com.accompany.business.service.user.UsersService;
import com.accompany.common.constant.Constant;
import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.model.Room;
import com.accompany.core.model.Users;
import com.alibaba.fastjson.JSONObject;
@@ -17,7 +16,6 @@ import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.Date;
@Slf4j
@@ -69,9 +67,7 @@ public class SuperLuckyGiftSendListener implements ApplicationListener<SuperLuck
sendSysMsgService.sendSingleRoomMessage(room.getRoomId(), String.valueOf(roomUid), Constant.DefMsgType.RANK, Constant.DefMsgType.RANK_UPDATE, jsonObject);
}
if (PartitionEnum.ENGLISH2.getId() == partitionId || PartitionEnum.TURKEY.getId() == partitionId) {
roomDayDiamondNumService.addDiamondNum(partitionId, roomUid, messTime, totalDiamondNum, totalDiamondNum);
}
roomDayDiamondNumService.addDiamondNum(partitionId, roomUid, messTime, totalDiamondNum, totalDiamondNum);
} catch (Exception e) {
log.info("SuperLuckyGiftSendListener.updateAllRank-updateRoomRank:{}, e:{}", JSONObject.toJSONString(message), e.getMessage(), e);
}

View File

@@ -0,0 +1,33 @@
package com.accompany.business.service.room;
import com.accompany.sharding.model.RoomHourDiamondNum;
import com.baomidou.mybatisplus.extension.service.IService;
import org.redisson.api.RMap;
import java.util.Date;
/**
* 房间小时流水数据 服务类
* 统计时间统一为东八区时间
*
* @author
* @since 2025-07-09
*/
public interface RoomHourDiamondNumService extends IService<RoomHourDiamondNum> {
void taskInsertData(Date statDate, Integer partitionId);
/**
* 统计时间统一为东八区时间
* @param partitionId
* @param roomUid
* @param statDate
* @param diamondNum
* @param goldNum
*/
void addRoomHourDiamondNumMap(Integer partitionId, Long roomUid, Date statDate, Double diamondNum, Double goldNum);
RMap<Long, Double> getRoomHourDiamondNumMap(Integer partitionId, String hourStr);
RMap<Long, Double> getRoomHourGoldNumMap(Integer partitionId, String hourStr);
}

View File

@@ -3,9 +3,11 @@ package com.accompany.business.service.room.impl;
import com.accompany.business.model.room.RoomDayDiamondNum;
import com.accompany.business.mybatismapper.room.RoomDayDiamondNumMapper;
import com.accompany.business.service.room.RoomDayDiamondNumService;
import com.accompany.business.service.room.RoomHourDiamondNumService;
import com.accompany.common.utils.DateTimeUtil;
import com.accompany.core.enumeration.PartitionEnum;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
@@ -21,9 +23,18 @@ import java.util.Date;
@Service
public class RoomDayDiamondNumServiceImpl extends ServiceImpl<RoomDayDiamondNumMapper, RoomDayDiamondNum> implements RoomDayDiamondNumService {
@Autowired
private RoomHourDiamondNumService roomHourDiamondNumService;
@Override
public Integer addDiamondNum(Integer partitionId, Long roomUid, Date statDate, Double diamondNum, Double goldNum) {
roomHourDiamondNumService.addRoomHourDiamondNumMap(partitionId, roomUid, statDate, diamondNum, goldNum);
//日流水目前只统计了英语2区跟土耳其区的英语2区设计金币发放
if (!(PartitionEnum.ENGLISH2.getId() == partitionId || PartitionEnum.TURKEY.getId() == partitionId)) {
return 0;
}
ZonedDateTime zonedDateTime = DateTimeUtil.convertWithZoneId(statDate, PartitionEnum.getByPartitionId(partitionId).getZoneId());
String format = zonedDateTime.format(DateTimeUtil.dateFormatter);
return baseMapper.addDiamondNum(partitionId, roomUid, format, BigDecimal.valueOf(diamondNum), BigDecimal.valueOf(goldNum));

View File

@@ -0,0 +1,109 @@
package com.accompany.business.service.room.impl;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.accompany.business.service.room.RoomHourDiamondNumService;
import com.accompany.sharding.mapper.RoomHourDiamondNumMapper;
import com.accompany.sharding.model.RoomHourDiamondNum;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.collections.CollectionUtils;
import org.redisson.api.RMap;
import org.redisson.api.RedissonClient;
import org.redisson.codec.TypedJsonJacksonCodec;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static com.accompany.business.constant.RoomConstant.RedisKey.room_hour_diamond_num;
import static com.accompany.business.constant.RoomConstant.RedisKey.room_hour_gold_num;
import static com.accompany.common.utils.DateTimeUtil.DATE_HOUR_PATTERN;
/**
* 房间小时流水数据 服务实现类
*
* @author
* @since 2025-07-09
*/
@Service
public class RoomHourDiamondNumServiceImpl extends ServiceImpl<RoomHourDiamondNumMapper, RoomHourDiamondNum> implements RoomHourDiamondNumService {
@Autowired
private RedissonClient redissonClient;
@Override
public void taskInsertData(Date statDate, Integer partitionId) {
Date currentYYYYMMDDHHTime = getCurrentYYYYMMDDHHTime(statDate);
DateTime actStatDate = DateUtil.offsetHour(currentYYYYMMDDHHTime, -1);
String cacheKeyPatten = getCacheKeyPatten(actStatDate);
Map<Long, RoomHourDiamondNum> roomHourDiamondNumMap = new HashMap<>();
RMap<Long, Double> hourDiamondNumCacheMap = getRoomHourDiamondNumMap(partitionId, cacheKeyPatten);
Map<Long, Double> roomHourDiamondMap = hourDiamondNumCacheMap.readAllMap();
roomHourDiamondMap.entrySet().forEach(entry -> {
RoomHourDiamondNum roomHourDiamondNum = new RoomHourDiamondNum();
roomHourDiamondNum.setDiamondNum(BigDecimal.valueOf(entry.getValue()));
roomHourDiamondNum.setPartitionId(partitionId);
roomHourDiamondNum.setRoomUid(entry.getKey());
roomHourDiamondNum.setStatDate(actStatDate);
roomHourDiamondNum.setCreateTime(statDate);
roomHourDiamondNum.setUpdateTime(statDate);
roomHourDiamondNumMap.put(entry.getKey(), roomHourDiamondNum);
});
RMap<Long, Double> hourGoldNumCacheMap = getRoomHourGoldNumMap(partitionId, cacheKeyPatten);
Map<Long, Double> roomHourGoldMap = hourGoldNumCacheMap.readAllMap();
roomHourGoldMap.entrySet().forEach(entry -> {
RoomHourDiamondNum roomHourDiamondNum = roomHourDiamondNumMap.getOrDefault(entry.getKey(), new RoomHourDiamondNum());
roomHourDiamondNum.setGoldNum(BigDecimal.valueOf(entry.getValue()));
roomHourDiamondNum.setPartitionId(partitionId);
roomHourDiamondNum.setRoomUid(entry.getKey());
roomHourDiamondNum.setStatDate(actStatDate);
roomHourDiamondNum.setCreateTime(statDate);
roomHourDiamondNum.setUpdateTime(statDate);
roomHourDiamondNumMap.put(entry.getKey(), roomHourDiamondNum);
});
List<RoomHourDiamondNum> resultList = roomHourDiamondNumMap.values().stream().collect(Collectors.toList());
if (CollectionUtils.isEmpty(resultList)) {
return;
}
saveBatch(resultList);
hourDiamondNumCacheMap.delete();
hourGoldNumCacheMap.delete();
}
@Override
public void addRoomHourDiamondNumMap(Integer partitionId, Long roomUid, Date statDate, Double diamondNum, Double goldNum) {
String cacheKeyPatten = this.getCacheKeyPatten(statDate);
this.getRoomHourDiamondNumMap(partitionId, cacheKeyPatten).addAndGet(roomUid, diamondNum);
this.getRoomHourDiamondNumMap(partitionId, cacheKeyPatten).addAndGet(roomUid, goldNum);
}
@Override
public RMap<Long, Double> getRoomHourDiamondNumMap(Integer partitionId, String hourDayStr) {
return redissonClient.getMap(room_hour_diamond_num.getKey(partitionId.toString(), hourDayStr),
new TypedJsonJacksonCodec(Long.class, Double.class));
}
@Override
public RMap<Long, Double> getRoomHourGoldNumMap(Integer partitionId, String hourDayStr) {
return redissonClient.getMap(room_hour_gold_num.getKey(partitionId.toString(), hourDayStr),
new TypedJsonJacksonCodec(Long.class, Double.class));
}
private String getCacheKeyPatten(Date statDate) {
Date currentYYYYMMDDHHTime = getCurrentYYYYMMDDHHTime(statDate);
return DateUtil.format(currentYYYYMMDDHHTime, DATE_HOUR_PATTERN);
}
private Date getCurrentYYYYMMDDHHTime(Date statDate) {
return DateUtil.truncate(statDate, DateField.HOUR_OF_DAY);
}
}

View File

@@ -0,0 +1,34 @@
package com.accompany.scheduler.task.room;
import cn.hutool.core.date.DateUtil;
import com.accompany.business.service.room.RoomHourDiamondNumService;
import com.accompany.core.enumeration.PartitionEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
@Slf4j
@Component
public class RoomHourDiamondTask {
@Autowired
private RoomHourDiamondNumService roomHourDiamondNumService;
/**
* 房间小时流水数据的数据
*/
@Scheduled(cron = "0 1 * * * ?")
public void setRoomHourDiamond() {
Date date = new Date();
log.info("RoomDayDiamondTask start,date:{}==============", DateUtil.formatDateTime(date));
PartitionEnum[] values = PartitionEnum.values();
for (PartitionEnum partitionEnum : values) {
roomHourDiamondNumService.taskInsertData(date, partitionEnum.getId());
}
log.info("RoomDayDiamondTask end==============");
}
}