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