From e2849d2ccaf2c513b8532ee5e657da207a99841e Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Fri, 6 Mar 2026 11:31:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=89=E6=96=B0=E5=A5=96=E5=8A=B1=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/ability/InviteUserGateway.java | 5 +- .../model/user/RechargeCommissionResult.java | 29 ++++ .../user/user/UserOneTimeTaskTypeEnum.java | 7 +- .../gateway/user/InviteUserGatewayImpl.java | 133 +++++++++--------- .../impl/InviteUserClientServiceImpl.java | 133 ++++++++++++++++-- 5 files changed, 228 insertions(+), 79 deletions(-) create mode 100644 rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/model/user/RechargeCommissionResult.java diff --git a/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/gateway/user/ability/InviteUserGateway.java b/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/gateway/user/ability/InviteUserGateway.java index fb79e5ea..d641c38e 100644 --- a/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/gateway/user/ability/InviteUserGateway.java +++ b/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/gateway/user/ability/InviteUserGateway.java @@ -1,5 +1,6 @@ package com.red.circle.other.domain.gateway.user.ability; +import com.red.circle.other.domain.model.user.RechargeCommissionResult; import java.math.BigDecimal; /** @@ -15,9 +16,9 @@ public interface InviteUserGateway { * @param rechargeAmount 充值金额 * @param sysOrigin 系统 * @param inviteUserId 被邀请人(充值人) + * @return 佣金处理结果,无邀请关系时返回null */ - void getRechargeCommission(BigDecimal rechargeAmount, String sysOrigin, + RechargeCommissionResult getRechargeCommission(BigDecimal rechargeAmount, String sysOrigin, Long inviteUserId); - } diff --git a/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/model/user/RechargeCommissionResult.java b/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/model/user/RechargeCommissionResult.java new file mode 100644 index 00000000..14d377a9 --- /dev/null +++ b/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/model/user/RechargeCommissionResult.java @@ -0,0 +1,29 @@ +package com.red.circle.other.domain.model.user; + +import java.math.BigDecimal; +import lombok.Data; + +/** + * 邀请佣金处理结果. + * + * @author tf + */ +@Data +public class RechargeCommissionResult { + + /** 邀请人(A)的userId. */ + private Long inviterUserId; + + /** 被邀请人(B)的userId. */ + private Long inviteeUserId; + + /** 被邀请人累计充值金额(Redis累计,用于档位判断). */ + private BigDecimal inviteeTotalRecharge; + + /** 系统来源. */ + private String sysOrigin; + + /** 被邀请人是否为7天内新用户. */ + private boolean newUser; + +} diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/enums/user/user/UserOneTimeTaskTypeEnum.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/enums/user/user/UserOneTimeTaskTypeEnum.java index d8a4de44..a30e5a0b 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/enums/user/user/UserOneTimeTaskTypeEnum.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/enums/user/user/UserOneTimeTaskTypeEnum.java @@ -13,7 +13,12 @@ public enum UserOneTimeTaskTypeEnum { /** * 首次充值. */ - FIRST_CHARGE; + FIRST_CHARGE, + + /** + * 邀请奖励. + */ + INVITE_REWARD; } diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/user/InviteUserGatewayImpl.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/user/InviteUserGatewayImpl.java index 9787457b..4d25b255 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/user/InviteUserGatewayImpl.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/user/InviteUserGatewayImpl.java @@ -3,7 +3,9 @@ package com.red.circle.other.infra.gateway.user; import com.alibaba.nacos.client.naming.utils.CollectionUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.red.circle.common.business.core.enums.SysOriginPlatformEnum; +import com.red.circle.component.redis.service.RedisService; import com.red.circle.other.domain.gateway.user.UserProfileGateway; +import com.red.circle.other.domain.model.user.RechargeCommissionResult; import com.red.circle.other.domain.model.user.UserProfile; import com.red.circle.other.domain.ranking.RankingActivityType; import com.red.circle.other.domain.ranking.RankingCycleType; @@ -11,26 +13,13 @@ import com.red.circle.other.domain.ranking.RankingDimension; import com.red.circle.other.infra.database.mongo.entity.activity.RankingActivityRecord; import com.red.circle.other.infra.database.rds.dao.user.user.UserInviteUserDAO; import com.red.circle.other.infra.database.rds.entity.user.user.InviteUserRechargeCommission; -import com.red.circle.other.infra.database.rds.entity.user.user.OneTimeTask; import com.red.circle.other.infra.database.rds.entity.user.user.UserInviteUser; -import com.red.circle.other.infra.database.rds.service.user.user.OneTimeTaskService; -import com.red.circle.other.infra.gateway.RankingActivityGateway; -import com.red.circle.other.inner.model.dto.user.UserProfileDTO; -import com.red.circle.tool.core.date.TimestampUtils; -import com.red.circle.other.domain.gateway.user.ability.InviteUserGateway; -import com.red.circle.other.infra.database.cache.service.user.UserInviteCacheService; -import com.red.circle.other.infra.database.rds.entity.user.user.InviteUserRegister; import com.red.circle.other.infra.database.rds.service.user.user.InviteUserRechargeCommissionService; -import com.red.circle.other.infra.database.rds.service.user.user.InviteUserRegisterService; import com.red.circle.other.infra.database.rds.service.user.user.InviteUserSummaryService; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.sql.Timestamp; -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; - +import com.red.circle.other.infra.database.cache.service.user.UserInviteCacheService; +import com.red.circle.other.infra.gateway.RankingActivityGateway; +import com.red.circle.other.domain.gateway.user.ability.InviteUserGateway; +import com.red.circle.tool.core.date.TimestampUtils; 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; @@ -39,6 +28,15 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.sql.Timestamp; +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + /** * 被邀请的用户充值,邀请人获得佣金处理 实现. * @@ -49,61 +47,57 @@ import org.springframework.stereotype.Component; @RequiredArgsConstructor public class InviteUserGatewayImpl implements InviteUserGateway { + private static final String INVITE_RECHARGE_TOTAL_KEY = "invite:recharge:total:%d:%d"; + private static final long INVITE_RECHARGE_TOTAL_EXPIRE_DAYS = 30L; + private final WalletGoldClient walletGoldClient; private final UserInviteCacheService userInviteCacheService; private final InviteUserSummaryService inviteUserSummaryService; private final UserInviteUserDAO userInviteUserDAO; private final UserProfileGateway userProfileGateway; private final InviteUserRechargeCommissionService inviteUserRechargeCommissionService; - private final OneTimeTaskService oneTimeTaskService; private final RankingActivityGateway rankingActivityGateway; + private final RedisService redisService; - /** - * 被邀请人充值邀请人获得佣金 - * - * @param rechargeAmount 充值金额 - * @param sysOrigin 系统 - * @param inviteUserId 被邀请人(充值人) - */ @Override - public void getRechargeCommission(BigDecimal rechargeAmount, String sysOrigin, + public RechargeCommissionResult getRechargeCommission(BigDecimal rechargeAmount, String sysOrigin, Long inviteUserId) { //根据被邀请人获得邀请人 UserInviteUser userInviteUser = getByInviteUserId(inviteUserId); if (Objects.isNull(userInviteUser)) { - return; + return null; } //能够赚取佣金的天数 Integer commissionDays = getCommissionDays(sysOrigin); if (Objects.isNull(commissionDays)) { log.info("能够赚取佣金的天数 => null, inviteUserId:{}", inviteUserId); - return; + return null; } - //邀请时间 + 有效天数 > 当前时间 则可以继续获得佣金。 + Timestamp limitedTime = getLimitedTime(userInviteUser, commissionDays); if (limitedTime.compareTo(TimestampUtils.now()) < 0) { log.info("邀请时间 + 有效天数 < 当前时间, inviteUserId:{}", inviteUserId); - return; + return null; } - //获得佣金比例 - Double commissionRate = getCommissionRate(sysOrigin, userInviteUser.getInviteUserId()); + Double commissionRate = getCommissionRate(sysOrigin); if (Objects.isNull(commissionRate)) { log.info("获得佣金比例 => null, inviteUserId:{}", inviteUserId); - return; + return null; } //获得的佣金 = 糖果数 * 佣金比例 BigDecimal commission = getCommission(rechargeAmount, commissionRate); if (commission.compareTo(BigDecimal.ZERO) <= 0) { log.info("糖果数 * 佣金比例 <= 0, inviteUserId:{}", inviteUserId); - return; + return null; } inviteUserSummaryService.incrCommission(userInviteUser.getUserId(), commission); - inviteUserRechargeCommissionService.add(sysOrigin, userInviteUser.getUserId(), userInviteUser.getInviteUserId(), commission); + inviteUserRechargeCommissionService.add(sysOrigin, userInviteUser.getUserId(), + userInviteUser.getInviteUserId(), commission); // 累计邀请人数:判断inviteUserRechargeCommissionService里是否已有该被邀请人的记录 // 查询该被邀请人在此之前是否有充值记录 @@ -114,7 +108,7 @@ public class InviteUserGatewayImpl implements InviteUserGateway { // 如果记录数 < 1,说明是首次充值(当前这条刚插入),才累计邀请人数+1 if (recordCount < 1) { - log.info("被邀请人首次充值,累计邀请人数+1, inviterUserId:{}, inviteUserId:{}", + log.info("被邀请人首次充值,累计邀请人数+1, inviterUserId:{}, inviteeUserId:{}", userInviteUser.getUserId(), userInviteUser.getInviteUserId()); inviteUserSummaryService.incrUser(userInviteUser.getUserId(), 1); } @@ -122,21 +116,39 @@ public class InviteUserGatewayImpl implements InviteUserGateway { awardCommission(sysOrigin, userInviteUser.getUserId(), commission, userInviteUser.getInviteUserId()); recordRanking(userInviteUser.getUserId(), commission.longValue()); + + BigDecimal totalRecharge = accumulateRecharge(userInviteUser.getUserId(), inviteUserId, rechargeAmount); + + RechargeCommissionResult result = new RechargeCommissionResult(); + result.setInviterUserId(userInviteUser.getUserId()); + result.setInviteeUserId(inviteUserId); + result.setInviteeTotalRecharge(totalRecharge); + result.setSysOrigin(sysOrigin); + result.setNewUser(isNewUserWithinDays(inviteUserId, 7)); + return result; } - private void recordRanking(Long userId, Long quantity) { - RankingActivityRecord record = new RankingActivityRecord(); - record.setSysOrigin(SysOriginPlatformEnum.LIKEI.name()); - record.setUserId(userId); - record.setUserSex(1); - record.setActivityType(RankingActivityType.INVITE); - record.setCycleType(RankingCycleType.WEEKLY); - record.setCycleKey(ZonedDateTimeAsiaRiyadhUtils.nowWeekMondayToInt().toString()); - record.setDimension(RankingDimension.CONSUME_AMOUNT); - record.setExpiredTime(new Timestamp(System.currentTimeMillis() + 30L * 24 * 60 * 60 * 1000)); - // 累计数据 - rankingActivityGateway.accumulateRankingData(record, quantity); + private BigDecimal accumulateRecharge(Long inviterUserId, Long inviteeUserId, BigDecimal rechargeAmount) { + String key = String.format(INVITE_RECHARGE_TOTAL_KEY, inviterUserId, inviteeUserId); + Long total = redisService.increment(key, rechargeAmount.longValue()); + if (total != null && total <= rechargeAmount.longValue()) { + redisService.expire(key, INVITE_RECHARGE_TOTAL_EXPIRE_DAYS, TimeUnit.DAYS); } + return total != null ? BigDecimal.valueOf(total) : rechargeAmount; + } + + private void recordRanking(Long userId, Long quantity) { + RankingActivityRecord record = new RankingActivityRecord(); + record.setSysOrigin(SysOriginPlatformEnum.LIKEI.name()); + record.setUserId(userId); + record.setUserSex(1); + record.setActivityType(RankingActivityType.INVITE); + record.setCycleType(RankingCycleType.WEEKLY); + record.setCycleKey(ZonedDateTimeAsiaRiyadhUtils.nowWeekMondayToInt().toString()); + record.setDimension(RankingDimension.CONSUME_AMOUNT); + record.setExpiredTime(new Timestamp(System.currentTimeMillis() + 30L * 24 * 60 * 60 * 1000)); + rankingActivityGateway.accumulateRankingData(record, quantity); + } /** * 奖励佣金 @@ -164,18 +176,15 @@ public class InviteUserGatewayImpl implements InviteUserGateway { .setScale(0, RoundingMode.DOWN); } - private Double getCommissionRate(String sysOrigin, Long userId) { - Double commissionRate = userInviteCacheService.getCommissionRate(SysOriginPlatformEnum.valueOf(sysOrigin)); + private Double getCommissionRate(String sysOrigin) { + return userInviteCacheService.getCommissionRate(SysOriginPlatformEnum.valueOf(sysOrigin)); + } - UserProfile userProfile = userProfileGateway.getByUserId(userId); - Duration duration = Duration.between(userProfile.getCreateTime().toLocalDateTime(), LocalDateTime.now()); - if (duration.toDays() < 7) { - OneTimeTask oneTimeTask = oneTimeTaskService.queryCompletedFirstCharge(userId, sysOrigin); - if (Objects.isNull(oneTimeTask)) { - commissionRate += 0.03; - } - } - return commissionRate; + /** 判断用户是否为注册N天内的新用户 */ + private boolean isNewUserWithinDays(Long userId, int days) { + UserProfile userProfile = userProfileGateway.getByUserId(userId); + Duration duration = Duration.between(userProfile.getCreateTime().toLocalDateTime(), LocalDateTime.now()); + return duration.toDays() < days; } private UserInviteUser getByInviteUserId(Long inviteUserId) { @@ -196,13 +205,11 @@ public class InviteUserGatewayImpl implements InviteUserGateway { } private Integer getCommissionDays(String sysOrigin) { - return userInviteCacheService - .getCommissionDays(SysOriginPlatformEnum.valueOf(sysOrigin)); + return userInviteCacheService.getCommissionDays(SysOriginPlatformEnum.valueOf(sysOrigin)); } private Timestamp getLimitedTime(UserInviteUser userInviteUser, Integer commissionDays) { - return TimestampUtils - .dateTimestampPlusDays(userInviteUser.getCreateTime().toLocalDateTime(), commissionDays); + return TimestampUtils.dateTimestampPlusDays(userInviteUser.getCreateTime().toLocalDateTime(), commissionDays); } } diff --git a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/user/user/impl/InviteUserClientServiceImpl.java b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/user/user/impl/InviteUserClientServiceImpl.java index 086062a3..119fafa0 100644 --- a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/user/user/impl/InviteUserClientServiceImpl.java +++ b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/user/user/impl/InviteUserClientServiceImpl.java @@ -2,6 +2,8 @@ package com.red.circle.other.app.inner.service.user.user.impl; import com.google.common.base.Throwables; import com.red.circle.common.business.core.enums.SysOriginPlatformEnum; +import com.red.circle.common.business.enums.SendPropsOrigin; +import com.red.circle.component.redis.service.RedisService; import com.red.circle.framework.core.asserts.ResponseAssert; import com.red.circle.framework.core.response.CommonErrorCode; import com.red.circle.framework.dto.PageResult; @@ -9,14 +11,19 @@ import com.red.circle.framework.mybatis.convertor.MybatisConvertor; import com.red.circle.other.app.inner.convertor.user.UserInviteInnerConvertor; import com.red.circle.other.app.inner.service.user.user.InviteUserClientService; import com.red.circle.other.domain.gateway.user.ability.InviteUserGateway; +import com.red.circle.other.domain.model.user.RechargeCommissionResult; import com.red.circle.other.infra.database.cache.service.user.UserInviteCacheService; +import com.red.circle.other.infra.database.rds.entity.user.user.OneTimeTask; import com.red.circle.other.infra.database.rds.query.user.InviteUserQry; import com.red.circle.other.infra.database.rds.service.user.user.InviteUserRechargeCommissionService; import com.red.circle.other.infra.database.rds.service.user.user.InviteUserRegisterService; import com.red.circle.other.infra.database.rds.service.user.user.InviteUserRewardRecordService; import com.red.circle.other.infra.database.rds.service.user.user.InviteUserSummaryService; -import com.red.circle.tool.core.date.TimestampUtils; -import com.red.circle.tool.core.text.StringUtils; +import com.red.circle.other.infra.database.rds.service.user.user.OneTimeTaskService; +import com.red.circle.other.infra.enums.user.user.UserOneTimeTaskTypeEnum; +import com.red.circle.other.inner.endpoint.activity.PropsActivityClient; +import com.red.circle.other.inner.endpoint.sys.EnumConfigClient; +import com.red.circle.other.inner.model.cmd.activity.SendActivityRewardCmd; import com.red.circle.other.inner.model.cmd.user.InviteUserQryCmd; import com.red.circle.other.inner.model.cmd.user.SysInviteUserConfigCmd; import com.red.circle.other.inner.model.cmd.user.UserInviteRewardQryCmd; @@ -26,13 +33,23 @@ import com.red.circle.other.inner.model.dto.user.InviteUserRewardRecordDTO; import com.red.circle.other.inner.model.dto.user.InviteUserSummaryDTO; import com.red.circle.other.inner.model.dto.user.PageInviteUserRegisterDTO; import com.red.circle.other.inner.model.dto.user.SysInviteUserConfigDTO; -import java.math.BigDecimal; -import java.util.List; -import java.util.Objects; +import com.red.circle.tool.core.date.TimestampUtils; +import com.red.circle.tool.core.sequence.IdWorkerUtils; +import com.red.circle.tool.core.text.StringUtils; +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 lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + /** * 邀请用户. * @@ -43,6 +60,21 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor public class InviteUserClientServiceImpl implements InviteUserClientService { + // 档位阈值 + private static final long TIER1_THRESHOLD = 10_000L; + private static final long TIER2_THRESHOLD = 50_000L; + private static final long TIER3_THRESHOLD = 100_000L; + + // 档位道具id + private static final long TIER1_PROPS_ID = 2029448725407711234L; + private static final long TIER2_PROPS_ID = 2029449081176965121L; + private static final long TIER3_PROPS_ID = 2029449364032438273L; + + // 档位金币奖励 + private static final long TIER1_GOLD = 2000L; + private static final long TIER2_GOLD = 5000L; + private static final long TIER3_GOLD = 5000L; + private final InviteUserGateway inviteUserGateway; private final UserInviteCacheService userInviteCacheService; private final UserInviteInnerConvertor userInviteInnerConvertor; @@ -50,17 +82,99 @@ public class InviteUserClientServiceImpl implements InviteUserClientService { private final InviteUserRegisterService inviteUserRegisterService; private final InviteUserRewardRecordService inviteUserRewardRecordService; private final InviteUserRechargeCommissionService rechargeCommissionService; + private final PropsActivityClient propsActivityClient; + private final WalletGoldClient walletGoldClient; + private final OneTimeTaskService oneTimeTaskService; + @Override public void processRechargeCommission(BigDecimal rechargeAmount, String sysOrigin, Long inviteUserId) { try { - inviteUserGateway.getRechargeCommission(rechargeAmount, sysOrigin, inviteUserId); + RechargeCommissionResult result = inviteUserGateway.getRechargeCommission(rechargeAmount, sysOrigin, inviteUserId); + if (Objects.isNull(result)) { + return; + } + + checkAndAwardTiers(result); } catch (Exception e) { log.error("被邀请人充值邀请人获得佣金累计错误: {}", Throwables.getStackTraceAsString(e)); } } + /** + * 根据累计充值金额检查并发放档位奖励 + */ + private void checkAndAwardTiers(RechargeCommissionResult result) { + if (!result.isNewUser()) { + return; + } + long total = result.getInviteeTotalRecharge().longValue(); + + if (total >= TIER3_THRESHOLD) { + tryAwardTier(result, 3, TIER3_PROPS_ID, TIER3_GOLD); + tryAwardTier(result, 2, TIER2_PROPS_ID, TIER2_GOLD); + tryAwardTier(result, 1, TIER1_PROPS_ID, TIER1_GOLD); + } else if (total >= TIER2_THRESHOLD) { + tryAwardTier(result, 2, TIER2_PROPS_ID, TIER2_GOLD); + tryAwardTier(result, 1, TIER1_PROPS_ID, TIER1_GOLD); + } else if (total >= TIER1_THRESHOLD) { + tryAwardTier(result, 1, TIER1_PROPS_ID, TIER1_GOLD); + } + } + + /** + * 尝试发放指定档位奖励(幂等) + * 金币发给邀请人A,道具发给被邀请人B + */ + private void tryAwardTier(RechargeCommissionResult result, int tier, long propsId, long gold) { + String taskType = UserOneTimeTaskTypeEnum.INVITE_REWARD.name() + "_" + tier; + + OneTimeTask alreadyRewarded = oneTimeTaskService.query() + .eq(OneTimeTask::getUserId, result.getInviterUserId()) + .eq(OneTimeTask::getSysOrigin, result.getSysOrigin()) + .eq(OneTimeTask::getTaskType, taskType) + .last("LIMIT 1") + .getOne(); + + if (alreadyRewarded != null) { + return; + } + + log.info("发放邀请奖励档位{}: inviterUserId={}, inviteeUserId={}", tier, + result.getInviterUserId(), result.getInviteeUserId()); + + // 写入记录(幂等保证) + oneTimeTaskService.save(new OneTimeTask() + .setUserId(result.getInviterUserId()) + .setSysOrigin(result.getSysOrigin()) + .setTaskType(taskType) + .setRewardQuantity(BigDecimal.valueOf(gold)) + .setAwardStatus(Boolean.TRUE) + ); + + // 金币奖励发给邀请人A + walletGoldClient.changeBalance(GoldReceiptCmd.builder() + .appIncome() + .userId(result.getInviterUserId()) + .eventId(result.getInviteeUserId()) + .sysOrigin(result.getSysOrigin()) + .origin(GoldOrigin.INVITE_USER_REWARDS) + .originDescribe(GoldOrigin.INVITE_USER_REWARDS.getDesc()) + .amount(BigDecimal.valueOf(gold)) + .build()); + + // 道具奖励发给被邀请人B + propsActivityClient.sendActivityReward(new SendActivityRewardCmd() + .setTrackId(IdWorkerUtils.getId()) + .setSysOrigin(SysOriginPlatformEnum.LIKEI) + .setAcceptUserId(result.getInviteeUserId()) + .setSourceGroupId(propsId) + .setOrigin(SendPropsOrigin.INVITE_USER_REWARDS) + ); + + } + @Override public List pageInviteUserRegister(Integer pageNumber, Long userId) { return userInviteInnerConvertor.toListInviteUserRegisterDTO( @@ -107,10 +221,8 @@ public class InviteUserClientServiceImpl implements InviteUserClientService { .convert(userInviteInnerConvertor::toInviteUserRewardRecordDTO); } - @Override public PageResult pageInviteUserRegisterAll(InviteUserQryCmd query) { - InviteUserQry inviteUserQry = new InviteUserQry(); inviteUserQry.setSysOrigin(query.getSysOrigin()); inviteUserQry.setUserId(query.getUserId()); @@ -128,7 +240,6 @@ public class InviteUserClientServiceImpl implements InviteUserClientService { inviteUserQry).convert(userInviteInnerConvertor::toPageInviteUserRegisterDTO); } - @Override public void updateConfig(SysInviteUserConfigCmd config) { ResponseAssert.isFalse(CommonErrorCode.TYPE_IS_NOT_IN_SCOPE, @@ -141,12 +252,8 @@ public class InviteUserClientServiceImpl implements InviteUserClientService { } else { userInviteCacheService.setCommissionRate(sysOrigin, 0.0); } - } - /** - * 邀请用户规则 - */ @Override public SysInviteUserConfigDTO getConfig(String sysOrigin) { SysInviteUserConfigDTO vo = new SysInviteUserConfigDTO();