diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/entity/MarriageBountyOrder.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/entity/MarriageBountyOrder.java index 0c3d871..4459250 100644 --- a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/entity/MarriageBountyOrder.java +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/entity/MarriageBountyOrder.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.ArrayList; import java.util.List; @Data @@ -33,7 +34,14 @@ public class MarriageBountyOrder extends Entity { @ApiModelProperty("悬赏招亲订单奖励") private transient List orderRewardList; - private transient List insertOrderRewardList; - private transient List updateOrderRewardList; - private transient List deleteOrderRewardList; + private transient List insertOrderRewardList = new ArrayList<>(); + private transient List updateOrderRewardList = new ArrayList<>(); + private transient List deleteOrderRewardList = new ArrayList<>(); + + public static MarriageBountyOrder build(Long userId, Long miId) { + MarriageBountyOrder marriageBountyOrder = new MarriageBountyOrder(); + marriageBountyOrder.setUserId(userId); + marriageBountyOrder.setMiId(miId); + return marriageBountyOrder; + } } diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/entity/MarriageBountyOrderReward.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/entity/MarriageBountyOrderReward.java index 87b9e36..d73a229 100644 --- a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/entity/MarriageBountyOrderReward.java +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/entity/MarriageBountyOrderReward.java @@ -10,6 +10,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; @Data @@ -32,4 +34,15 @@ public class MarriageBountyOrderReward extends Entity @ApiModelProperty("悬赏招亲订单奖励领取记录") private transient List rewardReceiveRecordList; + public static Collection build(ProductSubCategoryEnum rewardCategory, BigDecimal rewardAmount, int quantity) { + List orderRewardList = new ArrayList<>(); + for (int i = 0; i < quantity; i++) { + MarriageBountyOrderReward orderReward = new MarriageBountyOrderReward(); + orderReward.setRewardCategory(rewardCategory); + orderReward.setRewardAmount(rewardAmount); + orderReward.setIsReceive(false); + orderRewardList.add(orderReward); + } + return orderRewardList; + } } diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/valueobj/MarriageBountyOrderProductRecord.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/valueobj/MarriageBountyOrderProductRecord.java index 3d0f8bf..8b6ffbf 100644 --- a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/valueobj/MarriageBountyOrderProductRecord.java +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/valueobj/MarriageBountyOrderProductRecord.java @@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.ArrayList; import java.util.List; @Data @@ -17,6 +18,6 @@ public class MarriageBountyOrderProductRecord extends ValueObject productSpecRecordList; + private transient List productSpecRecordList = new ArrayList<>(); } diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/valueobj/MarriageBountyOrderProductSpecRecord.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/valueobj/MarriageBountyOrderProductSpecRecord.java index 54ae813..e33ec4b 100644 --- a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/valueobj/MarriageBountyOrderProductSpecRecord.java +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/valueobj/MarriageBountyOrderProductSpecRecord.java @@ -26,4 +26,11 @@ public class MarriageBountyOrderProductSpecRecord extends ValueObject @ApiModelProperty("订单标识") private Long orderId; + public static MarriageBountyOrderRel build(Long orderId) { + MarriageBountyOrderRel orderRel = new MarriageBountyOrderRel(); + orderRel.setOrderId(orderId); + return orderRel; + } } diff --git a/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/marriagebounty/event/MarriageBountyOrderCreatedEvent.java b/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/marriagebounty/event/MarriageBountyOrderCreatedEvent.java new file mode 100644 index 0000000..e19aaca --- /dev/null +++ b/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/marriagebounty/event/MarriageBountyOrderCreatedEvent.java @@ -0,0 +1,17 @@ +package com.qniao.dam.domian.aggregate.marriagebounty.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 MarriageBountyOrderCreatedEvent extends BaseDomainEvent { + + private Long id; + +} 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 index 02d274e..8eac41d 100644 --- 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 @@ -2,6 +2,7 @@ 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.marriagebounty.MarriageBountyOrderApplicationService; 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; @@ -43,6 +44,8 @@ public class OrderEventHandler extends BaseApplicationService { private RightAggregate rightAggregate; @Resource private UecServerApplicationService uecServerApplicationService; + @Resource + private MarriageBountyOrderApplicationService marriageBountyOrderApplicationService; /** * 订单已完成事件 -> 兑换权益 @@ -74,7 +77,7 @@ public class OrderEventHandler extends BaseApplicationService { } //悬赏招亲 if (OrderTypeEnum.MARRIAGE_BOUNTY.equals(order.getOrderType())) { - //todo + marriageBountyOrderApplicationService.save(order.getId()); } } catch (Exception e) { log.error("订单已完成事件处理异常"); diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/marriagebounty/MarriageBountyOrderAggregate.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/marriagebounty/MarriageBountyOrderAggregate.java deleted file mode 100644 index 4d56c6e..0000000 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/marriagebounty/MarriageBountyOrderAggregate.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.qniao.dam.application.service.marriagebounty; - -public class MarriageBountyOrderAggregate { -} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/marriagebounty/MarriageBountyOrderApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/marriagebounty/MarriageBountyOrderApplicationService.java new file mode 100644 index 0000000..c248cb6 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/marriagebounty/MarriageBountyOrderApplicationService.java @@ -0,0 +1,89 @@ +package com.qniao.dam.application.service.marriagebounty; + +import com.qniao.dam.domain.aggregate.marriagebounty.MarriageBountyOrderAggregate; +import com.qniao.dam.domain.aggregate.marriagebounty.entity.MarriageBountyOrder; +import com.qniao.dam.domain.aggregate.marriagebounty.entity.MarriageBountyOrderReward; +import com.qniao.dam.domain.aggregate.marriagebounty.valueobj.MarriageBountyOrderProductRecord; +import com.qniao.dam.domain.aggregate.marriagebounty.valueobj.MarriageBountyOrderProductSpecRecord; +import com.qniao.dam.domain.aggregate.marriagebounty.valueobj.MarriageBountyOrderRel; +import com.qniao.dam.domain.aggregate.order.entity.Order; +import com.qniao.dam.domain.aggregate.order.repository.OrderRepository; +import com.qniao.dam.domain.aggregate.productspec.entity.ProductSpec; +import com.qniao.dam.domian.aggregate.product.constant.ProductSubCategoryEnum; +import com.qniao.dam.infrastructure.persistent.dao.domain.ProductSpecDao; +import com.qniao.dam.query.marriagebounty.MarriageBountyOrderQueryService; +import com.qniao.domain.BaseApplicationService; +import com.qniao.domain.BaseDomainEvent; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; + +@Service +public class MarriageBountyOrderApplicationService extends BaseApplicationService { + @Resource + private OrderRepository orderRepository; + @Resource + private MarriageBountyOrderQueryService marriageBountyOrderQueryService; + @Resource + private ProductSpecDao productSpecDao; + @Resource + private MarriageBountyOrderAggregate marriageBountyOrderAggregate; + + public void save(Long orderId) { + Order order = orderRepository.load(orderId); + MarriageBountyOrder marriageBountyOrder = marriageBountyOrderQueryService.queryBy(order.getUserId(), order.getMiId()); + if (Objects.isNull(marriageBountyOrder)) { + //新的悬赏招亲 + marriageBountyOrder = MarriageBountyOrder.build(order.getUserId(), order.getMiId()); + //订单关系 + MarriageBountyOrderRel orderRel = MarriageBountyOrderRel.build(orderId); + marriageBountyOrder.setOrderRelList(Collections.singletonList(orderRel)); + //悬赏招亲订单奖励 + List orderRewardList = new ArrayList<>(); + //悬赏招亲订单产品记录 + MarriageBountyOrderProductRecord productRecord = new MarriageBountyOrderProductRecord(); + order.getOrderItemList().forEach(orderItem -> { + ProductSpec productSpec = productSpecDao.selectById(orderItem.getProductSpecId()); + productRecord.getProductSpecRecordList().add(MarriageBountyOrderProductSpecRecord.build( + orderItem.getSubCategory(), productSpec.getUnitOriginalPrice(), productSpec.getUnitOriginalPrice())); + if (ProductSubCategoryEnum.MARRIAGE_BOUNTY_MEETING_FEE.equals(orderItem.getSubCategory())) { + orderRewardList.addAll(MarriageBountyOrderReward.build(ProductSubCategoryEnum.MARRIAGE_BOUNTY_MEETING_FEE, orderItem.getUnitSettlementPrice(), orderItem.getQuantity())); + } else if (ProductSubCategoryEnum.MARRIAGE_BOUNTY_RESULT_GIFT.equals(orderItem.getSubCategory())) { + orderRewardList.addAll(MarriageBountyOrderReward.build(ProductSubCategoryEnum.MARRIAGE_BOUNTY_RESULT_GIFT, orderItem.getUnitSettlementPrice(), orderItem.getQuantity())); + } + }); + marriageBountyOrder.setProductRecordList(Collections.singletonList(productRecord)); + marriageBountyOrder.setOrderRewardList(orderRewardList); + marriageBountyOrder.setInsertOrderRewardList(orderRewardList); + BaseDomainEvent event = marriageBountyOrderAggregate.create(marriageBountyOrder); + this.sendEvent(event); + } else { + //修改悬赏招亲订单 + Map rewardCategoryPriceMap = new HashMap<>(); + //订单关系 + MarriageBountyOrderRel orderRel = MarriageBountyOrderRel.build(orderId); + marriageBountyOrder.setOrderRelList(Collections.singletonList(orderRel)); + //悬赏招亲订单产品记录 + MarriageBountyOrderProductRecord productRecord = new MarriageBountyOrderProductRecord(); + order.getOrderItemList().forEach(orderItem -> { + ProductSpec productSpec = productSpecDao.selectById(orderItem.getProductSpecId()); + productRecord.getProductSpecRecordList().add(MarriageBountyOrderProductSpecRecord.build( + orderItem.getSubCategory(), productSpec.getUnitOriginalPrice(), productSpec.getUnitOriginalPrice())); + rewardCategoryPriceMap.put(orderItem.getSubCategory().getValue(), orderItem.getUnitSettlementPrice()); + }); + marriageBountyOrder.setProductRecordList(Collections.singletonList(productRecord)); + //悬赏招亲订单奖励 + for (MarriageBountyOrderReward orderReward : marriageBountyOrder.getOrderRewardList()) { + if (!orderReward.getIsReceive()) { + BigDecimal addPrice = rewardCategoryPriceMap.get(orderReward.getRewardCategory().getValue()); + addPrice = Objects.nonNull(addPrice) ? addPrice : BigDecimal.ZERO; + orderReward.setRewardAmount(orderReward.getRewardAmount().add(addPrice)); + marriageBountyOrder.getUpdateOrderRewardList().add(orderReward); + } + } + marriageBountyOrderAggregate.update(marriageBountyOrder); + } + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/MarriageBountyOrderAggregate.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/MarriageBountyOrderAggregate.java new file mode 100644 index 0000000..6bbbf80 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/MarriageBountyOrderAggregate.java @@ -0,0 +1,25 @@ +package com.qniao.dam.domain.aggregate.marriagebounty; + +import com.qniao.dam.domain.aggregate.marriagebounty.entity.MarriageBountyOrder; +import com.qniao.dam.domain.aggregate.marriagebounty.repository.MarriageBountyOrderRepository; +import com.qniao.dam.domian.aggregate.marriagebount.constant.MarriageBountyOrderStatusEnum; +import com.qniao.dam.domian.aggregate.marriagebounty.event.MarriageBountyOrderCreatedEvent; +import com.qniao.domain.BaseDomainEvent; + +import javax.annotation.Resource; + +public class MarriageBountyOrderAggregate { + + @Resource + private MarriageBountyOrderRepository marriageBountyOrderRepository; + + public BaseDomainEvent create(MarriageBountyOrder marriageBountyOrder) { + marriageBountyOrder.setStatus(MarriageBountyOrderStatusEnum.MATCHMAKING); + marriageBountyOrderRepository.save(marriageBountyOrder); + return new MarriageBountyOrderCreatedEvent(marriageBountyOrder.getId()); + } + + public void update(MarriageBountyOrder marriageBountyOrder) { + marriageBountyOrderRepository.save(marriageBountyOrder); + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/marriagebounty/repository/MarriageBountyOrderRepository.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/repository/MarriageBountyOrderRepository.java similarity index 75% rename from dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/marriagebounty/repository/MarriageBountyOrderRepository.java rename to dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/repository/MarriageBountyOrderRepository.java index 23a99cb..db6b629 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/marriagebounty/repository/MarriageBountyOrderRepository.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/repository/MarriageBountyOrderRepository.java @@ -1,4 +1,4 @@ -package com.qniao.dam.application.service.marriagebounty.repository; +package com.qniao.dam.domain.aggregate.marriagebounty.repository; import com.qniao.dam.domain.aggregate.marriagebounty.entity.MarriageBountyOrder; import com.qniao.domain.Repository; diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/MarriageBountyOrderRepositoryImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/MarriageBountyOrderRepositoryImpl.java index 7b800c9..cc21f95 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/MarriageBountyOrderRepositoryImpl.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/MarriageBountyOrderRepositoryImpl.java @@ -2,7 +2,7 @@ package com.qniao.dam.infrastructure.persistent.repository.impl; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.qniao.dam.application.service.marriagebounty.repository.MarriageBountyOrderRepository; +import com.qniao.dam.domain.aggregate.marriagebounty.repository.MarriageBountyOrderRepository; import com.qniao.dam.domain.aggregate.marriagebounty.entity.MarriageBountyOrder; import com.qniao.dam.domain.aggregate.marriagebounty.entity.MarriageBountyOrderReward; import com.qniao.dam.domain.aggregate.marriagebounty.valueobj.MarriageBountyOrderProductRecord; diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/marriagebounty/MarriageBountyOrderQueryService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/marriagebounty/MarriageBountyOrderQueryService.java new file mode 100644 index 0000000..42332db --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/marriagebounty/MarriageBountyOrderQueryService.java @@ -0,0 +1,7 @@ +package com.qniao.dam.query.marriagebounty; + +import com.qniao.dam.domain.aggregate.marriagebounty.entity.MarriageBountyOrder; + +public interface MarriageBountyOrderQueryService { + MarriageBountyOrder queryBy(Long userId, Long miId); +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/marriagebounty/impl/MarriageBountyOrderQueryServiceImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/marriagebounty/impl/MarriageBountyOrderQueryServiceImpl.java new file mode 100644 index 0000000..dfc450a --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/marriagebounty/impl/MarriageBountyOrderQueryServiceImpl.java @@ -0,0 +1,37 @@ +package com.qniao.dam.query.marriagebounty.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qniao.dam.domain.aggregate.marriagebounty.entity.MarriageBountyOrder; +import com.qniao.dam.domain.aggregate.marriagebounty.entity.MarriageBountyOrderReward; +import com.qniao.dam.domian.aggregate.marriagebount.constant.MarriageBountyOrderStatusEnum; +import com.qniao.dam.infrastructure.persistent.dao.domain.MarriageBountyOrderDao; +import com.qniao.dam.infrastructure.persistent.dao.domain.MarriageBountyOrderRewardDao; +import com.qniao.dam.query.marriagebounty.MarriageBountyOrderQueryService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Objects; + +@Service +public class MarriageBountyOrderQueryServiceImpl implements MarriageBountyOrderQueryService { + + @Resource + private MarriageBountyOrderDao marriageBountyOrderDao; + @Resource + private MarriageBountyOrderRewardDao marriageBountyOrderRewardDao; + + @Override + public MarriageBountyOrder queryBy(Long userId, Long miId) { + MarriageBountyOrder marriageBountyOrder = marriageBountyOrderDao.selectOne(new LambdaQueryWrapper() + .eq(MarriageBountyOrder::getUserId, userId) + .eq(MarriageBountyOrder::getMiId, miId) + .eq(MarriageBountyOrder::getStatus, MarriageBountyOrderStatusEnum.MATCHMAKING) + .orderByDesc(MarriageBountyOrder::getCreateTime) + .last("limit 1")); + if (Objects.nonNull(marriageBountyOrder)) { + marriageBountyOrder.setOrderRewardList(marriageBountyOrderRewardDao.selectList(new LambdaQueryWrapper() + .eq(MarriageBountyOrderReward::getMarriageBountyOrderId, marriageBountyOrder.getId()))); + } + return marriageBountyOrder; + } +}