房间小时流水统计
This commit is contained in:
@@ -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;
|
||||
|
@@ -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;
|
||||
|
||||
|
||||
}
|
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* =====账单表分表策略=====
|
||||
**/
|
||||
|
@@ -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> {
|
||||
|
||||
}
|
@@ -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>
|
@@ -14,6 +14,9 @@ public interface RoomConstant {
|
||||
|
||||
room_manage_user,//用户管理房间列表
|
||||
|
||||
room_hour_diamond_num,//仅用与统计数据,统计完删除
|
||||
|
||||
room_hour_gold_num,//仅用与统计数据,统计完删除
|
||||
;
|
||||
|
||||
@Override
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
@@ -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));
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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==============");
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user