Pu Zhibing
2025-04-22 fd7b8fb7c89832c28a838b0449bbb8a392433ee2
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WithdrawalRequestsController.java
@@ -1,6 +1,7 @@
package com.ruoyi.account.controller;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.account.api.model.AppUser;
import com.ruoyi.account.api.model.BalanceChangeRecord;
@@ -8,15 +9,27 @@
import com.ruoyi.account.dto.WithQuery;
import com.ruoyi.account.dto.WithdrawalRequestsDTO;
import com.ruoyi.account.service.AppUserService;
import com.ruoyi.account.service.BalanceChangeRecordService;
import com.ruoyi.account.service.WithdrawalRequestsService;
import com.ruoyi.account.util.payment.TransferUtil;
import com.ruoyi.account.util.payment.model.AccountBalanceQueryResult;
import com.ruoyi.account.util.payment.model.SinglePay;
import com.ruoyi.account.util.payment.model.SinglePayCallbackResult;
import com.ruoyi.account.util.payment.model.SinglePayResult;
import com.ruoyi.account.vo.WithdrawalAuth;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.system.api.model.LoginUser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
/**
 * <p>
@@ -35,6 +48,11 @@
    private WithdrawalRequestsService withdrawalRequestsService;
    @Resource
    private AppUserService appUserService;
    @Resource
    private BalanceChangeRecordService balanceChangeRecordService;
    @Resource
    private TokenService tokenService;
    /**
     * 提现申请
@@ -46,6 +64,9 @@
        return AjaxResult.success();
    }
    @PostMapping("/page")
    @ApiOperation(value = "提现申请列表", tags = {"后台"})
    public R<IPage<WithdrawalRequests>> page(@RequestBody WithQuery withQuery){
@@ -55,24 +76,147 @@
        }
        return R.ok(withdrawalRequestsIPage);
    }
    @PostMapping("/auth")
    @ApiOperation(value = "提现申请审批", tags = {"后台"})
    public R<IPage<WithdrawalRequests>> auth(@RequestParam Long id,@ApiParam("2'审核通过',3'审核拒绝'") Integer auditStatus){
        WithdrawalRequests byId = withdrawalRequestsService.getById(id);
        if (auditStatus==2){
            //将用户待审核金额减少,已提现金额增加
            AppUser byId1 = appUserService.getById(byId.getAppUserId());
            byId1.setWithdrawnAmount(byId1.getWithdrawnAmount().add(byId.getWithdrawalAmount()));
            appUserService.updateById(byId1);
            //执行对应的第三方提现 todo
    public R auth(@RequestBody WithdrawalAuth withdrawalAuth){
        WithdrawalRequests withdrawal = withdrawalRequestsService.getById(withdrawalAuth.getId());
        BigDecimal withdrawalAmount = withdrawal.getWithdrawalAmount();
        if(withdrawal.getAuditStatus() != 1){
            return R.fail("不能重复审核");
        }
        //通过
        byId.setAuditStatus(auditStatus);
        withdrawalRequestsService.updateById(byId);
        Integer auditStatus = withdrawalAuth.getAuditStatus();
        if (auditStatus==2){
            //执行转账操作
            if(withdrawal.getWithdrawalMethod() == 2){
                //先检查账户余额是否充足
                AccountBalanceQueryResult accountBalanceQueryResult = TransferUtil.accountBalanceQuery();
                if(null == accountBalanceQueryResult){
                    return R.fail("查询账户余额出错");
                }
                Double useAbleSettAmount = accountBalanceQueryResult.getUseAbleSettAmount();
                //计算代付手续费
                if(useAbleSettAmount < (withdrawal.getArrivalAmount().doubleValue() + 1)){
                    return R.fail("账户可用余额不足,请先补充账户余额");
                }
                //银行卡转账
                SinglePay singlePay = new SinglePay();
                singlePay.setTradeMerchantNo(TransferUtil.sysTradeMerchantNo);
                singlePay.setMerchantOrderNo(withdrawal.getId().toString());
                singlePay.setReceiverAccountNoEnc(withdrawal.getBankCardNumber());
                singlePay.setReceiverNameEnc(withdrawal.getAccountHolder());
                singlePay.setReceiverAccountType(201);
                singlePay.setPaidAmount(withdrawal.getArrivalAmount().doubleValue());
                singlePay.setPaidDesc("账户余额提现");
                singlePay.setPaidUse("205");
                singlePay.setCallbackUrl("/account/withdrawal-requests/withdrawalCallback");
                SinglePayResult singlePayResult = TransferUtil.singlePay(singlePay);
                if(null == singlePayResult){
                    LoginUser loginUserApplet = tokenService.getLoginUserApplet();
                    AppUser appUser = appUserService.getById(loginUserApplet.getUserid());
                    BigDecimal balance = appUser.getBalance();
                    BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord();
                    balanceChangeRecord.setAppUserId(appUser.getId());
                    balanceChangeRecord.setVipId(appUser.getVipId());
//                    balanceChangeRecord.setOrderId(withdrawalRequests.getId());
                    balanceChangeRecord.setChangeType(2);
                    balanceChangeRecord.setChangeAmount(withdrawalAmount);
                    balanceChangeRecord.setDelFlag(0);
                    balanceChangeRecord.setCreateTime(LocalDateTime.now());
                    balanceChangeRecord.setChangeDirection(-1);
                    balanceChangeRecordService.save(balanceChangeRecord);
                    return R.fail("转账失败");
                }
                withdrawal.setStatus(1);
            }else{
                //微信转账
                return R.fail("微信转账开发中");
            }
        }
        if(3 == auditStatus){
            //回退扣除的金额,添加明细记录
            //修改用户的可提现金额
            AppUser appUser = appUserService.getById(withdrawal.getAppUserId());
            BigDecimal withdrawableAmount = appUser.getWithdrawableAmount();
            BigDecimal withdrawnAmount = appUser.getWithdrawnAmount();
            BigDecimal balance = appUser.getBalance();
            appUser.setWithdrawableAmount(withdrawableAmount.add(withdrawalAmount).setScale(2, RoundingMode.HALF_EVEN));
            appUser.setWithdrawnAmount(withdrawnAmount.subtract(withdrawalAmount).setScale(2, RoundingMode.HALF_EVEN));
            appUser.setBalance(appUser.getBalance().add(withdrawalAmount).setScale(2, RoundingMode.HALF_EVEN));
            appUserService.updateById(appUser);
            //添加变动明细
            BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord();
            balanceChangeRecord.setAppUserId(appUser.getId());
            balanceChangeRecord.setVipId(appUser.getVipId());
            balanceChangeRecord.setOrderId(withdrawal.getId());
            balanceChangeRecord.setChangeType(2);
            balanceChangeRecord.setChangeAmount(withdrawalAmount);
            balanceChangeRecord.setDelFlag(0);
            balanceChangeRecord.setCreateTime(LocalDateTime.now());
            balanceChangeRecord.setChangeDirection(-1);
            balanceChangeRecordService.save(balanceChangeRecord);
        }
        withdrawal.setAuditStatus(auditStatus);
        withdrawalRequestsService.updateById(withdrawal);
        return R.ok();
    }
    /**
     * 提现审核通过后转账回调通知
     * @param singlePayCallbackResult
     */
    @ResponseBody
    @PostMapping("/withdrawalCallback")
    public Object withdrawalCallback(@RequestBody SinglePayCallbackResult singlePayCallbackResult){
        Integer status = singlePayCallbackResult.getStatus();
        String merchantOrderNo = singlePayCallbackResult.getMerchantOrderNo();
        WithdrawalRequests withdrawalRequests = withdrawalRequestsService.getById(merchantOrderNo);
        if(203 == status || 205 == status){
            if(1 == withdrawalRequests.getStatus()){
                withdrawalRequests.setStatus(2);
                withdrawalRequests.setArrivalTime(LocalDateTime.now());
                withdrawalRequestsService.updateById(withdrawalRequests);
            }
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("statusCode", 2001);
            return jsonObject;
        }else{
            //回退扣除的金额,添加明细记录
            //修改用户的可提现金额
            BigDecimal withdrawalAmount = withdrawalRequests.getWithdrawalAmount();
            AppUser appUser = appUserService.getById(withdrawalRequests.getAppUserId());
            BigDecimal withdrawableAmount = appUser.getWithdrawableAmount();
            BigDecimal withdrawnAmount = appUser.getWithdrawnAmount();
            BigDecimal balance = appUser.getBalance();
            appUser.setWithdrawableAmount(withdrawableAmount.add(withdrawalAmount).setScale(2, RoundingMode.HALF_EVEN));
            appUser.setWithdrawnAmount(withdrawnAmount.subtract(withdrawalAmount).setScale(2, RoundingMode.HALF_EVEN));
            appUser.setBalance(appUser.getBalance().add(withdrawalAmount).setScale(2, RoundingMode.HALF_EVEN));
            appUserService.updateById(appUser);
            //添加变动明细
            BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord();
            balanceChangeRecord.setAppUserId(appUser.getId());
            balanceChangeRecord.setVipId(appUser.getVipId());
            balanceChangeRecord.setOrderId(withdrawalRequests.getId());
            balanceChangeRecord.setChangeType(2);
            balanceChangeRecord.setChangeAmount(withdrawalAmount);
            balanceChangeRecord.setDelFlag(0);
            balanceChangeRecord.setCreateTime(LocalDateTime.now());
            balanceChangeRecord.setChangeDirection(-1);
            balanceChangeRecordService.save(balanceChangeRecord);
            withdrawalRequests.setStatus(3);
            withdrawalRequests.setRemark(singlePayCallbackResult.getErrorCodeDesc());
            withdrawalRequestsService.updateById(withdrawalRequests);
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("statusCode", 2001);
            return jsonObject;
        }
    }
}