mirror of
https://gitee.com/dromara/dax-pay.git
synced 2025-10-13 21:30:25 +00:00
feat: 自动分账/自动完结/自动同步状态功能实现
This commit is contained in:
@@ -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收银台功能
|
||||
|
12
_doc/Task.md
12
_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] 收银台配置
|
||||
|
@@ -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());
|
||||
|
@@ -45,7 +45,7 @@ public class UniAllocationController {
|
||||
@Operation(summary = "发起分账接口")
|
||||
@PostMapping("/start")
|
||||
public DaxResult<AllocationResult> start(@RequestBody AllocationParam param){
|
||||
return DaxRes.ok(allocationService.allocation(param));
|
||||
return DaxRes.ok(allocationService.start(param));
|
||||
}
|
||||
|
||||
@Operation(summary = "分账完结接口")
|
||||
|
@@ -17,7 +17,7 @@ import java.util.Optional;
|
||||
@Slf4j
|
||||
@Repository
|
||||
@RequiredArgsConstructor
|
||||
public class AllocConfigManger extends BaseManager<AllocConfigMapper, AllocConfig> {
|
||||
public class AllocConfigManager extends BaseManager<AllocConfigMapper, AllocConfig> {
|
||||
|
||||
/**
|
||||
* 判断是都已经存在数据
|
@@ -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<AllocConfi
|
||||
private Integer delayTime;
|
||||
|
||||
|
||||
public Boolean getAutoFinish() {
|
||||
return Objects.equals(autoFinish, true);
|
||||
}
|
||||
|
||||
public Boolean getAutoAlloc() {
|
||||
return Objects.equals(autoAlloc, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建对象
|
||||
*/
|
||||
|
@@ -5,6 +5,9 @@ import cn.bootx.platform.starter.redis.delay.annotation.DelayJobEvent;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.daxpay.service.code.DaxPayCode;
|
||||
import org.dromara.daxpay.service.service.allocation.AllocationService;
|
||||
import org.dromara.daxpay.service.service.allocation.AllocationSyncService;
|
||||
import org.dromara.daxpay.service.service.order.pay.PayOrderService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
@@ -16,13 +19,18 @@ import org.springframework.stereotype.Service;
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class AllocationEventService {
|
||||
private final AllocationSyncService syncService;
|
||||
|
||||
private final AllocationService allocationService;
|
||||
|
||||
private final PayOrderService payOrderService;
|
||||
|
||||
/**
|
||||
* 自动分账 参数为订单号
|
||||
*/
|
||||
@DelayEventListener(DaxPayCode.Event.ORDER_ALLOC_START)
|
||||
public void start(DelayJobEvent<Long> 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<Long> event) {
|
||||
syncService.sync(event.getMessage());
|
||||
log.info("分账同步,订单号:{}", event.getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* 分账完结
|
||||
*/
|
||||
@DelayEventListener(DaxPayCode.Event.ORDER_ALLOC_FINISH)
|
||||
public void finish(DelayJobEvent<Long> event) {
|
||||
log.info("分账完成,订单号:{}", event.getMessage());
|
||||
allocationService.autoFinish(event.getMessage());
|
||||
log.info("分账完结,订单号:{}", event.getMessage());
|
||||
}
|
||||
}
|
||||
|
@@ -49,8 +49,8 @@ public class TradeOrderEventService {
|
||||
Optional<PayOrder> 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);
|
||||
}
|
||||
|
@@ -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));
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分账完结
|
||||
|
@@ -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<AllocDetail> 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<AllocDetail> details){
|
||||
private void updateOrderStatus(AllocOrder allocOrder, List<AllocDetail> details, String beforeStatus){
|
||||
// 如果是分账结束或失败, 不更新状态
|
||||
String status = allocOrder.getStatus();
|
||||
// 如果是分账结束或失败, 不进行对订单进行处理
|
||||
List<String> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -108,7 +108,6 @@ public class RefundCallbackService {
|
||||
// 更新订单和退款相关订单
|
||||
payOrderManager.updateById(payOrder);
|
||||
refundOrderManager.updateById(refundOrder);
|
||||
|
||||
// 记录流水
|
||||
tradeFlowRecordService.saveRefund(refundOrder);
|
||||
// 发送通知
|
||||
|
@@ -13,4 +13,9 @@ import org.springframework.stereotype.Service;
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class AllocationSyncTaskService {
|
||||
|
||||
/**
|
||||
* 分账同步
|
||||
*/
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user