重载房间等级经验

This commit is contained in:
2024-12-26 17:40:42 +08:00
parent df0e7cb275
commit ca6175458c
10 changed files with 163 additions and 17 deletions

View File

@@ -19,15 +19,20 @@ public class RoomLevelDayExp implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 房间uid
*/
@TableId(value = "room_uid", type = IdType.NONE)
private Long roomUid;
/**
* 房间金币流水
*/
private BigDecimal roomVal;
/**
* 统计时间(每天统计一次的分区统计)
*/
private String statDate;
/**
* 创建时间
*/

View File

@@ -80,10 +80,10 @@ public class RankListener implements ApplicationListener<GiftMessageEvent> {
boolean isFreeGift = Constant.GiftConsumeType.ROOM_FREE_GIFT == gift.getConsumeType();
Long giftGoldNum = isFreeGift ? Math.abs(gift.getGoldPrice() * giftNum) : goldNum;
roomRankService.updateRoomRank(roomUid, sendUid, recvUid, giftGoldNum.doubleValue(), date, isFreeGift, partitionId);
roomLevelService.updateRoomLevelExp(partitionId, roomUid, giftGoldNum.doubleValue());
//发送榜单更新
if (roomUid != null) {
RoomVo roomVo = roomService.queryRoomByUid(roomUid, roomUid);
roomLevelService.updateRoomLevelExp(partitionId, roomUid, giftGoldNum.doubleValue(), roomVo);
if (roomVo != null) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("serialValue", roomVo.getSerialValue());

View File

@@ -54,10 +54,10 @@ public class SuperLuckyGiftSendListener implements ApplicationListener<SuperLuck
try {
rankService.updateAllRank(sendUid, recvUid, roomUid, totalDiamondNum, messTime.getTime(), partitionId);
roomRankService.updateRoomRank(roomUid, sendUid, recvUid, totalDiamondNum, messTime, Boolean.FALSE, partitionId);
roomLevelService.updateRoomLevelExp(partitionId, roomUid, totalDiamondNum);
//发送榜单更新
if (roomUid != null) {
RoomVo roomVo = roomService.queryRoomByUid(roomUid, roomUid);
roomLevelService.updateRoomLevelExp(partitionId, roomUid, totalDiamondNum, roomVo);
if (roomVo != null) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("serialValue", roomVo.getSerialValue());

View File

@@ -2,6 +2,9 @@ package com.accompany.business.mybatismapper.room;
import com.accompany.business.model.room.RoomLevelDayExp;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 房间等级表 Mapper 接口
@@ -11,4 +14,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface RoomLevelDayExpMapper extends BaseMapper<RoomLevelDayExp> {
List<RoomLevelDayExp> loadDayDataByBill(@Param("dateStr") String dateStr);
List<RoomLevelDayExp> statRoomTotalVal(@Param("roomUids") List<Long> roomUids);
}

View File

@@ -5,6 +5,8 @@ import com.accompany.business.model.room.RoomLevelInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import org.redisson.api.RScoredSortedSet;
import java.util.List;
/**
* 房间等级表 服务类
*
@@ -13,4 +15,12 @@ import org.redisson.api.RScoredSortedSet;
*/
public interface RoomLevelDayExpService extends IService<RoomLevelDayExp> {
/**
*
* @param dateStr 账单的日期后缀 eg: 20241225
*/
void loadDayDataByBill(String dateStr);
List<RoomLevelDayExp> loadRoomVal(List<Long> roomUid);
}

View File

@@ -1,10 +1,12 @@
package com.accompany.business.service.room;
import com.accompany.business.constant.RoomConstant;
import com.accompany.business.model.room.RoomLevelDayExp;
import com.accompany.business.model.room.RoomLevelInfo;
import com.accompany.business.model.room.RoomMicDress;
import com.accompany.business.service.SendSysMsgService;
import com.accompany.business.service.user.UsersService;
import com.accompany.business.vo.RoomVo;
import com.accompany.business.vo.room.RoomLevelVo;
import com.accompany.common.constant.Constant;
import com.accompany.common.netease.ErBanNetEaseService;
@@ -52,11 +54,14 @@ public class RoomLevelService {
@Autowired
private SendSysMsgService sendSysMsgService;
@Autowired
private RoomLevelDayExpService roomLevelDayExpService;
public RScoredSortedSet<Long> roomExpCache(Integer partitionId) {
return redissonClient.getScoredSortedSet(RoomConstant.RedisKey.room_val.getKey(partitionId), LongCodec.INSTANCE);
}
public void updateRoomLevelExp(Integer partitionId, Long roomUid, Double exp) {
public void updateRoomLevelExp(Integer partitionId, Long roomUid, Double exp, RoomVo roomVo) {
if (roomUid == null) {
return;
}
@@ -68,10 +73,10 @@ public class RoomLevelService {
Map.Entry<BigDecimal, RoomLevelInfo> lastLevelInfoEntry = levelInfoTreeMap.headMap(lastScore, true).lastEntry();
Integer totalLevel = totalLevelInfoEntry.getValue().getLevelSeq();
Integer lastLevel = lastLevelInfoEntry.getValue().getLevelSeq();
if ((totalLevel - lastLevel) > 0) {
if (totalLevel > lastLevel) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("roomLevelIcon", totalLevelInfoEntry.getValue().getLevelIcon());
sendSysMsgService.sendSingleRoomMessage(roomUid, String.valueOf(roomUid), Constant.DefMsgType.ROOM_LEVEL, Constant.DefMsgType.ROOM_LEVEL_UP, jsonObject);
sendSysMsgService.sendSingleRoomMessage(roomVo.getRoomId(), String.valueOf(roomUid), Constant.DefMsgType.ROOM_LEVEL, Constant.DefMsgType.ROOM_LEVEL_UP, jsonObject);
}
} catch (Exception e) {
log.error("updateRoomLevelExp:partitionId:{},roomUid:{},exp:{},e:{}", partitionId, roomUid, exp, e.getMessage(), e);
@@ -190,4 +195,21 @@ public class RoomLevelService {
public RBucket<String> roomMicDressCache(Integer dressType, Long roomUid) {
return roomMicDressService.roomMicDressCache(dressType, roomUid);
}
public void reloadRoomVal(List<Long> roomUids) {
List<RoomLevelDayExp> roomLevelDayExps = roomLevelDayExpService.loadRoomVal(roomUids);
if (CollectionUtils.isEmpty(roomLevelDayExps)) {
return;
}
Map<Long, Users> usersMapByUids = usersService.getUsersMapByUids(roomUids);
for (RoomLevelDayExp roomLevelDayExp : roomLevelDayExps) {
Long roomUid = roomLevelDayExp.getRoomUid();
Users users = usersMapByUids.get(roomUid);
if (users == null) {
continue;
}
roomExpCache(users.getPartitionId()).addScore(roomUid, roomLevelDayExp.getRoomVal());
}
}
}

View File

@@ -1,21 +1,15 @@
package com.accompany.business.service.room.impl;
import com.accompany.business.constant.RoomConstant;
import com.accompany.business.model.room.RoomLevelDayExp;
import com.accompany.business.model.room.RoomLevelInfo;
import com.accompany.business.mybatismapper.room.RoomLevelDayExpMapper;
import com.accompany.business.service.room.RoomLevelDayExpService;
import com.accompany.business.service.room.RoomLevelInfoService;
import com.accompany.common.utils.PageUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.redisson.api.RScoredSortedSet;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.LongCodec;
import org.springframework.beans.factory.annotation.Autowired;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Map;
import java.util.TreeMap;
import java.util.Date;
import java.util.List;
/**
* 房间等级表 服务实现类
@@ -27,4 +21,29 @@ import java.util.TreeMap;
public class RoomLevelDayExpServiceImpl extends ServiceImpl<RoomLevelDayExpMapper, RoomLevelDayExp> implements RoomLevelDayExpService {
@Override
public void loadDayDataByBill(String dateStr) {
List<RoomLevelDayExp> roomLevelDayExps = baseMapper.loadDayDataByBill(dateStr);
if (CollectionUtils.isEmpty(roomLevelDayExps)) {
return;
}
Date date = new Date();
for (RoomLevelDayExp roomLevelDayExp : roomLevelDayExps) {
roomLevelDayExp.setStatDate(dateStr);
roomLevelDayExp.setCreateTime(date);
}
int pageSize = 1000;
for (int pageNum = 1; pageNum < 10000; pageNum++) {
List<RoomLevelDayExp> page = PageUtil.page(roomLevelDayExps, pageNum, pageSize);
if (CollectionUtils.isEmpty(page)) {
break;
}
baseMapper.insert(page);
}
}
@Override
public List<RoomLevelDayExp> loadRoomVal(List<Long> roomUid) {
return baseMapper.statRoomTotalVal(roomUid);
}
}

View File

@@ -2,4 +2,31 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.accompany.business.mybatismapper.room.RoomLevelDayExpMapper">
<select id="loadDayDataByBill" resultType="com.accompany.business.model.room.RoomLevelDayExp">
SELECT
b.room_uid roomUid,
SUM(IF(FIND_IN_SET(b.gift_id, '16,18'), b.amount, b.gift_total_gold_num)) roomVal
FROM
bill_record_${dateStr} b
LEFT JOIN users u on u.uid = b.room_uid
left join gift g on g.gift_id = b.gift_id
WHERE
obj_type = 4
AND b.room_uid != 0
GROUP BY
b.room_uid
</select>
<select id="statRoomTotalVal" resultType="com.accompany.business.model.room.RoomLevelDayExp">
SELECT
room_uid roomUid,
SUM(room_val) roomVal
FROM
room_level_day_exp
where
<foreach collection="roomUids" separator="," open="room_uid in(" item="roomUid" close=")">
#{roomUid}
</foreach>
group by room_uid
</select>
</mapper>

View File

@@ -1,5 +1,7 @@
package com.accompany.business.controller.room;
import com.accompany.business.constant.SymbolConstants;
import com.accompany.business.service.room.RoomLevelDayExpService;
import com.accompany.business.service.room.RoomLevelService;
import com.accompany.business.vo.room.RoomLevelVo;
import com.accompany.common.annotation.Authorization;
@@ -9,9 +11,14 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.javassist.compiler.ast.Symbol;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import static com.accompany.common.constant.ApplicationConstant.PublicParameters.PUB_UID;
@RestController
@@ -22,7 +29,7 @@ public class RoomLevelController {
@Autowired
private RoomLevelService roomLevelService;
@Autowired
private ErBanNetEaseService erBanNetEaseService;
private RoomLevelDayExpService roomLevelDayExpService;
@ApiImplicitParams({
@@ -56,4 +63,22 @@ public class RoomLevelController {
public BusiResult<Void> checkManageNum(@RequestParam Long roomUid) {
return roomLevelService.checkManageNum(roomUid);
}
@ApiOperation(value = "统计数据", httpMethod = "GET")
@GetMapping("/taskStatDate")
public BusiResult<Void> checkManageNum(@RequestParam String dateStr) {
roomLevelDayExpService.loadDayDataByBill(dateStr);
return BusiResult.success();
}
@ApiOperation(value = "重新加载房间等级经验", httpMethod = "GET")
@GetMapping("/reloadRoomVal")
public BusiResult<Void> reloadRoomVal(@RequestParam String roomUidArr) {
String[] split = roomUidArr.split(SymbolConstants.COMMA);
List<Long> roomUids = Arrays.stream(split)
.map(Long::parseLong)
.collect(Collectors.toList());
roomLevelService.reloadRoomVal(roomUids);
return BusiResult.success();
}
}

View File

@@ -0,0 +1,32 @@
package com.accompany.scheduler.task.room;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.accompany.business.service.room.RoomLevelDayExpService;
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 RoomLevelDayExpTask {
@Autowired
private RoomLevelDayExpService roomLevelDayExpService;
/**
* 加载东三区的数据
*/
@Scheduled(cron = "0 13 4 * * ?")
public void roomLevelDayExpTask() {
Date date = new Date();
String dateStr = DateUtil.format(DateUtil.offsetDay(date, -1), DatePattern.PURE_DATE_PATTERN);
log.info("roomLevelDayExpTask start,dateStr:{},date:{}==============", dateStr, DateUtil.formatDateTime(date));
roomLevelDayExpService.loadDayDataByBill(dateStr);
log.info("roomLevelDayExpTask end,dateStr:{},date:{}==============", dateStr, DateUtil.formatDateTime(date));
}
}