From 4c4d7204046af9cf7d322d08cc8c72de40cbe9a9 Mon Sep 17 00:00:00 2001 From: hokli <2629910752@qq.com> Date: Wed, 3 Sep 2025 17:09:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E5=B8=B8=E4=BB=BB=E5=8A=A1-=E4=B8=BB?= =?UTF-8?q?=E6=92=AD=E5=91=A8=E5=A5=96=E5=8A=B1=E8=8B=B1=E8=AF=AD2?= =?UTF-8?q?=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...amilyMemberWeekLevelRewardStatAdminVo.java | 30 +- ...mberWeekLevelRewardRecordAdminService.java | 72 +-- ...mberWeekLevelRewardRecordAdminService.java | 208 +++++++++ ...dMemberWeekLevelRewardAdminController.java | 107 +++++ .../com/accompany/common/redis/RedisKey.java | 2 + .../accompany/common/utils/DateTimeUtil.java | 2 +- .../guild/GuildMemberWeekLevelReward.java | 3 + .../GuildMemberWeekLevelRewardRecord.java | 2 + .../GuildMemberWeekLevelRewardItemVo.java | 17 + .../guild/GuildMemberWeekLevelRewardVo.java | 28 ++ ...dMemberWeekLevelRewardDiamondListener.java | 6 +- .../handler/GuildWeekRewardHandler.java | 2 +- .../service/guild/GuildGiftRecordService.java | 4 +- .../service/guild/GuildManagerService.java | 4 +- ...ildMemberWeekLevelRewardSelectService.java | 67 +++ .../GuildMemberWeekLevelRewardService.java | 10 +- .../GuildMemberWeekLevelRewardV2Service.java | 424 ++++++++++++++++++ .../guildpolicy2/GuildPolicy2Service.java | 10 +- .../GuildMemberWeekLevelRewardController.java | 15 +- 19 files changed, 950 insertions(+), 63 deletions(-) create mode 100644 accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/GuildMemberWeekLevelRewardRecordAdminService.java create mode 100644 accompany-admin/accompany-admin-web/src/main/java/com/accompany/admin/controller/GuildMemberWeekLevelRewardAdminController.java create mode 100644 accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildMemberWeekLevelRewardSelectService.java create mode 100644 accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildMemberWeekLevelRewardV2Service.java diff --git a/accompany-admin/accompany-admin-sdk/src/main/java/com/accompany/admin/vo/FamilyMemberWeekLevelRewardStatAdminVo.java b/accompany-admin/accompany-admin-sdk/src/main/java/com/accompany/admin/vo/FamilyMemberWeekLevelRewardStatAdminVo.java index b32391235..954fb6272 100644 --- a/accompany-admin/accompany-admin-sdk/src/main/java/com/accompany/admin/vo/FamilyMemberWeekLevelRewardStatAdminVo.java +++ b/accompany-admin/accompany-admin-sdk/src/main/java/com/accompany/admin/vo/FamilyMemberWeekLevelRewardStatAdminVo.java @@ -2,38 +2,64 @@ package com.accompany.admin.vo; import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data +@ApiModel("家族成员周等级奖励统计") public class FamilyMemberWeekLevelRewardStatAdminVo { @ExcelProperty("周期") + @ApiModelProperty("周期") private String cycleDate; @ExcelIgnore + @ApiModelProperty("家族成员ID") private Long familyMemberId; @ExcelProperty("公会id") + @ApiModelProperty("公会ID") private Integer familyId; @ExcelProperty("公会名") + @ApiModelProperty("公会名称") private String familyName; @ExcelProperty("会长id") + @ApiModelProperty("会长ID") private Long familyOwnerId; @ExcelProperty("会长昵称") + @ApiModelProperty("会长昵称") private String familyOwnerNick; @ExcelIgnore + @ApiModelProperty("用户UID") private Long uid; @ExcelProperty("主播id") + @ApiModelProperty("主播ID") private Long erbanNo; @ExcelProperty("主播昵称") + @ApiModelProperty("主播昵称") private String nick; @ExcelProperty("周奖励等级") private Integer level; + @ExcelProperty("周奖励等级") + private Integer levelName; @ExcelProperty("钻石流水") + @ApiModelProperty("钻石流水") private BigDecimal processNum; - @ExcelProperty("已获得金币") + @ExcelProperty("钻石奖励") + @ApiModelProperty("钻石奖励") private BigDecimal rewardNum; + @ExcelProperty("在麦有效天数") + @ApiModelProperty("在麦有效天数") + private Integer micValidDay; + @ExcelProperty("时长奖励") + @ApiModelProperty("时长奖励") + private BigDecimal bonusRewardNum; + @ExcelProperty("目标领取金币") + @ApiModelProperty("目标领取金币") + private BigDecimal totalRewardNum; @ExcelProperty("已领取金币") + @ApiModelProperty("已领取金币") private BigDecimal receivedNum; -} +} \ No newline at end of file diff --git a/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/FamilyMemberWeekLevelRewardRecordAdminService.java b/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/FamilyMemberWeekLevelRewardRecordAdminService.java index da1072a7c..12ae12940 100644 --- a/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/FamilyMemberWeekLevelRewardRecordAdminService.java +++ b/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/FamilyMemberWeekLevelRewardRecordAdminService.java @@ -61,7 +61,7 @@ public class FamilyMemberWeekLevelRewardRecordAdminService { PartitionInfo partitionInfo = partitionInfoService.getById(partitionId); if (null == partitionInfo || (!Constant.ClanMode.FAMILY.equals(partitionInfo.getClanMode()) && !Constant.ClanMode.GUILD.equals(partitionInfo.getClanMode()) - && !Constant.ClanMode.GUILD_POLICY2.equals(partitionInfo.getClanMode()))){ + && !Constant.ClanMode.GUILD_POLICY2.equals(partitionInfo.getClanMode()))) { throw new AdminServiceException(BusiStatus.PARAMERROR); } else if (!StringUtils.hasText(cycleDate)) { throw new AdminServiceException(BusiStatus.PARAMERROR); @@ -70,42 +70,42 @@ public class FamilyMemberWeekLevelRewardRecordAdminService { Page voPage = new Page<>(pageNo, pageSize); Long uid = null; - if (null != erbanNo){ + if (null != erbanNo) { Users u = usersService.getUserByErbanNo(erbanNo); - if (null == u){ + if (null == u) { return voPage; } uid = u.getUid(); } - if (Constant.ClanMode.FAMILY.equals(partitionInfo.getClanMode())){ + if (Constant.ClanMode.FAMILY.equals(partitionInfo.getClanMode())) { Page poPage = new Page<>(pageNo, pageSize); LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() - .eq(null != uid, FamilyMember::getUid, uid); + .eq(null != uid, FamilyMember::getUid, uid); familyMemberMapper.selectPage(poPage, queryWrapper); - if (CollectionUtils.isEmpty(poPage.getRecords())){ + if (CollectionUtils.isEmpty(poPage.getRecords())) { return voPage; } Set uidSet = poPage.getRecords().stream().map(FamilyMember::getUid).collect(Collectors.toSet()); List familyMemberIdList = poPage.getRecords().stream().map(FamilyMember::getId).collect(Collectors.toList()); - Map familyMemberMap = poPage.getRecords().stream().collect(Collectors.toMap(FamilyMember::getId, f->f)); + Map familyMemberMap = poPage.getRecords().stream().collect(Collectors.toMap(FamilyMember::getId, f -> f)); List familyIdList = familyMemberMap.values().stream().map(FamilyMember::getFamilyId).distinct().collect(Collectors.toList()); - Map familyMap = familyMapper.selectByIds(familyIdList).stream().collect(Collectors.toMap(Family::getId, f->f)); + Map familyMap = familyMapper.selectByIds(familyIdList).stream().collect(Collectors.toMap(Family::getId, f -> f)); List familyOwnerUid = familyMap.values().stream().map(Family::getOwnerUid).distinct().collect(Collectors.toList()); List weekLevelRewardList = familyMemberWeekLevelRewardService.lambdaQuery() .orderByAsc(FamilyMemberWeekLevelReward::getLevel) .list(); - Set mapKeySet = familyMemberIdList.stream().map(familyMemberId->{ + Set mapKeySet = familyMemberIdList.stream().map(familyMemberId -> { List keyList = new ArrayList<>(); - for (FamilyMemberWeekLevelReward levelReward: weekLevelRewardList){ - keyList.add(String.join("_", familyMemberId.toString(), levelReward.getLevel().toString())); + for (FamilyMemberWeekLevelReward levelReward : weekLevelRewardList) { + keyList.add(String.join("_" , familyMemberId.toString(), levelReward.getLevel().toString())); } - keyList.add(String.join("_", familyMemberId.toString(), "process")); + keyList.add(String.join("_" , familyMemberId.toString(), "process")); return keyList; - }).flatMap(List::stream).collect(Collectors.toSet()); + }).flatMap(List::stream).collect(Collectors.toSet()); Map weekMap = familyMemberWeekLevelRewardService.getWeekMap(cycleDate, partitionId).getAll(mapKeySet); uidSet.addAll(familyOwnerUid); @@ -117,16 +117,16 @@ public class FamilyMemberWeekLevelRewardRecordAdminService { vo.setCycleDate(cycleDate); vo.setFamilyMemberId(po.getId()); - String processKey = String.join("_", po.getId().toString(), "process"); + 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()); + 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)){ + if (Constant.status.valid.equals(status)) { level = rewardItem.getLevel(); rewardNum = rewardNum.add(rewardItem.getRewardNum()); } else if (Constant.status.invalid.equals(status)) { @@ -143,21 +143,21 @@ public class FamilyMemberWeekLevelRewardRecordAdminService { vo.setUid(po.getUid()); Users u = usersMap.get(po.getUid()); - if (null != u){ + if (null != u) { vo.setErbanNo(u.getErbanNo()); vo.setNick(u.getNick()); } FamilyMember familyMember = familyMemberMap.get(po.getId()); - if (null != familyMember){ + if (null != familyMember) { vo.setFamilyId(familyMember.getFamilyId()); Family family = familyMap.get(familyMember.getFamilyId()); - if (null != family){ + if (null != family) { vo.setFamilyName(family.getName()); Users owner = usersMap.get(family.getOwnerUid()); - if (null != owner){ + if (null != owner) { vo.setFamilyOwnerId(owner.getErbanNo()); vo.setFamilyOwnerNick(owner.getNick()); } @@ -176,26 +176,26 @@ public class FamilyMemberWeekLevelRewardRecordAdminService { .eq(null != uid, GuildMember::getUid, uid); guildMemberMapper.selectPage(poPage, queryWrapper); - if (CollectionUtils.isEmpty(poPage.getRecords())){ + if (CollectionUtils.isEmpty(poPage.getRecords())) { return voPage; } Set uidSet = poPage.getRecords().stream().map(GuildMember::getUid).collect(Collectors.toSet()); List guildMemberIdList = poPage.getRecords().stream().map(GuildMember::getId).collect(Collectors.toList()); - Map guildMemberMap = poPage.getRecords().stream().collect(Collectors.toMap(GuildMember::getId, f->f)); + Map guildMemberMap = poPage.getRecords().stream().collect(Collectors.toMap(GuildMember::getId, f -> f)); List guildIdList = guildMemberMap.values().stream().map(GuildMember::getGuildId).distinct().collect(Collectors.toList()); - Map guildMap = guildMapper.selectByIds(guildIdList).stream().collect(Collectors.toMap(Guild::getId, f->f)); + Map guildMap = guildMapper.selectByIds(guildIdList).stream().collect(Collectors.toMap(Guild::getId, f -> f)); List guildOwnerUid = guildMap.values().stream().map(Guild::getOwnerUid).distinct().collect(Collectors.toList()); List weekLevelRewardList = guildMemberWeekLevelRewardService.lambdaQuery() .orderByAsc(GuildMemberWeekLevelReward::getLevel) .list(); - Set mapKeySet = guildMemberIdList.stream().map(guildMemberId->{ + Set mapKeySet = guildMemberIdList.stream().map(guildMemberId -> { List keyList = new ArrayList<>(); - for (GuildMemberWeekLevelReward levelReward: weekLevelRewardList){ - keyList.add(String.join("_", guildMemberId.toString(), levelReward.getLevel().toString())); + for (GuildMemberWeekLevelReward levelReward : weekLevelRewardList) { + keyList.add(String.join("_" , guildMemberId.toString(), levelReward.getLevel().toString())); } - keyList.add(String.join("_", guildMemberId.toString(), "process")); + keyList.add(String.join("_" , guildMemberId.toString(), "process")); return keyList; }).flatMap(List::stream).collect(Collectors.toSet()); Map weekMap = guildMemberWeekLevelRewardService.getWeekMap(cycleDate, partitionId).getAll(mapKeySet); @@ -209,16 +209,16 @@ public class FamilyMemberWeekLevelRewardRecordAdminService { vo.setCycleDate(cycleDate); vo.setFamilyMemberId(po.getId()); - String processKey = String.join("_", po.getId().toString(), "process"); + 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()); + 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)){ + if (Constant.status.valid.equals(status)) { level = rewardItem.getLevel(); rewardNum = rewardNum.add(rewardItem.getRewardNum()); } else if (Constant.status.invalid.equals(status)) { @@ -235,21 +235,21 @@ public class FamilyMemberWeekLevelRewardRecordAdminService { vo.setUid(po.getUid()); Users u = usersMap.get(po.getUid()); - if (null != u){ + if (null != u) { vo.setErbanNo(u.getErbanNo()); vo.setNick(u.getNick()); } GuildMember guildMember = guildMemberMap.get(po.getId()); - if (null != guildMember){ + if (null != guildMember) { vo.setFamilyId(guildMember.getGuildId()); Guild guild = guildMap.get(guildMember.getGuildId()); - if (null != guild){ + if (null != guild) { vo.setFamilyName(guild.getName()); Users owner = usersMap.get(guild.getOwnerUid()); - if (null != owner){ + if (null != owner) { vo.setFamilyOwnerId(owner.getErbanNo()); vo.setFamilyOwnerNick(owner.getNick()); } diff --git a/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/GuildMemberWeekLevelRewardRecordAdminService.java b/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/GuildMemberWeekLevelRewardRecordAdminService.java new file mode 100644 index 000000000..9488f635d --- /dev/null +++ b/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/GuildMemberWeekLevelRewardRecordAdminService.java @@ -0,0 +1,208 @@ +package com.accompany.admin.service; + +import com.accompany.admin.vo.FamilyMemberWeekLevelRewardStatAdminVo; +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.guild.GuildMapper; +import com.accompany.business.mybatismapper.guild.GuildMemberMapper; +import com.accompany.business.service.guild.GuildMemberWeekLevelRewardService; +import com.accompany.business.service.guild.GuildService; +import com.accompany.business.service.user.UsersService; +import com.accompany.common.constant.Constant; +import com.accompany.common.status.BusiStatus; +import com.accompany.core.exception.AdminServiceException; +import com.accompany.core.model.PartitionInfo; +import com.accompany.core.model.Users; +import com.accompany.core.service.partition.PartitionInfoService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +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.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +@Service +public class GuildMemberWeekLevelRewardRecordAdminService { + + @Autowired + private UsersService usersService; + @Autowired + private GuildMemberWeekLevelRewardService guildMemberWeekLevelRewardService; + @Autowired + private GuildMemberMapper guildMemberMapper; + @Autowired + private GuildMapper guildMapper; + @Autowired + private GuildService guildService; + @Autowired + private PartitionInfoService partitionInfoService; + + public Page page(int partitionId, + String cycleDate, + Integer guildId, + Long guildOwnerErbanNo, + Long erbanNo, + int pageNo, int pageSize) { + PartitionInfo partitionInfo = partitionInfoService.getById(partitionId); + if (null == partitionInfo + || (!Constant.ClanMode.GUILD.equals(partitionInfo.getClanMode()) + && !Constant.ClanMode.GUILD_POLICY2.equals(partitionInfo.getClanMode()))){ + throw new AdminServiceException(BusiStatus.PARAMERROR); + } else if (!StringUtils.hasText(cycleDate)) { + throw new AdminServiceException(BusiStatus.PARAMERROR); + } + + Page voPage = new Page<>(pageNo, pageSize); + + if (null != guildOwnerErbanNo){ + Users owner = usersService.getUserByErbanNo(guildOwnerErbanNo); + if (null == owner){ + return voPage; + } + Guild g = guildService.getVaildGuildByOwnerUid(owner.getUid()); + if (null == g){ + return voPage; + } + guildId = g.getId(); + } + + Long uid = null; + if (null != erbanNo){ + Users u = usersService.getUserByErbanNo(erbanNo); + if (null == u){ + return voPage; + } + uid = u.getUid(); + } + + Page poPage = new Page<>(pageNo, pageSize); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() + .eq(null != guildId, GuildMember::getGuildId, guildId) + .eq(null != uid, GuildMember::getUid, uid); + guildMemberMapper.selectPage(poPage, queryWrapper); + + if (CollectionUtils.isEmpty(poPage.getRecords())){ + return voPage; + } + + Set uidSet = poPage.getRecords().stream().map(GuildMember::getUid).collect(Collectors.toSet()); + List guildMemberIdList = poPage.getRecords().stream().map(GuildMember::getId).toList(); + Map guildMemberMap = poPage.getRecords().stream().collect(Collectors.toMap(GuildMember::getId, f->f)); + List guildIdList = guildMemberMap.values().stream().map(GuildMember::getGuildId).distinct().collect(Collectors.toList()); + Map guildMap = guildMapper.selectByIds(guildIdList).stream().collect(Collectors.toMap(Guild::getId, f->f)); + List guildOwnerUid = guildMap.values().stream().map(Guild::getOwnerUid).distinct().toList(); + + List weekLevelRewardList = guildMemberWeekLevelRewardService.lambdaQuery() + .orderByAsc(GuildMemberWeekLevelReward::getLevel) + .list(); + Set mapKeySet = guildMemberIdList.stream().map(guildMemberId->{ + List keyList = new ArrayList<>(); + for (GuildMemberWeekLevelReward levelReward: weekLevelRewardList){ + String levelId = levelReward.getLevel().toString(); + keyList.add(String.join("_", guildMemberId.toString(), levelId)); + keyList.add(String.join("_", guildMemberId.toString(), levelId, "bonus")); + } + keyList.add(String.join("_", guildMemberId.toString(), "process")); + keyList.add(String.join("_", guildMemberId.toString(), "bonus", "process")); + return keyList; + }).flatMap(List::stream).collect(Collectors.toSet()); + + Map weekMap = guildMemberWeekLevelRewardService.getWeekMap(cycleDate, partitionId).getAll(mapKeySet); + + uidSet.addAll(guildOwnerUid); + + Map usersMap = usersService.getUsersMapByUids(new ArrayList<>(uidSet)); + + List 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"); + BigDecimal processNum = BigDecimal.valueOf(weekMap.getOrDefault(processKey, 0d).doubleValue()); + vo.setProcessNum(processNum); + + String bonusProcessKey = String.join("_", po.getId().toString(), "bonus", "process"); + Integer bonusProcessNum = weekMap.getOrDefault(bonusProcessKey, 0).intValue(); + vo.setMicValidDay(bonusProcessNum); + + Integer level = null; + String levelName = "-"; + BigDecimal rewardNum = BigDecimal.ZERO; + BigDecimal bonusRewardNum = 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.invalid.equals(status)) { + level = rewardItem.getLevel(); + levelName = rewardItem.getLevelName(); + rewardNum = rewardNum.add(rewardItem.getRewardNum()); + receiverdNum = receiverdNum.add(rewardItem.getRewardNum()); + } else if (Constant.status.valid.equals(status)) { + level = rewardItem.getLevel(); + levelName = rewardItem.getLevelName(); + rewardNum = rewardNum.add(rewardItem.getRewardNum()); + } else { + continue; + } + + String bonusKey = String.join("_", po.getId().toString(), rewardItem.getLevel().toString(), "bonus"); + Byte bonusStatus = weekMap.getOrDefault(bonusKey, Constant.status.delete).byteValue(); + if (Constant.status.invalid.equals(bonusStatus)) { + bonusRewardNum = rewardNum.add(rewardItem.getBonusNum()); + receiverdNum = receiverdNum.add(rewardItem.getBonusNum()); + } else if (Constant.status.valid.equals(bonusStatus)) { + bonusRewardNum = rewardNum.add(rewardItem.getBonusNum()); + } + } + + vo.setLevel(level); + vo.setRewardNum(rewardNum); + vo.setBonusRewardNum(bonusRewardNum); + vo.setTotalRewardNum(rewardNum.add(bonusRewardNum)); + 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; + } + +} diff --git a/accompany-admin/accompany-admin-web/src/main/java/com/accompany/admin/controller/GuildMemberWeekLevelRewardAdminController.java b/accompany-admin/accompany-admin-web/src/main/java/com/accompany/admin/controller/GuildMemberWeekLevelRewardAdminController.java new file mode 100644 index 000000000..1aa0e375b --- /dev/null +++ b/accompany-admin/accompany-admin-web/src/main/java/com/accompany/admin/controller/GuildMemberWeekLevelRewardAdminController.java @@ -0,0 +1,107 @@ +package com.accompany.admin.controller; + +import com.accompany.admin.service.GuildMemberWeekLevelRewardRecordAdminService; +import com.accompany.admin.vo.FamilyMemberWeekLevelRewardStatAdminVo; +import com.accompany.business.vo.guild.GuildDateCycleVo; +import com.accompany.common.result.BusiResult; +import com.accompany.common.result.PageResult; +import com.accompany.common.utils.DateTimeUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.support.ExcelTypeEnum; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Api(tags = "主播周奖励", value = "主播周奖励") +@RequestMapping("/admin/guildMemberWeekLevelReward") +@RestController +public class GuildMemberWeekLevelRewardAdminController { + + @Autowired + private GuildMemberWeekLevelRewardRecordAdminService service; + + @ApiOperation("获取周期") + @GetMapping("/listCycleDate") + public BusiResult> listDateCycle(){ + List voList = new ArrayList<>(); + Date now = new Date(); + for (int i = 0; i < 8; i++) { + Date date = DateTimeUtil.addDays(now, i * -7); + Date monday = DateTimeUtil.getMonday(date, 0, 0, 0); + Date sunday = DateTimeUtil.getSunday(date, 23, 59, 59); + String mondayStr = DateTimeUtil.convertDate(monday); + + GuildDateCycleVo vo = new GuildDateCycleVo(); + vo.setDateCycle(mondayStr); + vo.setStartDate(monday); + vo.setStartDateStr(mondayStr); + vo.setEndDate(sunday); + vo.setEndDateStr(DateTimeUtil.convertDate(sunday)); + vo.setCurrentCycle(i==0); + voList.add(vo); + } + return BusiResult.success(voList); + } + + @ApiOperation("查询") + @ApiImplicitParams({ + @ApiImplicitParam(name = "partitionId", value = "分区id", required = true), + @ApiImplicitParam(name = "cycleDate", value = "周期", required = true), + @ApiImplicitParam(name = "guildId", value = "公会id"), + @ApiImplicitParam(name = "guildOwnerErbanNo", value = "公会长id"), + @ApiImplicitParam(name = "erbanNo", value = "id"), + @ApiImplicitParam(name = "pageNo", value = "页码"), + @ApiImplicitParam(name = "pageSize", value = "页长"), + }) + @GetMapping("/page") + public BusiResult> page(int partitionId, + String cycleDate, + Integer guildId, + Long guildOwnerErbanNo, + Long erbanNo, + int pageNo, int pageSize){ + Page page = service.page(partitionId, cycleDate, guildId, guildOwnerErbanNo, erbanNo, pageNo, pageSize); + return BusiResult.success(new PageResult<>(page)); + } + + @SneakyThrows + @ApiOperation("导出") + @ApiImplicitParams({ + @ApiImplicitParam(name = "partitionId", value = "分区id", required = true), + @ApiImplicitParam(name = "cycleDate", value = "周期"), + @ApiImplicitParam(name = "guildId", value = "公会id"), + @ApiImplicitParam(name = "guildOwnerErbanNo", value = "公会长id"), + @ApiImplicitParam(name = "erbanNo", value = "id"), + }) + @GetMapping("/export") + public void export(HttpServletResponse response, + int partitionId, + String cycleDate, + Integer guildId, + Long guildOwnerErbanNo, + Long erbanNo){ + Page page = service.page(partitionId, cycleDate, guildId, guildOwnerErbanNo, erbanNo, -1, -1); + + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + // 这里URLEncoder.encode可以防止中文乱码 + String excelName = URLEncoder.encode("主播周奖励记录", StandardCharsets.UTF_8); + response.setHeader("Content-disposition", "attachment;filename=" + excelName + ExcelTypeEnum.XLSX.getValue()); + EasyExcel.write(response.getOutputStream(), FamilyMemberWeekLevelRewardStatAdminVo.class).sheet("主播周奖励记录").doWrite(page.getRecords()); + } + +} 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 1c333ec67..85268aae7 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 @@ -1362,6 +1362,8 @@ public enum RedisKey { family_member_week_level_reward, guild_member_week_level_reward, + guild_member_room_mic_day_duration, + partition_info, app_ui_setting,//app UI设置 diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/common/utils/DateTimeUtil.java b/accompany-base/accompany-core/src/main/java/com/accompany/common/utils/DateTimeUtil.java index b70f2641a..fa42dbf62 100644 --- a/accompany-base/accompany-core/src/main/java/com/accompany/common/utils/DateTimeUtil.java +++ b/accompany-base/accompany-core/src/main/java/com/accompany/common/utils/DateTimeUtil.java @@ -1,6 +1,5 @@ package com.accompany.common.utils; -import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.accompany.common.status.BusiStatus; import com.accompany.core.exception.ServiceException; @@ -63,6 +62,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"); diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guild/GuildMemberWeekLevelReward.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guild/GuildMemberWeekLevelReward.java index b2462a269..5279e6344 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guild/GuildMemberWeekLevelReward.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guild/GuildMemberWeekLevelReward.java @@ -8,8 +8,11 @@ import java.math.BigDecimal; public class GuildMemberWeekLevelReward { private Integer level; + private String levelName; private Integer partitionId; private BigDecimal processNum; private BigDecimal rewardNum; + private Integer micValidDay; + private BigDecimal bonusNum; } diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guild/GuildMemberWeekLevelRewardRecord.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guild/GuildMemberWeekLevelRewardRecord.java index e3845e263..8f7e67c91 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guild/GuildMemberWeekLevelRewardRecord.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guild/GuildMemberWeekLevelRewardRecord.java @@ -15,6 +15,8 @@ public class GuildMemberWeekLevelRewardRecord { private Integer level; private BigDecimal processNum; private BigDecimal rewardNum; + private Integer micValidDay; + private BigDecimal bonusNum; private Date createTime; } diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guild/GuildMemberWeekLevelRewardItemVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guild/GuildMemberWeekLevelRewardItemVo.java index 815dc87ca..6b563188b 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guild/GuildMemberWeekLevelRewardItemVo.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guild/GuildMemberWeekLevelRewardItemVo.java @@ -14,6 +14,13 @@ public class GuildMemberWeekLevelRewardItemVo { private String id; @ApiModelProperty("等级") private Integer level; + @ApiModelProperty("等级") + private String levelName; + @ApiModelProperty("上一级等级") + private Integer preLevel; + @ApiModelProperty("上一级等级") + private String preLevelName; + @ApiModelProperty("进度") private BigDecimal processNum; @ApiModelProperty("长度") @@ -25,4 +32,14 @@ public class GuildMemberWeekLevelRewardItemVo { @ApiModelProperty("状态012") private Byte status; + @ApiModelProperty("在麦时长进度") + private Integer bonusProcessNum; + @ApiModelProperty("在麦时长上限") + private Integer bonusMaxNum; + @ApiModelProperty("在麦时长上限") + private Integer bonusPreMaxNum; + @ApiModelProperty("在麦时长奖励") + private BigDecimal bonusRewardNum; + @ApiModelProperty("状态012") + private Byte bonusStatus; } diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guild/GuildMemberWeekLevelRewardVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guild/GuildMemberWeekLevelRewardVo.java index d2278da9d..77218c509 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guild/GuildMemberWeekLevelRewardVo.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guild/GuildMemberWeekLevelRewardVo.java @@ -13,8 +13,36 @@ public class GuildMemberWeekLevelRewardVo { @ApiModelProperty("日期范围") private String dateRange; + + @ApiModelProperty("倒计时秒") + private Long countDownSecond; + + @ApiModelProperty + private Integer curLevel; + @ApiModelProperty + private String curLevelName; + @ApiModelProperty("当前周进度") + private BigDecimal processNum; + @ApiModelProperty("当前周进度上限") + private BigDecimal maxNum; + + @ApiModelProperty("当前周进度上限") + private Integer preLevel; + @ApiModelProperty("当前周进度上限") + private String preLevelName; + @ApiModelProperty("当前周进度上一级上限") + private BigDecimal preMaxNum; + + @ApiModelProperty("当前周额外奖励上一级上限") + private Integer bonusPreMaxNum; + @ApiModelProperty("当前周额外奖励进度") + private Integer bonusProcessNum; + @ApiModelProperty("当前周额外奖励上线") + private Integer bonusMaxNum; + @ApiModelProperty("最多奖励") private BigDecimal totalReward = BigDecimal.ZERO; + @ApiModelProperty("每级奖励") private List itemList; diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/event/listener/GuildMemberWeekLevelRewardDiamondListener.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/event/listener/GuildMemberWeekLevelRewardDiamondListener.java index db0087657..e3fb9209c 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/event/listener/GuildMemberWeekLevelRewardDiamondListener.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/event/listener/GuildMemberWeekLevelRewardDiamondListener.java @@ -6,7 +6,7 @@ import com.accompany.business.message.GuildMemberIncreaseFlowMessage; import com.accompany.business.message.SuperLuckyGiftDiamondIncomeMessage; import com.accompany.business.model.guild.GuildMember; import com.accompany.business.service.guild.GuildMemberService; -import com.accompany.business.service.guild.GuildMemberWeekLevelRewardService; +import com.accompany.business.service.guild.GuildMemberWeekLevelRewardSelectService; import com.accompany.business.service.user.UsersService; import com.accompany.common.constant.Constant; import com.accompany.common.utils.DateTimeUtil; @@ -32,7 +32,7 @@ public class GuildMemberWeekLevelRewardDiamondListener implements ApplicationLis @Autowired private GuildMemberService guildMemberService; @Autowired - private GuildMemberWeekLevelRewardService guildMemberWeekDiamondLevelRewardService; + private GuildMemberWeekLevelRewardSelectService guildMemberWeekLevelRewardSelectService; @Autowired private ApplicationContext applicationContext; @@ -61,7 +61,7 @@ public class GuildMemberWeekLevelRewardDiamondListener implements ApplicationLis String monday = DateTimeUtil.convertDate(DateTimeUtil.getMondayDate(zoneTime), DateTimeUtil.DEFAULT_DATE_PATTERN); Double totalDiamondNum = message.getTotalDiamondNum(); - guildMemberWeekDiamondLevelRewardService.addProcess(guildMember.getId(), receiver.getPartitionId(), monday, totalDiamondNum); + guildMemberWeekLevelRewardSelectService.addProcess(guildMember.getId(), receiver.getPartitionId(), monday, totalDiamondNum); applicationContext.publishEvent(new GuildMemberIncreaseFlowEvent(new GuildMemberIncreaseFlowMessage(receiver.getPartitionId(), guildMember.getGuildId(), guildMember.getUid(), BigDecimal.ZERO, BigDecimal.valueOf(totalDiamondNum), time))); diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/dailytask/handler/GuildWeekRewardHandler.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/dailytask/handler/GuildWeekRewardHandler.java index f56b2b89f..342779da3 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/dailytask/handler/GuildWeekRewardHandler.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/dailytask/handler/GuildWeekRewardHandler.java @@ -44,7 +44,7 @@ public class GuildWeekRewardHandler extends AbstractDailyTaskHandler { } PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId); List guildMemberWeekLevelRewardVos = - guildMemberWeekLevelRewardService.listHistory(guildMember.getId(), partitionId, partitionEnum.getZoneId(), 1); + guildMemberWeekLevelRewardService.listHistory(guildMember.getId(), partitionId, 1); if (CollectionUtils.isEmpty(guildMemberWeekLevelRewardVos)) { dailyTaskVo.setGuildWeekRewardItems(Collections.emptyList()); return null; diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildGiftRecordService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildGiftRecordService.java index 1e7150c68..f67ebeba8 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildGiftRecordService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildGiftRecordService.java @@ -42,7 +42,7 @@ public class GuildGiftRecordService extends ServiceImpl listHistory(Long familyMemberId, Integer partitionId) { + if (PartitionEnum.ENGLISH2.getId() == partitionId) { + return guildMemberWeekLevelRewardV2Service.listHistory(familyMemberId, partitionId); + } else { + return guildMemberWeekLevelRewardService.listHistory(familyMemberId, partitionId, 4); + } + } + + public void sendReward(Long uid, GuildMemberWeekLevelReward levelReward){ + GuildMember guildMember = guildMemberService.getVaildGuildMemberByUid(uid); + Integer partitionId = guildMember.getPartitionId(); + if (PartitionEnum.ENGLISH2.getId() == partitionId) { + guildMemberWeekLevelRewardV2Service.sendReward(uid, levelReward, true); + } else { + guildMemberWeekLevelRewardService.sendReward(uid, levelReward); + } + } + + public void addProcess(Long uid, Integer partitionId, String monday, Number totalNum) { + if (PartitionEnum.ENGLISH2.getId() == partitionId) { + guildMemberWeekLevelRewardV2Service.addProcess(uid, partitionId, monday, totalNum); + } else { + guildMemberWeekLevelRewardService.addProcess(uid, partitionId, monday, totalNum); + } + } +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildMemberWeekLevelRewardService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildMemberWeekLevelRewardService.java index caa1a3b79..dbfd19ab8 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildMemberWeekLevelRewardService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildMemberWeekLevelRewardService.java @@ -197,11 +197,7 @@ public class GuildMemberWeekLevelRewardService extends ServiceImpl listHistory(Long familyMemberId, Integer partitionId, String zoneId) { - return listHistory(familyMemberId, partitionId, zoneId, 4); - } - - public List listHistory(Long familyMemberId, Integer partitionId, String zoneId, int weekSize) { + public List listHistory(Long familyMemberId, Integer partitionId, int weekSize) { List levelRewardList = lambdaQuery() .eq(GuildMemberWeekLevelReward::getPartitionId, partitionId) @@ -210,9 +206,9 @@ public class GuildMemberWeekLevelRewardService extends ServiceImpl dateRangeList = new ArrayList<>(); List mondayList = new ArrayList<>(); diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildMemberWeekLevelRewardV2Service.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildMemberWeekLevelRewardV2Service.java new file mode 100644 index 000000000..a2f5bafea --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildMemberWeekLevelRewardV2Service.java @@ -0,0 +1,424 @@ + +package com.accompany.business.service.guild; + +import cn.hutool.core.date.DateUtil; +import com.accompany.business.model.guild.GuildMemberWeekLevelReward; +import com.accompany.business.model.guild.GuildMemberWeekLevelRewardRecord; +import com.accompany.business.mybatismapper.guild.GuildMemberWeekLevelRewardMapper; +import com.accompany.business.mybatismapper.guild.GuildMemberWeekLevelRewardRecordMapper; +import com.accompany.business.service.SendSysMsgService; +import com.accompany.business.service.purse.UserPurseService; +import com.accompany.business.service.record.BillRecordService; +import com.accompany.business.vo.guild.GuildMemberWeekLevelRewardItemVo; +import com.accompany.business.vo.guild.GuildMemberWeekLevelRewardVo; +import com.accompany.common.constant.Constant; +import com.accompany.common.redis.RedisKey; +import com.accompany.common.status.BusiStatus; +import com.accompany.common.utils.DateTimeUtil; +import com.accompany.core.enumeration.BillObjTypeEnum; +import com.accompany.core.enumeration.I18nAlertEnum; +import com.accompany.core.enumeration.PartitionEnum; +import com.accompany.core.exception.ServiceException; +import com.accompany.core.util.I18NMessageSourceUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +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 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; + +@Service +public class GuildMemberWeekLevelRewardV2Service extends ServiceImpl { + + @Autowired + private RedissonClient redissonClient; + @Autowired + private UserPurseService userPurseService; + @Autowired + private BillRecordService billRecordService; + @Autowired + private SendSysMsgService sendSysMsgService; + @Autowired + private GuildMemberWeekLevelRewardRecordMapper recordMapper; + + private final String startMonday = "2025-09-01"; + + private int micDurationDayMax = 5; + private int micDurationMax = 180 * 60; + + + public GuildMemberWeekLevelRewardVo getThisWeekLevelRewardVo(Long uid, Integer partitionId) { + + PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId); + + List levelRewardList = lambdaQuery() + .eq(GuildMemberWeekLevelReward::getPartitionId, partitionId) + .orderByAsc(GuildMemberWeekLevelReward::getLevel) + .list(); + if (CollectionUtils.isEmpty(levelRewardList)){ + return null; + } + + ZonedDateTime zdt = DateTimeUtil.getDateTimeByZoneId(partitionEnum.getZoneId()); + return getVo(uid, partitionId, zdt, levelRewardList, true, true); + } + + private GuildMemberWeekLevelRewardVo getVo(Long guildMemberId, Integer partitionId, ZonedDateTime zdt, + List levelRewardList, boolean needFilter, boolean thisWeek) { + + GuildMemberWeekLevelRewardVo vo = new GuildMemberWeekLevelRewardVo(); + vo.setCurLevel(null); + vo.setCurLevelName("-"); + vo.setPreLevel(null); + vo.setPreLevelName("-"); + vo.setPreMaxNum(BigDecimal.ZERO); + vo.setProcessNum(BigDecimal.ZERO); + vo.setMaxNum(BigDecimal.ZERO); + + 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("-", + mondayTime.format(DateTimeUtil.monthWithoutZeroDateFormatter), + sundayTime.format(DateTimeUtil.monthWithoutZeroDateFormatter)); + vo.setDateRange(dateRange); + + BigDecimal totalRewardNum = levelRewardList.stream() + .map(reward -> reward.getRewardNum().add(reward.getBonusNum())) + .reduce(BigDecimal.ZERO, BigDecimal::add); + vo.setTotalReward(totalRewardNum); + + // 如果是本周,计算当前时间到本周日结束时间之间的秒数差 + if (thisWeek) { + long secondsDiff = Duration.between(zdt, sundayTime).getSeconds(); + vo.setCountDownSecond(secondsDiff); + } + + String key = String.join("_", guildMemberId.toString(), "process"); + Set keySet = levelRewardList.stream() + .map(GuildMemberWeekLevelReward::getLevel) + .map(level->String.join("_", guildMemberId.toString(), level.toString())) + .collect(Collectors.toSet()); + keySet.add(key); + Set bonusKeySet = levelRewardList.stream() + .map(GuildMemberWeekLevelReward::getLevel) + .map(level->String.join("_", guildMemberId.toString(), level.toString(), "bonus")) + .collect(Collectors.toSet()); + keySet.addAll(bonusKeySet); + String bonusKey = String.join("_", guildMemberId.toString(), "bonus", "process"); + keySet.add(bonusKey); + + String mondayDateStr = mondayTime.format(DateTimeUtil.dateFormatter); + Map userProcessMap = getWeekMap(mondayDateStr, partitionId).getAll(keySet); + BigDecimal userProcess = new BigDecimal(userProcessMap.getOrDefault(key, BigDecimal.ZERO).toString()); + int userBonusProcess = Math.min(userProcessMap.getOrDefault(bonusKey, 0).intValue(), micDurationDayMax); + + vo.setBonusPreMaxNum(0); + vo.setBonusProcessNum(userBonusProcess); + vo.setBonusMaxNum(micDurationDayMax); + + List itemVoList = new ArrayList<>(); + vo.setItemList(itemVoList); + + Integer curLevel = null, preLevel = null; + String curLevelName = "-", preLevelName = "-"; + + BigDecimal preLevelMaxNum = BigDecimal.ZERO; + BigDecimal remainUserProcess = userProcess; + + for (GuildMemberWeekLevelReward levelReward: levelRewardList) { + String levelId = levelReward.getLevel().toString(); + String id = String.join("_", guildMemberId.toString(), mondayDateStr, levelId); + String statusId = String.join("_", guildMemberId.toString(), levelId); + + BigDecimal processNum = remainUserProcess.compareTo(levelReward.getProcessNum()) >= 0? + levelReward.getProcessNum() : remainUserProcess.compareTo(BigDecimal.ZERO) < 0? + BigDecimal.ZERO: remainUserProcess; + Byte status = userProcessMap.containsKey(statusId)? + userProcessMap.get(statusId).byteValue(): + processNum.compareTo(levelReward.getProcessNum()) >= 0? Constant.status.valid: Constant.status.delete; + + String bonusStatusId = String.join("_", guildMemberId.toString(), levelId, "bonus"); + Byte bonusStatus = userProcessMap.containsKey(bonusStatusId)? + userProcessMap.get(bonusStatusId).byteValue(): + userBonusProcess >= levelReward.getMicValidDay() && !status.equals(Constant.status.delete)? + Constant.status.valid: Constant.status.delete; + + if (!needFilter && !thisWeek + && !CollectionUtils.isEmpty(itemVoList) + && !Constant.status.valid.equals(status) + && !Constant.status.invalid.equals(status)){ + break; + } + + if (remainUserProcess.compareTo(BigDecimal.ZERO) >= 0){ + curLevel = levelReward.getLevel(); + curLevelName = levelReward.getLevelName(); + } else if (needFilter) { + break; + } + + GuildMemberWeekLevelRewardItemVo itemVo = new GuildMemberWeekLevelRewardItemVo(); + itemVo.setId(id); + itemVo.setLevel(levelReward.getLevel()); + itemVo.setLevelName(levelReward.getLevelName()); + itemVo.setPreLevel(preLevel); + itemVo.setPreLevelName(preLevelName); + itemVo.setProcessNum(processNum); + itemVo.setMaxNum(levelReward.getProcessNum()); + itemVo.setPreMaxNum(preLevelMaxNum); + itemVo.setRewardNum(levelReward.getRewardNum()); + itemVo.setStatus(status); + + itemVo.setBonusProcessNum(userBonusProcess); + itemVo.setBonusMaxNum(levelReward.getMicValidDay()); + itemVo.setBonusPreMaxNum(0); + itemVo.setBonusRewardNum(levelReward.getBonusNum()); + itemVo.setBonusStatus(bonusStatus); + + itemVoList.add(itemVo); + + remainUserProcess = remainUserProcess.subtract(levelReward.getProcessNum()); + + preLevelName = levelReward.getLevelName(); + preLevel = levelReward.getLevel(); + } + + if (CollectionUtils.isEmpty(vo.getItemList())){ + return vo; + } + + GuildMemberWeekLevelRewardItemVo curLevelReward = null; + vo.setCurLevel(curLevel); + vo.setCurLevelName(curLevelName); + 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; + } + + public void getReward(Long guildMemberId, Long uid, Integer partitionId, String id, Boolean isBonus) { + String[] keyArray = id.split("_"); + if (keyArray.length != 3 || !guildMemberId.equals(Long.parseLong(keyArray[0]))) { + throw new ServiceException(BusiStatus.PARAMERROR); + } + + String monday = keyArray[1]; + + Integer level = Integer.parseInt(keyArray[2]); + List levelRewardList = lambdaQuery() + .eq(GuildMemberWeekLevelReward::getPartitionId, partitionId) + .le(GuildMemberWeekLevelReward::getLevel, level) + .list(); + if (CollectionUtils.isEmpty(levelRewardList)) { + throw new ServiceException(BusiStatus.PARAMERROR); + } + + GuildMemberWeekLevelReward levelReward = levelRewardList.stream().filter(item -> item.getLevel().equals(level)).findFirst().orElse(null); + if (null == levelReward){ + throw new ServiceException(BusiStatus.PARAMERROR); + } + + BigDecimal needProcessNum = levelRewardList.stream().map(GuildMemberWeekLevelReward::getProcessNum).reduce(BigDecimal.ZERO, BigDecimal::add); + + String levelId = levelReward.getLevel().toString(); + String userProcessKey = String.join("_", guildMemberId.toString(), "process"); + String statusId = String.join("_", guildMemberId.toString(), levelId); + String bonusStatusId = String.join("_", guildMemberId.toString(), levelId, "bonus"); + + Set keySet = Set.of(userProcessKey, statusId, bonusStatusId); + + RMap processMap = getWeekMap(monday, partitionId); + Map userProcessMap = processMap.getAll(keySet); + BigDecimal userProcess = new BigDecimal(userProcessMap.getOrDefault(userProcessKey, BigDecimal.ZERO).toString()); + if (needProcessNum.compareTo(userProcess) > 0){ + throw new ServiceException(BusiStatus.PARAMERROR); + } + Byte status = userProcessMap.getOrDefault(statusId, Constant.status.delete).byteValue(); + if (!isBonus){ + if (!Constant.status.delete.equals(status) || !processMap.fastPutIfAbsent(statusId, Constant.status.invalid)){ + throw new ServiceException(BusiStatus.CHARGE_RECEICVE_REPEAT); + } + } else { + Byte bonusStatus = userProcessMap.getOrDefault(bonusStatusId, Constant.status.delete).byteValue(); + if (Constant.status.delete.equals(status) || !Constant.status.delete.equals(bonusStatus) || !processMap.fastPutIfAbsent(bonusStatusId, Constant.status.invalid)){ + throw new ServiceException(BusiStatus.CHARGE_RECEICVE_REPEAT); + } + } + + this.sendReward(uid, levelReward, isBonus); + + boolean isInsert = false; + GuildMemberWeekLevelRewardRecord record = recordMapper.selectOne(Wrappers.lambdaQuery() + .eq(GuildMemberWeekLevelRewardRecord::getGuildMemberId, guildMemberId) + .eq(GuildMemberWeekLevelRewardRecord::getMonday, monday) + .eq(GuildMemberWeekLevelRewardRecord::getLevel, levelReward.getLevel())); + if (null == record){ + record = new GuildMemberWeekLevelRewardRecord(); + record.setGuildMemberId(guildMemberId); + record.setUid(uid); + record.setMonday(monday); + record.setLevel(levelReward.getLevel()); + record.setProcessNum(BigDecimal.ZERO); + record.setRewardNum(BigDecimal.ZERO); + record.setMicValidDay(0); + record.setBonusNum(BigDecimal.ZERO); + isInsert = true; + } + + if (isBonus){ + record.setMicValidDay(levelReward.getMicValidDay()); + record.setBonusNum(levelReward.getBonusNum()); + } else { + record.setProcessNum(levelReward.getProcessNum()); + record.setRewardNum(levelReward.getRewardNum()); + } + + if (isInsert){ + record.setCreateTime(new Date()); + recordMapper.insert(record); + } else { + recordMapper.update(record, Wrappers.lambdaUpdate() + .eq(GuildMemberWeekLevelRewardRecord::getGuildMemberId, guildMemberId) + .eq(GuildMemberWeekLevelRewardRecord::getMonday, monday) + .eq(GuildMemberWeekLevelRewardRecord::getLevel, levelReward.getLevel())); + } + + String tip = I18NMessageSourceUtil.getMessage(I18nAlertEnum.FAMILY_MEMBER_WEEK_LEVEL_REWARD, + new Object[]{levelReward.getLevel(), levelReward.getRewardNum()}, partitionId); + sendSysMsgService.sendPersonTextMsg(uid, tip); + + processMap.expireAsync(30L, TimeUnit.DAYS); + } + + public List listHistory(Long familyMemberId, Integer partitionId) { + + List levelRewardList = lambdaQuery() + .eq(GuildMemberWeekLevelReward::getPartitionId, partitionId) + .orderByAsc(GuildMemberWeekLevelReward::getLevel) + .list(); + if (CollectionUtils.isEmpty(levelRewardList)){ + return null; + } + + PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId); + ZonedDateTime zdt = DateTimeUtil.getDateTimeByZoneId(partitionEnum.getZoneId()); + + List dateRangeList = new ArrayList<>(); + List timeList = new ArrayList<>(); + for (int i = 0; i < 4; i++) { + ZonedDateTime t = zdt.minusWeeks(i); + timeList.add(t); + + + String mondayDate = t.with(DayOfWeek.MONDAY).format(DateTimeUtil.dateFormatter); + if (mondayDate.compareTo(startMonday) < 0){ + continue; + } + + String monday = t.with(DayOfWeek.MONDAY).format(DateTimeUtil.monthWithoutZeroDateFormatter); + String sunday = t.with(DayOfWeek.SUNDAY).format(DateTimeUtil.monthWithoutZeroDateFormatter); + String dateRange = String.join("-", monday, sunday); + dateRangeList.add(dateRange); + } + + Map map = timeList.parallelStream().map(t-> + getVo(familyMemberId, partitionId, t, levelRewardList, false, t.equals(zdt))) + .collect(Collectors.toMap(GuildMemberWeekLevelRewardVo::getDateRange, t->t)); + + return dateRangeList.stream() + .map(map::get).collect(Collectors.toList()); + } + + public void sendReward(Long uid, GuildMemberWeekLevelReward levelReward, Boolean isBonus){ + double rewardNum = !isBonus? levelReward.getRewardNum().doubleValue(): levelReward.getBonusNum().doubleValue(); + String objId = !isBonus? levelReward.getLevel().toString(): String.join("_", levelReward.getLevel().toString(), "bonus"); + userPurseService.addDiamond(uid, levelReward.getRewardNum().doubleValue(), BillObjTypeEnum.GUILD_MEMBER_WEEK_LEVEL_REWARD, + (userPurse -> billRecordService.insertGeneralBillRecord(uid, objId, BillObjTypeEnum.GUILD_MEMBER_WEEK_LEVEL_REWARD, rewardNum, userPurse))); + } + + public void addProcess(Long guildMemberId, Integer partitionId, String monday, Number totalNum) { + List levelRewardList = lambdaQuery() + .eq(GuildMemberWeekLevelReward::getPartitionId, partitionId) + .orderByAsc(GuildMemberWeekLevelReward::getLevel) + .list(); + if (CollectionUtils.isEmpty(levelRewardList)){ + return; + } + + String key = String.join("_", guildMemberId.toString(), "process"); + RMap processMap = getWeekMap(monday, partitionId); + BigDecimal num = new BigDecimal(totalNum.toString()); + BigDecimal after = new BigDecimal(processMap.addAndGet(key, num).toString()); + + //todo log + + processMap.expireAsync(Duration.ofDays(45L)); + } + + public RMap getWeekMap(String monday, Integer partitionId){ + return redissonClient.getMap(RedisKey.guild_member_week_level_reward.getKey(monday, partitionId.toString())); + } + + public void addBonusProcess(String monday, Integer partitionId, Long guildMemberId, Integer before, Integer after) { + if (before >= micDurationMax || after < micDurationMax){ + return; + } + + List levelRewardList = lambdaQuery() + .eq(GuildMemberWeekLevelReward::getPartitionId, partitionId) + .orderByAsc(GuildMemberWeekLevelReward::getLevel) + .list(); + if (CollectionUtils.isEmpty(levelRewardList)){ + return; + } + + String key = String.join("_", guildMemberId.toString(), "bonus", "process"); + RMap processMap = getWeekMap(monday, partitionId); + Integer bonusAfter = processMap.addAndGet(key, 1).intValue(); + Integer bonusBefore = bonusAfter - 1; + + //todo log + + processMap.expireAsync(Duration.ofDays(45L)); + } + + + public void addDayDuration(Integer partitionId, String date, Long guildMemberId, Integer seconds) { + String monday = DateUtil.formatDate(DateUtil.beginOfWeek(DateUtil.parseDate(date))); + String cacheKey = RedisKey.guild_member_room_mic_day_duration.getKey(monday, partitionId.toString()); + RMap countMap = redissonClient.getMap(cacheKey); + + String key = String.join("_", guildMemberId.toString(), date); + Integer after = countMap.addAndGet(key, seconds); + Integer before = after - seconds; + + this.addBonusProcess(monday, partitionId, guildMemberId, before, after); + + //todo log + countMap.expireAsync(Duration.ofDays(14)); + } + +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildPolicy2Service.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildPolicy2Service.java index 04297bfb0..4ca00e21a 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildPolicy2Service.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildPolicy2Service.java @@ -7,6 +7,7 @@ import com.accompany.business.model.guild.GuildMember; import com.accompany.business.model.guildpolicy2.GuildDiamondClearPolicy2; import com.accompany.business.service.guild.GuildAuthService; import com.accompany.business.service.guild.GuildMemberService; +import com.accompany.business.service.guild.GuildMemberWeekLevelRewardV2Service; import com.accompany.business.service.purse.UserPurseService; import com.accompany.business.service.room.RoomMicService; import com.accompany.business.service.user.UsersService; @@ -63,6 +64,8 @@ public class GuildPolicy2Service { private ThreadPoolExecutor bizExecutor; @Autowired private GuildCrystalSettlementService guildCrystalSettlementService; + @Autowired + private GuildMemberWeekLevelRewardV2Service guildMemberWeekLevelRewardV2Service; public BusiResult getGuildPolicy2(Long uid, String cycleBeginDate) { GuildPolicy2Vo guildPolicy2Vo = new GuildPolicy2Vo(); @@ -183,12 +186,17 @@ public class GuildPolicy2Service { String statDate = entry.getKey(); Date date = DateUtil.parseDate(statDate); String cycleDate; - if (PartitionEnum.getByPartitionId(guildMember.getPartitionId()).getClanMode().equals(Constant.ClanMode.GUILD)) { + Integer partitionId = guildMember.getPartitionId(); + if (PartitionEnum.getByPartitionId(partitionId).getClanMode().equals(Constant.ClanMode.GUILD)) { cycleDate = CycleTimeUtil.getAgencyCycleBeginDateStr(date); } else { cycleDate = FullMonthCycleTimeUtil.getAgencyCycleBeginDateStr(date); } guildMicStatisticsPolicy2Service.updateDayMicStatistics(cycleDate, statDate, guildMember, micMinutes); + + if (PartitionEnum.ENGLISH2.getId() == partitionId) { + guildMemberWeekLevelRewardV2Service.addDayDuration(partitionId, statDate, guildMember.getId(), micMinutes * 60); + } } } diff --git a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/guild/GuildMemberWeekLevelRewardController.java b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/guild/GuildMemberWeekLevelRewardController.java index a3b99e297..a9d524609 100644 --- a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/guild/GuildMemberWeekLevelRewardController.java +++ b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/guild/GuildMemberWeekLevelRewardController.java @@ -2,14 +2,13 @@ package com.accompany.business.controller.guild; import com.accompany.business.model.guild.GuildMember; import com.accompany.business.service.guild.GuildMemberService; -import com.accompany.business.service.guild.GuildMemberWeekLevelRewardService; +import com.accompany.business.service.guild.GuildMemberWeekLevelRewardSelectService; import com.accompany.business.service.user.UsersService; import com.accompany.business.vo.guild.GuildMemberWeekLevelRewardVo; import com.accompany.common.annotation.Authorization; import com.accompany.common.result.BusiResult; import com.accompany.common.status.BusiStatus; import com.accompany.core.base.UidContextHolder; -import com.accompany.core.enumeration.PartitionEnum; import com.accompany.core.exception.ServiceException; import com.accompany.core.model.Users; import io.swagger.annotations.Api; @@ -35,7 +34,7 @@ public class GuildMemberWeekLevelRewardController { @Autowired private GuildMemberService guildMemberService; @Autowired - private GuildMemberWeekLevelRewardService guildMemberWeekLevelRewardService; + private GuildMemberWeekLevelRewardSelectService guildMemberWeekLevelRewardSelectService; @ApiOperation("主页") @Authorization @@ -49,18 +48,18 @@ public class GuildMemberWeekLevelRewardController { throw new ServiceException(BusiStatus.FAMILY_PERMISSION_DENIED); } - List list = guildMemberWeekLevelRewardService.listHistory(guildMember.getId(), u.getPartitionId(), - PartitionEnum.getByPartitionId(u.getPartitionId()).getZoneId()); + List list = guildMemberWeekLevelRewardSelectService.listHistory(guildMember.getId(), u.getPartitionId()); return BusiResult.success(list); } @ApiOperation("领奖") @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "id"), + @ApiImplicitParam(name = "id", value = "id", required = true), + @ApiImplicitParam(name = "isBonus", value = "isBonus", required = true), }) @Authorization @PostMapping("/getReward") - public BusiResult getReward(String id){ + public BusiResult getReward(String id, Boolean isBonus){ if (StringUtils.isBlank(id)){ throw new ServiceException(BusiStatus.PARAMETERILLEGAL); } @@ -73,7 +72,7 @@ public class GuildMemberWeekLevelRewardController { throw new ServiceException(BusiStatus.FAMILY_PERMISSION_DENIED); } - guildMemberWeekLevelRewardService.getReward(guildMember.getId(), uid, u.getPartitionId(), id); + guildMemberWeekLevelRewardSelectService.getReward(guildMember.getId(), uid, u.getPartitionId(), id, isBonus); return BusiResult.success(); }