wujiefeng 1 éve
szülő
commit
1cceb23843

+ 17 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/pay/SatInfoModel.java

@@ -0,0 +1,17 @@
+package com.zhongshu.card.client.model.pay;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.Value;
+
+import java.math.BigDecimal;
+
+@Data
+public class SatInfoModel {
+
+    @Schema(description = "机构id")
+    private String oid;
+
+    @Schema(description = "比例")
+    private BigDecimal ratio;
+}

+ 13 - 4
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/pay/PayTestController.java

@@ -1,5 +1,6 @@
 package com.zhongshu.card.server.core.controller.pay;
 
+import com.github.microservice.pay.client.service.ledger.TransactionLogService;
 import com.github.microservice.pay.client.service.product.SenselessPayService;
 import com.github.microservice.types.payment.PaymentType;
 import com.zhongshu.card.server.core.service.pay.ChinaumsSenselessPayService;
@@ -7,10 +8,10 @@ import com.zhongshu.card.server.core.service.pay.SettleService;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.cloud.stream.binder.kafka.properties.KafkaBinderConfigurationProperties;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
 
 @RestController
 @RequestMapping("payTest")
@@ -23,6 +24,9 @@ public class PayTestController {
     @Autowired
     ChinaumsSenselessPayService chinaumsSenselessPayService;
 
+    @Autowired
+    TransactionLogService transactionLogService;
+
     @PostMapping("settle")
     public Object settle(){
         return settleService.settle("665fc0ef9083d203896d3549", "67061bea18e3af0f903b067a", 1732997367300L, "remark", PaymentType.UnionFrictionlessPay);
@@ -32,4 +36,9 @@ public class PayTestController {
     public Object queryRefund(){
         return chinaumsSenselessPayService.refundQuery("665fc0ef9083d203896d3549","665fc0389083d203896d3541", "67061bea18e3af0f903b067a", "RE202411191422450130001", false);
     }
+
+    @PostMapping("groupClean")
+    public Object groupClean(@RequestBody List<String> generalLedgerId){
+        return transactionLogService.groupClean(generalLedgerId);
+    }
 }

+ 4 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/pay/ShareOrderDao.java

@@ -9,4 +9,8 @@ import java.util.List;
 public interface ShareOrderDao extends MongoDao<ShareOrder> {
 
     ShareOrder findTopByOrderNoAndProjectOidAndOidAndShareOrderType(String orderNo, String projectOid, String oid, ShareOrderType shareOrderType);
+
+    List<ShareOrder> findByOrderNoAndProjectOidAndShareOrderType(String orderNo, String projectOid, ShareOrderType shareOrderType);
+
+    ShareOrder findTopByShareOrderNo(String shareOrderNo);
 }

+ 5 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/pay/ShareOrder.java

@@ -8,6 +8,8 @@ import lombok.Data;
 import org.springframework.data.mongodb.core.mapping.Document;
 import org.springframework.data.redis.core.index.Indexed;
 
+import java.math.BigDecimal;
+
 /**
  * 分账订单
  */
@@ -31,6 +33,9 @@ public class ShareOrder extends SuperEntity {
     @Indexed
     private String shareOrderNo;
 
+    @Schema(description = "分账比例")
+    private BigDecimal ratio;
+
     @Schema(description = "分账金额")
     private Long amount;
 

+ 36 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/model/pay/RefundVaFld.java

@@ -0,0 +1,36 @@
+package com.zhongshu.card.server.core.model.pay;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class RefundVaFld {
+
+    private List<SatDetail> satDetail;
+
+    @Data
+    @AllArgsConstructor
+    @NoArgsConstructor
+    public static class SatDetail {
+
+        //子商户号
+        private String merId;
+
+        //子商户退货订单号
+        private String refundMerOrderId;
+
+        //退货金额  包含子商户的分账金额 单位分
+        private String refundAmt;
+
+        //实退金额 不包含子商户 单位分
+        private String realRefundAmt;
+
+        //原样返回商户上送的subsidyAmt
+        private String subsidyAmt;
+    }
+}

+ 146 - 80
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/pay/ChinaumsSenselessPayService.java

@@ -1,5 +1,6 @@
 package com.zhongshu.card.server.core.service.pay;
 
+import cn.hutool.core.util.ArrayUtil;
 import com.github.microservice.core.util.JsonUtil;
 import com.github.microservice.core.util.bean.BeanUtil;
 import com.github.microservice.core.util.queue.ExecuteQueueUtil;
@@ -20,6 +21,7 @@ import com.github.microservice.pay.client.type.ledger.TransactionType;
 import com.github.microservice.types.payment.PaymentChannelType;
 import com.github.microservice.types.payment.PaymentType;
 import com.zhongshu.card.client.model.pay.ChinaumsSenselessUserSignInfoModel;
+import com.zhongshu.card.client.model.pay.SatInfoModel;
 import com.zhongshu.card.client.model.pay.UnionApplySignParam;
 import com.zhongshu.card.client.type.ContractState;
 import com.zhongshu.card.client.type.ShareOrderType;
@@ -29,6 +31,7 @@ import com.zhongshu.card.server.core.dao.pay.ShareOrderDao;
 import com.zhongshu.card.server.core.domain.pay.ChinaumsSenselessUserSignInfo;
 import com.zhongshu.card.server.core.domain.pay.PayAccount;
 import com.zhongshu.card.server.core.domain.pay.ShareOrder;
+import com.zhongshu.card.server.core.model.pay.RefundVaFld;
 import com.zhongshu.card.server.core.model.pay.UnionFrictionlessPayFinishModel;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.service.paySetting.OrgPayAccountService;
@@ -43,6 +46,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.StopWatch;
 
 import java.math.BigDecimal;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -272,18 +276,11 @@ public class ChinaumsSenselessPayService extends SuperService {
      * 支付
      */
     @SneakyThrows
-    public ResultContent senselessPay(String projectOid, String oid, String userId, BigDecimal total, String orderNo, String remark) {
+    public ResultContent senselessPay(String projectOid, String oid, String userId, BigDecimal total, String orderNo, String remark, List<SatInfoModel> satInfoModel) {
         StopWatch stopWatch = new StopWatch();
         stopWatch.start("获取支付配置");
         String projectAccountName = orgPayAccountService.queryOgPayAccount(projectOid, PaymentType.UnionFrictionlessPay);
         //获取银联支付产品账户及需要签约的商户号
-        String orgAccountName = orgPayAccountService.queryOgPayAccount(oid, PaymentType.UnionFrictionlessPay);
-
-        com.github.microservice.pay.client.ret.ResultContent<AccountModel> orgAccountModelResultContent = payProductAccountService.get(orgAccountName);
-        if (!orgAccountModelResultContent.getState().equals(ResultState.Success)) {
-            return ResultContent.buildFail(orgAccountModelResultContent.getMsg());
-        }
-        ChinaumsSenselessConf orgConf = (ChinaumsSenselessConf) orgAccountModelResultContent.getContent().getConf();
 
         com.github.microservice.pay.client.ret.ResultContent<AccountModel> projectAccountModelResultContent = payProductAccountService.get(projectAccountName);
         if (!projectAccountModelResultContent.getState().equals(ResultState.Success)) {
@@ -311,26 +308,12 @@ public class ChinaumsSenselessPayService extends SuperService {
         request.setTotalAmount(total.toBigInteger().toString());
         request.setAttachedData(remark);
 
-        String shareOrderNo = projectConf.getSysSourceNo() + DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternyyyyMMddHHmmssSSS) + CommonUtil.randomCode(7);
-
         VaFld vaFld = new VaFld();
-        SatInfo satInfo = new SatInfo();
-        satInfo.setMerId(orgConf.getMchId());
-        satInfo.setFeeBear("Y");
-        satInfo.setSatAmt(total.toBigInteger().toString());
-        satInfo.setMerOrderId(shareOrderNo);
-        vaFld.setSatInfo(List.of(satInfo));
-        request.setVaFld(vaFld);
 
-        //TODO 放到扩展字段里,然后收到回调的时候再处理
-        ShareOrder shareOrder = new ShareOrder();
-        shareOrder.setOrderNo(orderNo);
-        shareOrder.setOid(oid);
-        shareOrder.setProjectOid(projectOid);
-        shareOrder.setAmount(total.toBigInteger().longValue());
-        shareOrder.setShareOrderType(ShareOrderType.Pay);
-        shareOrder.setShareOrderNo(shareOrderNo);
-        shareOrderDao.save(shareOrder);
+        List<SatInfo> satInfos = buildSatInfo(projectOid, total, orderNo, projectConf.getSysSourceNo(), satInfoModel);
+        vaFld.setSatInfo(satInfos);
+
+        request.setVaFld(vaFld);
         request.setSrcReserve(JsonUtil.toJson(Map.of("userId", userId, "oid", oid, "projectOid", projectOid, "orderNo", orderNo, "prefix", projectConf.getOrderNoPrefix())));
         payProductParameter.setMeta(BeanUtil.bean2Map(request));
 
@@ -354,6 +337,47 @@ public class ChinaumsSenselessPayService extends SuperService {
         return ResultContent.buildFail(bodyMap.get("respDesc").toString());
     }
 
+    private List<SatInfo> buildSatInfo(String projectOid, BigDecimal total, String orderNo, String sysSourceNo, List<SatInfoModel> satInfoModels) {
+
+        return satInfoModels.stream().map(model -> {
+            if (BigDecimal.ZERO.compareTo(model.getRatio()) >= 0) {
+                return null;
+            }
+            String orgAccountName = orgPayAccountService.queryOgPayAccount(model.getOid(), PaymentType.UnionFrictionlessPay);
+
+            com.github.microservice.pay.client.ret.ResultContent<AccountModel> orgAccountModelResultContent = payProductAccountService.get(orgAccountName);
+            if (!orgAccountModelResultContent.getState().equals(ResultState.Success)) {
+                throw new RuntimeException("orgAccountModelResultContent.getMsg()");
+            }
+            ChinaumsSenselessConf orgConf = (ChinaumsSenselessConf) orgAccountModelResultContent.getContent().getConf();
+
+            String shareOrderNo = buildShareOrderNo(sysSourceNo);
+
+            SatInfo satInfo = new SatInfo();
+            satInfo.setMerId(orgConf.getMchId());
+            satInfo.setFeeBear("Y");
+            BigDecimal ratioTotal = total.multiply(model.getRatio());
+            satInfo.setSatAmt(ratioTotal.toBigInteger().toString());
+            satInfo.setMerOrderId(shareOrderNo);
+
+            ShareOrder shareOrder = new ShareOrder();
+            shareOrder.setOrderNo(orderNo);
+            shareOrder.setOid(model.getOid());
+            shareOrder.setProjectOid(projectOid);
+
+            shareOrder.setAmount(ratioTotal.toBigInteger().longValue());
+            shareOrder.setRatio(model.getRatio());
+            shareOrder.setShareOrderType(ShareOrderType.Pay);
+            shareOrder.setShareOrderNo(shareOrderNo);
+            shareOrderDao.save(shareOrder);
+            return satInfo;
+        }).toList();
+    }
+
+    private String buildShareOrderNo(String sysSourceNo){
+        return sysSourceNo + DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternyyyyMMddHHmmssSSS) + CommonUtil.randomCode(7);
+    }
+
     /**
      * orderNo: 支付订单号
      * refundOrderNo 退款订单号
@@ -363,13 +387,7 @@ public class ChinaumsSenselessPayService extends SuperService {
 
         String projectAccountName = orgPayAccountService.queryOgPayAccount(projectOid, PaymentType.UnionFrictionlessPay);
         //获取银联支付产品账户及需要签约的商户号
-        String orgAccountName = orgPayAccountService.queryOgPayAccount(oid, PaymentType.UnionFrictionlessPay);
 
-        com.github.microservice.pay.client.ret.ResultContent<AccountModel> orgAccountModelResultContent = payProductAccountService.get(orgAccountName);
-        if (!orgAccountModelResultContent.getState().equals(ResultState.Success)) {
-            return ResultContent.buildFail(orgAccountModelResultContent.getMsg());
-        }
-        ChinaumsSenselessConf orgConf = (ChinaumsSenselessConf) orgAccountModelResultContent.getContent().getConf();
 
         com.github.microservice.pay.client.ret.ResultContent<AccountModel> projectAccountModelResultContent = payProductAccountService.get(projectAccountName);
         if (!projectAccountModelResultContent.getState().equals(ResultState.Success)) {
@@ -386,31 +404,42 @@ public class ChinaumsSenselessPayService extends SuperService {
         request.setRefundAmount(total.toBigInteger().toString());
         request.setTargetOrderId(targetOrderId);
 
-
-        ShareOrder shareOrder = shareOrderDao.findTopByOrderNoAndProjectOidAndOidAndShareOrderType(orderNo, projectOid, oid, ShareOrderType.Pay);
-        String shareOrderNo = projectConf.getSysSourceNo() + DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternyyyyMMddHHmmssSSS) + CommonUtil.randomCode(7);
-
+        //TODO 放到扩展字段里,然后收到回调的时候再处理
+        List<ShareOrder> shareOrderList = shareOrderDao.findByOrderNoAndProjectOidAndShareOrderType(orderNo, projectOid, ShareOrderType.Pay);
+        List<SatInfo> satInfos = shareOrderList.stream().map(shareOrder -> {
+            String orgAccountName = orgPayAccountService.queryOgPayAccount(shareOrder.getOid(), PaymentType.UnionFrictionlessPay);
+            com.github.microservice.pay.client.ret.ResultContent<AccountModel> orgAccountModelResultContent = payProductAccountService.get(orgAccountName);
+            if (!orgAccountModelResultContent.getState().equals(ResultState.Success)) {
+                throw new RuntimeException(orgAccountModelResultContent.getMsg());
+            }
+            ChinaumsSenselessConf orgConf = (ChinaumsSenselessConf) orgAccountModelResultContent.getContent().getConf();
+
+            String shareOrderNo = projectConf.getSysSourceNo() + DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternyyyyMMddHHmmssSSS) + CommonUtil.randomCode(7);
+
+            SatInfo satInfo = new SatInfo();
+            satInfo.setMerId(orgConf.getMchId());
+            BigDecimal multiplyTotal = total.multiply(shareOrder.getRatio());
+            satInfo.setRefundAmt(multiplyTotal.toBigInteger().toString());
+            satInfo.setRefundOrderId(shareOrderNo);
+            satInfo.setOriMerOrderId(shareOrder.getShareOrderNo());
+
+            ShareOrder refundShareOrder = new ShareOrder();
+            refundShareOrder.setOrderNo(orderNo);
+            refundShareOrder.setOid(shareOrder.getOid());
+            refundShareOrder.setProjectOid(projectOid);
+            refundShareOrder.setAmount(multiplyTotal.toBigInteger().longValue());
+            refundShareOrder.setRatio(shareOrder.getRatio());
+            refundShareOrder.setShareOrderType(ShareOrderType.Refund);
+            refundShareOrder.setShareOrderNo(shareOrderNo);
+            refundShareOrder.setOriShareOrderNo(shareOrder.getShareOrderNo());
+            shareOrderDao.save(refundShareOrder);
+            return satInfo;
+        }).toList();
 
         VaFld vaFld = new VaFld();
-        SatInfo satInfo = new SatInfo();
-        satInfo.setMerId(orgConf.getMchId());
-//        satInfo.setFeeBear("Y");
-        satInfo.setRefundAmt(total.toBigInteger().toString());
-        satInfo.setRefundOrderId(shareOrderNo);
-        satInfo.setOriMerOrderId(shareOrder.getShareOrderNo());
-        vaFld.setSatInfo(List.of(satInfo));
+        vaFld.setSatInfo(satInfos);
         request.setVaFld(vaFld);
 
-        //TODO 放到扩展字段里,然后收到回调的时候再处理
-        ShareOrder refundShareOrder = new ShareOrder();
-        shareOrder.setOrderNo(orderNo);
-        shareOrder.setOid(oid);
-        shareOrder.setProjectOid(projectOid);
-        shareOrder.setAmount(total.toBigInteger().longValue());
-        shareOrder.setShareOrderType(ShareOrderType.Refund);
-        shareOrder.setShareOrderNo(shareOrderNo);
-        shareOrder.setOriShareOrderNo(shareOrder.getShareOrderNo());
-        shareOrderDao.save(refundShareOrder);
         request.setSrcReserve(JsonUtil.toJson(Map.of("userId", userId, "oid", oid, "projectOid", projectOid, "orderNo", refundOrderNo, "prefix", projectConf.getOrderNoPrefix())));
         payProductParameter.setMeta(BeanUtil.bean2Map(request));
         com.github.microservice.pay.client.ret.ResultContent<Object> refundResultContent = senselessPayService.refund(payProductParameter);
@@ -488,11 +517,12 @@ public class ChinaumsSenselessPayService extends SuperService {
         unionFrictionlessPayFinishModel.setTargetOrderId((String) refundBody.get("refundTargetOrderId"));
 
         if (handle && refundBody.get("status").equals("TRADE_SUCCESS") && refundBody.get("refundStatus").equals("SUCCESS")) {
+            RefundVaFld vaFld = JsonUtil.toObject(JsonUtil.toJson(refundBody.get("vaFld")), RefundVaFld.class);
             com.github.microservice.pay.client.ret.ResultContent<List<TransactionLogModel>> listResultContent = handleRefund(projectOid,
                     oid,
                     userId,
                     new BigDecimal((String) refundBody.get("sendBackAmount")),
-                    refundOrderNo, null);
+                    refundOrderNo, null, vaFld);
             unionFrictionlessPayFinishModel.setTransactionLogModelList(listResultContent);
         }
         return ResultContent.buildContent(unionFrictionlessPayFinishModel);
@@ -503,11 +533,11 @@ public class ChinaumsSenselessPayService extends SuperService {
         //TODO 判断支付状态
 
         //获取项目总账
-        PayAccount projectAccount = payAccountService.getProjectChildren(projectOid, PaymentChannelType.SecretFreePayment);
+//        PayAccount projectAccount = payAccountService.getProjectChildren(projectOid, PaymentChannelType.SecretFreePayment);
         //获取用户无感支付子账户
         PayAccount userBalancePayment = payAccountService.getUserChildren(projectOid, userId, PaymentChannelType.SecretFreePayment);
         //获取机构待结算账户
-        PayAccount orgWaitSettle = payAccountService.getOrgChildren(projectOid, oid, PaymentChannelType.WaitSettle);
+//        PayAccount orgWaitSettle = payAccountService.getOrgChildren(projectOid, oid, PaymentChannelType.WaitSettle);
 //        //支付:项目余额子账- 用户无感支付子账+
 //        //构建转账参数
 //        TransferTransactionsModel transferModel = new TransferTransactionsModel();
@@ -550,30 +580,47 @@ public class ChinaumsSenselessPayService extends SuperService {
         userSourceTransaction.setMeta(Map.of("paymentType", PaymentType.UnionFrictionlessPay, "description", "银联无感支付", "summary", "用户支付"));
         payTransferModel.setSource(new TransferTransactionsModel.GeneralLedgerTransaction[]{userSourceTransaction});
 
-        //构建入账账户
-        TransferTransactionsModel.GeneralLedgerTransaction orgDestinationTransaction = new TransferTransactionsModel.GeneralLedgerTransaction();
-        orgDestinationTransaction.setGeneralLedgerId(orgWaitSettle.getLedgerId());
-        orgDestinationTransaction.setOrderNumber(orderNo);
-        orgDestinationTransaction.setTransactionType(TransactionType.Pay);
-        orgDestinationTransaction.setTransactionStatus(TransactionStatus.Success);
-        orgDestinationTransaction.setAmount(total.longValue());
-        orgDestinationTransaction.setRemark(remark);
-        orgDestinationTransaction.setMeta(Map.of("paymentType", PaymentType.UnionFrictionlessPay, "description", "银联无感支付", "summary", "用户支付"));
-        payTransferModel.setDestinations(new TransferTransactionsModel.GeneralLedgerTransaction[]{orgDestinationTransaction});
+        List<ShareOrder> shareOrderList = shareOrderDao.findByOrderNoAndProjectOidAndShareOrderType(orderNo, projectOid, ShareOrderType.Pay);
+
+        List<TransferTransactionsModel.GeneralLedgerTransaction> orgDestinationTransactions = shareOrderList.stream().map(shareOrder -> {
+            //获取机构待结算账户
+            PayAccount orgWaitSettle = payAccountService.getOrgChildren(projectOid, shareOrder.getOid(), PaymentChannelType.WaitSettle);
+            TransferTransactionsModel.GeneralLedgerTransaction orgDestinationTransaction = new TransferTransactionsModel.GeneralLedgerTransaction();
+            orgDestinationTransaction.setGeneralLedgerId(orgWaitSettle.getLedgerId());
+            orgDestinationTransaction.setOrderNumber(orderNo);
+            orgDestinationTransaction.setTransactionType(TransactionType.Pay);
+            orgDestinationTransaction.setTransactionStatus(TransactionStatus.Success);
+            orgDestinationTransaction.setAmount(shareOrder.getAmount());
+            orgDestinationTransaction.setRemark(remark);
+            orgDestinationTransaction.setMeta(Map.of("paymentType", PaymentType.UnionFrictionlessPay, "description", "银联无感支付", "summary", "用户支付"));
+            return orgDestinationTransaction;
+        }).toList();
+
+//        //构建入账账户
+//        TransferTransactionsModel.GeneralLedgerTransaction orgDestinationTransaction = new TransferTransactionsModel.GeneralLedgerTransaction();
+//        orgDestinationTransaction.setGeneralLedgerId(orgWaitSettle.getLedgerId());
+//        orgDestinationTransaction.setOrderNumber(orderNo);
+//        orgDestinationTransaction.setTransactionType(TransactionType.Pay);
+//        orgDestinationTransaction.setTransactionStatus(TransactionStatus.Success);
+//        orgDestinationTransaction.setAmount(total.longValue());
+//        orgDestinationTransaction.setRemark(remark);
+//        orgDestinationTransaction.setMeta(Map.of("paymentType", PaymentType.UnionFrictionlessPay, "description", "银联无感支付", "summary", "用户支付"));
+//        payTransferModel.setDestinations(new TransferTransactionsModel.GeneralLedgerTransaction[]{orgDestinationTransaction});
+        payTransferModel.setDestinations(orgDestinationTransactions.toArray(new TransferTransactionsModel.GeneralLedgerTransaction[]{}));
         TransferTransactionsModels transactionsModels = new TransferTransactionsModels();
         transactionsModels.setItems(new TransferTransactionsModel[]{payTransferModel});
         return transactionLogService.transfers(transactionsModels);
     }
 
-    public com.github.microservice.pay.client.ret.ResultContent<List<TransactionLogModel>> handleRefund(String projectOid, String oid, String userId, BigDecimal total, String orderNo, String remark) {
+    public com.github.microservice.pay.client.ret.ResultContent<List<TransactionLogModel>> handleRefund(String projectOid, String oid, String userId, BigDecimal total, String orderNo, String remark, RefundVaFld vaFld) {
         //TODO 判断支付状态
 
-        //获取项目总账
-        PayAccount projectAccount = payAccountService.getProjectChildren(projectOid, PaymentChannelType.SecretFreePayment);
+//        //获取项目总账
+//        PayAccount projectAccount = payAccountService.getProjectChildren(projectOid, PaymentChannelType.SecretFreePayment);
         //获取用户无感支付子账户
         PayAccount userBalancePayment = payAccountService.getUserChildren(projectOid, userId, PaymentChannelType.SecretFreePayment);
         //获取机构待结算账户
-        PayAccount orgWaitSettle = payAccountService.getOrgChildren(projectOid, oid, PaymentChannelType.WaitSettle);
+
 //        //支付:项目余额子账+ 用户无感支付子账-
 //        //构建转账参数
 //        TransferTransactionsModel transferModel = new TransferTransactionsModel();
@@ -604,17 +651,36 @@ public class ChinaumsSenselessPayService extends SuperService {
 
         //支付:机构余额子账- 用户无感支付子账+
         //构建转账参数
+        List<RefundVaFld.SatDetail> satDetailList = vaFld.getSatDetail();
+        List<TransferTransactionsModel.GeneralLedgerTransaction> list = satDetailList.stream().map(satDetail -> {
+
+            ShareOrder shareOrderNo = shareOrderDao.findTopByShareOrderNo(satDetail.getRefundMerOrderId());
+            PayAccount orgWaitSettle = payAccountService.getOrgChildren(projectOid, shareOrderNo.getOid(), PaymentChannelType.WaitSettle);
+
+
+            TransferTransactionsModel.GeneralLedgerTransaction orgDestinationTransaction = new TransferTransactionsModel.GeneralLedgerTransaction();
+            orgDestinationTransaction.setGeneralLedgerId(orgWaitSettle.getLedgerId());
+            orgDestinationTransaction.setOrderNumber(orderNo);
+            orgDestinationTransaction.setTransactionType(TransactionType.Refund);
+            orgDestinationTransaction.setTransactionStatus(TransactionStatus.Success);
+            orgDestinationTransaction.setAmount(shareOrderNo.getAmount());
+            orgDestinationTransaction.setRemark(remark);
+            orgDestinationTransaction.setMeta(Map.of("paymentType", PaymentType.UnionFrictionlessPay, "description", "银联无感支付", "summary", "用户退款"));
+            return orgDestinationTransaction;
+        }).toList();
+
         TransferTransactionsModel payTransferModel = new TransferTransactionsModel();
-        //构建出账账户
-        TransferTransactionsModel.GeneralLedgerTransaction orgDestinationTransaction = new TransferTransactionsModel.GeneralLedgerTransaction();
-        orgDestinationTransaction.setGeneralLedgerId(orgWaitSettle.getLedgerId());
-        orgDestinationTransaction.setOrderNumber(orderNo);
-        orgDestinationTransaction.setTransactionType(TransactionType.Refund);
-        orgDestinationTransaction.setTransactionStatus(TransactionStatus.Success);
-        orgDestinationTransaction.setAmount(total.negate().longValue());
-        orgDestinationTransaction.setRemark(remark);
-        orgDestinationTransaction.setMeta(Map.of("paymentType", PaymentType.UnionFrictionlessPay, "description", "银联无感支付", "summary", "用户退款"));
-        payTransferModel.setSource(new TransferTransactionsModel.GeneralLedgerTransaction[]{orgDestinationTransaction});
+//        //构建出账账户
+//        TransferTransactionsModel.GeneralLedgerTransaction orgDestinationTransaction = new TransferTransactionsModel.GeneralLedgerTransaction();
+//        orgDestinationTransaction.setGeneralLedgerId(orgWaitSettle.getLedgerId());
+//        orgDestinationTransaction.setOrderNumber(orderNo);
+//        orgDestinationTransaction.setTransactionType(TransactionType.Refund);
+//        orgDestinationTransaction.setTransactionStatus(TransactionStatus.Success);
+//        orgDestinationTransaction.setAmount(total.negate().longValue());
+//        orgDestinationTransaction.setRemark(remark);
+//        orgDestinationTransaction.setMeta(Map.of("paymentType", PaymentType.UnionFrictionlessPay, "description", "银联无感支付", "summary", "用户退款"));
+//        payTransferModel.setSource(new TransferTransactionsModel.GeneralLedgerTransaction[]{orgDestinationTransaction});
+        payTransferModel.setSource(list.toArray(new TransferTransactionsModel.GeneralLedgerTransaction[]{}));
 
         //构建入账账户
         TransferTransactionsModel.GeneralLedgerTransaction userSourceTransaction = new TransferTransactionsModel.GeneralLedgerTransaction();