From 32c361605225c75315f98e00b47fc9d6d0b511b1 Mon Sep 17 00:00:00 2001 From: hokli <2629910752@qq.com> Date: Wed, 17 Sep 2025 14:32:37 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8B=AC=E8=81=94=E4=BD=93-=E5=85=AC=E4=BC=9A?= =?UTF-8?q?=E9=95=BF=E5=A5=96=E5=8A=B1=EF=BC=8C=E6=88=BF=E4=B8=BB=E5=A5=96?= =?UTF-8?q?=E5=8A=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extradiamond/ExtraDiamondDayService.java | 136 +++++++++++++++++- .../GuildExtraDiamondDayService.java | 12 ++ .../RoomExtraDiamondDayService.java | 13 ++ .../ExtraDiamondDayController.java | 27 ++++ .../extradiamond/ExtraDiamondDayTask.java | 24 ++++ 5 files changed, 210 insertions(+), 2 deletions(-) create mode 100644 accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/extradiamond/ExtraDiamondDayController.java create mode 100644 accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/extradiamond/ExtraDiamondDayTask.java diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/extradiamond/ExtraDiamondDayService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/extradiamond/ExtraDiamondDayService.java index 8be0901bf..6f15b5c3b 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/extradiamond/ExtraDiamondDayService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/extradiamond/ExtraDiamondDayService.java @@ -1,22 +1,33 @@ package com.accompany.business.service.extradiamond; import com.accompany.business.dto.ExtraDiamondRateConfigDto; +import com.accompany.business.model.extradiamond.GuildExtraDiamondDay; +import com.accompany.business.model.extradiamond.RoomExtraDiamondDay; import com.accompany.business.model.guild.Guild; import com.accompany.business.model.guild.GuildMember; import com.accompany.business.service.guild.GuildService; import com.accompany.business.service.purse.UserPurseService; +import com.accompany.common.status.BusiStatus; +import com.accompany.core.exception.ServiceException; import com.accompany.core.service.SysConfService; import com.accompany.core.util.StringUtils; import com.alibaba.fastjson.JSONObject; +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.util.Date; +import java.util.List; +import java.util.concurrent.TimeUnit; import static com.accompany.common.constant.Constant.SysConfId.EXTRA_DIAMOND_RATE_CONFIG; -import static com.accompany.core.enumeration.BillObjTypeEnum.OWNER_EXTRA_GOLD; +import static com.accompany.core.enumeration.BillObjTypeEnum.*; +@Slf4j @Service public class ExtraDiamondDayService { @Autowired @@ -29,6 +40,8 @@ public class ExtraDiamondDayService { private SysConfService sysConfService; @Autowired private UserPurseService userPurseService; + @Autowired + private RedissonClient redissonClient; public void updateGuildExtraDiamond(GuildMember guildMember, String cycleDate, String statDate, Double normalDiamondNum, Double luckyDiamondNum, Date time) { @@ -42,7 +55,7 @@ public class ExtraDiamondDayService { BigDecimal decimalNormal = BigDecimal.valueOf(normalDiamondNum); BigDecimal decimalLucky = BigDecimal.valueOf(luckyDiamondNum); BigDecimal ownerDiamondNum = diamondRateConfig.getOwnerExtraRate().multiply(decimalNormal); - BigDecimal ownerLuckyDiamond =diamondRateConfig.getOwnerExtraLuckyRate().multiply(decimalLucky); + BigDecimal ownerLuckyDiamond = diamondRateConfig.getOwnerExtraLuckyRate().multiply(decimalLucky); Guild guild = guildService.getVaildGuildById(guildId); Long ownerUid = guild.getOwnerUid(); guildExtraDiamondDayService.updateExtraDiamond(cycleDate, statDate, partitionId, guildMemberId, guildId, ownerUid, guildMember.getUid(), @@ -77,4 +90,123 @@ public class ExtraDiamondDayService { ExtraDiamondRateConfigDto configDto = JSONObject.parseObject(valueById, ExtraDiamondRateConfigDto.class); return configDto.getConfigByPartitionId(partitionId); } + + 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); + boolean locked = false; + try { + locked = lock.tryLock(20, TimeUnit.SECONDS); + if (!locked){ + throw new ServiceException(BusiStatus.SERVERBUSY); + } + //主播额外奖励 + List guildExtraDiamondDays = guildExtraDiamondDayService.listByPartitionStatDate(partitionId, statDate); + if (CollectionUtils.isNotEmpty(guildExtraDiamondDays)) { + for (GuildExtraDiamondDay diamondDay : guildExtraDiamondDays) { + BigDecimal anchorExtraNum = diamondDay.getDiamondNum().multiply(diamondRateConfig.getAnchorExtraRate()); + BigDecimal anchorExtraLuckyNum = diamondDay.getLuckyDiamondNum().multiply(diamondRateConfig.getAnchorExtraLuckyRate()); + diamondDay.setAnchorExtraNum(anchorExtraNum); + diamondDay.setAnchorExtraLuckyNum(anchorExtraLuckyNum); + diamondDay.setUpdateTime(updateTime); + } + boolean updateBatchById = guildExtraDiamondDayService.updateBatchById(guildExtraDiamondDays); + if (updateBatchById) { + for (GuildExtraDiamondDay extraDiamondDay : guildExtraDiamondDays) { + if (extraDiamondDay.getAnchorExtraNum().compareTo(BigDecimal.ZERO) > 0) { + userPurseService.addGold(extraDiamondDay.getUid(), extraDiamondDay.getAnchorExtraNum().doubleValue(), ANCHOR_EXTRA_GOLD); + } + if (extraDiamondDay.getAnchorExtraLuckyNum().compareTo(BigDecimal.ZERO) > 0) { + userPurseService.addGold(extraDiamondDay.getUid(), extraDiamondDay.getAnchorExtraLuckyNum().doubleValue(), ANCHOR_EXTRA_LUCKY_GOLD); + } + } + } + } + } catch (Exception e) { + log.error("sendLastDayDiamondtask anchor error" , e); + } finally { + if (locked){ + lock.unlock(); + } + } + + //房间额外奖励 + lockKey = "sendLastDayDiamondtask_room_" + partitionId + "_" + statDate; + lock = redissonClient.getLock(lockKey); + locked = false; + try { + locked = lock.tryLock(20, TimeUnit.SECONDS); + if (!locked){ + throw new ServiceException(BusiStatus.SERVERBUSY); + } + + List 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); + } + } + } + } + } catch (Exception e) { + log.error("sendLastDayDiamondtask room error" , e); + } finally { + if (locked){ + lock.unlock(); + } + } + } + + public void sendRoomExtraDiamondTask(Integer partitionId, String statDate) { + ExtraDiamondRateConfigDto diamondRateConfig = this.getExtraDiamondRateConfig(partitionId); + Date updateTime = new Date(); + String lockKey = "sendLastDayDiamondtask_room_" + partitionId + "_" + statDate; + RLock lock = redissonClient.getLock(lockKey); + boolean locked = false; + try { + locked = lock.tryLock(20, TimeUnit.SECONDS); + if (!locked){ + throw new ServiceException(BusiStatus.SERVERBUSY); + } + + List 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); + } + } + } + } + } catch (Exception e) { + log.error("sendLastDayDiamondtask room error" , e); + } finally { + if (locked){ + lock.unlock(); + } + } + } } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/extradiamond/GuildExtraDiamondDayService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/extradiamond/GuildExtraDiamondDayService.java index fa0b36580..206dea97e 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/extradiamond/GuildExtraDiamondDayService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/extradiamond/GuildExtraDiamondDayService.java @@ -2,11 +2,14 @@ package com.accompany.business.service.extradiamond; import com.accompany.business.model.extradiamond.GuildExtraDiamondDay; import com.accompany.business.mybatismapper.extradiamond.GuildExtraDiamondDayMapper; +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.stereotype.Service; import java.math.BigDecimal; import java.util.Date; +import java.util.List; /** * 公会钻石流水额外收入记录 服务实现类 @@ -23,4 +26,13 @@ public class GuildExtraDiamondDayService extends ServiceImpl listByPartitionStatDate(Integer partitionId, String statDate) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(GuildExtraDiamondDay::getPartitionId, partitionId) + .eq(GuildExtraDiamondDay::getStatDate, statDate) + .le(GuildExtraDiamondDay::getAnchorExtraNum, BigDecimal.ZERO) + .le(GuildExtraDiamondDay::getAnchorExtraLuckyNum, BigDecimal.ZERO); + return list(queryWrapper); + } } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/extradiamond/RoomExtraDiamondDayService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/extradiamond/RoomExtraDiamondDayService.java index f1b185f13..e18e60155 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/extradiamond/RoomExtraDiamondDayService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/extradiamond/RoomExtraDiamondDayService.java @@ -2,10 +2,14 @@ package com.accompany.business.service.extradiamond; import com.accompany.business.model.extradiamond.RoomExtraDiamondDay; import com.accompany.business.mybatismapper.extradiamond.RoomExtraDiamondDayMapper; +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.stereotype.Service; +import java.math.BigDecimal; import java.util.Date; +import java.util.List; /** * 房间钻石流水额外收入记录 服务实现类 @@ -20,4 +24,13 @@ public class RoomExtraDiamondDayService extends ServiceImpl listByPartitionStatDate(Integer partitionId, String statDate) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(RoomExtraDiamondDay::getPartitionId, partitionId) + .eq(RoomExtraDiamondDay::getStatDate, statDate) + .le(RoomExtraDiamondDay::getRoomExtraNum, BigDecimal.ZERO) + .le(RoomExtraDiamondDay::getRoomExtraLuckyNum, BigDecimal.ZERO); + return list(queryWrapper); + } } diff --git a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/extradiamond/ExtraDiamondDayController.java b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/extradiamond/ExtraDiamondDayController.java new file mode 100644 index 000000000..6ae498dce --- /dev/null +++ b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/extradiamond/ExtraDiamondDayController.java @@ -0,0 +1,27 @@ +package com.accompany.business.controller.extradiamond; + +import com.accompany.business.service.extradiamond.ExtraDiamondDayService; +import com.accompany.common.annotation.Authorization; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/extraDiamond") +public class ExtraDiamondDayController { + @Autowired + private ExtraDiamondDayService extraDiamondDayService; + + @Authorization + @GetMapping("/sendGuildLastDayDiamondtask") + public void sendGuildLastDayDiamondtask(Integer partitionId, String statDate) { + extraDiamondDayService.sendGuildExtraDiamondTask(partitionId, statDate); + } + + @Authorization + @GetMapping("/sendRoomLastDayDiamondtask") + public void sendRoomLastDayDiamondtask(Integer partitionId, String statDate) { + extraDiamondDayService.sendRoomExtraDiamondTask(partitionId, statDate); + } +} diff --git a/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/extradiamond/ExtraDiamondDayTask.java b/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/extradiamond/ExtraDiamondDayTask.java new file mode 100644 index 000000000..e8a3449fb --- /dev/null +++ b/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/extradiamond/ExtraDiamondDayTask.java @@ -0,0 +1,24 @@ +package com.accompany.scheduler.task.extradiamond; + +import cn.hutool.core.date.DateUtil; +import com.accompany.business.service.extradiamond.ExtraDiamondDayService; +import com.accompany.core.enumeration.PartitionEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.Date; + +@Component +public class ExtraDiamondDayTask { + @Autowired + private ExtraDiamondDayService extraDiamondDayService; + + @Scheduled(cron = "0 6 0 * * *") + public void sendExtraDiamondTask() { + Date date = new Date(); + String statDate = DateUtil.formatDate(date); + extraDiamondDayService.sendGuildExtraDiamondTask(PartitionEnum.SOVIET.getId(), statDate); + extraDiamondDayService.sendRoomExtraDiamondTask(PartitionEnum.SOVIET.getId(), statDate); + } +}