七夕活动-收送礼榜-结算榜单奖励
This commit is contained in:
@@ -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>
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
@@ -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;
|
||||
|
||||
}
|
@@ -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;
|
||||
}
|
||||
|
@@ -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){
|
||||
|
@@ -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++;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
Reference in New Issue
Block a user