小游戏周奖池-奖池

This commit is contained in:
khalil
2025-03-04 19:25:08 +08:00
parent 985edd2154
commit a0b8dfbf0a
13 changed files with 414 additions and 24 deletions

View File

@@ -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 {

View File

@@ -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,
;

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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());
}
}

View File

@@ -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);
}
}

View File

@@ -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();
}
}

View File

@@ -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);
}
}
}

View File

@@ -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);
}
}

View File

@@ -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();
}
}

View File

@@ -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);
}
}
}