fix(orders.manager):修复保存的订单快照信息不全的bug
This commit is contained in:
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
/**
|
||||
* 通过订单退款信息退款(内部无校验)
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user