房间日奖励-具体实现
This commit is contained in:
@@ -272,6 +272,8 @@ public enum BillObjTypeEnum {
|
||||
GUILD_POLICY2_SUB_GOLDS( 181, "土耳其公会结算扣除钻石", BillTypeEnum.OUT, CurrencyEnum.GOLD, BillDomainTypeEnum.GUILD_POLICY2),
|
||||
|
||||
ROOM_WEEK_DIAMOND_REWARD(182, "房间周奖励", BillTypeEnum.IN, CurrencyEnum.DIAMOND, BillDomainTypeEnum.GUILD),
|
||||
|
||||
ROOM_SEND_RANK_DAY_REWARD(183, "房间爱意榜日榜贡献奖励", BillTypeEnum.IN, CurrencyEnum.DIAMOND, BillDomainTypeEnum.ACTIVITY),
|
||||
;
|
||||
|
||||
BillObjTypeEnum(int value, String desc, BillTypeEnum type, CurrencyEnum currency, BillDomainTypeEnum domain) {
|
||||
|
@@ -322,6 +322,9 @@ public enum I18nAlertEnum {
|
||||
ROOM_WEEK_DIAMOND_REWARD_SYS("恭喜你,你上周的房间ID:{0} 流水达到:{1}。房间周奖励已经发放,快去看看吧~"),
|
||||
|
||||
GUILD_MEMBER_WEEK_LEVEL_REWARD("你获得的奖励已经发放到你的背包,快去看看吧!"),
|
||||
|
||||
ROOM_SEND_RANK_DAY_OWNER_REWARD_TIP("房间ID:{0} 已经成功领取房主奖励"),
|
||||
ROOM_SEND_RANK_DAY_USER_REWARD_TIP("房间ID:{0} 已经成功领取贡献者奖励"),
|
||||
;
|
||||
|
||||
private final String defaultStr;
|
||||
|
@@ -38,7 +38,12 @@ public class RoomDaySendRankUserRecord {
|
||||
* 奖励档位ID
|
||||
*/
|
||||
private Long rewardId;
|
||||
|
||||
|
||||
/**
|
||||
* 奖励类型 0=房主 1=贡献
|
||||
*/
|
||||
private Byte type;
|
||||
|
||||
/**
|
||||
* 用户排名
|
||||
*/
|
||||
@@ -57,12 +62,12 @@ public class RoomDaySendRankUserRecord {
|
||||
/**
|
||||
* 用户奖励金币
|
||||
*/
|
||||
private BigDecimal userReward;
|
||||
private Long userReward;
|
||||
|
||||
/**
|
||||
* 用户已领取奖励
|
||||
*/
|
||||
private BigDecimal userReceiveReward;
|
||||
private Long userReceiveReward;
|
||||
|
||||
/**
|
||||
* 领取时间
|
||||
|
@@ -1,16 +1,17 @@
|
||||
package com.accompany.business.vo.room;
|
||||
|
||||
import com.accompany.business.common.vo.ActivityRankItemVo;
|
||||
import com.accompany.business.common.vo.ActivityUserVo;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@ApiModel("房间日流水奖励首页信息")
|
||||
public class RoomDaySendRankHomeVo {
|
||||
public class RoomDaySendRankRewardHomeVo {
|
||||
|
||||
@ApiModelProperty("房间信息")
|
||||
private ActivityUserVo roomInfo;
|
||||
@@ -19,10 +20,10 @@ public class RoomDaySendRankHomeVo {
|
||||
private RewardInfoVo rewardInfo;
|
||||
|
||||
@ApiModelProperty("排行榜列表")
|
||||
private List<ActivityRankItemVo> rankList;
|
||||
private List<RankItemVo> top10RankList;
|
||||
|
||||
@ApiModelProperty("我的排名信息")
|
||||
private ActivityRankItemVo myRank;
|
||||
private RankItemVo myRank;
|
||||
|
||||
@Data
|
||||
@ApiModel("奖励信息")
|
||||
@@ -38,12 +39,32 @@ public class RoomDaySendRankHomeVo {
|
||||
private String nextLevel;
|
||||
|
||||
@ApiModelProperty("下一级奖励下限")
|
||||
private Long nextLevelLimit;
|
||||
private BigDecimal nextLevelLimit;
|
||||
|
||||
@ApiModelProperty("下一级总奖励")
|
||||
private Long nextLevelReward;
|
||||
|
||||
@ApiModelProperty("前10用户瓜分奖励")
|
||||
private BigDecimal topTenReward;
|
||||
private Long topTenReward;
|
||||
|
||||
@ApiModelProperty("房主奖励")
|
||||
private BigDecimal ownerReward;
|
||||
private Long ownerReward;
|
||||
}
|
||||
|
||||
@Data
|
||||
@ApiModel
|
||||
@NoArgsConstructor
|
||||
public static class RankItemVo extends ActivityUserVo {
|
||||
|
||||
@ApiModelProperty("排名(0=未上榜)")
|
||||
private Integer ranking;
|
||||
@ApiModelProperty("得分")
|
||||
private BigDecimal score;
|
||||
@ApiModelProperty("房主奖励")
|
||||
private Long ownerReward;
|
||||
@ApiModelProperty("贡献奖励")
|
||||
private Long myReward;
|
||||
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.accompany.business.vo.room;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@ApiModel("房间日流水奖励记录")
|
||||
public class RoomDaySendRankRewardRecordVo {
|
||||
|
||||
@ApiModelProperty("创建时间")
|
||||
private String createTime;
|
||||
@ApiModelProperty("奖励")
|
||||
private Long reward;
|
||||
|
||||
}
|
@@ -1,33 +1,60 @@
|
||||
package com.accompany.business.service.room;
|
||||
|
||||
import com.accompany.business.common.vo.ActivityUserVo;
|
||||
import com.accompany.business.model.room.RoomDaySendRankReward;
|
||||
import com.accompany.business.model.room.RoomDaySendRankRoomRecord;
|
||||
import com.accompany.business.model.room.RoomDaySendRankUserRecord;
|
||||
import com.accompany.business.service.SendSysMsgService;
|
||||
import com.accompany.business.service.purse.UserPurseService;
|
||||
import com.accompany.business.service.rank.room.RoomDayRankService;
|
||||
import com.accompany.business.service.user.UsersService;
|
||||
import com.accompany.business.vo.room.RoomDaySendRankHomeVo;
|
||||
import com.accompany.business.vo.room.RoomDaySendRankRewardHomeVo;
|
||||
import com.accompany.business.vo.room.RoomDaySendRankRewardRecordVo;
|
||||
import com.accompany.common.constant.Constant;
|
||||
import com.accompany.common.enums.RedisZSetEnum;
|
||||
import com.accompany.common.model.PageReq;
|
||||
import com.accompany.common.status.BusiStatus;
|
||||
import com.accompany.common.utils.DateTimeUtil;
|
||||
import com.accompany.core.base.SpringContextHolder;
|
||||
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.model.Room;
|
||||
import com.accompany.core.model.Users;
|
||||
import com.accompany.core.util.I18NMessageSourceUtil;
|
||||
import com.accompany.core.util.PartitionUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.Date;
|
||||
import java.util.*;
|
||||
|
||||
@Component
|
||||
public class RoomDaySendRankRewardManager {
|
||||
|
||||
@Autowired
|
||||
private UsersService usersService;
|
||||
@Autowired
|
||||
private RoomService roomService;
|
||||
@Autowired
|
||||
private RoomDaySendRankRewardService roomDaySendRankRewardService;
|
||||
private RoomDayRankService roomDayRankService;
|
||||
@Autowired
|
||||
private RoomDaySendRankRoomRecordService roomDaySendRankRoomRecordService;
|
||||
private RoomDaySendRankRewardService rewardService;
|
||||
@Autowired
|
||||
private RoomDaySendRankUserRecordService roomDaySendRankUserRecordService;
|
||||
private RoomDaySendRankRoomRecordService roomRecordService;
|
||||
@Autowired
|
||||
private UsersService usersService;
|
||||
private RoomDaySendRankUserRecordService userRecordService;
|
||||
@Autowired
|
||||
private UserPurseService userPurseService;
|
||||
@Autowired
|
||||
private SendSysMsgService sendSysMsgService;
|
||||
|
||||
/**
|
||||
* 获取房间日流水奖励首页信息
|
||||
@@ -37,8 +64,10 @@ public class RoomDaySendRankRewardManager {
|
||||
* @param isToday 是否今天
|
||||
* @return 首页信息VO
|
||||
*/
|
||||
public RoomDaySendRankHomeVo getHomeInfo(Long uid, Long roomUid, Boolean isToday) {
|
||||
public RoomDaySendRankRewardHomeVo getHomeInfo(Long uid, Long roomUid, Boolean isToday) {
|
||||
// 实现获取首页信息逻辑
|
||||
RoomDaySendRankRewardHomeVo vo = new RoomDaySendRankRewardHomeVo();
|
||||
|
||||
// 1. 获取房间信息(使用ActivityUserVo)
|
||||
|
||||
Users u = usersService.getNotNullUsersByUid(uid);
|
||||
@@ -55,16 +84,234 @@ public class RoomDaySendRankRewardManager {
|
||||
throw new ServiceException(BusiStatus.PARTITION_ERROR);
|
||||
}
|
||||
|
||||
Users owner = usersService.getNotNullUsersByUid(room.getUid());
|
||||
|
||||
ActivityUserVo roomInfo = new ActivityUserVo(room.getUid(), owner.getErbanNo(), room.getTitle(), room.getAvatar());
|
||||
vo.setRoomInfo(roomInfo);
|
||||
|
||||
// 2. 计算奖励信息
|
||||
Date todayTime = new Date();
|
||||
Date statTime = Boolean.TRUE.equals(isToday)? todayTime: DateTimeUtil.addDays(todayTime, -1);
|
||||
|
||||
// 2. 计算奖励信息
|
||||
// 3. 获取排行榜列表前3名(使用ActivityRankItemVo)
|
||||
Set<Map<String, Object>> rankList = roomDayRankService.getRank(statTime, roomUid, 1L, -1L, room.getPartitionId());
|
||||
BigDecimal roomSerialValue = rankList.stream().map(entry-> new BigDecimal(entry.get(RedisZSetEnum.score.name()).toString())).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
|
||||
RoomDaySendRankRewardHomeVo.RewardInfoVo rewardInfoVo = rewardService.buildBySerialValue(roomSerialValue);
|
||||
vo.setRewardInfo(rewardInfoVo);
|
||||
|
||||
// 3. 获取排行榜列表前10名(使用ActivityRankItemVo)
|
||||
List<Map<String, Object>> top10RankList = rankList.stream().limit(10L).toList();
|
||||
List<RoomDaySendRankRewardHomeVo.RankItemVo> top10RankVoList = buildTop10RankList(top10RankList, rewardInfoVo);
|
||||
vo.setTop10RankList(top10RankVoList);
|
||||
|
||||
// 4. 获取我的排名信息(使用ActivityRankItemVo)
|
||||
// 5. 组装返回结果
|
||||
return new RoomDaySendRankHomeVo();
|
||||
RoomDaySendRankRewardHomeVo.RankItemVo myRank = buildMyRank(u, roomUid, top10RankList, rewardInfoVo);
|
||||
vo.setMyRank(myRank);
|
||||
|
||||
return vo;
|
||||
}
|
||||
|
||||
|
||||
private List<RoomDaySendRankRewardHomeVo.RankItemVo> buildTop10RankList(List<Map<String, Object>> top10RankList, RoomDaySendRankRewardHomeVo.RewardInfoVo rewardInfoVo) {
|
||||
if (CollectionUtils.isEmpty(top10RankList)){
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<Long> uidList = top10RankList.stream().map(entry-> Long.parseLong(entry.get(RedisZSetEnum.member.name()).toString())).toList();
|
||||
Map<Long, Users> usersMap = usersService.getUsersMapByUids(uidList);
|
||||
|
||||
BigDecimal top10SerialValue = top10RankList.stream().map(entry-> new BigDecimal(entry.get(RedisZSetEnum.score.name()).toString())).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
|
||||
int rank = 1;
|
||||
List<RoomDaySendRankRewardHomeVo.RankItemVo> voList = new ArrayList<>();
|
||||
for (Map<String, Object> entry: top10RankList){
|
||||
Long uid = Long.parseLong(entry.get(RedisZSetEnum.member.name()).toString());
|
||||
BigDecimal score = new BigDecimal(entry.get(RedisZSetEnum.score.name()).toString());
|
||||
|
||||
RoomDaySendRankRewardHomeVo.RankItemVo itemVo = new RoomDaySendRankRewardHomeVo.RankItemVo();
|
||||
itemVo.setRanking(rank++);
|
||||
itemVo.setScore(score);
|
||||
itemVo.setUid(uid);
|
||||
|
||||
if (rewardInfoVo.getTopTenReward() > 0L){
|
||||
BigDecimal ratio = score.divide(top10SerialValue, 2, RoundingMode.HALF_UP);
|
||||
long reward = ratio.multiply(BigDecimal.valueOf(rewardInfoVo.getTopTenReward())).longValue();
|
||||
itemVo.setMyReward(reward);
|
||||
} else {
|
||||
itemVo.setMyReward(0L);
|
||||
}
|
||||
|
||||
voList.add(itemVo);
|
||||
|
||||
Users u = usersMap.get(uid);
|
||||
if (null == u){
|
||||
continue;
|
||||
}
|
||||
|
||||
itemVo.setErbanNo(u.getErbanNo());
|
||||
itemVo.setNick(u.getNick());
|
||||
itemVo.setAvatar(u.getAvatar());
|
||||
|
||||
}
|
||||
return voList;
|
||||
}
|
||||
|
||||
private RoomDaySendRankRewardHomeVo.RankItemVo buildMyRank(Users u, Long roomUid, List<Map<String, Object>> top10RankList,
|
||||
RoomDaySendRankRewardHomeVo.RewardInfoVo rewardInfoVo) {
|
||||
RoomDaySendRankRewardHomeVo.RankItemVo vo = new RoomDaySendRankRewardHomeVo.RankItemVo();
|
||||
vo.setUid(u.getUid());
|
||||
vo.setErbanNo(u.getErbanNo());
|
||||
vo.setNick(u.getNick());
|
||||
vo.setAvatar(u.getAvatar());
|
||||
vo.setRanking(0);
|
||||
//vo.setOwnerReward(0L);
|
||||
vo.setMyReward(0L);
|
||||
|
||||
BigDecimal top10SerialValue = BigDecimal.ZERO;
|
||||
int rank = 1;
|
||||
for (Map<String, Object> entry: top10RankList){
|
||||
Long uid = Long.parseLong(entry.get(RedisZSetEnum.member.name()).toString());
|
||||
BigDecimal score = new BigDecimal(entry.get(RedisZSetEnum.score.name()).toString());
|
||||
|
||||
if (uid.equals(u.getUid())){
|
||||
vo.setRanking(rank);
|
||||
vo.setScore(score);
|
||||
break;
|
||||
}
|
||||
|
||||
rank++;
|
||||
top10SerialValue = top10SerialValue.add(score);
|
||||
}
|
||||
|
||||
if (u.getUid().equals(roomUid)){
|
||||
vo.setOwnerReward(rewardInfoVo.getOwnerReward());
|
||||
}
|
||||
|
||||
if (vo.getRanking() > 0 && rewardInfoVo.getTopTenReward() > 0L){
|
||||
BigDecimal ratio = vo.getScore().divide(top10SerialValue, 2, RoundingMode.HALF_DOWN);
|
||||
long myReward = BigDecimal.valueOf(rewardInfoVo.getTopTenReward()).divide(ratio, 0, RoundingMode.HALF_DOWN).longValue();
|
||||
vo.setMyReward(myReward);
|
||||
}
|
||||
|
||||
return vo;
|
||||
}
|
||||
|
||||
public Long receiveReward(Long uid, Long roomUid, Boolean isRoomOwnerReward) {
|
||||
Users u = usersService.getNotNullUsersByUid(uid);
|
||||
|
||||
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(u.getPartitionId());
|
||||
if (!PartitionEnum.ARAB.equals(partitionEnum)){
|
||||
throw new ServiceException(BusiStatus.PARTITION_ERROR);
|
||||
}
|
||||
|
||||
Room room = roomService.getRoomByUid(roomUid);
|
||||
if (null == room){
|
||||
throw new ServiceException(BusiStatus.PARAMERROR);
|
||||
} else if (!PartitionUtil.equalsPartition(u.getPartitionId(), room.getPartitionId())){
|
||||
throw new ServiceException(BusiStatus.PARTITION_ERROR);
|
||||
}
|
||||
|
||||
Users owner = usersService.getNotNullUsersByUid(room.getUid());
|
||||
|
||||
ZonedDateTime zdt = DateTimeUtil.getDateTimeByZoneId(partitionEnum.getZoneId());
|
||||
String yesterdayStr = zdt.format(DateTimeUtil.dateFormatter);
|
||||
Byte rewardType = isRoomOwnerReward? Constant.status.delete: Constant.status.valid;
|
||||
|
||||
RoomDaySendRankUserRecord userRecord = userRecordService.lambdaQuery()
|
||||
.eq(RoomDaySendRankUserRecord::getRoomUid, roomUid)
|
||||
.eq(RoomDaySendRankUserRecord::getPartitionId, u.getPartitionId())
|
||||
.eq(RoomDaySendRankUserRecord::getUid, uid)
|
||||
.eq(RoomDaySendRankUserRecord::getStatDate, yesterdayStr)
|
||||
.eq(RoomDaySendRankUserRecord::getType, rewardType)
|
||||
.one();
|
||||
if (null == userRecord){
|
||||
throw new ServiceException(BusiStatus.PARAMERROR);
|
||||
} else if (userRecord.getUserReward() > 0L && userRecord.getUserReceiveReward() > 0L) {
|
||||
throw new ServiceException(BusiStatus.REQUEST_FAST);
|
||||
}
|
||||
|
||||
Date now = new Date();
|
||||
boolean updateSuccess = userRecordService.lambdaUpdate()
|
||||
.set(RoomDaySendRankUserRecord::getUserReceiveReward, userRecord.getUserReward())
|
||||
.set(RoomDaySendRankUserRecord::getUpdateTime, now)
|
||||
.eq(RoomDaySendRankUserRecord::getRoomUid, roomUid)
|
||||
.eq(RoomDaySendRankUserRecord::getPartitionId, u.getPartitionId())
|
||||
.eq(RoomDaySendRankUserRecord::getUid, uid)
|
||||
.eq(RoomDaySendRankUserRecord::getStatDate, yesterdayStr)
|
||||
.eq(RoomDaySendRankUserRecord::getType, rewardType)
|
||||
.eq(RoomDaySendRankUserRecord::getUserReceiveReward, 0L)
|
||||
.update();
|
||||
if (!updateSuccess){
|
||||
throw new ServiceException(BusiStatus.REQUEST_FAST);
|
||||
}
|
||||
|
||||
userPurseService.addDiamond(uid, userRecord.getUserReward().doubleValue(), BillObjTypeEnum.ROOM_SEND_RANK_DAY_REWARD);
|
||||
|
||||
if (!isRoomOwnerReward){
|
||||
return userRecord.getUserReward();
|
||||
}
|
||||
|
||||
roomRecordService.lambdaUpdate()
|
||||
.set(RoomDaySendRankRoomRecord::getOwnerReward, userRecord.getUserReward())
|
||||
.set(RoomDaySendRankRoomRecord::getUpdateTime, now)
|
||||
.eq(RoomDaySendRankRoomRecord::getStatDate, yesterdayStr)
|
||||
.eq(RoomDaySendRankRoomRecord::getRoomUid, roomUid)
|
||||
.eq(RoomDaySendRankRoomRecord::getPartitionId, u.getPartitionId())
|
||||
.eq(RoomDaySendRankRoomRecord::getOwnerReceiveReward, 0L)
|
||||
.update();
|
||||
|
||||
SpringContextHolder.getBean(RoomDaySendRankRewardManager.class).sendTip(uid, u.getPartitionId(), owner.getErbanNo(), isRoomOwnerReward);
|
||||
|
||||
return userRecord.getUserReward();
|
||||
}
|
||||
|
||||
@Async
|
||||
public void sendTip(Long uid, Integer partitionId, Long roomErbanNo, Boolean isRoomOwnerReward) {
|
||||
I18nAlertEnum i18nAlertEnum = isRoomOwnerReward? I18nAlertEnum.ROOM_SEND_RANK_DAY_OWNER_REWARD_TIP: I18nAlertEnum.ROOM_SEND_RANK_DAY_USER_REWARD_TIP;
|
||||
String tip = I18NMessageSourceUtil.getMessage(i18nAlertEnum, new Object[]{roomErbanNo}, partitionId);
|
||||
sendSysMsgService.sendPersonTextMsg(uid, tip);
|
||||
}
|
||||
|
||||
public Page<RoomDaySendRankRewardRecordVo> pageRecord(Long uid, Long roomUid, PageReq pageReq) {
|
||||
Users u = usersService.getNotNullUsersByUid(uid);
|
||||
|
||||
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(u.getPartitionId());
|
||||
if (!PartitionEnum.ARAB.equals(partitionEnum)){
|
||||
throw new ServiceException(BusiStatus.PARTITION_ERROR);
|
||||
}
|
||||
|
||||
Room room = roomService.getRoomByUid(roomUid);
|
||||
if (null == room){
|
||||
throw new ServiceException(BusiStatus.PARAMERROR);
|
||||
} else if (!PartitionUtil.equalsPartition(u.getPartitionId(), room.getPartitionId())){
|
||||
throw new ServiceException(BusiStatus.PARTITION_ERROR);
|
||||
}
|
||||
|
||||
Page<RoomDaySendRankRewardRecordVo> voPage = new Page<>(pageReq.getPage(), pageReq.getPageSize());
|
||||
|
||||
Page<RoomDaySendRankUserRecord> doPage = new Page<>(pageReq.getPage(), pageReq.getPageSize());
|
||||
userRecordService.page(doPage, new LambdaQueryWrapper<RoomDaySendRankUserRecord>()
|
||||
.eq(RoomDaySendRankUserRecord::getRoomUid, roomUid)
|
||||
.eq(RoomDaySendRankUserRecord::getPartitionId, u.getPartitionId())
|
||||
.eq(RoomDaySendRankUserRecord::getUid, uid)
|
||||
.gt(RoomDaySendRankUserRecord::getUserReceiveReward, 0L)
|
||||
.orderByDesc(RoomDaySendRankUserRecord::getUpdateTime));
|
||||
|
||||
if (CollectionUtils.isEmpty(doPage.getRecords())){
|
||||
return voPage;
|
||||
}
|
||||
|
||||
List<RoomDaySendRankRewardRecordVo> voList = doPage.getRecords().stream().map(record -> {
|
||||
RoomDaySendRankRewardRecordVo vo = new RoomDaySendRankRewardRecordVo();
|
||||
vo.setCreateTime(DateTimeUtil.convertDateTime(DateTimeUtil.withZoneSameInstant(record.getUpdateTime(), partitionEnum.getZoneId())));
|
||||
vo.setReward(record.getUserReward());
|
||||
return vo;
|
||||
}).toList();
|
||||
|
||||
voPage.setRecords(voList);
|
||||
voPage.setTotal(doPage.getTotal());
|
||||
|
||||
return voPage;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算每日奖励(供定时任务调用)
|
||||
*/
|
||||
@@ -72,4 +319,5 @@ public class RoomDaySendRankRewardManager {
|
||||
// 具体业务逻辑由您手动实现
|
||||
// 这里只提供接口供定时任务调用
|
||||
}
|
||||
|
||||
}
|
@@ -1,9 +1,65 @@
|
||||
package com.accompany.business.service.room;
|
||||
|
||||
import com.accompany.business.model.room.RoomDaySendRankReward;
|
||||
import com.accompany.business.mybatismapper.room.RoomDaySendRankRewardMapper;
|
||||
import com.accompany.business.vo.room.RoomDaySendRankRewardHomeVo;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 房间每日发送排行榜奖励业务逻辑处理类。
|
||||
* 提供对房间排行榜奖励记录的数据库操作及自定义业务逻辑。
|
||||
* </p>
|
||||
*
|
||||
* @author YourName
|
||||
* @since 2025-05-13
|
||||
*/
|
||||
@Service
|
||||
public class RoomDaySendRankRewardService {
|
||||
|
||||
public class RoomDaySendRankRewardService extends ServiceImpl<RoomDaySendRankRewardMapper, RoomDaySendRankReward> {
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 构造方法由 Spring 自动注入 Mapper。
|
||||
* </p>
|
||||
*/
|
||||
// 根据业务需要添加自定义方法
|
||||
public RoomDaySendRankRewardHomeVo.RewardInfoVo buildBySerialValue(BigDecimal roomSerialValue) {
|
||||
RoomDaySendRankRewardHomeVo.RewardInfoVo vo = new RoomDaySendRankRewardHomeVo.RewardInfoVo();
|
||||
vo.setSerialValue(roomSerialValue);
|
||||
vo.setCurLevel("-");
|
||||
vo.setNextLevel("-");
|
||||
vo.setNextLevelLimit(BigDecimal.ZERO);
|
||||
vo.setNextLevelReward(0L);
|
||||
vo.setOwnerReward(0L);
|
||||
vo.setTopTenReward(0L);
|
||||
|
||||
List<RoomDaySendRankReward> rewardList = lambdaQuery().orderByAsc(RoomDaySendRankReward::getSerialValue).list();
|
||||
if (CollectionUtils.isEmpty(rewardList)){
|
||||
return vo;
|
||||
}
|
||||
|
||||
List<RoomDaySendRankReward> levelList = rewardList.stream().filter(reward -> roomSerialValue.compareTo(reward.getSerialValue()) >= 0).limit(2).toList();
|
||||
if (CollectionUtils.isEmpty(levelList)){
|
||||
RoomDaySendRankReward nextLevel = rewardList.get(0);
|
||||
vo.setNextLevel(nextLevel.getName());
|
||||
vo.setNextLevelLimit(nextLevel.getSerialValue());
|
||||
} else {
|
||||
RoomDaySendRankReward curLevel = levelList.get(0);
|
||||
vo.setCurLevel(curLevel.getName());
|
||||
vo.setOwnerReward(curLevel.getRoomOwnerReward());
|
||||
vo.setTopTenReward(curLevel.getTopTenTotalReward());
|
||||
|
||||
RoomDaySendRankReward nextLevel = levelList.get(levelList.size() - 1);
|
||||
vo.setNextLevel(nextLevel.getName());
|
||||
vo.setNextLevelLimit(nextLevel.getSerialValue());
|
||||
}
|
||||
|
||||
return vo;
|
||||
}
|
||||
|
||||
}
|
@@ -1,9 +1,12 @@
|
||||
package com.accompany.business.service.room;
|
||||
|
||||
import com.accompany.business.model.room.RoomDaySendRankRoomRecord;
|
||||
import com.accompany.business.mybatismapper.room.RoomDaySendRankRoomRecordMapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class RoomDaySendRankRoomRecordService {
|
||||
public class RoomDaySendRankRoomRecordService extends ServiceImpl<RoomDaySendRankRoomRecordMapper, RoomDaySendRankRoomRecord> {
|
||||
|
||||
// 根据业务需要添加自定义方法
|
||||
}
|
@@ -1,9 +1,12 @@
|
||||
package com.accompany.business.service.room;
|
||||
|
||||
import com.accompany.business.model.room.RoomDaySendRankUserRecord;
|
||||
import com.accompany.business.mybatismapper.room.RoomDaySendRankUserRecordMapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class RoomDaySendRankUserRecordService {
|
||||
public class RoomDaySendRankUserRecordService extends ServiceImpl<RoomDaySendRankUserRecordMapper, RoomDaySendRankUserRecord> {
|
||||
|
||||
// 根据业务需要添加自定义方法
|
||||
}
|
@@ -1,15 +1,21 @@
|
||||
package com.accompany.business.controller.room;
|
||||
|
||||
import com.accompany.business.model.room.RoomDaySendRankReward;
|
||||
import com.accompany.business.service.room.RoomDaySendRankRewardManager;
|
||||
import com.accompany.business.vo.room.RoomDaySendRankHomeVo;
|
||||
import com.accompany.business.vo.room.RoomDaySendRankRewardHomeVo;
|
||||
import com.accompany.business.vo.room.RoomDaySendRankRewardRecordVo;
|
||||
import com.accompany.common.annotation.Authorization;
|
||||
import com.accompany.common.model.PageReq;
|
||||
import com.accompany.common.result.BusiResult;
|
||||
import com.accompany.common.result.PageResult;
|
||||
import com.accompany.common.status.BusiStatus;
|
||||
import com.accompany.core.base.UidContextHolder;
|
||||
import com.accompany.core.exception.ServiceException;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import io.swagger.annotations.*;
|
||||
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.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@Api(tags = "房间日流水奖励")
|
||||
@@ -18,7 +24,7 @@ import org.springframework.web.bind.annotation.RestController;
|
||||
public class RoomDaySendRankRewardController {
|
||||
|
||||
@Autowired
|
||||
private RoomDaySendRankRewardManager roomDaySendRankRewardManager;
|
||||
private RoomDaySendRankRewardManager manager;
|
||||
|
||||
@Authorization
|
||||
@ApiOperation("获取房间日流水奖励首页信息")
|
||||
@@ -27,10 +33,56 @@ public class RoomDaySendRankRewardController {
|
||||
@ApiImplicitParam(name = "isToday", value = "是否今天", required = true, dataType = "boolean", defaultValue = "true")
|
||||
})
|
||||
@GetMapping("/home")
|
||||
public BusiResult<RoomDaySendRankHomeVo> getHomeInfo(Long roomUid, Boolean isToday) {
|
||||
public BusiResult<RoomDaySendRankRewardHomeVo> getHomeInfo(Long roomUid, Boolean isToday) {
|
||||
if (null == roomUid || null == isToday){
|
||||
throw new ServiceException(BusiStatus.PARAMERROR);
|
||||
}
|
||||
Long uid = UidContextHolder.get();
|
||||
// 调用Manager处理业务逻辑
|
||||
RoomDaySendRankHomeVo result = roomDaySendRankRewardManager.getHomeInfo(uid, roomUid, isToday);
|
||||
RoomDaySendRankRewardHomeVo result = manager.getHomeInfo(uid, roomUid, isToday);
|
||||
return BusiResult.success(result);
|
||||
}
|
||||
|
||||
@Authorization
|
||||
@ApiOperation("获取奖励")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "roomUid", value = "房间UID", required = true),
|
||||
@ApiImplicitParam(name = "isRoomOwnerReward", value = "是否是房主奖励", required = true, dataType = "boolean", defaultValue = "true")
|
||||
})
|
||||
@GetMapping("/receiveReward")
|
||||
public BusiResult<Long> receiveReward(Long roomUid, Boolean isRoomOwnerReward) {
|
||||
if (null == roomUid || null == isRoomOwnerReward){
|
||||
throw new ServiceException(BusiStatus.PARAMERROR);
|
||||
}
|
||||
|
||||
Long uid = UidContextHolder.get();
|
||||
if (isRoomOwnerReward && !uid.equals(roomUid)){
|
||||
throw new ServiceException(BusiStatus.PARAMERROR);
|
||||
}
|
||||
|
||||
// 调用Manager处理业务逻辑
|
||||
Long reward = manager.receiveReward(uid, roomUid, isRoomOwnerReward);
|
||||
return BusiResult.success(reward);
|
||||
}
|
||||
|
||||
@Authorization
|
||||
@ApiOperation("获取奖励")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "roomUid", value = "房间UID", required = true),
|
||||
@ApiImplicitParam(name = "page", value = "页码", required = true, defaultValue = "1"),
|
||||
@ApiImplicitParam(name = "pageSize", value = "页长", required = true, defaultValue = "10"),
|
||||
})
|
||||
@GetMapping("/pageRecord")
|
||||
public BusiResult<PageResult<RoomDaySendRankRewardRecordVo>> pageRecord(Long roomUid, PageReq pageReq) {
|
||||
if (null == roomUid){
|
||||
throw new ServiceException(BusiStatus.PARAMERROR);
|
||||
}
|
||||
|
||||
Long uid = UidContextHolder.get();
|
||||
|
||||
// 调用Manager处理业务逻辑
|
||||
Page<RoomDaySendRankRewardRecordVo> page = manager.pageRecord(uid, roomUid, pageReq);
|
||||
return BusiResult.success(new PageResult<>(page));
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user