feat/refactor(orders.manager):新增取消派单中的订单的功能, 整合相关取消订单功能的代码到取消订单业务类
This commit is contained in:
parent
f3604d9830
commit
e78ff52701
@ -1,15 +1,17 @@
|
||||
package com.jzo2o.orders.base.model.domain;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import java.time.LocalDateTime;
|
||||
import java.io.Serializable;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 订单退款表
|
||||
@ -19,6 +21,7 @@ import lombok.experimental.Accessors;
|
||||
* @since 2023-09-07
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
@Accessors(chain = true)
|
||||
@TableName("orders_refund")
|
||||
@ -46,6 +49,4 @@ public class OrdersRefund implements Serializable {
|
||||
* 创建时间
|
||||
*/
|
||||
private LocalDateTime createTime;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@ -31,6 +31,7 @@ public class OrderUpdateStatusDTO {
|
||||
* 支付状态
|
||||
*/
|
||||
private Integer payStatus;
|
||||
|
||||
/**
|
||||
* 退款状态
|
||||
*/
|
||||
@ -56,6 +57,16 @@ public class OrderUpdateStatusDTO {
|
||||
*/
|
||||
private String transactionId;
|
||||
|
||||
/**
|
||||
* 支付服务退款单号
|
||||
*/
|
||||
private Long refundNo;
|
||||
|
||||
/**
|
||||
* 第三方支付的退款单号
|
||||
*/
|
||||
private String refundId;
|
||||
|
||||
/**
|
||||
* 支付渠道
|
||||
*/
|
||||
@ -70,4 +81,4 @@ public class OrderUpdateStatusDTO {
|
||||
* 评价状态
|
||||
*/
|
||||
private Integer evaluationStatus;
|
||||
}
|
||||
}
|
||||
@ -31,6 +31,8 @@ public class OrdersCommonServiceImpl extends ServiceImpl<OrdersMapper, Orders> i
|
||||
.set(ObjectUtil.isNotNull(orderUpdateStatusReqDTO.getTransactionId()), Orders::getTransactionId, orderUpdateStatusReqDTO.getTransactionId())
|
||||
.set(ObjectUtil.isNotNull(orderUpdateStatusReqDTO.getTradingChannel()), Orders::getTradingChannel, orderUpdateStatusReqDTO.getTradingChannel())
|
||||
.set(ObjectUtil.isNotNull(orderUpdateStatusReqDTO.getRefundStatus()), Orders::getRefundStatus, orderUpdateStatusReqDTO.getRefundStatus())
|
||||
.set(ObjectUtil.isNotNull(orderUpdateStatusReqDTO.getRefundNo()), Orders::getRefundNo, orderUpdateStatusReqDTO.getRefundNo())
|
||||
.set(ObjectUtil.isNotNull(orderUpdateStatusReqDTO.getRefundId()), Orders::getRefundId, orderUpdateStatusReqDTO.getRefundId())
|
||||
.update();
|
||||
}
|
||||
}
|
||||
@ -12,6 +12,7 @@ import com.jzo2o.orders.manager.model.dto.request.OrdersPayReqDTO;
|
||||
import com.jzo2o.orders.manager.model.dto.request.PlaceOrderReqDTO;
|
||||
import com.jzo2o.orders.manager.model.dto.response.OrdersPayResDTO;
|
||||
import com.jzo2o.orders.manager.model.dto.response.PlaceOrderResDTO;
|
||||
import com.jzo2o.orders.manager.service.IOrdersCanceledService;
|
||||
import com.jzo2o.orders.manager.service.IOrdersCreateService;
|
||||
import com.jzo2o.orders.manager.service.IOrdersManagerService;
|
||||
import io.swagger.annotations.Api;
|
||||
@ -30,11 +31,12 @@ import java.util.List;
|
||||
@Api(tags = "用户端 - 订单相关接口")
|
||||
@RequestMapping("/consumer/orders")
|
||||
public class ConsumerOrdersController {
|
||||
@Resource
|
||||
private IOrdersManagerService ordersManagerService;
|
||||
|
||||
@Resource
|
||||
private IOrdersCreateService ordersCreateService;
|
||||
@Resource
|
||||
private IOrdersManagerService ordersManagerService;
|
||||
@Resource
|
||||
private IOrdersCanceledService ordersCanceledService;
|
||||
|
||||
@GetMapping("/{id}")
|
||||
@ApiOperation("根据订单id查询")
|
||||
@ -94,7 +96,7 @@ public class ConsumerOrdersController {
|
||||
throw new RequestUnauthorizedException("无法获取当前用户信息");
|
||||
}
|
||||
|
||||
ordersManagerService.cancel(OrderCancelDTO.builder()
|
||||
ordersCanceledService.cancel(OrderCancelDTO.builder()
|
||||
.id(orderCancelReqDTO.getId())
|
||||
.cancelReason(orderCancelReqDTO.getCancelReason())
|
||||
.currentUserId(currentUser.getId())
|
||||
|
||||
@ -2,9 +2,12 @@ package com.jzo2o.orders.manager.job;
|
||||
|
||||
import com.jzo2o.common.utils.CollUtils;
|
||||
import com.jzo2o.orders.base.model.domain.Orders;
|
||||
import com.jzo2o.orders.base.model.domain.OrdersRefund;
|
||||
import com.jzo2o.orders.manager.service.IOrdersCanceledService;
|
||||
import com.jzo2o.orders.manager.service.IOrdersManagerService;
|
||||
import com.xxl.job.core.context.XxlJobHelper;
|
||||
import com.jzo2o.orders.manager.service.IOrdersRefundService;
|
||||
import com.xxl.job.core.handler.annotation.XxlJob;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.support.TransactionTemplate;
|
||||
|
||||
@ -15,24 +18,40 @@ import java.util.List;
|
||||
* 自动轮询取消订单
|
||||
* @author JIAN
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@SuppressWarnings("unused")
|
||||
public class OrderCancelJob {
|
||||
@Resource
|
||||
private IOrdersManagerService ordersManagerService;
|
||||
@Resource
|
||||
private IOrdersRefundService ordersRefundService;
|
||||
@Resource
|
||||
private IOrdersCanceledService ordersCanceledService;
|
||||
@Resource
|
||||
private TransactionTemplate transactionTemplate;
|
||||
|
||||
@XxlJob("cancelPayOverTimeOrder")
|
||||
public void cancelPayOverTimeOrder() {
|
||||
List<Orders> orderList = ordersManagerService.getPayOverTimeOrder(100);
|
||||
if (CollUtils.isEmpty(orderList)) {
|
||||
XxlJobHelper.log("没有超时订单");
|
||||
log.info("没有超时订单");
|
||||
return;
|
||||
}
|
||||
|
||||
// 取消所有超时未支付订单
|
||||
transactionTemplate.executeWithoutResult(status ->
|
||||
orderList.forEach(order -> ordersManagerService.cancelPayOverTimeOrder(order.getId())));
|
||||
orderList.forEach(order -> ordersCanceledService.cancelPayOverTimeOrder(order.getId())));
|
||||
}
|
||||
|
||||
@XxlJob("handlerRefundOrder")
|
||||
public void handlerRefundOrder() {
|
||||
List<OrdersRefund> refundRecords = ordersRefundService.queryRefundOrderListByCount(100);
|
||||
if (CollUtils.isEmpty(refundRecords)) {
|
||||
log.info("没有正在退款的订单");
|
||||
}
|
||||
|
||||
transactionTemplate.executeWithoutResult(status ->
|
||||
refundRecords.forEach(ordersRefundService::refundOrderByRefundRecord));
|
||||
}
|
||||
}
|
||||
@ -2,6 +2,7 @@ package com.jzo2o.orders.manager.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.jzo2o.orders.base.model.domain.OrdersCanceled;
|
||||
import com.jzo2o.orders.manager.model.dto.OrderCancelDTO;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@ -12,5 +13,14 @@ import com.jzo2o.orders.base.model.domain.OrdersCanceled;
|
||||
* @since 2023-08-19
|
||||
*/
|
||||
public interface IOrdersCanceledService extends IService<OrdersCanceled> {
|
||||
/**
|
||||
* 取消订单
|
||||
*/
|
||||
void cancel(OrderCancelDTO orderCancelDTO);
|
||||
|
||||
}
|
||||
/**
|
||||
* 系统取消超时订单(无前置判断)
|
||||
* <br><b>仅内部使用!!!</b>
|
||||
*/
|
||||
void cancelPayOverTimeOrder(Long id);
|
||||
}
|
||||
@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.jzo2o.api.orders.dto.response.OrderResDTO;
|
||||
import com.jzo2o.api.orders.dto.response.OrderSimpleResDTO;
|
||||
import com.jzo2o.orders.base.model.domain.Orders;
|
||||
import com.jzo2o.orders.manager.model.dto.OrderCancelDTO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ -43,17 +42,6 @@ public interface IOrdersManagerService extends IService<Orders> {
|
||||
*/
|
||||
void evaluationOrder(Long ordersId);
|
||||
|
||||
/**
|
||||
* 取消订单
|
||||
*/
|
||||
void cancel(OrderCancelDTO orderCancelDTO);
|
||||
|
||||
/**
|
||||
* 系统取消超时订单(无前置判断)
|
||||
* <br><b>仅内部使用!!!</b>
|
||||
*/
|
||||
void cancelPayOverTimeOrder(Long id);
|
||||
|
||||
/**
|
||||
* 获取支付超时订单
|
||||
* @param count 订单数量
|
||||
|
||||
@ -2,6 +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 java.util.List;
|
||||
|
||||
@ -21,4 +22,16 @@ public interface IOrdersRefundService extends IService<OrdersRefund> {
|
||||
* @param count 数量
|
||||
*/
|
||||
List<OrdersRefund> queryRefundOrderListByCount(Integer count);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存退款记录信息
|
||||
* <br/><b>仅供内部使用!!!</b>
|
||||
*/
|
||||
boolean saveRefundInfo(OrderCancelDTO orderRefundInfo);
|
||||
|
||||
/**
|
||||
* 通过订单退款信息退款(内部无校验)
|
||||
* <br/><b>仅供内部使用!!!</b>
|
||||
*/
|
||||
void refundOrderByRefundRecord(OrdersRefund refundRecord);
|
||||
}
|
||||
@ -1,20 +1,150 @@
|
||||
package com.jzo2o.orders.manager.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
|
||||
import com.jzo2o.api.trade.TradingApi;
|
||||
import com.jzo2o.api.trade.dto.response.TradingResDTO;
|
||||
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.ObjectUtils;
|
||||
import com.jzo2o.orders.base.enums.OrderRefundStatusEnum;
|
||||
import com.jzo2o.orders.base.enums.OrderStatusEnum;
|
||||
import com.jzo2o.orders.base.mapper.OrdersCanceledMapper;
|
||||
import com.jzo2o.orders.base.model.domain.Orders;
|
||||
import com.jzo2o.orders.base.model.domain.OrdersCanceled;
|
||||
import com.jzo2o.orders.base.model.domain.OrdersRefund;
|
||||
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.IOrdersCanceledService;
|
||||
import com.jzo2o.orders.manager.service.IOrdersManagerService;
|
||||
import com.jzo2o.orders.manager.service.IOrdersRefundService;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.support.TransactionTemplate;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 订单取消服务实现类
|
||||
* 订单取消服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author itcast
|
||||
* @since 2023-08-19
|
||||
*/
|
||||
@Service
|
||||
public class OrdersCanceledServiceImpl extends ServiceImpl<OrdersCanceledMapper, OrdersCanceled> implements IOrdersCanceledService {
|
||||
@Resource
|
||||
private IOrdersCommonService ordersCommonService;
|
||||
@Resource
|
||||
private IOrdersManagerService ordersManagerService;
|
||||
@Resource
|
||||
private IOrdersRefundService ordersRefundService;
|
||||
@Resource
|
||||
private TransactionTemplate transactionTemplate;
|
||||
@Resource
|
||||
private TradingApi tradingApi;
|
||||
|
||||
}
|
||||
@Override
|
||||
public void cancel(OrderCancelDTO orderCancelDTO) {
|
||||
Long orderId = orderCancelDTO.getId();
|
||||
Orders orders = ordersManagerService.getById(orderId);
|
||||
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());
|
||||
|
||||
Integer ordersStatus = orders.getOrdersStatus();
|
||||
if (OrderStatusEnum.NO_PAY.getStatus().equals(ordersStatus)) {
|
||||
// 1. 未支付订单 -> 取消状态
|
||||
cancelNoPayOrder(orderCancelDTO);
|
||||
} else if (OrderStatusEnum.DISPATCHING.getStatus().equals(ordersStatus)) {
|
||||
// 2. 已支付订单 -> 关闭状态 + 退款
|
||||
cancelDispatchingOrder(orderCancelDTO);
|
||||
} else {
|
||||
throw new ForbiddenOperationException("订单无法取消");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancelPayOverTimeOrder(Long id) {
|
||||
// 二次确认防止在此期间支付
|
||||
TradingResDTO tradingResDTO = tradingApi.findTradResultByTradingOrderNo(id);
|
||||
if (ObjectUtils.isEmpty(tradingResDTO) || tradingResDTO.getTradingState() != TradingStateEnum.YJS) {
|
||||
cancelNoPayOrder(OrderCancelDTO.builder()
|
||||
.id(id)
|
||||
.cancelReason("订单超时未支付自动取消")
|
||||
.currentUserId(-1L)
|
||||
.currentUserName("SYSTEM")
|
||||
.currentUserType(UserType.SYSTEM)
|
||||
.build());
|
||||
}
|
||||
}
|
||||
|
||||
private void cancelNoPayOrder(OrderCancelDTO orderCancelDTO) {
|
||||
transactionTemplate.executeWithoutResult(status -> {
|
||||
if (!saveCancelInfo(orderCancelDTO)) {
|
||||
throw new DBException("订单取消表记录表更新失败");
|
||||
}
|
||||
|
||||
if (!ordersCommonService.updateStatus(OrderUpdateStatusDTO.builder()
|
||||
.id(orderCancelDTO.getId())
|
||||
.originStatus(OrderStatusEnum.NO_PAY.getStatus())
|
||||
.targetStatus(OrderStatusEnum.CANCELED.getStatus())
|
||||
.build())) {
|
||||
throw new DBException("订单表订单状态更新失败");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void cancelDispatchingOrder(OrderCancelDTO orderCancelDTO) {
|
||||
Long orderId = orderCancelDTO.getId();
|
||||
// 更新数据库信息
|
||||
// 1. 订单状态信息 2. 取消记录表 2. 退款记录表
|
||||
transactionTemplate.executeWithoutResult(status -> {
|
||||
if (!saveCancelInfo(orderCancelDTO)) {
|
||||
throw new DBException("订单取消记录表更新失败");
|
||||
}
|
||||
|
||||
if (!ordersRefundService.saveRefundInfo(orderCancelDTO)) {
|
||||
throw new DBException("订单退款记录表更新失败");
|
||||
}
|
||||
|
||||
if (!ordersCommonService.updateStatus(OrderUpdateStatusDTO.builder()
|
||||
.id(orderId)
|
||||
.originStatus(OrderStatusEnum.DISPATCHING.getStatus())
|
||||
.targetStatus(OrderStatusEnum.CLOSED.getStatus())
|
||||
.refundStatus(OrderRefundStatusEnum.REFUNDING.getStatus())
|
||||
.build())) {
|
||||
throw new DBException("订单表订单状态更新失败");
|
||||
}
|
||||
});
|
||||
|
||||
// 启动新线程执行退款任务
|
||||
new Thread(() -> ordersRefundService
|
||||
.refundOrderByRefundRecord(OrdersRefund.builder()
|
||||
.id(orderId)
|
||||
.tradingOrderNo(orderCancelDTO.getTradingOrderNo())
|
||||
.realPayAmount(orderCancelDTO.getRealPayAmount())
|
||||
.build()))
|
||||
.start();
|
||||
}
|
||||
|
||||
private Boolean saveCancelInfo(OrderCancelDTO orderCancelInfo) {
|
||||
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())
|
||||
.build()));
|
||||
}
|
||||
}
|
||||
@ -8,27 +8,17 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.jzo2o.api.orders.dto.response.OrderResDTO;
|
||||
import com.jzo2o.api.orders.dto.response.OrderSimpleResDTO;
|
||||
import com.jzo2o.api.trade.TradingApi;
|
||||
import com.jzo2o.api.trade.dto.response.TradingResDTO;
|
||||
import com.jzo2o.api.trade.enums.TradingStateEnum;
|
||||
import com.jzo2o.common.constants.UserType;
|
||||
import com.jzo2o.common.enums.EnableStatusEnum;
|
||||
import com.jzo2o.common.expcetions.DBException;
|
||||
import com.jzo2o.common.expcetions.ForbiddenOperationException;
|
||||
import com.jzo2o.common.utils.ObjectUtils;
|
||||
import com.jzo2o.orders.base.enums.OrderStatusEnum;
|
||||
import com.jzo2o.orders.base.mapper.OrdersMapper;
|
||||
import com.jzo2o.orders.base.model.domain.Orders;
|
||||
import com.jzo2o.orders.base.model.domain.OrdersCanceled;
|
||||
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.IOrdersCanceledService;
|
||||
import com.jzo2o.orders.manager.service.IOrdersManagerService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.transaction.support.TransactionTemplate;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDateTime;
|
||||
@ -46,14 +36,8 @@ import static com.jzo2o.orders.base.constants.FieldConstants.SORT_BY;
|
||||
@Slf4j
|
||||
@Service
|
||||
public class OrdersManagerServiceImpl extends ServiceImpl<OrdersMapper, Orders> implements IOrdersManagerService {
|
||||
@Resource
|
||||
private IOrdersCommonService ordersCommonService;
|
||||
@Resource
|
||||
private IOrdersCanceledService ordersCanceledService;
|
||||
@Resource
|
||||
private TransactionTemplate transactionTemplate;
|
||||
@Resource
|
||||
private TradingApi tradingApi;
|
||||
|
||||
/**
|
||||
* 订单超时时间
|
||||
@ -109,7 +93,7 @@ public class OrdersManagerServiceImpl extends ServiceImpl<OrdersMapper, Orders>
|
||||
// 订单超过15分钟未支付则自动取消
|
||||
if (OrderStatusEnum.NO_PAY.getStatus().equals(orders.getOrdersStatus())
|
||||
&& orders.getCreateTime().isBefore(LocalDateTime.now().minusMinutes(PAY_OVERTIME_MINUTE))) {
|
||||
cancelPayOverTimeOrder(id);
|
||||
ordersCanceledService.cancelPayOverTimeOrder(id);
|
||||
orderResDTO.setOrdersStatus(OrderStatusEnum.CANCELED.getStatus());
|
||||
}
|
||||
|
||||
@ -144,31 +128,6 @@ public class OrdersManagerServiceImpl extends ServiceImpl<OrdersMapper, Orders>
|
||||
// orderStateMachine.changeStatus(orders.getUserId(), orders.getId().toString(), OrderStatusChangeEventEnum.EVALUATE, orderSnapshotDTO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancel(OrderCancelDTO orderCancelDTO) {
|
||||
Long orderId = orderCancelDTO.getId();
|
||||
Orders orders = baseMapper.selectById(orderId);
|
||||
if (ObjectUtils.isEmpty(orders)) {
|
||||
throw new ForbiddenOperationException("订单不存在无法取消");
|
||||
}
|
||||
// 补充前端无法确定的字段
|
||||
orderCancelDTO.setServeStartTime(orders.getServeStartTime());
|
||||
orderCancelDTO.setRealPayAmount(orders.getRealPayAmount());
|
||||
orderCancelDTO.setCityCode(orders.getCityCode());
|
||||
orderCancelDTO.setTradingOrderNo(orders.getTradingOrderNo());
|
||||
|
||||
Integer ordersStatus = orders.getOrdersStatus();
|
||||
if (OrderStatusEnum.NO_PAY.getStatus().equals(ordersStatus)) {
|
||||
// 1. 未支付订单 -> 取消状态
|
||||
cancelNoPayOrder(orderCancelDTO);
|
||||
} else if (OrderStatusEnum.DISPATCHING.getStatus().equals(ordersStatus)) {
|
||||
// 2. 已支付订单 -> 关闭状态 + 退款
|
||||
cancelDispatchingOrder(orderCancelDTO);
|
||||
} else {
|
||||
throw new ForbiddenOperationException("订单无法取消");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Orders> getPayOverTimeOrder(Integer count) {
|
||||
return lambdaQuery()
|
||||
@ -177,47 +136,4 @@ public class OrdersManagerServiceImpl extends ServiceImpl<OrdersMapper, Orders>
|
||||
.last("LIMIT " + count)
|
||||
.list();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancelPayOverTimeOrder(Long id) {
|
||||
// 二次确认防止在此期间支付
|
||||
TradingResDTO tradingResDTO = tradingApi.findTradResultByTradingOrderNo(id);
|
||||
if (ObjectUtils.isEmpty(tradingResDTO) || tradingResDTO.getTradingState() != TradingStateEnum.YJS) {
|
||||
cancelNoPayOrder(OrderCancelDTO.builder()
|
||||
.id(id)
|
||||
.cancelReason("订单超时未支付自动取消")
|
||||
.currentUserId(-1L)
|
||||
.currentUserName("SYSTEM")
|
||||
.currentUserType(UserType.SYSTEM)
|
||||
.build());
|
||||
}
|
||||
}
|
||||
|
||||
private void cancelNoPayOrder(OrderCancelDTO orderCancelDTO) {
|
||||
Long orderId = orderCancelDTO.getId();
|
||||
transactionTemplate.executeWithoutResult(status -> {
|
||||
if (!ordersCanceledService.save(OrdersCanceled.builder()
|
||||
.id(orderId)
|
||||
.cancellerId(orderCancelDTO.getCurrentUserId())
|
||||
.cancelerName(orderCancelDTO.getCurrentUserName())
|
||||
.cancellerType(orderCancelDTO.getCurrentUserType())
|
||||
.cancelReason(orderCancelDTO.getCancelReason())
|
||||
.cancelTime(LocalDateTime.now())
|
||||
.build())) {
|
||||
throw new DBException("订单取消表更新失败");
|
||||
}
|
||||
|
||||
if (!ordersCommonService.updateStatus(OrderUpdateStatusDTO.builder()
|
||||
.id(orderId)
|
||||
.originStatus(OrderStatusEnum.NO_PAY.getStatus())
|
||||
.targetStatus(OrderStatusEnum.CANCELED.getStatus())
|
||||
.build())) {
|
||||
throw new DBException("订单表订单状态更新失败");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void cancelDispatchingOrder(OrderCancelDTO orderCancelDTO) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -1,36 +1,94 @@
|
||||
package com.jzo2o.orders.manager.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
|
||||
import com.jzo2o.api.trade.RefundRecordApi;
|
||||
import com.jzo2o.api.trade.dto.response.ExecutionResultResDTO;
|
||||
import com.jzo2o.api.trade.enums.RefundStatusEnum;
|
||||
import com.jzo2o.common.expcetions.DBException;
|
||||
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.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;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 订单退款表 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author itcast
|
||||
* @since 2023-09-07
|
||||
*/
|
||||
@Service
|
||||
public class OrdersRefundServiceImpl extends ServiceImpl<OrdersRefundMapper, OrdersRefund> implements IOrdersRefundService {
|
||||
@Resource
|
||||
private RefundRecordApi refundApi;
|
||||
@Resource
|
||||
private IOrdersCommonService ordersCommonService;
|
||||
@Resource
|
||||
private TransactionTemplate transactionTemplate;
|
||||
|
||||
/**
|
||||
* 查询指定数量的退款订单
|
||||
*
|
||||
* @param count 数量
|
||||
*/
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<OrdersRefund> queryRefundOrderListByCount(Integer count) {
|
||||
LambdaQueryWrapper<OrdersRefund> queryWrapper = Wrappers.<OrdersRefund>lambdaQuery()
|
||||
return lambdaQuery()
|
||||
.orderByAsc(OrdersRefund::getCreateTime)
|
||||
.last("limit " + count);
|
||||
return baseMapper.selectList(queryWrapper);
|
||||
.last("limit " + count)
|
||||
.list();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean saveRefundInfo(OrderCancelDTO orderRefundInfo) {
|
||||
return SqlHelper.retBool(baseMapper.insert(OrdersRefund.builder()
|
||||
.id(orderRefundInfo.getId())
|
||||
.tradingOrderNo(orderRefundInfo.getTradingOrderNo())
|
||||
.realPayAmount(orderRefundInfo.getRealPayAmount())
|
||||
.build()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void refundOrderByRefundRecord(OrdersRefund refundRecord) {
|
||||
ExecutionResultResDTO executionResultResDTO;
|
||||
try {
|
||||
executionResultResDTO = refundApi.refundTrading(refundRecord.getTradingOrderNo(), refundRecord.getRealPayAmount());
|
||||
} catch (Exception e) {
|
||||
log.error("执行退款接口出错, 出错信息如下", e);
|
||||
return;
|
||||
}
|
||||
|
||||
Integer refundStatus = executionResultResDTO.getRefundStatus();
|
||||
if (ObjectUtils.isNotEmpty(executionResultResDTO) &&
|
||||
(RefundStatusEnum.SUCCESS.getCode().equals(refundStatus)
|
||||
|| RefundStatusEnum.FAIL.getCode().equals(refundStatus))) {
|
||||
// 退款成功/失败 1. 删除退款记录 2. 更新订单状态
|
||||
Long orderId = refundRecord.getId();
|
||||
transactionTemplate.executeWithoutResult(status -> {
|
||||
if (!SqlHelper.retBool(baseMapper.deleteById(orderId))) {
|
||||
throw new DBException("删除退款记录失败");
|
||||
}
|
||||
|
||||
if (!ordersCommonService.updateStatus(OrderUpdateStatusDTO.builder()
|
||||
.id(orderId)
|
||||
.targetStatus(OrderStatusEnum.CLOSED.getStatus())
|
||||
.refundStatus(refundStatus)
|
||||
.refundNo(executionResultResDTO.getRefundNo())
|
||||
.refundId(executionResultResDTO.getRefundId())
|
||||
.build())) {
|
||||
throw new DBException("更新订单状态失败");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user