小游戏周奖池-奖池
This commit is contained in:
@@ -1410,6 +1410,9 @@ public class Constant {
|
||||
public static final String CHARGE_FLOATING_CONFIG = "charge_floating_config";
|
||||
|
||||
public static final String GUILD_APPLY_QUIT_DAY = "guild_apply_quit_day";
|
||||
|
||||
public static final String MINI_GAME_WEEK_RANK_CONFIG = "mini_game_week_rank_config";
|
||||
public static final String MINI_GAME_WEEK_JACKPOT_CONFIG = "mini_game_week_jackpot_config";
|
||||
}
|
||||
|
||||
public static class WithDrawStatus {
|
||||
|
@@ -1421,7 +1421,7 @@ public enum RedisKey {
|
||||
week_active_guild_member_gold_count,
|
||||
|
||||
//小游戏榜单
|
||||
mini_game_week_jackpot,
|
||||
mini_game_week_jackpot_pool,
|
||||
mini_game_week_user_jackpot,
|
||||
;
|
||||
|
||||
|
@@ -270,7 +270,6 @@ public enum I18nAlertEnum {
|
||||
ROOM_BOSS_MIC_UP_MSG_I18N("很遗憾,用户当前的房间贡献值未达到{0},无法上麦。"),
|
||||
|
||||
LUCKY_24_SEND_WEEK_RANK_REWARD_TIP("恭喜您获得上周超级幸运活动TOP{0},奖励已入账。"),
|
||||
|
||||
RED_ENVELOPE_GOLD_BACK("Since the lucky bag was not fully collected within 24 hrs, the remaining coins have been returned to your account."),
|
||||
RED_ENVELOPE_GIFT_BACK("Since the lucky bag was not fully collected within 24 hrs, the remaining gifts have been converted into gold coins and returned to your account."),
|
||||
RED_ENVELOPE_GOLD_RECEV("Congratulations on claimming coins*{1} from the lucky bag sent by ID:{0}"),
|
||||
@@ -281,10 +280,12 @@ public enum I18nAlertEnum {
|
||||
RAMADAN_GIFT_SEND_GOLD_SEND("瓜分奖金池:恭喜你在今日榜单中获得TOP{0},瓜分的金币已经发放到你的钱包,请注意查收。"),
|
||||
RAMADAN_GIFT_SEND_TOTAL_REWARD("恭喜你在斋月榜单中获得前三名,送您的奖励已经发放到你的背包,请注意查收。"),
|
||||
|
||||
SUPER_ADMIN_CLEAN_WARNING("你的語音房於 {0} 被系統檢測涉嫌違規,解除房間限制 {1} 分鐘並予以警告,請遵守《平台直播協議》。"),
|
||||
SUPER_ADMIN_LIMIT_WARNING("{0} 於 {1} 被系統檢測涉嫌違規,關閉房間 {2} 分鐘並予以警告,請遵守《平台直播協議》。"),
|
||||
SUPER_ADMIN_LIMIT_WARNING("你的語音房於 {0} 被系統檢測涉嫌違規,解除房間限制 {1} 分鐘並予以警告,請遵守《平台直播協議》。"),
|
||||
SUPER_ADMIN_CLEAN_WARNING("{0} 於 {1} 被系統檢測涉嫌違規,關閉房間 {2} 分鐘並予以警告,請遵守《平台直播協議》。"),
|
||||
|
||||
CHARGE_FLOATING_TIP("{0}{1} 已充值 {2} 金币"),
|
||||
|
||||
MINI_GAME_WEEK_RANK_REWARD_TIP("恭喜你获得了本周超级游戏挑战的排行榜第 {0} 名,奖励已经发放到您的背包,请注意查收。"),
|
||||
;
|
||||
|
||||
private final String defaultStr;
|
||||
|
@@ -0,0 +1,20 @@
|
||||
package com.accompany.business.dto.miniGame;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Map;
|
||||
|
||||
@Data
|
||||
public class MiniGameWeekJackpotConfigDto {
|
||||
|
||||
private Integer luckyFellowSize;
|
||||
private Map<BigDecimal, BigDecimal> ratioMap;
|
||||
|
||||
private Map<Integer, MiniGameWeekJackpotConfigDto> partitionConfig;
|
||||
|
||||
public MiniGameWeekJackpotConfigDto getPartitionRatioConfig(Integer partitionId) {
|
||||
return partitionConfig.getOrDefault(partitionId, this);
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,17 @@
|
||||
package com.accompany.business.dto.miniGame;
|
||||
|
||||
import com.accompany.business.common.dto.RewardDto;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Data
|
||||
public class MiniGameWeekRankConfigDto {
|
||||
|
||||
private Integer rankSize;
|
||||
private List<Integer> rankSettlentSizeList;
|
||||
private List<List<RewardDto>> rankRewardList;
|
||||
|
||||
}
|
@@ -10,7 +10,7 @@ import java.math.BigDecimal;
|
||||
@ApiModel
|
||||
public class MiniGameWeekJackpotRankVo extends MiniGameWeekRankVo {
|
||||
|
||||
private BigDecimal jackpot;
|
||||
private BigDecimal jackpotPool;
|
||||
private Long countdownSecond;
|
||||
@ApiModelProperty("奖金状态 0=没有,1=结算中需等待,2=可领")
|
||||
private Byte jackpotStatus;
|
||||
|
@@ -13,6 +13,8 @@ import org.springframework.context.ApplicationListener;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @author: liaozetao
|
||||
* @date: 2024/5/20 18:40
|
||||
@@ -39,7 +41,8 @@ public class MiniGameWeekJackpotRankListener implements ApplicationListener<Mini
|
||||
|
||||
Users u = usersService.getNotNullUsersByUid(record.getUid());
|
||||
|
||||
jackpotRankService.updateRank(record.getUid(), record.getCurrencyDiff().doubleValue(), record.getCreateTime(), u.getPartitionId());
|
||||
Double score = BigDecimal.valueOf(record.getCurrencyDiff()).negate().doubleValue();
|
||||
jackpotRankService.updateRank(record.getUid(), score, record.getCreateTime(), u.getPartitionId());
|
||||
|
||||
} else if (source instanceof GameGoldLog) {
|
||||
GameGoldLog log = (GameGoldLog) source;
|
||||
@@ -49,7 +52,8 @@ public class MiniGameWeekJackpotRankListener implements ApplicationListener<Mini
|
||||
|
||||
Users u = usersService.getNotNullUsersByUid(log.getUid());
|
||||
|
||||
jackpotRankService.updateRank(log.getUid(), log.getCoin().doubleValue(), log.getCreateTime(), u.getPartitionId());
|
||||
Double score = BigDecimal.valueOf(log.getCoin()).negate().doubleValue();
|
||||
jackpotRankService.updateRank(log.getUid(), score, log.getCreateTime(), u.getPartitionId());
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -40,11 +40,11 @@ public class MiniGameWeekJackpotRankService {
|
||||
String monday = mondayZdt.format(DateTimeUtil.dateFormatter);
|
||||
String lastWeekMonday = mondayZdt.minusWeeks(1L).format(DateTimeUtil.dateFormatter);
|
||||
|
||||
BigDecimal jackpot = jackpotService.getJackpot(u.getPartitionId(), monday);
|
||||
BigDecimal jackpotPool = jackpotService.getJackpotPool(u.getPartitionId(), monday);
|
||||
Byte jackpotStatus = jackpotService.getLastWeekJackpotStatus(uid, u.getPartitionId(), lastWeekMonday);
|
||||
|
||||
MiniGameWeekJackpotRankVo vo = new MiniGameWeekJackpotRankVo();
|
||||
vo.setJackpot(jackpot);
|
||||
vo.setJackpotPool(jackpotPool);
|
||||
vo.setJackpotStatus(jackpotStatus);
|
||||
vo.setCountdownSecond(countdownSecond);
|
||||
|
||||
@@ -57,4 +57,9 @@ public class MiniGameWeekJackpotRankService {
|
||||
rankService.updateRank(uid, scope, createTime, partitionId);
|
||||
jackpotService.addJackpot(uid, scope, createTime, partitionId);
|
||||
}
|
||||
|
||||
public void settlement(Integer partitionId, Date monday, boolean needFlag){
|
||||
rankService.settlement(partitionId, monday, needFlag);
|
||||
jackpotService.settlement(partitionId, monday, needFlag);
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,113 @@
|
||||
package com.accompany.business.service.rank.miniGame;
|
||||
|
||||
import com.accompany.business.dto.miniGame.MiniGameWeekJackpotConfigDto;
|
||||
import com.accompany.common.constant.Constant;
|
||||
import com.accompany.common.status.BusiStatus;
|
||||
import com.accompany.common.utils.RandomUtil;
|
||||
import com.accompany.common.utils.StringUtils;
|
||||
import com.accompany.core.enumeration.PartitionEnum;
|
||||
import com.accompany.core.exception.ServiceException;
|
||||
import com.accompany.core.service.SysConfService;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.cloud.context.scope.refresh.RefreshScopeRefreshedEvent;
|
||||
import org.springframework.context.ApplicationListener;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class MiniGameWeekJackpotRatioService implements InitializingBean, ApplicationListener<RefreshScopeRefreshedEvent> {
|
||||
|
||||
@Autowired
|
||||
private SysConfService sysConfService;
|
||||
|
||||
private final Map<Integer, BigDecimal[]> ratioArrayMap = new HashMap<>();
|
||||
private final Map<Integer, BigDecimal[]> probabilityArrayMap = new HashMap<>();
|
||||
|
||||
public BigDecimal getRatio(Long uid, Integer partitionId) {
|
||||
BigDecimal[] ratioArray = ratioArrayMap.get(partitionId);
|
||||
BigDecimal[] probabilityArray = probabilityArrayMap.get(partitionId);
|
||||
|
||||
BigDecimal random = RandomUtil.randomByRange(BigDecimal.ZERO, BigDecimal.ONE);
|
||||
int index = binarySearch(probabilityArray, random);
|
||||
if (index > ratioArray.length - 1){
|
||||
index = 0;
|
||||
}
|
||||
|
||||
BigDecimal ratio = ratioArray[index];
|
||||
log.info("[MiniGameWeekJackpotRatio] uid {} partitionId {} ratioArray {} probabilityArray {} random {} ratio {}",
|
||||
uid, partitionId, ratioArray, probabilityArray, random, ratio);
|
||||
return ratio;
|
||||
}
|
||||
|
||||
// 二分查找方法
|
||||
private int binarySearch(BigDecimal[] array, BigDecimal target) {
|
||||
int left = 0;
|
||||
int right = array.length - 1;
|
||||
|
||||
while (left <= right) {
|
||||
int mid = left + (right - left) / 2;
|
||||
int comparison = array[mid].compareTo(target);
|
||||
if (comparison == 0) {
|
||||
return mid;
|
||||
} else if (comparison < 0) {
|
||||
left = mid + 1;
|
||||
} else {
|
||||
right = mid - 1;
|
||||
}
|
||||
}
|
||||
|
||||
// 如果没有精确匹配,返回小于目标的最大索引
|
||||
return Math.min(left, array.length - 1);
|
||||
}
|
||||
|
||||
private void initProbability() {
|
||||
MiniGameWeekJackpotConfigDto config = getConfig();
|
||||
for (PartitionEnum partitionEnum: PartitionEnum.values()){
|
||||
MiniGameWeekJackpotConfigDto partitionConfig = config.getPartitionRatioConfig(partitionEnum.getId());
|
||||
|
||||
BigDecimal[] ratioArray = new BigDecimal[partitionConfig.getRatioMap().size()];
|
||||
BigDecimal[] probabilityArray = new BigDecimal[partitionConfig.getRatioMap().size()];
|
||||
|
||||
int i = 0;
|
||||
BigDecimal sum = BigDecimal.ZERO;
|
||||
for (Map.Entry<BigDecimal, BigDecimal> entry: partitionConfig.getRatioMap().entrySet()){
|
||||
ratioArray[i] = entry.getKey();
|
||||
probabilityArray[i] = sum.add(entry.getValue());
|
||||
|
||||
sum = probabilityArray[i++];
|
||||
}
|
||||
|
||||
ratioArrayMap.put(partitionEnum.getId(), ratioArray);
|
||||
probabilityArrayMap.put(partitionEnum.getId(), probabilityArray);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public MiniGameWeekJackpotConfigDto getConfig(){
|
||||
String configStr = sysConfService.getSysConfValueById(Constant.SysConfId.MINI_GAME_WEEK_JACKPOT_CONFIG);
|
||||
if (StringUtils.isBlank(configStr)){
|
||||
throw new ServiceException(BusiStatus.ALREADY_NOTEXISTS_CONFIG);
|
||||
}
|
||||
return JSON.parseObject(configStr, MiniGameWeekJackpotConfigDto.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onApplicationEvent(RefreshScopeRefreshedEvent event) {
|
||||
log.info("[MiniGameWeekJackpotService] refreshRatioMap");
|
||||
|
||||
initProbability();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
initProbability();
|
||||
}
|
||||
|
||||
}
|
@@ -1,21 +1,33 @@
|
||||
package com.accompany.business.service.rank.miniGame;
|
||||
|
||||
import com.accompany.business.common.dto.RewardDto;
|
||||
import com.accompany.business.common.vo.RewardVo;
|
||||
import com.accompany.business.dto.miniGame.MiniGameWeekJackpotConfigDto;
|
||||
import com.accompany.common.constant.Constant;
|
||||
import com.accompany.common.enums.RedisZSetEnum;
|
||||
import com.accompany.common.redis.RedisKey;
|
||||
import com.accompany.common.utils.DateTimeUtil;
|
||||
import com.accompany.core.base.SpringContextHolder;
|
||||
import com.accompany.core.enumeration.PartitionEnum;
|
||||
import com.accompany.core.util.DoubleUtil;
|
||||
import com.accompany.core.util.I18NMessageSourceUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.redisson.api.RAtomicDouble;
|
||||
import org.redisson.api.RMap;
|
||||
import org.redisson.api.RSet;
|
||||
import org.redisson.api.RedissonClient;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.time.Instant;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.Date;
|
||||
import java.util.*;
|
||||
|
||||
import static com.accompany.core.enumeration.I18nAlertEnum.LUCKY_24_SEND_WEEK_RANK_REWARD_TIP;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@@ -23,31 +35,34 @@ public class MiniGameWeekJackpotService {
|
||||
|
||||
@Autowired
|
||||
private RedissonClient redissonClient;
|
||||
@Autowired
|
||||
private MiniGameWeekJackpotRatioService ratioService;
|
||||
|
||||
public BigDecimal getJackpot(Integer partitionId, String monday) {
|
||||
RAtomicDouble jackpot = getAtomicJackpot(partitionId, monday);
|
||||
return BigDecimal.valueOf(jackpot.get()).setScale(2, RoundingMode.DOWN);
|
||||
|
||||
public BigDecimal getJackpotPool(Integer partitionId, String monday) {
|
||||
RAtomicDouble jackpotPool = getAtomicJackpotPool(partitionId, monday);
|
||||
return BigDecimal.valueOf(jackpotPool.get()).setScale(2, RoundingMode.DOWN);
|
||||
}
|
||||
|
||||
public void addJackpot(Long uid, Double scope, Date createTime, Integer partitionId) {
|
||||
Double ratio = getRatio(uid, partitionId, scope);
|
||||
Double amount = DoubleUtil.mul(scope, ratio);
|
||||
public void addJackpot(Long uid, Double score, Date createTime, Integer partitionId) {
|
||||
BigDecimal ratio = getRatio(uid, partitionId);
|
||||
Double amount = BigDecimal.valueOf(score).multiply(ratio).setScale(2, RoundingMode.DOWN).doubleValue();
|
||||
|
||||
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId);
|
||||
ZonedDateTime zdt = DateTimeUtil.convertWithZoneId(createTime, partitionEnum.getZoneId());
|
||||
String monday = zdt.format(DateTimeUtil.dateFormatter);
|
||||
Double afterJackpot = getAtomicJackpot(partitionId, monday).addAndGet(amount);
|
||||
Double beforeJackpot = DoubleUtil.sub(afterJackpot, amount);
|
||||
log.info("[MiniGameWeekJackpot] addAmount uid {} partitionId {} scope {} ratio {} beforeJackpot {} amount {} afterJackpot {}",
|
||||
uid, partitionId, scope, ratio, beforeJackpot, amount, afterJackpot);
|
||||
Double afterJackpotPool = getAtomicJackpotPool(partitionId, monday).addAndGet(amount);
|
||||
Double beforeJackpotPool = DoubleUtil.sub(afterJackpotPool, amount);
|
||||
log.info("[MiniGameWeekJackpot] addAmount uid {} partitionId {} score {} ratio {} beforeJackpotPool {} amount {} afterJackpotPool {}",
|
||||
uid, partitionId, score, ratio, beforeJackpotPool, amount, afterJackpotPool);
|
||||
}
|
||||
|
||||
private Double getRatio(Long uid, Integer partitionId, Double scope) {
|
||||
return 1D;
|
||||
private BigDecimal getRatio(Long uid, Integer partitionId) {
|
||||
return ratioService.getRatio(uid, partitionId);
|
||||
}
|
||||
|
||||
private RAtomicDouble getAtomicJackpot(Integer partitionId, String monday){
|
||||
return redissonClient.getAtomicDouble(RedisKey.mini_game_week_jackpot.getKey(monday, partitionId.toString()));
|
||||
private RAtomicDouble getAtomicJackpotPool(Integer partitionId, String monday){
|
||||
return redissonClient.getAtomicDouble(RedisKey.mini_game_week_jackpot_pool.getKey(monday, partitionId.toString()));
|
||||
}
|
||||
|
||||
public Byte getLastWeekJackpotStatus(Long uid, Integer partitionId, String lastMonday) {
|
||||
@@ -59,4 +74,36 @@ public class MiniGameWeekJackpotService {
|
||||
return redissonClient.getMap(RedisKey.mini_game_week_user_jackpot.getKey(monday, partitionId.toString()));
|
||||
}
|
||||
|
||||
public void settlement(Integer partitionId, Date monday, boolean needFlag) {
|
||||
MiniGameWeekJackpotConfigDto config = ratioService.getConfig();
|
||||
|
||||
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId);
|
||||
ZonedDateTime zdt = DateTimeUtil.convertWithZoneId(monday, partitionEnum.getZoneId());
|
||||
String mondayStr = zdt.format(DateTimeUtil.dateFormatter);
|
||||
BigDecimal jackpotPool = getJackpotPool(partitionId, mondayStr);
|
||||
|
||||
long rankSize = config.getLuckyFellowSize();
|
||||
Set<Map<String, Object>> rank = SpringContextHolder.getBean(MiniGameWeekRankService.class).getRank(monday, 0L, rankSize - 1L, partitionId);
|
||||
if (CollectionUtils.isEmpty(rank)){
|
||||
return;
|
||||
}
|
||||
|
||||
BigDecimal totalScore = BigDecimal.ZERO;
|
||||
Map<Long, BigDecimal> userRatioMap = new LinkedHashMap<>();
|
||||
for (Map<String, Object> entry : rank){
|
||||
Long uid = Long.parseLong(entry.get(RedisZSetEnum.member.name()).toString());
|
||||
BigDecimal score = new BigDecimal(entry.get(RedisZSetEnum.score.name()).toString());
|
||||
userRatioMap.put(uid, score);
|
||||
totalScore = totalScore.add(score);
|
||||
}
|
||||
|
||||
for (Map.Entry<Long, BigDecimal> entry : userRatioMap.entrySet()){
|
||||
Long uid = entry.getKey();
|
||||
BigDecimal score = entry.getValue();
|
||||
BigDecimal ratio = score.divide(totalScore, 2, RoundingMode.DOWN);
|
||||
BigDecimal diamond = jackpotPool.multiply(ratio).setScale(0, RoundingMode.DOWN);
|
||||
log.info("[MiniGameWeekJackpot] uid {} score {} totalScore {} ratio {} jackpot {} diamond {}",
|
||||
uid, score, totalScore, ratio, jackpotPool, diamond);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,20 +1,43 @@
|
||||
package com.accompany.business.service.rank.miniGame;
|
||||
|
||||
import com.accompany.business.common.constant.RewardTypeEnum;
|
||||
import com.accompany.business.common.dto.RewardDto;
|
||||
import com.accompany.business.common.vo.RewardVo;
|
||||
import com.accompany.business.dto.miniGame.MiniGameWeekRankConfigDto;
|
||||
import com.accompany.business.service.SendSysMsgService;
|
||||
import com.accompany.business.service.rank.IWeekRank;
|
||||
import com.accompany.business.service.user.UsersService;
|
||||
import com.accompany.business.util.RewardUtil;
|
||||
import com.accompany.business.util.VipUtil;
|
||||
import com.accompany.business.vo.lucky.Lucky24WeekRankItemVo;
|
||||
import com.accompany.business.vo.miniGame.MiniGameWeekRankItemVo;
|
||||
import com.accompany.business.vo.miniGame.MiniGameWeekRankVo;
|
||||
import com.accompany.common.constant.Constant;
|
||||
import com.accompany.common.enums.RedisZSetEnum;
|
||||
import com.accompany.common.redis.RedisKey;
|
||||
import com.accompany.common.status.BusiStatus;
|
||||
import com.accompany.common.utils.DateTimeUtil;
|
||||
import com.accompany.common.utils.StringUtils;
|
||||
import com.accompany.core.exception.ServiceException;
|
||||
import com.accompany.core.model.Users;
|
||||
import com.accompany.core.service.SysConfService;
|
||||
import com.accompany.core.util.I18NMessageSourceUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.redisson.api.RMap;
|
||||
import org.redisson.api.RSet;
|
||||
import org.redisson.api.RedissonClient;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.Instant;
|
||||
import java.util.*;
|
||||
|
||||
import static com.accompany.core.enumeration.I18nAlertEnum.LUCKY_24_SEND_WEEK_RANK_REWARD_TIP;
|
||||
|
||||
/**
|
||||
* @author: liaozetao
|
||||
* @date: 2024/5/21 11:36
|
||||
@@ -26,6 +49,14 @@ public class MiniGameWeekRankService extends AbstractMiniGameRankService impleme
|
||||
|
||||
@Autowired
|
||||
private UsersService usersService;
|
||||
@Autowired
|
||||
private SysConfService sysConfService;
|
||||
@Autowired
|
||||
private RedissonClient redissonClient;
|
||||
@Autowired
|
||||
private RewardUtil rewardUtil;
|
||||
@Autowired
|
||||
private SendSysMsgService sendSysMsgService;
|
||||
|
||||
public MiniGameWeekRankVo getRankVo(Date date, Integer partitionId, Long uid) {
|
||||
|
||||
@@ -107,4 +138,69 @@ public class MiniGameWeekRankService extends AbstractMiniGameRankService impleme
|
||||
return rankVo;
|
||||
}
|
||||
|
||||
public void settlement(Integer partitionId, Date monday, boolean needFlag) {
|
||||
MiniGameWeekRankConfigDto config = getConfig();
|
||||
|
||||
List<Integer> settlementSizes = config.getRankSettlentSizeList();
|
||||
if (CollectionUtils.isEmpty(settlementSizes)){
|
||||
return;
|
||||
}
|
||||
|
||||
List<List<RewardDto>> rewardConfigList = config.getRankRewardList();
|
||||
if (CollectionUtils.isEmpty(rewardConfigList)){
|
||||
return;
|
||||
}
|
||||
|
||||
long rankSize = settlementSizes.stream().mapToLong(Integer::intValue).max().getAsLong();
|
||||
Set<Map<String, Object>> rank = getRank(monday, 0L, rankSize - 1L, partitionId);
|
||||
if (CollectionUtils.isEmpty(rank)){
|
||||
return;
|
||||
}
|
||||
|
||||
String rankKey = getRankKey(monday, partitionId);
|
||||
String sendRewardFlagKey = rankKey + "_send_reward_flag";
|
||||
RSet<String> flagSet = redissonClient.getSet(sendRewardFlagKey);
|
||||
|
||||
int rankIndex = 0;
|
||||
for (Map<String, Object> entry: rank) {
|
||||
Long uid = Long.parseLong(entry.get(RedisZSetEnum.member.name()).toString());
|
||||
|
||||
int ranking = rankIndex + 1;
|
||||
int rewardLevel = settlementSizes.stream().mapToInt(Integer::intValue).filter(level->ranking<=level).min().getAsInt();
|
||||
int rewardIndex = settlementSizes.indexOf(rewardLevel);
|
||||
List<RewardDto> rewards = rewardConfigList.get(rewardIndex);
|
||||
for (RewardDto r: rewards) {
|
||||
String uidRewardKey = uid + "_" + r.getType() + "_" + r.getRefId();
|
||||
if (needFlag && flagSet.contains(uidRewardKey)){
|
||||
continue;
|
||||
}
|
||||
|
||||
if (needFlag){
|
||||
flagSet.add(uidRewardKey);
|
||||
}
|
||||
|
||||
RewardVo rewardVo = rewardUtil.sendRewardByType(uid, r, uidRewardKey);
|
||||
log.info("[lucky24SendWeekRank] {} 达到第 {} 名 获得奖励 {}", uid, ranking, JSON.toJSONString(rewardVo));
|
||||
}
|
||||
|
||||
if (rankIndex <= 3){
|
||||
String tip = I18NMessageSourceUtil.getMessage(LUCKY_24_SEND_WEEK_RANK_REWARD_TIP, new Object[]{ranking}, partitionId);
|
||||
sendSysMsgService.sendPersonTextMsg(uid, tip);
|
||||
}
|
||||
|
||||
rankIndex++;
|
||||
}
|
||||
|
||||
Instant expireDateTime = DateTimeUtil.addMonth(monday, 1).toInstant();
|
||||
flagSet.expire(expireDateTime);
|
||||
}
|
||||
|
||||
public MiniGameWeekRankConfigDto getConfig(){
|
||||
String configStr = sysConfService.getSysConfValueById(Constant.SysConfId.MINI_GAME_WEEK_RANK_CONFIG);
|
||||
if (StringUtils.isBlank(configStr)){
|
||||
throw new ServiceException(BusiStatus.ALREADY_NOTEXISTS_CONFIG);
|
||||
}
|
||||
return JSON.parseObject(configStr, MiniGameWeekRankConfigDto.class);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -2,16 +2,33 @@ package com.accompany.business.controller.miniGame;
|
||||
|
||||
import com.accompany.business.common.BaseController;
|
||||
import com.accompany.business.service.rank.miniGame.MiniGameWeekJackpotRankService;
|
||||
import com.accompany.business.service.rank.miniGame.MiniGameWeekJackpotService;
|
||||
import com.accompany.business.service.user.UsersService;
|
||||
import com.accompany.business.vo.miniGame.MiniGameWeekJackpotRankVo;
|
||||
import com.accompany.common.annotation.Authorization;
|
||||
import com.accompany.common.result.BusiResult;
|
||||
import com.accompany.common.status.BusiStatus;
|
||||
import com.accompany.common.utils.DateTimeUtil;
|
||||
import com.accompany.common.utils.StringUtils;
|
||||
import com.accompany.core.base.SpringContextHolder;
|
||||
import com.accompany.core.enumeration.PartitionEnum;
|
||||
import com.accompany.core.exception.ServiceException;
|
||||
import com.accompany.core.model.Users;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.time.DayOfWeek;
|
||||
import java.time.Instant;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@Api(tags = "小游戏周榜奖励池")
|
||||
@RestController
|
||||
@RequestMapping("/miniGame/weekJackpotRank")
|
||||
@@ -19,6 +36,8 @@ public class MiniGameWeekJackpotRankController extends BaseController {
|
||||
|
||||
@Autowired
|
||||
private MiniGameWeekJackpotRankService jackpotRankService;
|
||||
@Autowired
|
||||
private MiniGameWeekJackpotService jackpotService;
|
||||
|
||||
@ApiOperation("获取当前排行榜")
|
||||
@Authorization
|
||||
@@ -29,4 +48,31 @@ public class MiniGameWeekJackpotRankController extends BaseController {
|
||||
return BusiResult.success(rankVo);
|
||||
}
|
||||
|
||||
@ApiOperation("加分")
|
||||
@Authorization
|
||||
@PostMapping("/addJackpot")
|
||||
public BusiResult<Void> addJackpot(String date, Double score) {
|
||||
if (StringUtils.isBlank(date) || null == score){
|
||||
throw new ServiceException(BusiStatus.PARAMERROR);
|
||||
}
|
||||
Date d = DateTimeUtil.convertStrToDate(date, DateTimeUtil.DEFAULT_DATE_PATTERN);
|
||||
Long uid = getUid();
|
||||
Users u = SpringContextHolder.getBean(UsersService.class).getNotNullUsersByUid(uid);
|
||||
jackpotService.addJackpot(uid, score, d, u.getPartitionId());
|
||||
return BusiResult.success();
|
||||
}
|
||||
|
||||
@ApiOperation("结算")
|
||||
@PostMapping("/settlement")
|
||||
public BusiResult<Void> settlement() {
|
||||
List<PartitionEnum> partitionEnumList = List.of(PartitionEnum.ENGLISH, PartitionEnum.ARAB);
|
||||
for (PartitionEnum partitionEnum: partitionEnumList){
|
||||
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of(partitionEnum.getZoneId()));
|
||||
ZonedDateTime monday = zdt.with(DayOfWeek.MONDAY);
|
||||
Date date = Date.from(Instant.ofEpochMilli(monday.toInstant().toEpochMilli()));
|
||||
jackpotRankService.settlement(partitionEnum.getId(), date, false);
|
||||
}
|
||||
return BusiResult.success();
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,38 @@
|
||||
package com.accompany.scheduler.task;
|
||||
|
||||
import com.accompany.business.service.rank.miniGame.MiniGameWeekJackpotRankService;
|
||||
import com.accompany.common.utils.DateTimeUtil;
|
||||
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;
|
||||
import java.util.List;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
public class MiniGameWeekJackpotRankTask {
|
||||
|
||||
@Autowired
|
||||
private MiniGameWeekJackpotRankService service;
|
||||
|
||||
@Scheduled(cron = "0 5 0 * * MON", zone = "Asia/Manila")
|
||||
public void settlementEn() {
|
||||
List<PartitionEnum> partitionEnumList = List.of(PartitionEnum.ENGLISH, PartitionEnum.CHINESS);
|
||||
for (PartitionEnum partitionEnum: partitionEnumList){
|
||||
Date lastMonday = DateTimeUtil.addDays(new Date(), -7);
|
||||
service.settlement(partitionEnum.getId(), lastMonday, true);
|
||||
}
|
||||
}
|
||||
|
||||
@Scheduled(cron = "0 5 0 * * MON", zone = "Asia/Riyadh")
|
||||
public void settlementAr() {
|
||||
List<PartitionEnum> partitionEnumList = List.of(PartitionEnum.ARAB, PartitionEnum.TURKEY);
|
||||
for (PartitionEnum partitionEnum: partitionEnumList){
|
||||
Date lastMonday = DateTimeUtil.addDays(new Date(), -7);
|
||||
service.settlement(partitionEnum.getId(), lastMonday, true);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user