feat 分账同步功能开发

This commit is contained in:
DaxPay
2024-12-16 16:34:45 +08:00
parent 6229c5a69a
commit 13c28069ec
18 changed files with 514 additions and 217 deletions

View File

@@ -1,29 +1,37 @@
package org.dromara.daxpay.channel.alipay.service.allocation;
import cn.bootx.platform.common.mybatisplus.base.MpIdEntity;
import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayResponse;
import com.alipay.api.domain.AlipayTradeOrderSettleModel;
import com.alipay.api.domain.OpenApiRoyaltyDetailInfoPojo;
import com.alipay.api.domain.SettleExtendParams;
import com.alipay.api.domain.*;
import com.alipay.api.request.AlipayTradeOrderSettleQueryRequest;
import com.alipay.api.request.AlipayTradeOrderSettleRequest;
import com.alipay.api.response.AlipayTradeOrderSettleQueryResponse;
import com.alipay.api.response.AlipayTradeOrderSettleResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.daxpay.channel.alipay.code.AliPayCode;
import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService;
import org.dromara.daxpay.core.enums.AllocDetailResultEnum;
import org.dromara.daxpay.core.exception.OperationFailException;
import org.dromara.daxpay.core.exception.TradeFailException;
import org.dromara.daxpay.core.util.PayUtil;
import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo;
import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo;
import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail;
import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -60,7 +68,7 @@ public class AliPayAllocationService {
model.setRoyaltyParameters(royaltyParameters);
AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest();
request.setBizModel(model);
AlipayTradeOrderSettleResponse response = null;
AlipayTradeOrderSettleResponse response;
try {
response = aliPayConfigService.execute(request);
this.verifyErrorMsg(response);
@@ -79,7 +87,7 @@ public class AliPayAllocationService {
public void finish(AllocOrder allocOrder, List<AllocDetail> orderDetails){
// 分账主体参数
AlipayTradeOrderSettleModel model = new AlipayTradeOrderSettleModel();
model.setOutRequestNo(String.valueOf(allocOrder.getAllocNo()));
model.setOutRequestNo(allocOrder.getAllocNo());
model.setTradeNo(allocOrder.getOutOrderNo());
model.setRoyaltyMode(AliPayCode.ALLOC_ASYNC);
// 分账完结参数
@@ -113,37 +121,40 @@ public class AliPayAllocationService {
/**
* 分账状态同步
*/
// @SneakyThrows
// public AllocRemoteSyncResult sync(AllocOrder allocOrder, List<AllocDetail> allocOrderDetails, AliPayConfig config){
// AlipayClient alipayClient = aliPayConfigService.getAlipayClient(config);
// AlipayTradeOrderSettleQueryModel model = new AlipayTradeOrderSettleQueryModel();
// model.setTradeNo(allocOrder.getOutOrderNo());
// model.setOutRequestNo(allocOrder.getAllocNo());
// AlipayTradeOrderSettleQueryRequest request = new AlipayTradeOrderSettleQueryRequest();
// request.setBizModel(model);
// AlipayTradeOrderSettleQueryResponse response = alipayClient.execute(request);
// // 验证
// this.verifyErrorMsg(response);
// Map<String, AllocOrderDetail> detailMap = allocOrderDetails.stream()
// .collect(Collectors.toMap(AllocOrderDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest));
// List<RoyaltyDetail> royaltyDetailList = response.getRoyaltyDetailList();
// for (RoyaltyDetail receiver : royaltyDetailList) {
// AllocOrderDetail detail = detailMap.get(receiver.getTransIn());
// if (Objects.nonNull(detail)) {
// detail.setResult(this.getDetailResultEnum(receiver.getState()).getCode());
// detail.setErrorCode(receiver.getErrorCode());
// detail.setErrorMsg(receiver.getErrorDesc());
// // 如果是完成, 更新时间
// if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){
// LocalDateTime finishTime = LocalDateTimeUtil.of(receiver.getExecuteDt());
// detail.setFinishTime(finishTime)
// .setErrorMsg(null)
// .setErrorCode(null);
// }
// }
// }
// return new AllocRemoteSyncResult().setSyncInfo(JSONUtil.toJsonStr(response));
// }
public AllocSyncResultBo sync(AllocOrder allocOrder, List<AllocDetail> allocOrderDetails){
AlipayTradeOrderSettleQueryModel model = new AlipayTradeOrderSettleQueryModel();
model.setOutRequestNo(allocOrder.getAllocNo());
model.setTradeNo(allocOrder.getOutOrderNo());
AlipayTradeOrderSettleQueryRequest request = new AlipayTradeOrderSettleQueryRequest();
request.setBizModel(model);
AlipayTradeOrderSettleQueryResponse response;
try {
response = aliPayConfigService.execute(request);
} catch (AlipayApiException e) {
throw new OperationFailException(e.getMessage());
}
// 验证
this.verifyErrorMsg(response);
Map<String, AllocDetail> detailMap = allocOrderDetails.stream()
.collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest));
List<RoyaltyDetail> royaltyDetailList = response.getRoyaltyDetailList();
for (RoyaltyDetail receiver : royaltyDetailList) {
var detail = detailMap.get(receiver.getTransIn());
if (Objects.nonNull(detail)) {
detail.setResult(this.getDetailResultEnum(receiver.getState()).getCode());
detail.setErrorCode(receiver.getErrorCode());
detail.setErrorMsg(receiver.getErrorDesc());
// 如果是完成, 更新时间
if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){
LocalDateTime finishTime = LocalDateTimeUtil.of(receiver.getExecuteDt());
detail.setFinishTime(finishTime)
.setErrorMsg(null)
.setErrorCode(null);
}
}
}
return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(response));
}
/**
* 验证错误信息

View File

@@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j;
import org.dromara.daxpay.channel.alipay.service.allocation.AliPayAllocationService;
import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo;
import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo;
import org.dromara.daxpay.service.strategy.AbsAllocationStrategy;
import org.springframework.stereotype.Component;
@@ -43,4 +44,12 @@ public class AliAllocationStrategy extends AbsAllocationStrategy {
public void finish() {
aliPayAllocationService.finish(getOrder(), getDetails());
}
/**
* 同步状态
*/
@Override
public AllocSyncResultBo doSync() {
return aliPayAllocationService.sync(getOrder(), getDetails());
}
}

View File

@@ -4,6 +4,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.daxpay.core.enums.ChannelEnum;
import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo;
import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo;
import org.dromara.daxpay.service.strategy.AbsAllocationStrategy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@@ -46,4 +47,12 @@ public class WechatAllocationStrategy extends AbsAllocationStrategy {
}
/**
* 同步状态
*/
@Override
public AllocSyncResultBo doSync() {
return null;
}
}