主播周奖励-在麦时长-拆分等级内奖励和额外奖励的状态

This commit is contained in:
2025-08-28 16:13:46 +08:00
parent c4ea3afe78
commit 7b93bb28ee
10 changed files with 235 additions and 258 deletions

View File

@@ -28,7 +28,7 @@ public class FamilyMemberWeekLevelRewardStatAdminVo {
@ExcelProperty("主播昵称")
private String nick;
@ExcelProperty("周奖励等级")
private Integer level;
private String level;
@ExcelProperty("钻石流水")
private BigDecimal processNum;
@ExcelProperty("已获得金币")

View File

@@ -1,17 +1,11 @@
package com.accompany.admin.service;
import com.accompany.admin.vo.FamilyMemberWeekLevelRewardStatAdminVo;
import com.accompany.business.model.family.Family;
import com.accompany.business.model.family.FamilyMember;
import com.accompany.business.model.family.FamilyMemberWeekLevelReward;
import com.accompany.business.model.guild.Guild;
import com.accompany.business.model.guild.GuildMember;
import com.accompany.business.model.guild.GuildMemberWeekLevelReward;
import com.accompany.business.mybatismapper.family.FamilyMapper;
import com.accompany.business.mybatismapper.family.FamilyMemberMapper;
import com.accompany.business.mybatismapper.guild.GuildMapper;
import com.accompany.business.mybatismapper.guild.GuildMemberMapper;
import com.accompany.business.service.family.FamilyMemberWeekLevelRewardService;
import com.accompany.business.service.guild.GuildMemberWeekLevelRewardService;
import com.accompany.business.service.user.UsersService;
import com.accompany.common.constant.Constant;
@@ -41,12 +35,6 @@ public class FamilyMemberWeekLevelRewardRecordAdminService {
@Autowired
private UsersService usersService;
@Autowired
private FamilyMemberWeekLevelRewardService familyMemberWeekLevelRewardService;
@Autowired
private FamilyMemberMapper familyMemberMapper;
@Autowired
private FamilyMapper familyMapper;
@Autowired
private GuildMemberWeekLevelRewardService guildMemberWeekLevelRewardService;
@Autowired
private GuildMemberMapper guildMemberMapper;
@@ -60,7 +48,7 @@ public class FamilyMemberWeekLevelRewardRecordAdminService {
int pageNo, int pageSize) {
PartitionInfo partitionInfo = partitionInfoService.getById(partitionId);
if (null == partitionInfo
|| (!Constant.ClanMode.FAMILY.equals(partitionInfo.getClanMode()) && !Constant.ClanMode.GUILD.equals(partitionInfo.getClanMode())
|| (!Constant.ClanMode.GUILD.equals(partitionInfo.getClanMode())
&& !Constant.ClanMode.GUILD_POLICY2.equals(partitionInfo.getClanMode()))){
throw new AdminServiceException(BusiStatus.PARAMERROR);
} else if (!StringUtils.hasText(cycleDate)) {
@@ -78,191 +66,97 @@ public class FamilyMemberWeekLevelRewardRecordAdminService {
uid = u.getUid();
}
if (Constant.ClanMode.FAMILY.equals(partitionInfo.getClanMode())){
Page<FamilyMember> poPage = new Page<>(pageNo, pageSize);
LambdaQueryWrapper<FamilyMember> queryWrapper = Wrappers.<FamilyMember>lambdaQuery()
.eq(null != uid, FamilyMember::getUid, uid);
familyMemberMapper.selectPage(poPage, queryWrapper);
Page<GuildMember> poPage = new Page<>(pageNo, pageSize);
LambdaQueryWrapper<GuildMember> queryWrapper = Wrappers.<GuildMember>lambdaQuery()
.eq(null != uid, GuildMember::getUid, uid);
guildMemberMapper.selectPage(poPage, queryWrapper);
if (CollectionUtils.isEmpty(poPage.getRecords())){
return voPage;
}
Set<Long> uidSet = poPage.getRecords().stream().map(FamilyMember::getUid).collect(Collectors.toSet());
List<Long> familyMemberIdList = poPage.getRecords().stream().map(FamilyMember::getId).collect(Collectors.toList());
Map<Long, FamilyMember> familyMemberMap = poPage.getRecords().stream().collect(Collectors.toMap(FamilyMember::getId, f->f));
List<Integer> familyIdList = familyMemberMap.values().stream().map(FamilyMember::getFamilyId).distinct().collect(Collectors.toList());
Map<Integer, Family> familyMap = familyMapper.selectByIds(familyIdList).stream().collect(Collectors.toMap(Family::getId, f->f));
List<Long> familyOwnerUid = familyMap.values().stream().map(Family::getOwnerUid).distinct().collect(Collectors.toList());
List<FamilyMemberWeekLevelReward> weekLevelRewardList = familyMemberWeekLevelRewardService.lambdaQuery()
.orderByAsc(FamilyMemberWeekLevelReward::getLevel)
.list();
Set<String> mapKeySet = familyMemberIdList.stream().map(familyMemberId->{
List<String> keyList = new ArrayList<>();
for (FamilyMemberWeekLevelReward levelReward: weekLevelRewardList){
keyList.add(String.join("_", familyMemberId.toString(), levelReward.getLevel().toString()));
}
keyList.add(String.join("_", familyMemberId.toString(), "process"));
return keyList;
}).flatMap(List::stream).collect(Collectors.toSet());
Map<String, Number> weekMap = familyMemberWeekLevelRewardService.getWeekMap(cycleDate, partitionId).getAll(mapKeySet);
uidSet.addAll(familyOwnerUid);
Map<Long, Users> usersMap = usersService.getUsersMapByUids(new ArrayList<>(uidSet));
List<FamilyMemberWeekLevelRewardStatAdminVo> voList = poPage.getRecords().stream().map(po -> {
FamilyMemberWeekLevelRewardStatAdminVo vo = new FamilyMemberWeekLevelRewardStatAdminVo();
vo.setCycleDate(cycleDate);
vo.setFamilyMemberId(po.getId());
String processKey = String.join("_", po.getId().toString(), "process");
vo.setProcessNum(BigDecimal.valueOf(weekMap.getOrDefault(processKey, 0d).doubleValue()));
int level = 0;
BigDecimal rewardNum = BigDecimal.ZERO;
BigDecimal receiverdNum = BigDecimal.ZERO;
for (FamilyMemberWeekLevelReward rewardItem: weekLevelRewardList){
String key = String.join("_", po.getId().toString(), rewardItem.getLevel().toString());
Byte status = weekMap.getOrDefault(key, Constant.status.delete).byteValue();
if (Constant.status.valid.equals(status)){
level = rewardItem.getLevel();
rewardNum = rewardNum.add(rewardItem.getRewardNum());
} else if (Constant.status.invalid.equals(status)) {
level = rewardItem.getLevel();
rewardNum = rewardNum.add(rewardItem.getRewardNum());
receiverdNum = receiverdNum.add(rewardItem.getRewardNum());
}
}
vo.setLevel(level);
vo.setRewardNum(rewardNum);
vo.setReceivedNum(receiverdNum);
vo.setUid(po.getUid());
Users u = usersMap.get(po.getUid());
if (null != u){
vo.setErbanNo(u.getErbanNo());
vo.setNick(u.getNick());
}
FamilyMember familyMember = familyMemberMap.get(po.getId());
if (null != familyMember){
vo.setFamilyId(familyMember.getFamilyId());
Family family = familyMap.get(familyMember.getFamilyId());
if (null != family){
vo.setFamilyName(family.getName());
Users owner = usersMap.get(family.getOwnerUid());
if (null != owner){
vo.setFamilyOwnerId(owner.getErbanNo());
vo.setFamilyOwnerNick(owner.getNick());
}
}
}
return vo;
}).collect(Collectors.toList());
voPage.setRecords(voList);
voPage.setTotal(poPage.getTotal());
} else {
Page<GuildMember> poPage = new Page<>(pageNo, pageSize);
LambdaQueryWrapper<GuildMember> queryWrapper = Wrappers.<GuildMember>lambdaQuery()
.eq(null != uid, GuildMember::getUid, uid);
guildMemberMapper.selectPage(poPage, queryWrapper);
if (CollectionUtils.isEmpty(poPage.getRecords())){
return voPage;
}
Set<Long> uidSet = poPage.getRecords().stream().map(GuildMember::getUid).collect(Collectors.toSet());
List<Long> guildMemberIdList = poPage.getRecords().stream().map(GuildMember::getId).collect(Collectors.toList());
Map<Long, GuildMember> guildMemberMap = poPage.getRecords().stream().collect(Collectors.toMap(GuildMember::getId, f->f));
List<Integer> guildIdList = guildMemberMap.values().stream().map(GuildMember::getGuildId).distinct().collect(Collectors.toList());
Map<Integer, Guild> guildMap = guildMapper.selectByIds(guildIdList).stream().collect(Collectors.toMap(Guild::getId, f->f));
List<Long> guildOwnerUid = guildMap.values().stream().map(Guild::getOwnerUid).distinct().collect(Collectors.toList());
List<GuildMemberWeekLevelReward> weekLevelRewardList = guildMemberWeekLevelRewardService.lambdaQuery()
.orderByAsc(GuildMemberWeekLevelReward::getLevel)
.list();
Set<String> mapKeySet = guildMemberIdList.stream().map(guildMemberId->{
List<String> keyList = new ArrayList<>();
for (GuildMemberWeekLevelReward levelReward: weekLevelRewardList){
keyList.add(String.join("_", guildMemberId.toString(), levelReward.getLevel().toString()));
}
keyList.add(String.join("_", guildMemberId.toString(), "process"));
return keyList;
}).flatMap(List::stream).collect(Collectors.toSet());
Map<String, Number> weekMap = guildMemberWeekLevelRewardService.getWeekMap(cycleDate, partitionId).getAll(mapKeySet);
uidSet.addAll(guildOwnerUid);
Map<Long, Users> usersMap = usersService.getUsersMapByUids(new ArrayList<>(uidSet));
List<FamilyMemberWeekLevelRewardStatAdminVo> voList = poPage.getRecords().stream().map(po -> {
FamilyMemberWeekLevelRewardStatAdminVo vo = new FamilyMemberWeekLevelRewardStatAdminVo();
vo.setCycleDate(cycleDate);
vo.setFamilyMemberId(po.getId());
String processKey = String.join("_", po.getId().toString(), "process");
vo.setProcessNum(BigDecimal.valueOf(weekMap.getOrDefault(processKey, 0d).doubleValue()));
int level = 0;
BigDecimal rewardNum = BigDecimal.ZERO;
BigDecimal receiverdNum = BigDecimal.ZERO;
for (GuildMemberWeekLevelReward rewardItem: weekLevelRewardList){
String key = String.join("_", po.getId().toString(), rewardItem.getLevel().toString());
Byte status = weekMap.getOrDefault(key, Constant.status.delete).byteValue();
if (Constant.status.valid.equals(status)){
level = rewardItem.getLevel();
rewardNum = rewardNum.add(rewardItem.getRewardNum());
} else if (Constant.status.invalid.equals(status)) {
level = rewardItem.getLevel();
rewardNum = rewardNum.add(rewardItem.getRewardNum());
receiverdNum = receiverdNum.add(rewardItem.getRewardNum());
}
}
vo.setLevel(level);
vo.setRewardNum(rewardNum);
vo.setReceivedNum(receiverdNum);
vo.setUid(po.getUid());
Users u = usersMap.get(po.getUid());
if (null != u){
vo.setErbanNo(u.getErbanNo());
vo.setNick(u.getNick());
}
GuildMember guildMember = guildMemberMap.get(po.getId());
if (null != guildMember){
vo.setFamilyId(guildMember.getGuildId());
Guild guild = guildMap.get(guildMember.getGuildId());
if (null != guild){
vo.setFamilyName(guild.getName());
Users owner = usersMap.get(guild.getOwnerUid());
if (null != owner){
vo.setFamilyOwnerId(owner.getErbanNo());
vo.setFamilyOwnerNick(owner.getNick());
}
}
}
return vo;
}).collect(Collectors.toList());
voPage.setRecords(voList);
voPage.setTotal(poPage.getTotal());
if (CollectionUtils.isEmpty(poPage.getRecords())){
return voPage;
}
Set<Long> uidSet = poPage.getRecords().stream().map(GuildMember::getUid).collect(Collectors.toSet());
List<Long> guildMemberIdList = poPage.getRecords().stream().map(GuildMember::getId).collect(Collectors.toList());
Map<Long, GuildMember> guildMemberMap = poPage.getRecords().stream().collect(Collectors.toMap(GuildMember::getId, f->f));
List<Integer> guildIdList = guildMemberMap.values().stream().map(GuildMember::getGuildId).distinct().collect(Collectors.toList());
Map<Integer, Guild> guildMap = guildMapper.selectByIds(guildIdList).stream().collect(Collectors.toMap(Guild::getId, f->f));
List<Long> guildOwnerUid = guildMap.values().stream().map(Guild::getOwnerUid).distinct().collect(Collectors.toList());
List<GuildMemberWeekLevelReward> weekLevelRewardList = guildMemberWeekLevelRewardService.lambdaQuery()
.orderByAsc(GuildMemberWeekLevelReward::getLevel)
.list();
Set<String> mapKeySet = guildMemberIdList.stream().map(guildMemberId->{
List<String> keyList = new ArrayList<>();
for (GuildMemberWeekLevelReward levelReward: weekLevelRewardList){
keyList.add(String.join("_", guildMemberId.toString(), levelReward.getLevel().toString()));
}
keyList.add(String.join("_", guildMemberId.toString(), "process"));
return keyList;
}).flatMap(List::stream).collect(Collectors.toSet());
Map<String, Number> weekMap = guildMemberWeekLevelRewardService.getWeekMap(cycleDate, partitionId).getAll(mapKeySet);
uidSet.addAll(guildOwnerUid);
Map<Long, Users> usersMap = usersService.getUsersMapByUids(new ArrayList<>(uidSet));
List<FamilyMemberWeekLevelRewardStatAdminVo> voList = poPage.getRecords().stream().map(po -> {
FamilyMemberWeekLevelRewardStatAdminVo vo = new FamilyMemberWeekLevelRewardStatAdminVo();
vo.setCycleDate(cycleDate);
vo.setFamilyMemberId(po.getId());
String processKey = String.join("_", po.getId().toString(), "process");
vo.setProcessNum(BigDecimal.valueOf(weekMap.getOrDefault(processKey, 0d).doubleValue()));
String level = null;
BigDecimal rewardNum = BigDecimal.ZERO;
BigDecimal receiverdNum = BigDecimal.ZERO;
for (GuildMemberWeekLevelReward rewardItem: weekLevelRewardList){
String key = String.join("_", po.getId().toString(), rewardItem.getLevel().toString());
Byte status = weekMap.getOrDefault(key, Constant.status.delete).byteValue();
if (Constant.status.valid.equals(status)){
level = rewardItem.getLevel();
rewardNum = rewardNum.add(rewardItem.getRewardNum());
} else if (Constant.status.invalid.equals(status)) {
level = rewardItem.getLevel();
rewardNum = rewardNum.add(rewardItem.getRewardNum());
receiverdNum = receiverdNum.add(rewardItem.getRewardNum());
}
}
vo.setLevel(level);
vo.setRewardNum(rewardNum);
vo.setReceivedNum(receiverdNum);
vo.setUid(po.getUid());
Users u = usersMap.get(po.getUid());
if (null != u){
vo.setErbanNo(u.getErbanNo());
vo.setNick(u.getNick());
}
GuildMember guildMember = guildMemberMap.get(po.getId());
if (null != guildMember){
vo.setFamilyId(guildMember.getGuildId());
Guild guild = guildMap.get(guildMember.getGuildId());
if (null != guild){
vo.setFamilyName(guild.getName());
Users owner = usersMap.get(guild.getOwnerUid());
if (null != owner){
vo.setFamilyOwnerId(owner.getErbanNo());
vo.setFamilyOwnerNick(owner.getNick());
}
}
}
return vo;
}).collect(Collectors.toList());
voPage.setRecords(voList);
voPage.setTotal(poPage.getTotal());
return voPage;
}

View File

@@ -63,6 +63,7 @@ public class DateTimeUtil {
public static final DateTimeFormatter datetimeFormatter = DateTimeFormatter.ofPattern(DateTimeUtil.DEFAULT_DATETIME_PATTERN);
public static final DateTimeFormatter dateHourFormatter = DateTimeFormatter.ofPattern(DateTimeUtil.DEFAULT_DATE_MINUTE_PATTERN);
public static final DateTimeFormatter hoursFormatter = DateTimeFormatter.ofPattern(DateTimeUtil.DATE_HOUR_PATTERN);
public static final DateTimeFormatter monthWithoutZeroDateFormatter = DateTimeFormatter.ofPattern(DateTimeUtil.MONTH_WITHOUT_ZERO_DATE_PATTERN);
public static final DateTimeFormatter yyyyMMdd = DateTimeFormatter.ofPattern("yyyyMMdd");

View File

@@ -7,11 +7,11 @@ import java.math.BigDecimal;
@Data
public class GuildMemberWeekLevelReward {
private Integer level;
private String level;
private Integer partitionId;
private BigDecimal processNum;
private BigDecimal rewardNum;
private Integer micDurationDay;
private BigDecimal micDurationBonus;
private Integer micValidDay;
private BigDecimal bonusNum;
}

View File

@@ -12,7 +12,7 @@ public class GuildMemberWeekLevelRewardRecord {
private Integer partitionId;
private Long uid;
private String monday;
private Integer level;
private String level;
private BigDecimal processNum;
private BigDecimal rewardNum;
private Date createTime;

View File

@@ -13,7 +13,10 @@ public class GuildMemberWeekLevelRewardItemVo {
@ApiModelProperty("id")
private String id;
@ApiModelProperty("等级")
private Integer level;
private String level;
@ApiModelProperty("上一级等级")
private String preLevel;
@ApiModelProperty("进度")
private BigDecimal processNum;
@ApiModelProperty("长度")
@@ -22,15 +25,15 @@ public class GuildMemberWeekLevelRewardItemVo {
private BigDecimal preMaxNum;
@ApiModelProperty("奖励")
private BigDecimal rewardNum;
@ApiModelProperty("在麦时长进度")
private Integer micDurationProcessNum;
@ApiModelProperty("在麦时长上限")
private Integer micDurationMaxNum;
@ApiModelProperty("在麦时长奖励")
private BigDecimal micDurationBonus;
@ApiModelProperty("状态012")
private Byte status;
@ApiModelProperty("在麦时长进度")
private Integer bonusProcessNum;
@ApiModelProperty("在麦时长上限")
private Integer bonusMaxNum;
@ApiModelProperty("在麦时长奖励")
private BigDecimal bonusRewardNum;
@ApiModelProperty("状态012")
private Byte bonusStatus;
}

View File

@@ -13,8 +13,27 @@ public class GuildMemberWeekLevelRewardVo {
@ApiModelProperty("日期范围")
private String dateRange;
@ApiModelProperty("最多奖励")
private BigDecimal totalReward = BigDecimal.ZERO;
@ApiModelProperty("倒计时秒")
private Long countDownSecond;
@ApiModelProperty
private String curLevel;
@ApiModelProperty("当前周进度")
private BigDecimal processNum;
@ApiModelProperty("当前周进度上限")
private BigDecimal maxNum;
@ApiModelProperty("当前周进度上限")
private String preLevel;
@ApiModelProperty("当前周进度上一级上限")
private BigDecimal preMaxNum;
@ApiModelProperty("当前周额外奖励进度")
private Integer bonusProcessNum;
@ApiModelProperty("当前周额外奖励进度")
private Integer bonusMaxNum;
@ApiModelProperty("每级奖励")
private List<GuildMemberWeekLevelRewardItemVo> itemList;

View File

@@ -23,7 +23,7 @@ public class GuildMemberRoomMicDayDurationService {
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId);
ZonedDateTime upTimeZdt = DateTimeUtil.convertWithZoneId(upTime, partitionEnum.getZoneId());
ZonedDateTime downTimeZdt = DateTimeUtil.convertWithZoneId(downTime, partitionEnum.getZoneId());
addSecondsGroupByDate(uid, partitionId, upTimeZdt, downTimeZdt);
addSecondsGroupByDate(uid, partitionId, upTimeZdt, downTimeZdt);
}
public void add(String monday, Integer partitionId, String date, Long uid, Integer seconds) {
@@ -36,14 +36,13 @@ public class GuildMemberRoomMicDayDurationService {
countMap.expireAsync(Duration.ofDays(14));
}
public String getCacheKey(String monday, Integer partitionId){
return RedisKey.guild_member_room_mic_day_duration.getKey(monday, partitionId.toString());
}
public Map<String, Integer> getWeekMicDurationMap(String monday, Integer partitionId, Set<String> keySet){
RMap<String, Integer> countMap = redissonClient.getMap(getCacheKey(monday, partitionId));
return countMap.getAll(keySet);
public Map<String, Integer> getWeekMicDurationMap(String mondayDateStr, Integer partitionId, Set<String> micKeySet) {
RMap<String, Integer> countMap = redissonClient.getMap(getCacheKey(mondayDateStr, partitionId));
return countMap.getAll(micKeySet);
}
public void addSecondsGroupByDate(Long uid, Integer partitionId, ZonedDateTime upTimeZdt, ZonedDateTime downTimeZdt) {

View File

@@ -21,14 +21,17 @@ import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.exception.ServiceException;
import com.accompany.core.util.I18NMessageSourceUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import io.swagger.models.auth.In;
import org.redisson.api.RMap;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.time.DayOfWeek;
import java.time.Duration;
import java.time.ZonedDateTime;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -67,50 +70,69 @@ public class GuildMemberWeekLevelRewardService extends ServiceImpl<GuildMemberWe
return null;
}
Date zoneTime = DateTimeUtil.withZoneSameInstant(new Date(), partitionEnum.getZoneId());
Date mondayTime = DateTimeUtil.getMondayDate(zoneTime);
return getVo(uid, partitionId, mondayTime, levelRewardList, true, false);
ZonedDateTime zdt = DateTimeUtil.getDateTimeByZoneId(partitionEnum.getZoneId());
return getVo(uid, partitionId, zdt, levelRewardList, true, false);
}
private GuildMemberWeekLevelRewardVo getVo(Long uid, Integer partitionId, Date mondayTime,
private GuildMemberWeekLevelRewardVo getVo(Long uid, Integer partitionId, ZonedDateTime zdt,
List<GuildMemberWeekLevelReward> levelRewardList, boolean needFilter, boolean thisWeek) {
GuildMemberWeekLevelRewardVo vo = new GuildMemberWeekLevelRewardVo();
vo.setCurLevel("-");
vo.setPreLevel("-");
vo.setPreMaxNum(BigDecimal.ZERO);
vo.setProcessNum(BigDecimal.ZERO);
vo.setMaxNum(BigDecimal.ZERO);
Date sundayTime = DateTimeUtil.addDays(mondayTime, 6);
ZonedDateTime mondayTime = zdt.with(DayOfWeek.MONDAY).withHour(0).withMinute(0).withSecond(0);
ZonedDateTime sundayTime = zdt.with(DayOfWeek.SUNDAY).withHour(23).withMinute(59).withSecond(59);
String dateRange = String.join("-",
DateTimeUtil.convertDate(mondayTime, DateTimeUtil.MONTH_WITHOUT_ZERO_DATE_PATTERN),
DateTimeUtil.convertDate(sundayTime, DateTimeUtil.MONTH_WITHOUT_ZERO_DATE_PATTERN));
mondayTime.format(DateTimeUtil.monthWithoutZeroDateFormatter),
sundayTime.format(DateTimeUtil.monthWithoutZeroDateFormatter));
vo.setDateRange(dateRange);
BigDecimal totalRewardNum = levelRewardList.stream()
.map(GuildMemberWeekLevelReward::getRewardNum)
.reduce(BigDecimal.ZERO, BigDecimal::add);
vo.setTotalReward(totalRewardNum);
// 如果是本周,计算当前时间到本周日结束时间之间的秒数差
if (thisWeek) {
long secondsDiff = Duration.between(zdt, sundayTime).getSeconds();
vo.setCountDownSecond(secondsDiff);
}
String key = String.join("_", uid.toString(), "process");
Set<String> keySet = levelRewardList.stream()
.map(GuildMemberWeekLevelReward::getLevel)
.map(level->String.join("_", uid.toString(), level.toString()))
.map(level->String.join("_", uid.toString(), level))
.collect(Collectors.toSet());
keySet.add(key);
String monday = DateTimeUtil.convertDate(mondayTime, DateTimeUtil.DEFAULT_DATE_PATTERN);
Map<String, Number> userProcessMap = getWeekMap(monday, partitionId).getAll(keySet);
Set<String> bonusKeySet = levelRewardList.stream()
.map(GuildMemberWeekLevelReward::getLevel)
.map(level->String.join("_", uid.toString(), level, "bonus"))
.collect(Collectors.toSet());
keySet.addAll(bonusKeySet);
String mondayDateStr = mondayTime.format(DateTimeUtil.dateFormatter);
Map<String, Number> userProcessMap = getWeekMap(mondayDateStr, partitionId).getAll(keySet);
BigDecimal userProcess = new BigDecimal(userProcessMap.getOrDefault(key, BigDecimal.ZERO).toString());
Set<String> micKeySet = IntStream.rangeClosed(0, 6)
.mapToObj(i->{
String dateStr = DateTimeUtil.convertDate(DateTimeUtil.addDays(mondayTime, i), DateTimeUtil.DEFAULT_DATE_PATTERN);
String dateStr = mondayTime.plusDays(i).format(DateTimeUtil.dateFormatter);
return String.join("_", uid.toString(), dateStr);
})
.collect(Collectors.toSet());
Map<String, Integer> userMicDurationMap = micDayDurationService.getWeekMicDurationMap(monday, partitionId, micKeySet);
Integer micValidDay = (int) userMicDurationMap.values().stream().filter(seconds->seconds > 120 * 60).count();
Map<String, Integer> userMicDurationMap = micDayDurationService.getWeekMicDurationMap(mondayDateStr, partitionId, micKeySet);
int micValidDay = (int) userMicDurationMap.values().stream().filter(seconds->seconds > validDaySeconds).count();
if (micValidDay >= micDurationDayMax){
micValidDay = micDurationDayMax;
}
vo.setBonusProcessNum(micValidDay);
vo.setBonusMaxNum(micDurationDayMax);
List<GuildMemberWeekLevelRewardItemVo> itemVoList = new ArrayList<>();
vo.setItemList(itemVoList);
String curLevel = "", preLevel = "-";
BigDecimal preProcessNum = BigDecimal.ZERO;
for (GuildMemberWeekLevelReward levelReward: levelRewardList) {
BigDecimal totalProcessNum = preProcessNum.add(levelReward.getProcessNum());
@@ -118,8 +140,8 @@ public class GuildMemberWeekLevelRewardService extends ServiceImpl<GuildMemberWe
break;
}
String id = String.join("_", uid.toString(), monday, levelReward.getLevel().toString());
String processId = String.join("_", uid.toString(), levelReward.getLevel().toString());
String id = String.join("_", uid.toString(), mondayDateStr, levelReward.getLevel());
String processId = String.join("_", uid.toString(), levelReward.getLevel());
BigDecimal thisLevelProcessNum = userProcess.subtract(totalProcessNum);
BigDecimal processNum = thisLevelProcessNum.compareTo(BigDecimal.ZERO) >= 0?
levelReward.getProcessNum() :
@@ -129,6 +151,12 @@ public class GuildMemberWeekLevelRewardService extends ServiceImpl<GuildMemberWe
userProcessMap.get(processId).byteValue():
processNum.compareTo(levelReward.getProcessNum()) >= 0? Constant.status.valid: Constant.status.delete;
String bonusStatusId = String.join("_", uid.toString(), levelReward.getLevel(), "bonus");
Byte bonusStatus = userProcessMap.containsKey(bonusStatusId)?
userProcessMap.get(bonusStatusId).byteValue():
micValidDay >= levelReward.getMicValidDay() && !status.equals(Constant.status.delete)?
Constant.status.valid: Constant.status.delete;
if (!needFilter && !thisWeek
&& !CollectionUtils.isEmpty(itemVoList)
&& !Constant.status.valid.equals(status)
@@ -139,18 +167,26 @@ public class GuildMemberWeekLevelRewardService extends ServiceImpl<GuildMemberWe
GuildMemberWeekLevelRewardItemVo itemVo = new GuildMemberWeekLevelRewardItemVo();
itemVo.setId(id);
itemVo.setLevel(levelReward.getLevel());
itemVo.setPreLevel(preLevel);
itemVo.setProcessNum(processNum);
itemVo.setMaxNum(totalProcessNum);
itemVo.setPreMaxNum(preProcessNum);
itemVo.setRewardNum(levelReward.getRewardNum());
itemVo.setMicDurationProcessNum(micValidDay);
itemVo.setMicDurationMaxNum(micDurationDayMax);
itemVo.setMicDurationBonus(levelReward.getMicDurationBonus());
itemVo.setStatus(status);
itemVo.setBonusProcessNum(micValidDay);
itemVo.setBonusMaxNum(levelReward.getMicValidDay());
itemVo.setBonusRewardNum(levelReward.getBonusNum());
itemVo.setBonusStatus(bonusStatus);
itemVoList.add(itemVo);
if (thisLevelProcessNum.compareTo(BigDecimal.ZERO) >= 0){
curLevel = levelReward.getLevel();
}
preLevel = levelReward.getLevel();
preProcessNum = totalProcessNum;
}
@@ -158,6 +194,33 @@ public class GuildMemberWeekLevelRewardService extends ServiceImpl<GuildMemberWe
vo.setItemList(List.of(itemVoList.get(itemVoList.size() - 1)));
}
if (CollectionUtils.isEmpty(vo.getItemList())){
return vo;
}
GuildMemberWeekLevelRewardItemVo curLevelReward = null;
if (StringUtils.hasText(curLevel)){
vo.setCurLevel(curLevel);
for (GuildMemberWeekLevelRewardItemVo voItem: vo.getItemList()){
if (!voItem.getLevel().equals(curLevel)){
continue;
}
curLevelReward = voItem;
}
}
if (null == curLevelReward){
curLevelReward = itemVoList.get(0);
}
vo.setPreLevel(curLevelReward.getPreLevel());
vo.setPreMaxNum(curLevelReward.getPreMaxNum());
vo.setCurLevel(curLevelReward.getLevel());
vo.setProcessNum(curLevelReward.getProcessNum());
vo.setMaxNum(curLevelReward.getMaxNum());
return vo;
}
@@ -184,7 +247,7 @@ public class GuildMemberWeekLevelRewardService extends ServiceImpl<GuildMemberWe
.reduce(BigDecimal.ZERO, BigDecimal::add);
String userProcessKey = String.join("_", guildMemberId.toString(), "process");
String processId = String.join("_", guildMemberId.toString(), levelReward.getLevel().toString());
String processId = String.join("_", guildMemberId.toString(), levelReward.getLevel());
Set<String> keySet = Set.of(userProcessKey,processId);
RMap<String, Number> processMap = getWeekMap(monday, partitionId);
@@ -217,7 +280,7 @@ public class GuildMemberWeekLevelRewardService extends ServiceImpl<GuildMemberWe
processMap.expireAsync(30L, TimeUnit.DAYS);
}
public List<GuildMemberWeekLevelRewardVo> listHistory(Long familyMemberId, Integer partitionId, String zoneId) {
public List<GuildMemberWeekLevelRewardVo> listHistory(Long familyMemberId, Integer partitionId) {
List<GuildMemberWeekLevelReward> levelRewardList = lambdaQuery()
.eq(GuildMemberWeekLevelReward::getPartitionId, partitionId)
@@ -227,28 +290,27 @@ public class GuildMemberWeekLevelRewardService extends ServiceImpl<GuildMemberWe
return null;
}
Date time = new Date();
Date zoneTime = DateTimeUtil.withZoneSameInstant(time, zoneId);
Date thisMonday = DateTimeUtil.getMondayDate(zoneTime);
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId);
ZonedDateTime zdt = DateTimeUtil.getDateTimeByZoneId(partitionEnum.getZoneId());
List<String> dateRangeList = new ArrayList<>();
List<Date> mondayList = new ArrayList<>();
List<ZonedDateTime> timeList = new ArrayList<>();
for (int i = 0; i < 4; i++) {
Date t = DateTimeUtil.addDays(zoneTime, -i*7);
Date mondayTime = DateTimeUtil.getMondayDate(t);
String monday = DateTimeUtil.convertDate(mondayTime, DateTimeUtil.DEFAULT_DATE_PATTERN);
ZonedDateTime t = zdt.minusWeeks(i);
timeList.add(t);
String monday = t.with(DayOfWeek.MONDAY).format(DateTimeUtil.monthWithoutZeroDateFormatter);
if (monday.compareTo(startMonday) < 0){
continue;
}
mondayList.add(mondayTime);
Date sundayTime = DateTimeUtil.addDays(mondayTime, 6);
String dateRange = String.join("-",
DateTimeUtil.convertDate(mondayTime, DateTimeUtil.MONTH_WITHOUT_ZERO_DATE_PATTERN),
DateTimeUtil.convertDate(sundayTime, DateTimeUtil.MONTH_WITHOUT_ZERO_DATE_PATTERN));
String sunday = t.with(DayOfWeek.SUNDAY).format(DateTimeUtil.monthWithoutZeroDateFormatter);
String dateRange = String.join("-", monday, sunday);
dateRangeList.add(dateRange);
}
Map<String, GuildMemberWeekLevelRewardVo> map = mondayList.parallelStream().map(monday->
getVo(familyMemberId, partitionId, monday, levelRewardList, false, monday.equals(thisMonday)))
Map<String, GuildMemberWeekLevelRewardVo> map = timeList.parallelStream().map(t->
getVo(familyMemberId, partitionId, t, levelRewardList, false, t.equals(zdt)))
.collect(Collectors.toMap(GuildMemberWeekLevelRewardVo::getDateRange, t->t));
return dateRangeList.stream()

View File

@@ -49,8 +49,7 @@ public class GuildMemberWeekLevelRewardController {
throw new ServiceException(BusiStatus.FAMILY_PERMISSION_DENIED);
}
List<GuildMemberWeekLevelRewardVo> list = guildMemberWeekLevelRewardService.listHistory(guildMember.getId(), u.getPartitionId(),
PartitionEnum.getByPartitionId(u.getPartitionId()).getZoneId());
List<GuildMemberWeekLevelRewardVo> list = guildMemberWeekLevelRewardService.listHistory(guildMember.getId(), u.getPartitionId());
return BusiResult.success(list);
}