feat(order): 新增订单管理功能 V2

- 新增订单创建、查询、备注更新、申请退款等接口
- 添加订单相关实体类和枚举类
- 实现订单事件监听器,处理支付、退款、订单状态变化
- 优化移动端订单创建逻辑,集成订单服务
This commit is contained in:
2025-08-28 18:42:47 +08:00
parent af79a5ffa6
commit e95e0a04ff
28 changed files with 2515 additions and 12 deletions

View File

@@ -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);
}

View 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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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());
}
}