From d93807df8bb1fbc4cc94fa18886584661262ede4 Mon Sep 17 00:00:00 2001 From: Derran Date: Tue, 2 Dec 2025 16:07:21 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8E=AB=E7=91=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../request/UserCostChannelGiftSdkDto.java | 2 ++ .../user/request/UserCostChannelGiftDto.java | 1 + .../VirtualAccountApplicationService.java | 24 ++++++++++---- .../RevenueRewardQueryService.java | 1 + .../impl/RevenueRewardQueryServiceImpl.java | 2 ++ .../RewardConfigQueryService.java | 2 ++ .../impl/RewardConfigQueryServiceImpl.java | 32 +++++++++++++++++++ 7 files changed, 57 insertions(+), 7 deletions(-) diff --git a/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/request/UserCostChannelGiftSdkDto.java b/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/request/UserCostChannelGiftSdkDto.java index 8341024..bb82517 100644 --- a/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/request/UserCostChannelGiftSdkDto.java +++ b/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/request/UserCostChannelGiftSdkDto.java @@ -23,4 +23,6 @@ public class UserCostChannelGiftSdkDto { private Integer quantity; + private Integer channelCreatorTodayCrossMicCount; + } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserCostChannelGiftDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserCostChannelGiftDto.java index a4b34b5..2bbc850 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserCostChannelGiftDto.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserCostChannelGiftDto.java @@ -19,4 +19,5 @@ public class UserCostChannelGiftDto { private Integer quantity; + private Integer channelCreatorTodayCrossMicCount; } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/virtualaccount/VirtualAccountApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/virtualaccount/VirtualAccountApplicationService.java index 57b91fe..61e383d 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/virtualaccount/VirtualAccountApplicationService.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/virtualaccount/VirtualAccountApplicationService.java @@ -31,6 +31,7 @@ import com.qniao.dam.infrastructure.persistent.dao.domain.ProductSpecDao; import com.qniao.dam.infrastructure.utils.SnowFlakeUtil; import com.qniao.dam.query.product.ProductQueryService; import com.qniao.dam.query.revenuereward.RevenueRewardQueryService; +import com.qniao.dam.query.rewardconfig.RewardConfigQueryService; import com.qniao.dam.query.virtualaccount.VirtualAccountQueryService; import com.qniao.dam.query.walletaccount.WalletAccountQueryService; import org.springframework.stereotype.Service; @@ -66,6 +67,8 @@ public class VirtualAccountApplicationService { private CostGiftRewardDomainService costGiftRewardDomainService; @Resource private ProductQueryService productQueryService; + @Resource + private RewardConfigQueryService rewardConfigQueryService; public void create(VirtualAccount virtualAccount) { virtualAccountAggregate.create(virtualAccount); @@ -201,10 +204,10 @@ public class VirtualAccountApplicationService { if (virtualAccount != null && virtualAccount.getBalance() >= costBalance) { if (dto.getDirection() == 1) { //直接送主播 - vo = handleChannelAnchorGiftReward(virtualAccount, dto.getFromUserId(), dto.getChannelCreatorId(), productSpec, costBalance, dto.getQuantity()); + vo = handleChannelAnchorGiftReward(virtualAccount, dto.getFromUserId(), dto.getChannelCreatorId(), productSpec, costBalance, dto.getQuantity(), dto.getChannelCreatorTodayCrossMicCount()); } else { //直接送嘉宾 - vo = handleChannelUserGiftReward(virtualAccount, dto.getFromUserId(), dto.getToUserId(), dto.getChannelCreatorId(), productSpec, costBalance, dto.getQuantity()); + vo = handleChannelUserGiftReward(virtualAccount, dto.getFromUserId(), dto.getToUserId(), dto.getChannelCreatorId(), productSpec, costBalance, dto.getQuantity(), dto.getChannelCreatorTodayCrossMicCount()); } } return vo; @@ -220,7 +223,8 @@ public class VirtualAccountApplicationService { Long anchorId, ProductSpec productSpec, Integer costBalance, - Integer quantity) { + Integer quantity, + Integer channelCreatorTodayCrossMicCount) { CostGiftVo vo = new CostGiftVo(); //余额充足 创建消费订单+扣除余额 Order order = handleOrder(fromUserId, productSpec, quantity); @@ -252,8 +256,11 @@ public class VirtualAccountApplicationService { if (Objects.isNull(anchorRevenueReward)) { anchorRevenueReward = RevenueReward.initUser(anchorId); } - //营收额 todo - BigDecimal anchorRevenue = BigDecimal.valueOf(costBalance).multiply(BigDecimal.valueOf(0.1428)).multiply(BigDecimal.valueOf(0.3)).setScale(2, RoundingMode.HALF_UP); + //营收额 + BigDecimal giftRewardPct = rewardConfigQueryService.queryMatchmakerChannelGiftPct(toUserId, channelCreatorTodayCrossMicCount); + giftRewardPct = giftRewardPct.subtract(BigDecimal.valueOf(10)); + BigDecimal anchorRevenue = BigDecimal.valueOf(costBalance).multiply(BigDecimal.valueOf(0.1428)).multiply(giftRewardPct) + .divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); RevenueRewardRecord anchorRevenueRewardRecord = RevenueRewardRecord.build(TradeTypeEnum.GIFT_REWARD, TradeSceneEnum.ONLINE, anchorRevenue, BigDecimal.valueOf(100), BigDecimal.ZERO, anchorRevenue, BigDecimal.valueOf(costBalance)); //todo @@ -281,7 +288,8 @@ public class VirtualAccountApplicationService { Long toUserId, ProductSpec productSpec, Integer costBalance, - Integer quantity) { + Integer quantity, + Integer channelCreatorTodayCrossMicCount) { CostGiftVo vo = new CostGiftVo(); //余额充足 创建消费订单+扣除余额 Order order = handleOrder(fromUserId, productSpec, quantity); @@ -294,7 +302,9 @@ public class VirtualAccountApplicationService { revenueReward = RevenueReward.initUser(toUserId); } //营收额 todo - BigDecimal revenue = BigDecimal.valueOf(costBalance).multiply(BigDecimal.valueOf(0.1428)).multiply(BigDecimal.valueOf(0.4)).setScale(2, RoundingMode.HALF_UP); + BigDecimal giftRewardPct = rewardConfigQueryService.queryMatchmakerChannelGiftPct(toUserId, channelCreatorTodayCrossMicCount); + BigDecimal revenue = BigDecimal.valueOf(costBalance).multiply(BigDecimal.valueOf(0.1428)).multiply(giftRewardPct) + .divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); RevenueRewardRecord revenueRewardRecord = RevenueRewardRecord.build(TradeTypeEnum.GIFT_REWARD, TradeSceneEnum.ONLINE, revenue, BigDecimal.valueOf(100), BigDecimal.ZERO, revenue, BigDecimal.valueOf(costBalance)); diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/revenuereward/RevenueRewardQueryService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/revenuereward/RevenueRewardQueryService.java index 1a272af..45b2e7f 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/revenuereward/RevenueRewardQueryService.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/revenuereward/RevenueRewardQueryService.java @@ -12,6 +12,7 @@ import com.qniao.dam.domian.aggregate.walletaccount.constant.TradeSceneEnum; import com.qniao.dam.domian.aggregate.walletaccount.constant.TradeTypeEnum; import com.qniao.framework.utils.PageUtil; +import java.math.BigDecimal; import java.util.List; public interface RevenueRewardQueryService { diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/revenuereward/impl/RevenueRewardQueryServiceImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/revenuereward/impl/RevenueRewardQueryServiceImpl.java index ee238ff..f10fb16 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/revenuereward/impl/RevenueRewardQueryServiceImpl.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/revenuereward/impl/RevenueRewardQueryServiceImpl.java @@ -9,6 +9,7 @@ import com.qniao.dam.api.query.revenuereward.user.response.*; import com.qniao.dam.domain.aggregate.revenuereward.entity.RevenueReward; import com.qniao.dam.domain.aggregate.revenuereward.valueobj.RevenueRewardAssociateOrderRecord; import com.qniao.dam.domain.aggregate.revenuereward.valueobj.RevenueRewardRecord; +import com.qniao.dam.domian.aggregate.product.constant.ProductSubCategoryEnum; import com.qniao.dam.domian.aggregate.walletaccount.constant.IdentityTypeEnum; import com.qniao.dam.domian.aggregate.walletaccount.constant.TradeSceneEnum; import com.qniao.dam.domian.aggregate.walletaccount.constant.TradeTypeEnum; @@ -33,6 +34,7 @@ import com.qniao.framework.utils.TypeConvertUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/rewardconfig/RewardConfigQueryService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/rewardconfig/RewardConfigQueryService.java index d5d0e63..7a8a7ee 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/rewardconfig/RewardConfigQueryService.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/rewardconfig/RewardConfigQueryService.java @@ -29,4 +29,6 @@ public interface RewardConfigQueryService { BigDecimal queryRecommendRewardPct(MatchmakerLevelEnum initiatorLevel, MatchmakerLevelEnum receiveLevel); RewardConfig queryMatchmakerRenewValidityPeriod(Matchmaker matchmaker); + + BigDecimal queryMatchmakerChannelGiftPct(Long userId, Integer todayCrossMicCount); } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/rewardconfig/impl/RewardConfigQueryServiceImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/rewardconfig/impl/RewardConfigQueryServiceImpl.java index a50808e..467c87b 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/rewardconfig/impl/RewardConfigQueryServiceImpl.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/rewardconfig/impl/RewardConfigQueryServiceImpl.java @@ -135,6 +135,38 @@ public class RewardConfigQueryServiceImpl implements RewardConfigQueryService { return null; } + @Override + public BigDecimal queryMatchmakerChannelGiftPct(Long userId, Integer todayCrossMicCount) { + BigDecimal pct = BigDecimal.ZERO; + Matchmaker matchmaker = matchmakerQueryService.queryByUserId(userId); + if (ProductSubCategoryEnum.MATCHMAKER_FRANCHISE_FEE.equals(matchmaker.getType())) { + RewardConfig rewardConfig = queryByRewardType(RewardTypeEnum.MATCHMAKER_PARTNER_GIFT_PCT); + pct = new BigDecimal(rewardConfig.getValue()); + } else if (ProductSubCategoryEnum.MATCHMAKER_ONLINE_FEE.equals(matchmaker.getType())) { + RewardConfig rewardConfig = queryByRewardType(RewardTypeEnum.MATCHMAKER_ONLINE_GIFT_PCT); + pct = new BigDecimal(rewardConfig.getValue()); + } else if (ProductSubCategoryEnum.MATCHMAKER_TRAINEE_FEE.equals(matchmaker.getType())) { + RewardConfig minRewardConfig = queryByRewardType(RewardTypeEnum.MATCHMAKER_TRAINEE_GIFT_MIN_PCT); + BigDecimal minPct = new BigDecimal(minRewardConfig.getValue()); + RewardConfig maxRewardConfig = queryByRewardType(RewardTypeEnum.MATCHMAKER_TRAINEE_GIFT_MAX_PCT); + BigDecimal maxPct = new BigDecimal(maxRewardConfig.getValue()); + RewardConfig ladderRewardConfig = queryByRewardType(RewardTypeEnum.MATCHMAKER_GIFT_LADDER_PCT); + BigDecimal ladderPct = new BigDecimal(ladderRewardConfig.getValue()); + pct = minPct.add(ladderPct.multiply(BigDecimal.valueOf(todayCrossMicCount / 5))); + pct = pct.compareTo(maxPct) > 0 ? maxPct : pct; + } else if (ProductSubCategoryEnum.MATCHMAKER_FREE_FEE.equals(matchmaker.getType())) { + RewardConfig minRewardConfig = queryByRewardType(RewardTypeEnum.MATCHMAKER_FREE_GIFT_MIN_PCT); + BigDecimal minPct = new BigDecimal(minRewardConfig.getValue()); + RewardConfig maxRewardConfig = queryByRewardType(RewardTypeEnum.MATCHMAKER_FREE_GIFT_MAX_PCT); + BigDecimal maxPct = new BigDecimal(maxRewardConfig.getValue()); + RewardConfig ladderRewardConfig = queryByRewardType(RewardTypeEnum.MATCHMAKER_GIFT_LADDER_PCT); + BigDecimal ladderPct = new BigDecimal(ladderRewardConfig.getValue()); + pct = minPct.add(ladderPct.multiply(BigDecimal.valueOf(todayCrossMicCount / 5))); + pct = pct.compareTo(maxPct) > 0 ? maxPct : pct; + } + return pct; + } + @Override public BigDecimal queryRecommendRewardPct(MatchmakerLevelEnum initiatorLevel, MatchmakerLevelEnum receiveLevel) {