From 0f28119fab318dc904f18843cdcc867327302795 Mon Sep 17 00:00:00 2001 From: Derran Date: Mon, 20 May 2024 16:01:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E7=A1=80=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../valueobj/ExternalOrderRel.java | 26 ++++++++++ .../domain/aggregate/order/entity/Order.java | 14 ++++++ .../aggregate/order/entity/OrderItem.java | 19 ++++++++ .../user/OrderUserCommandController.java | 8 ++++ .../UserSubmitSiteActivityOrderDto.java | 21 +++++++++ .../order/OrderApplicationService.java | 47 ++++++++++++++++--- .../SubmitSiteActivityOrderDomainService.java | 32 +++++++++++++ .../dao/domain/ExternalOrderRelDao.java | 7 +++ .../dao/domain/SiteActivityDao.java | 7 +++ .../query/product/ProductQueryService.java | 2 + .../product/impl/ProductQueryServiceImpl.java | 22 +++++++++ 11 files changed, 199 insertions(+), 6 deletions(-) create mode 100644 dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/externalorder/valueobj/ExternalOrderRel.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/order/user/request/UserSubmitSiteActivityOrderDto.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/order/SubmitSiteActivityOrderDomainService.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ExternalOrderRelDao.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/SiteActivityDao.java diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/externalorder/valueobj/ExternalOrderRel.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/externalorder/valueobj/ExternalOrderRel.java new file mode 100644 index 0000000..d4c3eaf --- /dev/null +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/externalorder/valueobj/ExternalOrderRel.java @@ -0,0 +1,26 @@ +package com.qniao.dam.domain.aggregate.externalorder.valueobj; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.qniao.domain.ValueObject; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("da_external_order_rel") +public class ExternalOrderRel extends ValueObject { + + @ApiModelProperty("外部标识") + private Long externalId; + + @ApiModelProperty("订单标识") + private Long orderId; + + public static ExternalOrderRel build(Long externalId, Long orderId) { + ExternalOrderRel rel = new ExternalOrderRel(); + rel.setExternalId(externalId); + rel.setOrderId(orderId); + return rel; + } +} diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/order/entity/Order.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/order/entity/Order.java index acc29c3..00e37df 100644 --- a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/order/entity/Order.java +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/order/entity/Order.java @@ -59,4 +59,18 @@ public class Order extends Entity { } return orderBelonging; } + + public static Order build(Long userId, + Long miId, + OrderBelongingEnum orderBelonging, + String orderBelongName, + OrderTypeEnum orderType) { + Order order = new Order(); + order.setUserId(userId); + order.setMiId(miId); + order.setOrderBelonging(orderBelonging); + order.setOrderBelongName(orderBelongName); + order.setOrderType(orderType); + return order; + } } diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/order/entity/OrderItem.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/order/entity/OrderItem.java index b000652..6cbedbd 100644 --- a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/order/entity/OrderItem.java +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/order/entity/OrderItem.java @@ -49,4 +49,23 @@ public class OrderItem extends Entity { @ApiModelProperty("结算金额") private BigDecimal settlementAmount; + public static OrderItem build(Long productId, + Long productSpecId, + ProductTypeEnum productType, + ProductMainCategoryEnum mainCategory, + ProductSubCategoryEnum subCategory, + String productTitle, + BigDecimal unitSettlementPrice, + Integer quantity) { + OrderItem orderItem = new OrderItem(); + orderItem.setProductId(productId); + orderItem.setProductSpecId(productSpecId); + orderItem.setProductType(productType); + orderItem.setMainCategory(mainCategory); + orderItem.setSubCategory(subCategory); + orderItem.setProductTitle(productTitle); + orderItem.setUnitSettlementPrice(unitSettlementPrice); + orderItem.setQuantity(quantity); + return orderItem; + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/order/user/OrderUserCommandController.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/order/user/OrderUserCommandController.java index 55366e8..42e200f 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/order/user/OrderUserCommandController.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/order/user/OrderUserCommandController.java @@ -3,6 +3,7 @@ package com.qniao.dam.api.command.order.user; import com.qniao.dam.api.command.order.user.request.UserBatchSubmitOrderDto; import com.qniao.dam.api.command.order.user.request.UserSubmitMarriageBountyOrderDto; import com.qniao.dam.api.command.order.user.request.UserSubmitOrderDto; +import com.qniao.dam.api.command.order.user.request.UserSubmitSiteActivityOrderDto; import com.qniao.dam.api.command.order.user.response.UserSubmitOrderVo; import com.qniao.dam.application.service.order.OrderApplicationService; import com.qniao.dam.domain.aggregate.order.entity.Order; @@ -51,4 +52,11 @@ public class OrderUserCommandController { productList.forEach(product -> product.setUserId(userId)); return orderApplicationService.submitMarriageBountyOrder(order, productList); } + + @ApiOperation("用户提交线下活动订单") + @PostMapping("submit/site-activity-order") + public UserSubmitOrderVo userSubmitSiteActivityOrder(@RequestBody @Valid UserSubmitSiteActivityOrderDto dto, + @RequestParam("userId") Long userId) { + return orderApplicationService.submitSiteActivityOrder(dto, userId); + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/order/user/request/UserSubmitSiteActivityOrderDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/order/user/request/UserSubmitSiteActivityOrderDto.java new file mode 100644 index 0000000..b3d4096 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/order/user/request/UserSubmitSiteActivityOrderDto.java @@ -0,0 +1,21 @@ +package com.qniao.dam.api.command.order.user.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +public class UserSubmitSiteActivityOrderDto { + + @ApiModelProperty("活动标识") + @NotNull + private Long siteActivityId; + + @ApiModelProperty("征婚资料标识") + @NotNull + private Long miId; + + @ApiModelProperty("是否开通会员") + private Boolean openVip = false; +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/order/OrderApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/order/OrderApplicationService.java index 4806581..9ab9abd 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/order/OrderApplicationService.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/order/OrderApplicationService.java @@ -1,8 +1,8 @@ package com.qniao.dam.application.service.order; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Tuple; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.qniao.dam.api.command.order.user.request.UserSubmitSiteActivityOrderDto; import com.qniao.dam.api.command.order.user.response.UserSubmitOrderVo; import com.qniao.dam.application.service.product.ProductApplicationService; import com.qniao.dam.domain.aggregate.activity.entity.ActivityProduct; @@ -16,6 +16,7 @@ import com.qniao.dam.domain.aggregate.product.repository.ProductRepository; import com.qniao.dam.domain.aggregate.productspec.entity.ProductSpec; import com.qniao.dam.domain.aggregate.productspec.repository.ProductSpecRepository; import com.qniao.dam.domain.service.order.SubmitOrderDomainService; +import com.qniao.dam.domain.service.order.SubmitSiteActivityOrderDomainService; import com.qniao.dam.domian.aggregate.marriagebount.constant.MarriageBountyOrderPaymentStatusEnum; import com.qniao.dam.domian.aggregate.marriagebount.constant.MarriageBountyOrderStatusEnum; import com.qniao.dam.domian.aggregate.order.constant.OrderBelongingEnum; @@ -23,15 +24,17 @@ import com.qniao.dam.domian.aggregate.order.constant.OrderTypeEnum; import com.qniao.dam.domian.aggregate.product.constant.ProductSubCategoryEnum; import com.qniao.dam.domian.aggregate.product.constant.ProductTypeEnum; import com.qniao.dam.infrastructure.persistent.dao.activity.ActivityProductDao; -import com.qniao.dam.infrastructure.persistent.dao.domain.MarriageBountyOrderDao; import com.qniao.dam.infrastructure.persistent.dao.domain.MarriageInformationDao; -import com.qniao.dam.infrastructure.utils.CompareEntityUtil; +import com.qniao.dam.infrastructure.persistent.dao.domain.SiteActivityDao; import com.qniao.dam.infrastructure.utils.SnowFlakeUtil; import com.qniao.dam.query.marriagebounty.MarriageBountyOrderQueryService; import com.qniao.dam.query.matchmaker.MatchmakerQueryService; import com.qniao.dam.query.order.OrderQueryService; import com.qniao.dam.query.product.ProductQueryService; +import com.qniao.dam.query.right.RightQueryService; import com.qniao.das.domian.aggregate.marriageinformation.MarriageInformation; +import com.qniao.das.domian.aggregate.marriageinformation.constant.GenderEnum; +import com.qniao.das.domian.aggregate.siteactivity.SiteActivity; import com.qniao.dau.domain.aggregate.matchmaker.entity.Matchmaker; import com.qniao.framework.exception.BizException; import org.springframework.beans.factory.annotation.Value; @@ -40,11 +43,9 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.Objects; -import java.util.function.Function; -import java.util.stream.Collectors; @Service public class OrderApplicationService { @@ -52,6 +53,8 @@ public class OrderApplicationService { @Resource private SubmitOrderDomainService submitOrderDomainService; @Resource + private SubmitSiteActivityOrderDomainService submitSiteActivityOrderDomainService; + @Resource private ProductSpecRepository productSpecRepository; @Resource private ProductRepository productRepository; @@ -71,6 +74,10 @@ public class OrderApplicationService { private ProductApplicationService productApplicationService; @Resource private MarriageBountyOrderQueryService marriageBountyOrderQueryService; + @Resource + private SiteActivityDao siteActivityDao; + @Resource + private RightQueryService rightQueryService; @Value("${marriage_bounty_meeting_quantity:5}") private Integer marriageBountyMeetingQuantity; @@ -252,4 +259,32 @@ public class OrderApplicationService { } } } + + public UserSubmitOrderVo submitSiteActivityOrder(UserSubmitSiteActivityOrderDto dto, Long userId) { + MarriageInformation marriageInformation = marriageInformationDao.selectById(dto.getMiId()); + Product product = productQueryService.querySiteActivityBy(dto.getSiteActivityId(), marriageInformation.getGenderCode()); + SiteActivity siteActivity = siteActivityDao.selectById(dto.getSiteActivityId()); + Order order = Order.build(userId, dto.getMiId(), OrderBelongingEnum.CUSTOMER, marriageInformation.getNickName(), OrderTypeEnum.NORMAL); + PaymentOrder paymentOrder = null; + if (dto.getOpenVip()) { + //开通会员送活动 + + } else { + //是否vip + boolean vip = rightQueryService.checkUserVipRight(userId, dto.getMiId()).getVip(); + //报名参加活动 + ProductSpec productSpec = product.getProductSpecList().get(0); + OrderItem orderItem = OrderItem.build(productSpec.getProductId(), productSpec.getId(), product.getProductType(), product.getMainCategory(), product.getSubCategory(), + product.getProductTitle(), siteActivity.calculateFee(GenderEnum.get(marriageInformation.getGenderCode()), vip), 1); + order.setOrderItemList(Collections.singletonList(orderItem)); + //2. 订单金额计算 + countOrderAmount(order); + //3. 设置订单号 + order.setOrderCode(snowFlakeUtil.getSnowflakeOrderCode()); + //4. 组织付款单信息 + paymentOrder = makePaymentOrder(order); + submitSiteActivityOrderDomainService.handle(order, paymentOrder, dto.getSiteActivityId()); + } + return new UserSubmitOrderVo(order.getId(), paymentOrder.getId()); + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/order/SubmitSiteActivityOrderDomainService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/order/SubmitSiteActivityOrderDomainService.java new file mode 100644 index 0000000..9b464b0 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/order/SubmitSiteActivityOrderDomainService.java @@ -0,0 +1,32 @@ +package com.qniao.dam.domain.service.order; + +import com.qniao.dam.domain.aggregate.externalorder.valueobj.ExternalOrderRel; +import com.qniao.dam.domain.aggregate.order.OrderAggregate; +import com.qniao.dam.domain.aggregate.order.entity.Order; +import com.qniao.dam.domain.aggregate.paymentorder.PaymentOrderAggregate; +import com.qniao.dam.domain.aggregate.paymentorder.entity.PaymentOrder; +import com.qniao.dam.infrastructure.persistent.dao.domain.ExternalOrderRelDao; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +@Service +public class SubmitSiteActivityOrderDomainService { + + @Resource + private OrderAggregate orderAggregate; + @Resource + private PaymentOrderAggregate paymentOrderAggregate; + @Resource + private ExternalOrderRelDao externalOrderRelDao; + + @Transactional(rollbackFor = Exception.class) + public void handle(Order order, PaymentOrder paymentOrder, Long siteActivityId) { + orderAggregate.submit(order); + paymentOrder.setOrderId(order.getId()); + paymentOrderAggregate.create(paymentOrder); + ExternalOrderRel externalOrderRel = ExternalOrderRel.build(siteActivityId, order.getId()); + externalOrderRelDao.insert(externalOrderRel); + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ExternalOrderRelDao.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ExternalOrderRelDao.java new file mode 100644 index 0000000..e2c595f --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ExternalOrderRelDao.java @@ -0,0 +1,7 @@ +package com.qniao.dam.infrastructure.persistent.dao.domain; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qniao.dam.domain.aggregate.externalorder.valueobj.ExternalOrderRel; + +public interface ExternalOrderRelDao extends BaseMapper { +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/SiteActivityDao.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/SiteActivityDao.java new file mode 100644 index 0000000..76e3835 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/SiteActivityDao.java @@ -0,0 +1,7 @@ +package com.qniao.dam.infrastructure.persistent.dao.domain; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qniao.das.domian.aggregate.siteactivity.SiteActivity; + +public interface SiteActivityDao extends BaseMapper { +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/product/ProductQueryService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/product/ProductQueryService.java index b8ad781..8d90ddd 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/product/ProductQueryService.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/product/ProductQueryService.java @@ -33,4 +33,6 @@ public interface ProductQueryService { List listProductSpecBy(Long productId); UserGetMatchmakerFranchiseInfoVo getMatchmakerFranchiseInfo(); + + Product querySiteActivityBy(Long siteActivityId, Integer genderCode); } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/product/impl/ProductQueryServiceImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/product/impl/ProductQueryServiceImpl.java index ed86aed..5321108 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/product/impl/ProductQueryServiceImpl.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/product/impl/ProductQueryServiceImpl.java @@ -7,6 +7,7 @@ import com.qniao.dam.api.query.product.user.request.UserPageProductByCustomerQue import com.qniao.dam.api.query.product.user.request.UserPageProductByMatchmakerQueryParam; import com.qniao.dam.api.query.product.user.request.UserPageProductByOperatorQueryParam; import com.qniao.dam.api.query.product.user.response.*; +import com.qniao.dam.domain.aggregate.externalproduct.valueobj.ExternalProductRel; import com.qniao.dam.domain.aggregate.product.entity.Product; import com.qniao.dam.domain.aggregate.productspec.entity.ProductSpec; import com.qniao.dam.domain.aggregate.productspec.valueobj.ProductSpecTerm; @@ -14,11 +15,13 @@ import com.qniao.dam.domian.aggregate.product.constant.ProductSubCategoryEnum; import com.qniao.dam.domian.aggregate.product.constant.ProductTypeEnum; import com.qniao.dam.domian.aggregate.productspec.constant.ProductSpecTermNameEnum; import com.qniao.dam.domian.aggregate.productspec.constant.ProductSpecTermUnitEnum; +import com.qniao.dam.infrastructure.persistent.dao.domain.ExternalProductRelDao; import com.qniao.dam.infrastructure.persistent.dao.domain.ProductDao; import com.qniao.dam.infrastructure.persistent.dao.domain.ProductSpecDao; import com.qniao.dam.infrastructure.persistent.dao.domain.ProductSpecTermDao; import com.qniao.dam.infrastructure.persistent.dao.view.ProductViewDao; import com.qniao.dam.query.product.ProductQueryService; +import com.qniao.das.domian.aggregate.marriageinformation.constant.GenderEnum; import com.qniao.framework.utils.PageUtil; import com.qniao.framework.utils.TypeConvertUtils; import org.checkerframework.checker.units.qual.A; @@ -43,6 +46,8 @@ public class ProductQueryServiceImpl implements ProductQueryService { @Resource private ProductSpecDao productSpecDao; @Resource + private ExternalProductRelDao externalProductRelDao; + @Resource private ProductSpecTermDao productSpecTermDao; @Value("${service-phone}") private String servicePhone; @@ -127,6 +132,23 @@ public class ProductQueryServiceImpl implements ProductQueryService { return infoVo; } + @Override + public Product querySiteActivityBy(Long externalId, Integer genderCode) { + List externalProductRelList = externalProductRelDao.selectList(new LambdaQueryWrapper() + .eq(ExternalProductRel::getExternalId, externalId)); + Product siteActivityProduct = null; + for (ExternalProductRel externalProductRel : externalProductRelList) { + Product product = productDao.selectById(externalProductRel.getProductId()); + product.setProductSpecList(listProductSpecBy(product.getId())); + if ((GenderEnum.MAN.getValue().equals(genderCode) && ProductSubCategoryEnum.SITE_ACTIVITY_MAN_FEE.equals(product.getSubCategory())) || + (GenderEnum.WOMAN.getValue().equals(genderCode) && ProductSubCategoryEnum.MARRIAGE_BOUNTY_WOMAN_FEE.equals(product.getSubCategory()))) { + siteActivityProduct = product; + break; + } + } + return siteActivityProduct; + } + @Override public ProductSpecTerm getTermByName(List productSpecTermList, ProductSpecTermNameEnum name) { ProductSpecTerm productSpecTerm = null;