From 133982ef031f2a1731335fdc01427c1ef4d0caca Mon Sep 17 00:00:00 2001 From: bootx Date: Thu, 22 Feb 2024 22:50:49 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E9=80=9A=E7=9F=A5=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=94=B6=E5=B0=BE,=20=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E8=B6=85=E6=97=B6=E4=BB=BB=E5=8A=A1=E6=94=B9?= =?UTF-8?q?=E4=B8=BAquartz=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/order/pay/entity/PayOrderExtra.java | 15 +++----- .../order/pay/service/PayOrderService.java | 2 +- .../notice/result/PayChannelResult.java | 8 +++-- .../notice/service/ClientNoticeService.java | 2 +- .../pay}/dao/PayExpiredTimeRepository.java | 2 +- .../payment/pay/service/PayAssistService.java | 11 +++--- .../pay}/service/PayExpiredTimeService.java | 4 +-- .../pay}/task/PayWaitOrderSyncTask.java | 4 +-- .../refund/service/RefundAssistService.java | 1 + .../repair/service/PayRepairService.java | 14 ++++---- .../repair/service/RefundRepairService.java | 3 ++ .../strategy/pay/CashPayRepairStrategy.java | 1 + .../daxpay/service/task/ClientNoticeTask.java | 36 +++++++++++++++++++ .../timeout => }/task/PayExpiredTimeTask.java | 25 +++++-------- 14 files changed, 79 insertions(+), 49 deletions(-) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/{timeout => payment/pay}/dao/PayExpiredTimeRepository.java (96%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/{timeout => payment/pay}/service/PayExpiredTimeService.java (92%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/{timeout => payment/pay}/task/PayWaitOrderSyncTask.java (92%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/ClientNoticeTask.java rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/{core/timeout => }/task/PayExpiredTimeTask.java (82%) diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/entity/PayOrderExtra.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/entity/PayOrderExtra.java index c8f1b0341..63d583e47 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/entity/PayOrderExtra.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/entity/PayOrderExtra.java @@ -37,15 +37,16 @@ public class PayOrderExtra extends MpBaseEntity implements EntityBaseFunction new DataNotExistException("支付订单不存在")); @@ -172,12 +171,14 @@ public class PayAssistService { String returnUrl = noticeInfo.getReturnUrl(); payOrderExtra.setReqTime(payParam.getReqTime()) + .setReqSignType(platformInfo.getSignType()) .setReqSign(payParam.getSign()) .setNotifyUrl(notifyUrl) .setReturnUrl(returnUrl) .setNoticeSign(apiInfo.isNoticeSign()) .setAttach(payParam.getAttach()) - .setClientIp(payParam.getClientIp()); + .setClientIp(payParam.getClientIp()) + .setReqId(requestInfo.getReqId()); return payOrderExtraManager.updateById(payOrderExtra); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/timeout/service/PayExpiredTimeService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/service/PayExpiredTimeService.java similarity index 92% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/timeout/service/PayExpiredTimeService.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/service/PayExpiredTimeService.java index 2b8bdf0ae..899582b9e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/timeout/service/PayExpiredTimeService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/service/PayExpiredTimeService.java @@ -1,10 +1,10 @@ -package cn.bootx.platform.daxpay.service.core.timeout.service; +package cn.bootx.platform.daxpay.service.core.payment.pay.service; import cn.bootx.platform.common.core.util.LocalDateTimeUtil; import cn.bootx.platform.common.spring.exception.RetryableException; import cn.bootx.platform.daxpay.code.PayStatusEnum; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrder; -import cn.bootx.platform.daxpay.service.core.timeout.dao.PayExpiredTimeRepository; +import cn.bootx.platform.daxpay.service.core.payment.pay.dao.PayExpiredTimeRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.retry.annotation.Retryable; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/timeout/task/PayWaitOrderSyncTask.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/task/PayWaitOrderSyncTask.java similarity index 92% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/timeout/task/PayWaitOrderSyncTask.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/task/PayWaitOrderSyncTask.java index c6fc54938..2cad28b01 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/timeout/task/PayWaitOrderSyncTask.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/task/PayWaitOrderSyncTask.java @@ -1,9 +1,9 @@ -package cn.bootx.platform.daxpay.service.core.timeout.task; +package cn.bootx.platform.daxpay.service.core.payment.pay.task; import cn.bootx.platform.common.core.exception.RepetitiveOperationException; import cn.bootx.platform.daxpay.param.pay.PaySyncParam; +import cn.bootx.platform.daxpay.service.core.payment.pay.dao.PayExpiredTimeRepository; import cn.bootx.platform.daxpay.service.core.payment.sync.service.PaySyncService; -import cn.bootx.platform.daxpay.service.core.timeout.dao.PayExpiredTimeRepository; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; import lombok.RequiredArgsConstructor; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundAssistService.java index 435266da8..1be8666ea 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundAssistService.java @@ -186,6 +186,7 @@ public class RefundAssistService { RefundOrderExtra refundOrderExtra = this.createRefundOrderExtra(refundParam, refundOrder.getId()); refundChannelOrders.forEach(r->r.setRefundId(refundOrder.getId())); + refundOrderExtraManager.save(refundOrderExtra); payRefundChannelOrderManager.saveAll(refundChannelOrders); return refundOrderManager.save(refundOrder); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/PayRepairService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/PayRepairService.java index d2780fc43..d867f692b 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/PayRepairService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/PayRepairService.java @@ -7,7 +7,6 @@ import cn.bootx.platform.daxpay.service.code.PayRepairWayEnum; import cn.bootx.platform.daxpay.service.code.PaymentTypeEnum; import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.service.core.order.pay.dao.PayChannelOrderManager; -import cn.bootx.platform.daxpay.service.core.order.pay.dao.PayOrderExtraManager; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrder; import cn.bootx.platform.daxpay.service.core.order.pay.service.PayOrderService; @@ -49,8 +48,6 @@ public class PayRepairService { private final PayRepairRecordService recordService; - private final PayOrderExtraManager payOrderExtraManager; - /** * 修复支付单 */ @@ -96,6 +93,12 @@ public class PayRepairService { } // 设置修复iD repairResult.setRepairNo(IdUtil.getSnowflakeNextIdStr()); + + // 发送通知 + List channelOrders = repairStrategies.stream() + .map(AbsPayRepairStrategy::getChannelOrder) + .collect(Collectors.toList()); + clientNoticeService.registerPayNotice(order, null, channelOrders); this.saveRecord(order, repairType, repairResult); return repairResult; } @@ -128,11 +131,6 @@ public class PayRepairService { // 读取支付网关中的时间 order.setPayTime(payTime); payOrderService.updateById(order); - List channelOrders = strategies.stream() - .map(AbsPayRepairStrategy::getChannelOrder) - .collect(Collectors.toList()); - // 发送通知 - clientNoticeService.registerPayNotice(order, null, channelOrders); } /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/RefundRepairService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/RefundRepairService.java index 5e086cbff..944eccc34 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/RefundRepairService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/RefundRepairService.java @@ -99,6 +99,9 @@ public class RefundRepairService { PayRepairRecord payRepairRecord = this.payRepairRecord(payOrder, repairType, repairResult); // 退款修复记录 PayRepairRecord refundRepairRecord = this.refundRepairRecord(refundOrder, repairType, repairResult); + + // 发送通知 + clientNoticeService.registerRefundNotice(refundOrder, null, new ArrayList<>(refundChannelOrderMap.values())); recordService.saveAllRecord(Arrays.asList(payRepairRecord, refundRepairRecord)); return repairResult; } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/strategy/pay/CashPayRepairStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/strategy/pay/CashPayRepairStrategy.java index a04475492..59397a103 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/strategy/pay/CashPayRepairStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/strategy/pay/CashPayRepairStrategy.java @@ -23,6 +23,7 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT public class CashPayRepairStrategy extends AbsPayRepairStrategy { private final CashRecordService cashRecordService; + /** * 策略标识 */ diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/ClientNoticeTask.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/ClientNoticeTask.java new file mode 100644 index 000000000..34e191da8 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/ClientNoticeTask.java @@ -0,0 +1,36 @@ +package cn.bootx.platform.daxpay.service.task; + +import cn.bootx.platform.common.core.util.LocalDateTimeUtil; +import cn.bootx.platform.daxpay.service.core.payment.notice.service.ClientNoticeService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.quartz.*; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +/** + * 消息通知任务 + * @author xxm + * @since 2024/2/22 + */ +@Slf4j +@Component +@DisallowConcurrentExecution +@PersistJobDataAfterExecution +@RequiredArgsConstructor +public class ClientNoticeTask implements Job { + + private final ClientNoticeService clientNoticeService; + + + /** + * 通知任务执行 + */ + @Override + public void execute(JobExecutionContext context){ + // 获取当前时间, 然后查询当前时间及以前需要进行通知的消息 + LocalDateTime now = LocalDateTime.now(); + clientNoticeService.taskStart(0, LocalDateTimeUtil.timestamp(now)); + } +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/timeout/task/PayExpiredTimeTask.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/PayExpiredTimeTask.java similarity index 82% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/timeout/task/PayExpiredTimeTask.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/PayExpiredTimeTask.java index fbfd06e41..70759ebf5 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/timeout/task/PayExpiredTimeTask.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/PayExpiredTimeTask.java @@ -1,15 +1,16 @@ -package cn.bootx.platform.daxpay.service.core.timeout.task; +package cn.bootx.platform.daxpay.service.task; import cn.bootx.platform.daxpay.param.pay.PaySyncParam; import cn.bootx.platform.daxpay.service.code.PayRepairSourceEnum; import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; +import cn.bootx.platform.daxpay.service.core.payment.pay.dao.PayExpiredTimeRepository; import cn.bootx.platform.daxpay.service.core.payment.sync.service.PaySyncService; -import cn.bootx.platform.daxpay.service.core.timeout.dao.PayExpiredTimeRepository; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; +import org.quartz.Job; +import org.quartz.JobExecutionContext; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -17,27 +18,23 @@ import java.util.Objects; import java.util.Set; /** - * + * 支付超时处理 * @author xxm * @since 2024/1/2 */ @Slf4j @Service @RequiredArgsConstructor -public class PayExpiredTimeTask { +public class PayExpiredTimeTask implements Job { private final PayExpiredTimeRepository repository; private final PaySyncService paySyncService; private final LockTemplate lockTemplate; - /** - * 先使用定时任务实现, 五秒轮训一下 - * - */ - @Scheduled(cron = "*/5 * * * * ?") - public void task(){ -// log.debug("执行超时取消任务...."); + @Override + public void execute(JobExecutionContext context) { + // 获取超时的任务Key Set expiredKeys = repository.getExpiredKeys(LocalDateTime.now()); for (String expiredKey : expiredKeys) { LockInfo lock = lockTemplate.lock("payment:expired:" + expiredKey,10000,200); @@ -62,10 +59,6 @@ public class PayExpiredTimeTask { } finally { lockTemplate.releaseLock(lock); } - } - - - } }