This commit is contained in:
张良(004796)
2024-02-04 18:52:07 +08:00
parent 684216368c
commit 9e29c5f321
22 changed files with 700 additions and 11 deletions

View File

@@ -0,0 +1,148 @@
package com.ruoyi.cai.rank;
import com.ruoyi.cai.constant.RedisHttpConstant;
import com.ruoyi.cai.enums.rank.RankTimeTypeEnum;
import com.ruoyi.cai.rank.bean.RankAdminBean;
import com.ruoyi.cai.rank.bean.RankAdminNode;
import org.redisson.api.RScoredSortedSet;
import org.redisson.api.RedissonClient;
import org.redisson.client.protocol.ScoredEntry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* 充值和提现
* 排行榜 后台管理专用, 暂时没有做持久化
*/
@Component
public class RankAdminManager {
@Autowired
private RedissonClient redissonClient;
public static final String WITHDRAW_RANK_REDIS = RedisHttpConstant.WITHDRAW_RANK_REDIS;
public static final String RECHARGE_RANK_REDIS = RedisHttpConstant.RECHARGE_RANK_REDIS;
private String dateString(LocalDate time){
return time.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
}
/**
* 获取key
* @param time 时间
* @return
*/
private String getWithdrawKey(LocalDate time, RankTimeTypeEnum rankTimeTypeEnum){
String typeStr;
if(rankTimeTypeEnum == RankTimeTypeEnum.DAY){
typeStr = dateString(time);
}else if(rankTimeTypeEnum == RankTimeTypeEnum.WEEK){
LocalDate monday = time.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
LocalDate sunday = time.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
String mondayStr = dateString(monday);
String sundayStr = dateString(sunday);
typeStr = mondayStr+"-"+sundayStr;
}else if(rankTimeTypeEnum == RankTimeTypeEnum.MONTH){
typeStr = time.format(DateTimeFormatter.ofPattern("yyyyMM"));
}else if(rankTimeTypeEnum == RankTimeTypeEnum.TOTAL){
typeStr = RankTimeTypeEnum.TOTAL.getCode();
}else {
return null;
}
return String.format(WITHDRAW_RANK_REDIS,rankTimeTypeEnum.getCode(),typeStr);
}
private String getRechargeKey(LocalDate time,RankTimeTypeEnum rankTimeTypeEnum){
String typeStr;
if(rankTimeTypeEnum == RankTimeTypeEnum.DAY){
typeStr = dateString(time);
}else if(rankTimeTypeEnum == RankTimeTypeEnum.WEEK){
LocalDate monday = time.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
LocalDate sunday = time.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
String mondayStr = dateString(monday);
String sundayStr = dateString(sunday);
typeStr = mondayStr+"-"+sundayStr;
}else if(rankTimeTypeEnum == RankTimeTypeEnum.MONTH){
typeStr = time.format(DateTimeFormatter.ofPattern("yyyyMM"));
}else if(rankTimeTypeEnum == RankTimeTypeEnum.TOTAL){
typeStr = RankTimeTypeEnum.TOTAL.getCode();
}else {
return null;
}
return String.format(RECHARGE_RANK_REDIS,rankTimeTypeEnum.getCode(),typeStr);
}
public void addRank(RankAdminBean dto){
if(dto.getRankType() == null){
return;
}
if(dto.getRankType() == 3){ // 3-充值榜
LocalDate localDate = dto.getHappenTime().toLocalDate();
String dayKey = getRechargeKey(localDate,RankTimeTypeEnum.DAY);
RScoredSortedSet<String> daySet = redissonClient.getScoredSortedSet(dayKey);
daySet.addScore(dto.getUserId()+"",dto.getPrice());
String weekKey = getRechargeKey(localDate,RankTimeTypeEnum.WEEK);
RScoredSortedSet<String> weekSet = redissonClient.getScoredSortedSet(weekKey);
weekSet.addScore(dto.getUserId()+"",dto.getPrice());
String monthKey = getRechargeKey(localDate,RankTimeTypeEnum.MONTH);
RScoredSortedSet<String> monthSet = redissonClient.getScoredSortedSet(monthKey);
monthSet.addScore(dto.getUserId()+"",dto.getPrice());
String totalKey = getRechargeKey(localDate,RankTimeTypeEnum.TOTAL);
RScoredSortedSet<String> totalSet = redissonClient.getScoredSortedSet(totalKey);
totalSet.addScore(dto.getUserId()+"",dto.getPrice());
}else if(dto.getRankType() == 4){ // 4=提现榜
LocalDate localDate = dto.getHappenTime().toLocalDate();
String dayKey = getWithdrawKey(localDate,RankTimeTypeEnum.DAY);
RScoredSortedSet<String> daySet = redissonClient.getScoredSortedSet(dayKey);
daySet.addScore(dto.getUserId()+"",dto.getPrice());
String weekKey = getWithdrawKey(localDate,RankTimeTypeEnum.WEEK);
RScoredSortedSet<String> weekSet = redissonClient.getScoredSortedSet(weekKey);
weekSet.addScore(dto.getUserId()+"",dto.getPrice());
String monthKey = getWithdrawKey(localDate,RankTimeTypeEnum.MONTH);
RScoredSortedSet<String> monthSet = redissonClient.getScoredSortedSet(monthKey);
monthSet.addScore(dto.getUserId()+"",dto.getPrice());
String totalKey = getWithdrawKey(localDate,RankTimeTypeEnum.TOTAL);
RScoredSortedSet<String> totalSet = redissonClient.getScoredSortedSet(totalKey);
totalSet.addScore(dto.getUserId()+"",dto.getPrice());
}
}
public List<RankAdminNode> getRechargeRank(LocalDate date, RankTimeTypeEnum rankTimeType, int limit){
List<RankAdminNode> res = new ArrayList<>();
String key = getRechargeKey(date,rankTimeType);
RScoredSortedSet<String> daySet = redissonClient.getScoredSortedSet(key);
Collection<ScoredEntry<String>> entries = daySet.entryRangeReversed(0, limit-1);
for (ScoredEntry<String> entry : entries) {
res.add(RankAdminNode.getNode(entry));
}
return res;
}
public List<RankAdminNode> getWithdrawRank(LocalDate date, RankTimeTypeEnum rankTimeType, int limit){
List<RankAdminNode> res = new ArrayList<>();
String key = getWithdrawKey(date,rankTimeType);
RScoredSortedSet<String> daySet = redissonClient.getScoredSortedSet(key);
Collection<ScoredEntry<String>> entries = daySet.entryRangeReversed(0, limit-1);
for (ScoredEntry<String> entry : entries) {
res.add(RankAdminNode.getNode(entry));
}
return res;
}
}

View File

@@ -0,0 +1,21 @@
package com.ruoyi.cai.rank.bean;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class RankAdminBean {
/**
* // 1-魅力榜
* // 2-邀请榜
* 3-充值榜
* 4-提现榜
*/
private Integer rankType;
// 受益人ID
private Long userId;
private Number price;
private LocalDateTime happenTime = LocalDateTime.now();
}

View File

@@ -0,0 +1,21 @@
package com.ruoyi.cai.rank.bean;
import lombok.Data;
import org.redisson.client.protocol.ScoredEntry;
import java.math.BigDecimal;
@Data
public class RankAdminNode {
private BigDecimal score;
private Long userId;
public RankAdminNode() {
}
public static RankAdminNode getNode(ScoredEntry<String> entry){
RankAdminNode rankNode = new RankAdminNode();
rankNode.setScore(BigDecimal.valueOf(entry.getScore()));
rankNode.setUserId(Long.valueOf(entry.getValue()));
return rankNode;
}
}