From a0b8dfbf0a1848f3e4ca10c9c22d552e99b1068d Mon Sep 17 00:00:00 2001 From: khalil Date: Tue, 4 Mar 2025 19:25:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E6=B8=B8=E6=88=8F=E5=91=A8=E5=A5=96?= =?UTF-8?q?=E6=B1=A0-=E5=A5=96=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../accompany/common/constant/Constant.java | 3 + .../com/accompany/common/redis/RedisKey.java | 2 +- .../core/enumeration/I18nAlertEnum.java | 7 +- .../MiniGameWeekJackpotConfigDto.java | 20 ++++ .../miniGame/MiniGameWeekRankConfigDto.java | 17 +++ .../miniGame/MiniGameWeekJackpotRankVo.java | 2 +- .../MiniGameWeekJackpotRankListener.java | 8 +- .../MiniGameWeekJackpotRankService.java | 9 +- .../MiniGameWeekJackpotRatioService.java | 113 ++++++++++++++++++ .../miniGame/MiniGameWeekJackpotService.java | 77 +++++++++--- .../miniGame/MiniGameWeekRankService.java | 96 +++++++++++++++ .../MiniGameWeekJackpotRankController.java | 46 +++++++ .../task/MiniGameWeekJackpotRankTask.java | 38 ++++++ 13 files changed, 414 insertions(+), 24 deletions(-) create mode 100644 accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/miniGame/MiniGameWeekJackpotConfigDto.java create mode 100644 accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/miniGame/MiniGameWeekRankConfigDto.java create mode 100644 accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/rank/miniGame/MiniGameWeekJackpotRatioService.java create mode 100644 accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/MiniGameWeekJackpotRankTask.java diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/common/constant/Constant.java b/accompany-base/accompany-core/src/main/java/com/accompany/common/constant/Constant.java index 2eb34e379..88d758925 100644 --- a/accompany-base/accompany-core/src/main/java/com/accompany/common/constant/Constant.java +++ b/accompany-base/accompany-core/src/main/java/com/accompany/common/constant/Constant.java @@ -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 { diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/common/redis/RedisKey.java b/accompany-base/accompany-core/src/main/java/com/accompany/common/redis/RedisKey.java index 1555502da..d2e30487a 100644 --- a/accompany-base/accompany-core/src/main/java/com/accompany/common/redis/RedisKey.java +++ b/accompany-base/accompany-core/src/main/java/com/accompany/common/redis/RedisKey.java @@ -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, ; diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/core/enumeration/I18nAlertEnum.java b/accompany-base/accompany-core/src/main/java/com/accompany/core/enumeration/I18nAlertEnum.java index 8728e0a98..3057a6374 100644 --- a/accompany-base/accompany-core/src/main/java/com/accompany/core/enumeration/I18nAlertEnum.java +++ b/accompany-base/accompany-core/src/main/java/com/accompany/core/enumeration/I18nAlertEnum.java @@ -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; diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/miniGame/MiniGameWeekJackpotConfigDto.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/miniGame/MiniGameWeekJackpotConfigDto.java new file mode 100644 index 000000000..c1225b467 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/miniGame/MiniGameWeekJackpotConfigDto.java @@ -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 ratioMap; + + private Map partitionConfig; + + public MiniGameWeekJackpotConfigDto getPartitionRatioConfig(Integer partitionId) { + return partitionConfig.getOrDefault(partitionId, this); + } + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/miniGame/MiniGameWeekRankConfigDto.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/miniGame/MiniGameWeekRankConfigDto.java new file mode 100644 index 000000000..407bc2f33 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/miniGame/MiniGameWeekRankConfigDto.java @@ -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 rankSettlentSizeList; + private List> rankRewardList; + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/miniGame/MiniGameWeekJackpotRankVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/miniGame/MiniGameWeekJackpotRankVo.java index a05339a95..b0a2c72f0 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/miniGame/MiniGameWeekJackpotRankVo.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/miniGame/MiniGameWeekJackpotRankVo.java @@ -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; diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/event/listener/miniGame/MiniGameWeekJackpotRankListener.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/event/listener/miniGame/MiniGameWeekJackpotRankListener.java index f37acced2..4294b7af2 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/event/listener/miniGame/MiniGameWeekJackpotRankListener.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/event/listener/miniGame/MiniGameWeekJackpotRankListener.java @@ -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 { + + @Autowired + private SysConfService sysConfService; + + private final Map ratioArrayMap = new HashMap<>(); + private final Map 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 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(); + } + +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/rank/miniGame/MiniGameWeekJackpotService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/rank/miniGame/MiniGameWeekJackpotService.java index c554a4d6d..a904fb92e 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/rank/miniGame/MiniGameWeekJackpotService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/rank/miniGame/MiniGameWeekJackpotService.java @@ -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> rank = SpringContextHolder.getBean(MiniGameWeekRankService.class).getRank(monday, 0L, rankSize - 1L, partitionId); + if (CollectionUtils.isEmpty(rank)){ + return; + } + + BigDecimal totalScore = BigDecimal.ZERO; + Map userRatioMap = new LinkedHashMap<>(); + for (Map 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 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); + } + } } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/rank/miniGame/MiniGameWeekRankService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/rank/miniGame/MiniGameWeekRankService.java index eae070e37..61429bf82 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/rank/miniGame/MiniGameWeekRankService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/rank/miniGame/MiniGameWeekRankService.java @@ -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 settlementSizes = config.getRankSettlentSizeList(); + if (CollectionUtils.isEmpty(settlementSizes)){ + return; + } + + List> rewardConfigList = config.getRankRewardList(); + if (CollectionUtils.isEmpty(rewardConfigList)){ + return; + } + + long rankSize = settlementSizes.stream().mapToLong(Integer::intValue).max().getAsLong(); + Set> rank = getRank(monday, 0L, rankSize - 1L, partitionId); + if (CollectionUtils.isEmpty(rank)){ + return; + } + + String rankKey = getRankKey(monday, partitionId); + String sendRewardFlagKey = rankKey + "_send_reward_flag"; + RSet flagSet = redissonClient.getSet(sendRewardFlagKey); + + int rankIndex = 0; + for (Map 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 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); + } + } diff --git a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/miniGame/MiniGameWeekJackpotRankController.java b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/miniGame/MiniGameWeekJackpotRankController.java index 3920c3b21..927f1f35e 100644 --- a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/miniGame/MiniGameWeekJackpotRankController.java +++ b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/miniGame/MiniGameWeekJackpotRankController.java @@ -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 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 settlement() { + List 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(); + } + } diff --git a/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/MiniGameWeekJackpotRankTask.java b/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/MiniGameWeekJackpotRankTask.java new file mode 100644 index 000000000..037960ede --- /dev/null +++ b/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/MiniGameWeekJackpotRankTask.java @@ -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 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 partitionEnumList = List.of(PartitionEnum.ARAB, PartitionEnum.TURKEY); + for (PartitionEnum partitionEnum: partitionEnumList){ + Date lastMonday = DateTimeUtil.addDays(new Date(), -7); + service.settlement(partitionEnum.getId(), lastMonday, true); + } + } +}