wujiefeng 1 год назад
Родитель
Сommit
b528a50cc9

+ 1 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/pay/RechargeOrderModel.java

@@ -19,7 +19,7 @@ public class RechargeOrderModel {
     private String payAccount;
 
     @Schema(description = "预支付单号(用于前端调起支付的参数)")
-    private String prepay;
+    private Object prepay;
 
     @Schema(description = "订单状态")
     private RechargeOrderStatus status;

+ 8 - 2
FullCardClient/src/main/java/com/zhongshu/card/client/type/payAccount/PayAccountLevel.java

@@ -4,8 +4,14 @@ import lombok.Getter;
 
 public enum PayAccountLevel {
 
-    Parent("父账户"),
-    Children("子账户");
+    projectParent("项目总账户"),
+
+    projectChildren("项目子账户"),
+
+    OrgParent("机构总账户"),
+    OrgChildren("机构子账户"),
+    UserParent("父账户"),
+    UserChildren("子账户");
 
     @Getter
     private String remark;

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

@@ -4,4 +4,6 @@ import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
 import com.zhongshu.card.server.core.domain.pay.BalanceRechargeOrder;
 
 public interface BalanceRechargeOrderDao extends MongoDao<BalanceRechargeOrder> {
+
+    BalanceRechargeOrder findTopByOrderNo(String orderNo);
 }

+ 11 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/pay/PayAccountDao.java

@@ -8,7 +8,16 @@ import com.zhongshu.card.server.core.domain.pay.PayAccount;
 
 public interface PayAccountDao extends MongoDao<PayAccount>, PayAccountDaoExtend {
 
-    PayAccount findTopByProjectOidAndOidAndLevelAndPaymentChannelType(String projectOid, String oid, PayAccountLevel level, PaymentChannelType paymentChannelType);
+    PayAccount findTopByProjectOidAndUserIdAndLevelAndPaymentChannelType(String projectOid, String userId, PayAccountLevel level, PaymentChannelType paymentChannelType);
+
+    PayAccount findTopByProjectOidAndLevel(String projectOid, PayAccountLevel level);
+
+    PayAccount findTopByProjectOidAndLevelAndPaymentChannelType(String projectOid, PayAccountLevel level, PaymentChannelType channelType);
+
+    PayAccount findTopByProjectOidAndUserIdAndLevel(String projectOid, String userId, PayAccountLevel level);
 
     PayAccount findTopByProjectOidAndOidAndLevel(String projectOid, String oid, PayAccountLevel level);
-}
+
+    PayAccount findTopByProjectOidAndOidAndLevelAndPaymentChannelType(String projectOid, String oid, PayAccountLevel level, PaymentChannelType channelType);
+
+}

+ 15 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/pay/BalanceRechargeOrder.java

@@ -1,6 +1,8 @@
 package com.zhongshu.card.server.core.domain.pay;
 
 import com.github.microservice.components.data.mongo.mongo.domain.SuperEntity;
+import com.github.microservice.types.payment.PaymentChannelType;
+import com.github.microservice.types.payment.PaymentType;
 import com.zhongshu.card.client.type.RechargeType;
 import com.zhongshu.card.client.type.payAccount.RechargeOrderStatus;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -13,15 +15,27 @@ import java.math.BigDecimal;
 @Document
 public class BalanceRechargeOrder extends SuperEntity {
 
+    @Schema(description = "项目oid")
+    private String projectOid;
+
+    @Schema(description = "用户id")
+    private String userId;
+
+    @Schema(description = "支付方式")
+    private PaymentType paymentType;
+
     @Schema(description = "支付账户")
     private String payAccount;
 
     @Schema(description = "预支付单号(用于前端调起支付的参数)")
-    private String prepayId;
+    private Object prepay;
 
     @Schema(description = "订单状态")
     private RechargeOrderStatus status;
 
+    @Schema(description = "状态说明")
+    private String statusDesc;
+
     @Schema(description = "金额")
     private BigDecimal total = BigDecimal.ZERO;
 

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

@@ -27,9 +27,6 @@ public class PayAccount extends SuperEntity {
     //用户id
     private String userId;
 
-    @DBRef(lazy = true)
-    private UserAccount userAccount;
-
     //机构id
     private String oid;
 

+ 104 - 7
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/pay/BalancePayService.java

@@ -3,10 +3,18 @@ package com.zhongshu.card.server.core.service.pay;
 import com.github.microservice.core.util.JsonUtil;
 import com.github.microservice.core.util.bean.BeanUtil;
 import com.github.microservice.pay.client.model.PayProductParameter;
+import com.github.microservice.pay.client.model.ledger.TransactionLogModel;
+import com.github.microservice.pay.client.model.ledger.TransferTransactionsModel;
+import com.github.microservice.pay.client.model.weChatMiniApp.WeChatMiniAppPayRet;
 import com.github.microservice.pay.client.ret.ResultContent;
 import com.github.microservice.pay.client.ret.ResultState;
+import com.github.microservice.pay.client.service.ledger.TransactionLogService;
 import com.github.microservice.pay.client.service.product.MiniAppPayService;
+import com.github.microservice.pay.client.type.ledger.TransactionStatus;
+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.wechat.pay.java.service.payments.model.Transaction;
 import com.zhongshu.card.client.model.pay.PayAccountParam;
 import com.zhongshu.card.client.model.pay.RechargeOrderModel;
 import com.zhongshu.card.client.model.pay.RechargeParam;
@@ -16,13 +24,16 @@ import com.zhongshu.card.server.core.dao.pay.BalanceRechargeOrderDao;
 import com.zhongshu.card.server.core.domain.pay.BalanceRechargeOrder;
 import com.zhongshu.card.server.core.domain.pay.PayAccount;
 import com.zhongshu.card.server.core.service.paySetting.OrgPayAccountService;
+import com.zhongshu.card.server.core.service.paySetting.ProjectPaySettingServiceImpl;
 import com.zhongshu.card.server.core.util.BeanUtils;
 import com.zhongshu.card.server.core.util.CommonUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 
 @Service
@@ -40,19 +51,22 @@ public class BalancePayService {
     @Autowired
     OrgPayAccountService orgPayAccountService;
 
+    @Autowired
+    ProjectPaySettingServiceImpl projectPaySettingService;
+
+    @Autowired
+    TransactionLogService transactionLogService;
+
 
     /**
      * 下单并生成调用支付参数
      */
+    @Transactional
     public Object recharge(RechargeParam param){
         //根据项目id和支付渠道获取支付账户名
-        orgPayAccountService.getProjectWxAccount(param.getProjectOid());
-        String accountName = "";
-
-        //创建业务账户及支付中心账本
-        PayAccount payAccount = payAccountService.get(param.getUserId(), param.getProjectOid(), param.getOid(), PayAccountLevel.Children, param.getPaymentType());
+        String accountName = orgPayAccountService.queryOgPayAccount(param.getProjectOid(), param.getPaymentType());;
         //生成订单id
-        String orderNo = param.getPaymentType().name()+CommonUtil.UUID();
+        String orderNo = CommonUtil.UUID();
         //调用小程序支付
         PayProductParameter<Object> payProductParameter = new PayProductParameter<>();
         param.setOrderNo(orderNo);
@@ -63,17 +77,100 @@ public class BalancePayService {
         if (!prepay.getState().equals(ResultState.Success)){
             return prepay;
         }
+        PayAccount payAccount = payAccountService.getUserChildren(param.getProjectOid(), param.getUserId(), param.getPaymentType().getChannelType());
         //创建订单
         BalanceRechargeOrder balanceRechargeOrder = new BalanceRechargeOrder();
+        balanceRechargeOrder.setProjectOid(param.getProjectOid());
+        balanceRechargeOrder.setUserId(param.getUserId());
+        balanceRechargeOrder.setPaymentType(param.getPaymentType());
         balanceRechargeOrder.setPayAccount(payAccount.getId());
         balanceRechargeOrder.setStatus(RechargeOrderStatus.Wait);
         balanceRechargeOrder.setOrderNo(orderNo);
         balanceRechargeOrder.setTotal(new BigDecimal(param.getTotal()));
-        balanceRechargeOrder.setPrepayId(JsonUtil.toJson(prepay.getContent()));
+        balanceRechargeOrder.setPrepay(prepay.getContent());
         rechargeOrderDao.save(balanceRechargeOrder);
         return ResultContent.buildContent(toModel(balanceRechargeOrder));
     }
 
+    public void handleWeChatCallback(WeChatMiniAppPayRet ret){
+        BalanceRechargeOrder rechargeOrder = rechargeOrderDao.findTopByOrderNo(ret.getOutTradeNo());
+        switch (ret.getTradeState()) {
+            case "SUCCESS" -> {
+                rechargeOrder.setStatus(RechargeOrderStatus.Success);
+                //获取项目总账户
+                PayAccount projectPayAccount = payAccountService.getProjectParent(rechargeOrder.getProjectOid());
+                //获取用户余额支付子账
+                PayAccount userPayAccount = payAccountService.getUserChildren(rechargeOrder.getProjectOid(), rechargeOrder.getUserId(), rechargeOrder.getPaymentType().getChannelType());
+                //构建转账参数
+                TransferTransactionsModel transferModel = new TransferTransactionsModel();
+                //构建出账账户
+                TransferTransactionsModel.GeneralLedgerTransaction sourceTransaction = new TransferTransactionsModel.GeneralLedgerTransaction();
+                sourceTransaction.setGeneralLedgerId(projectPayAccount.getLedgerId());
+                sourceTransaction.setOrderNumber(rechargeOrder.getOrderNo());
+                sourceTransaction.setTransactionType(TransactionType.Deposit);
+                sourceTransaction.setTransactionStatus(TransactionStatus.Success);
+                sourceTransaction.setAmount(rechargeOrder.getTotal().negate().longValue());
+                sourceTransaction.setRemark("用户余额充值");
+                transferModel.setSource(new TransferTransactionsModel.GeneralLedgerTransaction[]{sourceTransaction});
+
+                //构建入账账户
+                TransferTransactionsModel.GeneralLedgerTransaction destinationTransaction = new TransferTransactionsModel.GeneralLedgerTransaction();
+                destinationTransaction.setGeneralLedgerId(userPayAccount.getLedgerId());
+                destinationTransaction.setOrderNumber(rechargeOrder.getOrderNo());
+                destinationTransaction.setTransactionType(TransactionType.Transfer);
+                destinationTransaction.setTransactionStatus(TransactionStatus.Success);
+                destinationTransaction.setAmount(rechargeOrder.getTotal().longValue());
+                destinationTransaction.setRemark("用户余额充值");
+                transferModel.setDestinations(new TransferTransactionsModel.GeneralLedgerTransaction[]{destinationTransaction});
+                //发起转账
+                ResultContent<List<TransactionLogModel>> transfer = transactionLogService.transfer(transferModel);
+                if (transfer.getState().equals(ResultState.Success)) {
+                    //处理订单状态
+                    rechargeOrder.setStatus(RechargeOrderStatus.Success);
+                }
+            }
+            case "PAYERROR", "REFUND" -> {
+                rechargeOrder.setStatus(RechargeOrderStatus.Fail);
+                rechargeOrder.setStatusDesc(ret.getTradeStateDesc());
+            }
+            case "CLOSED" -> {
+                rechargeOrder.setStatus(RechargeOrderStatus.Cancel);
+                rechargeOrder.setStatusDesc(rechargeOrder.getStatusDesc());
+            }
+        }
+        rechargeOrderDao.save(rechargeOrder);
+    }
+
+    public Object balancePay(String projectOid, String oid, String userId, BigDecimal total, String orderNo, String remark){
+        //获取用户余额支付子账户
+        PayAccount userBalancePayment = payAccountService.getUserChildren(projectOid, userId, PaymentChannelType.BalancePayment);
+        //获取机构待结算账户
+        PayAccount orgWaitSettle = payAccountService.getOrgChildren(projectOid, oid, PaymentChannelType.WaitSettle);
+        //支付:用户余额子账- 项目待结算子账+
+        //构建转账参数
+        TransferTransactionsModel transferModel = new TransferTransactionsModel();
+        //构建出账账户
+        TransferTransactionsModel.GeneralLedgerTransaction sourceTransaction = new TransferTransactionsModel.GeneralLedgerTransaction();
+        sourceTransaction.setGeneralLedgerId(userBalancePayment.getLedgerId());
+        sourceTransaction.setOrderNumber(orderNo);
+        sourceTransaction.setTransactionType(TransactionType.Pay);
+        sourceTransaction.setTransactionStatus(TransactionStatus.Success);
+        sourceTransaction.setAmount(total.negate().longValue());
+        sourceTransaction.setRemark(remark);
+        transferModel.setSource(new TransferTransactionsModel.GeneralLedgerTransaction[]{sourceTransaction});
+        //构建入账账户
+        TransferTransactionsModel.GeneralLedgerTransaction destinationTransaction = new TransferTransactionsModel.GeneralLedgerTransaction();
+        destinationTransaction.setGeneralLedgerId(orgWaitSettle.getLedgerId());
+        destinationTransaction.setOrderNumber(orderNo);
+        destinationTransaction.setTransactionType(TransactionType.Receive);
+        destinationTransaction.setTransactionStatus(TransactionStatus.Success);
+        destinationTransaction.setAmount(total.longValue());
+        destinationTransaction.setRemark(remark);
+        transferModel.setDestinations(new TransferTransactionsModel.GeneralLedgerTransaction[]{destinationTransaction});
+        //发起转账
+        return transactionLogService.transfer(transferModel);
+    }
+
     private RechargeOrderModel toModel(BalanceRechargeOrder balanceRechargeOrder){
         RechargeOrderModel rechargeOrderModel = new RechargeOrderModel();
         if (balanceRechargeOrder != null){

+ 158 - 57
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/pay/PayAccountService.java

@@ -6,6 +6,7 @@ import com.github.microservice.pay.client.model.ledger.GeneralLedgerModel;
 import com.github.microservice.pay.client.model.ledger.GeneralLedgerTreeModel;
 import com.github.microservice.pay.client.ret.ResultState;
 import com.github.microservice.pay.client.service.ledger.GeneralLedgerService;
+import com.github.microservice.types.payment.PaymentChannelType;
 import com.github.microservice.types.payment.PaymentType;
 import com.zhongshu.card.client.model.pay.PayAccountParam;
 import com.zhongshu.card.client.type.payAccount.PayAccountLevel;
@@ -20,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.HashMap;
 import java.util.Map;
 
 @Service
@@ -38,85 +40,184 @@ public class PayAccountService {
     @Autowired
     GeneralLedgerService generalLedgerService;
 
-    @Transactional
-    public PayAccount get(String userId, String projectOid, String oid, PayAccountLevel level, PaymentType paymentType){
-        PayAccount payAccount = payAccountDao.findTopByProjectOidAndOidAndLevelAndPaymentChannelType(projectOid,
-                oid, level, paymentType.getChannelType());
-        if (payAccount == null){
-            payAccount = upsert(userId, projectOid, oid, level, paymentType);
+    /**
+     * 获取项目总账户
+     */
+    public PayAccount getProjectParent(String projectOid){
+        PayAccount payAccount = payAccountDao.findTopByProjectOidAndLevel(projectOid, PayAccountLevel.projectParent);
+        if (payAccount==null){
+            payAccount = createProjectParentAccount(projectOid);
         }
         return payAccount;
     }
+
     /**
-     * 获取账户
+     * 获取项目子账户
      */
-    @Transactional
-    public PayAccount get(PayAccountParam param){
-        //参数校验
-        return get(param.getUserId(), param.getProjectOid(), param.getOid(), param.getLevel(), param.getPaymentType());
+    @SneakyThrows
+    public PayAccount getProjectChildren(String projectOid, PaymentChannelType channelType){
+        PayAccount parent = getProjectParent(projectOid);
+        if (parent==null){
+            throw new Exception("获取项目总账户失败");
+        }
+        PayAccount payAccount = payAccountDao.findTopByProjectOidAndLevelAndPaymentChannelType(projectOid, PayAccountLevel.projectChildren, channelType);
+        if (payAccount==null){
+            payAccount = createProjectChildrenAccount(projectOid, channelType, parent);
+        }
+        return payAccount;
     }
 
     /**
-     * 创建账户
+     * 获取用户总账户
+     */
+    public PayAccount getUserParent(String projectOid, String userId){
+        PayAccount payAccount = payAccountDao.findTopByProjectOidAndUserIdAndLevel(projectOid, userId, PayAccountLevel.UserParent);
+        if (payAccount==null){
+            payAccount = createUserParentAccount(projectOid, userId);
+        }
+        return payAccount;
+    }
+
+
+    /**
+     * 获取用户子账户
      */
-    @Transactional
     @SneakyThrows
-    public PayAccount upsert(String userId, String projectOid, String oid, PayAccountLevel level, PaymentType paymentType){
-        //处理userId
-        if (StringUtils.isBlank(userId)){
-            userId = authHelper.getCurrentUser().getUserId();
+    public PayAccount getUserChildren(String projectOid, String userId, PaymentChannelType channelType){
+        PayAccount payAccount = payAccountDao.findTopByProjectOidAndUserIdAndLevelAndPaymentChannelType(projectOid, userId, PayAccountLevel.UserChildren, channelType);
+        if (payAccount==null){
+            PayAccount parent = getUserParent(projectOid, userId);
+            if (parent==null){
+                throw new Exception("获取用户总账户失败");
+            }
+            payAccount = createUserChildrenAccount(projectOid, userId, channelType, parent);
         }
-        PayAccount parent = payAccountDao.findTopByProjectOidAndOidAndLevel(projectOid,
-                oid, PayAccountLevel.Parent);
-        //创建父账户
-        if (parent==null){
-            parent = createParentPayAccount(projectOid, oid, paymentType, userId);
+        return payAccount;
+    }
+
+    /**
+     * 获取机构总账户
+     * @return
+     */
+    public PayAccount getOrgParent(String projectOid, String oid){
+        PayAccount payAccount = payAccountDao.findTopByProjectOidAndOidAndLevel(projectOid, oid, PayAccountLevel.OrgParent);
+        if (payAccount==null){
+            payAccount = createOrgParentAccount(projectOid, oid);
         }
-        if (level.equals(PayAccountLevel.Parent)){
-            return parent;
-        }else {
-            PayAccount children = payAccountDao.findTopByProjectOidAndOidAndLevelAndPaymentChannelType(projectOid,
-                    oid, PayAccountLevel.Parent, paymentType.getChannelType());
-            //创建子账户
-            if (children==null){
-                createChildrenPayAccount(projectOid, oid, paymentType, userId, parent);
+        return payAccount;
+    }
+
+    /**
+     * 获取机构子账户
+     * @return
+     */
+    @SneakyThrows
+    public PayAccount getOrgChildren(String projectOid, String oid, PaymentChannelType channelType){
+        PayAccount payAccount = payAccountDao.findTopByProjectOidAndOidAndLevelAndPaymentChannelType(projectOid, oid,PayAccountLevel.OrgChildren, channelType);
+        if (payAccount==null){
+            PayAccount parent = getOrgParent(projectOid, oid);
+            if (parent==null){
+                throw new Exception("获取机构总账户失败");
             }
-            return children;
+            payAccount = createOrgChildrenAccount(projectOid, oid, channelType, parent);
+        }
+        return payAccount;
+    }
+
+    @SneakyThrows
+    private PayAccount createOrgChildrenAccount(String projectOid, String oid, PaymentChannelType channelType, PayAccount parent) {
+        PayAccount payAccount = new PayAccount();
+        payAccount.setProjectOid(projectOid);
+        payAccount.setParent(parent);
+        payAccount.setOid(oid);
+        payAccount.setPaymentChannelType(channelType);
+        payAccount.setLevel(PayAccountLevel.OrgChildren);
+        String ledgerId = createLedger("机构子账-" + channelType.getRemark(),
+                parent.getLedgerId(),
+                Map.of("projectOid", projectOid, "paymentChannelType", channelType, "level", PayAccountLevel.OrgParent));
+        if (StringUtils.isBlank(ledgerId)){
+            throw new Exception("支付中心创建用户子账失败");
+        }
+        payAccount.setLedgerId(ledgerId);
+        payAccountDao.save(payAccount);
+        return payAccount;
+    }
+
+
+    @SneakyThrows
+    private PayAccount createOrgParentAccount(String projectOid, String oid) {
+        PayAccount payAccount = new PayAccount();
+        payAccount.setProjectOid(projectOid);
+        payAccount.setOid(oid);
+        payAccount.setLevel(PayAccountLevel.projectParent);
+        String ledgerId = createLedger("机构总账", null, Map.of("projectOid", projectOid, "oid", oid, "level", PayAccountLevel.OrgParent));
+        if (StringUtils.isBlank(ledgerId)){
+            throw new Exception("支付中心创建机构总账失败");
+        }
+        payAccountDao.save(payAccount);
+        return payAccount;
+    }
+
+    @SneakyThrows
+    private PayAccount createUserChildrenAccount(String projectOid, String userId, PaymentChannelType channelType, PayAccount parent) {
+        PayAccount payAccount = new PayAccount();
+        payAccount.setProjectOid(projectOid);
+        payAccount.setParent(parent);
+        payAccount.setUserId(userId);
+        payAccount.setPaymentChannelType(channelType);
+        payAccount.setLevel(PayAccountLevel.UserChildren);
+        String ledgerId = createLedger("用户子账-" + channelType.getRemark(), parent.getLedgerId(), Map.of("projectOid", projectOid, "paymentChannelType", channelType));
+        if (StringUtils.isBlank(ledgerId)){
+            throw new Exception("支付中心创建用户子账失败");
         }
+        payAccount.setLedgerId(ledgerId);
+        payAccountDao.save(payAccount);
+        return payAccount;
     }
 
-    private void createChildrenPayAccount(String projectOid, String oid, PaymentType paymentType, String userId, PayAccount parent) throws Exception {
-        PayAccount children;
-        children = new PayAccount();
-        children.setParent(parent);
-        children.setProjectOid(projectOid);
-        children.setOid(oid);
-        children.setUserId(userId);
-        children.setLevel(PayAccountLevel.Children);
-//        children.setPaymentType(paymentType);
-        children.setPaymentChannelType(paymentType.getChannelType());
-        String ledgerId = createLedger(paymentType.getChannelType().getRemark(), parent.getLedgerId(), null);
+    @SneakyThrows
+    private PayAccount createUserParentAccount(String projectOid, String userId) {
+        PayAccount payAccount = new PayAccount();
+        payAccount.setProjectOid(projectOid);
+        payAccount.setUserId(userId);
+        payAccount.setLevel(PayAccountLevel.UserParent);
+        String ledgerId = createLedger("用户总账", null, Map.of("projectOid", projectOid, "userId", userId));
         if (StringUtils.isBlank(ledgerId)){
-            throw new Exception("支付中心创建子账本失败");
+            throw new Exception("支付中心创建用户总账失败");
         }
-        payAccountDao.save(children);
+        payAccountDao.save(payAccount);
+        return payAccount;
     }
 
-    @NotNull
-    private PayAccount createParentPayAccount(String projectOid, String oid, PaymentType paymentType, String userId) throws Exception {
-        PayAccount parent;
-        parent = new PayAccount();
-        parent.setProjectOid(projectOid);
-        parent.setOid(oid);
-        parent.setUserId(userId);
-        parent.setLevel(PayAccountLevel.Parent);
-        String ledgerId = createLedger(paymentType.getChannelType().getRemark(), null, null);
+
+    @SneakyThrows
+    private PayAccount createProjectChildrenAccount(String projectOid, PaymentChannelType channelType, PayAccount parent) {
+        PayAccount payAccount = new PayAccount();
+        payAccount.setProjectOid(projectOid);
+        payAccount.setParent(parent);
+        payAccount.setPaymentChannelType(channelType);
+        payAccount.setLevel(PayAccountLevel.projectChildren);
+        String ledgerId = createLedger("项目子账-" + channelType.getRemark(), parent.getLedgerId(), Map.of("projectOid", projectOid, "paymentChannelType", channelType));
         if (StringUtils.isBlank(ledgerId)){
-            throw new Exception("支付中心创建父账本失败");
+            throw new Exception("支付中心创建项目子账失败");
         }
-        parent.setLedgerId(ledgerId);
-        payAccountDao.save(parent);
-        return parent;
+        payAccount.setLedgerId(ledgerId);
+        payAccountDao.save(payAccount);
+        return payAccount;
+    }
+
+
+    @SneakyThrows
+    private PayAccount createProjectParentAccount(String projectOid){
+        PayAccount payAccount = new PayAccount();
+        payAccount.setProjectOid(projectOid);
+        payAccount.setLevel(PayAccountLevel.projectParent);
+        String ledgerId = createLedger("项目总账", null, Map.of("projectOid", projectOid));
+        if (StringUtils.isBlank(ledgerId)){
+            throw new Exception("支付中心创建项目总账失败");
+        }
+        payAccountDao.save(payAccount);
+        return payAccount;
     }
 
     private String createLedger(String name, String parentLedgerId, Map<String, Object> meta){

+ 8 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/stream/WeChatMiniAppPayStream.java

@@ -2,14 +2,21 @@ package com.zhongshu.card.server.core.stream;
 
 import com.github.microservice.app.stream.StreamConsumer;
 import com.github.microservice.pay.client.model.weChatMiniApp.WeChatMiniAppPayRet;
+import com.zhongshu.card.server.core.service.pay.BalancePayService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Slf4j
 @Component("WeChatMiniAppPayStream")
 public class WeChatMiniAppPayStream extends StreamConsumer<WeChatMiniAppPayRet> {
+
+    @Autowired
+    BalancePayService balancePayService;
+
     @Override
     public void accept(WeChatMiniAppPayRet weChatMiniAppPayRet) {
-
+        log.info("---------------收到微信支付结果通知广播----------------");
+        balancePayService.handleWeChatCallback(weChatMiniAppPayRet);
     }
 }