房间贡献,新增自动方法房间贡献奖励定时任务

This commit is contained in:
tianfeng 2025-10-28 19:52:45 +08:00
parent b0199267a0
commit cefa78bdea
4 changed files with 178 additions and 96 deletions

View File

@ -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<String> 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<RoomContributionActivityCount> 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<String, BigDecimal> 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)

View File

@ -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;
/**
* 房间贡献周奖励定时任务
* <p>
* 沙特时间每周一 0 点执行
* </p>
*
* @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<RoomContributionActivityCount> 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);
}
}

View File

@ -91,4 +91,19 @@ public interface RoomContributionActivityCountService {
*/
List<RoomContributionActivityCount> listRoomContributionByPH(Long roomId,BigDecimal number);
/**
* 获取房间上周贡献数据未领取状态
*
* @param roomId 房间ID
* @return 上周贡献数据
*/
RoomContributionActivityCount getLastWeekData(Long roomId);
/**
* 获取所有房间上周贡献数据未领取状态
*
* @return 所有房间上周贡献数据列表
*/
List<RoomContributionActivityCount> getAllRoomsLastWeekData();
}

View File

@ -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<BigDecimal> 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<RoomContributionActivityCount> 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);
}
}