zyy
2025-12-17 0a87c3811a648e46105687aa1fab02f605f7e5c0
借款还款
5 files modified
145 ■■■■■ changed files
trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/LoanController.java 37 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/LoanService.java 6 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/internal/LoanServiceImpl.java 95 ●●●●● patch | view | raw | blame | history
trading-order-bean/src/main/java/com/yami/trading/bean/loan/SimpleLoanOrder.java 2 ●●● patch | view | raw | blame | history
trading-order-common/src/main/java/com/yami/trading/common/constants/Constants.java 5 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/LoanController.java
@@ -26,6 +26,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.token.TokenService;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -222,6 +223,42 @@
    }
    /**
     * 提交还款申请
     * @param request 请求对象
     * @return 申请结果
     */
    @GetMapping("/api/loan!refund.action")
    public ResultObject refund(HttpServletRequest request) {
        ResultObject resultObject = new ResultObject();
        String partyId = SecurityUtils.getCurrentUserId();
        if(null==partyId) {
            resultObject.setCode("1");
            resultObject.setMsg("通过Token获取partyId为空!");
            return resultObject;
        }
        String orderNo=getParamValue(request,resultObject,"orderNo");
        if(null==orderNo) return resultObject;
        try {
            boolean flag = loanService.refundLoanOrder(orderNo, partyId);
            if (flag) {
                resultObject.setMsg("提交成功");
            } else {
                resultObject.setCode("1");
                resultObject.setMsg("提交失败");
            }
        } catch(Throwable e) {
            resultObject.setCode("1");
            resultObject.setMsg("程序错误");
            logger.error("error:", e);
        }
        return resultObject;
    }
    /**
     * 查看借贷申请单列表
     * @param request 请求对象
     * @return 申请单列表
trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/LoanService.java
@@ -48,6 +48,12 @@
     * @return 添加是否成功
     */
    public Boolean addLoanOrder(SimpleLoanOrder simpleLoanOrder);
    /**
     * 还款申请
     * @return 添加是否成功
     */
    public Boolean refundLoanOrder(String orderNo, String userId);
    
    /**
     * 修改借贷申请单
trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/internal/LoanServiceImpl.java
@@ -21,6 +21,7 @@
import com.yami.trading.common.domain.Result;
import com.yami.trading.common.exception.BusinessException;
import com.yami.trading.common.exception.YamiShopBindException;
import com.yami.trading.common.util.Arith;
import com.yami.trading.dao.loan.LoanParamMapper;
import com.yami.trading.service.MoneyLogService;
import com.yami.trading.service.WalletService;
@@ -104,6 +105,7 @@
        stateMap.put(3, "驳回");
        stateMap.put(4, "已逾期");
        stateMap.put(5, "已还款");
        stateMap.put(6, "提交还款申请");
        
        repayments.put(1,"到期还本息");
        repayments.put(2,"到期还本金");
@@ -161,6 +163,61 @@
        System.out.println(update);
        return true;
    }
    @Override
    public Boolean refundLoanOrder(String orderNo, String userId) {
        try {
            if(null==orderNo || (orderNo=orderNo.trim()).isEmpty()) {
                throw new BusinessException("申请单ID不能为空!");
            }
            SimpleLoanOrder loanOrder = getLoanOrder(null, orderNo);
            if(loanOrder == null) {
                throw new BusinessException("找不到订单!");
            }
            //利息
            double interest = loanOrder.getQuota().multiply(loanOrder.getDailyRate()).doubleValue();
            //还款金额
            double amt = loanOrder.getQuota().doubleValue() + interest;
            BigDecimal amtBD = new BigDecimal(amt).negate();
            if (!loanOrder.getSymbol().equalsIgnoreCase("usdt")) {
                ExchangeRate exchangeRate = exchangeRateService.findBy(ExchangeRate.IN, loanOrder.getSymbol().toUpperCase());
                if (exchangeRate == null) {
                    throw new YamiShopBindException("汇率未设置");
                }
                BigDecimal money = BigDecimal.valueOf(amt).divide(exchangeRate.getRata(), 8, RoundingMode.HALF_UP);
                amt = money.doubleValue();
            }
            //通过
            Wallet wallet = this.walletService.saveWalletByPartyId(loanOrder.getPartyId());
            if (wallet.getMoney().compareTo(BigDecimal.valueOf(amt)) < 0) {
                throw new YamiShopBindException("余额不足!");
            }
            double amountBefore = wallet.getMoney().doubleValue();
            this.walletService.update(wallet.getUserId(), Arith.sub(0, amt));
            MoneyLog log = new MoneyLog();
            log.setCategory(Constants.MONEYLOG_CATEGORY_LOAN);
            log.setAmountBefore(new BigDecimal(amountBefore));
            log.setAmount(amtBD);
            log.setAmountAfter(BigDecimal.valueOf(amountBefore - amt));
            log.setLog("借贷还款,订单号[" + loanOrder.getUuid() + "]");
            log.setUserId(loanOrder.getPartyId());
            log.setWalletType(loanOrder.getSymbol().toUpperCase());
            log.setContentType(Constants.MONEYLOG_CONTENT_LOAN_REPAY);
            moneyLogService.save(log);
            int count = jdbcTemplate.update("UPDATE T_SIMPLE_LOAN_ORDER SET state=? WHERE UUID=?",6, orderNo);
            if(1!=count) {
                return false;
            }
            return true;
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return false;
    }
    
    @Override
@@ -433,7 +490,7 @@
        }
        int state=Integer.parseInt(status);
        if (state==2) {
        if (state==2) {  //放款
            SimpleLoanOrder loanOrder = getLoanOrder(null, orderId);
            if(loanOrder == null) {
                throw new BusinessException("找不到订单!");
@@ -469,6 +526,42 @@
            log.setWalletType(loanOrder.getSymbol().toUpperCase());
            log.setContentType(Constants.MONEYLOG_CONTENT_LOAN_ADD);
            moneyLogService.save(log);
        } else if (state==7) {  //拒绝还款
            SimpleLoanOrder loanOrder = getLoanOrder(null, orderId);
            if(loanOrder == null) {
                throw new BusinessException("找不到订单!");
            }
            //利息
            double interest = loanOrder.getQuota().multiply(loanOrder.getDailyRate()).doubleValue();
            //退回金额
            double amt = loanOrder.getQuota().doubleValue() + interest;
            BigDecimal amtBD = new BigDecimal(amt);
            if (!loanOrder.getSymbol().equalsIgnoreCase("usdt")) {
                ExchangeRate exchangeRate = exchangeRateService.findBy(ExchangeRate.IN, loanOrder.getSymbol().toUpperCase());
                if (exchangeRate == null) {
                    throw new YamiShopBindException("汇率未设置");
                }
                BigDecimal money = BigDecimal.valueOf(amt).divide(exchangeRate.getRata(), 8, RoundingMode.HALF_UP);
                amt = money.doubleValue();
            }
            //通过
            Wallet wallet = this.walletService.saveWalletByPartyId(loanOrder.getPartyId());
            double amountBefore = wallet.getMoney().doubleValue();
            this.walletService.update(wallet.getUserId(), amt);
            MoneyLog log = new MoneyLog();
            log.setCategory(Constants.MONEYLOG_CATEGORY_LOAN);
            log.setAmountBefore(new BigDecimal(amountBefore));
            log.setAmount(amtBD);
            log.setAmountAfter(BigDecimal.valueOf(amountBefore + amt));
            log.setLog("借贷还款退回,订单号[" + loanOrder.getUuid() + "]");
            log.setUserId(loanOrder.getPartyId());
            log.setWalletType(loanOrder.getSymbol().toUpperCase());
            log.setContentType(Constants.MONEYLOG_CONTENT_LOAN_REPAY_RETURN);
            moneyLogService.save(log);
            state=2; //状态退回待还款
        }
trading-order-bean/src/main/java/com/yami/trading/bean/loan/SimpleLoanOrder.java
@@ -53,7 +53,7 @@
    /**
     * 审核状态
     * 1:未审,2:通过,3:驳回
     * 1审批中,2还款中,3审批失败,4已逾期 5 已还款
     * 1审批中,2还款中,3审批失败,4已逾期 5 已还款 6.提交还款申请
     */
    @TableField("STATE")
    private Integer state;
trading-order-common/src/main/java/com/yami/trading/common/constants/Constants.java
@@ -69,6 +69,11 @@
     * 质押借币 - 还款
     */
    public static final String MONEYLOG_CONTENT_LOAN_REPAY = "loan_repay";
    /**
     * 质押借币 - 还款退回
     */
    public static final String MONEYLOG_CONTENT_LOAN_REPAY_RETURN = "loan_repay_return";
    /**
     * 质押借币
     */