diff --git a/jzo2o-oreders/jzo2o-orders-base/src/main/java/com/jzo2o/orders/base/model/domain/OrdersRefund.java b/jzo2o-oreders/jzo2o-orders-base/src/main/java/com/jzo2o/orders/base/model/domain/OrdersRefund.java
index b1fbb73..889e9f1 100644
--- a/jzo2o-oreders/jzo2o-orders-base/src/main/java/com/jzo2o/orders/base/model/domain/OrdersRefund.java
+++ b/jzo2o-oreders/jzo2o-orders-base/src/main/java/com/jzo2o/orders/base/model/domain/OrdersRefund.java
@@ -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;
+
/**
*
* 订单退款表
@@ -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;
-
-
-}
+}
\ No newline at end of file
diff --git a/jzo2o-oreders/jzo2o-orders-base/src/main/java/com/jzo2o/orders/base/model/dto/OrderUpdateStatusDTO.java b/jzo2o-oreders/jzo2o-orders-base/src/main/java/com/jzo2o/orders/base/model/dto/OrderUpdateStatusDTO.java
index be60f36..be34b9f 100644
--- a/jzo2o-oreders/jzo2o-orders-base/src/main/java/com/jzo2o/orders/base/model/dto/OrderUpdateStatusDTO.java
+++ b/jzo2o-oreders/jzo2o-orders-base/src/main/java/com/jzo2o/orders/base/model/dto/OrderUpdateStatusDTO.java
@@ -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;
-}
+}
\ No newline at end of file
diff --git a/jzo2o-oreders/jzo2o-orders-base/src/main/java/com/jzo2o/orders/base/service/impl/OrdersCommonServiceImpl.java b/jzo2o-oreders/jzo2o-orders-base/src/main/java/com/jzo2o/orders/base/service/impl/OrdersCommonServiceImpl.java
index fa38736..3077b6d 100644
--- a/jzo2o-oreders/jzo2o-orders-base/src/main/java/com/jzo2o/orders/base/service/impl/OrdersCommonServiceImpl.java
+++ b/jzo2o-oreders/jzo2o-orders-base/src/main/java/com/jzo2o/orders/base/service/impl/OrdersCommonServiceImpl.java
@@ -31,6 +31,8 @@ public class OrdersCommonServiceImpl extends ServiceImpl 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();
}
}
\ No newline at end of file
diff --git a/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/controller/consumer/ConsumerOrdersController.java b/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/controller/consumer/ConsumerOrdersController.java
index e05dc99..af8ae55 100644
--- a/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/controller/consumer/ConsumerOrdersController.java
+++ b/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/controller/consumer/ConsumerOrdersController.java
@@ -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())
diff --git a/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/job/OrderCancelJob.java b/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/job/OrderCancelJob.java
index faaa839..ce905c1 100644
--- a/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/job/OrderCancelJob.java
+++ b/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/job/OrderCancelJob.java
@@ -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 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 refundRecords = ordersRefundService.queryRefundOrderListByCount(100);
+ if (CollUtils.isEmpty(refundRecords)) {
+ log.info("没有正在退款的订单");
+ }
+
+ transactionTemplate.executeWithoutResult(status ->
+ refundRecords.forEach(ordersRefundService::refundOrderByRefundRecord));
}
}
\ No newline at end of file
diff --git a/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/IOrdersCanceledService.java b/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/IOrdersCanceledService.java
index 45c90c3..b198b72 100644
--- a/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/IOrdersCanceledService.java
+++ b/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/IOrdersCanceledService.java
@@ -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;
/**
*
@@ -12,5 +13,14 @@ import com.jzo2o.orders.base.model.domain.OrdersCanceled;
* @since 2023-08-19
*/
public interface IOrdersCanceledService extends IService {
+ /**
+ * 取消订单
+ */
+ void cancel(OrderCancelDTO orderCancelDTO);
-}
+ /**
+ * 系统取消超时订单(无前置判断)
+ *
仅内部使用!!!
+ */
+ void cancelPayOverTimeOrder(Long id);
+}
\ No newline at end of file
diff --git a/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/IOrdersManagerService.java b/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/IOrdersManagerService.java
index ff70fd8..c786e06 100644
--- a/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/IOrdersManagerService.java
+++ b/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/IOrdersManagerService.java
@@ -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 {
*/
void evaluationOrder(Long ordersId);
- /**
- * 取消订单
- */
- void cancel(OrderCancelDTO orderCancelDTO);
-
- /**
- * 系统取消超时订单(无前置判断)
- *
仅内部使用!!!
- */
- void cancelPayOverTimeOrder(Long id);
-
/**
* 获取支付超时订单
* @param count 订单数量
diff --git a/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/IOrdersRefundService.java b/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/IOrdersRefundService.java
index 6707a4b..35bd880 100644
--- a/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/IOrdersRefundService.java
+++ b/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/IOrdersRefundService.java
@@ -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 {
* @param count 数量
*/
List queryRefundOrderListByCount(Integer count);
-}
+
+ /**
+ * 保存退款记录信息
+ *
仅供内部使用!!!
+ */
+ boolean saveRefundInfo(OrderCancelDTO orderRefundInfo);
+
+ /**
+ * 通过订单退款信息退款(内部无校验)
+ *
仅供内部使用!!!
+ */
+ void refundOrderByRefundRecord(OrdersRefund refundRecord);
+}
\ No newline at end of file
diff --git a/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/impl/OrdersCanceledServiceImpl.java b/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/impl/OrdersCanceledServiceImpl.java
index bbdf8e3..659abf0 100644
--- a/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/impl/OrdersCanceledServiceImpl.java
+++ b/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/impl/OrdersCanceledServiceImpl.java
@@ -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;
/**
*
- * 订单取消服务实现类
+ * 订单取消服务实现类
*
- *
* @author itcast
* @since 2023-08-19
*/
@Service
public class OrdersCanceledServiceImpl extends ServiceImpl 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()));
+ }
+}
\ No newline at end of file
diff --git a/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/impl/OrdersManagerServiceImpl.java b/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/impl/OrdersManagerServiceImpl.java
index 9b81f40..c3519fe 100644
--- a/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/impl/OrdersManagerServiceImpl.java
+++ b/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/impl/OrdersManagerServiceImpl.java
@@ -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 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
// 订单超过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
// 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 getPayOverTimeOrder(Integer count) {
return lambdaQuery()
@@ -177,47 +136,4 @@ public class OrdersManagerServiceImpl extends ServiceImpl
.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;
- }
}
\ No newline at end of file
diff --git a/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/impl/OrdersRefundServiceImpl.java b/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/impl/OrdersRefundServiceImpl.java
index d959208..2f4bb5d 100644
--- a/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/impl/OrdersRefundServiceImpl.java
+++ b/jzo2o-oreders/jzo2o-orders-manager/src/main/java/com/jzo2o/orders/manager/service/impl/OrdersRefundServiceImpl.java
@@ -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;
/**
*
* 订单退款表 服务实现类
*
- *
* @author itcast
* @since 2023-09-07
*/
@Service
public class OrdersRefundServiceImpl extends ServiceImpl implements IOrdersRefundService {
+ @Resource
+ private RefundRecordApi refundApi;
+ @Resource
+ private IOrdersCommonService ordersCommonService;
+ @Resource
+ private TransactionTemplate transactionTemplate;
/**
* 查询指定数量的退款订单
- *
* @param count 数量
*/
@Override
+ @SuppressWarnings("unchecked")
public List queryRefundOrderListByCount(Integer count) {
- LambdaQueryWrapper queryWrapper = Wrappers.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("更新订单状态失败");
+ }
+ });
+ }
+ }
+}
\ No newline at end of file