diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildsoviet/GuildExtraDiamondDay.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildsoviet/GuildExtraDiamondDay.java index 9bfb315ca..90fac9154 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildsoviet/GuildExtraDiamondDay.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildsoviet/GuildExtraDiamondDay.java @@ -39,7 +39,7 @@ public class GuildExtraDiamondDay implements Serializable { /** * 公会长UID */ - private Integer ownerUid; + private Long ownerUid; /** * 普通礼物钻石流水 */ @@ -68,6 +68,10 @@ public class GuildExtraDiamondDay implements Serializable { * 公会长lucky额外奖励 */ private BigDecimal ownerExtraLuckyNum; + /** + * 公会长奖励是否已经发放0-未发放 + */ + private Byte ownerSendStatus; /** * 创建时间 */ diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildService.java index b0ef3a237..c747d3bc5 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildService.java @@ -101,4 +101,13 @@ public class GuildService extends ServiceImpl { .eq(Guild::getEnable, Boolean.TRUE) .list(); } + + + public Map mapGuildByPartitionId(Integer partitionId) { + return this.lambdaQuery() + .eq(Guild::getPartitionId, partitionId) + .eq(Guild::getEnable, Boolean.TRUE) + .list().stream() + .collect(Collectors.toMap(Guild::getId, family -> family)); + } } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildsoviet/ExtraDiamondDayService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildsoviet/ExtraDiamondDayService.java index c031466f4..e9d79bda9 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildsoviet/ExtraDiamondDayService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildsoviet/ExtraDiamondDayService.java @@ -24,10 +24,7 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.time.DayOfWeek; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -71,12 +68,6 @@ public class ExtraDiamondDayService { Long ownerUid = guild.getOwnerUid(); guildExtraDiamondDayService.updateExtraDiamond(cycleDate, statDate, partitionId, guildMemberId, guildId, ownerUid, guildMember.getUid(), decimalNormal, decimalLucky, ownerDiamondNum, ownerLuckyDiamond, anchorDiamondNum, anchorLuckyDiamond, time); - if (ownerDiamondNum.compareTo(BigDecimal.ZERO) > 0) { - userPurseService.addGold(ownerUid, ownerDiamondNum.doubleValue(), OWNER_EXTRA_GOLD); - } - if (ownerLuckyDiamond.compareTo(BigDecimal.ZERO) > 0) { - userPurseService.addGold(ownerUid, ownerLuckyDiamond.doubleValue(), OWNER_EXTRA_GOLD); - } } public void updateRoomExtraDiamond(GuildMember guildMember, Long uid, PartitionInfo partitionInfo, String statDate, Long roomUid, @@ -107,8 +98,8 @@ public class ExtraDiamondDayService { return configDto.getConfigByPartitionId(partitionId); } - public void sendGuildExtraDiamondTask(Integer partitionId, String statDate) { - log.info("sendGuildExtraDiamondTask partitionId:" + partitionId + " statDate:" + statDate); + public void sendGuildMemberExtraDiamondTask(Integer partitionId, String statDate) { + log.info("sendGuildMemberExtraDiamondTask partitionId:" + partitionId + " statDate:" + statDate); Date updateTime = new Date(); String lockKey = "sendLastDayDiamondtask_anchor_" + partitionId + "_" + statDate; RLock lock = redissonClient.getLock(lockKey); @@ -123,7 +114,7 @@ public class ExtraDiamondDayService { log.info("empty guildMember partitionId:" + partitionId + " partitionId:" + statDate + " no guildMember"); return; } - List guildExtraDiamondDays = guildExtraDiamondDayService.listByPartitionStatDate4Task(partitionId, statDate); + List guildExtraDiamondDays = guildExtraDiamondDayService.listGuildMemberByPartitionStatDate4Task(partitionId, statDate); if (CollectionUtils.isNotEmpty(guildExtraDiamondDays)) { Iterator iterator = guildExtraDiamondDays.iterator(); while (iterator.hasNext()) { @@ -151,7 +142,65 @@ public class ExtraDiamondDayService { } } } catch (Exception e) { - log.error("sendLastDayDiamondtask anchor error" , e); + log.error("sendGuildMemberExtraDiamondTask anchor error" , e); + } finally { + if (locked) { + lock.unlock(); + } + } + } + + public void sendGuildExtraDiamondTask(Integer partitionId, String statDate) { + log.info("sendGuildExtraDiamondTask partitionId:" + partitionId + " statDate:" + statDate); + 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); + } + Map guildMap = guildService.mapGuildByPartitionId(partitionId); + if (guildMap.isEmpty()) { + log.info("empty guildMember partitionId:" + partitionId + " partitionId:" + statDate + " no guildMember"); + return; + } + List guildExtraDiamondDays = guildExtraDiamondDayService.listGuildByPartitionStatDate4Task(partitionId, statDate); + if (CollectionUtils.isNotEmpty(guildExtraDiamondDays)) { + Iterator iterator = guildExtraDiamondDays.iterator(); + while (iterator.hasNext()) { + GuildExtraDiamondDay diamondDay = iterator.next(); + if (guildMap.get(diamondDay.getGuildId()) == null || diamondDay.getAnchorSendStatus() == 1) { + iterator.remove(); + continue; + } + diamondDay.setOwnerSendStatus((byte) 1); + diamondDay.setUpdateTime(updateTime); + } + if (CollectionUtils.isEmpty(guildExtraDiamondDays)) { + return; + } + boolean updateBatchById = guildExtraDiamondDayService.updateBatchById(guildExtraDiamondDays); + if (!updateBatchById) { + return; + } + Map ownerExtraMap = new HashMap<>(); + for (GuildExtraDiamondDay extraDiamondDay : guildExtraDiamondDays) { + Long ownerUid = extraDiamondDay.getOwnerUid(); + BigDecimal ownerExtra = ownerExtraMap.get(ownerUid); + BigDecimal add = extraDiamondDay.getOwnerExtraNum().add(extraDiamondDay.getOwnerExtraLuckyNum()); + ownerExtra = ownerExtra == null ? add : ownerExtra.add(add); + ownerExtraMap.put(ownerUid, ownerExtra); + } + for (Map.Entry decimalEntry : ownerExtraMap.entrySet()) { + if (decimalEntry.getValue().compareTo(BigDecimal.ZERO) > 0) { + userPurseService.addGold(decimalEntry.getKey(), decimalEntry.getValue().doubleValue(), OWNER_EXTRA_GOLD); + } + } + } + } catch (Exception e) { + log.error("sendGuildExtraDiamondTask anchor error" , e); } finally { if (locked) { lock.unlock(); diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildsoviet/GuildExtraDiamondDayService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildsoviet/GuildExtraDiamondDayService.java index 440e88298..79feaebe6 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildsoviet/GuildExtraDiamondDayService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildsoviet/GuildExtraDiamondDayService.java @@ -32,7 +32,7 @@ public class GuildExtraDiamondDayService extends ServiceImpl listByPartitionStatDate4Task(Integer partitionId, String statDate) { + public List listGuildMemberByPartitionStatDate4Task(Integer partitionId, String statDate) { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(GuildExtraDiamondDay::getPartitionId, partitionId) .eq(GuildExtraDiamondDay::getStatDate, statDate) @@ -40,6 +40,14 @@ public class GuildExtraDiamondDayService extends ServiceImpl listGuildByPartitionStatDate4Task(Integer partitionId, String statDate) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(GuildExtraDiamondDay::getPartitionId, partitionId) + .eq(GuildExtraDiamondDay::getStatDate, statDate) + .eq(GuildExtraDiamondDay::getOwnerSendStatus, 0); + return list(queryWrapper); + } + public List groupByPartitionMember(Integer partitionId, String statDate, String endDate, Long guildMemberId) { return baseMapper.groupByPartitionMember(partitionId, statDate, endDate, guildMemberId); } diff --git a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/guildsoviet/ExtraDiamondDayController.java b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/guildsoviet/ExtraDiamondDayController.java index 3161ff93f..09bb8693f 100644 --- a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/guildsoviet/ExtraDiamondDayController.java +++ b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/guildsoviet/ExtraDiamondDayController.java @@ -19,6 +19,12 @@ public class ExtraDiamondDayController { extraDiamondDayService.sendGuildExtraDiamondTask(partitionId, statDate); } + @Authorization + @GetMapping("/sendGuildMemberExtraDiamondTask") + public void sendGuildMemberExtraDiamondTask(Integer partitionId, String statDate) { + extraDiamondDayService.sendGuildMemberExtraDiamondTask(partitionId, statDate); + } + @Authorization @GetMapping("/sendRoomLastDayDiamondtask") public void sendRoomLastDayDiamondtask(Integer partitionId, String monthDay) { 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 index d3723b1d8..26b48b2b0 100644 --- 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 @@ -18,6 +18,7 @@ public class ExtraDiamondDayTask { public void sendExtraDiamondTask() { Date date = new Date(); String statDate = DateUtil.formatDate(date); + extraDiamondDayService.sendGuildMemberExtraDiamondTask(PartitionEnum.SOVIET.getId(), statDate); extraDiamondDayService.sendGuildExtraDiamondTask(PartitionEnum.SOVIET.getId(), statDate); }