日常任务-房间流水奖励

This commit is contained in:
2025-08-26 16:52:51 +08:00
parent abbeab333b
commit ac980ac0f8
20 changed files with 527 additions and 12 deletions

View File

@@ -979,6 +979,7 @@ public enum BusiStatus {
GUILD_H5_INVITE_EMAIL_ALREADY_BOUND(33001, "该邮箱地址不是新的"),
GUILD_H5_INVITE_JOIN_GUILD_NOT_EXIST(33002, "邀请人公会不存在"),
DAILY_TASK_LIMIT(500, "ACCESS DENIED"),
ROOM_DAY_DIAMOND_REWARD_RECV_RECORD_EXIST(500, "RECEIVED"),
;
private final int value;

View File

@@ -13,6 +13,8 @@ public enum DailyTaskTypeEnum {
RECV_LUCKY_GIFT("RECV_LUCKY_GIFT"),//收到Lucky/Bravo礼物
RECV_NOMAL_GIFT("RECV_NOMAL_GIFT"),//收到普通礼物
RECV_NOMAL_GIFT_GOLD("RECV_NOMAL_GIFT_GOLD"),//收到礼物(价值超过2w金币)
UP_MIC_COIN("UP_MIC_COIN"),//上麦聊天(获得金币)
ROOM_DAY_DIAMOND("ROOM_DAY_DIAMOND"),//房间日流水奖励
;
private String handlerType;

View File

@@ -1,10 +1,10 @@
package com.accompany.business.model.room;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.io.Serializable;
import lombok.Data;
/**
* 房间日奖励政策实体类
@@ -16,7 +16,10 @@ import lombok.Data;
public class RoomDayDiamondReward implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 等级
*/
private String level;
/**
* 分区id
*/
@@ -29,6 +32,10 @@ public class RoomDayDiamondReward implements Serializable {
* 金币奖励
*/
private BigDecimal rewardGold;
/**
* 金币奖励
*/
private BigDecimal levelRewardGold;
/**
* 创建时间
*/

View File

@@ -0,0 +1,58 @@
package com.accompany.business.model.room;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 房间日奖励金币领取记录实体类
*
* @author
* @since 2025-08-26
*/
@Data
public class RoomDayDiamondRewardRecvRecord implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 分区id
*/
private Integer partitionId;
/**
* 领取uid
*/
private Long uid;
/**
* 房间room_uid
*/
private Long roomUid;
/**
* 领取日期
*/
private String statDate;
/**
* 领取挡位
*/
private String level;
/**
* 金币流水
*/
private BigDecimal goldNum;
/**
* 金币奖励
*/
private BigDecimal rewardGold;
/**
* 领取时间
*/
private Date createTime;
}

View File

@@ -0,0 +1,22 @@
package com.accompany.business.vo.dailytask;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class DailyTaskRoomDiamondDetailVo {
@ApiModelProperty("等级")
private String level;
@ApiModelProperty("进度")
private BigDecimal processNum;
@ApiModelProperty("长度")
private BigDecimal maxNum;
@ApiModelProperty("上一级长度")
private BigDecimal preMaxNum;
@ApiModelProperty("奖励")
private BigDecimal rewardNum;
@ApiModelProperty("状态0不可领取1-可领取2-已经领取")
private Byte status;
}

View File

@@ -0,0 +1,15 @@
package com.accompany.business.vo.dailytask;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class DailyTaskRoomDiamondVo {
private Long roomUid;
private String statDate;
private String avatar;
private BigDecimal totalGoldNum;
private List<DailyTaskRoomDiamondDetailVo> levelVos;
}

View File

@@ -31,4 +31,6 @@ public class DailyTaskVo {
@ApiModelProperty("奖励列表")
private List<DailyTaskRewardVo> rewardVos;
private List<DailyTaskReward> configRewards;
@ApiModelProperty("房间流水奖励")
private DailyTaskRoomDiamondVo diamondVo;
}

View File

@@ -1,6 +1,5 @@
package com.accompany.business.vo.room;
import com.accompany.business.model.room.RoomDayDiamondRewardRecord;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.annotations.ApiModel;
@@ -44,6 +43,12 @@ public class RoomDayDiamondRewardRecordVo {
@ExcelProperty("对应流水发放金币")
@ApiModelProperty("对应流水发放金币")
private BigDecimal rewardGold;
@ExcelProperty("主播已领金币")
@ApiModelProperty("主播已领金币")
private BigDecimal receivedGold;
@ExcelProperty("领取主播ID")
@ApiModelProperty("领取主播ID")
private Long receiveErbanNo;
@ExcelProperty("发放状态0:未发放1已经发放")
@ApiModelProperty("发放状态0:未发放1已经发放")
private Byte status;

View File

@@ -0,0 +1,19 @@
package com.accompany.business.mybatismapper.room;
import com.accompany.business.model.room.RoomDayDiamondRewardRecvRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 房间日奖励金币领取记录 Mapper 接口
*
* @author
* @since 2025-08-26
*/
public interface RoomDayDiamondRewardRecvRecordMapper extends BaseMapper<RoomDayDiamondRewardRecvRecord> {
List<RoomDayDiamondRewardRecvRecord> getUniqueKeyList(@Param("partitionId") Integer partitionId, @Param("startDate") String startDate,
@Param("endDate") String endDate, @Param("roomUids") List<Long> roomUids);
}

View File

@@ -30,7 +30,6 @@ import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static com.accompany.business.constant.dailytask.DailyTaskTypeEnum.valueOf;
@Slf4j
@Service
@@ -169,7 +168,7 @@ public class DailyTaskService {
try {
DailyTaskVo dailyTaskVo = DailyTaskVo.builder().
taskConfigId(dailyTaskConfig.getTaskConfigId()).
taskType(valueOf(dailyTaskConfig.getTaskKey())).
taskType(DailyTaskTypeEnum.valueOf(dailyTaskConfig.getTaskKey())).
standardValue(dailyTaskConfig.getReachNum())
.build();
resultList.add(dailyTaskVo);
@@ -216,7 +215,7 @@ public class DailyTaskService {
DailyTaskVo dailyTaskVo = DailyTaskVo.builder().
taskConfigId(dailyTaskConfig.getTaskConfigId()).
taskType(valueOf(dailyTaskConfig.getTaskKey())).
taskType(DailyTaskTypeEnum.valueOf(dailyTaskConfig.getTaskKey())).
standardValue(dailyTaskConfig.getReachNum())
.build();

View File

@@ -0,0 +1,95 @@
package com.accompany.business.service.dailytask.handler;
import com.accompany.business.constant.dailytask.DailyTaskTypeEnum;
import com.accompany.business.model.room.RoomDayDiamondReward;
import com.accompany.business.model.room.RoomDayDiamondRewardRecvRecord;
import com.accompany.business.service.dailytask.AbstractDailyTaskHandler;
import com.accompany.business.service.dailytask.annotation.DailyTaskHandlerType;
import com.accompany.business.service.room.RoomDayDiamondNumService;
import com.accompany.business.service.room.RoomDayDiamondRewardRecvRecordService;
import com.accompany.business.service.room.RoomDayDiamondRewardService;
import com.accompany.business.service.room.RoomService;
import com.accompany.business.vo.dailytask.*;
import com.accompany.core.model.Room;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Component
@DailyTaskHandlerType(DailyTaskTypeEnum.ROOM_DAY_DIAMOND)
public class RoomDayDiamondHandler extends AbstractDailyTaskHandler {
@Autowired
private RoomService roomService;
@Autowired
private RoomDayDiamondNumService roomDayDiamondNumService;
@Autowired
private RoomDayDiamondRewardService roomDayDiamondRewardService;
@Autowired
private RoomDayDiamondRewardRecvRecordService RoomDayDiamondRewardRecvRecordService;
@Override
public void doExecuteProgress(DailyProgressContext progressContext) {
Long uid = progressContext.getUid();
Integer partitionId = progressContext.getPartitionId();
String todayDate = getTodayDate(partitionId, progressContext.getCreateTime());
}
@Override
public DailyTaskVo doHandle(DailyTaskContext context) {
DailyTaskVo dailyTaskVo = context.getDailyTaskVo();
Integer partitionId = context.getPartitionId();
Long uid = context.getUid();
DailyTaskRoomDiamondVo dailyTaskRoomDiamondVo = new DailyTaskRoomDiamondVo();
dailyTaskVo.setDiamondVo(dailyTaskRoomDiamondVo);
dailyTaskRoomDiamondVo.setRoomUid(uid);
String todayDate = context.getTodayDate();
dailyTaskRoomDiamondVo.setStatDate(todayDate);
Room roomByUid = roomService.getRoomByUid(uid);
dailyTaskRoomDiamondVo.setAvatar(roomByUid.getAvatar());
BigDecimal totalGoldNum = roomDayDiamondNumService.getGoldNum(partitionId, uid, todayDate);
dailyTaskRoomDiamondVo.setTotalGoldNum(totalGoldNum);
List<DailyTaskRoomDiamondDetailVo> rewardList = new ArrayList<>();
dailyTaskRoomDiamondVo.setLevelVos(rewardList);
List<RoomDayDiamondReward> roomDayDiamondRewards = roomDayDiamondRewardService.listByPartitionIdAsc(partitionId);
if (CollectionUtils.isEmpty(roomDayDiamondRewards)) {
return dailyTaskVo;
}
Map<String, RoomDayDiamondRewardRecvRecord> levelMap = RoomDayDiamondRewardRecvRecordService.getLevelMap(partitionId, uid, todayDate);
int size = roomDayDiamondRewards.size();
for (int i = 0; i < size; i++) {
RoomDayDiamondReward diamondReward = roomDayDiamondRewards.get(i);
DailyTaskRoomDiamondDetailVo detailVo = new DailyTaskRoomDiamondDetailVo();
detailVo.setLevel(diamondReward.getLevel());
detailVo.setRewardNum(diamondReward.getLevelRewardGold());
BigDecimal preMaxNum = BigDecimal.ZERO;
if (i > 0) {
preMaxNum = roomDayDiamondRewards.get(i - 1).getDiamondNum();
}
detailVo.setPreMaxNum(preMaxNum);
detailVo.setMaxNum(diamondReward.getDiamondNum());
BigDecimal length = detailVo.getMaxNum().subtract(preMaxNum);
BigDecimal tmpTotalGoldNum = totalGoldNum.subtract(detailVo.getPreMaxNum());
BigDecimal processNum = tmpTotalGoldNum.compareTo(BigDecimal.ZERO) >= 0
? tmpTotalGoldNum.compareTo(length)>=0 ? length : tmpTotalGoldNum
: BigDecimal.ZERO;
detailVo.setProcessNum(processNum);
Boolean received = levelMap.containsKey(diamondReward.getLevel());
if (received) {
detailVo.setStatus((byte) 2);
} else if (processNum.compareTo(length) == 0) {
detailVo.setStatus((byte) 1);
} else {
detailVo.setStatus((byte) 0);
}
rewardList.add(detailVo);
}
return dailyTaskVo;
}
}

View File

@@ -0,0 +1,65 @@
package com.accompany.business.service.dailytask.handler;
import com.accompany.business.constant.dailytask.DailyTaskTypeEnum;
import com.accompany.business.service.dailytask.AbstractDailyTaskHandler;
import com.accompany.business.service.dailytask.annotation.DailyTaskHandlerType;
import com.accompany.business.service.room.RoomMicService;
import com.accompany.business.vo.dailytask.DailyProgressContext;
import com.accompany.business.vo.dailytask.DailyTaskContext;
import com.accompany.business.vo.dailytask.DailyTaskVo;
import com.accompany.common.result.BusiResult;
import org.redisson.api.RAtomicLong;
import org.redisson.api.RBucket;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.Duration;
import java.util.Calendar;
import java.util.Map;
@Component
@DailyTaskHandlerType(DailyTaskTypeEnum.UP_MIC_COIN)
public class UpMicCoinHandler extends AbstractDailyTaskHandler {
@Autowired
private RoomMicService roomMicService;
@Override
public void doExecuteProgress(DailyProgressContext progressContext) {
// Long uid = progressContext.getUid();
// Integer partitionId = progressContext.getPartitionId();
// String todayDate = getTodayDate(partitionId, progressContext.getCreateTime());
}
@Override
public DailyTaskVo doHandle(DailyTaskContext context) {
Long uid = context.getUid();
DailyTaskVo dailyTaskVo = context.getDailyTaskVo();
String todayDate = context.getTodayDate();
RAtomicLong userDayUpMicDuration = roomMicService.userDayUpMicDuration(todayDate, uid);
long totalDuration = userDayUpMicDuration.get();
RBucket<Long> longRBucket = roomMicService.userUpMicTime(uid);
Long upMicTime = longRBucket.get();
DailyTaskTypeEnum taskType = dailyTaskVo.getTaskType();
if (longRBucket.isExists()) {
Map<String, Integer> upMicDuration = roomMicService.calUserUpMicDuration(upMicTime, Calendar.getInstance().getTimeInMillis(), context.getPartitionId());
if (!upMicDuration.isEmpty()) {
totalDuration += upMicDuration.getOrDefault(todayDate, 0);
}
}
if (totalDuration >= dailyTaskVo.getStandardValue()) {
taskStatus(uid, todayDate, taskType).set(1, Duration.ofDays(1));
}
dailyTaskVo.setReachNum(totalDuration);
dailyTaskVo.setReceiveStatus(computeReceiveStatus(uid, todayDate, taskType));
return dailyTaskVo;
}
@Override
public BusiResult receive(Long uid, String receiveDate, DailyTaskVo dailyTaskVo) {
super.receive(uid, receiveDate, dailyTaskVo);
return BusiResult.success();
}
}

View File

@@ -15,4 +15,8 @@ import java.util.Date;
public interface RoomDayDiamondNumService extends IService<RoomDayDiamondNum> {
Integer addDiamondNum(Integer partitionId, Long roomUid, Date statDate, Double diamondNum, Double goldNum);
BigDecimal getGoldNum(Integer partitionId, Long roomUid, String statDate);
}

View File

@@ -0,0 +1,114 @@
package com.accompany.business.service.room;
import com.accompany.business.model.room.RoomDayDiamondReward;
import com.accompany.business.model.room.RoomDayDiamondRewardRecvRecord;
import com.accompany.business.mybatismapper.room.RoomDayDiamondRewardRecvRecordMapper;
import com.accompany.business.service.purse.UserPurseService;
import com.accompany.business.service.record.BillRecordService;
import com.accompany.business.service.user.UsersService;
import com.accompany.common.result.BusiResult;
import com.accompany.common.status.BusiStatus;
import com.accompany.common.utils.DateTimeUtil;
import com.accompany.core.enumeration.BillObjTypeEnum;
import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.exception.ServiceException;
import com.accompany.core.model.Users;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.ZonedDateTime;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 房间日奖励金币领取记录 服务实现类
*
* @author
* @since 2025-08-26
*/
@Service
public class RoomDayDiamondRewardRecvRecordService extends ServiceImpl<RoomDayDiamondRewardRecvRecordMapper, RoomDayDiamondRewardRecvRecord> {
@Autowired
private UsersService usersService;
@Autowired
private RoomDayDiamondNumService roomDayDiamondNumService;
@Autowired
private RoomDayDiamondRewardService roomDayDiamondRewardService;
@Autowired
private UserPurseService userPurseService;
@Autowired
private BillRecordService billRecordService;
public BusiResult receive(Long uid, Long roomUid, String receiveDate, String level) {
Users users = usersService.getUsersByUid(roomUid);
Integer partitionId = users.getPartitionId();
LambdaQueryWrapper<RoomDayDiamondRewardRecvRecord> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(RoomDayDiamondRewardRecvRecord::getPartitionId, partitionId)
.eq(RoomDayDiamondRewardRecvRecord::getRoomUid, roomUid)
.eq(RoomDayDiamondRewardRecvRecord::getStatDate, receiveDate)
.eq(RoomDayDiamondRewardRecvRecord::getLevel, level);
Long count = baseMapper.selectCount(queryWrapper);
if (count > 0) {
throw new ServiceException(BusiStatus.ROOM_DAY_DIAMOND_REWARD_RECV_RECORD_EXIST);
}
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId);
ZonedDateTime zonedDateTime = DateTimeUtil.convertWithZoneId(new Date(), partitionEnum.getZoneId());
String todayDate = zonedDateTime.format(DateTimeUtil.dateFormatter);
if (!todayDate.equals(receiveDate)) {
throw new ServiceException(BusiStatus.DAILY_RECEIVE_EXPIRE);
}
BigDecimal goldNum = roomDayDiamondNumService.getGoldNum(partitionId, roomUid, receiveDate);
RoomDayDiamondReward diamondReward = roomDayDiamondRewardService.getByLevel(partitionId, level);
if (diamondReward == null || goldNum.compareTo(diamondReward.getDiamondNum()) < 0) {
throw new ServiceException(BusiStatus.SERVERBUSY);
}
RoomDayDiamondRewardRecvRecord roomDayDiamondRewardRecvRecord = new RoomDayDiamondRewardRecvRecord();
roomDayDiamondRewardRecvRecord.setPartitionId(partitionId);
roomDayDiamondRewardRecvRecord.setRoomUid(roomUid);
roomDayDiamondRewardRecvRecord.setUid(uid);
roomDayDiamondRewardRecvRecord.setLevel(level);
roomDayDiamondRewardRecvRecord.setStatDate(receiveDate);
roomDayDiamondRewardRecvRecord.setCreateTime(new Date());
roomDayDiamondRewardRecvRecord.setGoldNum(goldNum);
// 领取的奖励用户逐级领取只能用字段levelRewardGold
BigDecimal levelRewardGold = diamondReward.getLevelRewardGold();
roomDayDiamondRewardRecvRecord.setRewardGold(levelRewardGold);
int insert = baseMapper.insert(roomDayDiamondRewardRecvRecord);
if (insert <= 0) {
throw new ServiceException(BusiStatus.SERVERBUSY);
}
userPurseService.addDiamond(roomUid, levelRewardGold.doubleValue(), BillObjTypeEnum.ROOM_DAY_DIAMOND_REWARD,
(userPurse) -> billRecordService.insertGeneralBillRecord(roomUid, roomDayDiamondRewardRecvRecord.getId().toString(),
BillObjTypeEnum.ROOM_DAY_DIAMOND_REWARD, levelRewardGold.doubleValue(), userPurse));
return BusiResult.success();
}
public Map<String, RoomDayDiamondRewardRecvRecord> getLevelMap(Integer partitionId, Long roomUid, String statDate) {
LambdaQueryWrapper<RoomDayDiamondRewardRecvRecord> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(RoomDayDiamondRewardRecvRecord::getPartitionId, partitionId)
.eq(RoomDayDiamondRewardRecvRecord::getRoomUid, roomUid)
.eq(RoomDayDiamondRewardRecvRecord::getStatDate, statDate);
List<RoomDayDiamondRewardRecvRecord> roomDayDiamondRewardRecvRecords = baseMapper.selectList(queryWrapper);
if (CollectionUtils.isEmpty(roomDayDiamondRewardRecvRecords)) {
return Collections.emptyMap();
}
return roomDayDiamondRewardRecvRecords.stream().collect(Collectors.toMap(RoomDayDiamondRewardRecvRecord::getLevel, x -> x));
}
public Map<String, RoomDayDiamondRewardRecvRecord> getUniqueKeyMap(Integer partitionId, String startDate, String endDate, List<Long> roomUids) {
List<RoomDayDiamondRewardRecvRecord> uniqueKeyList = baseMapper.getUniqueKeyList(partitionId, startDate, endDate, roomUids);
if (CollectionUtils.isEmpty(uniqueKeyList)) {
return Collections.emptyMap();
}
return uniqueKeyList.stream().collect(Collectors.toMap(x -> String.format("%s_%s", x.getRoomUid(), x.getStatDate()),
x -> x));
}
}

View File

@@ -4,6 +4,7 @@ import com.accompany.business.model.room.RoomDayDiamondReward;
import com.baomidou.mybatisplus.extension.service.IService;
import java.math.BigDecimal;
import java.util.List;
import java.util.TreeMap;
/**
@@ -23,4 +24,8 @@ public interface RoomDayDiamondRewardService extends IService<RoomDayDiamondRewa
* @return
*/
BigDecimal calGoldReward(TreeMap<BigDecimal, RoomDayDiamondReward> treeMap, BigDecimal diamondNum);
List<RoomDayDiamondReward> listByPartitionIdAsc(Integer partitionId);
RoomDayDiamondReward getByLevel(Integer partitionId, String level);
}

View File

@@ -6,6 +6,8 @@ import com.accompany.business.service.room.RoomDayDiamondNumService;
import com.accompany.business.service.room.RoomHourDiamondNumService;
import com.accompany.common.utils.DateTimeUtil;
import com.accompany.core.enumeration.PartitionEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -39,4 +41,17 @@ public class RoomDayDiamondNumServiceImpl extends ServiceImpl<RoomDayDiamondNumM
String format = zonedDateTime.format(DateTimeUtil.dateFormatter);
return baseMapper.addDiamondNum(partitionId, roomUid, format, BigDecimal.valueOf(diamondNum), BigDecimal.valueOf(goldNum));
}
@Override
public BigDecimal getGoldNum(Integer partitionId, Long roomUid, String statDate) {
LambdaQueryWrapper<RoomDayDiamondNum> wrapper = Wrappers.lambdaQuery();
wrapper.eq(RoomDayDiamondNum::getPartitionId, partitionId);
wrapper.eq(RoomDayDiamondNum::getRoomUid, roomUid);
wrapper.eq(RoomDayDiamondNum::getStatDate, statDate);
RoomDayDiamondNum roomDayDiamondNum = baseMapper.selectOne(wrapper, false);
if (roomDayDiamondNum != null) {
return roomDayDiamondNum.getGoldNum();
}
return BigDecimal.ZERO;
}
}

View File

@@ -5,6 +5,7 @@ import com.accompany.business.model.guild.Guild;
import com.accompany.business.model.room.RoomDayDiamondNum;
import com.accompany.business.model.room.RoomDayDiamondReward;
import com.accompany.business.model.room.RoomDayDiamondRewardRecord;
import com.accompany.business.model.room.RoomDayDiamondRewardRecvRecord;
import com.accompany.business.mybatismapper.room.RoomDayDiamondRewardRecordMapper;
import com.accompany.business.service.BaseSendService;
import com.accompany.business.service.guild.GuildService;
@@ -12,6 +13,7 @@ import com.accompany.business.service.purse.UserPurseService;
import com.accompany.business.service.record.BillRecordService;
import com.accompany.business.service.room.RoomDayDiamondNumService;
import com.accompany.business.service.room.RoomDayDiamondRewardRecordService;
import com.accompany.business.service.room.RoomDayDiamondRewardRecvRecordService;
import com.accompany.business.service.room.RoomDayDiamondRewardService;
import com.accompany.business.service.user.UsersService;
import com.accompany.business.vo.room.RoomDayDiamondRewardRecordVo;
@@ -29,6 +31,7 @@ import com.accompany.core.exception.ServiceException;
import com.accompany.core.model.Users;
import com.accompany.core.service.message.MessageRobotPushService;
import com.accompany.core.util.I18NMessageSourceUtil;
import com.accompany.core.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -36,6 +39,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
@@ -76,6 +80,8 @@ public class RoomDayDiamondRewardRecordServiceImpl extends ServiceImpl<RoomDayDi
private MessageRobotPushService messageRobotPushService;
@Autowired
private GuildService guildService;
@Autowired
private RoomDayDiamondRewardRecvRecordService roomDayDiamondRewardRecvRecordService;
@Override
public PageResult<RoomDayDiamondRewardRecordVo> listRecord(Integer partitionId, Integer regionId, Long erbanNo, Long ownerErbanNo, Integer guildId,
@@ -84,6 +90,11 @@ public class RoomDayDiamondRewardRecordServiceImpl extends ServiceImpl<RoomDayDi
if (partitionId == null) {
throw new AdminServiceException("分区不能为空");
}
if (StringUtils.isEmpty(startDate) || StringUtils.isEmpty(endDate)) {
Date date = new Date();
startDate = DateUtil.formatDate(DateUtil.offsetDay(date, -30));
endDate = DateUtil.formatDate(date);
}
//查询列表不包含今天
String notEqualsTodate = DateTimeUtil.convertWithZoneId(new Date(), PartitionEnum.getByPartitionId(partitionId).getZoneId())
.format(DateTimeUtil.dateFormatter);
@@ -118,6 +129,13 @@ public class RoomDayDiamondRewardRecordServiceImpl extends ServiceImpl<RoomDayDi
List<Integer> collect = rows.stream().map(RoomDayDiamondRewardRecordVo::getPartitionId).collect(Collectors.toList());
collect.stream().distinct()
.forEach(x -> partitionTreeMap.put(x, roomDayDiamondRewardService.getRewardTreeMapByPartitionId(partitionId)));
Map<String, RoomDayDiamondRewardRecvRecord> recvRecordMap = roomDayDiamondRewardRecvRecordService.getUniqueKeyMap(partitionId, startDate, endDate, rows.stream()
.map(RoomDayDiamondRewardRecordVo::getRoomUid).collect(Collectors.toList()));
Map<Long, Users> usersMapByUids = new HashMap<>();
if (MapUtils.isNotEmpty(recvRecordMap)) {
List<Long> uids = recvRecordMap.values().stream().map(RoomDayDiamondRewardRecvRecord::getUid).collect(Collectors.toList());
usersMapByUids = usersService.getUsersMapByUids(uids);
}
for (RoomDayDiamondRewardRecordVo row : rows) {
if (row.getCreateTime() != null) {
row.setSendTime(DateUtil.formatDateTime(row.getCreateTime()));
@@ -130,6 +148,15 @@ public class RoomDayDiamondRewardRecordServiceImpl extends ServiceImpl<RoomDayDi
}
TreeMap<BigDecimal, RoomDayDiamondReward> dayDiamondRewardTreeMap = partitionTreeMap.get(row.getPartitionId());
row.setRewardGold(roomDayDiamondRewardService.calGoldReward(dayDiamondRewardTreeMap, row.getGoldNum()));
RoomDayDiamondRewardRecvRecord roomDayDiamondRewardRecvRecord = recvRecordMap.get(String.format("%s_%s", row.getRoomUid(), row.getStatDate()));
if (roomDayDiamondRewardRecvRecord != null) {
row.setReceivedGold(roomDayDiamondRewardRecvRecord.getGoldNum());
row.setStatus((byte)1);
Users users = usersMapByUids.get(roomDayDiamondRewardRecvRecord.getUid());
if (users != null) {
row.setReceiveErbanNo(roomDayDiamondRewardRecvRecord.getUid());
}
}
}
return pageResult;
}

View File

@@ -1,7 +1,6 @@
package com.accompany.business.service.room.impl;
import com.accompany.business.model.room.RoomDayDiamondReward;
import com.accompany.business.model.room.RoomLevelInfo;
import com.accompany.business.mybatismapper.room.RoomDayDiamondRewardMapper;
import com.accompany.business.service.room.RoomDayDiamondRewardService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -27,9 +26,7 @@ public class RoomDayDiamondRewardServiceImpl extends ServiceImpl<RoomDayDiamondR
@Override
public TreeMap<BigDecimal, RoomDayDiamondReward> getRewardTreeMapByPartitionId(Integer partitionId) {
TreeMap<BigDecimal, RoomDayDiamondReward> resultMap = new TreeMap<>();
LambdaQueryWrapper<RoomDayDiamondReward> wrapper = Wrappers.lambdaQuery();
wrapper.eq(RoomDayDiamondReward::getPartitionId, partitionId).orderByAsc(RoomDayDiamondReward::getDiamondNum);
List<RoomDayDiamondReward> roomDayDiamondRewards = baseMapper.selectList(wrapper);
List<RoomDayDiamondReward> roomDayDiamondRewards = this.listByPartitionIdAsc(partitionId);
if (CollectionUtils.isEmpty(roomDayDiamondRewards)) {
return resultMap;
}
@@ -48,4 +45,19 @@ public class RoomDayDiamondRewardServiceImpl extends ServiceImpl<RoomDayDiamondR
return totalLevelInfoEntry.getValue().getRewardGold();
}
@Override
public List<RoomDayDiamondReward> listByPartitionIdAsc(Integer partitionId) {
LambdaQueryWrapper<RoomDayDiamondReward> wrapper = Wrappers.lambdaQuery();
wrapper.eq(RoomDayDiamondReward::getPartitionId, partitionId).orderByAsc(RoomDayDiamondReward::getDiamondNum);
return baseMapper.selectList(wrapper);
}
@Override
public RoomDayDiamondReward getByLevel(Integer partitionId, String level) {
LambdaQueryWrapper<RoomDayDiamondReward> wrapper = Wrappers.lambdaQuery();
wrapper.eq(RoomDayDiamondReward::getPartitionId, partitionId)
.eq(RoomDayDiamondReward::getLevel, level);
return baseMapper.selectOne(wrapper);
}
}

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.accompany.business.mybatismapper.room.RoomDayDiamondRewardRecvRecordMapper">
<select id="getUniqueKeyList" resultType="com.accompany.business.model.room.RoomDayDiamondRewardRecvRecord">
SELECT
stat_date,
room_uid,
uid,
sum(reward_gold) reward_gold
FROM
room_day_diamond_reward_recv_record
WHERE
partition_id = #{partitionId}
and stat_date >= #{startDate}
and stat_date &lt;= #{endDate}
<foreach collection="roomUids" separator="," close=")" open="AND room_uid IN (" item="ru">
#{ru}
</foreach>
GROUP BY stat_date, room_uid
</select>
</mapper>

View File

@@ -0,0 +1,26 @@
package com.accompany.business.controller.room;
import com.accompany.business.service.room.RoomDayDiamondRewardRecvRecordService;
import com.accompany.common.result.BusiResult;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static com.accompany.common.constant.ApplicationConstant.PublicParameters.PUB_UID;
@RestController
@RequestMapping("/roomDayGoldReward")
public class RoomDayDiamondRewardController {
@Autowired
private RoomDayDiamondRewardRecvRecordService roomDayDiamondRewardRecvRecordService;
@ApiOperation(value = "领取房间日钻石奖励", httpMethod = "POST")
@PostMapping("/recv")
public BusiResult recv(@RequestHeader(PUB_UID) Long uid, Long roomUid, String receiveDate, String level) {
return roomDayDiamondRewardRecvRecordService.receive(uid, roomUid, receiveDate, level);
}
}