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 c9502dd..bdfa821 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 @@ -32,6 +32,8 @@ public enum TradeTypeEnum { CHAT_REWARD(111, "聊天收益"), + GIFT_REWARD(112, "礼物收益"), + PLATFORM_SERVICE_FEE(201, "平台服务费"), WITHDRAW(202, "提现"); 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 bb585a8..7fb243c 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 @@ -1,7 +1,5 @@ package com.qniao.dam.application.service.virtualaccount; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Tuple; import com.qniao.dam.api.command.virtualaccount.user.request.UserConsumeVirtualAccountDto; import com.qniao.dam.api.command.virtualaccount.user.request.UserCostIMGiftDto; import com.qniao.dam.api.command.virtualaccount.user.response.CostIMGiftVo; @@ -18,12 +16,14 @@ import com.qniao.dam.domain.aggregate.virtualaccount.entity.VirtualAccount; import com.qniao.dam.domain.aggregate.walletaccount.entity.WalletAccount; import com.qniao.dam.domain.aggregate.walletaccount.valueobj.WalletAccountRecord; import com.qniao.dam.domain.service.virtualaccount.ConsumeVirtualAccountDomainService; +import com.qniao.dam.domain.service.virtualaccount.CostIMGiftRewardDomainService; import com.qniao.dam.domian.aggregate.order.constant.OrderBelongingEnum; import com.qniao.dam.domian.aggregate.order.constant.OrderStatusEnum; import com.qniao.dam.domian.aggregate.order.constant.OrderTypeEnum; import com.qniao.dam.domian.aggregate.virtualaccount.constant.VirtualAccountTradeTypeEnum; 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.ProductDao; import com.qniao.dam.infrastructure.persistent.dao.domain.ProductSpecDao; import com.qniao.dam.infrastructure.utils.SnowFlakeUtil; @@ -31,13 +31,12 @@ import com.qniao.dam.query.revenuereward.RevenueRewardQueryService; import com.qniao.dam.query.virtualaccount.VirtualAccountQueryService; import com.qniao.dam.query.walletaccount.WalletAccountQueryService; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.Collections; -import java.util.List; import java.util.Objects; @Service @@ -59,6 +58,8 @@ public class VirtualAccountApplicationService { private SnowFlakeUtil snowFlakeUtil; @Resource private ConsumeVirtualAccountDomainService consumeVirtualAccountDomainService; + @Resource + private CostIMGiftRewardDomainService costIMGiftRewardDomainService; public void create(VirtualAccount virtualAccount) { virtualAccountAggregate.create(virtualAccount); @@ -138,53 +139,50 @@ public class VirtualAccountApplicationService { ProductSpec productSpec = productSpecDao.selectById(dto.getProductSpecId()); Integer costBalance = productSpec.getUnitSellingPrice().intValue() * dto.getQuantity(); if (virtualAccount != null && virtualAccount.getBalance() >= costBalance) { - //余额充足 创建消费订单+扣除余额 - Order order = handleOrder(dto.getFromUserId(), productSpec, dto.getQuantity()); - //虚拟账户处理 - virtualAccountAggregate.handleConsumeData(virtualAccount, order.getSettlementAmount().intValue(), VirtualAccountTradeTypeEnum.GIFT); - //奖励处理 - Tuple tuple = handleIMGiftReward(dto.getToUserId(), costBalance); - //保存 - consumeVirtualAccountDomainService.handle(virtualAccount, order); - vo.setFlag(true); + vo = handleIMGiftReward(virtualAccount, dto.getFromUserId(), dto.getToUserId(), productSpec, costBalance, dto.getQuantity()); } } return vo; } - private Tuple handleIMGiftReward(Long userId, Integer costBalance) { + @Transactional(rollbackFor = Exception.class) + public CostIMGiftVo handleIMGiftReward(VirtualAccount virtualAccount, + Long fromUserId, + Long toUserId, + ProductSpec productSpec, + Integer costBalance, + Integer quantity) { + CostIMGiftVo vo = new CostIMGiftVo(); + //余额充足 创建消费订单+扣除余额 + Order order = handleOrder(fromUserId, productSpec, quantity); + //虚拟账户处理 + virtualAccountAggregate.handleConsumeData(virtualAccount, order.getSettlementAmount().intValue(), VirtualAccountTradeTypeEnum.GIFT); + //收益信息 - RevenueReward revenueReward = revenueRewardQueryService.queryByUserId(userId); + RevenueReward revenueReward = revenueRewardQueryService.queryByUserId(toUserId); if (Objects.isNull(revenueReward)) { - revenueReward = RevenueReward.initUser(userId); + revenueReward = RevenueReward.initUser(toUserId); } //营收额 - BigDecimal revenue = dto.getReceivedAmount(); - //服务费用 - serviceFee = serviceFeeRewardConfig.calculateReward(revenue); - BigDecimal earnings = revenue.subtract(serviceFee); - RevenueRewardRecord revenueRewardRecord = RevenueRewardRecord.build(tradeType, TradeSceneEnum.ONLINE, - revenue, BigDecimal.valueOf(100), new BigDecimal(serviceFeeRewardConfig.getValue()), earnings, dto.getTotalAssociateOrderAmount()); - revenueRewardRecord.handleContent(Collections.singletonList(meetingMi.getNickName())); - if (CollUtil.isNotEmpty(dto.getOrderIdRelList())) { - List associateOrderRecordList = new ArrayList<>(); - for (Long associateOrderId : dto.getOrderIdRelList()) { - Order associateOrder = orderDao.selectById(associateOrderId); - RevenueRewardAssociateOrderRecord associateOrderRecord = RevenueRewardAssociateOrderRecord.build(associateOrder.getId(), associateOrder.getSettlementAmount()); - revenueRewardRecord.setAssociateOrderRecordList(Collections.singletonList(associateOrderRecord)); - associateOrderRecordList.add(associateOrderRecord); - } - revenueRewardRecord.setAssociateOrderRecordList(associateOrderRecordList); - } + BigDecimal revenue = BigDecimal.valueOf(costBalance).multiply(BigDecimal.valueOf(0.1428)).multiply(BigDecimal.valueOf(0.4)); + + RevenueRewardRecord revenueRewardRecord = RevenueRewardRecord.build(TradeTypeEnum.GIFT_REWARD, TradeSceneEnum.ONLINE, + revenue, BigDecimal.valueOf(100), BigDecimal.ZERO, revenue, BigDecimal.valueOf(costBalance)); + //todo + revenueRewardRecord.setContent("一对一礼物"); + revenueReward.setRecordList(Collections.singletonList(revenueRewardRecord)); //钱包 - WalletAccount walletAccount = walletAccountQueryService.queryByType(dto.getReceiver(), IdentityTypeEnum.INDIVIDUAL); + WalletAccount walletAccount = walletAccountQueryService.queryByType(toUserId, IdentityTypeEnum.INDIVIDUAL); BigDecimal originalBalance = walletAccount.getTotalBalance(); - walletAccount.setAvailableBalance(walletAccount.getAvailableBalance().add(earnings)); + walletAccount.setAvailableBalance(walletAccount.getAvailableBalance().add(revenue)); walletAccount.setTotalBalance(walletAccount.getAvailableBalance().add(walletAccount.getFrozenBalance())); - WalletAccountRecord walletAccountRecord = WalletAccountRecord.build(tradeType, earnings, true, originalBalance, walletAccount.getTotalBalance()); + WalletAccountRecord walletAccountRecord = WalletAccountRecord.build(TradeTypeEnum.GIFT_REWARD, revenue, true, originalBalance, walletAccount.getTotalBalance()); walletAccount.setRecordList(Collections.singletonList(walletAccountRecord)); - acquireRevenueRewardDomainService.handle(revenueReward, walletAccount); + + costIMGiftRewardDomainService.handle(order, virtualAccount, revenueReward, walletAccount); + vo.setFlag(true); + return vo; } } \ No newline at end of file diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/CostIMGiftRewardDomainService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/CostIMGiftRewardDomainService.java new file mode 100644 index 0000000..9ba77fc --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/CostIMGiftRewardDomainService.java @@ -0,0 +1,45 @@ +package com.qniao.dam.domain.service.virtualaccount; + +import com.qniao.dam.domain.aggregate.order.OrderAggregate; +import com.qniao.dam.domain.aggregate.order.entity.Order; +import com.qniao.dam.domain.aggregate.revenuereward.RevenueRewardAggregate; +import com.qniao.dam.domain.aggregate.revenuereward.entity.RevenueReward; +import com.qniao.dam.domain.aggregate.revenuereward.valueobj.RevenueRewardAssociateOrderRecord; +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 org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Collections; + +@Service +public class CostIMGiftRewardDomainService { + + @Resource + private OrderAggregate orderAggregate; + @Resource + private VirtualAccountAggregate virtualAccountAggregate; + @Resource + private RevenueRewardAggregate revenueRewardAggregate; + @Resource + private WalletAccountAggregate walletAccountAggregate; + + @Transactional(rollbackFor = Exception.class) + public void handle(Order order, + VirtualAccount virtualAccount, + RevenueReward revenueReward, + WalletAccount walletAccount) { + orderAggregate.complete(order); + + virtualAccountAggregate.edit(virtualAccount); + + RevenueRewardAssociateOrderRecord associateOrderRecord = RevenueRewardAssociateOrderRecord.build(order.getId(), order.getSettlementAmount()); + revenueReward.getRecordList().get(0).setAssociateOrderRecordList(Collections.singletonList(associateOrderRecord)); + revenueRewardAggregate.save(revenueReward); + + walletAccountAggregate.save(walletAccount); + } +}