You've already forked FrameTour-BE
feat(order): 新增订单管理功能 V2
- 新增订单创建、查询、备注更新、申请退款等接口 - 添加订单相关实体类和枚举类 - 实现订单事件监听器,处理支付、退款、订单状态变化 - 优化移动端订单创建逻辑,集成订单服务
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
package com.ycwl.basic.order.event;
|
||||
|
||||
/**
|
||||
* 订单事件监听器接口
|
||||
*/
|
||||
public interface OrderEventListener {
|
||||
|
||||
/**
|
||||
* 支付状态变更事件
|
||||
*
|
||||
* @param event 支付状态变更事件
|
||||
*/
|
||||
void onPaymentStatusChanged(PaymentStatusChangeEvent event);
|
||||
|
||||
/**
|
||||
* 退款状态变更事件
|
||||
*
|
||||
* @param event 退款状态变更事件
|
||||
*/
|
||||
void onRefundStatusChanged(RefundStatusChangeEvent event);
|
||||
|
||||
/**
|
||||
* 订单状态变更事件
|
||||
*
|
||||
* @param event 订单状态变更事件
|
||||
*/
|
||||
void onOrderStatusChanged(OrderStatusChangeEvent event);
|
||||
}
|
||||
125
src/main/java/com/ycwl/basic/order/event/OrderEventManager.java
Normal file
125
src/main/java/com/ycwl/basic/order/event/OrderEventManager.java
Normal file
@@ -0,0 +1,125 @@
|
||||
package com.ycwl.basic.order.event;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
/**
|
||||
* 订单事件管理器
|
||||
* 管理事件监听器的注册和事件分发
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class OrderEventManager {
|
||||
|
||||
private final List<OrderEventListener> listeners = new ArrayList<>();
|
||||
private final Executor eventExecutor = Executors.newFixedThreadPool(5,
|
||||
r -> new Thread(r, "order-event-thread"));
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
log.info("订单事件管理器初始化完成");
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册事件监听器
|
||||
*
|
||||
* @param listener 监听器实例
|
||||
*/
|
||||
public void registerListener(OrderEventListener listener) {
|
||||
if (listener != null && !listeners.contains(listener)) {
|
||||
listeners.add(listener);
|
||||
log.info("注册订单事件监听器: {}", listener.getClass().getSimpleName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 移除事件监听器
|
||||
*
|
||||
* @param listener 监听器实例
|
||||
*/
|
||||
public void removeListener(OrderEventListener listener) {
|
||||
if (listeners.remove(listener)) {
|
||||
log.info("移除订单事件监听器: {}", listener.getClass().getSimpleName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 发布支付状态变更事件
|
||||
*
|
||||
* @param event 支付状态变更事件
|
||||
*/
|
||||
public void publishPaymentStatusChangeEvent(PaymentStatusChangeEvent event) {
|
||||
log.info("发布支付状态变更事件: orderId={}, {} -> {}",
|
||||
event.getOrderId(), event.getOldPaymentStatus(), event.getNewPaymentStatus());
|
||||
|
||||
CompletableFuture.runAsync(() -> {
|
||||
for (OrderEventListener listener : listeners) {
|
||||
try {
|
||||
listener.onPaymentStatusChanged(event);
|
||||
} catch (Exception e) {
|
||||
log.error("处理支付状态变更事件失败: listener={}, orderId={}",
|
||||
listener.getClass().getSimpleName(), event.getOrderId(), e);
|
||||
}
|
||||
}
|
||||
}, eventExecutor);
|
||||
}
|
||||
|
||||
/**
|
||||
* 发布退款状态变更事件
|
||||
*
|
||||
* @param event 退款状态变更事件
|
||||
*/
|
||||
public void publishRefundStatusChangeEvent(RefundStatusChangeEvent event) {
|
||||
log.info("发布退款状态变更事件: orderId={}, refundId={}, {} -> {}",
|
||||
event.getOrderId(), event.getRefundId(),
|
||||
event.getOldRefundStatus(), event.getNewRefundStatus());
|
||||
|
||||
CompletableFuture.runAsync(() -> {
|
||||
for (OrderEventListener listener : listeners) {
|
||||
try {
|
||||
listener.onRefundStatusChanged(event);
|
||||
} catch (Exception e) {
|
||||
log.error("处理退款状态变更事件失败: listener={}, orderId={}, refundId={}",
|
||||
listener.getClass().getSimpleName(), event.getOrderId(), event.getRefundId(), e);
|
||||
}
|
||||
}
|
||||
}, eventExecutor);
|
||||
}
|
||||
|
||||
/**
|
||||
* 发布订单状态变更事件
|
||||
*
|
||||
* @param event 订单状态变更事件
|
||||
*/
|
||||
public void publishOrderStatusChangeEvent(OrderStatusChangeEvent event) {
|
||||
log.info("发布订单状态变更事件: orderId={}, {} -> {}",
|
||||
event.getOrderId(), event.getOldOrderStatus(), event.getNewOrderStatus());
|
||||
|
||||
CompletableFuture.runAsync(() -> {
|
||||
for (OrderEventListener listener : listeners) {
|
||||
try {
|
||||
listener.onOrderStatusChanged(event);
|
||||
} catch (Exception e) {
|
||||
log.error("处理订单状态变更事件失败: listener={}, orderId={}",
|
||||
listener.getClass().getSimpleName(), event.getOrderId(), e);
|
||||
}
|
||||
}
|
||||
}, eventExecutor);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取已注册的监听器数量
|
||||
*
|
||||
* @return 监听器数量
|
||||
*/
|
||||
public int getListenerCount() {
|
||||
return listeners.size();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.ycwl.basic.order.event;
|
||||
|
||||
import com.ycwl.basic.order.enums.OrderStatus;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 订单状态变更事件
|
||||
*/
|
||||
@Data
|
||||
public class OrderStatusChangeEvent {
|
||||
|
||||
/**
|
||||
* 订单ID
|
||||
*/
|
||||
private Long orderId;
|
||||
|
||||
/**
|
||||
* 订单号
|
||||
*/
|
||||
private String orderNo;
|
||||
|
||||
/**
|
||||
* 旧的订单状态
|
||||
*/
|
||||
private OrderStatus oldOrderStatus;
|
||||
|
||||
/**
|
||||
* 新的订单状态
|
||||
*/
|
||||
private OrderStatus newOrderStatus;
|
||||
|
||||
/**
|
||||
* 变更时间
|
||||
*/
|
||||
private Date changeTime;
|
||||
|
||||
/**
|
||||
* 变更原因
|
||||
*/
|
||||
private String changeReason;
|
||||
|
||||
/**
|
||||
* 操作人ID
|
||||
*/
|
||||
private Long operatorId;
|
||||
|
||||
public OrderStatusChangeEvent(Long orderId, String orderNo,
|
||||
OrderStatus oldStatus, OrderStatus newStatus,
|
||||
String changeReason, Long operatorId) {
|
||||
this.orderId = orderId;
|
||||
this.orderNo = orderNo;
|
||||
this.oldOrderStatus = oldStatus;
|
||||
this.newOrderStatus = newStatus;
|
||||
this.changeReason = changeReason;
|
||||
this.operatorId = operatorId;
|
||||
this.changeTime = new Date();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.ycwl.basic.order.event;
|
||||
|
||||
import com.ycwl.basic.order.enums.PaymentStatus;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 支付状态变更事件
|
||||
*/
|
||||
@Data
|
||||
public class PaymentStatusChangeEvent {
|
||||
|
||||
/**
|
||||
* 订单ID
|
||||
*/
|
||||
private Long orderId;
|
||||
|
||||
/**
|
||||
* 订单号
|
||||
*/
|
||||
private String orderNo;
|
||||
|
||||
/**
|
||||
* 旧的支付状态
|
||||
*/
|
||||
private PaymentStatus oldPaymentStatus;
|
||||
|
||||
/**
|
||||
* 新的支付状态
|
||||
*/
|
||||
private PaymentStatus newPaymentStatus;
|
||||
|
||||
/**
|
||||
* 变更时间
|
||||
*/
|
||||
private Date changeTime;
|
||||
|
||||
/**
|
||||
* 变更原因
|
||||
*/
|
||||
private String changeReason;
|
||||
|
||||
/**
|
||||
* 操作人ID
|
||||
*/
|
||||
private Long operatorId;
|
||||
|
||||
public PaymentStatusChangeEvent(Long orderId, String orderNo,
|
||||
PaymentStatus oldStatus, PaymentStatus newStatus,
|
||||
String changeReason, Long operatorId) {
|
||||
this.orderId = orderId;
|
||||
this.orderNo = orderNo;
|
||||
this.oldPaymentStatus = oldStatus;
|
||||
this.newPaymentStatus = newStatus;
|
||||
this.changeReason = changeReason;
|
||||
this.operatorId = operatorId;
|
||||
this.changeTime = new Date();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
package com.ycwl.basic.order.event;
|
||||
|
||||
import com.ycwl.basic.order.enums.RefundStatus;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 退款状态变更事件
|
||||
*/
|
||||
@Data
|
||||
public class RefundStatusChangeEvent {
|
||||
|
||||
/**
|
||||
* 订单ID
|
||||
*/
|
||||
private Long orderId;
|
||||
|
||||
/**
|
||||
* 订单号
|
||||
*/
|
||||
private String orderNo;
|
||||
|
||||
/**
|
||||
* 退款记录ID
|
||||
*/
|
||||
private Long refundId;
|
||||
|
||||
/**
|
||||
* 退款单号
|
||||
*/
|
||||
private String refundNo;
|
||||
|
||||
/**
|
||||
* 旧的退款状态
|
||||
*/
|
||||
private RefundStatus oldRefundStatus;
|
||||
|
||||
/**
|
||||
* 新的退款状态
|
||||
*/
|
||||
private RefundStatus newRefundStatus;
|
||||
|
||||
/**
|
||||
* 退款金额
|
||||
*/
|
||||
private BigDecimal refundAmount;
|
||||
|
||||
/**
|
||||
* 变更时间
|
||||
*/
|
||||
private Date changeTime;
|
||||
|
||||
/**
|
||||
* 变更原因
|
||||
*/
|
||||
private String changeReason;
|
||||
|
||||
/**
|
||||
* 操作人ID
|
||||
*/
|
||||
private Long operatorId;
|
||||
|
||||
public RefundStatusChangeEvent(Long orderId, String orderNo, Long refundId, String refundNo,
|
||||
RefundStatus oldStatus, RefundStatus newStatus,
|
||||
BigDecimal refundAmount, String changeReason, Long operatorId) {
|
||||
this.orderId = orderId;
|
||||
this.orderNo = orderNo;
|
||||
this.refundId = refundId;
|
||||
this.refundNo = refundNo;
|
||||
this.oldRefundStatus = oldStatus;
|
||||
this.newRefundStatus = newStatus;
|
||||
this.refundAmount = refundAmount;
|
||||
this.changeReason = changeReason;
|
||||
this.operatorId = operatorId;
|
||||
this.changeTime = new Date();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
package com.ycwl.basic.order.event.impl;
|
||||
|
||||
import com.ycwl.basic.order.event.*;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import jakarta.annotation.Resource;
|
||||
|
||||
/**
|
||||
* 支付状态变更监听器示例
|
||||
* 应用启动后自动注册到事件管理器
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class PaymentStatusChangeListener implements OrderEventListener {
|
||||
|
||||
@Resource
|
||||
private OrderEventManager orderEventManager;
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
// 应用启动后自动注册到事件管理器
|
||||
orderEventManager.registerListener(this);
|
||||
log.info("支付状态变更监听器注册完成");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPaymentStatusChanged(PaymentStatusChangeEvent event) {
|
||||
log.info("处理支付状态变更事件: orderId={}, orderNo={}, {} -> {}, reason={}",
|
||||
event.getOrderId(), event.getOrderNo(),
|
||||
event.getOldPaymentStatus(), event.getNewPaymentStatus(),
|
||||
event.getChangeReason());
|
||||
|
||||
// 根据支付状态执行相应的业务逻辑
|
||||
switch (event.getNewPaymentStatus()) {
|
||||
case PAID:
|
||||
handlePaymentSuccess(event);
|
||||
break;
|
||||
case REFUNDED:
|
||||
handlePaymentRefunded(event);
|
||||
break;
|
||||
case UNPAID:
|
||||
handlePaymentPending(event);
|
||||
break;
|
||||
default:
|
||||
log.warn("未处理的支付状态: {}", event.getNewPaymentStatus());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRefundStatusChanged(RefundStatusChangeEvent event) {
|
||||
log.info("处理退款状态变更事件: orderId={}, refundId={}, {} -> {}",
|
||||
event.getOrderId(), event.getRefundId(),
|
||||
event.getOldRefundStatus(), event.getNewRefundStatus());
|
||||
|
||||
// 可以在这里添加退款相关的业务逻辑
|
||||
// 比如发送通知、更新库存等
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOrderStatusChanged(OrderStatusChangeEvent event) {
|
||||
log.info("处理订单状态变更事件: orderId={}, {} -> {}",
|
||||
event.getOrderId(), event.getOldOrderStatus(), event.getNewOrderStatus());
|
||||
|
||||
// 可以在这里添加订单状态相关的业务逻辑
|
||||
// 比如发送用户通知、触发后续流程等
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理支付成功事件
|
||||
*/
|
||||
private void handlePaymentSuccess(PaymentStatusChangeEvent event) {
|
||||
log.info("处理支付成功: orderId={}", event.getOrderId());
|
||||
|
||||
// 这里可以添加支付成功后的业务逻辑:
|
||||
// 1. 发送支付成功通知
|
||||
// 2. 更新商品库存
|
||||
// 3. 生成相关凭证
|
||||
// 4. 发送短信/邮件通知
|
||||
// 5. 启动履约流程
|
||||
|
||||
// 示例:记录支付成功日志
|
||||
log.info("订单支付成功处理完成: orderId={}, changeTime={}",
|
||||
event.getOrderId(), event.getChangeTime());
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理支付退款事件
|
||||
*/
|
||||
private void handlePaymentRefunded(PaymentStatusChangeEvent event) {
|
||||
log.info("处理支付退款: orderId={}", event.getOrderId());
|
||||
|
||||
// 这里可以添加支付退款后的业务逻辑:
|
||||
// 1. 恢复商品库存
|
||||
// 2. 取消相关服务
|
||||
// 3. 发送退款通知
|
||||
// 4. 更新会员积分
|
||||
|
||||
// 示例:记录退款处理日志
|
||||
log.info("订单退款处理完成: orderId={}, changeTime={}",
|
||||
event.getOrderId(), event.getChangeTime());
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理支付待处理事件
|
||||
*/
|
||||
private void handlePaymentPending(PaymentStatusChangeEvent event) {
|
||||
log.info("处理支付待处理: orderId={}", event.getOrderId());
|
||||
|
||||
// 这里可以添加支付待处理的业务逻辑:
|
||||
// 1. 设置支付超时提醒
|
||||
// 2. 预留库存
|
||||
// 3. 发送支付提醒
|
||||
|
||||
// 示例:记录待支付处理日志
|
||||
log.info("订单待支付处理完成: orderId={}, changeTime={}",
|
||||
event.getOrderId(), event.getChangeTime());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user