diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/RoomContributionActivityQueryCmdExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/RoomContributionActivityQueryCmdExe.java index e7c84290..1979e44f 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/RoomContributionActivityQueryCmdExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/RoomContributionActivityQueryCmdExe.java @@ -43,19 +43,6 @@ public class RoomContributionActivityQueryCmdExe { private final RoomContributionActivityCountService roomContributionActivityCountService; public RoomContributionCountCO execute(AppRoomIdCmd cmd) { - - // 印度特殊地区, 刘占洋 2023/07/07 - /*String regionCode=""; - if (Objects.equals(cmd.getReqSysOrigin().getOrigin(), - SysOriginPlatformEnum.ASWAT.getSysOrigin())) { - regionCode = userRegionGateway.getRegionCode(cmd.getReqUserId()); - List regions = List.of("IN2", "IN"); - - if (regions.contains(regionCode.toUpperCase())) { - ResponseAssert.failure(CommonErrorCode.SYSTEM_IS_DOWN); - } - }*/ - Long roomId = roomProfileManagerService.getRoomId(cmd.getReqUserId()); ResponseAssert.notNull(CommonErrorCode.NOT_FOUND_RECORD_INFO, roomId); // 是否为请求人自己的房间 @@ -77,17 +64,6 @@ public class RoomContributionActivityQueryCmdExe { List activityCounts = roomContributionActivityCountService .listRoomContribution(cmd.getRoomId(), cmd.requireReqSysOriginEnum()); - //如果是菲律宾数据查询的数据从0开始 -// if(Objects.equals(regionCode,"PH")){ -// activityCounts = roomContributionActivityCountService -// .listRoomContributionByPH(cmd.getRoomId(), new BigDecimal(0)); -// } -// //如果是巴基斯坦地区从100000开始 -// if(Objects.equals(regionCode,"PK")){ -// activityCounts = roomContributionActivityCountService -// .listRoomContributionByPH(cmd.getRoomId(), new BigDecimal(100000)); -// } - ImmutablePair thisWeekData = getThisWeekData(cmd, activityRatio.getRatio()); if (CollectionUtils.isEmpty(activityCounts)) { return new RoomContributionCountCO() @@ -118,29 +94,6 @@ public class RoomContributionActivityQueryCmdExe { return BigDecimal.ZERO; } -// // 这几个区域调整了金币价值, 4月低 刘占洋 下降41% 流水不变领取点下降 -// String userRegionCode = userRegionGateway.getRegionCode(cmd.getReqUserId()); -// -// if (isExistsRegion(List.of("NG1", "NG", "PH", "PH1"), userRegionCode)) { -// var historyIntegral = getAvailableAmount(cmd, new BigDecimal("0.1"), activityCounts.stream() -// .filter(activityCount -> activityCount.getDateNumber() < 20230501) -// .map(RoomContributionActivityCount::getContributionValue) -// .filter(Objects::nonNull) -// .toList()); -// -// var historyIntegralAvailableAmount = historyIntegral.subtract( -// historyIntegral.multiply(new BigDecimal("0.41"))) -// .setScale(0, RoundingMode.DOWN); -// -// var newIntegral = getAvailableAmount(cmd, activityRatio.getRatio(), activityCounts.stream() -// .filter(activityCount -> activityCount.getDateNumber() >= 20230501) -// .map(RoomContributionActivityCount::getContributionValue) -// .filter(Objects::nonNull) -// .toList()); -// -// return historyIntegralAvailableAmount.add(newIntegral); -// } - return getAvailableAmount(cmd, activityRatio.getRatio(), activityCounts.stream() .map(RoomContributionActivityCount::getContributionValue) .filter(Objects::nonNull) diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/RoomContributionWeeklyRewardTask.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/RoomContributionWeeklyRewardTask.java new file mode 100644 index 00000000..040113b6 --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/RoomContributionWeeklyRewardTask.java @@ -0,0 +1,140 @@ +package com.red.circle.other.app.scheduler; + +import com.red.circle.other.infra.database.mongo.entity.activity.RoomContributionActivityCount; +import com.red.circle.other.infra.database.mongo.service.activity.RoomContributionActivityCountService; +import com.red.circle.other.infra.database.mongo.service.live.RoomProfileManagerService; +import com.red.circle.tool.core.collection.CollectionUtils; +import com.red.circle.tool.core.date.ZonedDateTimeAsiaRiyadhUtils; +import com.red.circle.wallet.inner.endpoint.wallet.WalletGoldClient; +import com.red.circle.wallet.inner.model.cmd.GoldReceiptCmd; +import com.red.circle.wallet.inner.model.enums.GoldOrigin; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * 房间贡献周奖励定时任务 + *

+ * 沙特时间每周一 0 点执行 + *

+ * + * @author Claude + * @since 2025-10-28 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class RoomContributionWeeklyRewardTask { + + private final RoomContributionActivityCountService roomContributionActivityCountService; + private final WalletGoldClient walletGoldClient; + private final RoomProfileManagerService roomProfileManagerService; + + /** + * 金币奖励比例(上周贡献金额的比例) + */ + private static final BigDecimal REWARD_RATIO = new BigDecimal("0.05"); + + /** + * 沙特时间每周一 0 点执行 + * cron: 秒 分 时 日 月 周 + * Asia/Riyadh 时区(UTC+3) + */ + @Scheduled(cron = "0 0 0 * * MON", zone = "Asia/Riyadh") + public void execute() { + log.info("【房间贡献周奖励】定时任务开始执行..."); + + try { + // 校验:沙特时间 2025年10月10号之后(包含)才执行 + int currentDate = ZonedDateTimeAsiaRiyadhUtils.nowDateToInt(); + if (currentDate < 20251010) { + log.info("【房间贡献周奖励】当前日期: {}, 未到活动开始时间(20251010),跳过执行", currentDate); + return; + } + + // 1. 获取所有房间上周数据 + List lastWeekDataList = + roomContributionActivityCountService.getAllRoomsLastWeekData(); + + if (CollectionUtils.isEmpty(lastWeekDataList)) { + log.info("【房间贡献周奖励】没有需要发放的奖励数据"); + return; + } + + log.info("【房间贡献周奖励】待发放奖励房间数: {}", lastWeekDataList.size()); + + int successCount = 0; + int failCount = 0; + + // 2. 遍历发放奖励 + for (RoomContributionActivityCount data : lastWeekDataList) { + try { + // 校验:如果已领取,跳过 + if (Boolean.TRUE.equals(data.getReceived())) { + log.info("【房间贡献周奖励】数据已领取,跳过发放, roomId: {}, recordId: {}", + data.getRoomId(), data.getId()); + continue; + } + + // 计算奖励金币 = 上周贡献金额 × 比例 + BigDecimal rewardAmount = data.getContributionValue() + .multiply(REWARD_RATIO) + .setScale(2, RoundingMode.DOWN); + + // 如果奖励金额 <= 0,跳过 + if (rewardAmount.compareTo(BigDecimal.ZERO) <= 0) { + log.warn("【房间贡献周奖励】奖励金额为0,跳过发放, roomId: {}, recordId: {}", + data.getRoomId(), data.getId()); + continue; + } + + // 3. 发送金币奖励(需要获取房主ID) + // 注意:这里假设从其他地方获取房主ID,你需要根据实际情况调整 + Long roomOwnerId = getRoomOwnerId(data.getRoomId()); + if (roomOwnerId == null) { + log.warn("【房间贡献周奖励】无法获取房主ID, roomId: {}", data.getRoomId()); + failCount++; + continue; + } + + walletGoldClient.changeBalance(GoldReceiptCmd.builder() + .appIncome() + .eventId(data.getRoomId()) + .userId(roomOwnerId) + .origin(GoldOrigin.ROOM_CONTRIBUTION_REWARD) + .amount(rewardAmount) + .build()); + + // 4. 修改数据状态为已领取 + roomContributionActivityCountService.updateReceivedByRoomId(data.getRoomId(), REWARD_RATIO); + + successCount++; + + log.info("【房间贡献周奖励】发放成功, roomId: {}, roomOwnerId: {}, rewardAmount: {}", + data.getRoomId(), roomOwnerId, rewardAmount); + + } catch (Exception e) { + failCount++; + log.error("【房间贡献周奖励】发放失败, roomId: {}, error: ", + data.getRoomId(), e); + } + } + + log.info("【房间贡献周奖励】定时任务执行完成, 成功: {}, 失败: {}", successCount, failCount); + + } catch (Exception e) { + log.error("【房间贡献周奖励】定时任务执行异常: ", e); + } + } + + /** + * 获取房主ID + */ + private Long getRoomOwnerId(Long roomId) { + return roomProfileManagerService.getHomeownerId(roomId); + } +} diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/RoomContributionActivityCountService.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/RoomContributionActivityCountService.java index f8a00aef..fbe87afe 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/RoomContributionActivityCountService.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/RoomContributionActivityCountService.java @@ -91,4 +91,19 @@ public interface RoomContributionActivityCountService { */ List listRoomContributionByPH(Long roomId,BigDecimal number); + /** + * 获取房间上周贡献数据(未领取状态) + * + * @param roomId 房间ID + * @return 上周贡献数据 + */ + RoomContributionActivityCount getLastWeekData(Long roomId); + + /** + * 获取所有房间上周贡献数据(未领取状态) + * + * @return 所有房间上周贡献数据列表 + */ + List getAllRoomsLastWeekData(); + } diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/impl/RoomContributionActivityCountServiceImpl.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/impl/RoomContributionActivityCountServiceImpl.java index 2af5383d..d431aa65 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/impl/RoomContributionActivityCountServiceImpl.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/impl/RoomContributionActivityCountServiceImpl.java @@ -207,51 +207,6 @@ public class RoomContributionActivityCountServiceImpl implements BigDecimal.valueOf(30000000)).sorted(Comparator.reverseOrder()) .collect(Collectors.toList()); } - -/* if (!Objects.equals(sysOrigin, SysOriginPlatformEnum.TARAB)) { - - return Stream.of(integralMin, - BigDecimal.valueOf(100000), - BigDecimal.valueOf(200000), - BigDecimal.valueOf(300000), - BigDecimal.valueOf(500000), - BigDecimal.valueOf(700000), - BigDecimal.valueOf(1000000), - BigDecimal.valueOf(1500000), - BigDecimal.valueOf(2000000), - BigDecimal.valueOf(2500000), - BigDecimal.valueOf(3000000), - BigDecimal.valueOf(3500000), - BigDecimal.valueOf(4000000), - BigDecimal.valueOf(4500000), - BigDecimal.valueOf(5000000), - BigDecimal.valueOf(6000000), - BigDecimal.valueOf(8000000), - BigDecimal.valueOf(10000000), - BigDecimal.valueOf(12000000), - BigDecimal.valueOf(15000000), - BigDecimal.valueOf(18000000), - BigDecimal.valueOf(20000000), - BigDecimal.valueOf(30000000)).sorted(Comparator.reverseOrder()) - .collect(Collectors.toList()); - }*/ -// if(Objects.equals(regionCode,"PK")){ -// return Stream.of(integralMin, -// BigDecimal.valueOf(200000), -// BigDecimal.valueOf(300000), -// BigDecimal.valueOf(500000), -// BigDecimal.valueOf(700000), -// BigDecimal.valueOf(1000000), -// BigDecimal.valueOf(1500000), -// BigDecimal.valueOf(2000000), -// BigDecimal.valueOf(5000000), -// BigDecimal.valueOf(10000000), -// BigDecimal.valueOf(15000000), -// BigDecimal.valueOf(20000000), -// BigDecimal.valueOf(25000000), -// BigDecimal.valueOf(30000000)).sorted(Comparator.reverseOrder()) -// .collect(Collectors.toList()); -// } List list = Stream.of(otherIntegralMin, BigDecimal.valueOf(300000), BigDecimal.valueOf(500000), @@ -274,10 +229,6 @@ public class RoomContributionActivityCountServiceImpl implements BigDecimal.valueOf(20000000), BigDecimal.valueOf(30000000)).sorted(Comparator.reverseOrder()) .collect(Collectors.toList()); - //如果是菲律宾地区从0开始 -// if(Objects.equals(regionCode,"PH")){ -// list.add(BigDecimal.valueOf(0)); -// } return list; } @@ -328,4 +279,27 @@ public class RoomContributionActivityCountServiceImpl implements RoomContributionActivityCount.class); } + @Override + public RoomContributionActivityCount getLastWeekData(Long roomId) { + // 获取上周的 dateNumber(当前周一 - 7 天) + Integer lastWeekDateNumber = ZonedDateTimeAsiaRiyadhUtils.getThisMonday() - 7; + + Criteria criteria = Criteria.where("roomId").is(roomId) + .and("dateNumber").is(lastWeekDateNumber) + .and("received").is(Boolean.FALSE); + + return mongoTemplate.findOne(Query.query(criteria), RoomContributionActivityCount.class); + } + + @Override + public List getAllRoomsLastWeekData() { + // 获取上周的 dateNumber + Integer lastWeekDateNumber = ZonedDateTimeAsiaRiyadhUtils.getThisMonday() - 7; + + Criteria criteria = Criteria.where("dateNumber").is(lastWeekDateNumber) + .and("received").is(Boolean.FALSE); + + return mongoTemplate.find(Query.query(criteria), RoomContributionActivityCount.class); + } + }