日常任务-主播周奖励英语2区

This commit is contained in:
2025-09-03 17:09:59 +08:00
parent 0aa971bb9d
commit 4c4d720404
19 changed files with 950 additions and 63 deletions

View File

@@ -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;
}

View File

@@ -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<FamilyMemberWeekLevelRewardStatAdminVo> 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<FamilyMember> poPage = new Page<>(pageNo, pageSize);
LambdaQueryWrapper<FamilyMember> queryWrapper = Wrappers.<FamilyMember>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<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));
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));
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->{
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()));
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<String, Number> 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<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));
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));
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->{
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()));
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<String, Number> 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());
}

View File

@@ -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<FamilyMemberWeekLevelRewardStatAdminVo> 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<FamilyMemberWeekLevelRewardStatAdminVo> 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<GuildMember> poPage = new Page<>(pageNo, pageSize);
LambdaQueryWrapper<GuildMember> queryWrapper = Wrappers.<GuildMember>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<Long> uidSet = poPage.getRecords().stream().map(GuildMember::getUid).collect(Collectors.toSet());
List<Long> guildMemberIdList = poPage.getRecords().stream().map(GuildMember::getId).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().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){
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<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");
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;
}
}

View File

@@ -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<List<GuildDateCycleVo>> listDateCycle(){
List<GuildDateCycleVo> 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<PageResult<FamilyMemberWeekLevelRewardStatAdminVo>> page(int partitionId,
String cycleDate,
Integer guildId,
Long guildOwnerErbanNo,
Long erbanNo,
int pageNo, int pageSize){
Page<FamilyMemberWeekLevelRewardStatAdminVo> 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<FamilyMemberWeekLevelRewardStatAdminVo> 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());
}
}

View File

@@ -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设置

View File

@@ -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");

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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<GuildMemberWeekLevelRewardItemVo> itemList;

View File

@@ -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)));

View File

@@ -44,7 +44,7 @@ public class GuildWeekRewardHandler extends AbstractDailyTaskHandler {
}
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId);
List<GuildMemberWeekLevelRewardVo> 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;

View File

@@ -42,7 +42,7 @@ public class GuildGiftRecordService extends ServiceImpl<GuildGiftRecordMapper, G
@Autowired
private GuildDiamondStatisticsDayService guildDiamondStatisticsDayService;
@Autowired
private GuildMemberWeekLevelRewardService guildMemberWeekLevelRewardService;
private GuildMemberWeekLevelRewardSelectService guildMemberWeekLevelRewardSelectService;
@Autowired
private ApplicationContext applicationContext;
@Autowired
@@ -92,7 +92,7 @@ public class GuildGiftRecordService extends ServiceImpl<GuildGiftRecordMapper, G
Date zoneTime = DateTimeUtil.withZoneSameInstant(giftSendRecord.getCreateTime(), partitionInfo.getZoneId());
String monday = DateTimeUtil.convertDate(DateTimeUtil.getMondayDate(zoneTime), DateTimeUtil.DEFAULT_DATE_PATTERN);
guildMemberWeekLevelRewardService.addProcess(guildMember.getId(), guildMember.getPartitionId(), monday, giftSendRecord.getTotalDiamondNum());
guildMemberWeekLevelRewardSelectService.addProcess(guildMember.getId(), guildMember.getPartitionId(), monday, giftSendRecord.getTotalDiamondNum());
applicationContext.publishEvent(new GuildMemberIncreaseFlowEvent(new GuildMemberIncreaseFlowMessage(
giftSendRecord.getPartitionId(), guildMember.getGuildId(), guildMember.getUid(),

View File

@@ -79,7 +79,7 @@ public class GuildManagerService {
@Autowired
private JedisService jedisService;
@Autowired
private GuildMemberWeekLevelRewardService guildMemberWeekLevelRewardService;
private GuildMemberWeekLevelRewardSelectService guildMemberWeekLevelRewardSelectService;
@Autowired
private SSGuildService ssGuildService;
@Autowired
@@ -164,7 +164,7 @@ public class GuildManagerService {
vo.setCycleDiamondWageLevel(cycleDiamondWageLevelVo);
//主播周奖励
GuildMemberWeekLevelRewardVo thisWeekVo = guildMemberWeekLevelRewardService.getThisWeekLevelRewardVo(guildMember.getId(),
GuildMemberWeekLevelRewardVo thisWeekVo = guildMemberWeekLevelRewardSelectService.getThisWeekLevelRewardVo(guildMember.getId(),
u.getPartitionId());
vo.setWeekLevelReward(thisWeekVo);
} catch (Exception e){

View File

@@ -0,0 +1,67 @@
package com.accompany.business.service.guild;
import com.accompany.business.model.guild.GuildMember;
import com.accompany.business.model.guild.GuildMemberWeekLevelReward;
import com.accompany.business.vo.guild.GuildMemberWeekLevelRewardVo;
import com.accompany.common.status.BusiStatus;
import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.exception.ServiceException;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class GuildMemberWeekLevelRewardSelectService {
@Autowired
private GuildMemberWeekLevelRewardService guildMemberWeekLevelRewardService;
@Autowired
private GuildMemberWeekLevelRewardV2Service guildMemberWeekLevelRewardV2Service;
@Autowired
private GuildMemberService guildMemberService;
public GuildMemberWeekLevelRewardVo getThisWeekLevelRewardVo(Long uid, Integer partitionId) {
if (PartitionEnum.ENGLISH2.getId() == partitionId) {
return guildMemberWeekLevelRewardV2Service.getThisWeekLevelRewardVo(uid, partitionId);
}
return guildMemberWeekLevelRewardService.getThisWeekLevelRewardVo(uid, partitionId);
}
public void getReward(Long guildMemberId, Long uid, Integer partitionId, String id, Boolean isBonus) {
if (PartitionEnum.ENGLISH2.getId() == partitionId) {
if (StringUtils.isBlank(id) || null == isBonus){
throw new ServiceException(BusiStatus.PARAMETERILLEGAL);
}
guildMemberWeekLevelRewardV2Service.getReward(guildMemberId, uid, partitionId, id, isBonus);
} else {
guildMemberWeekLevelRewardService.getReward(guildMemberId, uid, partitionId, id);
}
}
public List<GuildMemberWeekLevelRewardVo> 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);
}
}
}

View File

@@ -197,11 +197,7 @@ public class GuildMemberWeekLevelRewardService extends ServiceImpl<GuildMemberWe
processMap.expireAsync(30L, TimeUnit.DAYS);
}
public List<GuildMemberWeekLevelRewardVo> listHistory(Long familyMemberId, Integer partitionId, String zoneId) {
return listHistory(familyMemberId, partitionId, zoneId, 4);
}
public List<GuildMemberWeekLevelRewardVo> listHistory(Long familyMemberId, Integer partitionId, String zoneId, int weekSize) {
public List<GuildMemberWeekLevelRewardVo> listHistory(Long familyMemberId, Integer partitionId, int weekSize) {
List<GuildMemberWeekLevelReward> levelRewardList = lambdaQuery()
.eq(GuildMemberWeekLevelReward::getPartitionId, partitionId)
@@ -210,9 +206,9 @@ public class GuildMemberWeekLevelRewardService extends ServiceImpl<GuildMemberWe
if (CollectionUtils.isEmpty(levelRewardList)){
return null;
}
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId);
Date time = new Date();
Date zoneTime = DateTimeUtil.withZoneSameInstant(time, zoneId);
Date zoneTime = DateTimeUtil.withZoneSameInstant(time, partitionEnum.getZoneId());
Date thisMonday = DateTimeUtil.getMondayDate(zoneTime);
List<String> dateRangeList = new ArrayList<>();
List<Date> mondayList = new ArrayList<>();

View File

@@ -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<GuildMemberWeekLevelRewardMapper, GuildMemberWeekLevelReward> {
@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<GuildMemberWeekLevelReward> 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<GuildMemberWeekLevelReward> 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<String> keySet = levelRewardList.stream()
.map(GuildMemberWeekLevelReward::getLevel)
.map(level->String.join("_", guildMemberId.toString(), level.toString()))
.collect(Collectors.toSet());
keySet.add(key);
Set<String> 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<String, Number> 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<GuildMemberWeekLevelRewardItemVo> 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<GuildMemberWeekLevelReward> 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<String> keySet = Set.of(userProcessKey, statusId, bonusStatusId);
RMap<String, Number> processMap = getWeekMap(monday, partitionId);
Map<String, Number> 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.<GuildMemberWeekLevelRewardRecord>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.<GuildMemberWeekLevelRewardRecord>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<GuildMemberWeekLevelRewardVo> listHistory(Long familyMemberId, Integer partitionId) {
List<GuildMemberWeekLevelReward> 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<String> dateRangeList = new ArrayList<>();
List<ZonedDateTime> 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<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()
.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<GuildMemberWeekLevelReward> levelRewardList = lambdaQuery()
.eq(GuildMemberWeekLevelReward::getPartitionId, partitionId)
.orderByAsc(GuildMemberWeekLevelReward::getLevel)
.list();
if (CollectionUtils.isEmpty(levelRewardList)){
return;
}
String key = String.join("_", guildMemberId.toString(), "process");
RMap<String, Number> 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<String, Number> 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<GuildMemberWeekLevelReward> levelRewardList = lambdaQuery()
.eq(GuildMemberWeekLevelReward::getPartitionId, partitionId)
.orderByAsc(GuildMemberWeekLevelReward::getLevel)
.list();
if (CollectionUtils.isEmpty(levelRewardList)){
return;
}
String key = String.join("_", guildMemberId.toString(), "bonus", "process");
RMap<String, Number> 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<String, Integer> 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));
}
}

View File

@@ -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<GuildPolicy2Vo> 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);
}
}
}

View File

@@ -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<GuildMemberWeekLevelRewardVo> list = guildMemberWeekLevelRewardService.listHistory(guildMember.getId(), u.getPartitionId(),
PartitionEnum.getByPartitionId(u.getPartitionId()).getZoneId());
List<GuildMemberWeekLevelRewardVo> 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<Void> getReward(String id){
public BusiResult<Void> 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();
}