Kaynağa Gözat

分账流程修改

guomengjiao 3 ay önce
ebeveyn
işleme
bb2a497a35
17 değiştirilmiş dosya ile 320 ekleme ve 146 silme
  1. 0 2
      ruoyi-admin/src/main/java/com/ruoyi/schedule/BusinessSchedule.java
  2. 4 5
      ruoyi-api/src/main/java/com/ruoyi/api/controller/pay/ApiNotifyController.java
  3. 2 2
      ruoyi-api/src/main/java/com/ruoyi/api/controller/shop/ApiShopOrderController.java
  4. 4 0
      ruoyi-business/pom.xml
  5. 8 0
      ruoyi-business/src/main/java/com/ruoyi/business/domain/Business.java
  6. 10 0
      ruoyi-business/src/main/java/com/ruoyi/business/domain/bo/BusinessBo.java
  7. 10 0
      ruoyi-business/src/main/java/com/ruoyi/business/domain/vo/BusinessVo.java
  8. 16 8
      ruoyi-business/src/main/java/com/ruoyi/businessDayBill/domain/BusinessDayBill.java
  9. 20 7
      ruoyi-business/src/main/java/com/ruoyi/businessDayBill/domain/vo/BusinessDayBillVo.java
  10. 36 1
      ruoyi-business/src/main/java/com/ruoyi/businessDayBill/service/impl/BusinessDayBillServiceImpl.java
  11. 5 5
      ruoyi-line/src/main/java/com/ruoyi/onlineorder/service/impl/OnlineOrderServiceImpl.java
  12. 2 2
      ruoyi-line/src/main/java/com/ruoyi/onlinerefundorder/service/impl/OnlineRefundOrderServiceImpl.java
  13. 56 6
      ruoyi-newwxpay/src/main/java/com/ruoyi/fubeiPay/domain/PayBo.java
  14. 141 103
      ruoyi-newwxpay/src/main/java/com/ruoyi/fubeiPay/service/FubeiPayService.java
  15. 3 3
      ruoyi-shop/src/main/java/com/ruoyi/shop/order/service/impl/ShopOrderServiceImpl.java
  16. 2 2
      ruoyi-shop/src/main/java/com/ruoyi/shop/rights/service/impl/SaleRightsOrderServiceImpl.java
  17. 1 0
      ruoyi-system/src/main/java/com/ruoyi/system/enums/SequencePrefixEnum.java

+ 0 - 2
ruoyi-admin/src/main/java/com/ruoyi/schedule/BusinessSchedule.java

@@ -1,7 +1,5 @@
 package com.ruoyi.schedule;
 
-import cn.hutool.core.date.DateField;
-import cn.hutool.core.date.DateUtil;
 import com.ruoyi.business.domain.Business;
 import com.ruoyi.business.service.IBusinessService;
 import com.ruoyi.businessDayBill.service.IBusinessDayBillService;

+ 4 - 5
ruoyi-api/src/main/java/com/ruoyi/api/controller/pay/ApiNotifyController.java

@@ -84,8 +84,8 @@ public class ApiNotifyController extends AbstractApiController {
             if (notifyResult.getOutTradeNo().startsWith(SequencePrefixEnum.SHOP_ORDER.getCode())) {
                 ShopOrder order = iShopOrderService.orderPayCallback(notifyResult);
 
-                //平台收入结算处理
-                iShopOrderService.platformIncomeSettleHandle(order);
+                //平台收入结算处理 改成第二天零点整开始结算,
+//                iShopOrderService.platformIncomeSettleHandle(order);
                 try {
                     iShopOrderMqProductService.autoStockUpMqProductSend(order.getOrderId());
                 } catch (Exception e) {
@@ -104,9 +104,8 @@ public class ApiNotifyController extends AbstractApiController {
                 OnlineOrder onlineOrder = onlineOrderService.orderPayCallback(notifyResult);
 
                 if (ObjectUtil.isNotNull(onlineOrder)) {
-                    //支付成功之后需要把平台所得立即给商家,设用第三方接口
-
-                    onlineOrderService.platformIncomeSettleHandle(onlineOrder);
+                    //支付成功之后需要把平台所得立即给商家,设用第三方接口 改成第二天零点整开始结算,
+//                    onlineOrderService.platformIncomeSettleHandle(onlineOrder);
 
                     int lazyTime = Long.valueOf(DateUtil.between(new Date(), onlineOrder.getLastEndTime(), DateUnit.MS)).intValue();
                     rabbitMqClient.send(DelayedConstant.OnLineOrderEndDelayedConstant.ON_LINE_ORDER_END_DELAYED_EXCHANGE,

+ 2 - 2
ruoyi-api/src/main/java/com/ruoyi/api/controller/shop/ApiShopOrderController.java

@@ -212,7 +212,7 @@ public class ApiShopOrderController extends AbstractApiController {
         //TODO 调用第三方支付接口
         String payOrderNo = iShopOrderService.updatePayOrderNo(order);
         //支付金额为分
-        Integer money = Integer.valueOf(order.getActualPayment().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_DOWN).toString());
+        Long money = Long.valueOf(order.getActualPayment().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_DOWN).toString());
         FubeiPayWay payWay = FubeiPayWay.W_WX_LITE;
         UserThirdType userThirdType = UserThirdType.WX_CASHIER_MINI_PROGRAM;
         if (PaymentMethod.ALIPAY.equals(order.getPaymentMethod())) {
@@ -221,7 +221,7 @@ public class ApiShopOrderController extends AbstractApiController {
         }
         UserThirdIdentity userThirdIdentity = userThirdIdentityService.loadByUserId(userId, userThirdType, true);
         // 构建支付参数
-        PayBo pay = new PayBo(payWay, business.getFuMchNo(), business.getFuKey(), payOrderNo
+        PayBo pay = new PayBo(payWay, business.getFuMchNo(), business.getFuAppId(), business.getFuKey(), payOrderNo
             , userThirdIdentity.getIdentityCode(),  money, "在线订单支付", String.format("在线订单支付:%s", business.getBusinessName()));
         // 发起付贝支付
         PayVo payOrder = fubeiPayService.createPayOrder(pay);

+ 4 - 0
ruoyi-business/pom.xml

@@ -36,6 +36,10 @@
             <groupId>com.ruoyi</groupId>
             <artifactId>ruoyi-base</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-newwxpay</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 8 - 0
ruoyi-business/src/main/java/com/ruoyi/business/domain/Business.java

@@ -255,6 +255,10 @@ public class Business extends BaseEntity {
      * 付贝商户号
      */
     private String fuMchNo;
+    /**
+     * 付贝appid
+     */
+    private String fuAppId;
     /**
      * 付贝密钥
      */
@@ -263,6 +267,10 @@ public class Business extends BaseEntity {
      * 付贝渠道商户号
      */
     private String fuChannelMchNo;
+    /**
+     * 付贝分账ID
+     */
+    private String fuReceiverId;
     /**
      * 二维码的路径
      */

+ 10 - 0
ruoyi-business/src/main/java/com/ruoyi/business/domain/bo/BusinessBo.java

@@ -390,6 +390,11 @@ public class BusinessBo extends BaseEntity {
      */
     @ApiModelProperty(value = "付贝商户号")
     private String fuMchNo;
+    /**
+     * 付贝appid
+     */
+    @ApiModelProperty(value = "付贝appid")
+    private String fuAppId;
     /**
      * 付贝密钥
      */
@@ -400,6 +405,11 @@ public class BusinessBo extends BaseEntity {
      */
     @ApiModelProperty(value = "付贝渠道商户号")
     private String fuChannelMchNo;
+    /**
+     * 付贝分账ID
+     */
+    @ApiModelProperty(value = "付贝分账ID")
+    private String fuReceiverId;
 
     @FilePathValue
     @ApiModelProperty(value = "商家结算信息")

+ 10 - 0
ruoyi-business/src/main/java/com/ruoyi/business/domain/vo/BusinessVo.java

@@ -393,6 +393,11 @@ public class BusinessVo extends BaseVo {
      */
     @ApiModelProperty(value = "付贝商户号")
     private String fuMchNo;
+    /**
+     * 付贝appid
+     */
+    @ApiModelProperty(value = "付贝appid")
+    private String fuAppId;
     /**
      * 付贝密钥
      */
@@ -403,6 +408,11 @@ public class BusinessVo extends BaseVo {
      */
     @ApiModelProperty(value = "付贝渠道商户号")
     private String fuChannelMchNo;
+    /**
+     * 付贝分账ID
+     */
+    @ApiModelProperty(value = "付贝分账ID")
+    private String fuReceiverId;
 
     /**
      * 二维码的路径

+ 16 - 8
ruoyi-business/src/main/java/com/ruoyi/businessDayBill/domain/BusinessDayBill.java

@@ -1,17 +1,13 @@
 package com.ruoyi.businessDayBill.domain;
 
-import com.baomidou.mybatisplus.annotation.*;
-import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.enums.CallInterfaceStatus;
 import lombok.Data;
-import lombok.NoArgsConstructor;
-import java.io.Serializable;
-import java.util.Date;
-import java.math.BigDecimal;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ruoyi.common.core.domain.BaseEntity;
 
 /**
  * 商家日账单对象 tb_business_day_bill
@@ -140,5 +136,17 @@ public class BusinessDayBill implements Serializable {
      * 积分核销发发积分额
      */
     private BigDecimal pointVerifiedOrderAmount;
+    /**
+     * 平台所得分账状态
+     */
+    private CallInterfaceStatus platformIncomeSettled;
+    /**
+     * 平台分账订单号
+     */
+    private String platformSettledOrderNo;
+    /**
+     * 平台分账渠道订单号
+     */
+    private String platformSettledChannelOrderId;
 
 }

+ 20 - 7
ruoyi-business/src/main/java/com/ruoyi/businessDayBill/domain/vo/BusinessDayBillVo.java

@@ -1,18 +1,15 @@
 package com.ruoyi.businessDayBill.domain.vo;
 
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.Date;
-
 import cn.hutool.core.date.DateUtil;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
-import com.ruoyi.common.annotation.ExcelDictFormat;
-import com.ruoyi.common.convert.ExcelDictConvert;
+import com.ruoyi.common.enums.CallInterfaceStatus;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 
@@ -164,6 +161,22 @@ public class BusinessDayBillVo implements Serializable {
     @ApiModelProperty(value = "年-月")
     private String yearMonthValue;
 
+    /**
+     * 平台所得分账状态
+     */
+    @ApiModelProperty(value = "平台所得分账状态")
+    private CallInterfaceStatus platformIncomeSettled;
+    /**
+     * 平台分账订单号
+     */
+    @ApiModelProperty(value = "平台分账订单号")
+    private String platformSettledOrderNo;
+    /**
+     * 平台分账渠道订单号
+     */
+    @ApiModelProperty(value = "平台分账渠道订单号")
+    private String platformSettledChannelOrderId;
+
     public void loadWeekValue() {
         if(billDay != null)
         {

+ 36 - 1
ruoyi-business/src/main/java/com/ruoyi/businessDayBill/service/impl/BusinessDayBillServiceImpl.java

@@ -22,11 +22,17 @@ import com.ruoyi.businessDayBill.mapper.BusinessDayBillMapper;
 import com.ruoyi.businessDayBill.service.IBusinessDayBillService;
 import com.ruoyi.common.core.domain.PageQuery;
 import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.CallInterfaceStatus;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanCopyUtils;
 import com.ruoyi.common.utils.MathUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.fubeiPay.domain.PayBo;
+import com.ruoyi.fubeiPay.service.FubeiPayService;
+import com.ruoyi.system.enums.SequencePrefixEnum;
+import com.ruoyi.system.service.ISysSequenceService;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -38,6 +44,7 @@ import java.util.*;
  * @author lubo
  * @date 2025-11-28
  */
+@Slf4j
 @RequiredArgsConstructor
 @Service
 public class BusinessDayBillServiceImpl implements IBusinessDayBillService {
@@ -46,7 +53,8 @@ public class BusinessDayBillServiceImpl implements IBusinessDayBillService {
     private final IBusinessService businessService;
     private final OnLineOrderProperties onLineOrderProperties;
     private final IRevenueSharingConfigService revenueSharingConfigService;
-
+    private final FubeiPayService fubeiPayService;
+    private final ISysSequenceService sysSequenceService;
 
     /**
      * 查询商家日账单分页
@@ -290,6 +298,33 @@ public class BusinessDayBillServiceImpl implements IBusinessDayBillService {
         RevenueSharingConfigVo info = revenueSharingConfigService.getInfo();
         BigDecimal settlementExpenseRatio = MathUtils.divide(new BigDecimal(100).subtract(info.getBusinessWithdrawRatio()), new BigDecimal(100), 3);
         for (BusinessDayBill businessDayBill : businessDayBills) {
+            try {
+                Long money = Long.valueOf(businessDayBill.getPlatformIncome().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_DOWN).toString());
+                Business business = businessService.loadById(businessDayBill.getBusinessId(), true);
+                //先查商户余额 单位分
+                Long balance = fubeiPayService.queryBalanceDivisionAvailableBalance(new PayBo(business.getFuMchNo(), business.getFuAppId(), business.getFuKey(), business.getFuChannelMchNo()));
+                if (balance < money) {
+                    businessDayBill.setPlatformIncomeSettled(CallInterfaceStatus.FAIL);
+                    continue;
+                }
+                //先给平台分账
+                businessDayBill.setPlatformSettledOrderNo(sysSequenceService.generateSequence(SequencePrefixEnum.PLATFORM_SHARE,
+                    DateUtil.format(new Date(), "yyMMdd"), 6));
+                PayBo payBo = new PayBo(business.getFuMchNo(), business.getFuAppId(), business.getFuKey(), business.getFuChannelMchNo(), businessDayBill.getPlatformSettledOrderNo(), money
+                    , business.getBusinessName() + "下订单分账");
+                String balanceDivisionExec = fubeiPayService.createBalanceDivisionExec(payBo);
+                businessDayBill.setPlatformIncomeSettled(StringUtils.isNotEmpty(balanceDivisionExec) ? CallInterfaceStatus.SUCCESS : CallInterfaceStatus.FAIL);
+                businessDayBill.setPlatformSettledChannelOrderId(balanceDivisionExec);
+
+                //给商户结算
+                //在查一次余额 单位分
+                balance = fubeiPayService.queryBalanceDivisionAvailableBalance(new PayBo(business.getFuMchNo(), business.getFuAppId(), business.getFuKey(), business.getFuChannelMchNo()));
+                Boolean withdrawFlag = fubeiPayService.createBalanceDivisionWithdraw(new PayBo(business.getFuMchNo(), business.getFuAppId(), business.getFuKey(),
+                    business.getFuReceiverId(), balance));
+                businessDayBill.setTodayRealSettlement(withdrawFlag ? MathUtils.divide(new BigDecimal(balance), new BigDecimal(100)) : null);
+            } catch (Exception e) {
+                log.error("商户{}账单结算异常", businessDayBill.getBusinessName(), e);
+            }
             businessDayBill.setTodaySettlement(MathUtils.multiply(businessDayBill.getActualCredited(), settlementExpenseRatio, 3));
             businessDayBill.setTodaySettlementTime(date);
             this.baseMapper.updateById(businessDayBill);

+ 5 - 5
ruoyi-line/src/main/java/com/ruoyi/onlineorder/service/impl/OnlineOrderServiceImpl.java

@@ -298,7 +298,7 @@ public class OnlineOrderServiceImpl implements IOnlineOrderService {
         //第三方关闭订单
         Business business = businessService.loadById(onlineOrder.getBusinessId(), true);
         // 构建支付关闭参数
-        PayBo pay = new PayBo(business.getFuMchNo(), business.getFuKey(), onlineOrder.getOrderNo(), onlineOrder.getTransactionId());
+        PayBo pay = new PayBo(business.getFuMchNo(), business.getFuAppId(), business.getFuKey(), onlineOrder.getOrderNo(), onlineOrder.getTransactionId());
         // 发起付贝取消支付
         fubeiPayService.closePayOrder(pay);
     }
@@ -319,9 +319,9 @@ public class OnlineOrderServiceImpl implements IOnlineOrderService {
         if (onlineOrder.getPlatformIncome().compareTo(BigDecimal.ZERO) <= 0 || CallInterfaceStatus.SUCCESS.equals(onlineOrder.getPlatformIncomeSettled())) {
             return;
         }
-        Integer money = Integer.valueOf(onlineOrder.getPlatformIncome().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_DOWN).toString());
+        Long money = Long.valueOf(onlineOrder.getPlatformIncome().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_DOWN).toString());
         Business business = businessService.loadById(onlineOrder.getBusinessId(), true);
-        PayBo payBo = new PayBo(business.getFuMchNo(), business.getFuKey(), business.getFuChannelMchNo(), onlineOrder.getOrderNo(), money
+        PayBo payBo = new PayBo(business.getFuMchNo(), business.getFuAppId(), business.getFuKey(), business.getFuChannelMchNo(), onlineOrder.getOrderNo(), money
             , business.getBusinessName() + "下在线订单分账");
         String balanceDivisionExec = fubeiPayService.createBalanceDivisionExec(payBo);
 
@@ -401,7 +401,7 @@ public class OnlineOrderServiceImpl implements IOnlineOrderService {
         onlineOrder.setPayOrderNo(onlineOrder.buildOrderNo());
         baseMapper.updateById(onlineOrder);
         //支付金额为分
-        Integer money = Integer.valueOf(onlineOrder.getPayAmount().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_DOWN).toString());
+        Long money = Long.valueOf(onlineOrder.getPayAmount().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_DOWN).toString());
         FubeiPayWay payWay = FubeiPayWay.W_WX_LITE;
         UserThirdType userThirdType = UserThirdType.WX_CASHIER_MINI_PROGRAM;
         if (OnlineOrderPayType.ALIPAY.equals(onlineOrder.getPayType()) || OnlineOrderPayType.THIRD_ALIPAY.equals(onlineOrder.getPayType())) {
@@ -410,7 +410,7 @@ public class OnlineOrderServiceImpl implements IOnlineOrderService {
         }
         UserThirdIdentity userThirdIdentity = userThirdIdentityService.loadByUserId(userId, userThirdType, true);
         // 构建支付参数
-        PayBo pay = new PayBo(payWay, business.getFuMchNo(), business.getFuKey(), onlineOrder.getPayOrderNo()
+        PayBo pay = new PayBo(payWay, business.getFuMchNo(), business.getFuAppId(), business.getFuKey(), onlineOrder.getPayOrderNo()
             , userThirdIdentity.getIdentityCode(),  money, "在线订单支付", String.format("在线订单支付:%s", business.getBusinessName()));
         // 发起付贝支付
         return fubeiPayService.createPayOrder(pay);

+ 2 - 2
ruoyi-line/src/main/java/com/ruoyi/onlinerefundorder/service/impl/OnlineRefundOrderServiceImpl.java

@@ -386,9 +386,9 @@ public class OnlineRefundOrderServiceImpl implements IOnlineRefundOrderService {
                 .build());
         }
         //调用第三方退款接口
-        Integer money = Integer.valueOf(refundOrder.getRefundAmount().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_DOWN).toString());
+        Long money = Long.valueOf(refundOrder.getRefundAmount().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_DOWN).toString());
         // 构建退款参数
-        PayBo payBo = new PayBo(business.getFuMchNo(), business.getFuKey(), onlineOrder.getOrderNo(), onlineOrder.getTransactionId(),
+        PayBo payBo = new PayBo(business.getFuMchNo(), business.getFuAppId(), business.getFuKey(), onlineOrder.getOrderNo(), onlineOrder.getTransactionId(),
             refundOrder.getRefundOrderNo(), money, "在线订单退款");
         // 发起付贝退款
         fubeiPayService.createRefundOrder(payBo);

+ 56 - 6
ruoyi-newwxpay/src/main/java/com/ruoyi/fubeiPay/domain/PayBo.java

@@ -44,7 +44,7 @@ public class PayBo {
     /**
      * 支付金额,单位分
      */
-    private Integer amount;
+    private Long amount;
 
     /**
      * 商品标题
@@ -95,6 +95,14 @@ public class PayBo {
      * 分账接收者账号列表
      */
     private String receivers;
+    /**
+     * 应用appId
+     */
+    private String appId;
+    /**
+     * 分账用户ID
+     */
+    private String receiverId;
 
     /**
      * 分账业务
@@ -123,6 +131,7 @@ public class PayBo {
     /**
      * 创建支付参数
      * @param mchNo
+     * @param appId
      * @param storeKey
      * @param mchOrderNo
      * @param amount
@@ -130,9 +139,10 @@ public class PayBo {
      * @param body
      * @return
      */
-    public PayBo(FubeiPayWay payWay, String mchNo, String storeKey, String mchOrderNo, String userInfoId, Integer amount, String subject, String body) {
+    public PayBo(FubeiPayWay payWay, String mchNo, String appId, String storeKey, String mchOrderNo, String userInfoId, Long amount, String subject, String body) {
         this.payWay = payWay;
         this.mchNo = mchNo;
+        this.appId = appId;
         this.storeKey = storeKey;
         this.mchOrderNo = mchOrderNo;
         this.userInfoId = userInfoId;
@@ -144,12 +154,14 @@ public class PayBo {
     /**
      * 创建支付关闭参数
      * @param mchNo
+     * @param appId
      * @param mchOrderNo
      * @param payOrderId
      * @return
      */
-    public PayBo(String mchNo, String storeKey, String mchOrderNo, String payOrderId) {
+    public PayBo(String mchNo, String appId, String storeKey, String mchOrderNo, String payOrderId) {
         this.mchNo = mchNo;
+        this.appId = appId;
         this.storeKey = storeKey;
         this.mchOrderNo = mchOrderNo;
         this.payOrderId = payOrderId;
@@ -158,6 +170,7 @@ public class PayBo {
     /**
      * 创建退款参数
      * @param mchNo
+     * @param appId
      * @param mchOrderNo
      * @param payOrderId
      * @param mchRefundNo
@@ -165,8 +178,9 @@ public class PayBo {
      * @param refundReason
      * @return
      */
-    public PayBo(String mchNo, String storeKey, String mchOrderNo, String payOrderId, String mchRefundNo, Integer refundAmount, String refundReason) {
+    public PayBo(String mchNo, String appId, String storeKey, String mchOrderNo, String payOrderId, String mchRefundNo, Long refundAmount, String refundReason) {
         this.mchNo = mchNo;
+        this.appId = appId;
         this.storeKey = storeKey;
         this.mchOrderNo = mchOrderNo;
         this.payOrderId = payOrderId;
@@ -178,13 +192,15 @@ public class PayBo {
     /**
      * 创建订单分账参数
      * @param mchNo
+     * @param appId
      * @param mchOrderNo
      * @param payOrderId
      * @param receiverList
      * @return
      */
-    public PayBo(String mchNo, String storeKey, String mchOrderNo, String payOrderId, List<ReceiverData> receiverList) {
+    public PayBo(String mchNo, String appId, String storeKey, String mchOrderNo, String payOrderId, List<ReceiverData> receiverList) {
         this.mchNo = mchNo;
+        this.appId = appId;
         this.storeKey = storeKey;
         this.mchOrderNo = mchOrderNo;
         this.payOrderId = payOrderId;
@@ -195,6 +211,7 @@ public class PayBo {
     /**
      * 创建订单分账参数
      * @param mchNo
+     * @param appId
      * @param storeKey
      * @param lenderChannelMchNo
      * @param payOrderNo
@@ -202,12 +219,45 @@ public class PayBo {
      * @param remark
      * @return
      */
-    public PayBo(String mchNo, String storeKey, String lenderChannelMchNo, String payOrderNo, Integer amount, String remark) {
+    public PayBo(String mchNo, String appId, String storeKey, String lenderChannelMchNo, String payOrderNo, Long amount, String remark) {
         this.mchNo = mchNo;
+        this.appId = appId;
         this.storeKey = storeKey;
         this.lenderChannelMchNo = lenderChannelMchNo;
         this.payOrderNo = payOrderNo;
         this.amount = amount;
         this.remark = remark;
     }
+
+    /**
+     * 创建查询余额分账商户可用余额参数
+     * @param mchNo
+     * @param appId
+     * @param storeKey
+     * @param lenderChannelMchNo
+     * @return
+     */
+    public PayBo(String mchNo, String appId, String storeKey, String lenderChannelMchNo) {
+        this.mchNo = mchNo;
+        this.appId = appId;
+        this.storeKey = storeKey;
+        this.lenderChannelMchNo = lenderChannelMchNo;
+    }
+
+    /**
+     * 创建对分账用户的渠道余额发起提现参数
+     * @param mchNo
+     * @param appId
+     * @param storeKey
+     * @param receiverId
+     * @param amount
+     * @return
+     */
+    public PayBo(String mchNo, String appId, String storeKey, String receiverId, Long amount) {
+        this.mchNo = mchNo;
+        this.appId = appId;
+        this.storeKey = storeKey;
+        this.receiverId = receiverId;
+        this.amount = amount;
+    }
 }

+ 141 - 103
ruoyi-newwxpay/src/main/java/com/ruoyi/fubeiPay/service/FubeiPayService.java

@@ -52,7 +52,7 @@ public class FubeiPayService {
      * @param paramMap
      * @return
      */
-    private JSONObject createRequest(String url, Map<String, Object> paramMap, String appKey) {
+    private JSONObject createRequest(String url, Map<String, Object> paramMap, String appId, String appKey) {
         // 应用ID
         paramMap.put("appId", appId);
         // 接口版本
@@ -83,44 +83,43 @@ public class FubeiPayService {
      * @return
      */
     public PayVo createPayOrder(PayBo bo) {
-        return new PayVo();
-//        FubeiPayWay payWay = bo.getPayWay();
-//        Map<String, Object> paramMap = new HashMap<>();
-//        // 门店商户号
-//        paramMap.put("mchNo", bo.getMchNo());
-//        // 商户订单号
-//        paramMap.put("mchOrderNo", bo.getMchOrderNo());
-//        // 支付方式
-//        paramMap.put("wayCode", payWay.getMsg());
-//        // 支付金额,单位分
-//        paramMap.put("amount", bo.getAmount());
-//        // 货币代码
-//        paramMap.put("currency", "cny");
-//        // 商品标题
-//        paramMap.put("subject", bo.getSubject());
-//        // 商品描述
-//        paramMap.put("body", bo.getBody());
-//        // 分账模式(业务是走余额分账)
-//        paramMap.put("divisionMode", 0);
-//
-//        JSONObject channelExtraJson = new JSONObject();
-//        if (FubeiPayWay.W_WX_LITE.equals(payWay)) {
-//            // 当前小程序用户的openId
-//            channelExtraJson.put("openid", bo.getUserInfoId());
-//            // 当前小程序的AppId传过去
-//            channelExtraJson.put("subAppId", wxAppId);
-//        } else if (FubeiPayWay.W_ALI_LITE.equals(payWay)) {
-//            // 支付宝用户ID
-//            channelExtraJson.put("buyerUserId", bo.getUserInfoId());
-//        }
-//        paramMap.put("channelExtra", channelExtraJson);
-//
-//        // 异步通知地址
-//        paramMap.put("notifyUrl", payBackUrl);
-//
-//        JSONObject resultJson = this.createRequest("/api/pay/unifiedOrder", paramMap, bo.getStoreKey());
-//        JSONObject dataJson = resultJson.getJSONObject("data");
-//        return JSONObject.parseObject(dataJson.toJSONString(), PayVo.class);
+        FubeiPayWay payWay = bo.getPayWay();
+        Map<String, Object> paramMap = new HashMap<>();
+        // 门店商户号
+        paramMap.put("mchNo", bo.getMchNo());
+        // 商户订单号
+        paramMap.put("mchOrderNo", bo.getMchOrderNo());
+        // 支付方式
+        paramMap.put("wayCode", payWay.getMsg());
+        // 支付金额,单位分
+        paramMap.put("amount", bo.getAmount());
+        // 货币代码
+        paramMap.put("currency", "cny");
+        // 商品标题
+        paramMap.put("subject", bo.getSubject());
+        // 商品描述
+        paramMap.put("body", bo.getBody());
+        // 分账模式(业务是走余额分账)
+        paramMap.put("divisionMode", 0);
+
+        JSONObject channelExtraJson = new JSONObject();
+        if (FubeiPayWay.W_WX_LITE.equals(payWay)) {
+            // 当前小程序用户的openId
+            channelExtraJson.put("openid", bo.getUserInfoId());
+            // 当前小程序的AppId传过去
+            channelExtraJson.put("subAppId", wxAppId);
+        } else if (FubeiPayWay.W_ALI_LITE.equals(payWay)) {
+            // 支付宝用户ID
+            channelExtraJson.put("buyerUserId", bo.getUserInfoId());
+        }
+        paramMap.put("channelExtra", channelExtraJson);
+
+        // 异步通知地址
+        paramMap.put("notifyUrl", payBackUrl);
+
+        JSONObject resultJson = this.createRequest("/api/pay/unifiedOrder", paramMap, bo.getAppId(), bo.getStoreKey());
+        JSONObject dataJson = resultJson.getJSONObject("data");
+        return JSONObject.parseObject(dataJson.toJSONString(), PayVo.class);
     }
 
     /**
@@ -138,7 +137,7 @@ public class FubeiPayService {
         // 支付订单号
         paramMap.put("payOrderId", bo.getPayOrderId());
 
-        JSONObject resultJson = this.createRequest("/api/pay/query", paramMap, bo.getStoreKey());
+        JSONObject resultJson = this.createRequest("/api/pay/query", paramMap, bo.getAppId(), bo.getStoreKey());
         return resultJson.getJSONObject("data");
     }
 
@@ -150,15 +149,15 @@ public class FubeiPayService {
      */
     public Boolean closePayOrder(PayBo bo) {
         try {
-//            Map<String, Object> paramMap = new HashMap<>();
-//            // 商户号
-//            paramMap.put("mchNo", bo.getMchNo());
-//            // 商户订单号
-//            paramMap.put("mchOrderNo", bo.getMchOrderNo());
-//            // 支付订单号
-//            paramMap.put("payOrderId", bo.getPayOrderId());
-//
-//            this.createRequest("/api/pay/close", paramMap, bo.getStoreKey());
+            Map<String, Object> paramMap = new HashMap<>();
+            // 商户号
+            paramMap.put("mchNo", bo.getMchNo());
+            // 商户订单号
+            paramMap.put("mchOrderNo", bo.getMchOrderNo());
+            // 支付订单号
+            paramMap.put("payOrderId", bo.getPayOrderId());
+
+            this.createRequest("/api/pay/close", paramMap, bo.getAppId(), bo.getStoreKey());
         } catch (Exception e) {
             log.error(" --- 关闭订单异常 ---> {}", e.getMessage());
         }
@@ -172,29 +171,31 @@ public class FubeiPayService {
      * @return
      */
     public String createRefundOrder(PayBo bo) {
-        return null;
-//        Map<String, Object> paramMap = new HashMap<>();
-//        // 商户号
-//        paramMap.put("mchNo", bo.getMchNo());
-//        // 商户订单号
-//        paramMap.put("mchOrderNo", bo.getMchOrderNo());
-//        // 支付订单号
-//        paramMap.put("payOrderId", bo.getPayOrderId());
-//        // 商户退款订单号
-//        paramMap.put("mchRefundNo", bo.getMchRefundNo());
-//        // 退款金额,单位分
-//        paramMap.put("refundAmount", bo.getAmount());
-//        // 货币代码
-//        paramMap.put("currency", "cny");
-//        // 退款原因
-//        paramMap.put("refundReason", bo.getRefundReason());
-//        // 异步通知地址
-//        paramMap.put("notifyUrl", refundBackUrl);
-//
-//        JSONObject resultJson = this.createRequest("/api/refund/refundOrder", paramMap, bo.getStoreKey());
-//        JSONObject dataJson = resultJson.getJSONObject("data");
-//        // 返回支付系统 退款订单号,业务需要
-//        return dataJson.getString("refundOrderId");
+        Map<String, Object> paramMap = new HashMap<>();
+        // 商户号
+        paramMap.put("mchNo", bo.getMchNo());
+        // 商户订单号
+        paramMap.put("mchOrderNo", bo.getMchOrderNo());
+        // 支付订单号
+        paramMap.put("payOrderId", bo.getPayOrderId());
+        // 商户退款订单号
+        paramMap.put("mchRefundNo", bo.getMchRefundNo());
+        // 退款金额,单位分
+        paramMap.put("refundAmount", bo.getAmount());
+        // 货币代码
+        paramMap.put("currency", "cny");
+        // 退款原因
+        paramMap.put("refundReason", bo.getRefundReason());
+        // 异步通知地址
+        paramMap.put("notifyUrl", refundBackUrl);
+
+        JSONObject resultJson = this.createRequest("/api/refund/refundOrder", paramMap, bo.getAppId(), bo.getStoreKey());
+        JSONObject dataJson = resultJson.getJSONObject("data");
+        if (dataJson == null) {
+            return null;
+        }
+        // 返回支付系统 退款订单号,业务需要
+        return dataJson.getString("refundOrderId");
     }
 
     /**
@@ -212,7 +213,7 @@ public class FubeiPayService {
         // 退款订单号
         paramMap.put("refundOrderId", bo.getRefundOrderId());
 
-        JSONObject resultJson = this.createRequest("/api/refund/query", paramMap, bo.getStoreKey());
+        JSONObject resultJson = this.createRequest("/api/refund/query", paramMap, bo.getAppId(), bo.getStoreKey());
         return resultJson.getJSONObject("data");
     }
 
@@ -235,8 +236,11 @@ public class FubeiPayService {
         paramMap.put("useSysAutoDivisionReceivers", Constants.NUM_ZERO);
         paramMap.put("receivers", bo.getReceivers());
 
-        JSONObject resultJson = this.createRequest("/api/division/exec", paramMap, bo.getStoreKey());
+        JSONObject resultJson = this.createRequest("/api/division/exec", paramMap, bo.getAppId(), bo.getStoreKey());
         JSONObject dataJson = resultJson.getJSONObject("data");
+        if (dataJson == null) {
+            return null;
+        }
         // 返回支付系统 系统分账批次号,业务需要
         return dataJson.getString("batchOrderId");
     }
@@ -248,35 +252,69 @@ public class FubeiPayService {
      * @return
      */
     public String createBalanceDivisionExec(PayBo bo) {
-        return null;
-//        Map<String, Object> paramMap = new HashMap<>();
-//        // 门店商户号
-//        paramMap.put("mchNo", bo.getMchNo());
-//        // 出款方渠道商户号
-//        paramMap.put("lenderChannelMchNo", bo.getLenderChannelMchNo());
-//        //收款方商户号
-//        paramMap.put("payeeMchNo", mchNo);
-//        //收款方渠道商户号
-//        paramMap.put("payeeChannelMchNo", channelMchNo);
-//        //支付渠道
-//        paramMap.put("ifCode", FubeiIfCode.dgpay.getCode());
-//        //分账原因
-//        paramMap.put("independentAccountReason", FubeiIndependentReason.FEN_RU.getCode());
-//        //费用承担方
-//        paramMap.put("feeBearer", 0);
-//        //交易订单号
-//        paramMap.put("payOrderNo", bo.getPayOrderNo());
-//        //分账金额 单位:分
-//        paramMap.put("dividedAmount", bo.getAmount());
-//        //是否延迟交易
-//        paramMap.put("isDelay", 0);
-//        //备注
-//        paramMap.put("remark", bo.getRemark());
-//
-//        JSONObject resultJson = this.createRequest("/api/balance/division/exec", paramMap, bo.getStoreKey());
-//        JSONObject dataJson = resultJson.getJSONObject("data");
-//        // 返回渠道订单号
-//        return dataJson.getString("channelOrderId");
+        Map<String, Object> paramMap = new HashMap<>();
+        // 门店商户号
+        paramMap.put("mchNo", bo.getMchNo());
+        // 出款方渠道商户号
+        paramMap.put("lenderChannelMchNo", bo.getLenderChannelMchNo());
+        //收款方商户号
+        paramMap.put("payeeMchNo", mchNo);
+        //收款方渠道商户号
+        paramMap.put("payeeChannelMchNo", channelMchNo);
+        //支付渠道
+        paramMap.put("ifCode", FubeiIfCode.dgpay.getCode());
+        //分账原因
+        paramMap.put("independentAccountReason", FubeiIndependentReason.FEN_RU.getCode());
+        //费用承担方
+        paramMap.put("feeBearer", 0);
+        //交易订单号
+        paramMap.put("payOrderNo", bo.getPayOrderNo());
+        //分账金额 单位:分
+        paramMap.put("dividedAmount", bo.getAmount());
+        //是否延迟交易
+        paramMap.put("isDelay", 0);
+        //备注
+        paramMap.put("remark", bo.getRemark());
+
+        JSONObject resultJson = this.createRequest("/api/balance/division/exec", paramMap, bo.getAppId(), bo.getStoreKey());
+        JSONObject dataJson = resultJson.getJSONObject("data");
+        if (dataJson == null) {
+            return null;
+        }
+        // 返回渠道订单号
+        return dataJson.getString("channelOrderId");
+    }
+
+    /**
+     * 查询余额分账商户可用余额 单位分
+     */
+    public Long queryBalanceDivisionAvailableBalance(PayBo bo) {
+        Map<String, Object> paramMap = new HashMap<>();
+        paramMap.put("mchNo", bo.getMchNo());
+        paramMap.put("payChannel", FubeiIfCode.dgpay.getCode());
+        paramMap.put("channelMchNo", bo.getLenderChannelMchNo());
+        JSONObject resultJson = this.createRequest("/api/balance/division/balance", paramMap, bo.getAppId(), bo.getStoreKey());
+        JSONObject dataJson = resultJson.getJSONObject("data");
+        if (dataJson == null) {
+            return null;
+        }
+        return dataJson.getLong("balance");
     }
 
+    /**
+     * 对分账用户的渠道余额发起提现
+     */
+    public Boolean createBalanceDivisionWithdraw(PayBo bo) {
+        Map<String, Object> paramMap = new HashMap<>();
+        paramMap.put("mchNo", bo.getMchNo());
+        paramMap.put("receiverId", bo.getReceiverId());
+        paramMap.put("cashoutAmount", bo.getAmount());
+        JSONObject resultJson = this.createRequest("/api/division/receiver/channelBalanceCashout", paramMap, bo.getAppId(), bo.getStoreKey());
+        JSONObject dataJson = resultJson.getJSONObject("data");
+        if (dataJson == null) {
+            return false;
+        }
+        // 渠道订单号
+        return 1 == dataJson.getIntValue("state");
+    }
 }

+ 3 - 3
ruoyi-shop/src/main/java/com/ruoyi/shop/order/service/impl/ShopOrderServiceImpl.java

@@ -392,7 +392,7 @@ public class ShopOrderServiceImpl implements IShopOrderService {
             //第三方关闭订单
             Business business = businessService.loadById(shopOrder.getBusinessId(), true);
             // 构建支付关闭参数
-            PayBo pay = new PayBo(business.getFuMchNo(), business.getFuKey(), shopOrder.getOrderNo(), shopOrder.getTransactionId());
+            PayBo pay = new PayBo(business.getFuMchNo(), business.getFuAppId(), business.getFuKey(), shopOrder.getOrderNo(), shopOrder.getTransactionId());
             // 发起付贝取消支付
             fubeiPayService.closePayOrder(pay);
         }
@@ -554,9 +554,9 @@ public class ShopOrderServiceImpl implements IShopOrderService {
         if (order.getPlatformIncome().compareTo(BigDecimal.ZERO) <= 0 || CallInterfaceStatus.SUCCESS.equals(order.getPlatformIncomeSettled())) {
             return;
         }
-        Integer money = Integer.valueOf(order.getPlatformIncome().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_DOWN).toString());
+        Long money = Long.valueOf(order.getPlatformIncome().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_DOWN).toString());
         Business business = businessService.loadById(order.getBusinessId(), true);
-        PayBo payBo = new PayBo(business.getFuMchNo(), business.getFuKey(), business.getFuChannelMchNo(), order.getOrderNo(), money
+        PayBo payBo = new PayBo(business.getFuMchNo(), business.getFuAppId(), business.getFuKey(), business.getFuChannelMchNo(), order.getOrderNo(), money
             , business.getBusinessName() + "下订单分账");
         String balanceDivisionExec = fubeiPayService.createBalanceDivisionExec(payBo);
 

+ 2 - 2
ruoyi-shop/src/main/java/com/ruoyi/shop/rights/service/impl/SaleRightsOrderServiceImpl.java

@@ -1105,10 +1105,10 @@ public class SaleRightsOrderServiceImpl implements ISaleRightsOrderService {
 //            wxPayService.wxMiniRefund(param);
 //        }
         //调用第三方退款接口
-        Integer money = Integer.valueOf(rightsOrder.getRefundMoney().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_DOWN).toString());
+        Long money = Long.valueOf(rightsOrder.getRefundMoney().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_DOWN).toString());
         Business business = businessService.loadById(rightsOrder.getBusinessId(), true);
         // 构建退款参数
-        PayBo payBo = new PayBo(business.getFuMchNo(), business.getFuKey(), shopOrder.getOrderNo(), shopOrder.getTransactionId(),
+        PayBo payBo = new PayBo(business.getFuMchNo(), business.getFuAppId(), business.getFuKey(), shopOrder.getOrderNo(), shopOrder.getTransactionId(),
             rightsOrder.getRightsCode(), money, "订单退款");
         // 发起付贝退款
         fubeiPayService.createRefundOrder(payBo);

+ 1 - 0
ruoyi-system/src/main/java/com/ruoyi/system/enums/SequencePrefixEnum.java

@@ -17,6 +17,7 @@ public enum SequencePrefixEnum implements IIntegerEnum<String> {
     WITHDRAWAL("XF", "分销提现"),
     COUPON("LM", "优惠券"),
     RIGHTS("WQ", "维权"),
+    PLATFORM_SHARE("PFS", "平台分账"),
     ;
 
     private String code;