七夕活动-收送礼榜-结算榜单奖励

This commit is contained in:
khalil
2023-08-10 01:34:18 +08:00
parent 4a9ff2beb3
commit 1a2abaad48
8 changed files with 181 additions and 0 deletions

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.accompany</groupId>
<artifactId>accompany-business-festival-activity</artifactId>
<version>${revision}</version>
</parent>
<artifactId>festival-activity-scheduler</artifactId>
<dependencies>
<dependency>
<groupId>com.accompany</groupId>
<artifactId>festival-activity-service</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

View File

@@ -0,0 +1,22 @@
package com.accompany.business.qixi;
import com.accompany.business.qixi.service.QixiRankService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class QixiRankTask {
@Autowired
private QixiRankService service;
@Scheduled(cron = "0 0 1 * * ?")
public void settlement(){
LocalDateTime now = LocalDateTime.now();
service.settlement(now);
}
}

View File

@@ -0,0 +1,12 @@
package com.accompany.business.common.dto;
import lombok.Data;
@Data
public class RewardDto {
private Byte type;
private Integer refId;
private Integer num;
}

View File

@@ -1,9 +1,12 @@
package com.accompany.business.qixi.dto;
import com.accompany.business.common.dto.RewardDto;
import com.accompany.business.common.dto.TimeRangeActConfigDto;
import lombok.Data;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Data
@@ -13,6 +16,9 @@ public class QixiRankConfigDto extends TimeRangeActConfigDto {
private Double activityGiftScorePercent;
private Set<Integer> activityGiftId = new HashSet<>();
private Map<Byte, Integer> rankSettlentSizeMap;
private Map<Byte, List<List<RewardDto>>> rankRewardMap;
public Double getScorePercent(Integer giftId){
return activityGiftId.contains(giftId)? activityGiftScorePercent : normalGiftScorePercent;
}

View File

@@ -1,5 +1,6 @@
package com.accompany.business.qixi.common;
import com.accompany.business.common.dto.RewardDto;
import com.accompany.business.model.CarGoods;
import com.accompany.business.model.Gift;
import com.accompany.business.model.Headwear;
@@ -47,6 +48,25 @@ public class RewardUtil {
private CarPayService carPayService;
@Async
public void sendRewardByType(Long uid, RewardDto reward, String remark) {
RewardTypeEnum typeEnum = RewardTypeEnum.get(reward.getType());
if (null == typeEnum){
throw new ServiceException(BusiStatus.PARAMERROR);
}
sendRewardByType(uid, typeEnum, reward.getRefId(), reward.getNum(), remark);
}
@Async
public void sendRewardByType(Long uid, Byte type, Integer refId, Integer num, String remark) {
RewardTypeEnum typeEnum = RewardTypeEnum.get(type);
if (null == typeEnum){
throw new ServiceException(BusiStatus.PARAMERROR);
}
sendRewardByType(uid, typeEnum, refId, num, remark);
}
public void sendRewardByType(Long uid, RewardTypeEnum typeEnum, Integer refId, Integer num, String remark) {
log.info("[发送活动道具] 记录入参 {} {} {} {} {}", uid, typeEnum, refId, num, remark);
switch (typeEnum){

View File

@@ -4,26 +4,35 @@ import com.accompany.business.common.vo.ActivityDateRankVo;
import com.accompany.business.common.vo.ActivityRankItemVo;
import com.accompany.business.common.vo.ActivityRankVo;
import com.accompany.business.model.HallMember;
import com.accompany.business.common.dto.RewardDto;
import com.accompany.business.qixi.common.RewardUtil;
import com.accompany.business.qixi.constant.QixiConstant;
import com.accompany.business.qixi.dto.QixiRankConfigDto;
import com.accompany.business.qixi.dto.QixiRoomRankConfigDto;
import com.accompany.business.service.hall.HallService;
import com.accompany.business.service.user.UsersService;
import com.accompany.business.util.SpringContextHolder;
import com.accompany.common.constant.Constant;
import com.accompany.common.status.BusiStatus;
import com.accompany.common.utils.DateTimeUtil;
import com.accompany.core.exception.ServiceException;
import com.accompany.core.model.Users;
import com.accompany.core.service.SysConfService;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RScoredSortedSet;
import org.redisson.api.RSet;
import org.redisson.api.RedissonClient;
import org.redisson.client.protocol.ScoredEntry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -42,6 +51,8 @@ public class QixiRankService {
private UsersService usersService;
@Autowired
private HallService hallService;
@Autowired
private RewardUtil rewardUtil;
public ActivityRankVo getRank(Long uid, Byte rankType, String date) {
@@ -193,4 +204,80 @@ public class QixiRankService {
return JSON.parseObject(configStr, QixiRoomRankConfigDto.class);
}
public void settlement(LocalDateTime now) {
QixiRankConfigDto config = getConfig();
String yesterDayStr = now.minusDays(1L).format(DateTimeFormatter.ofPattern(DateTimeUtil.DEFAULT_DATE_PATTERN));
List<Byte> rankTypes = new ArrayList<>();
if (config.inActTimeRange(now)){
rankTypes.add(QixiConstant.RankKey.HONEY_DAY);
rankTypes.add(QixiConstant.RankKey.LOVE_DAY);
} else if (Duration.between(now, config.getEndTime()).toDays() == 0L){
rankTypes.add(QixiConstant.RankKey.HONEY_DAY);
rankTypes.add(QixiConstant.RankKey.LOVE_DAY);
rankTypes.add(QixiConstant.RankKey.HONEY_TOTAL);
rankTypes.add(QixiConstant.RankKey.LOVE_TOTAL);
}
if (CollectionUtils.isEmpty(rankTypes)){
return;
}
for (Byte rankType: rankTypes) {
SpringContextHolder.getBean(QixiRankService.class).sendRankReward(config, rankType, yesterDayStr);
}
}
@Async
public void sendRankReward(QixiRankConfigDto config, Byte rankType, String date) {
if (CollectionUtils.isEmpty(config.getRankRewardMap())
|| CollectionUtils.isEmpty(config.getRankSettlentSizeMap())){
return;
}
String rankKey = getRankKey(rankType, date, config);
RScoredSortedSet<Long> rank = redissonClient.getScoredSortedSet(rankKey);
Integer settlementSize = config.getRankSettlentSizeMap().get(rankType);
if (null == settlementSize){
return;
}
Collection<ScoredEntry<Long>> uidScoreList = rank.entryRangeReversed(0, settlementSize - 1);
if (CollectionUtils.isEmpty(uidScoreList)){
//todo log error
return;
}
List<List<RewardDto>> rewardConfigList = config.getRankRewardMap().get(rankType);
if (CollectionUtils.isEmpty(rewardConfigList)){
return;
}
String sendRewardFlagKey = rankKey + "_send_reward_flag";
RSet<String> a = redissonClient.getSet(sendRewardFlagKey);
int rankIndex = 0;
for (ScoredEntry<Long> rankItem: uidScoreList) {
Long uid = rankItem.getValue();
int rewardIndex = Math.min(rankIndex, rewardConfigList.size()-1);
List<RewardDto> rewards = rewardConfigList.get(rewardIndex);
for (RewardDto r: rewards) {
String uidRewardKey = uid + "_" + r.getType() + "_" + r.getRefId();
if (a.contains(uidRewardKey)){
continue;
}
rewardUtil.sendRewardByType(uid, r, "2023七夕活动-收送礼榜奖励结算");
log.info("[2023七夕活动]-收送礼榜 {} 发奖励, 第 {} 名 {} 奖励 {}", rankKey, rankIndex, uid, JSON.toJSONString(r));
a.add(uidRewardKey);
}
rankIndex++;
}
}
}

View File

@@ -17,6 +17,7 @@
<module>accompany-business-community</module>
<module>accompany-business-world</module>
<module>accompany-business-festival-activity</module>
<module>accompany-business-festival-activity/festival-activity-scheduler</module>
</modules>
<dependencies>

View File

@@ -18,6 +18,11 @@
<artifactId>accompany-business-service</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>com.accompany</groupId>
<artifactId>festival-activity-web</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>