From e7a47dda836d81b5e7da0b457d876a2485a188a6 Mon Sep 17 00:00:00 2001 From: Derran Date: Mon, 18 Mar 2024 19:39:43 +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 --- .../right/constant/RightNameEnum.java | 38 ++++++ .../right/constant/RightTypeEnum.java | 42 +++++++ .../right/constant/RightUnitEnum.java | 34 ++++++ .../domain/aggregate/right/entity/Right.java | 38 ++++++ .../aggregate/right/entity/RightTerm.java | 40 +++++++ .../order/event/OrderCompletedEvent.java | 16 +++ .../event/PaymentChannelOrderPaidEvent.java | 2 - .../event/PaymentOrderPaidEvent.java | 25 ++++ .../handler/order/OrderEventHandler.java | 77 ++++++++++++ .../PaymentChannelOrderEventHandler.java | 46 +++++++ .../PaymentOrderEventHandler.java | 43 +++++++ .../right/RightApplicationService.java | 112 ++++++++++++++++++ .../aggregate/order/OrderAggregate.java | 8 ++ .../paymentorder/PaymentOrderAggregate.java | 20 ++++ .../aggregate/right/RightAggregate.java | 18 +++ .../right/repository/RightRepository.java | 7 ++ .../persistent/dao/domain/RightDao.java | 7 ++ .../persistent/dao/domain/RightTermDao.java | 7 ++ .../repository/impl/RightRepositoryImpl.java | 41 +++++++ .../dam/query/right/RightQueryService.java | 10 ++ .../right/impl/RightQueryServiceImpl.java | 28 +++++ 21 files changed, 657 insertions(+), 2 deletions(-) create mode 100644 dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/right/constant/RightNameEnum.java create mode 100644 dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/right/constant/RightTypeEnum.java create mode 100644 dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/right/constant/RightUnitEnum.java create mode 100644 dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/right/entity/Right.java create mode 100644 dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/right/entity/RightTerm.java create mode 100644 dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/order/event/OrderCompletedEvent.java create mode 100644 dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/paymentorder/event/PaymentOrderPaidEvent.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/order/OrderEventHandler.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/paymentchannelorder/PaymentChannelOrderEventHandler.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/paymentorder/PaymentOrderEventHandler.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/right/RightApplicationService.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/right/RightAggregate.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/right/repository/RightRepository.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/RightDao.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/RightTermDao.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/RightRepositoryImpl.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/query/right/RightQueryService.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/query/right/impl/RightQueryServiceImpl.java diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/right/constant/RightNameEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/right/constant/RightNameEnum.java new file mode 100644 index 0000000..288c442 --- /dev/null +++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/right/constant/RightNameEnum.java @@ -0,0 +1,38 @@ +package com.qniao.dam.domian.aggregate.right.constant; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.Getter; + +@Getter +@JsonFormat(shape = JsonFormat.Shape.OBJECT) +public enum RightNameEnum { + + RIGHT_LIMIT(1, "权益上限额度"), + + RIGHT_COUNT(2, "权益剩余额度"), + + DAILY_USE_LIMIT(3, "单日使用上限"); + + @EnumValue + @JsonValue + private final Integer value; + private final String desc; + + RightNameEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + @JsonCreator + public static RightNameEnum get(Object code) { + for (RightNameEnum e : RightNameEnum.values()) { + if (e.getValue().equals(code)) { + return e; + } + } + return null; + } +} \ No newline at end of file diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/right/constant/RightTypeEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/right/constant/RightTypeEnum.java new file mode 100644 index 0000000..211ef87 --- /dev/null +++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/right/constant/RightTypeEnum.java @@ -0,0 +1,42 @@ +package com.qniao.dam.domian.aggregate.right.constant; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.Getter; + +@Getter +@JsonFormat(shape = JsonFormat.Shape.OBJECT) +public enum RightTypeEnum { + + EDUCATION_CERTIFICATION(101, "学历认证"), + + PROFILE_MODIFICATION(201, "头像修改"), + + UNLOCK_MORE_PEOPLE(301, "解锁更多人数"), + + ADVANCED_SEARCH(302, "高级搜索"), + + OFFLINE_MEET(401, "线下约见面"); + + @EnumValue + @JsonValue + private final Integer value; + private final String desc; + + RightTypeEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + @JsonCreator + public static RightTypeEnum get(Object code) { + for (RightTypeEnum e : RightTypeEnum.values()) { + if (e.getValue().equals(code)) { + return e; + } + } + return null; + } +} \ No newline at end of file diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/right/constant/RightUnitEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/right/constant/RightUnitEnum.java new file mode 100644 index 0000000..d7ac617 --- /dev/null +++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/right/constant/RightUnitEnum.java @@ -0,0 +1,34 @@ +package com.qniao.dam.domian.aggregate.right.constant; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.Getter; + +@Getter +@JsonFormat(shape = JsonFormat.Shape.OBJECT) +public enum RightUnitEnum { + + COUNT(1, "次数"); + + @EnumValue + @JsonValue + private final Integer value; + private final String desc; + + RightUnitEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + @JsonCreator + public static RightUnitEnum get(Object code) { + for (RightUnitEnum e : RightUnitEnum.values()) { + if (e.getValue().equals(code)) { + return e; + } + } + return null; + } +} \ No newline at end of file diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/right/entity/Right.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/right/entity/Right.java new file mode 100644 index 0000000..c018b62 --- /dev/null +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/right/entity/Right.java @@ -0,0 +1,38 @@ +package com.qniao.dam.domain.aggregate.right.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.qniao.dam.domian.aggregate.right.constant.RightTypeEnum; +import com.qniao.domain.Entity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("da_right") +public class Right extends Entity { + + @ApiModelProperty("用户标识") + private Long userId; + + @ApiModelProperty("征婚资料标识") + private Long miId; + + @ApiModelProperty("权益类型") + private RightTypeEnum type; + + @ApiModelProperty("开始时间") + private LocalDateTime startTime; + + @ApiModelProperty("结束时间") + private LocalDateTime endTime; + + @ApiModelProperty("状态") + private Boolean enable; + + private transient List rightTermList; + +} diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/right/entity/RightTerm.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/right/entity/RightTerm.java new file mode 100644 index 0000000..83ed446 --- /dev/null +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/right/entity/RightTerm.java @@ -0,0 +1,40 @@ +package com.qniao.dam.domain.aggregate.right.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.qniao.dam.domain.aggregate.productspec.valueobj.ProductSpecTerm; +import com.qniao.dam.domian.aggregate.right.constant.RightNameEnum; +import com.qniao.dam.domian.aggregate.right.constant.RightUnitEnum; +import com.qniao.domain.Entity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("da_right_term") +public class RightTerm extends Entity { + + @ApiModelProperty("权益ID") + private Long rightId; + + @ApiModelProperty("名称") + private RightNameEnum name; + + @ApiModelProperty("展示名称") + private String displayName; + + @ApiModelProperty("单位") + private RightUnitEnum unit; + + @ApiModelProperty("值") + private String value; + + public static RightTerm build(RightNameEnum name, RightUnitEnum unit, String value) { + RightTerm rightTerm = new RightTerm(); + rightTerm.setName(name); + rightTerm.setDisplayName(name.getDesc()); + rightTerm.setUnit(unit); + rightTerm.setValue(value); + return rightTerm; + } +} diff --git a/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/order/event/OrderCompletedEvent.java b/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/order/event/OrderCompletedEvent.java new file mode 100644 index 0000000..3bd7fa0 --- /dev/null +++ b/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/order/event/OrderCompletedEvent.java @@ -0,0 +1,16 @@ +package com.qniao.dam.domian.aggregate.order.event; + +import com.qniao.domain.BaseDomainEvent; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class OrderCompletedEvent extends BaseDomainEvent { + + private Long id; +} diff --git a/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/paymentchannelorder/event/PaymentChannelOrderPaidEvent.java b/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/paymentchannelorder/event/PaymentChannelOrderPaidEvent.java index 06a5afd..1b8b359 100644 --- a/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/paymentchannelorder/event/PaymentChannelOrderPaidEvent.java +++ b/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/paymentchannelorder/event/PaymentChannelOrderPaidEvent.java @@ -15,8 +15,6 @@ import java.time.LocalDateTime; @EqualsAndHashCode(callSuper = true) public class PaymentChannelOrderPaidEvent extends BaseDomainEvent { - private static final long serialVersionUID = 1L; - private Long id; private Long txnOrderId; diff --git a/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/paymentorder/event/PaymentOrderPaidEvent.java b/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/paymentorder/event/PaymentOrderPaidEvent.java new file mode 100644 index 0000000..eaf33fc --- /dev/null +++ b/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/paymentorder/event/PaymentOrderPaidEvent.java @@ -0,0 +1,25 @@ +package com.qniao.dam.domian.aggregate.paymentorder.event; + +import com.qniao.dam.domian.aggregate.paymentorder.constant.PaymentOrderStatusEnum; +import com.qniao.domain.BaseDomainEvent; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class PaymentOrderPaidEvent extends BaseDomainEvent { + + private Long id; + + private Long orderId; + + private LocalDateTime paidTime; + + private PaymentOrderStatusEnum status; +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/order/OrderEventHandler.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/order/OrderEventHandler.java new file mode 100644 index 0000000..f0bbd11 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/order/OrderEventHandler.java @@ -0,0 +1,77 @@ +package com.qniao.dam.application.handler.order; + +import cn.hutool.core.collection.CollUtil; +import com.google.common.eventbus.Subscribe; +import com.qniao.dam.application.service.right.RightApplicationService; +import com.qniao.dam.domain.aggregate.order.entity.Order; +import com.qniao.dam.domain.aggregate.order.entity.OrderItem; +import com.qniao.dam.domain.aggregate.order.repository.OrderRepository; +import com.qniao.dam.domain.aggregate.product.entity.Product; +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.aggregate.right.RightAggregate; +import com.qniao.dam.domain.aggregate.right.entity.Right; +import com.qniao.dam.domian.aggregate.order.event.OrderCompletedEvent; +import com.qniao.dam.domian.aggregate.product.constant.ProductTypeEnum; +import com.qniao.domain.BaseApplicationService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Component +@Slf4j +public class OrderEventHandler extends BaseApplicationService { + + @Resource + private OrderRepository orderRepository; + @Resource + private ProductSpecRepository productSpecRepository; + @Resource + private ProductRepository productRepository; + @Resource + private RightApplicationService rightApplicationService; + @Resource + private RightAggregate rightAggregate; + + /** + * 订单已完成事件 -> 兑换权益 + * + * @param event 订单已完成事件 + */ + @Subscribe + public void handle(OrderCompletedEvent event) { + try { + Order order = orderRepository.load(event.getId()); + if (CollUtil.isNotEmpty(order.getOrderItemList())) { + List rightList = new ArrayList<>(); + for (OrderItem orderItem : order.getOrderItemList()) { + if (ProductTypeEnum.VIRTUAL.equals(orderItem.getProductType())) { + ProductSpec productSpec = productSpecRepository.load(orderItem.getProductSpecId()); + Product product = productRepository.load(productSpec.getProductId()); + Right right = rightApplicationService.init(product, productSpec, order, orderItem.getQuantity()); + if (Objects.nonNull(right)) { + rightList.add(right); + } + } + } + batchCreate(rightList); + } + } catch (Exception e) { + log.error("订单已完成事件处理异常"); + } + } + + @Transactional(rollbackFor = Exception.class) + public void batchCreate(List rightList) { + if (CollUtil.isNotEmpty(rightList)) { + rightList.forEach(right -> rightAggregate.create(right)); + } + } + +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/paymentchannelorder/PaymentChannelOrderEventHandler.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/paymentchannelorder/PaymentChannelOrderEventHandler.java new file mode 100644 index 0000000..f866cc2 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/paymentchannelorder/PaymentChannelOrderEventHandler.java @@ -0,0 +1,46 @@ +package com.qniao.dam.application.handler.paymentchannelorder; + +import com.google.common.eventbus.Subscribe; +import com.qniao.dam.domain.aggregate.paymentorder.PaymentOrderAggregate; +import com.qniao.dam.domain.aggregate.paymentorder.entity.PaymentOrder; +import com.qniao.dam.domain.aggregate.paymentorder.repository.PaymentOrderRepository; +import com.qniao.dam.domian.aggregate.paymentchannelorder.event.PaymentChannelOrderPaidEvent; +import com.qniao.dam.domian.aggregate.paymentorder.constant.PaymentOrderStatusEnum; +import com.qniao.domain.BaseApplicationService; +import com.qniao.domain.BaseDomainEvent; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.math.BigDecimal; + +@Component +@Slf4j +public class PaymentChannelOrderEventHandler extends BaseApplicationService { + + @Resource + private PaymentOrderRepository paymentOrderRepository; + @Resource + private PaymentOrderAggregate paymentOrderAggregate; + + /** + * 渠道付款单已付款事件 + * + * @param event 事件 + */ + @Subscribe + public void handle(PaymentChannelOrderPaidEvent event) { + try { + PaymentOrder paymentOrder = paymentOrderRepository.load(event.getTxnOrderId()); + if (PaymentOrderStatusEnum.UNPAID.equals(paymentOrder.getStatus())) { + paymentOrder.setPaidAmount(paymentOrder.getPayableAmount()); + paymentOrder.setUnpaidAmount(BigDecimal.ZERO); + paymentOrder.setPaymentMethod(event.getPaymentMethod()); + BaseDomainEvent paymentOrderPaidEvent = paymentOrderAggregate.paid(paymentOrder); + this.sendEvent(paymentOrderPaidEvent); + } + } catch (Exception e) { + log.error("渠道付款单已付款事件处理异常", e); + } + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/paymentorder/PaymentOrderEventHandler.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/paymentorder/PaymentOrderEventHandler.java new file mode 100644 index 0000000..3741bc8 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/paymentorder/PaymentOrderEventHandler.java @@ -0,0 +1,43 @@ +package com.qniao.dam.application.handler.paymentorder; + +import com.google.common.eventbus.Subscribe; +import com.qniao.dam.domain.aggregate.order.OrderAggregate; +import com.qniao.dam.domain.aggregate.order.entity.Order; +import com.qniao.dam.domain.aggregate.order.repository.OrderRepository; +import com.qniao.dam.domian.aggregate.paymentorder.constant.PaymentOrderStatusEnum; +import com.qniao.dam.domian.aggregate.paymentorder.event.PaymentOrderPaidEvent; +import com.qniao.domain.BaseApplicationService; +import com.qniao.domain.BaseDomainEvent; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Component +@Slf4j +public class PaymentOrderEventHandler extends BaseApplicationService { + + @Resource + private OrderRepository orderRepository; + @Resource + private OrderAggregate orderAggregate; + + /** + * 付款单已付款事件 + * + * @param event 付款单已付款事件 + */ + @Subscribe + public void handle(PaymentOrderPaidEvent event) { + try { + if (PaymentOrderStatusEnum.PAID.equals(event.getStatus())) { + Order order = orderRepository.load(event.getOrderId()); + order.setPaidTime(event.getPaidTime()); + BaseDomainEvent orderCompletedEvent = orderAggregate.complete(order); + this.sendEvent(orderCompletedEvent); + } + } catch (Exception e) { + log.error("付款单已付款事件处理异常", e); + } + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/right/RightApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/right/RightApplicationService.java new file mode 100644 index 0000000..a7a71c3 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/right/RightApplicationService.java @@ -0,0 +1,112 @@ +package com.qniao.dam.application.service.right; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Tuple; +import com.qniao.dam.domain.aggregate.order.entity.Order; +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; +import com.qniao.dam.domain.aggregate.right.entity.Right; +import com.qniao.dam.domain.aggregate.right.entity.RightTerm; +import com.qniao.dam.domian.aggregate.product.constant.ProductSubCategoryEnum; +import com.qniao.dam.domian.aggregate.productspec.constant.ProductSpecTermNameEnum; +import com.qniao.dam.domian.aggregate.right.constant.RightNameEnum; +import com.qniao.dam.domian.aggregate.right.constant.RightTypeEnum; +import com.qniao.dam.domian.aggregate.right.constant.RightUnitEnum; +import com.qniao.dam.query.right.RightQueryService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Service +public class RightApplicationService { + + @Resource + private RightQueryService rightQueryService; + + /** + * 权益基本信息组织 + * + * @param product 商品 + * @param productSpec 商品规格 + * @param order 订单 + * @param quantity 数量 + * @return 权益 + */ + public Right init(Product product, ProductSpec productSpec, Order order, Integer quantity) { + Right right = null; + RightTypeEnum type = transformRightType(product.getSubCategory()); + if (Objects.nonNull(type)) { + right = new Right(); + right.setUserId(order.getUserId()); + right.setMiId(order.getMiId()); + right.setType(type); + //权益时间范围 + Tuple validityTuple = handleValidity(productSpec.getProductSpecTermList()); + if (Objects.nonNull(validityTuple)) { + right.setStartTime(validityTuple.get(0)); + right.setEndTime(validityTuple.get(1)); + } + right.setEnable(true); + //权益条款 + List rightTermList = new ArrayList<>(); + //条数 + ProductSpecTerm purchaseCountTerm = rightQueryService.getTermByName(productSpec.getProductSpecTermList(), ProductSpecTermNameEnum.PURCHASE_TIME); + if (Objects.nonNull(purchaseCountTerm) && !purchaseCountTerm.getValue().equals("-1")) { + int rightLimit = Integer.parseInt(purchaseCountTerm.getValue()) * quantity; + RightTerm rightLimitRightTerm = RightTerm.build(RightNameEnum.RIGHT_LIMIT, RightUnitEnum.COUNT, String.valueOf(rightLimit)); + rightTermList.add(rightLimitRightTerm); + RightTerm rightCountRightTerm = RightTerm.build(RightNameEnum.RIGHT_COUNT, RightUnitEnum.COUNT, String.valueOf(rightLimit)); + rightTermList.add(rightCountRightTerm); + } + //单日使用上限 + ProductSpecTerm dailyUseLimitTerm = rightQueryService.getTermByName(productSpec.getProductSpecTermList(), ProductSpecTermNameEnum.DAILY_USE_LIMIT); + if (Objects.nonNull(dailyUseLimitTerm) && !purchaseCountTerm.getValue().equals("-1")) { + RightTerm dailyUseLimitRightTerm = RightTerm.build(RightNameEnum.DAILY_USE_LIMIT, RightUnitEnum.COUNT, dailyUseLimitTerm.getValue()); + rightTermList.add(dailyUseLimitRightTerm); + } + right.setRightTermList(rightTermList); + } + return right; + } + + /** + * 权益有效期处理 + */ + private Tuple handleValidity(List productSpecTermList) { + Tuple tuple = null; + ProductSpecTerm term = rightQueryService.getTermByName(productSpecTermList, ProductSpecTermNameEnum.VALIDITY_PERIOD); + if (Objects.nonNull(term)) { + LocalDateTime startTime = LocalDateTime.now(); + LocalDateTime endTime; + int validityDays = Integer.parseInt(term.getValue()); + endTime = startTime.plusDays(validityDays); + tuple = new Tuple(startTime, endTime); + } + return tuple; + } + + /** + * 权益类型枚举转换 + */ + private RightTypeEnum transformRightType(ProductSubCategoryEnum subCategory) { + switch (subCategory) { + case EDUCATION_CERTIFICATION: + return RightTypeEnum.EDUCATION_CERTIFICATION; + case PROFILE_MODIFICATION: + return RightTypeEnum.PROFILE_MODIFICATION; + case UNLOCK_MORE_PEOPLE: + return RightTypeEnum.UNLOCK_MORE_PEOPLE; + case ADVANCED_SEARCH: + return RightTypeEnum.ADVANCED_SEARCH; + case OFFLINE_MEET: + return RightTypeEnum.OFFLINE_MEET; + default: + return null; + } + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/order/OrderAggregate.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/order/OrderAggregate.java index b8394e7..c8d615c 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/order/OrderAggregate.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/order/OrderAggregate.java @@ -3,6 +3,8 @@ package com.qniao.dam.domain.aggregate.order; import com.qniao.dam.domain.aggregate.order.entity.Order; import com.qniao.dam.domain.aggregate.order.repository.OrderRepository; import com.qniao.dam.domian.aggregate.order.constant.OrderStatusEnum; +import com.qniao.dam.domian.aggregate.order.event.OrderCompletedEvent; +import com.qniao.domain.BaseDomainEvent; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -17,4 +19,10 @@ public class OrderAggregate { order.setStatus(OrderStatusEnum.UNPAID); orderRepository.save(order); } + + public BaseDomainEvent complete(Order order) { + order.setStatus(OrderStatusEnum.COMPLETED); + orderRepository.save(order); + return new OrderCompletedEvent(order.getId()); + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/paymentorder/PaymentOrderAggregate.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/paymentorder/PaymentOrderAggregate.java index 3c1f061..70f1b5f 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/paymentorder/PaymentOrderAggregate.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/paymentorder/PaymentOrderAggregate.java @@ -3,9 +3,14 @@ package com.qniao.dam.domain.aggregate.paymentorder; import com.qniao.dam.domain.aggregate.paymentorder.entity.PaymentOrder; import com.qniao.dam.domain.aggregate.paymentorder.repository.PaymentOrderRepository; import com.qniao.dam.domian.aggregate.paymentorder.constant.PaymentOrderStatusEnum; +import com.qniao.dam.domian.aggregate.paymentorder.event.PaymentOrderPaidEvent; +import com.qniao.domain.BaseDomainEvent; +import com.qniao.framework.utils.TypeConvertUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; @Service public class PaymentOrderAggregate { @@ -17,4 +22,19 @@ public class PaymentOrderAggregate { paymentOrder.setStatus(PaymentOrderStatusEnum.UNPAID); paymentOrderRepository.save(paymentOrder); } + + public BaseDomainEvent paid(PaymentOrder paymentOrder) { + if (paymentOrder.getPaidAmount().compareTo(paymentOrder.getPayableAmount()) >= 0) { + //全付款 + paymentOrder.setStatus(PaymentOrderStatusEnum.PAID); + paymentOrder.setPaidTime(LocalDateTime.now()); + } else if (paymentOrder.getPaidAmount().compareTo(BigDecimal.ZERO) > 0) { + paymentOrder.setStatus(PaymentOrderStatusEnum.PARTIAL_PAYMENT); + paymentOrder.setPaidTime(LocalDateTime.now()); + } else { + paymentOrder.setStatus(PaymentOrderStatusEnum.UNPAID); + } + paymentOrderRepository.save(paymentOrder); + return TypeConvertUtils.convert(paymentOrder, PaymentOrderPaidEvent.class); + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/right/RightAggregate.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/right/RightAggregate.java new file mode 100644 index 0000000..58cc5e5 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/right/RightAggregate.java @@ -0,0 +1,18 @@ +package com.qniao.dam.domain.aggregate.right; + +import com.qniao.dam.domain.aggregate.right.entity.Right; +import com.qniao.dam.domain.aggregate.right.repository.RightRepository; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class RightAggregate { + + @Resource + private RightRepository rightRepository; + + public void create(Right right) { + rightRepository.save(right); + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/right/repository/RightRepository.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/right/repository/RightRepository.java new file mode 100644 index 0000000..3f56815 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/right/repository/RightRepository.java @@ -0,0 +1,7 @@ +package com.qniao.dam.domain.aggregate.right.repository; + +import com.qniao.dam.domain.aggregate.right.entity.Right; +import com.qniao.domain.Repository; + +public interface RightRepository extends Repository { +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/RightDao.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/RightDao.java new file mode 100644 index 0000000..c0c8008 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/RightDao.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.right.entity.Right; + +public interface RightDao extends BaseMapper { +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/RightTermDao.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/RightTermDao.java new file mode 100644 index 0000000..4854044 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/RightTermDao.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.right.entity.RightTerm; + +public interface RightTermDao extends BaseMapper { +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/RightRepositoryImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/RightRepositoryImpl.java new file mode 100644 index 0000000..1aa9993 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/RightRepositoryImpl.java @@ -0,0 +1,41 @@ +package com.qniao.dam.infrastructure.persistent.repository.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qniao.dam.domain.aggregate.right.entity.Right; +import com.qniao.dam.domain.aggregate.right.entity.RightTerm; +import com.qniao.dam.domain.aggregate.right.repository.RightRepository; +import com.qniao.dam.infrastructure.persistent.dao.domain.RightDao; +import com.qniao.dam.infrastructure.persistent.dao.domain.RightTermDao; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Objects; + +@Service +public class RightRepositoryImpl implements RightRepository { + + @Resource + public RightDao rightDao; + @Resource + private RightTermDao rightTermDao; + + @Override + public Right load(Long id) { + Right right = rightDao.selectById(id); + if (Objects.nonNull(right)) { + right.setRightTermList(rightTermDao.selectList(new LambdaQueryWrapper() + .eq(RightTerm::getRightId, id))); + } + return right; + } + + @Override + public Long save(Right entity) { + if (Objects.isNull(entity.getId()) || Objects.isNull(rightDao.selectById(entity.getId()))) { + rightDao.insert(entity); + } else { + rightDao.updateById(entity); + } + return entity.getId(); + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/right/RightQueryService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/right/RightQueryService.java new file mode 100644 index 0000000..1606fc7 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/right/RightQueryService.java @@ -0,0 +1,10 @@ +package com.qniao.dam.query.right; + +import com.qniao.dam.domain.aggregate.productspec.valueobj.ProductSpecTerm; +import com.qniao.dam.domian.aggregate.productspec.constant.ProductSpecTermNameEnum; + +import java.util.List; + +public interface RightQueryService { + ProductSpecTerm getTermByName(List productSpecTermList, ProductSpecTermNameEnum name); +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/right/impl/RightQueryServiceImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/right/impl/RightQueryServiceImpl.java new file mode 100644 index 0000000..ba939fe --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/right/impl/RightQueryServiceImpl.java @@ -0,0 +1,28 @@ +package com.qniao.dam.query.right.impl; + +import cn.hutool.core.collection.CollUtil; +import com.qniao.dam.domain.aggregate.productspec.valueobj.ProductSpecTerm; +import com.qniao.dam.domian.aggregate.productspec.constant.ProductSpecTermNameEnum; +import com.qniao.dam.query.right.RightQueryService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class RightQueryServiceImpl implements RightQueryService { + + + @Override + public ProductSpecTerm getTermByName(List productSpecTermList, ProductSpecTermNameEnum name) { + ProductSpecTerm productSpecTerm = null; + if (CollUtil.isNotEmpty(productSpecTermList)) { + for (ProductSpecTerm term : productSpecTermList) { + if (name.equals(term.getName())) { + productSpecTerm = term; + break; + } + } + } + return productSpecTerm; + } +}