From 513961ecebcfd0619ede7a7edb7ac5e27de28d26 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期三, 01 一月 2025 17:11:23 +0800
Subject: [PATCH] 增加第三方支付

---
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopWithdrawController.java |  140 +++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 130 insertions(+), 10 deletions(-)

diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopWithdrawController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopWithdrawController.java
index c804805..f761f1e 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopWithdrawController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopWithdrawController.java
@@ -1,17 +1,30 @@
 package com.ruoyi.other.controller;
 
 
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.account.api.feignClient.AppUserClient;
+import com.ruoyi.account.api.model.AppUser;
+import com.ruoyi.account.api.model.BalanceChangeRecord;
+import com.ruoyi.account.api.model.WithdrawalRequests;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.other.api.domain.Shop;
+import com.ruoyi.other.api.domain.ShopBalanceStatement;
 import com.ruoyi.other.api.domain.ShopWithdraw;
 import com.ruoyi.other.dto.ShopBalanceDto;
+import com.ruoyi.other.service.ShopBalanceStatementService;
 import com.ruoyi.other.service.ShopService;
 import com.ruoyi.other.service.ShopWithdrawService;
+import com.ruoyi.other.util.payment.TransferUtil;
+import com.ruoyi.other.util.payment.model.AccountBalanceQueryResult;
+import com.ruoyi.other.util.payment.model.SinglePay;
+import com.ruoyi.other.util.payment.model.SinglePayCallbackResult;
+import com.ruoyi.other.util.payment.model.SinglePayResult;
+import com.ruoyi.system.api.domain.SysUser;
 import com.ruoyi.system.api.model.LoginUser;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -20,6 +33,7 @@
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDateTime;
 
 /**
@@ -41,6 +55,15 @@
     private ShopService shopService;
     @Resource
     private TokenService tokenService;
+    
+    @Resource
+    private ShopBalanceStatementService shopBalanceStatementService;
+    
+    @Resource
+    private AppUserClient appUserClient;
+    
+    
+    
 
     /**
      * 提现申请列表
@@ -78,13 +101,18 @@
         Shop byId = shopService.getById(objectId);
         return R.ok(byId);
     }
+    
     @GetMapping("/shop/with")
     @ApiOperation(value = "提现申请", notes = "提现申请列表", tags = {"门店后台"})
-    public R<Shop> shopwith(@RequestParam BigDecimal money){
-        Integer objectId = tokenService.getLoginUser().getSysUser().getObjectId();
-        Shop byId = shopService.getById(objectId);
-        if (money.compareTo(byId.getCanWithdrawMoney())>0){
+    public R shopwith(@RequestParam BigDecimal money){
+        SysUser sysUser = tokenService.getLoginUser().getSysUser();
+        Integer objectId = sysUser.getObjectId();
+        Shop shop = shopService.getById(objectId);
+        if (money.compareTo(shop.getCanWithdrawMoney())>0){
             return R.fail("提现金额不能大于可提现金额");
+        }
+        if(StringUtils.isEmpty(shop.getReceiverAccountNoEnc())){
+            return R.fail("请完善账户信息后再申请提现!");
         }
         ShopWithdraw shopWithdraw = new ShopWithdraw();
         shopWithdraw.setShopId(objectId);
@@ -92,8 +120,26 @@
         shopWithdraw.setAuditStatus(0);
         shopWithdraw.setStatus(1);
         shopWithdrawService.save(shopWithdraw);
-
-        return R.ok(byId);
+        //扣除账户余额及添加变动明细
+        BigDecimal balance = shop.getBalance();
+        BigDecimal canWithdrawMoney = shop.getCanWithdrawMoney();
+        BigDecimal withdrawMoney = shop.getWithdrawMoney();
+        shop.setBalance(balance.subtract(money).setScale(2, RoundingMode.HALF_EVEN));
+        shop.setCanWithdrawMoney(canWithdrawMoney.subtract(money).setScale(2, RoundingMode.HALF_EVEN));
+        shop.setWithdrawMoney(withdrawMoney.add(money).setScale(2, RoundingMode.HALF_EVEN));
+        shopService.updateById(shop);
+        //添加门店变动明细
+        ShopBalanceStatement shopBalanceStatement = new ShopBalanceStatement();
+        shopBalanceStatement.setShopId(shop.getId());
+        shopBalanceStatement.setType(5);
+        shopBalanceStatement.setHistoricalBalance(balance);
+        shopBalanceStatement.setVariableAmount(money);
+        shopBalanceStatement.setBalance(shop.getBalance());
+        shopBalanceStatement.setCreateUserId(sysUser.getUserId());
+        shopBalanceStatement.setCreateTime(LocalDateTime.now());
+        shopBalanceStatement.setObjectId(shopWithdraw.getId());
+        shopBalanceStatementService.save(shopBalanceStatement);
+        return R.ok();
     }
 
 
@@ -105,6 +151,59 @@
     public R<Void> audit(@RequestBody ShopWithdraw shopWithdraw) {
         LoginUser loginUser = tokenService.getLoginUser();
         ShopWithdraw shopWithdraw1 = shopWithdrawService.getById(shopWithdraw.getId());
+        if(0 != shopWithdraw1.getAuditStatus()){
+            return R.fail("不能重复审核");
+        }
+        Shop shop = shopService.getById(shopWithdraw1.getShopId());
+        BigDecimal money = shopWithdraw1.getMoney();
+        if(1 == shopWithdraw.getAuditStatus()){
+            //先检查账户余额是否充足
+            AccountBalanceQueryResult accountBalanceQueryResult = TransferUtil.accountBalanceQuery();
+            if(null == accountBalanceQueryResult){
+                return R.fail("查询账户余额出错");
+            }
+            Double useAbleSettAmount = accountBalanceQueryResult.getUseAbleSettAmount();
+            if(useAbleSettAmount < shopWithdraw1.getMoney().doubleValue()){
+                return R.fail("账户可用余额不足,请先补充账户余额");
+            }
+            //银行卡转账
+            SinglePay singlePay = new SinglePay();
+            singlePay.setTradeMerchantNo("");
+            singlePay.setMerchantOrderNo(shopWithdraw1.getId().toString());
+            singlePay.setReceiverAccountNoEnc(shop.getReceiverAccountNoEnc());
+            singlePay.setReceiverNameEnc(shop.getReceiverNameEnc());
+            singlePay.setReceiverAccountType(shop.getReceiverAccountType());
+            singlePay.setPaidAmount(shopWithdraw1.getMoney().doubleValue());
+            singlePay.setPaidDesc("账户余额提现");
+            singlePay.setPaidUse("208");
+            singlePay.setCallbackUrl("/other/shop-withdraw/withdrawalCallback");
+            SinglePayResult singlePayResult = TransferUtil.singlePay(singlePay);
+            if(null == singlePayResult){
+                return R.fail("转账失败");
+            }
+            shopWithdraw1.setStatus(1);
+        }
+        if(2 == shopWithdraw.getAuditStatus()){
+            //回退金额和添加变动明细
+            BigDecimal balance = shop.getBalance();
+            BigDecimal canWithdrawMoney = shop.getCanWithdrawMoney();
+            BigDecimal withdrawMoney = shop.getWithdrawMoney();
+            shop.setBalance(balance.add(money).setScale(2, RoundingMode.HALF_EVEN));
+            shop.setCanWithdrawMoney(canWithdrawMoney.add(money).setScale(2, RoundingMode.HALF_EVEN));
+            shop.setWithdrawMoney(withdrawMoney.subtract(money).setScale(2, RoundingMode.HALF_EVEN));
+            shopService.updateById(shop);
+            //添加门店变动明细
+            ShopBalanceStatement shopBalanceStatement = new ShopBalanceStatement();
+            shopBalanceStatement.setShopId(shop.getId());
+            shopBalanceStatement.setType(5);
+            shopBalanceStatement.setHistoricalBalance(balance);
+            shopBalanceStatement.setVariableAmount(money);
+            shopBalanceStatement.setBalance(shop.getBalance());
+            shopBalanceStatement.setCreateUserId(loginUser.getUserid());
+            shopBalanceStatement.setCreateTime(LocalDateTime.now());
+            shopBalanceStatement.setObjectId(shopWithdraw.getId());
+            shopBalanceStatementService.save(shopBalanceStatement);
+        }
         shopWithdraw1.setAuditStatus(shopWithdraw.getAuditStatus());
         shopWithdraw1.setAuditUserId(loginUser.getUserid());
         shopWithdraw1.setAuditTime(LocalDateTime.now());
@@ -112,9 +211,30 @@
         shopWithdrawService.updateById(shopWithdraw1);
         return R.ok();
     }
-
-
-
-
+    
+    
+    
+    /**
+     * 提现审核通过后转账回调通知
+     * @param singlePayCallbackResult
+     */
+    @ResponseBody
+    @PostMapping("/withdrawalCallback")
+    public Object withdrawalCallback(@RequestBody SinglePayCallbackResult singlePayCallbackResult){
+        Integer status = singlePayCallbackResult.getStatus();
+        if(203 == status){
+            String merchantOrderNo = singlePayCallbackResult.getMerchantOrderNo();
+            ShopWithdraw shopWithdraw = shopWithdrawService.getById(merchantOrderNo);
+            if(1 == shopWithdraw.getStatus()){
+                shopWithdraw.setStatus(2);
+                shopWithdraw.setArrivalTime(LocalDateTime.now());
+                shopWithdrawService.updateById(shopWithdraw);
+            }
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("statusCode", 2001);
+            return jsonObject;
+        }
+        return new JSONObject();
+    }
 }
 

--
Gitblit v1.7.1