Commit 9812881094d4ff90e459bd5540df15cf6356c584

Authored by YunaiV
1 parent 0e5e6c7c

mall + pay:

1. 增加退款同步的 Job
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/refund/PayRefundMapper.java
... ... @@ -68,4 +68,8 @@ public interface PayRefundMapper extends BaseMapperX<PayRefundDO> {
68 68 .orderByDesc(PayRefundDO::getId));
69 69 }
70 70  
  71 + default List<PayRefundDO> selectListByStatus(Integer status) {
  72 + return selectList(PayRefundDO::getStatus, status);
  73 + }
  74 +
71 75 }
... ...
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/job/order/PayOrderSyncJob.java
... ... @@ -37,7 +37,7 @@ public class PayOrderSyncJob implements JobHandler {
37 37 public String execute(String param) {
38 38 LocalDateTime minCreateTime = LocalDateTime.now().minus(CREATE_TIME_DURATION_BEFORE);
39 39 int count = orderService.syncOrder(minCreateTime);
40   - return StrUtil.format("同步订单 {} 个", count);
  40 + return StrUtil.format("同步支付订单 {} 个", count);
41 41 }
42 42  
43 43 }
... ...
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/job/package-info.java deleted
1   -/**
2   - * 占位,无特殊含义
3   - */
4   -package cn.iocoder.yudao.module.pay.job;
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/job/refund/PayRefundSyncJob.java 0 → 100644
  1 +package cn.iocoder.yudao.module.pay.job.refund;
  2 +
  3 +import cn.hutool.core.util.StrUtil;
  4 +import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
  5 +import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
  6 +import cn.iocoder.yudao.module.pay.service.refund.PayRefundService;
  7 +import org.springframework.stereotype.Component;
  8 +
  9 +import javax.annotation.Resource;
  10 +
  11 +/**
  12 + * 退款订单的同步 Job
  13 + *
  14 + * 由于退款订单的状态,是由支付渠道异步通知进行同步,考虑到异步通知可能会失败(小概率),所以需要定时进行同步。
  15 + *
  16 + * @author 芋道源码
  17 + */
  18 +@Component
  19 +@TenantJob
  20 +public class PayRefundSyncJob implements JobHandler {
  21 +
  22 + @Resource
  23 + private PayRefundService refundService;
  24 +
  25 + @Override
  26 + public String execute(String param) {
  27 + int count = refundService.syncRefund();
  28 + return StrUtil.format("同步退款订单 {} 个", count);
  29 + }
  30 +
  31 +}
... ...
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java
... ... @@ -450,7 +450,7 @@ public class PayOrderServiceImpl implements PayOrderService {
450 450 // 1.2 回调支付结果
451 451 notifyOrder(orderExtension.getChannelId(), respDTO);
452 452  
453   - // 2. 如果是已支付,则返回 1
  453 + // 2. 如果是已支付,则返回 true
454 454 return PayOrderStatusRespEnum.isSuccess(respDTO.getStatus());
455 455 } catch (Throwable e) {
456 456 log.error("[syncOrder][orderExtension({}) 同步支付状态异常]", orderExtension.getId(), e);
... ...
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundService.java
... ... @@ -64,4 +64,11 @@ public interface PayRefundService {
64 64 */
65 65 void notifyRefund(Long channelId, PayRefundRespDTO notify);
66 66  
  67 + /**
  68 + * 同步渠道退款的退款状态
  69 + *
  70 + * @return 同步到状态的退款数量,包括退款成功、退款失败
  71 + */
  72 + int syncRefund();
  73 +
67 74 }
... ...
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceImpl.java
1 1 package cn.iocoder.yudao.module.pay.service.refund;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
3 4 import cn.hutool.extra.spring.SpringUtil;
4 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 6 import cn.iocoder.yudao.framework.pay.core.client.PayClient;
... ... @@ -242,7 +243,7 @@ public class PayRefundServiceImpl implements PayRefundService {
242 243 // 2. 更新订单
243 244 orderService.updateOrderRefundPrice(refund.getOrderId(), refund.getRefundPrice());
244 245  
245   - // 3. 插入退款通知记录 TODO 芋艿:退款成功
  246 + // 3. 插入退款通知记录
246 247 notifyService.createPayNotifyTask(PayNotifyTaskCreateReqDTO.builder()
247 248 .type(PayNotifyTypeEnum.REFUND.getType()).dataId(refund.getId()).build());
248 249 }
... ... @@ -274,11 +275,53 @@ public class PayRefundServiceImpl implements PayRefundService {
274 275 }
275 276 log.info("[notifyRefundFailure][退款订单({}) 更新为退款失败]", refund.getId());
276 277  
277   - // 2. 插入退款通知记录 TODO 芋艿:退款失败
  278 + // 2. 插入退款通知记录
278 279 notifyService.createPayNotifyTask(PayNotifyTaskCreateReqDTO.builder()
279 280 .type(PayNotifyTypeEnum.REFUND.getType()).dataId(refund.getId()).build());
280 281 }
281 282  
  283 + @Override
  284 + public int syncRefund() {
  285 + // 1. 查询指定创建时间内的待退款订单
  286 + List<PayRefundDO> refunds = refundMapper.selectListByStatus(PayRefundStatusEnum.WAITING.getStatus());
  287 + if (CollUtil.isEmpty(refunds)) {
  288 + return 0;
  289 + }
  290 + // 2. 遍历执行
  291 + int count = 0;
  292 + for (PayRefundDO refund : refunds) {
  293 + count += syncRefund(refund) ? 1 : 0;
  294 + }
  295 + return count;
  296 + }
  297 +
  298 + /**
  299 + * 同步单个退款订单
  300 + *
  301 + * @param refund 退款订单
  302 + * @return 是否同步到
  303 + */
  304 + private boolean syncRefund(PayRefundDO refund) {
  305 + try {
  306 + // 1.1 查询退款订单信息
  307 + PayClient payClient = payClientFactory.getPayClient(refund.getChannelId());
  308 + if (payClient == null) {
  309 + log.error("[syncRefund][渠道编号({}) 找不到对应的支付客户端]", refund.getChannelId());
  310 + return false;
  311 + }
  312 + PayRefundRespDTO respDTO = payClient.getRefund(refund.getOrderNo(), refund.getNo());
  313 + // 1.2 回调退款结果
  314 + notifyRefund(refund.getChannelId(), respDTO);
  315 +
  316 + // 2. 如果同步到,则返回 true
  317 + return PayRefundStatusEnum.isSuccess(respDTO.getStatus())
  318 + || PayRefundStatusEnum.isFailure(respDTO.getStatus());
  319 + } catch (Throwable e) {
  320 + log.error("[syncRefund][refund({}) 同步退款状态异常]", refund.getId(), e);
  321 + return false;
  322 + }
  323 + }
  324 +
282 325 /**
283 326 * 获得自身的代理对象,解决 AOP 生效问题
284 327 *
... ...