From 1f1fd45b6651992eeb95d45f8a57d0b97ee5c7b9 Mon Sep 17 00:00:00 2001 From: Derran Date: Tue, 21 May 2024 12:00:52 +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 --- .../constant/ExternalOrderRelStatus.java | 38 ++++++++++ .../ExternalOrderRel.java | 13 +++- .../ExternalOrderEventHandler.java | 74 +++++++++++++++++++ .../handler/order/OrderEventHandler.java | 10 ++- .../ExternalOrderRelAggregate.java | 18 +++++ .../ExternalOrderRelRepository.java | 7 ++ .../SubmitSiteActivityOrderDomainService.java | 12 +-- .../infrastructure/constant/MqExchange.java | 2 + .../dam/infrastructure/constant/MqQueue.java | 2 + .../dao/domain/ExternalOrderRelDao.java | 7 +- .../impl/ExternalOrderRelRepositoryImpl.java | 31 ++++++++ .../externalorder/ExternalOrderRelMapper.xml | 20 +++++ 12 files changed, 222 insertions(+), 12 deletions(-) create mode 100644 dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/externalorder/constant/ExternalOrderRelStatus.java rename dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/externalorder/{valueobj => entity}/ExternalOrderRel.java (64%) create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/externalorder/ExternalOrderEventHandler.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/externalorder/ExternalOrderRelAggregate.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/externalorder/repository/ExternalOrderRelRepository.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/ExternalOrderRelRepositoryImpl.java create mode 100644 dating-agency-mall-server/src/main/resources/mapper/externalorder/ExternalOrderRelMapper.xml diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/externalorder/constant/ExternalOrderRelStatus.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/externalorder/constant/ExternalOrderRelStatus.java new file mode 100644 index 0000000..bf4c15a --- /dev/null +++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/externalorder/constant/ExternalOrderRelStatus.java @@ -0,0 +1,38 @@ +package com.qniao.dam.domian.aggregate.externalorder.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 ExternalOrderRelStatus { + + INIT(1, "初始化"), + + COMPLETED(2, "已完成"), + + CANCELED(3, "已取消"); + + @EnumValue + @JsonValue + private final Integer value; + private final String desc; + + ExternalOrderRelStatus(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + @JsonCreator + public static ExternalOrderRelStatus get(Object code) { + for (ExternalOrderRelStatus e : ExternalOrderRelStatus.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/externalorder/valueobj/ExternalOrderRel.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/externalorder/entity/ExternalOrderRel.java similarity index 64% rename from dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/externalorder/valueobj/ExternalOrderRel.java rename to dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/externalorder/entity/ExternalOrderRel.java index 125a3ee..6ce4794 100644 --- 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/entity/ExternalOrderRel.java @@ -1,8 +1,9 @@ -package com.qniao.dam.domain.aggregate.externalorder.valueobj; +package com.qniao.dam.domain.aggregate.externalorder.entity; import com.baomidou.mybatisplus.annotation.TableName; +import com.qniao.dam.domian.aggregate.externalorder.constant.ExternalOrderRelStatus; import com.qniao.dam.domian.aggregate.externalorder.constant.ExternalOrderTypeEnum; -import com.qniao.domain.ValueObject; +import com.qniao.domain.Entity; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -10,7 +11,7 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = true) @TableName("da_external_order_rel") -public class ExternalOrderRel extends ValueObject { +public class ExternalOrderRel extends Entity { @ApiModelProperty("外部标识") private Long externalId; @@ -21,11 +22,15 @@ public class ExternalOrderRel extends ValueObject { @ApiModelProperty("类型") private ExternalOrderTypeEnum type; - public static ExternalOrderRel build(Long externalId, Long orderId, ExternalOrderTypeEnum type) { + @ApiModelProperty("状态") + private ExternalOrderRelStatus status; + + public static ExternalOrderRel build(Long externalId, Long orderId, ExternalOrderTypeEnum type, ExternalOrderRelStatus status) { ExternalOrderRel rel = new ExternalOrderRel(); rel.setExternalId(externalId); rel.setOrderId(orderId); rel.setType(type); + rel.setStatus(status); return rel; } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/externalorder/ExternalOrderEventHandler.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/externalorder/ExternalOrderEventHandler.java new file mode 100644 index 0000000..3d015ad --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/externalorder/ExternalOrderEventHandler.java @@ -0,0 +1,74 @@ +package com.qniao.dam.application.handler.externalorder; + +import com.qniao.dam.application.service.paymentorderrefund.PaymentOrderRefundApplicationService; +import com.qniao.dam.domain.aggregate.externalorder.entity.ExternalOrderRel; +import com.qniao.dam.domain.aggregate.paymentchannelorder.entity.PaymentChannelOrder; +import com.qniao.dam.domain.aggregate.paymentorder.entity.PaymentOrder; +import com.qniao.dam.domain.aggregate.paymentorderrefund.entity.PaymentOrderRefund; +import com.qniao.dam.domian.aggregate.externalorder.constant.ExternalOrderTypeEnum; +import com.qniao.dam.domian.aggregate.paymentorder.constant.PaymentOrderStatusEnum; +import com.qniao.dam.infrastructure.constant.MqExchange; +import com.qniao.dam.infrastructure.constant.MqQueue; +import com.qniao.dam.infrastructure.persistent.dao.domain.ExternalOrderRelDao; +import com.qniao.dam.query.paymentchannelorder.PaymentChannelOrderQueryService; +import com.qniao.dam.query.paymentorder.PaymentOrderQueryService; +import com.qniao.das.domian.aggregate.siteactivity.event.SiteActivityCancelEvent; +import com.qniao.domain.BaseApplicationService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +@Component +@Slf4j +public class ExternalOrderEventHandler extends BaseApplicationService { + + @Resource + private ExternalOrderRelDao externalOrderRelDao; + @Resource + private PaymentOrderQueryService paymentOrderQueryService; + @Resource + private PaymentChannelOrderQueryService paymentChannelOrderQueryService; + @Resource + private PaymentOrderRefundApplicationService paymentOrderRefundApplicationService; + + @RabbitListener(bindings = @QueueBinding(value = @Queue(MqQueue.CANCEL_SITE_ACTIVITY), + exchange = @Exchange(value = MqExchange.CANCEL_SITE_ACTIVITY, + type = ExchangeTypes.FANOUT))) + public void handleConfirmMeeting(SiteActivityCancelEvent event) { + try { + log.error("接收到线下活动订单取消事件:{}", event); + ExternalOrderRel externalOrderRel = externalOrderRelDao.queryCompletedBy(event.getExternalId(), event.getUserId(), ExternalOrderTypeEnum.SITE_ACTIVITY); + if (Objects.nonNull(externalOrderRel)) { + List paymentOrderRefundList = new ArrayList<>(); + List paymentOrderList = paymentOrderQueryService.listByOrderId(Collections.singletonList(externalOrderRel.getOrderId()), PaymentOrderStatusEnum.PAID); + for (PaymentOrder paymentOrder : paymentOrderList) { + PaymentOrderRefund paymentOrderRefund = new PaymentOrderRefund(); + PaymentChannelOrder paymentChannelOrder = paymentChannelOrderQueryService.queryByTxnOrderId(paymentOrder.getId()); + paymentOrderRefund.setTradeOrderId(paymentOrder.getOrderId()); + paymentOrderRefund.setPaymentOrderId(paymentOrder.getId()); + paymentOrderRefund.setPaymentChannelOrder(paymentChannelOrder.getId()); + paymentOrderRefund.setPaymentMethod(paymentOrder.getPaymentMethod()); + paymentOrderRefund.setTransactionId(paymentChannelOrder.getExtOrderNo()); + paymentOrderRefund.setOrderAmount(paymentChannelOrder.getAmount()); + paymentOrderRefund.setRefundAmount(paymentChannelOrder.getAmount()); + paymentOrderRefundList.add(paymentOrderRefund); + } + //发起微信退款 + paymentOrderRefundApplicationService.refund(paymentOrderRefundList); + } + } catch (Exception e) { + log.error("接收到线下活动订单取消事件处理异常", e); + } + } + +} 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 70f76cc..af734b4 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 @@ -5,7 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.externalorder.valueobj.ExternalOrderRel; +import com.qniao.dam.domain.aggregate.externalorder.ExternalOrderRelAggregate; +import com.qniao.dam.domain.aggregate.externalorder.entity.ExternalOrderRel; import com.qniao.dam.domain.aggregate.order.OrderAggregate; import com.qniao.dam.domain.aggregate.order.entity.Order; import com.qniao.dam.domain.aggregate.order.entity.OrderItem; @@ -16,6 +17,7 @@ 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.externalorder.constant.ExternalOrderRelStatus; import com.qniao.dam.domian.aggregate.externalorder.constant.ExternalOrderTypeEnum; import com.qniao.dam.domian.aggregate.order.constant.OrderBelongingEnum; import com.qniao.dam.domian.aggregate.order.constant.OrderTypeEnum; @@ -63,6 +65,8 @@ public class OrderEventHandler extends BaseApplicationService { @Resource private ExternalOrderRelDao externalOrderRelDao; @Resource + private ExternalOrderRelAggregate externalOrderRelAggregate; + @Resource private MarriageInformationDao marriageInformationDao; @Resource private ProductQueryService productQueryService; @@ -109,6 +113,8 @@ public class OrderEventHandler extends BaseApplicationService { ExternalOrderRel externalOrderRel = externalOrderRelDao.selectOne(new LambdaQueryWrapper() .eq(ExternalOrderRel::getOrderId, order.getId())); if (Objects.nonNull(externalOrderRel)) { + externalOrderRel.setStatus(ExternalOrderRelStatus.COMPLETED); + externalOrderRelAggregate.save(externalOrderRel); if (ExternalOrderTypeEnum.VIP_PRODUCT.equals(externalOrderRel.getType())) { //购买vip套餐赠送下线参与机会 giftSiteActivityOrder(externalOrderRel.getExternalId(), order.getUserId(), order.getMiId()); @@ -135,7 +141,7 @@ public class OrderEventHandler extends BaseApplicationService { //设置订单号 order.setOrderCode(snowFlakeUtil.getSnowflakeOrderCode()); orderAggregate.complete(order); - ExternalOrderRel externalOrderRel = ExternalOrderRel.build(externalId, order.getId(), ExternalOrderTypeEnum.SITE_ACTIVITY); + ExternalOrderRel externalOrderRel = ExternalOrderRel.build(externalId, order.getId(), ExternalOrderTypeEnum.SITE_ACTIVITY, ExternalOrderRelStatus.COMPLETED); externalOrderRelDao.insert(externalOrderRel); sendCompletedMQ(externalOrderRel, order); } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/externalorder/ExternalOrderRelAggregate.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/externalorder/ExternalOrderRelAggregate.java new file mode 100644 index 0000000..535712b --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/externalorder/ExternalOrderRelAggregate.java @@ -0,0 +1,18 @@ +package com.qniao.dam.domain.aggregate.externalorder; + +import com.qniao.dam.domain.aggregate.externalorder.entity.ExternalOrderRel; +import com.qniao.dam.domain.aggregate.externalorder.repository.ExternalOrderRelRepository; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class ExternalOrderRelAggregate { + + @Resource + private ExternalOrderRelRepository externalOrderRelRepository; + + public void save(ExternalOrderRel externalOrderRel) { + externalOrderRelRepository.save(externalOrderRel); + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/externalorder/repository/ExternalOrderRelRepository.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/externalorder/repository/ExternalOrderRelRepository.java new file mode 100644 index 0000000..142cac1 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/externalorder/repository/ExternalOrderRelRepository.java @@ -0,0 +1,7 @@ +package com.qniao.dam.domain.aggregate.externalorder.repository; + +import com.qniao.dam.domain.aggregate.externalorder.entity.ExternalOrderRel; +import com.qniao.domain.Repository; + +public interface ExternalOrderRelRepository extends Repository { +} 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 index f8be5e2..22ac8f1 100644 --- 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 @@ -1,12 +1,13 @@ package com.qniao.dam.domain.service.order; -import com.qniao.dam.domain.aggregate.externalorder.valueobj.ExternalOrderRel; +import com.qniao.dam.domain.aggregate.externalorder.ExternalOrderRelAggregate; +import com.qniao.dam.domain.aggregate.externalorder.entity.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.domian.aggregate.externalorder.constant.ExternalOrderRelStatus; import com.qniao.dam.domian.aggregate.externalorder.constant.ExternalOrderTypeEnum; -import com.qniao.dam.infrastructure.persistent.dao.domain.ExternalOrderRelDao; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -20,14 +21,15 @@ public class SubmitSiteActivityOrderDomainService { @Resource private PaymentOrderAggregate paymentOrderAggregate; @Resource - private ExternalOrderRelDao externalOrderRelDao; + private ExternalOrderRelAggregate externalOrderRelAggregate; @Transactional(rollbackFor = Exception.class) public void handle(Order order, PaymentOrder paymentOrder, Long siteActivityId, Boolean openVip) { orderAggregate.submit(order); paymentOrder.setOrderId(order.getId()); paymentOrderAggregate.create(paymentOrder); - ExternalOrderRel externalOrderRel = ExternalOrderRel.build(siteActivityId, order.getId(), openVip ? ExternalOrderTypeEnum.VIP_PRODUCT : ExternalOrderTypeEnum.SITE_ACTIVITY); - externalOrderRelDao.insert(externalOrderRel); + ExternalOrderRel externalOrderRel = ExternalOrderRel.build(siteActivityId, order.getId(), + openVip ? ExternalOrderTypeEnum.VIP_PRODUCT : ExternalOrderTypeEnum.SITE_ACTIVITY, ExternalOrderRelStatus.INIT); + externalOrderRelAggregate.save(externalOrderRel); } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqExchange.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqExchange.java index 452a8d6..9d16900 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqExchange.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqExchange.java @@ -14,4 +14,6 @@ public interface MqExchange { String EXTERNAL_ORDER_COMPLETED = "fanout.externalOrderCompleted"; + String CANCEL_SITE_ACTIVITY = "fanout.cancelSiteActivity"; + } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqQueue.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqQueue.java index a7b2243..8ba2dc5 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqQueue.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqQueue.java @@ -14,4 +14,6 @@ public interface MqQueue { String SITE_ACTIVITY_CREATED = MqExchange.SITE_ACTIVITY_CREATED + serviceName; + String CANCEL_SITE_ACTIVITY = MqExchange.CANCEL_SITE_ACTIVITY + serviceName; + } 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 index e2c595f..37374cf 100644 --- 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 @@ -1,7 +1,12 @@ package com.qniao.dam.infrastructure.persistent.dao.domain; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.qniao.dam.domain.aggregate.externalorder.valueobj.ExternalOrderRel; +import com.qniao.dam.domain.aggregate.externalorder.entity.ExternalOrderRel; +import com.qniao.dam.domian.aggregate.externalorder.constant.ExternalOrderTypeEnum; +import org.apache.ibatis.annotations.Param; public interface ExternalOrderRelDao extends BaseMapper { + ExternalOrderRel queryCompletedBy(@Param("externalId") Long externalId, + @Param("userId") Long userId, + @Param("type") ExternalOrderTypeEnum type); } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/ExternalOrderRelRepositoryImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/ExternalOrderRelRepositoryImpl.java new file mode 100644 index 0000000..5151cc9 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/ExternalOrderRelRepositoryImpl.java @@ -0,0 +1,31 @@ +package com.qniao.dam.infrastructure.persistent.repository.impl; + +import com.qniao.dam.domain.aggregate.externalorder.entity.ExternalOrderRel; +import com.qniao.dam.domain.aggregate.externalorder.repository.ExternalOrderRelRepository; +import com.qniao.dam.infrastructure.persistent.dao.domain.ExternalOrderRelDao; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Objects; + +@Service +public class ExternalOrderRelRepositoryImpl implements ExternalOrderRelRepository { + + @Resource + private ExternalOrderRelDao externalOrderRelDao; + + @Override + public ExternalOrderRel load(Long id) { + return externalOrderRelDao.selectById(id); + } + + @Override + public Long save(ExternalOrderRel entity) { + if (Objects.isNull(entity.getId()) || Objects.isNull(externalOrderRelDao.selectById(entity.getId()))) { + externalOrderRelDao.insert(entity); + } else { + externalOrderRelDao.updateById(entity); + } + return entity.getId(); + } +} diff --git a/dating-agency-mall-server/src/main/resources/mapper/externalorder/ExternalOrderRelMapper.xml b/dating-agency-mall-server/src/main/resources/mapper/externalorder/ExternalOrderRelMapper.xml new file mode 100644 index 0000000..cd79b66 --- /dev/null +++ b/dating-agency-mall-server/src/main/resources/mapper/externalorder/ExternalOrderRelMapper.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file