日任务房间日流水返回今天结构

This commit is contained in:
2025-09-10 18:24:53 +08:00
parent c947bb1256
commit b9cee71c31
11 changed files with 142 additions and 77 deletions

View File

@@ -24,7 +24,7 @@ import java.nio.charset.StandardCharsets;
@RestController
@RequestMapping("/admin/roomDayDiamond")
public class RoomDayDiamondRewardController extends BaseController {
public class RoomDayDiamondRewardAdminController extends BaseController {
@Autowired
private RoomDayDiamondRewardRecordService roomDayDiamondRewardRecordService;
@@ -69,7 +69,7 @@ public class RoomDayDiamondRewardController extends BaseController {
@ApiOperation(value = "每日钻石流水列表-发放", httpMethod = "POST")
@PostMapping("/send")
public BusiResult send(Long id) {
public BusiResult send(Long id) throws InterruptedException {
return roomDayDiamondRewardRecordService.send(id, getAdminId());
}
}

View File

@@ -985,6 +985,7 @@ public enum BusiStatus {
SUPER_BLOCK_NOAUTHORITY(500, "NOAUTHORITY OPERATE"),
SUPER_BLOCK_MUST_BLOCK_REASON(500, "MUST SIGN BLOCK REASON"),
DAILY_TASK_REWARD_ERROR(500, "DAILY TASK REWARD ERROR"),
ROOM_DAY_DIAMOND_REWARD_DATE_CHECK(500, "TODAY NOT ALLOW RECEIVE"),
;
private final int value;

View File

@@ -15,5 +15,7 @@ public class DailyTaskRoomDiamondVo {
private BigDecimal totalGoldNum;
@ApiModelProperty("状态0不可领取1-可领取2-已经领取")
private Byte status;
private String maxLevel;
private BigDecimal totalRewardNum = BigDecimal.ZERO;
private List<DailyTaskRoomDiamondDetailVo> levelVos;
}

View File

@@ -6,10 +6,7 @@ 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.service.room.*;
import com.accompany.business.vo.dailytask.*;
import com.accompany.core.model.Room;
import com.accompany.core.model.Users;
@@ -33,7 +30,9 @@ public class RoomDayDiamondHandler extends AbstractDailyTaskHandler {
@Autowired
private RoomDayDiamondRewardService roomDayDiamondRewardService;
@Autowired
private RoomDayDiamondRewardRecvRecordService RoomDayDiamondRewardRecvRecordService;
private RoomDayDiamondRewardRecvRecordService roomDayDiamondRewardRecvRecordService;
@Autowired
private RoomDayDiamondRewardRecordService roomDayDiamondRewardRecordService;
@Override
public void doExecuteProgress(DailyProgressContext progressContext) {
@@ -52,9 +51,9 @@ public class RoomDayDiamondHandler extends AbstractDailyTaskHandler {
}
Room roomByUid = roomService.getRoomByUid(uid);
String todayDate = context.getTodayDate();
resultList.add(buildRoomDiamondVo(1, todayDate, roomDayDiamondRewards, uid, partitionId, roomByUid));
resultList.add(buildRoomDiamondVo(DateType.TODAY, todayDate, roomDayDiamondRewards, uid, partitionId, roomByUid));
String yesterdayDate = DateUtil.formatDate(DateUtil.offsetDay(DateUtil.parseDate(todayDate), -1));
resultList.add(buildRoomDiamondVo(2, yesterdayDate, roomDayDiamondRewards, uid, partitionId, roomByUid));
resultList.add(buildRoomDiamondVo(DateType.YESTERDAY, yesterdayDate, roomDayDiamondRewards, uid, partitionId, roomByUid));
return dailyTaskVo;
}
@@ -64,8 +63,7 @@ public class RoomDayDiamondHandler extends AbstractDailyTaskHandler {
dailyTaskRoomDiamondVo.setRoomUid(uid);
dailyTaskRoomDiamondVo.setDateType(dateType);
dailyTaskRoomDiamondVo.setStatDate(dayDate);
dailyTaskRoomDiamondVo.setStatus((byte) 3);
dailyTaskRoomDiamondVo.setStatus(ReceiveStatus.NOT_RECEIVE);
if (roomByUid == null) {
Users users = usersService.getUsersByUid(uid);
dailyTaskRoomDiamondVo.setAvatar(users.getAvatar());
@@ -76,13 +74,15 @@ public class RoomDayDiamondHandler extends AbstractDailyTaskHandler {
dailyTaskRoomDiamondVo.setTotalGoldNum(totalGoldNum);
List<DailyTaskRoomDiamondDetailVo> rewardList = new ArrayList<>();
dailyTaskRoomDiamondVo.setLevelVos(rewardList);
Map<String, RoomDayDiamondRewardRecvRecord> levelMap = RoomDayDiamondRewardRecvRecordService.getLevelMap(partitionId, uid, dayDate);
Map<String, RoomDayDiamondRewardRecvRecord> levelMap = roomDayDiamondRewardRecvRecordService.getLevelMap(partitionId, uid, dayDate);
Boolean domainSendCheck = roomDayDiamondRewardRecordService.checkExist(partitionId, uid, dayDate);
int size = roomDayDiamondRewards.size();
RoomDayDiamondReward bigDiamondReward = null;
for (int i = 0; i < size; i++) {
RoomDayDiamondReward diamondReward = roomDayDiamondRewards.get(i);
DailyTaskRoomDiamondDetailVo detailVo = new DailyTaskRoomDiamondDetailVo();
detailVo.setLevel(diamondReward.getLevel());
detailVo.setRewardNum(diamondReward.getLevelRewardGold());
detailVo.setRewardNum(diamondReward.getRewardGold());
BigDecimal preMaxNum = BigDecimal.ZERO;
if (i > 0) {
preMaxNum = roomDayDiamondRewards.get(i - 1).getDiamondNum();
@@ -95,17 +95,39 @@ public class RoomDayDiamondHandler extends AbstractDailyTaskHandler {
? tmpTotalGoldNum.compareTo(length)>=0 ? length : tmpTotalGoldNum
: BigDecimal.ZERO;
detailVo.setProcessNum(processNum);
Boolean received = levelMap.containsKey(diamondReward.getLevel());
Boolean received = !levelMap.isEmpty() && domainSendCheck;
if (received) {
detailVo.setStatus((byte) 2);
} else if (processNum.compareTo(length) == 0) {
detailVo.setStatus((byte) 1);
detailVo.setStatus(ReceiveStatus.RECEIVED);
dailyTaskRoomDiamondVo.setStatus(ReceiveStatus.RECEIVED);
bigDiamondReward = diamondReward;
} else if (processNum.compareTo(length) == 0 && DateType.TODAY == dateType) {
detailVo.setStatus(ReceiveStatus.RECEIVE_YESTERDAY);
bigDiamondReward = diamondReward;
} else if (processNum.compareTo(length) == 0 && DateType.YESTERDAY == dateType) {
detailVo.setStatus(ReceiveStatus.AVAILABLE);
dailyTaskRoomDiamondVo.setStatus(ReceiveStatus.AVAILABLE);
bigDiamondReward = diamondReward;
} else {
detailVo.setStatus((byte) 0);
detailVo.setStatus(ReceiveStatus.NOT_RECEIVE);
}
rewardList.add(detailVo);
}
if (DateType.YESTERDAY == dateType && bigDiamondReward != null) {
dailyTaskRoomDiamondVo.setMaxLevel(bigDiamondReward.getLevel());
dailyTaskRoomDiamondVo.setTotalRewardNum(bigDiamondReward.getRewardGold());
}
return dailyTaskRoomDiamondVo;
}
interface DateType {
int TODAY = 1;
int YESTERDAY = 2;
}
interface ReceiveStatus {
byte NOT_RECEIVE = 0;
byte AVAILABLE = 1;
byte RECEIVED = 2;
byte RECEIVE_YESTERDAY = 3;
}
}

View File

@@ -17,7 +17,7 @@ public interface RoomDayDiamondRewardRecordService extends IService<RoomDayDiamo
PageResult<RoomDayDiamondRewardRecordVo> listRecord(Integer partitionId, Integer regionId, Long erbanNo, Long ownerErbanNo, Integer guildId,
String startDate, String endDate, Integer status, Integer pageNo, Integer pageSize);
BusiResult send(Long id, Integer adminId);
BusiResult send(Long id, Integer adminId) throws InterruptedException;
void loadDayDataRobotSend(Integer partitionId, String startDate, String endDate);

View File

@@ -11,28 +11,31 @@ 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.AdminServiceException;
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 lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
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.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* 房间日奖励金币领取记录 服务实现类
*
* @author
* @author
* @since 2025-08-26
*/
@Slf4j
@Service
public class RoomDayDiamondRewardRecvRecordService extends ServiceImpl<RoomDayDiamondRewardRecvRecordMapper, RoomDayDiamondRewardRecvRecord> {
@@ -48,51 +51,73 @@ public class RoomDayDiamondRewardRecvRecordService extends ServiceImpl<RoomDayDi
private BillRecordService billRecordService;
@Autowired
private RoomDayDiamondRewardRecordService roomDayDiamondRewardRecordService;
@Autowired
private RedissonClient redissonClient;
public BusiResult receive(Long uid, Long roomUid, String receiveDate, String level) {
public BusiResult receive(Long uid, Long roomUid, String receiveDate) {
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);
if (todayDate.equals(receiveDate)) {
throw new ServiceException(BusiStatus.ROOM_DAY_DIAMOND_REWARD_DATE_CHECK);
}
if (roomDayDiamondRewardRecordService.checkExist(partitionId, roomUid, receiveDate)) {
throw new ServiceException(BusiStatus.ROOM_DAY_DIAMOND_REWARD_SEND);
String lockKey = String.format("RoomDayDiamondNum:%s_%s_%s" , partitionId, receiveDate, roomUid);
RLock lock = redissonClient.getLock(lockKey);
boolean locked = false;
try {
locked = lock.tryLock(5L, TimeUnit.SECONDS);
if (!locked) {
log.error("房间日流水奖励已经发放partitionId:{}, receiveDate:{}, roomUid:{}", partitionId, receiveDate, roomUid);
throw new ServiceException(BusiStatus.SERVERERROR);
}
LambdaQueryWrapper<RoomDayDiamondRewardRecvRecord> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(RoomDayDiamondRewardRecvRecord::getPartitionId, partitionId)
.eq(RoomDayDiamondRewardRecvRecord::getRoomUid, roomUid)
.eq(RoomDayDiamondRewardRecvRecord::getStatDate, receiveDate);
Long count = baseMapper.selectCount(queryWrapper);
if (count > 0) {
throw new ServiceException(BusiStatus.ROOM_DAY_DIAMOND_REWARD_RECV_RECORD_EXIST);
}
if (roomDayDiamondRewardRecordService.checkExist(partitionId, roomUid, receiveDate)) {
throw new ServiceException(BusiStatus.ROOM_DAY_DIAMOND_REWARD_SEND);
}
BigDecimal roomGoldNum = roomDayDiamondNumService.getGoldNum(partitionId, roomUid, receiveDate);
TreeMap<BigDecimal, RoomDayDiamondReward> treeMap = roomDayDiamondRewardService.getRewardTreeMapByPartitionId(partitionId);
RoomDayDiamondReward diamondReward = roomDayDiamondRewardService.calGoldRewardEntity(treeMap, roomGoldNum);
if (diamondReward == null || roomGoldNum.compareTo(diamondReward.getDiamondNum()) < 0) {
throw new ServiceException(BusiStatus.SERVERBUSY);
}
RoomDayDiamondRewardRecvRecord roomDayDiamondRewardRecvRecord = new RoomDayDiamondRewardRecvRecord();
roomDayDiamondRewardRecvRecord.setPartitionId(partitionId);
roomDayDiamondRewardRecvRecord.setRoomUid(roomUid);
roomDayDiamondRewardRecvRecord.setUid(uid);
roomDayDiamondRewardRecvRecord.setLevel(diamondReward.getLevel());
roomDayDiamondRewardRecvRecord.setStatDate(receiveDate);
roomDayDiamondRewardRecvRecord.setCreateTime(new Date());
roomDayDiamondRewardRecvRecord.setGoldNum(roomGoldNum);
// 领取的奖励用户逐级领取只能用字段levelRewardGold
BigDecimal rewardGold = diamondReward.getRewardGold();
roomDayDiamondRewardRecvRecord.setRewardGold(rewardGold);
int insert = baseMapper.insert(roomDayDiamondRewardRecvRecord);
if (insert <= 0) {
throw new ServiceException(BusiStatus.SERVERBUSY);
}
userPurseService.addDiamond(roomUid, rewardGold.doubleValue(), BillObjTypeEnum.ROOM_DAY_DIAMOND_REWARD,
(userPurse) -> billRecordService.insertGeneralBillRecord(roomUid, roomDayDiamondRewardRecvRecord.getId().toString(),
BillObjTypeEnum.ROOM_DAY_DIAMOND_REWARD, rewardGold.doubleValue(), userPurse));
} catch (InterruptedException e) {
throw new AdminServiceException(BusiStatus.SERVERBUSY);
} finally {
if (locked) {
lock.unlock();
}
}
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();
}
@@ -113,11 +138,11 @@ public class RoomDayDiamondRewardRecvRecordService extends ServiceImpl<RoomDayDi
if (CollectionUtils.isEmpty(uniqueKeyList)) {
return Collections.emptyMap();
}
return uniqueKeyList.stream().collect(Collectors.toMap(x -> String.format("%s_%s", x.getRoomUid(), x.getStatDate()),
return uniqueKeyList.stream().collect(Collectors.toMap(x -> String.format("%s_%s" , x.getRoomUid(), x.getStatDate()),
x -> x));
}
public RoomDayDiamondRewardRecvRecord getUniqueKeyOne(Integer partitionId, String statDate, Long roomUid) {
public RoomDayDiamondRewardRecvRecord getUniqueKeyOne(Integer partitionId, String statDate, Long roomUid) {
return baseMapper.getUniqueKeyOne(partitionId, statDate, roomUid);
}
}

View File

@@ -25,6 +25,14 @@ public interface RoomDayDiamondRewardService extends IService<RoomDayDiamondRewa
*/
BigDecimal calGoldReward(TreeMap<BigDecimal, RoomDayDiamondReward> treeMap, BigDecimal diamondNum);
/**
* 根据钻石流水获取奖励
* @param treeMap
* @param diamondNum
* @return
*/
RoomDayDiamondReward calGoldRewardEntity(TreeMap<BigDecimal, RoomDayDiamondReward> treeMap, BigDecimal diamondNum);
List<RoomDayDiamondReward> listByPartitionIdAsc(Integer partitionId);
RoomDayDiamondReward getByLevel(Integer partitionId, String level);

View File

@@ -166,7 +166,7 @@ public class RoomDayDiamondRewardRecordServiceImpl extends ServiceImpl<RoomDayDi
}
@Override
public BusiResult send(Long id, Integer adminId) {
public BusiResult send(Long id, Integer adminId) throws InterruptedException {
RoomDayDiamondNum dayDiamondNum = roomDayDiamondNumService.getById(id);
if (dayDiamondNum == null) {
throw new AdminServiceException("记录id" + id + "不存在");
@@ -181,13 +181,7 @@ public class RoomDayDiamondRewardRecordServiceImpl extends ServiceImpl<RoomDayDi
throw new AdminServiceException("该区(" + PartitionEnum.getByPartitionId(partitionId).getDesc() + ")当天未结束,不允许发放");
}
RoomDayDiamondRewardRecvRecord uniqueKeyOne = roomDayDiamondRewardRecvRecordService
.getUniqueKeyOne(partitionId, dayDiamondNum.getStatDate(), dayDiamondNum.getRoomUid());
if (uniqueKeyOne != null && uniqueKeyOne.getRewardGold().compareTo(BigDecimal.ZERO) > 0) {
throw new AdminServiceException("该房间房主今日已经在app日常任务中领取过奖励,不允许发放");
}
String lockKey = "RoomDayDiamondNum:" + id;
String lockKey = String .format("RoomDayDiamondNum:%s_%s_%s", partitionId, dayDiamondNum.getStatDate(), dayDiamondNum.getRoomUid());
RLock lock = redissonClient.getLock(lockKey);
boolean locked = false;
try {
@@ -196,6 +190,11 @@ public class RoomDayDiamondRewardRecordServiceImpl extends ServiceImpl<RoomDayDi
log.error("房间日流水奖励已经发放id:{}", id.toString());
throw new ServiceException(BusiStatus.SERVERERROR);
}
RoomDayDiamondRewardRecvRecord uniqueKeyOne = roomDayDiamondRewardRecvRecordService
.getUniqueKeyOne(partitionId, dayDiamondNum.getStatDate(), dayDiamondNum.getRoomUid());
if (uniqueKeyOne != null && uniqueKeyOne.getRewardGold().compareTo(BigDecimal.ZERO) > 0) {
throw new AdminServiceException("该房间房主今日已经在app日常任务中领取过奖励,不允许发放");
}
if (checkExist(partitionId, dayDiamondNum.getRoomUid(), dayDiamondNum.getStatDate())) {
throw new AdminServiceException("该房间奖励已经发放");
}
@@ -223,8 +222,6 @@ public class RoomDayDiamondRewardRecordServiceImpl extends ServiceImpl<RoomDayDi
BillObjTypeEnum.ROOM_DAY_DIAMOND_REWARD, goldReward.doubleValue(), userPurse));
baseSendService.sendSystemMsg(roomUid.toString(),
I18NMessageSourceUtil.getMessage(I18nAlertEnum.ROOM_DAY_DIAMOND_REWARD_SYS, new Object[]{dayDiamondNum.getGoldNum(), goldReward}, partitionId));
} catch (InterruptedException e) {
throw new AdminServiceException(BusiStatus.SERVERBUSY);
} finally {
if (locked) {
lock.unlock();

View File

@@ -38,11 +38,20 @@ public class RoomDayDiamondRewardServiceImpl extends ServiceImpl<RoomDayDiamondR
@Override
public BigDecimal calGoldReward(TreeMap<BigDecimal, RoomDayDiamondReward> treeMap, BigDecimal diamondNum) {
Map.Entry<BigDecimal, RoomDayDiamondReward> totalLevelInfoEntry = treeMap.headMap(diamondNum, true).lastEntry();
if (totalLevelInfoEntry == null) {
RoomDayDiamondReward diamondReward = this.calGoldRewardEntity(treeMap, diamondNum);
if (diamondReward == null) {
return BigDecimal.ZERO;
}
return totalLevelInfoEntry.getValue().getRewardGold();
return diamondReward.getRewardGold();
}
@Override
public RoomDayDiamondReward calGoldRewardEntity(TreeMap<BigDecimal, RoomDayDiamondReward> treeMap, BigDecimal diamondNum) {
Map.Entry<BigDecimal, RoomDayDiamondReward> totalLevelInfoEntry = treeMap.headMap(diamondNum, true).lastEntry();
if (totalLevelInfoEntry == null) {
return null;
}
return totalLevelInfoEntry.getValue();
}
@Override

View File

@@ -32,5 +32,6 @@
partition_id = #{partitionId}
and stat_date = #{statDate}
AND room_uid = #{roomUid}
GROUP BY stat_date, room_uid
</select>
</mapper>

View File

@@ -21,6 +21,6 @@ public class RoomDayDiamondRewardController {
@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);
return roomDayDiamondRewardRecvRecordService.receive(uid, roomUid, receiveDate);
}
}