luodangjia
2025-01-13 cc134fa83edea4865b48d7afc1acda5ad70e7465
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopWithdrawController.java
@@ -1,18 +1,31 @@
package com.ruoyi.other.controller;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
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;
@@ -21,6 +34,7 @@
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
@@ -45,6 +59,15 @@
    private ShopService shopService;
    @Resource
    private TokenService tokenService;
    @Resource
    private ShopBalanceStatementService shopBalanceStatementService;
    @Resource
    private AppUserClient appUserClient;
    /**
     * 提现申请列表
@@ -94,13 +117,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);
@@ -108,8 +136,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(4);
        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();
    }
@@ -121,6 +167,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(TransferUtil.sysTradeMerchantNo);
            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(4);
            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());
@@ -128,9 +227,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();
    }
}