fix(orders.manager):修复保存的订单快照信息不全的bug

This commit is contained in:
JIAN
2024-09-22 20:35:23 +08:00
parent b03c51e50a
commit bd63adf3c6
5 changed files with 60 additions and 68 deletions

View File

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
import com.jzo2o.api.trade.enums.TradingStateEnum;
import com.jzo2o.common.constants.MqConstants;
import com.jzo2o.common.model.msg.TradeStatusMsg;
import com.jzo2o.common.utils.BeanUtils;
import com.jzo2o.common.utils.CollUtils;
import com.jzo2o.orders.base.enums.OrderPayStatusEnum;
import com.jzo2o.orders.base.enums.OrderStatusChangeEventEnum;
@@ -11,6 +12,7 @@ import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.handler.OrderStateMachine;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import com.jzo2o.orders.manager.service.IOrdersCreateService;
import com.jzo2o.orders.manager.service.IOrdersManagerService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
@@ -36,6 +38,8 @@ public class TradeStatusListener {
private TransactionTemplate transactionTemplate;
@Resource
private OrderStateMachine orderStateMachine;
@Resource
private IOrdersManagerService ordersManagerService;
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = MqConstants.Queues.ORDERS_TRADE_UPDATE_STATUS),
@@ -59,16 +63,16 @@ public class TradeStatusListener {
for (TradeStatusMsg tradeStatusMsg : tradeStatusMsgList) {
// 构造订单快照
Long orderId = tradeStatusMsg.getProductOrderNo();
OrderSnapshotDTO orderSnapshotDTO = BeanUtils.toBean(ordersManagerService.getById(orderId), OrderSnapshotDTO.class);
orderSnapshotDTO.setOrdersStatus(OrderStatusEnum.DISPATCHING.getStatus());
orderSnapshotDTO.setPayStatus(OrderPayStatusEnum.PAY_SUCCESS.getStatus());
orderSnapshotDTO.setTradingOrderNo(tradeStatusMsg.getTradingOrderNo());
orderSnapshotDTO.setThirdOrderId(tradeStatusMsg.getTransactionId());
orderSnapshotDTO.setTradingChannel(tradeStatusMsg.getTradingChannel());
orderSnapshotDTO.setPayTime(LocalDateTime.now());
orderStateMachine.changeStatus(null, orderId.toString(),
OrderStatusChangeEventEnum.PAYED, OrderSnapshotDTO.builder()
.id(orderId)
.ordersStatus(OrderStatusEnum.DISPATCHING.getStatus())
.payStatus(OrderPayStatusEnum.PAY_SUCCESS.getStatus())
.tradingOrderNo(tradeStatusMsg.getTradingOrderNo())
.thirdOrderId(tradeStatusMsg.getTransactionId())
.tradingChannel(tradeStatusMsg.getTradingChannel())
.payTime(LocalDateTime.now())
.build());
OrderStatusChangeEventEnum.PAYED, orderSnapshotDTO);
}
});
}

View File

@@ -2,7 +2,7 @@ package com.jzo2o.orders.manager.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jzo2o.orders.base.model.domain.OrdersRefund;
import com.jzo2o.orders.manager.model.dto.OrderCancelDTO;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import java.util.List;
@@ -27,7 +27,7 @@ public interface IOrdersRefundService extends IService<OrdersRefund> {
* 保存退款记录信息
* <br/><b>仅供内部使用!!!</b>
*/
boolean saveRefundInfo(OrderCancelDTO orderRefundInfo);
boolean saveRefundInfo(OrderSnapshotDTO orderSnapshotDTO);
/**
* 通过订单退款信息退款(内部无校验)

View File

@@ -8,8 +8,8 @@ import com.jzo2o.api.trade.enums.TradingStateEnum;
import com.jzo2o.common.constants.UserType;
import com.jzo2o.common.expcetions.DBException;
import com.jzo2o.common.expcetions.ForbiddenOperationException;
import com.jzo2o.common.utils.BeanUtils;
import com.jzo2o.common.utils.ObjectUtils;
import com.jzo2o.orders.base.enums.OrderRefundStatusEnum;
import com.jzo2o.orders.base.enums.OrderStatusChangeEventEnum;
import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.handler.OrderStateMachine;
@@ -51,24 +51,27 @@ public class OrdersCanceledServiceImpl extends ServiceImpl<OrdersCanceledMapper,
@Override
public void cancel(OrderCancelDTO orderCancelDTO) {
Long orderId = orderCancelDTO.getId();
Orders orders = ordersManagerService.getById(orderId);
Orders orders = ordersManagerService.getById(orderCancelDTO.getId());
if (ObjectUtils.isEmpty(orders)) {
throw new ForbiddenOperationException("订单不存在无法取消");
}
// 补充前端无法确定的字段
orderCancelDTO.setServeStartTime(orders.getServeStartTime());
orderCancelDTO.setRealPayAmount(/*orders.getRealPayAmount() 测试统一使用0.01元*/ new BigDecimal("0.01"));
orderCancelDTO.setCityCode(orders.getCityCode());
orderCancelDTO.setTradingOrderNo(orders.getTradingOrderNo());
OrderSnapshotDTO orderSnapshotDTO = BeanUtils.toBean(orders, OrderSnapshotDTO.class);
orderSnapshotDTO.setCancelTime(LocalDateTime.now());
orderSnapshotDTO.setCancellerId(orderCancelDTO.getCurrentUserId());
orderSnapshotDTO.setCancelerName(orderCancelDTO.getCurrentUserName());
orderSnapshotDTO.setCancellerType(orderCancelDTO.getCurrentUserType());
orderSnapshotDTO.setCancelReason(orderCancelDTO.getCancelReason());
orderSnapshotDTO.setRealPayAmount(/*orders.getRealPayAmount() 测试统一使用0.01元*/ new BigDecimal("0.01"));
Integer ordersStatus = orders.getOrdersStatus();
if (OrderStatusEnum.NO_PAY.getStatus().equals(ordersStatus)) {
// 1. 未支付订单 -> 取消状态
cancelNoPayOrder(orderCancelDTO);
cancelNoPayOrder(orderSnapshotDTO);
} else if (OrderStatusEnum.DISPATCHING.getStatus().equals(ordersStatus)) {
// 2. 已支付订单 -> 关闭状态 + 退款
cancelDispatchingOrder(orderCancelDTO);
cancelDispatchingOrder(orderSnapshotDTO);
} else {
throw new ForbiddenOperationException("订单无法取消");
}
@@ -77,6 +80,7 @@ public class OrdersCanceledServiceImpl extends ServiceImpl<OrdersCanceledMapper,
@Override
public void cancelPayOverTimeOrder(Orders order) {
// 二次确认防止在此期间支付
order = ordersManagerService.getById(order.getId());
Long tradingOrderNo = order.getTradingOrderNo();
if (ObjectUtils.isNotEmpty(tradingOrderNo)) {
// 再次请求防止已支付
@@ -86,28 +90,20 @@ public class OrdersCanceledServiceImpl extends ServiceImpl<OrdersCanceledMapper,
}
}
cancelNoPayOrder(OrderCancelDTO.builder()
.id(order.getId())
.cancelReason("订单超时未支付自动取消")
.currentUserId(-1L)
.currentUserName("SYSTEM")
.currentUserType(UserType.SYSTEM)
.build());
OrderSnapshotDTO orderSnapshotDTO = BeanUtils.toBean(order, OrderSnapshotDTO.class);
orderSnapshotDTO.setCancellerId(-1L);
orderSnapshotDTO.setCancelerName("SYSTEM");
orderSnapshotDTO.setCancelReason("订单超时未支付自动取消");
orderSnapshotDTO.setCancellerType(UserType.SYSTEM);
orderSnapshotDTO.setCancelTime(LocalDateTime.now());
cancelNoPayOrder(orderSnapshotDTO);
}
private void cancelNoPayOrder(OrderCancelDTO orderCancelDTO) {
Long orderId = orderCancelDTO.getId();
OrderSnapshotDTO orderSnapshotDTO = OrderSnapshotDTO.builder()
.id(orderId)
.cancellerId(orderCancelDTO.getCurrentUserId())
.cancelerName(orderCancelDTO.getCurrentUserName())
.cancellerType(orderCancelDTO.getCurrentUserType())
.cancelTime(LocalDateTime.now())
.ordersStatus(OrderStatusEnum.CANCELED.getStatus())
.build();
private void cancelNoPayOrder(OrderSnapshotDTO orderSnapshotDTO) {
Long orderId = orderSnapshotDTO.getId();
transactionTemplate.executeWithoutResult(status -> {
if (!saveCancelInfo(orderCancelDTO)) {
if (!saveCancelInfo(orderSnapshotDTO)) {
throw new DBException("订单取消表记录表更新失败");
}
@@ -117,26 +113,17 @@ public class OrdersCanceledServiceImpl extends ServiceImpl<OrdersCanceledMapper,
});
}
private void cancelDispatchingOrder(OrderCancelDTO orderCancelDTO) {
Long orderId = orderCancelDTO.getId();
OrderSnapshotDTO orderSnapshotDTO = OrderSnapshotDTO.builder()
.id(orderId)
.cancellerId(orderCancelDTO.getCurrentUserId())
.cancelerName(orderCancelDTO.getCurrentUserName())
.cancellerType(orderCancelDTO.getCurrentUserType())
.cancelTime(LocalDateTime.now())
.ordersStatus(OrderStatusEnum.CLOSED.getStatus())
.refundStatus(OrderRefundStatusEnum.REFUNDING.getStatus())
.build();
private void cancelDispatchingOrder(OrderSnapshotDTO orderSnapshotDTO) {
Long orderId = orderSnapshotDTO.getId();
// 更新数据库信息
// 1. 订单状态信息 2. 取消记录表 2. 退款记录表
transactionTemplate.executeWithoutResult(status -> {
if (!saveCancelInfo(orderCancelDTO)) {
if (!saveCancelInfo(orderSnapshotDTO)) {
throw new DBException("订单取消记录表更新失败");
}
if (!ordersRefundService.saveRefundInfo(orderCancelDTO)) {
if (!ordersRefundService.saveRefundInfo(orderSnapshotDTO)) {
throw new DBException("订单退款记录表更新失败");
}
@@ -148,20 +135,20 @@ public class OrdersCanceledServiceImpl extends ServiceImpl<OrdersCanceledMapper,
new Thread(() -> ordersRefundService
.refundOrderByRefundRecord(OrdersRefund.builder()
.id(orderId)
.tradingOrderNo(orderCancelDTO.getTradingOrderNo())
.realPayAmount(orderCancelDTO.getRealPayAmount())
.tradingOrderNo(orderSnapshotDTO.getTradingOrderNo())
.realPayAmount(orderSnapshotDTO.getRealPayAmount())
.build()))
.start();
}
private Boolean saveCancelInfo(OrderCancelDTO orderCancelInfo) {
private Boolean saveCancelInfo(OrderSnapshotDTO orderSnapshotDTO) {
return SqlHelper.retBool(baseMapper.insert(OrdersCanceled.builder()
.id(orderCancelInfo.getId())
.cancellerId(orderCancelInfo.getCurrentUserId())
.cancelerName(orderCancelInfo.getCurrentUserName())
.cancellerType(orderCancelInfo.getCurrentUserType())
.cancelReason(orderCancelInfo.getCancelReason())
.cancelTime(LocalDateTime.now())
.id(orderSnapshotDTO.getId())
.cancellerId(orderSnapshotDTO.getCancellerId())
.cancelerName(orderSnapshotDTO.getCancelerName())
.cancellerType(orderSnapshotDTO.getCancellerType())
.cancelReason(orderSnapshotDTO.getCancelReason())
.cancelTime(orderSnapshotDTO.getCancelTime())
.build()));
}
}

View File

@@ -122,8 +122,8 @@ public class OrdersCreateServiceImpl extends ServiceImpl<OrdersMapper, Orders> i
.serveStartTime(serveStartTime)
.lon(address.getLon())
.lat(address.getLat())
.sortBy(sortColumn).build();
OrderSnapshotDTO orderSnapshotDTO = BeanUtils.toBean(orderToPay, OrderSnapshotDTO.class);
.sortBy(sortColumn)
.build();
// 减小事务管理的颗粒度
return new PlaceOrderResDTO(
@@ -132,7 +132,8 @@ public class OrdersCreateServiceImpl extends ServiceImpl<OrdersMapper, Orders> i
throw new CommonException("下单失败");
}
// 初始化订单状态机
orderStateMachine.start(null, orderId.toString(), orderSnapshotDTO);
orderStateMachine.start(null, orderId.toString(),
BeanUtils.toBean(baseMapper.selectById(orderId), OrderSnapshotDTO.class));
return orderToPay.getId();
}));
}

View File

@@ -10,9 +10,9 @@ import com.jzo2o.common.utils.ObjectUtils;
import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.mapper.OrdersRefundMapper;
import com.jzo2o.orders.base.model.domain.OrdersRefund;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import com.jzo2o.orders.base.model.dto.OrderUpdateStatusDTO;
import com.jzo2o.orders.base.service.IOrdersCommonService;
import com.jzo2o.orders.manager.model.dto.OrderCancelDTO;
import com.jzo2o.orders.manager.service.IOrdersRefundService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;
@@ -50,11 +50,11 @@ public class OrdersRefundServiceImpl extends ServiceImpl<OrdersRefundMapper, Ord
}
@Override
public boolean saveRefundInfo(OrderCancelDTO orderRefundInfo) {
public boolean saveRefundInfo(OrderSnapshotDTO orderSnapshotDTO) {
return SqlHelper.retBool(baseMapper.insert(OrdersRefund.builder()
.id(orderRefundInfo.getId())
.tradingOrderNo(orderRefundInfo.getTradingOrderNo())
.realPayAmount(orderRefundInfo.getRealPayAmount())
.id(orderSnapshotDTO.getId())
.tradingOrderNo(orderSnapshotDTO.getTradingOrderNo())
.realPayAmount(orderSnapshotDTO.getRealPayAmount())
.build()));
}