Commit 9812881094d4ff90e459bd5540df15cf6356c584
1 parent
0e5e6c7c
mall + pay:
1. 增加退款同步的 Job
Showing
7 changed files
with
89 additions
and
8 deletions
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
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
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 | * | ... | ... |