|
|
|
@ -2,12 +2,26 @@ package com.qniao.dam.application.service.virtualaccount; |
|
|
|
|
|
|
|
import com.qniao.dam.api.command.virtualaccount.user.request.UserConsumeVirtualAccountDto; |
|
|
|
import com.qniao.dam.api.command.virtualaccount.user.response.UserConsumeVirtualAccountVo; |
|
|
|
import com.qniao.dam.domain.aggregate.order.entity.Order; |
|
|
|
import com.qniao.dam.domain.aggregate.order.entity.OrderItem; |
|
|
|
import com.qniao.dam.domain.aggregate.product.entity.Product; |
|
|
|
import com.qniao.dam.domain.aggregate.productspec.entity.ProductSpec; |
|
|
|
import com.qniao.dam.domain.aggregate.virtualaccount.VirtualAccountAggregate; |
|
|
|
import com.qniao.dam.domain.aggregate.virtualaccount.entity.VirtualAccount; |
|
|
|
import com.qniao.dam.domain.service.virtualaccount.ConsumeVirtualAccountDomainService; |
|
|
|
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.infrastructure.persistent.dao.domain.OrderDao; |
|
|
|
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; |
|
|
|
import com.qniao.dam.query.virtualaccount.VirtualAccountQueryService; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
import javax.annotation.Resource; |
|
|
|
import java.time.LocalDateTime; |
|
|
|
import java.util.Collections; |
|
|
|
|
|
|
|
@Service |
|
|
|
public class VirtualAccountApplicationService { |
|
|
|
@ -16,6 +30,14 @@ public class VirtualAccountApplicationService { |
|
|
|
private VirtualAccountAggregate virtualAccountAggregate; |
|
|
|
@Resource |
|
|
|
private VirtualAccountQueryService virtualAccountQueryService; |
|
|
|
@Resource |
|
|
|
private ProductDao productDao; |
|
|
|
@Resource |
|
|
|
private ProductSpecDao productSpecDao; |
|
|
|
@Resource |
|
|
|
private SnowFlakeUtil snowFlakeUtil; |
|
|
|
@Resource |
|
|
|
private ConsumeVirtualAccountDomainService consumeVirtualAccountDomainService; |
|
|
|
|
|
|
|
public void create(VirtualAccount virtualAccount) { |
|
|
|
virtualAccountAggregate.create(virtualAccount); |
|
|
|
@ -33,13 +55,49 @@ public class VirtualAccountApplicationService { |
|
|
|
UserConsumeVirtualAccountVo vo = new UserConsumeVirtualAccountVo(); |
|
|
|
synchronized (dto.getUserId().toString().intern()) { |
|
|
|
VirtualAccount virtualAccount = virtualAccountQueryService.queryBy(dto.getUserId()); |
|
|
|
|
|
|
|
if (virtualAccount != null && virtualAccount.getBalance() >= dto.getSpend()) { |
|
|
|
//找到对应产品 |
|
|
|
ProductSpec productSpec = productSpecDao.selectById(dto.getProductSpecId()); |
|
|
|
if (virtualAccount != null && virtualAccount.getBalance() >= productSpec.getUnitSellingPrice().intValue()) { |
|
|
|
//余额充足 创建消费订单+扣除余额 |
|
|
|
|
|
|
|
Order order = handleOrder(dto.getUserId(), productSpec); |
|
|
|
//虚拟账户处理 |
|
|
|
virtualAccountAggregate.handleData(virtualAccount, order.getSettlementAmount().intValue(), dto.getTradeType()); |
|
|
|
//保存 |
|
|
|
consumeVirtualAccountDomainService.handle(virtualAccount, order); |
|
|
|
vo.setSuccess(true); |
|
|
|
vo.setOrderId(order.getId()); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
return vo; |
|
|
|
} |
|
|
|
|
|
|
|
private Order handleOrder(Long userId, ProductSpec productSpec) { |
|
|
|
Product product = productDao.selectById(productSpec.getProductId()); |
|
|
|
Order order = new Order(); |
|
|
|
order.setUserId(userId); |
|
|
|
order.setOrderBelonging(OrderBelongingEnum.CUSTOMER); |
|
|
|
order.setName(product.getProductTitle()); |
|
|
|
order.setOrderType(OrderTypeEnum.VIRTUAL_TYPE); |
|
|
|
order.setOrderCode(snowFlakeUtil.getSnowflakeOrderCode()); |
|
|
|
order.setOriginalAmount(productSpec.getUnitSellingPrice()); |
|
|
|
order.setSettlementAmount(productSpec.getUnitSellingPrice()); |
|
|
|
order.setPaidTime(LocalDateTime.now()); |
|
|
|
order.setStatus(OrderStatusEnum.COMPLETED); |
|
|
|
|
|
|
|
OrderItem orderItem = new OrderItem(); |
|
|
|
orderItem.setProductId(product.getId()); |
|
|
|
orderItem.setProductSpecId(productSpec.getId()); |
|
|
|
orderItem.setProductType(product.getProductType()); |
|
|
|
orderItem.setMainCategory(product.getMainCategory()); |
|
|
|
orderItem.setSubCategory(product.getSubCategory()); |
|
|
|
orderItem.setProductTitle(product.getProductTitle()); |
|
|
|
orderItem.setProductDesc(product.getProductDesc()); |
|
|
|
orderItem.setUnitOriginalPrice(productSpec.getUnitSellingPrice()); |
|
|
|
orderItem.setUnitSettlementPrice(productSpec.getUnitSellingPrice()); |
|
|
|
orderItem.setQuantity(1); |
|
|
|
orderItem.setOriginalAmount(productSpec.getUnitSellingPrice()); |
|
|
|
orderItem.setSettlementAmount(productSpec.getUnitSellingPrice()); |
|
|
|
order.setOrderItemList(Collections.singletonList(orderItem)); |
|
|
|
return order; |
|
|
|
} |
|
|
|
} |