斋月活动-发奖励fixed

斋月发奖励
This commit is contained in:
2025-02-22 16:32:17 +08:00
committed by khalil
parent e6b7d93c3d
commit efc098123c
6 changed files with 217 additions and 27 deletions

View File

@@ -216,6 +216,7 @@ public enum BillObjTypeEnum {
REDENVELOPE_SERVER( 145, "发出全服红包", BillTypeEnum.OUT, CurrencyEnum.DIAMOND, BillDomainTypeEnum.RED_BAG),
REDENVELOPE_BACK( 146, "全服红包退款", BillTypeEnum.IN, CurrencyEnum.DIAMOND, BillDomainTypeEnum.RED_BAG),
REDENVELOPE_SERVER_GET( 147, "收到全服红包", BillTypeEnum.IN, CurrencyEnum.DIAMOND, BillDomainTypeEnum.RED_BAG),
RAMADAN_GIFT_SEND_RANK_GOLD(148, "斋月榜单奖池金币瓜分", BillTypeEnum.IN, CurrencyEnum.DIAMOND, BillDomainTypeEnum.ACTIVITY),
;
BillObjTypeEnum(int value, String desc, BillTypeEnum type, CurrencyEnum currency, BillDomainTypeEnum domain) {

View File

@@ -0,0 +1,64 @@
package com.accompany.scheduler.ramadan;
import cn.hutool.core.date.DateUtil;
import com.accompany.business.qixi.service.QixiRankService;
import com.accompany.business.ramadan.service.RamadanGiftSendService;
import com.accompany.business.service.activity.h5.ActivityRankRuleService;
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.time.LocalDateTime;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import static com.accompany.business.constant.activity.ActivityType.RAMADAN_GIFT_SEND_GOLD_POOL;
@Component
@Slf4j
public class RamadanGiftSendTask {
@Autowired
private RamadanGiftSendService ramadanGiftSendService;
@Autowired
private ActivityRankRuleService activityRankRuleService;
@Scheduled(cron = "15 0 0 1 4 ?", zone = "Etc/GMT-3")
public void totalTaskAR(){
Date nowDate = new Date();
log.info("com.accompany.scheduler.ramadan.RamadanGiftSendTask.totalTaskAR-begin,nowDate:{}", DateUtil.formatDateTime(nowDate));
ramadanGiftSendService.totalTask(PartitionEnum.TURKEY.getId());
ramadanGiftSendService.totalTask(PartitionEnum.ARAB.getId());
log.info("com.accompany.scheduler.ramadan.RamadanGiftSendTask.totalTaskAR-end,nowDate:{}", DateUtil.formatDateTime(nowDate));
}
@Scheduled(cron = "15 0 0 1 4 ?")
public void totalTaskEN(){
Date nowDate = new Date();
log.info("com.accompany.scheduler.ramadan.RamadanGiftSendTask.totalTaskEN-begin,nowDate:{}", DateUtil.formatDateTime(nowDate));
ramadanGiftSendService.totalTask(PartitionEnum.ENGLISH.getId());
log.info("com.accompany.scheduler.ramadan.RamadanGiftSendTask.totalTaskEN-end,nowDate:{}", DateUtil.formatDateTime(nowDate));
}
@Scheduled(cron = "15 0 0 1 4 ?", zone = "Etc/GMT-3")
public void dayTaskAR(){
Date nowDate = new Date();
log.info("com.accompany.scheduler.ramadan.RamadanGiftSendTask.dayTaskAR-begin,nowDate:{}", DateUtil.formatDateTime(nowDate));
ramadanGiftSendService.dayTask(PartitionEnum.ARAB.getId(), nowDate);
ramadanGiftSendService.dayTask(PartitionEnum.TURKEY.getId(), nowDate);
log.info("com.accompany.scheduler.ramadan.RamadanGiftSendTask.dayTaskAR-end,nowDate:{}", DateUtil.formatDateTime(nowDate));
}
@Scheduled(cron = "15 0 0 1 4 ?")
public void dayTaskEN(){
Date nowDate = new Date();
log.info("com.accompany.scheduler.ramadan.RamadanGiftSendTask.dayTaskEN-begin,nowDate:{}", DateUtil.formatDateTime(nowDate));
ramadanGiftSendService.dayTask(PartitionEnum.ENGLISH.getId(), nowDate);
log.info("com.accompany.scheduler.ramadan.RamadanGiftSendTask.dayTaskEN-end,nowDate:{}", DateUtil.formatDateTime(nowDate));
}
}

View File

@@ -5,25 +5,28 @@ import com.accompany.business.constant.activity.ActivityType;
import com.accompany.business.ramadan.constant.RamadanConstant;
import com.accompany.business.ramadan.dto.RamadanGiftSendConfigDto;
import com.accompany.business.service.activity.h5.ActivityRankRuleService;
import com.accompany.business.service.purse.UserPurseService;
import com.accompany.business.service.record.BillRecordService;
import com.accompany.business.service.user.UsersService;
import com.accompany.business.vo.activity.h5.ActivityH5RankVo;
import com.accompany.business.vo.activity.h5.ActivityH5UserVo;
import com.accompany.business.vo.activity.h5.CpUserVo;
import com.accompany.business.vo.activity.h5.RamadanRankVo;
import com.accompany.common.constant.GiftTypeEnum;
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.enumeration.BillObjTypeEnum;
import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.exception.ServiceException;
import com.accompany.core.model.Users;
import com.accompany.core.service.SysConfService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import com.accompany.common.utils.StringUtils;
import org.redisson.api.RMap;
import org.redisson.api.RScoredSortedSet;
import org.redisson.api.RSet;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.StringCodec;
import org.redisson.client.protocol.ScoredEntry;
@@ -31,12 +34,13 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static com.accompany.business.constant.activity.ActivityType.*;
@@ -56,6 +60,12 @@ public class RamadanGiftSendService {
@Autowired
private RedissonClient redissonClient;
@Autowired
private UserPurseService userPurseService;
@Autowired
private BillRecordService billRecordService;
private static final String lastSendTimeAllFlag = "ALL";
public void calRamadanData(Byte giftType, Long goldNum, Long sendUid, Integer partitionId, Long luckyGiftGoldNum) {
@@ -140,13 +150,13 @@ public class RamadanGiftSendService {
activityType = RAMADAN_GIFT_SEND;
lastSendTimeMap = lastSendTimeMap(yesterdayFormat);
size = 10;
Double yesterdayFormatPoolGold = activityRankRuleService.getRankTotalNum4String(RAMADAN_GIFT_SEND_GOLD_POOL, yesterdayFormat, partitionId.toString());
Double yesterdayFormatPoolGold = activityRankRuleService.getRankTotalNum4String(RAMADAN_GIFT_SEND_GOLD_POOL_BAK, yesterdayFormat, partitionId.toString());
activityH5RankVo.setTotalGoldNum(BigDecimal.valueOf(yesterdayFormatPoolGold.longValue()));
} else if (RamadanConstant.RankType.total.ordinal() == type) {
redisKeyAppend = new String[] {partitionId.toString()};
activityType = RAMADAN_GIFT_SEND_TOTAL;
lastSendTimeMap = lastSendTimeMap(lastSendTimeAllFlag);
size = 20;
size = 30;
activityH5RankVo.setStartTimeStr(config.getStartTime().format(DateTimeUtil.datetimeFormatter));
activityH5RankVo.setEndTimeStr(config.getEndTime().format(DateTimeUtil.datetimeFormatter));
}
@@ -162,15 +172,7 @@ public class RamadanGiftSendService {
if (CollectionUtils.isEmpty(rankUserVos)) {
return ;
}
for (ActivityH5UserVo rankUserVo : rankUserVos) {
String string = lastSendTimeMap.get(uid.toString());
long timestamp = 0L;
if (StringUtils.isNotEmpty(string)) {
timestamp = Long.valueOf(size);
}
rankUserVo.setLastSendTime(timestamp);
}
rankUserVos.sort(Comparator.comparing(ActivityH5UserVo::getTotalNum).reversed().thenComparing(ActivityH5UserVo::getLastSendTime));
this.sortList(rankUserVos, lastSendTimeMap);
if (rankUserVos.size() > size) {
rankUserVos = rankUserVos.subList(0, size);
}
@@ -186,8 +188,104 @@ public class RamadanGiftSendService {
activityH5RankVo.setMyRank(activityRankRuleService.getMyRank(activityType, uid, rankUserVos, redisKeyAppend));
}
public void task(Integer partitionId) {
private void sortList(List<ActivityH5UserVo> rankUserVos, RMap<String, String> lastSendTimeMap) {
for (ActivityH5UserVo rankUserVo : rankUserVos) {
String string = lastSendTimeMap.get(rankUserVo.getUid().toString());
long timestamp = 0L;
if (StringUtils.isNotEmpty(string)) {
timestamp = Long.valueOf(string);
}
rankUserVo.setLastSendTime(timestamp);
}
rankUserVos.sort(Comparator.comparing(ActivityH5UserVo::getTotalNum).reversed().thenComparing(ActivityH5UserVo::getLastSendTime));
}
public void dayTask(Integer partitionId, Date nowDate) {
try {
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId);
ZonedDateTime zonedDateTime = DateTimeUtil.convertWithZoneId(nowDate, partitionEnum.getZoneId());
String lastDayFormat = zonedDateTime.minusDays(1).format(activityRankRuleService.dateFormatter_);
Double yesterdayPoolGold = activityRankRuleService.getRankTotalNum4String(RAMADAN_GIFT_SEND_GOLD_POOL, lastDayFormat, partitionId.toString());
List<ActivityH5UserVo> rankUserVos = activityRankRuleService.getRankUserVos(RAMADAN_GIFT_SEND, 30, lastDayFormat, partitionId.toString());
if (CollectionUtils.isEmpty(rankUserVos)) {
log.info("RamadanGiftSendService.totalTask-emptyList,partitionId:{}", partitionId);
return;
}
this.sortList(rankUserVos, lastSendTimeMap(lastSendTimeAllFlag));
if (rankUserVos.size() > 10) {
rankUserVos = rankUserVos.subList(0, 10);
}
BigDecimal topRanTenGoldNum =
BigDecimal.valueOf(rankUserVos.stream().collect(Collectors.summingDouble(ActivityH5UserVo::getTotalNum)));
Map<Long, BigDecimal> rankUserGoldRateMap = new HashMap<>();
for (ActivityH5UserVo rankUserVo : rankUserVos) {
rankUserGoldRateMap.put(rankUserVo.getUid(), BigDecimal.valueOf(rankUserVo.getTotalNum()).divide(topRanTenGoldNum, 2, RoundingMode.DOWN));
}
log.info("RamadanGiftSendService.dayTask-partitionId-{}-lastDayFormat{}-yesterdayPoolGold-{},, topRanTenGoldNum:{},rankUserGoldRateMap:{}",
partitionId, lastDayFormat,yesterdayPoolGold, topRanTenGoldNum, JSONObject.toJSONString(rankUserGoldRateMap));
Map<Long, BigDecimal> sendMap = new HashMap<>();
BigDecimal bigDecimalYesterdayPoolGold = BigDecimal.valueOf(yesterdayPoolGold);
BigDecimal needSendGold = BigDecimal.ZERO;
for (Map.Entry<Long, BigDecimal> decimalEntry : rankUserGoldRateMap.entrySet()) {
BigDecimal addGold = decimalEntry.getValue().multiply(bigDecimalYesterdayPoolGold).setScale(0, RoundingMode.DOWN);
if (addGold.doubleValue() == 0) {
continue;
}
sendMap.put(decimalEntry.getKey(), addGold);
needSendGold.add(needSendGold.add(addGold));
}
if (needSendGold.doubleValue() > yesterdayPoolGold) {
log.info("RamadanGiftSendService.dayTask-错误计算,不发奖励-partitionId-{}-lastDayFormat{}-yesterdayPoolGold-{},, topRanTenGoldNum:{},sendMap:{}",
partitionId, lastDayFormat,yesterdayPoolGold, topRanTenGoldNum, JSONObject.toJSONString(sendMap));
return;
}
for (Map.Entry<Long, BigDecimal> decimalEntry : sendMap.entrySet()) {
Long uid = decimalEntry.getKey();
RSet<Integer> rSet = activityRankRuleService.activityRewardSign(RAMADAN_GIFT_SEND_GOLD_POOL, null, lastDayFormat, partitionId);
boolean added = rSet.add(1);
BigDecimal entryValue = decimalEntry.getValue();
rSet.expire(activityRankRuleService.expire, TimeUnit.DAYS);
if (!added) {
log.info("RamadanGiftSendService.dayTask-已发放,不发奖励-partitionId-{}-lastDayFormat{}-yesterdayPoolGold-{},uid:{}, needAdd:{}",
partitionId, lastDayFormat,yesterdayPoolGold, uid, entryValue);
continue;
}
String objId = RAMADAN_GIFT_SEND_GOLD_POOL.getName() + lastDayFormat + entryValue;
userPurseService.addDiamond(uid, entryValue.doubleValue(), BillObjTypeEnum.RAMADAN_GIFT_SEND_RANK_GOLD,
(up)-> billRecordService.insertGeneralBillRecord(uid, objId, BillObjTypeEnum.RAMADAN_GIFT_SEND_RANK_GOLD, entryValue.doubleValue(), up));
}
//备份
activityRankRuleService.addTotalNum4String(RAMADAN_GIFT_SEND_GOLD_POOL_BAK, lastDayFormat, yesterdayPoolGold, partitionId.toString());
activityRankRuleService.getRankKey4String(RAMADAN_GIFT_SEND_GOLD_POOL, partitionId.toString()).remove(lastDayFormat);
//过期
activityRankRuleService.getRankKey4String(RAMADAN_GIFT_SEND_GOLD_POOL, partitionId.toString()).expire(activityRankRuleService.expire, TimeUnit.DAYS);
activityRankRuleService.getRankKey4String(RAMADAN_GIFT_SEND_GOLD_POOL_BAK, partitionId.toString()).expire(activityRankRuleService.expire, TimeUnit.DAYS);
activityRankRuleService.getRankKey(RAMADAN_GIFT_SEND, lastDayFormat, partitionId.toString()).expire(activityRankRuleService.expire, TimeUnit.DAYS);
} catch (Exception e) {
log.info("RamadanGiftSendService.totalTask-partitionId:{},e:{}", partitionId, e.getMessage(), e);
}
}
public void totalTask(Integer partitionId) {
try {
List<ActivityH5UserVo> rankUserVos = activityRankRuleService.getRankUserVos(RAMADAN_GIFT_SEND_TOTAL, 30, partitionId.toString());
if (CollectionUtils.isEmpty(rankUserVos)) {
log.info("RamadanGiftSendService.totalTask-emptyList,partitionId:{}", partitionId);
return;
}
this.sortList(rankUserVos, lastSendTimeMap(lastSendTimeAllFlag));
if (rankUserVos.size() > 3) {
rankUserVos = rankUserVos.subList(0, 3);
}
int top = 1;
for (ActivityH5UserVo rankUserVo : rankUserVos) {
activityRankRuleService.sendLevelRankAwardOnlyLevel(RAMADAN_GIFT_SEND_TOTAL, rankUserVo.getUid(), top++, "", partitionId);
}
activityRankRuleService.getRankKey(RAMADAN_GIFT_SEND_TOTAL, partitionId.toString()).expire(activityRankRuleService.expire, TimeUnit.DAYS);
} catch (Exception e) {
log.info("RamadanGiftSendService.totalTask-partitionId:{},e:{}", partitionId, e.getMessage(), e);
}
}
@@ -203,8 +301,10 @@ public class RamadanGiftSendService {
return redissonClient.getMap(ActivityH5RedisKey.ramadan_gift_last_time.getKey(currentDate), StringCodec.INSTANCE);
}
public BusiResult<Collection<ScoredEntry<String>>> poolList(Integer partitionId){
RScoredSortedSet<String> rankKey4String = activityRankRuleService.getRankKey4String(RAMADAN_GIFT_SEND_GOLD_POOL, partitionId.toString());
return BusiResult.success(rankKey4String.entryRange(0, -1));
public BusiResult<Map<String, Collection<ScoredEntry<String>>>> poolList(Integer partitionId){
Map<String, Collection<ScoredEntry<String>>> result = new HashMap<>();
result.put("now", activityRankRuleService.getRankKey4String(RAMADAN_GIFT_SEND_GOLD_POOL, partitionId.toString()).entryRange(0, -1));
result.put("history", activityRankRuleService.getRankKey4String(RAMADAN_GIFT_SEND_GOLD_POOL_BAK, partitionId.toString()).entryRange(0, -1));
return BusiResult.success(result);
}
}

View File

@@ -1,5 +1,7 @@
package com.accompany.business.ramadan;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.accompany.business.common.vo.ActivityRankVo;
import com.accompany.business.ramadan.service.RamadanGiftSendService;
import com.accompany.business.vo.activity.h5.ActivityH5RankVo;
@@ -13,6 +15,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collection;
import java.util.Date;
import java.util.Map;
import static com.accompany.common.constant.ApplicationConstant.PublicParameters.PUB_UID;
@@ -35,15 +39,29 @@ public class RamadanGiftSendController {
}
/**
*
*dateStr 对应时区时间
* @return
*/
@GetMapping("/task")
public BusiResult<Void> task(String pwd, Integer partitionId) {
@GetMapping("/dayTask")
public BusiResult<Void> dayTask(String pwd, Integer partitionId, String dateStr) {
if (!"5454353455435K".equals(pwd)) {
return BusiResult.success();
}
ramadanGiftSendService.task(partitionId);
DateTime parseDateTime = DateUtil.parseDateTime(dateStr);
ramadanGiftSendService.dayTask(partitionId, parseDateTime);
return BusiResult.success();
}
/**
*
* @return
*/
@GetMapping("/totalTask")
public BusiResult<Void> totalTask(String pwd, Integer partitionId) {
if (!"5454353455435K".equals(pwd)) {
return BusiResult.success();
}
ramadanGiftSendService.totalTask(partitionId);
return BusiResult.success();
}
@@ -52,7 +70,7 @@ public class RamadanGiftSendController {
* @return
*/
@GetMapping("/poolList")
public BusiResult<Collection<ScoredEntry<String>>> poolList(String pwd, Integer partitionId) {
public BusiResult<Map<String, Collection<ScoredEntry<String>>>> poolList(String pwd, Integer partitionId) {
if (!"5454353455435K".equals(pwd)) {
return BusiResult.success();
}

View File

@@ -23,6 +23,7 @@ public enum ActivityType {
USER_LEVEL_EXP(14, "USER LEVEL EXP", ACTIVITY_FIRST_COMMON, true),
RAMADAN_GIFT_SEND(15, "RAMADAN GIFT SEND DAY", ACTIVITY_FIRST_COMMON, false),
RAMADAN_GIFT_SEND_GOLD_POOL(15, "RAMADAN GIFT SEND DAY", ACTIVITY_FIRST_COMMON, false),
RAMADAN_GIFT_SEND_GOLD_POOL_BAK(15, "RAMADAN GIFT SEND DAY BAK", ACTIVITY_FIRST_COMMON, false),
RAMADAN_GIFT_SEND_TOTAL(16, "USER LEVEL EXP", ACTIVITY_FIRST_COMMON, true),
;

View File

@@ -122,7 +122,13 @@ public class ActivityRankRuleService {
}
public RSet<Integer> activityRewardSign(ActivityType activityType, Long uid, String currentKeyDate, Integer partitionId) {
String activityRewardSignKey = ActivityH5RedisKey.activity_reward_sign.getKey(activityType.name(), currentKeyDate, partitionId.toString(), uid.toString());
String activityRewardSignKey;
if (uid != null) {
activityRewardSignKey = ActivityH5RedisKey.activity_reward_sign.getKey(activityType.name(), currentKeyDate, partitionId.toString(), uid.toString());
} else {
activityRewardSignKey = ActivityH5RedisKey.activity_reward_sign.getKey(activityType.name(), currentKeyDate, partitionId.toString());
}
return redissonClient.getSet(activityRewardSignKey);
}