This commit is contained in:
777
2025-08-19 21:48:18 +08:00
parent 10eea85347
commit 43b13d4da9
28 changed files with 436 additions and 183 deletions

View File

@@ -0,0 +1,26 @@
package com.ruoyi.cai.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.cai.domain.AnchorImCountDay;
import com.ruoyi.cai.dto.admin.vo.AnchorImCountDayAdminVO;
import com.ruoyi.common.core.domain.PageQuery;
import java.time.LocalDate;
/**
* 每日发言统计Service接口
*
* @author 777
* @date 2025-08-19
*/
public interface AnchorImCountDayService extends IService<AnchorImCountDay> {
void totalUserCount();
IPage<AnchorImCountDayAdminVO> pageAdmin(AnchorImCountDayAdminVO bo, PageQuery pageQuery);
void incCount(Long userId);
void refreshCount(LocalDate localDate);
}

View File

@@ -0,0 +1,116 @@
package com.ruoyi.cai.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.cai.domain.AnchorImCountDay;
import com.ruoyi.cai.domain.UserCount;
import com.ruoyi.cai.dto.admin.vo.AnchorImCountDayAdminVO;
import com.ruoyi.cai.mapper.AnchorImCountDayMapper;
import com.ruoyi.cai.service.AnchorImCountDayService;
import com.ruoyi.cai.service.UserCountService;
import com.ruoyi.common.core.domain.PageQuery;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RMap;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* 每日发言统计Service业务层处理
*
* @author 777
* @date 2025-08-19
*/
@Service
@Slf4j
public class AnchorImCountDayServiceImpl extends ServiceImpl<AnchorImCountDayMapper, AnchorImCountDay> implements AnchorImCountDayService {
@Autowired
private RedissonClient redissonClient;
@Autowired
private UserCountService userCountService;
@Override
public void totalUserCount() {
IPage<AnchorImCountDay> page = new Page<>();
page.setSize(1000);
int i = 0;
while (true){
i++;
if(i > 10000){
break;
}
page.setCurrent(i);
IPage<AnchorImCountDay> totalUserId = baseMapper.totalUserId(page);
List<AnchorImCountDay> records = totalUserId.getRecords();
for (AnchorImCountDay record : records) {
userCountService.update(Wrappers.<UserCount>lambdaUpdate()
.eq(UserCount::getUserId, record.getUserId())
.set(UserCount::getImCount, record.getImCount())
.set(UserCount::getImRefreshTime, LocalDateTime.now()));
}
if(CollectionUtil.isEmpty(records)){
break;
}
}
}
@Override
public IPage<AnchorImCountDayAdminVO> pageAdmin(AnchorImCountDayAdminVO bo, PageQuery pageQuery) {
return baseMapper.pageAdmin(pageQuery.build(),bo);
}
@Override
public void incCount(Long userId){
try {
String redisKey = getRedisKey(LocalDate.now());
RMap<Long, Long> map = redissonClient.getMap(redisKey);
Long newScore = map.addAndGet(userId, 1);
if(newScore == 1){
map.expire(5, TimeUnit.DAYS);
}
}catch (Exception e){
log.error("主播自增im发言失败",e);
}
}
@Override
public void refreshCount(LocalDate localDate){
String redisKey = getRedisKey(localDate);
RMap<Long, Long> map = redissonClient.getMap(redisKey);
Map<Long, Long> longMap = map.readAllMap();
for (Map.Entry<Long, Long> entry : longMap.entrySet()) {
Long userId = entry.getKey();
Long imCount = entry.getValue();
AnchorImCountDay one = this.getOne(Wrappers.lambdaQuery(AnchorImCountDay.class)
.eq(AnchorImCountDay::getCountDate, localDate)
.eq(AnchorImCountDay::getUserId, userId));
if(one != null){
this.update(Wrappers.lambdaUpdate(AnchorImCountDay.class)
.eq(AnchorImCountDay::getId, one.getId())
.set(AnchorImCountDay::getImCount, imCount));
}else{
one = new AnchorImCountDay();
one.setImCount(imCount);
one.setUserId(userId);
one.setRefreshTime(LocalDateTime.now());
this.save(one);
}
}
}
private String getRedisKey(LocalDate localDate){
String now = localDate.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
return String.format("cai:anchorImCountDay:%s",now);
}
}