diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/rewardconfig/constant/RewardTypeEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/rewardconfig/constant/RewardTypeEnum.java index c36b605..11fa32b 100644 --- a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/rewardconfig/constant/RewardTypeEnum.java +++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/rewardconfig/constant/RewardTypeEnum.java @@ -136,6 +136,8 @@ public enum RewardTypeEnum { NON_OPERATING_MANAGEMENT_FEE_35(511, "非经营性质服务商管理费-35%"), //聊天收益 + VIRTUAL_ACCOUNT_WORTH(600, "玫瑰价值"), + CHAT_PROFIT_BY_CHAT_CARD(601, "聊天收益-聊天卡"), CHAT_PROFIT_BY_VIRTUAL_ACCOUNT(602, "聊天收益-玫瑰"), @@ -157,7 +159,12 @@ public enum RewardTypeEnum { MATCHMAKER_FREE_GIFT_MAX_PCT(706, "免费红娘礼物收益最高百分比"), - MATCHMAKER_GIFT_LADDER_PCT(707, "红娘礼物收益阶梯百分比"); + MATCHMAKER_GIFT_LADDER_PCT(707, "红娘礼物收益阶梯百分比"), + + MATCHMAKER_PARTNER_RECOMMEND_COST_PCT(708, "高级红娘推荐消费收益百分比"), + MATCHMAKER_ONLINE_RECOMMEND_COST_PCT(709, "签约红娘推荐消费收益百分比"), + MATCHMAKER_TRAINEE_RECOMMEND_COST_PCT(710, "线上红娘推荐消费收益百分比"), + MATCHMAKER_FREE_RECOMMEND_COST_PCT(711, "实习红娘推荐消费收益百分比"); @EnumValue @JsonValue diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/walletaccount/constant/TradeTypeEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/walletaccount/constant/TradeTypeEnum.java index bdfa821..1a5db82 100644 --- a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/walletaccount/constant/TradeTypeEnum.java +++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/walletaccount/constant/TradeTypeEnum.java @@ -34,6 +34,8 @@ public enum TradeTypeEnum { GIFT_REWARD(112, "礼物收益"), + RECOMMEND_GIFT_REWARD(113, "邀请分成"), + PLATFORM_SERVICE_FEE(201, "平台服务费"), WITHDRAW(202, "提现"); diff --git a/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/virtualaccount/event/VirtualAccountCostGiftEvent.java b/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/virtualaccount/event/VirtualAccountCostGiftEvent.java new file mode 100644 index 0000000..a198e1e --- /dev/null +++ b/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/virtualaccount/event/VirtualAccountCostGiftEvent.java @@ -0,0 +1,20 @@ +package com.qniao.dam.domian.aggregate.virtualaccount.event; + +import com.qniao.domain.BaseDomainEvent; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class VirtualAccountCostGiftEvent extends BaseDomainEvent { + + private Long id; + + private Long userId; + + private Integer costBalance; + + private Long orderId; +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/walletaccount/user/WalletAccountUserCommandController.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/walletaccount/user/WalletAccountUserCommandController.java index 040fb05..343c703 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/walletaccount/user/WalletAccountUserCommandController.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/walletaccount/user/WalletAccountUserCommandController.java @@ -1,7 +1,7 @@ package com.qniao.dam.api.command.walletaccount.user; import com.qniao.dam.api.command.walletaccount.user.request.UserAcquireRewardAmountDto; -import com.qniao.dam.application.handler.walletaccount.WalletAccountApplicationService; +import com.qniao.dam.application.service.walletaccount.WalletAccountApplicationService; import com.qniao.framework.annotation.IgnoreResponseAdvice; import io.swagger.annotations.Api; import org.springframework.web.bind.annotation.PostMapping; diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/virtualaccount/VirtualAccountEventHandler.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/virtualaccount/VirtualAccountEventHandler.java new file mode 100644 index 0000000..55622e5 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/virtualaccount/VirtualAccountEventHandler.java @@ -0,0 +1,106 @@ +package com.qniao.dam.application.handler.virtualaccount; + +import com.google.common.eventbus.Subscribe; +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.domain.aggregate.rewardconfig.entity.RewardConfig; +import com.qniao.dam.domain.aggregate.walletaccount.entity.WalletAccount; +import com.qniao.dam.domain.aggregate.walletaccount.valueobj.WalletAccountRecord; +import com.qniao.dam.domain.service.revenuereward.AcquireRevenueRewardDomainService; +import com.qniao.dam.domian.aggregate.product.constant.ProductSubCategoryEnum; +import com.qniao.dam.domian.aggregate.rewardconfig.constant.RewardTypeEnum; +import com.qniao.dam.domian.aggregate.virtualaccount.event.VirtualAccountCostGiftEvent; +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; +import com.qniao.dam.infrastructure.persistent.dao.domain.MatchmakerDao; +import com.qniao.dam.query.matchmakermarriage.MatchmakerMarriageInformationQueryService; +import com.qniao.dam.query.revenuereward.RevenueRewardQueryService; +import com.qniao.dam.query.rewardconfig.RewardConfigQueryService; +import com.qniao.dam.query.walletaccount.WalletAccountQueryService; +import com.qniao.das.domian.aggregate.matchmakermarriage.MatchmakerMarriageInformation; +import com.qniao.dau.domain.aggregate.matchmaker.entity.Matchmaker; +import com.qniao.domain.BaseApplicationService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Collections; +import java.util.Objects; + +@Component +@Slf4j +public class VirtualAccountEventHandler extends BaseApplicationService { + + @Resource + private MatchmakerMarriageInformationQueryService matchmakerMarriageInformationQueryService; + @Resource + private MatchmakerDao matchmakerDao; + @Resource + private RewardConfigQueryService rewardConfigQueryService; + @Resource + private RevenueRewardQueryService revenueRewardQueryService; + @Resource + private WalletAccountQueryService walletAccountQueryService; + @Resource + private AcquireRevenueRewardDomainService acquireRevenueRewardDomainService; + + @Subscribe + private void handle(VirtualAccountCostGiftEvent event) { + try { + MatchmakerMarriageInformation marriageInformation = matchmakerMarriageInformationQueryService.queryByRecommend(event.getUserId()); + if (Objects.nonNull(marriageInformation)) { + BigDecimal pct = null; + Matchmaker matchmaker = matchmakerDao.selectById(marriageInformation.getMatchmakerId()); + if (ProductSubCategoryEnum.MATCHMAKER_FRANCHISE_FEE.equals(matchmaker.getType())) { + RewardConfig rewardConfig = rewardConfigQueryService.queryByRewardType(RewardTypeEnum.MATCHMAKER_PARTNER_RECOMMEND_COST_PCT); + pct = new BigDecimal(rewardConfig.getValue()); + } else if (ProductSubCategoryEnum.MATCHMAKER_ONLINE_FEE.equals(matchmaker.getType())) { + RewardConfig rewardConfig = rewardConfigQueryService.queryByRewardType(RewardTypeEnum.MATCHMAKER_ONLINE_RECOMMEND_COST_PCT); + pct = new BigDecimal(rewardConfig.getValue()); + } else if (ProductSubCategoryEnum.MATCHMAKER_TRAINEE_FEE.equals(matchmaker.getType())) { + RewardConfig rewardConfig = rewardConfigQueryService.queryByRewardType(RewardTypeEnum.MATCHMAKER_TRAINEE_RECOMMEND_COST_PCT); + pct = new BigDecimal(rewardConfig.getValue()); + } else if (ProductSubCategoryEnum.MATCHMAKER_FREE_FEE.equals(matchmaker.getType())) { + RewardConfig rewardConfig = rewardConfigQueryService.queryByRewardType(RewardTypeEnum.MATCHMAKER_FREE_RECOMMEND_COST_PCT); + pct = new BigDecimal(rewardConfig.getValue()); + } + if (Objects.nonNull(pct)) { + RewardConfig worthRewardConfig = rewardConfigQueryService.queryByRewardType(RewardTypeEnum.VIRTUAL_ACCOUNT_WORTH); + //收益信息 + RevenueReward revenueReward = revenueRewardQueryService.queryByUserId(matchmaker.getUserId()); + if (Objects.isNull(revenueReward)) { + revenueReward = RevenueReward.initUser(matchmaker.getUserId()); + } + //营收额 + BigDecimal revenue = new BigDecimal(worthRewardConfig.getValue()).multiply(BigDecimal.valueOf(event.getCostBalance())) + .multiply(pct).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + + RevenueRewardRecord revenueRewardRecord = RevenueRewardRecord.build(TradeTypeEnum.RECOMMEND_GIFT_REWARD, TradeSceneEnum.ONLINE, + revenue, BigDecimal.valueOf(100), BigDecimal.ZERO, revenue, BigDecimal.valueOf(event.getCostBalance())); + //todo + revenueRewardRecord.setContent("邀请分成"); + RevenueRewardAssociateOrderRecord associateOrderRecord = RevenueRewardAssociateOrderRecord.build(event.getOrderId(), BigDecimal.valueOf(event.getCostBalance())); + revenueRewardRecord.setAssociateOrderRecordList(Collections.singletonList(associateOrderRecord)); + + revenueReward.setRecordList(Collections.singletonList(revenueRewardRecord)); + //钱包 + WalletAccount walletAccount = walletAccountQueryService.queryByType(matchmaker.getUserId(), IdentityTypeEnum.INDIVIDUAL); + BigDecimal originalBalance = walletAccount.getTotalBalance(); + walletAccount.setAvailableBalance(walletAccount.getAvailableBalance().add(revenue)); + walletAccount.setTotalBalance(walletAccount.getAvailableBalance().add(walletAccount.getFrozenBalance())); + WalletAccountRecord walletAccountRecord = WalletAccountRecord.build(TradeTypeEnum.RECOMMEND_GIFT_REWARD, revenue, true, originalBalance, walletAccount.getTotalBalance()); + walletAccount.setRecordList(Collections.singletonList(walletAccountRecord)); + + acquireRevenueRewardDomainService.handle(revenueReward, walletAccount); + } + } + } catch (Exception e) { + log.error("花费送礼事件处理异常", e); + } + } + +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/withdrawaudit/WithdrawAuditEventHandler.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/withdrawaudit/WithdrawAuditEventHandler.java index b48749d..7bb3e50 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/withdrawaudit/WithdrawAuditEventHandler.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/withdrawaudit/WithdrawAuditEventHandler.java @@ -1,8 +1,7 @@ package com.qniao.dam.application.handler.withdrawaudit; import com.google.common.eventbus.Subscribe; -import com.qniao.dam.application.handler.walletaccount.WalletAccountApplicationService; -import com.qniao.dam.domain.aggregate.walletaccount.entity.WalletAccount; +import com.qniao.dam.application.service.walletaccount.WalletAccountApplicationService; import com.qniao.dam.domain.aggregate.withdrawaudit.entity.WithdrawAudit; import com.qniao.dam.domian.aggregate.withdrawaudit.constant.WithdrawAuditStatus; import com.qniao.dam.domian.aggregate.withdrawaudit.event.WithdrawAuditAuditedEvent; 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 c7b797a..73cd8f0 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 @@ -34,6 +34,8 @@ 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 com.qniao.domain.BaseApplicationService; +import com.qniao.domain.BaseDomainEvent; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -42,10 +44,11 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; import java.util.Collections; +import java.util.List; import java.util.Objects; @Service -public class VirtualAccountApplicationService { +public class VirtualAccountApplicationService extends BaseApplicationService { @Resource private VirtualAccountAggregate virtualAccountAggregate; @@ -189,7 +192,7 @@ public class VirtualAccountApplicationService { WalletAccountRecord walletAccountRecord = WalletAccountRecord.build(TradeTypeEnum.GIFT_REWARD, revenue, true, originalBalance, walletAccount.getTotalBalance()); walletAccount.setRecordList(Collections.singletonList(walletAccountRecord)); - costGiftRewardDomainService.handle(order, virtualAccount, revenueReward, walletAccount); + costGiftRewardDomainService.handle(order, virtualAccount, costBalance, revenueReward, walletAccount); vo.setSuccess(true); return vo; } @@ -274,8 +277,9 @@ public class VirtualAccountApplicationService { WalletAccountRecord anchorWalletAccountRecord = WalletAccountRecord.build(TradeTypeEnum.GIFT_REWARD, anchorRevenue, true, anchorOriginalBalance, anchorWalletAccount.getTotalBalance()); anchorWalletAccount.setRecordList(Collections.singletonList(anchorWalletAccountRecord)); - costGiftRewardDomainService.handle(order, virtualAccount, toRevenueReward, toWalletAccount, anchorRevenueReward, anchorWalletAccount); + List eventList = costGiftRewardDomainService.handle(order, virtualAccount, costBalance, toRevenueReward, toWalletAccount, anchorRevenueReward, anchorWalletAccount); vo.setSuccess(true); + this.sendEvent(eventList); return vo; } @@ -320,8 +324,9 @@ public class VirtualAccountApplicationService { WalletAccountRecord walletAccountRecord = WalletAccountRecord.build(TradeTypeEnum.GIFT_REWARD, revenue, true, originalBalance, walletAccount.getTotalBalance()); walletAccount.setRecordList(Collections.singletonList(walletAccountRecord)); - costGiftRewardDomainService.handle(order, virtualAccount, revenueReward, walletAccount); + List eventList = costGiftRewardDomainService.handle(order, virtualAccount, costBalance, revenueReward, walletAccount); vo.setSuccess(true); + this.sendEvent(eventList); return vo; } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/walletaccount/WalletAccountApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/walletaccount/WalletAccountApplicationService.java similarity index 98% rename from dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/walletaccount/WalletAccountApplicationService.java rename to dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/walletaccount/WalletAccountApplicationService.java index ff01529..46a85ea 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/walletaccount/WalletAccountApplicationService.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/walletaccount/WalletAccountApplicationService.java @@ -1,4 +1,4 @@ -package com.qniao.dam.application.handler.walletaccount; +package com.qniao.dam.application.service.walletaccount; import com.qniao.dam.api.command.walletaccount.user.request.UserAcquireRewardAmountDto; import com.qniao.dam.domain.aggregate.walletaccount.WalletAccountAggregate; diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/VirtualAccountAggregate.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/VirtualAccountAggregate.java index 9d828b5..302b448 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/VirtualAccountAggregate.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/VirtualAccountAggregate.java @@ -4,6 +4,8 @@ import com.qniao.dam.domain.aggregate.virtualaccount.entity.VirtualAccount; import com.qniao.dam.domain.aggregate.virtualaccount.repository.VirtualAccountRepository; import com.qniao.dam.domain.aggregate.virtualaccount.valobj.VirtualAccountRecord; import com.qniao.dam.domian.aggregate.virtualaccount.constant.VirtualAccountTradeTypeEnum; +import com.qniao.dam.domian.aggregate.virtualaccount.event.VirtualAccountCostGiftEvent; +import com.qniao.domain.BaseDomainEvent; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -28,6 +30,11 @@ public class VirtualAccountAggregate { repository.save(entity); } + public BaseDomainEvent costGift(VirtualAccount entity, Integer costBalance, Long orderId) { + repository.save(entity); + return new VirtualAccountCostGiftEvent(entity.getId(), entity.getUserId(), costBalance, orderId); + } + public void delete(Long id) { repository.delete(id); } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/CostGiftRewardDomainService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/CostGiftRewardDomainService.java index b1093ac..4315b95 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/CostGiftRewardDomainService.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/CostGiftRewardDomainService.java @@ -9,11 +9,15 @@ import com.qniao.dam.domain.aggregate.virtualaccount.VirtualAccountAggregate; import com.qniao.dam.domain.aggregate.virtualaccount.entity.VirtualAccount; import com.qniao.dam.domain.aggregate.walletaccount.WalletAccountAggregate; import com.qniao.dam.domain.aggregate.walletaccount.entity.WalletAccount; +import com.qniao.domain.BaseDomainEvent; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; +import java.util.Objects; @Service public class CostGiftRewardDomainService { @@ -28,42 +32,65 @@ public class CostGiftRewardDomainService { private WalletAccountAggregate walletAccountAggregate; @Transactional(rollbackFor = Exception.class) - public void handle(Order order, - VirtualAccount virtualAccount, - RevenueReward revenueReward, - WalletAccount walletAccount) { + public List handle(Order order, + VirtualAccount virtualAccount, + Integer costBalance, + RevenueReward revenueReward, + WalletAccount walletAccount) { + List eventList = new ArrayList<>(); + orderAggregate.complete(order); - virtualAccountAggregate.edit(virtualAccount); + eventList.add(virtualAccountAggregate.costGift(virtualAccount, costBalance,order.getId())); RevenueRewardAssociateOrderRecord associateOrderRecord = RevenueRewardAssociateOrderRecord.build(order.getId(), order.getSettlementAmount()); revenueReward.getRecordList().get(0).setAssociateOrderRecordList(Collections.singletonList(associateOrderRecord)); revenueRewardAggregate.save(revenueReward); - walletAccountAggregate.save(walletAccount); + if(Objects.nonNull(walletAccount)) { + walletAccount.getRecordList().forEach(record -> { + record.setAssociateId(revenueReward.getRecordList().get(0).getId()); + }); + walletAccountAggregate.save(walletAccount); + } + return eventList; } @Transactional(rollbackFor = Exception.class) - public void handle(Order order, - VirtualAccount virtualAccount, - RevenueReward toRevenueReward, - WalletAccount toWalletAccount, - RevenueReward anchorRevenueReward, - WalletAccount anchorWalletAccount) { + public List handle(Order order, + VirtualAccount virtualAccount, + Integer costBalance, + RevenueReward toRevenueReward, + WalletAccount toWalletAccount, + RevenueReward anchorRevenueReward, + WalletAccount anchorWalletAccount) { + List eventList = new ArrayList<>(); + orderAggregate.complete(order); - virtualAccountAggregate.edit(virtualAccount); + eventList.add(virtualAccountAggregate.costGift(virtualAccount, costBalance, order.getId())); RevenueRewardAssociateOrderRecord toAssociateOrderRecord = RevenueRewardAssociateOrderRecord.build(order.getId(), order.getSettlementAmount()); toRevenueReward.getRecordList().get(0).setAssociateOrderRecordList(Collections.singletonList(toAssociateOrderRecord)); revenueRewardAggregate.save(toRevenueReward); - walletAccountAggregate.save(toWalletAccount); + if(Objects.nonNull(toWalletAccount)) { + toWalletAccount.getRecordList().forEach(record -> { + record.setAssociateId(toRevenueReward.getRecordList().get(0).getId()); + }); + walletAccountAggregate.save(toWalletAccount); + } RevenueRewardAssociateOrderRecord anchorAssociateOrderRecord = RevenueRewardAssociateOrderRecord.build(order.getId(), order.getSettlementAmount()); anchorRevenueReward.getRecordList().get(0).setAssociateOrderRecordList(Collections.singletonList(anchorAssociateOrderRecord)); revenueRewardAggregate.save(anchorRevenueReward); - walletAccountAggregate.save(anchorWalletAccount); + if(Objects.nonNull(anchorWalletAccount)) { + anchorWalletAccount.getRecordList().forEach(record -> { + record.setAssociateId(anchorRevenueReward.getRecordList().get(0).getId()); + }); + walletAccountAggregate.save(anchorWalletAccount); + } + return eventList; } }