diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/order/constant/OrderTypeEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/order/constant/OrderTypeEnum.java index ad6264a..b9a9052 100644 --- a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/order/constant/OrderTypeEnum.java +++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/order/constant/OrderTypeEnum.java @@ -12,7 +12,9 @@ public enum OrderTypeEnum { NORMAL(1, "普通"), - MARRIAGE_BOUNTY(2, "悬赏招亲"); + MARRIAGE_BOUNTY(2, "悬赏招亲"), + + VIRTUAL_TYPE(3, "虚拟类型"); @EnumValue @JsonValue diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductMainCategoryEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductMainCategoryEnum.java index 0648f1c..1280516 100644 --- a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductMainCategoryEnum.java +++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductMainCategoryEnum.java @@ -25,7 +25,9 @@ public enum ProductMainCategoryEnum { VIRTUAL_CURRENCY(20, "虚拟货币"), - VIRTUAL_PROP(21, "虚拟道具"), + CHAT_FEE(21, "聊天"), + + VIRTUAL_PROP(22, "虚拟道具"), MATCHMAKER(888, "红娘合伙人"), diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductSubCategoryEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductSubCategoryEnum.java index 68e336e..6ec9740 100644 --- a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductSubCategoryEnum.java +++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductSubCategoryEnum.java @@ -46,6 +46,8 @@ public enum ProductSubCategoryEnum { VIRTUAL_CURRENCY(2001, "虚拟货币"), + CHAT_FEE(2101, "聊天费用"), + MATCHMAKER_FRANCHISE_FEE(88801, "高级红娘"), MATCHMAKER_ONLINE_FEE(88802, "线上红娘"), diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/valobj/VirtualAccountRecord.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/valobj/VirtualAccountRecord.java index dc53f37..8882f52 100644 --- a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/valobj/VirtualAccountRecord.java +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/valobj/VirtualAccountRecord.java @@ -31,6 +31,9 @@ public class VirtualAccountRecord extends ValueObject { @ApiModelProperty("当前数量") private Integer currentBalance; + @ApiModelProperty("关联ID") + private Long associateId; + @ApiModelProperty("备注") private String remark; diff --git a/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/request/UserConsumeVirtualAccountDto.java b/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/request/UserConsumeVirtualAccountDto.java index e4fa2b7..4059f43 100644 --- a/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/request/UserConsumeVirtualAccountDto.java +++ b/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/request/UserConsumeVirtualAccountDto.java @@ -12,8 +12,9 @@ public class UserConsumeVirtualAccountDto { private Long userId; - private Integer spend; + private Long productSpecId; private VirtualAccountTradeTypeEnum tradeType; + } diff --git a/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/response/ConsumeVirtualAccountVo.java b/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/response/ConsumeVirtualAccountVo.java index b8aea47..8bd6a47 100644 --- a/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/response/ConsumeVirtualAccountVo.java +++ b/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/response/ConsumeVirtualAccountVo.java @@ -7,4 +7,6 @@ public class ConsumeVirtualAccountVo { private Boolean success = false; + private String orderId; + } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserConsumeVirtualAccountDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserConsumeVirtualAccountDto.java index 026c8e6..9a5f787 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserConsumeVirtualAccountDto.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserConsumeVirtualAccountDto.java @@ -12,7 +12,7 @@ public class UserConsumeVirtualAccountDto { private Long userId; @NotNull - private Integer spend; + private Long productSpecId; @NotNull private VirtualAccountTradeTypeEnum tradeType; diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/response/UserConsumeVirtualAccountVo.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/response/UserConsumeVirtualAccountVo.java index da1c46c..2ec87bb 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/response/UserConsumeVirtualAccountVo.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/response/UserConsumeVirtualAccountVo.java @@ -7,4 +7,6 @@ public class UserConsumeVirtualAccountVo { private Boolean success = false; + private Long orderId; + } 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 e57de26..f1a2207 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 @@ -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; + } } \ No newline at end of file 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 9f7e145..da7d70f 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 @@ -2,9 +2,12 @@ package com.qniao.dam.domain.aggregate.virtualaccount; 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 org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.Collections; /** * 虚拟账号 @@ -28,4 +31,17 @@ public class VirtualAccountAggregate { public void delete(Long id) { repository.delete(id); } + + public void handleData(VirtualAccount virtualAccount, + Integer tradeBalance, + VirtualAccountTradeTypeEnum tradeType) { + Integer originalBalance = virtualAccount.getBalance(); + virtualAccount.setBalance(originalBalance - tradeBalance); + VirtualAccountRecord record = new VirtualAccountRecord(); + record.setTradeType(tradeType); + record.setTradeBalance(tradeBalance); + record.setOriginalBalance(originalBalance); + record.setCurrentBalance(virtualAccount.getBalance()); + virtualAccount.setRecordList(Collections.singletonList(record)); + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/ConsumeVirtualAccountDomainService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/ConsumeVirtualAccountDomainService.java new file mode 100644 index 0000000..053ca7e --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/ConsumeVirtualAccountDomainService.java @@ -0,0 +1,27 @@ +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.virtualaccount.VirtualAccountAggregate; +import com.qniao.dam.domain.aggregate.virtualaccount.entity.VirtualAccount; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +@Service +public class ConsumeVirtualAccountDomainService { + + @Resource + private VirtualAccountAggregate virtualAccountAggregate; + @Resource + private OrderAggregate orderAggregate; + + @Transactional(rollbackFor = Exception.class) + public void handle(VirtualAccount virtualAccount, Order order) { + orderAggregate.complete(order); + + virtualAccount.getRecordList().get(0).setAssociateId(order.getId()); + virtualAccountAggregate.edit(virtualAccount); + } +}