Browse Source

玫瑰

master
张彭杰 4 months ago
parent
commit
71594e3983
3 changed files with 82 additions and 37 deletions
  1. 2
      dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/walletaccount/constant/TradeTypeEnum.java
  2. 72
      dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/virtualaccount/VirtualAccountApplicationService.java
  3. 45
      dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/CostIMGiftRewardDomainService.java

2
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, "提现");

72
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<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;
}
}

45
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);
}
}
Loading…
Cancel
Save