From b5d10f1ead1d89cfe2e6eacb868b10d3693389e3 Mon Sep 17 00:00:00 2001 From: bootx Date: Tue, 17 Dec 2024 22:27:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=87=AA=E5=8A=A8=E5=88=86=E8=B4=A6/?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=AE=8C=E7=BB=93/=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E7=8A=B6=E6=80=81=E5=8A=9F=E8=83=BD=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/ChangeLog.md | 22 ++++-- _doc/Task.md | 12 +-- .../WeChatPayAllocationV3Service.java | 4 +- .../unipay/UniAllocationController.java | 2 +- ...figManger.java => AllocConfigManager.java} | 2 +- .../entity/allocation/AllocConfig.java | 9 +++ .../service/event/AllocationEventService.java | 15 +++- .../service/event/TradeOrderEventService.java | 4 +- .../allocation/AllocConfigService.java | 14 ++-- .../service/allocation/AllocationService.java | 56 +++++++++++-- .../allocation/AllocationSyncService.java | 78 +++++++++++-------- .../service/order/pay/PayOrderService.java | 30 ++++++- .../service/trade/pay/PayCallbackService.java | 3 + .../service/service/trade/pay/PayService.java | 4 + .../trade/refund/RefundCallbackService.java | 1 - .../task/AllocationSyncTaskService.java | 5 ++ 16 files changed, 193 insertions(+), 68 deletions(-) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/{AllocConfigManger.java => AllocConfigManager.java} (90%) diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md index 1ae6bb6a..1b18b070 100644 --- a/_doc/ChangeLog.md +++ b/_doc/ChangeLog.md @@ -1,14 +1,20 @@ # CHANGELOG -## [v3.0.0.beta3] 2024-12-05 -- 新增: 增加支付宝分账功能 -- 新增: 支付宝分账功能 -- 新增: 分账发起和分账完结功能 -- 新增: 增加分账接收方配置功能 +## [v3.0.0.beta3] 2024-12-22 +- 新增: 支持支付宝分账功能 +- 新增: 支持微信分账功能 +- 新增: 支持分账发起和分账完结功能 +- 新增: 支持分账接收方配置功能 +- 新增: 支持支付订单自动分账功能 +- 新增: 自动同步分账订单状态功能 +- 新增: 分账回调通知和分账消息通知功能 +- 新增: 自动完结分账订单功能 - 新增: 分账同步功能 -- 优化: 调整分账接收者和分账组配置立即 +- 优化: 升级wxjava4.6.9.B,并处理证书配置问题 +- 优化: 调整分账接收者和分账组配置逻辑 - fix: 修复微信v2当面付发起失败问题 -- fix sm3签名校验问题 -- fix SDK参数和返回对象与接口不一致修改 +- fix: 修复微信v2分账参数未设置问题 +- fix: sm3签名校验问题 +- fix: SDK参数和返回对象与接口不一致修改 ## [v3.0.0.beta2] 2024-12-05 - 新增: 增加PC收银台功能 diff --git a/_doc/Task.md b/_doc/Task.md index 4db35ad1..bead40a2 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -16,13 +16,12 @@ - [x] 分账接口开发 - [x] 支付宝 - [x] 微信 -- [ ] 分账扩展能力 - - [ ] 自动分账 - - [ ] 自动完成 - - [ ] 自动同步状态 +- [x] 分账扩展能力 + - [x] 自动分账 + - [x] 自动完结 + - [x] 自动同步状态 - [x] 分账消息通知和回调 - [x] 分账接收方和分账组优化, 后台管理时, 编号自动生成 -- [x] 微信通道添加单独的认证跳转地址, 处理它的特殊情况 - [x] 支付订单新增待支付状态 ## 3.0.0.beta2 收银台 - [x] 收银台功能 @@ -47,7 +46,8 @@ - [x] 一个应用支持多码牌 - [x] 码牌不再使用应用号作为标识, 使用独立的编码 - [x] 码牌H5页面对接 -- [ ] 分账配置/分账组/分账接收方合并为一个tabs页面 +- [x] 分账配置/分账组/分账接收方合并为一个tabs页面 +- [x] 微信通道添加单独的认证跳转地址, 处理它的特殊情况 ## 3.0.0.beta1 收银台 - [x] 收银台功能 - [x] 收银台配置 diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java index 23d29be0..84f5bd7c 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java @@ -17,7 +17,6 @@ import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; import org.dromara.daxpay.core.enums.AllocDetailResultEnum; import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.enums.AllocationStatusEnum; import org.dromara.daxpay.core.exception.ConfigErrorException; import org.dromara.daxpay.core.exception.OperationFailException; import org.dromara.daxpay.core.util.PayUtil; @@ -37,6 +36,7 @@ import java.util.stream.Collectors; import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; +import static org.dromara.daxpay.core.enums.AllocationStatusEnum.*; /** * 微信分账V3版本接口 @@ -112,7 +112,7 @@ public class WeChatPayAllocationV3Service { ProfitSharingService sharingService = wxPayService.getProfitSharingService(); // 根据订单状态判断 使用ID还是分账号 String outOrderNo; - if (Objects.equals(AllocationStatusEnum.PROCESSING.getCode(), allocOrder.getStatus())){ + if (List.of(PROCESSING.getCode(),ALLOC_FAILED.getCode(), ALLOC_END.getCode()).contains(allocOrder.getStatus())){ outOrderNo = allocOrder.getAllocNo(); } else { outOrderNo = String.valueOf(allocOrder.getId()); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java index 6f8a4888..024692e9 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java @@ -45,7 +45,7 @@ public class UniAllocationController { @Operation(summary = "发起分账接口") @PostMapping("/start") public DaxResult start(@RequestBody AllocationParam param){ - return DaxRes.ok(allocationService.allocation(param)); + return DaxRes.ok(allocationService.start(param)); } @Operation(summary = "分账完结接口") diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManger.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManager.java similarity index 90% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManger.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManager.java index 8eff1c12..33a533a3 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManger.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManager.java @@ -17,7 +17,7 @@ import java.util.Optional; @Slf4j @Repository @RequiredArgsConstructor -public class AllocConfigManger extends BaseManager { +public class AllocConfigManager extends BaseManager { /** * 判断是都已经存在数据 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java index 426a6a0e..f8ea29bf 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java @@ -11,6 +11,7 @@ import org.dromara.daxpay.service.param.allocation.AllocConfigParam; import org.dromara.daxpay.service.result.allocation.AllocConfigResult; import java.math.BigDecimal; +import java.util.Objects; /** * 分账配置 @@ -36,6 +37,14 @@ public class AllocConfig extends MchAppBaseEntity implements ToResult event) { + payOrderService.autoAllocation(event.getMessage()); log.info("分账开始,订单号:{}", event.getMessage()); } @@ -31,11 +39,16 @@ public class AllocationEventService { */ @DelayEventListener(DaxPayCode.Event.ORDER_ALLOC_SYNC) public void sync(DelayJobEvent event) { + syncService.sync(event.getMessage()); log.info("分账同步,订单号:{}", event.getMessage()); } + /** + * 分账完结 + */ @DelayEventListener(DaxPayCode.Event.ORDER_ALLOC_FINISH) public void finish(DelayJobEvent event) { - log.info("分账完成,订单号:{}", event.getMessage()); + allocationService.autoFinish(event.getMessage()); + log.info("分账完结,订单号:{}", event.getMessage()); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/event/TradeOrderEventService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/event/TradeOrderEventService.java index c74c0bb9..0543200a 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/event/TradeOrderEventService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/event/TradeOrderEventService.java @@ -49,8 +49,8 @@ public class TradeOrderEventService { Optional orderOpt = payOrderManager.findById(event.getMessage()); if (orderOpt.isPresent()) { PayOrder payOrder = orderOpt.get(); - // 不是支付中不需要进行同步 - if (payOrder.getStatus().equals(PayStatusEnum.PROGRESS.getCode())|| payOrder.getStatus().equals(PayStatusEnum.TIMEOUT.getCode())) { + // 不是支付中和支付超时不需要进行同步 + if (payOrder.getStatus().equals(PayStatusEnum.PROGRESS.getCode()) || payOrder.getStatus().equals(PayStatusEnum.TIMEOUT.getCode())) { paymentAssistService.initMchApp(payOrder.getAppId()); paySyncService.syncPayOrder(payOrder); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java index 21d27f8d..192d8948 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java @@ -7,7 +7,7 @@ import cn.hutool.core.bean.copier.CopyOptions; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.service.convert.allocation.AllocConfigConvert; -import org.dromara.daxpay.service.dao.config.AllocConfigManger; +import org.dromara.daxpay.service.dao.config.AllocConfigManager; import org.dromara.daxpay.service.entity.allocation.AllocConfig; import org.dromara.daxpay.service.param.allocation.AllocConfigParam; import org.dromara.daxpay.service.result.allocation.AllocConfigResult; @@ -22,36 +22,36 @@ import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class AllocConfigService { - private final AllocConfigManger allocConfigManger; + private final AllocConfigManager allocConfigManager; /** * 新增 */ public void save(AllocConfigParam param) { // 判断是否已经存在 - if (allocConfigManger.existsByAppId(param.getAppId())){ + if (allocConfigManager.existsByAppId(param.getAppId())){ throw new RepetitiveOperationException("该应用已存在收银台配置"); } AllocConfig entity = AllocConfigConvert.CONVERT.toEntity(param); - allocConfigManger.save(entity); + allocConfigManager.save(entity); } /** * 修改 */ public void update(AllocConfigParam param) { - AllocConfig config = allocConfigManger.findById(param.getId()) + AllocConfig config = allocConfigManager.findById(param.getId()) .orElseThrow(() -> new DataNotExistException("分账配置不存在")); BeanUtil.copyProperties(param, config, CopyOptions.create().ignoreNullValue()); - allocConfigManger.updateById(config); + allocConfigManager.updateById(config); } /** * 根据AppId查询 */ public AllocConfigResult findByAppId(String appId) { - return allocConfigManger.findByAppId(appId).map(AllocConfig::toResult) + return allocConfigManager.findByAppId(appId).map(AllocConfig::toResult) .orElse(new AllocConfigResult().setAutoAlloc(false)); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java index 3c66c7b7..35629c88 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java @@ -2,12 +2,14 @@ package org.dromara.daxpay.service.service.allocation; import cn.bootx.platform.core.exception.DataNotExistException; import cn.bootx.platform.core.exception.RepetitiveOperationException; +import cn.bootx.platform.starter.redis.delay.service.DelayJobService; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.core.enums.AllocationResultEnum; import org.dromara.daxpay.core.enums.AllocationStatusEnum; +import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.exception.DataErrorException; import org.dromara.daxpay.core.exception.TradeStatusErrorException; import org.dromara.daxpay.core.param.allocation.transaction.AllocFinishParam; @@ -16,9 +18,12 @@ import org.dromara.daxpay.core.param.allocation.transaction.QueryAllocOrderParam import org.dromara.daxpay.core.result.allocation.AllocationResult; import org.dromara.daxpay.core.result.allocation.order.AllocOrderResult; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.code.DaxPayCode; import org.dromara.daxpay.service.convert.allocation.AllocOrderConvert; import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager; import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager; +import org.dromara.daxpay.service.dao.config.AllocConfigManager; +import org.dromara.daxpay.service.entity.allocation.AllocConfig; import org.dromara.daxpay.service.entity.allocation.transaction.AllocAndDetail; import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; @@ -35,6 +40,7 @@ import java.time.LocalDateTime; import java.util.Arrays; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.stream.Collectors; import static org.dromara.daxpay.core.enums.AllocationStatusEnum.ALLOC_END; @@ -54,7 +60,6 @@ public class AllocationService { private final AllocDetailManager allocOrderDetailManager; - private final LockTemplate lockTemplate; private final PaymentAssistService paymentAssistService; @@ -62,13 +67,18 @@ public class AllocationService { private final AllocOrderQueryService allocOrderQueryService; private final AllocOrderService allocOrderService; + private final MerchantNoticeService merchantNoticeService; + private final DelayJobService delayJobService; + + private final AllocConfigManager allocConfigManager; + /** * 开启分账 多次请求只会分账一次 * 优先级 分账接收方列表 > 分账组编号 > 默认分账组 */ - public AllocationResult allocation(AllocationParam param) { + public AllocationResult start(AllocationParam param) { // 判断是否已经有分账订单 var allocOrder = allocationOrderManager.findByBizAllocNo(param.getBizAllocNo(), param.getAppId()).orElse(null); if (Objects.nonNull(allocOrder)){ @@ -77,14 +87,14 @@ public class AllocationService { } else { // 首次分账 PayOrder payOrder = allocOrderQueryService.getAndCheckPayOrder(param); - return this.allocation(param, payOrder); + return this.start(param, payOrder); } } /** * 开启分账 优先级 分账接收方列表 > 分账组编号 > 默认分账组 */ - public AllocationResult allocation(AllocationParam param, PayOrder payOrder) { + public AllocationResult start(AllocationParam param, PayOrder payOrder) { LockInfo lock = lockTemplate.lock("payment:allocation:" + payOrder.getId(),10000,200); if (Objects.isNull(lock)){ throw new RepetitiveOperationException("分账发起处理中,请勿重复操作"); @@ -120,9 +130,10 @@ public class AllocationService { // 失败 order.setStatus(AllocationStatusEnum.ALLOC_FAILED.getCode()) .setErrorMsg(e.getMessage()); - // TODO 返回异常处理 } allocationOrderManager.updateById(order); + // 注册两分钟后的分账同步事件 + delayJobService.registerByTransaction(order.getId(), DaxPayCode.Event.ORDER_ALLOC_SYNC, 2*60*1000L); return new AllocationResult() .setAllocNo(order.getAllocNo()) .setBizAllocNo(order.getBizAllocNo()) @@ -132,6 +143,25 @@ public class AllocationService { } } + /** + * 注册自动分账事件 + */ + public void registerAutoAlloc(PayOrder payOrder) { + // 订单是否完成 + if (!Objects.equals(payOrder.getStatus(), PayStatusEnum.SUCCESS.getCode())){ + return; + } + // 是否开启自动分账 + if (payOrder.getAllocation() && payOrder.getAutoAllocation()){ + AllocConfig allocConfig = allocConfigManager.findByAppId(payOrder.getAppId()).orElse(null); + if (Objects.nonNull(allocConfig)&&allocConfig.getAutoAlloc()){ + // 注册定时执行的分账完结任务, 如果未设置默认为一天后进行分账 + Integer delayTime = Optional.ofNullable(allocConfig.getDelayTime()).orElse(24*60); + delayJobService.registerByTransaction(payOrder.getId(), DaxPayCode.Event.ORDER_ALLOC_START, delayTime*60*1000L); + } + } + } + /** * 分账重试 */ @@ -190,6 +220,22 @@ public class AllocationService { } } + /** + * 自动分账完结 + */ + public void autoFinish(Long id) { + AllocOrder allocOrder = allocationOrderManager.findById(id).orElse(null); + if (Objects.isNull(allocOrder)){ + log.warn("分账完结自动处理失败,分账单不存在:{}", id); + return; + } + if (!Arrays.asList(ALLOC_END.getCode(),FINISH_FAILED.getCode()).contains(allocOrder.getStatus())) { + log.warn("忽略分账完结自动处理,分账单状态不正确:{}", allocOrder.getStatus()); + return; + } + paymentAssistService.initMchApp(allocOrder.getAppId()); + this.finish(allocOrder); + } /** * 分账完结 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java index 53241a60..5ddc223b 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java @@ -2,6 +2,7 @@ package org.dromara.daxpay.service.service.allocation; import cn.bootx.platform.core.exception.DataNotExistException; import cn.bootx.platform.core.exception.RepetitiveOperationException; +import cn.bootx.platform.starter.redis.delay.service.DelayJobService; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; import lombok.RequiredArgsConstructor; @@ -13,9 +14,12 @@ import org.dromara.daxpay.core.enums.TradeTypeEnum; import org.dromara.daxpay.core.param.allocation.transaction.AllocSyncParam; import org.dromara.daxpay.core.result.allocation.AllocSyncResult; import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; +import org.dromara.daxpay.service.code.DaxPayCode; import org.dromara.daxpay.service.common.local.PaymentContextLocal; import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager; import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager; +import org.dromara.daxpay.service.dao.config.AllocConfigManager; +import org.dromara.daxpay.service.entity.allocation.AllocConfig; import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; import org.dromara.daxpay.service.entity.record.sync.TradeSyncRecord; @@ -50,6 +54,8 @@ public class AllocationSyncService { private final LockTemplate lockTemplate; private final PaymentAssistService paymentAssistService; private final MerchantNoticeService merchantNoticeService; + private final AllocConfigManager allocConfigManager; + private final DelayJobService delayJobService; /** * 分账同步 @@ -101,6 +107,7 @@ public class AllocationSyncService { if (Objects.isNull(lock)){ throw new RepetitiveOperationException("分账同步中,请勿重复操作"); } + String beforeStatus = allocOrder.getStatus(); try { List detailList = allocOrderDetailManager.findAllByOrderId(allocOrder.getId()); // 获取分账策略 @@ -114,7 +121,7 @@ public class AllocationSyncService { this.saveRecord(allocOrder, allocSyncResultBo); // 根据订单明细更新订单的状态和处理结果 allocOrder.setErrorMsg(null).setErrorCode(null); - this.updateOrderStatus(allocOrder, detailList); + this.updateOrderStatus(allocOrder, detailList,beforeStatus); } finally { lockTemplate.releaseLock(lock); } @@ -123,49 +130,58 @@ public class AllocationSyncService { /** * 根据订单明细更新订单的状态和处理结果, 如果订单是分账结束或失败, 不更新状态 */ - private void updateOrderStatus(AllocOrder allocOrder, List details){ + private void updateOrderStatus(AllocOrder allocOrder, List details, String beforeStatus){ // 如果是分账结束或失败, 不更新状态 String status = allocOrder.getStatus(); // 如果是分账结束或失败, 不进行对订单进行处理 List list = Arrays.asList(AllocationStatusEnum.FINISH.getCode(), AllocationStatusEnum.FINISH_FAILED.getCode()); - if (!list.contains(status)){ - // 判断明细状态. 获取成功和失败的 - long successCount = details.stream() - .map(AllocDetail::getResult) - .filter(AllocDetailResultEnum.SUCCESS.getCode()::equals) - .count(); - long failCount = details.stream() - .map(AllocDetail::getResult) - .filter(AllocDetailResultEnum.FAIL.getCode()::equals) - .count(); + if (list.contains(status)) { + return; + } + // 判断明细状态. 获取成功和失败的 + long successCount = details.stream() + .map(AllocDetail::getResult) + .filter(AllocDetailResultEnum.SUCCESS.getCode()::equals) + .count(); + long failCount = details.stream() + .map(AllocDetail::getResult) + .filter(AllocDetailResultEnum.FAIL.getCode()::equals) + .count(); - // 成功和失败都为0 表示进行中 - if (successCount == 0 && failCount == 0){ - allocOrder.setStatus(AllocationStatusEnum.PROCESSING.getCode()) - .setResult(AllocationResultEnum.ALL_PENDING.getCode()); + // 成功和失败都为0 表示进行中 + if (successCount == 0 && failCount == 0){ + allocOrder.setStatus(AllocationStatusEnum.PROCESSING.getCode()) + .setResult(AllocationResultEnum.ALL_PENDING.getCode()); + } else { + if (failCount == details.size()){ + // 全部失败 + allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) + .setResult(AllocationResultEnum.ALL_FAILED.getCode()); + } else if (successCount == details.size()){ + // 全部成功 + allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) + .setResult(AllocationResultEnum.ALL_SUCCESS.getCode()); } else { - if (failCount == details.size()){ - // 全部失败 - allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) - .setResult(AllocationResultEnum.ALL_FAILED.getCode()); - } else if (successCount == details.size()){ - // 全部成功 - allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) - .setResult(AllocationResultEnum.ALL_SUCCESS.getCode()); - } else { - // 部分成功 - allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) - .setResult(AllocationResultEnum.PART_SUCCESS.getCode()); - } + // 部分成功 + allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) + .setResult(AllocationResultEnum.PART_SUCCESS.getCode()); } } allocOrderDetailManager.updateAllById(details); allocationOrderManager.updateById(allocOrder); - // 如果状态为分账完成, 发送通知 - if (Objects.equals(AllocationStatusEnum.FINISH.getCode(), allocOrder.getStatus())){ + // 如果状态为分账处理完成, 且与类型发生了变动, 发送通知 + if (Objects.equals(AllocationStatusEnum.ALLOC_END.getCode(), allocOrder.getStatus()) + && !Objects.equals(beforeStatus, AllocationStatusEnum.ALLOC_END.getCode())){ // 注册通知 多次同步会产生多次变动, 注意处理多次推送通知的问题 merchantNoticeService.registerAllocNotice(allocOrder, details); + + // 是否开启自动完结 + AllocConfig allocConfig = allocConfigManager.findByAppId(allocOrder.getAppId()).orElse(null); + if (Objects.nonNull(allocConfig)&& allocConfig.getAutoFinish()){ + // 注册一分钟后的分账完结任务 + delayJobService.registerByTransaction(allocOrder.getId(), DaxPayCode.Event.ORDER_ALLOC_FINISH, 60 * 1000L); + } } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java index 4b941c3e..1819ddf9 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java @@ -1,19 +1,23 @@ package org.dromara.daxpay.service.service.order.pay; import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.core.exception.TradeNotExistException; import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam; import org.dromara.daxpay.core.util.TradeNoGenerateUtil; +import org.dromara.daxpay.service.dao.config.AllocConfigManager; import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.entity.allocation.AllocConfig; import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.dromara.daxpay.service.service.allocation.AllocationService; import org.dromara.daxpay.service.service.assist.PaymentAssistService; import org.dromara.daxpay.service.service.trade.pay.PayCloseService; import org.dromara.daxpay.service.service.trade.pay.PaySyncService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.Objects; + /** * 支付订单服务 * @author xxm @@ -24,12 +28,17 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor public class PayOrderService { private final PayOrderManager payOrderManager; + private final PaySyncService paySyncService; private final PaymentAssistService paymentAssistService; + private final PayCloseService payCloseService; + private final AllocationService allocationService; + private final AllocConfigManager allocConfigManager; + /** * 同步 */ @@ -69,7 +78,22 @@ public class PayOrderService { AllocationParam param = new AllocationParam() .setBizAllocNo("B"+TradeNoGenerateUtil.allocation()); param.setAppId(payOrder.getAppId()); - allocationService.allocation(param, payOrder); + allocationService.start(param, payOrder); + } + /** + * 自动分账 + */ + public void autoAllocation(Long id){ + PayOrder payOrder = payOrderManager.findById(id).orElseThrow(() -> new TradeNotExistException("支付订单不存在")); + // 是否开启自动完结 + AllocConfig allocConfig = allocConfigManager.findByAppId(payOrder.getAppId()).orElse(null); + if (Objects.nonNull(allocConfig)){ + paymentAssistService.initMchApp(payOrder.getAppId()); + AllocationParam param = new AllocationParam() + .setBizAllocNo("B"+TradeNoGenerateUtil.allocation()); + param.setAppId(payOrder.getAppId()); + allocationService.start(param, payOrder); + } } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayCallbackService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayCallbackService.java index 8c280f76..b39f87ef 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayCallbackService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayCallbackService.java @@ -7,6 +7,7 @@ import org.dromara.daxpay.service.common.context.CallbackLocal; import org.dromara.daxpay.service.common.local.PaymentContextLocal; import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.service.allocation.AllocationService; import org.dromara.daxpay.service.service.notice.MerchantNoticeService; import org.dromara.daxpay.service.service.order.pay.PayOrderQueryService; import org.dromara.daxpay.service.service.record.flow.TradeFlowRecordService; @@ -39,6 +40,7 @@ public class PayCallbackService { private final TradeFlowRecordService tradeFlowRecordService; private final MerchantNoticeService merchantNoticeService; + private final AllocationService allocationService; /** * 支付统一回调处理 @@ -105,6 +107,7 @@ public class PayCallbackService { payOrderManager.updateById(payOrder); tradeFlowRecordService.savePay(payOrder); merchantNoticeService.registerPayNotice(payOrder); + allocationService.registerAutoAlloc(payOrder); } /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java index 052c2f15..0a1d570b 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java @@ -8,6 +8,7 @@ import org.dromara.daxpay.core.result.trade.pay.PayResult; import org.dromara.daxpay.service.bo.trade.PayResultBo; import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.service.allocation.AllocationService; import org.dromara.daxpay.service.service.notice.MerchantNoticeService; import org.dromara.daxpay.service.service.record.flow.TradeFlowRecordService; import org.dromara.daxpay.service.strategy.AbsPayStrategy; @@ -38,6 +39,7 @@ public class PayService { private final PayOrderManager payOrderManager; private final TradeFlowRecordService tradeFlowRecordService; private final MerchantNoticeService merchantNoticeService; + private final AllocationService allocationService; /** * 支付入口 @@ -145,6 +147,7 @@ public class PayService { if (Objects.equals(payOrder.getStatus(), PayStatusEnum.SUCCESS.getCode())){ tradeFlowRecordService.savePay(payOrder); merchantNoticeService.registerPayNotice(payOrder); + allocationService.registerAutoAlloc(payOrder); } return payAssistService.buildResult(payOrder,result); } @@ -197,6 +200,7 @@ public class PayService { if (Objects.equals(payOrder.getStatus(), PayStatusEnum.SUCCESS.getCode())){ tradeFlowRecordService.savePay(payOrder); merchantNoticeService.registerPayNotice(payOrder); + allocationService.registerAutoAlloc(payOrder); } return payAssistService.buildResult(payOrder, payResultBo); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundCallbackService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundCallbackService.java index aca97eee..13e57845 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundCallbackService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundCallbackService.java @@ -108,7 +108,6 @@ public class RefundCallbackService { // 更新订单和退款相关订单 payOrderManager.updateById(payOrder); refundOrderManager.updateById(refundOrder); - // 记录流水 tradeFlowRecordService.saveRefund(refundOrder); // 发送通知 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/AllocationSyncTaskService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/AllocationSyncTaskService.java index 4d2b2bb4..c30792e2 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/AllocationSyncTaskService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/AllocationSyncTaskService.java @@ -13,4 +13,9 @@ import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class AllocationSyncTaskService { + + /** + * 分账同步 + */ + }