|
|
|
@ -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<RevenueRewardAssociateOrderRecord> 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; |
|
|
|
} |
|
|
|
|
|
|
|
} |