独联体-房间每周一发额外奖励

This commit is contained in:
2025-09-18 16:00:54 +08:00
parent e57ecad216
commit 1b9e5a6e97
13 changed files with 126 additions and 59 deletions

View File

@@ -56,6 +56,10 @@ public class GuildExtraDiamondDay implements Serializable {
* 主播lucky额外奖励
*/
private BigDecimal anchorExtraLuckyNum;
/**
* 主播奖励是否已经发放0-未发放
*/
private Byte anchorSendStatus;
/**
* 公会长普通额外奖励
*/

View File

@@ -38,7 +38,7 @@ public class RoomExtraDiamondDay implements Serializable {
/**
* 房间UID
*/
private Integer roomUid;
private Long roomUid;
/**
* 普通礼物钻石流水
*/
@@ -55,6 +55,10 @@ public class RoomExtraDiamondDay implements Serializable {
* 房间lucky额外奖励
*/
private BigDecimal roomExtraLuckyNum;
/**
* 是否已发放
*/
private Byte sendStatus;
/**
* 创建时间
*/

View File

@@ -78,8 +78,7 @@ public class SuperLuckyGiftDiamondIncomeListener implements ApplicationListener<
}
if (partitionInfo.getId() == PartitionEnum.SOVIET.getId()) {
extraDiamondDayService.updateGuildExtraDiamond(guildMember, cycleDate, statDate, 0D, message.getTotalDiamondNum(), time);
extraDiamondDayService.updateRoomExtraDiamond(guildMember, receiverUid, partitionInfo.getId(), statDate,
extraDiamondDayService.updateExtraDiamond(guildMember, receiverUid, partitionInfo.getId(), cycleDate, statDate,
message.getRoomUid(),0D, message.getTotalDiamondNum(), time);
}
}

View File

@@ -19,5 +19,6 @@ public interface GuildExtraDiamondDayMapper extends BaseMapper<GuildExtraDiamond
@Param("guildMemberId") Long guildMemberId, @Param("guildId") Integer guildId,
@Param("ownerUid") Long ownerUid, @Param("uid") Long uid, @Param("diamondNum") BigDecimal diamondNum,
@Param("luckyDiamondNum") BigDecimal luckyDiamondNum, @Param("ownerDiamondNum") BigDecimal ownerDiamondNum,
@Param("ownerLuckyDiamond") BigDecimal ownerLuckyDiamond, @Param("time") Date time);
@Param("ownerLuckyDiamond") BigDecimal ownerLuckyDiamond, @Param("anchorDiamondNum") BigDecimal anchorDiamondNum,
@Param("anchorLuckyDiamond") BigDecimal anchorLuckyDiamond, @Param("time") Date time);
}

View File

@@ -4,6 +4,7 @@ import com.accompany.business.model.extradiamond.RoomExtraDiamondDay;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -18,5 +19,6 @@ public interface RoomExtraDiamondDayMapper extends BaseMapper<RoomExtraDiamondDa
@Param("uid") Long uid, @Param("partitionId") Integer partitionId,
@Param("statDate") String statDate, @Param("roomUid") Long roomUid,
@Param("normalDiamondNum") Double normalDiamondNum, @Param("luckyDiamondNum") Double luckyDiamondNum,
@Param("roomDiamondNum") BigDecimal roomDiamondNum, @Param("roomLuckyDiamond") BigDecimal roomLuckyDiamond,
@Param("time") Date time);
}

View File

@@ -1,5 +1,8 @@
package com.accompany.business.service.extradiamond;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.accompany.business.dto.ExtraDiamondRateConfigDto;
import com.accompany.business.model.extradiamond.GuildExtraDiamondDay;
import com.accompany.business.model.extradiamond.RoomExtraDiamondDay;
@@ -26,6 +29,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static com.accompany.common.constant.Constant.SysConfId.EXTRA_DIAMOND_RATE_CONFIG;
import static com.accompany.core.enumeration.BillObjTypeEnum.*;
@@ -48,23 +52,33 @@ public class ExtraDiamondDayService {
@Autowired
private GuildMemberService guildMemberService;
public void updateGuildExtraDiamond(GuildMember guildMember, String cycleDate, String statDate,
public void updateExtraDiamond(GuildMember guildMember, Long uid, Integer partitionId, String cycleDate, String statDate, Long roomUid,
Double normalDiamondNum, Double luckyDiamondNum, Date time) {
ExtraDiamondRateConfigDto diamondRateConfig = this.getExtraDiamondRateConfig(guildMember.getPartitionId());
updateGuildExtraDiamond(guildMember, cycleDate, statDate, normalDiamondNum, luckyDiamondNum, time, diamondRateConfig);
updateRoomExtraDiamond(guildMember, uid, partitionId, statDate, roomUid, 0D, luckyDiamondNum, time, diamondRateConfig);
}
public void updateGuildExtraDiamond(GuildMember guildMember, String cycleDate, String statDate,
Double normalDiamondNum, Double luckyDiamondNum, Date time, ExtraDiamondRateConfigDto diamondRateConfig) {
if (guildMember == null) {
return;
}
Long guildMemberId = guildMember.getId();
Integer guildId = guildMember.getGuildId();
Integer partitionId = guildMember.getPartitionId();
ExtraDiamondRateConfigDto diamondRateConfig = this.getExtraDiamondRateConfig(guildMember.getPartitionId());
BigDecimal decimalNormal = BigDecimal.valueOf(normalDiamondNum);
BigDecimal decimalLucky = BigDecimal.valueOf(luckyDiamondNum);
BigDecimal ownerDiamondNum = diamondRateConfig.getOwnerExtraRate().multiply(decimalNormal);
BigDecimal ownerLuckyDiamond = diamondRateConfig.getOwnerExtraLuckyRate().multiply(decimalLucky);
BigDecimal anchorDiamondNum = diamondRateConfig.getAnchorExtraRate().multiply(decimalNormal);
BigDecimal anchorLuckyDiamond = diamondRateConfig.getAnchorExtraLuckyRate().multiply(decimalLucky);
Guild guild = guildService.getVaildGuildById(guildId);
Long ownerUid = guild.getOwnerUid();
guildExtraDiamondDayService.updateExtraDiamond(cycleDate, statDate, partitionId, guildMemberId, guildId, ownerUid, guildMember.getUid(),
decimalNormal, decimalLucky, ownerDiamondNum, ownerLuckyDiamond, time);
decimalNormal, decimalLucky, ownerDiamondNum, ownerLuckyDiamond, anchorDiamondNum, anchorLuckyDiamond, time);
if (ownerDiamondNum.compareTo(BigDecimal.ZERO) > 0) {
userPurseService.addGold(ownerUid, ownerDiamondNum.doubleValue(), OWNER_EXTRA_GOLD);
}
@@ -74,7 +88,7 @@ public class ExtraDiamondDayService {
}
public void updateRoomExtraDiamond(GuildMember guildMember, Long uid, Integer partitionId, String statDate, Long roomUid,
Double normalDiamondNum, Double luckyDiamondNum, Date time) {
Double normalDiamondNum, Double luckyDiamondNum, Date time, ExtraDiamondRateConfigDto diamondRateConfig) {
if (roomUid == null) {
return;
}
@@ -84,7 +98,12 @@ public class ExtraDiamondDayService {
guildMemberId = guildMember.getId();
guildId = guildMember.getGuildId();
}
roomExtraDiamondDayService.updateExtraDiamond(guildMemberId, guildId, uid, partitionId, statDate, roomUid, normalDiamondNum, luckyDiamondNum, time);
BigDecimal decimalNormal = BigDecimal.valueOf(normalDiamondNum);
BigDecimal decimalLucky = BigDecimal.valueOf(luckyDiamondNum);
BigDecimal roomDiamondNum = diamondRateConfig.getRoomExtraRate().multiply(decimalNormal);
BigDecimal roomLuckyDiamond = diamondRateConfig.getRoomExtraLuckyRate().multiply(decimalLucky);
roomExtraDiamondDayService.updateExtraDiamond(guildMemberId, guildId, uid, partitionId, statDate, roomUid,
normalDiamondNum, luckyDiamondNum, roomDiamondNum, roomLuckyDiamond, time);
}
private ExtraDiamondRateConfigDto getExtraDiamondRateConfig(Integer partitionId) {
@@ -97,7 +116,6 @@ public class ExtraDiamondDayService {
}
public void sendGuildExtraDiamondTask(Integer partitionId, String statDate) {
ExtraDiamondRateConfigDto diamondRateConfig = this.getExtraDiamondRateConfig(partitionId);
Date updateTime = new Date();
String lockKey = "sendLastDayDiamondtask_anchor_" + partitionId + "_" + statDate;
RLock lock = redissonClient.getLock(lockKey);
@@ -117,14 +135,11 @@ public class ExtraDiamondDayService {
Iterator<GuildExtraDiamondDay> iterator = guildExtraDiamondDays.iterator();
while (iterator.hasNext()) {
GuildExtraDiamondDay diamondDay = iterator.next();
if (guildMemberMap.get(diamondDay.getGuildMemberId()) == null) {
if (guildMemberMap.get(diamondDay.getGuildMemberId()) == null || diamondDay.getAnchorSendStatus() == 1) {
iterator.remove();
continue;
}
BigDecimal anchorExtraNum = diamondDay.getDiamondNum().multiply(diamondRateConfig.getAnchorExtraRate());
BigDecimal anchorExtraLuckyNum = diamondDay.getLuckyDiamondNum().multiply(diamondRateConfig.getAnchorExtraLuckyRate());
diamondDay.setAnchorExtraNum(anchorExtraNum);
diamondDay.setAnchorExtraLuckyNum(anchorExtraLuckyNum);
diamondDay.setAnchorSendStatus((byte) 1);
diamondDay.setUpdateTime(updateTime);
}
if (CollectionUtils.isEmpty(guildExtraDiamondDays)) {
@@ -151,10 +166,17 @@ public class ExtraDiamondDayService {
}
}
public void sendRoomExtraDiamondTask(Integer partitionId, String statDate) {
ExtraDiamondRateConfigDto diamondRateConfig = this.getExtraDiamondRateConfig(partitionId);
Date updateTime = new Date();
String lockKey = "sendLastDayDiamondtask_room_" + partitionId + "_" + statDate;
public void sendRoomExtraDiamondTask(Integer partitionId, Date now) {
Date lastWeek = DateUtil.offsetWeek(now, -1);
DateTime mondayOfLastWeek = DateUtil.beginOfWeek(lastWeek);
DateTime sundayOfLastWeek = DateUtil.endOfWeek(lastWeek);
List<String> statDateList = DateUtil.rangeToList(mondayOfLastWeek, sundayOfLastWeek, DateField.DAY_OF_MONTH)
.stream()
.map(d -> DateUtil.format(d, "yyyy-MM-dd"))
.collect(Collectors.toList());
String lockKey = "sendLastDayDiamondtask_room_" + partitionId;
RLock lock = redissonClient.getLock(lockKey);
boolean locked = false;
try {
@@ -162,26 +184,38 @@ public class ExtraDiamondDayService {
if (!locked) {
throw new ServiceException(BusiStatus.SERVERBUSY);
}
List<RoomExtraDiamondDay> roomExtraDiamondDays = roomExtraDiamondDayService.listByPartitionStatDateList(partitionId, statDateList);
if (CollectionUtils.isEmpty(roomExtraDiamondDays)) {
return;
}
roomExtraDiamondDays = roomExtraDiamondDays.stream()
.filter(item -> item.getSendStatus() == null || item.getSendStatus() == 0)
.collect(Collectors.toList());
roomExtraDiamondDays.forEach(item -> {
item.setSendStatus((byte) 1);
});
List<RoomExtraDiamondDay> roomExtraDiamondDays = roomExtraDiamondDayService.listByPartitionStatDate(partitionId, statDate);
if (CollectionUtils.isNotEmpty(roomExtraDiamondDays)) {
for (RoomExtraDiamondDay roomExtraDiamondDay : roomExtraDiamondDays) {
BigDecimal anchorExtraNum = roomExtraDiamondDay.getDiamondNum().multiply(diamondRateConfig.getRoomExtraRate());
BigDecimal anchorExtraLuckyNum = roomExtraDiamondDay.getLuckyDiamondNum().multiply(diamondRateConfig.getRoomExtraLuckyRate());
roomExtraDiamondDay.setRoomExtraNum(anchorExtraNum);
roomExtraDiamondDay.setRoomExtraLuckyNum(anchorExtraLuckyNum);
roomExtraDiamondDay.setUpdateTime(updateTime);
}
boolean updateBatchById = roomExtraDiamondDayService.updateBatchById(roomExtraDiamondDays);
if (updateBatchById) {
for (RoomExtraDiamondDay extraDiamondDay : roomExtraDiamondDays) {
BigDecimal addGold = extraDiamondDay.getRoomExtraNum().add(extraDiamondDay.getRoomExtraLuckyNum());
if (addGold.compareTo(BigDecimal.ZERO) > 0) {
userPurseService.addGold(extraDiamondDay.getUid(), addGold.doubleValue(), ROOM_EXTRA_GOLD);
}
}
}
if (!updateBatchById) {
return;
}
Map<Long, BigDecimal> extraDiamondMap = roomExtraDiamondDays.stream()
.collect(Collectors.toMap(
RoomExtraDiamondDay::getRoomUid,
item -> {
BigDecimal extraNum = item.getRoomExtraNum() != null ? item.getRoomExtraNum() : BigDecimal.ZERO;
BigDecimal extraLuckyNum = item.getRoomExtraLuckyNum() != null ? item.getRoomExtraLuckyNum() : BigDecimal.ZERO;
return extraNum.add(extraLuckyNum);
},
BigDecimal::add
));
extraDiamondMap.entrySet().stream()
.filter(entry -> entry.getValue().compareTo(BigDecimal.ZERO) > 0)
.forEach(entry -> {
Long roomUid = entry.getKey();
BigDecimal extraDiamond = entry.getValue();
userPurseService.addGold(roomUid, extraDiamond.doubleValue(), ROOM_EXTRA_GOLD);
});
} catch (Exception e) {
log.error("sendLastDayDiamondtask room error" , e);
} finally {

View File

@@ -22,9 +22,10 @@ public class GuildExtraDiamondDayService extends ServiceImpl<GuildExtraDiamondDa
public int updateExtraDiamond(String cycleDate, String statDate, Integer partitionId, Long guildMemberId,
Integer guildId, Long ownerUid, Long uid, BigDecimal diamondNum,
BigDecimal luckyDiamond, BigDecimal ownerDiamondNum, BigDecimal ownerLuckyDiamond, Date time) {
BigDecimal luckyDiamond, BigDecimal ownerDiamondNum, BigDecimal ownerLuckyDiamond,
BigDecimal anchorDiamondNum, BigDecimal anchorLuckyDiamond, Date time) {
return baseMapper.updateExtraDiamond(cycleDate, statDate, partitionId, guildMemberId, guildId, ownerUid, uid,
diamondNum, luckyDiamond, ownerDiamondNum, ownerLuckyDiamond, time);
diamondNum, luckyDiamond, ownerDiamondNum, ownerLuckyDiamond, anchorDiamondNum, anchorLuckyDiamond, time);
}
public List<GuildExtraDiamondDay> listByPartitionStatDate(Integer partitionId, String statDate) {

View File

@@ -21,8 +21,10 @@ import java.util.List;
public class RoomExtraDiamondDayService extends ServiceImpl<RoomExtraDiamondDayMapper, RoomExtraDiamondDay> {
public int updateExtraDiamond(Long guildMemberId, Integer guildId, Long uid, Integer partitionId,
String statDate, Long roomUid, Double normalDiamondNum, Double luckyDiamondNum, Date time) {
return baseMapper.updateExtraDiamond(guildMemberId, guildId, uid, partitionId, statDate, roomUid, normalDiamondNum, luckyDiamondNum, time);
String statDate, Long roomUid, Double normalDiamondNum, Double luckyDiamondNum,
BigDecimal roomDiamondNum, BigDecimal roomLuckyDiamond, Date time) {
return baseMapper.updateExtraDiamond(guildMemberId, guildId, uid, partitionId, statDate, roomUid,
normalDiamondNum, luckyDiamondNum, roomDiamondNum, roomLuckyDiamond, time);
}
public List<RoomExtraDiamondDay> listByPartitionStatDate(Integer partitionId, String statDate) {
@@ -33,4 +35,13 @@ public class RoomExtraDiamondDayService extends ServiceImpl<RoomExtraDiamondDayM
.le(RoomExtraDiamondDay::getRoomExtraLuckyNum, BigDecimal.ZERO);
return list(queryWrapper);
}
public List<RoomExtraDiamondDay> listByPartitionStatDateList(Integer partitionId, List<String> statDates) {
LambdaQueryWrapper<RoomExtraDiamondDay> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(RoomExtraDiamondDay::getPartitionId, partitionId)
.in(RoomExtraDiamondDay::getStatDate, statDates)
.le(RoomExtraDiamondDay::getRoomExtraNum, BigDecimal.ZERO)
.le(RoomExtraDiamondDay::getRoomExtraLuckyNum, BigDecimal.ZERO);
return list(queryWrapper);
}
}

View File

@@ -110,10 +110,9 @@ public class GuildGiftRecordService extends ServiceImpl<GuildGiftRecordMapper, G
}
if (partitionInfo.getId() == PartitionEnum.SOVIET.getId()) {
extraDiamondDayService.updateGuildExtraDiamond(guildMember, cycleDate, statDate, totalDiamondNum, 0D, createTime);
statDate = DateTimeUtil.convertWithZoneId(createTime, partitionInfo.getZoneId()).format(dateFormatter);
extraDiamondDayService.updateRoomExtraDiamond(guildMember, giftSendRecord.getReciveUid(), partitionInfo.getId(),
statDate, giftSendRecord.getRoomUid(), totalDiamondNum, 0D, createTime);
extraDiamondDayService.updateExtraDiamond(guildMember, giftSendRecord.getReciveUid(), partitionInfo.getId(),
cycleDate, statDate, giftSendRecord.getRoomUid(), totalDiamondNum, 0D, createTime);
}
}

View File

@@ -5,14 +5,16 @@
<update id="updateExtraDiamond">
INSERT INTO `guild_extra_diamond_day` (`cycle_date`, `partition_id`, `stat_date`,
`guild_member_id`, `guild_id`, `uid`, `owner_uid`, `diamond_num`, `lucky_diamond_num`,
`owner_extra_num`, `owner_extra_lucky_num`, `create_time`, `update_time`)
`owner_extra_num`, `owner_extra_lucky_num`, `anchor_extra_num`, `anchor_extra_lucky_num`, `create_time`, `update_time`)
VALUES (#{cycleDate}, #{partitionId}, #{statDate}, #{guildMemberId}, #{guildId}, #{uid}, #{ownerUid}, #{diamondNum}, #{luckyDiamondNum},
#{ownerDiamondNum}, #{ownerLuckyDiamond},#{time} ,#{time})
#{ownerDiamondNum}, #{ownerLuckyDiamond}, #{anchorDiamondNum}, #{anchorLuckyDiamond},#{time} ,#{time})
ON DUPLICATE KEY UPDATE
diamond_num = diamond_num + values (diamond_num),
lucky_diamond_num = lucky_diamond_num + values (lucky_diamond_num),
owner_extra_num = owner_extra_num + values (owner_extra_num),
owner_extra_lucky_num = owner_extra_lucky_num + values (owner_extra_lucky_num),
anchor_extra_num = anchor_extra_num + values (anchor_extra_num),
anchor_extra_lucky_num = anchor_extra_lucky_num + values (anchor_extra_lucky_num),
update_time = values (update_time)
</update>
</mapper>

View File

@@ -3,12 +3,16 @@
<mapper namespace="com.accompany.business.mybatismapper.extradiamond.RoomExtraDiamondDayMapper">
<update id="updateExtraDiamond">
INSERT INTO `room_extra_diamond_day` (`partition_id`, `stat_date`, `guild_member_id`, `guild_id`, `uid`,
`room_uid`, `diamond_num`, `lucky_diamond_num`, `create_time`, `update_time`)
`room_uid`, `diamond_num`, `lucky_diamond_num`, `room_extra_num`,
`room_extra_lucky_num`, `create_time`, `update_time`)
VALUES (#{partitionId}, #{statDate}, #{guildMemberId}, #{guildId}, #{uid}, #{roomUid}, #{normalDiamondNum},
#{luckyDiamondNum},#{time} ,#{time})
ON DUPLICATE KEY UPDATE
diamond_num = diamond_num + values (diamond_num),
lucky_diamond_num = lucky_diamond_num + values (lucky_diamond_num),
update_time = values (update_time)
#{luckyDiamondNum}, #{roomDiamondNum}, #{roomLuckyDiamond}, #{time}, #{time}) ON DUPLICATE KEY
UPDATE
diamond_num = diamond_num +
values (diamond_num), lucky_diamond_num = lucky_diamond_num +
values (lucky_diamond_num), room_extra_num = room_extra_num +
values (room_extra_num), room_extra_lucky_num = room_extra_lucky_num +
values (room_extra_lucky_num), update_time =
values (update_time)
</update>
</mapper>

View File

@@ -1,5 +1,6 @@
package com.accompany.business.controller.extradiamond;
import cn.hutool.core.date.DateUtil;
import com.accompany.business.service.extradiamond.ExtraDiamondDayService;
import com.accompany.common.annotation.Authorization;
import org.springframework.beans.factory.annotation.Autowired;
@@ -22,6 +23,6 @@ public class ExtraDiamondDayController {
@Authorization
@GetMapping("/sendRoomLastDayDiamondtask")
public void sendRoomLastDayDiamondtask(Integer partitionId, String statDate) {
extraDiamondDayService.sendRoomExtraDiamondTask(partitionId, statDate);
extraDiamondDayService.sendRoomExtraDiamondTask(partitionId, DateUtil.parseDateTime(statDate));
}
}

View File

@@ -19,6 +19,11 @@ public class ExtraDiamondDayTask {
Date date = new Date();
String statDate = DateUtil.formatDate(date);
extraDiamondDayService.sendGuildExtraDiamondTask(PartitionEnum.SOVIET.getId(), statDate);
extraDiamondDayService.sendRoomExtraDiamondTask(PartitionEnum.SOVIET.getId(), statDate);
}
@Scheduled(cron = "0 6 0 ? * MON")
public void sendExtraDiamondWeekTask() {
Date date = new Date();
extraDiamondDayService.sendRoomExtraDiamondTask(PartitionEnum.SOVIET.getId(), date);
}
}