1
zj
2026-01-13 74f2dd24eb7241020319771c794d9e9f06264d7e
src/main/java/com/nq/service/impl/DkServices.java
@@ -1,70 +1,210 @@
package com.nq.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.nq.common.ResponseCode;
import com.nq.common.ServerResponse;
import com.nq.dao.DkJGMapper;
import com.nq.dao.DkMapper;
import com.nq.pojo.DkJgBean;
import com.nq.pojo.DkModel;
import com.nq.pojo.User;
import com.nq.dao.StockConfigMapper;
import com.nq.dao.UserMapper;
import com.nq.enums.EConfigKey;
import com.nq.enums.EStockType;
import com.nq.enums.EUserAssets;
import com.nq.pojo.*;
import com.nq.service.IDkServices;
import com.nq.service.IUserAssetsServices;
import com.nq.service.IUserService;
import com.nq.utils.DateTimeUtil;
import com.nq.utils.timeutil.DateTimeUtil;
import com.nq.vo.dk.DkModelVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@Service
public class DkServices implements IDkServices {
    @Autowired
    DkMapper dkMapper;
    private static final Logger log = LoggerFactory.getLogger(DkServices.class);
    private final ConcurrentHashMap<Long, Object> locks = new ConcurrentHashMap<>();
    @Autowired
    DkMapper dkMapper;
    @Autowired
    DkJGMapper mapper;
    @Autowired
    UserMapper userMapper;
    @Autowired
    StockConfigMapper stockConfigMapper;
    @Autowired
    IUserService iUserService;
    @Autowired
    IUserAssetsServices iUserAssetsServices;
    /**
     * 申请贷款
     * @param dkMoney
     * @param phone
     * @param dkjgId
     * @param request
     * @return
     */
    @Override
    public boolean addDk(String dkMoney, String phone, String dkjgId, HttpServletRequest request) {
        User user = this.iUserService.getCurrentRefreshUser(request);
        if (user == null) {
            return false;
    public ServerResponse addDk(BigDecimal dkMoney, String phone, String dkjgId, HttpServletRequest request) {
        try {
            User user = this.iUserService.getCurrentRefreshUser(request);
            if (user == null) {
                return ServerResponse.createByErrorCodeMsg(ResponseCode.NEED_LOGIN.getCode(),"请先登录", request);
            }
            if (user.getLoanLimit() == null || user.getLoanLimit().compareTo(BigDecimal.ZERO) <= 0) {
                System.out.println(user.getLoanLimit());
                return ServerResponse.createByErrorMsg("无贷款额度",request);
            }
            if (user.getLoanLimit().compareTo(dkMoney) < 0) {
                return ServerResponse.createByErrorMsg("最大贷款额度为:" + user.getLoanLimit() ,request);
            }
            String userId = String.valueOf(user.getId());
            //查询是否有未还款记录
            if (dkMapper.countByUserIdAndRStatus(userId, 0) > 0 ) {
                return ServerResponse.createByErrorMsg("已申请贷款,请勿重复申请!", request);
            }
            DkModel dkModel = new DkModel();
            dkModel.setDkUserId(userId);
            dkModel.setCreateTime(new Date());
            dkModel.setDkMoney(String.valueOf(dkMoney));
            dkModel.setDkState("0");
            dkModel.setDkRefundState(0);
            dkModel.setDkJgId(dkjgId);
            dkModel.setDkPhone(phone);
            dkMapper.insert(dkModel);
            return ServerResponse.createBySuccess("贷款申请成功", request);
        } catch (Exception e) {
            log.error("IDkServices addDk error", e);
        }
        DkModel dkModel = new DkModel();
        dkModel.setDkUserId(user.getId() + "");
        dkModel.setCreateTime(DateTimeUtil.strToDate(DateTimeUtil.dateToStr(new Date())));
        dkModel.setDkMoney(dkMoney);
        dkModel.setDkState("0");
        dkModel.setDkJgId(dkjgId);
        dkModel.setDkPhone(phone);
        dkMapper.insert(dkModel);
        return true;
        return ServerResponse.createByError();
    }
    @Override
    public List<DkModelVo> queryDk() {
        return dkMapper.queryDk();
    public ServerResponse queryDk(int pageNum, int pageSize) {
        try {
            PageHelper.startPage(pageNum,pageSize);
            List<DkModelVo> dkModelVoList = dkMapper.queryDk();
            PageInfo<DkModelVo> pageInfo = new PageInfo<>(dkModelVoList);
            return ServerResponse.createBySuccess(pageInfo);
        } catch (Exception e) {
            log.error("IDkServices queryDk error", e);
        }
        return ServerResponse.createByError();
    }
    /**
     * 贷款审核
     * @param spMoney
     * @param message
     * @param state
     * @param dkId
     * @return
     */
    @Override
    public boolean dksp(Integer shMoney, String message, Integer state, Integer dkId) {
        DkModel dkModel = dkMapper.selectById(dkId);
        if (dkModel == null) {
            return false;
    @Transactional(rollbackFor = Exception.class)
    public ServerResponse dkSp(BigDecimal spMoney, String message, Integer state, Integer dkId) {
        try {
            DkModel dkModel = dkMapper.selectById(dkId);
            if (dkModel == null) {
                return ServerResponse.createByErrorMsg("无贷款记录");
            }
            String userId = String.valueOf(dkModel.getDkUserId());
            Object lock = locks.computeIfAbsent(Long.valueOf(userId), k -> new Object());
            synchronized (lock){
                User user = userMapper.selectById(Integer.valueOf(userId));
                if (user == null) {
                    return ServerResponse.createByErrorMsg("无用户信息");
                }
                if (state == 1) { //通过
                    if (user.getLoanLimit() == null || user.getLoanLimit().compareTo(BigDecimal.ZERO) <= 0) {
                        return ServerResponse.createByErrorMsg("无贷款额度");
                    }
                    if (user.getLoanLimit().compareTo(spMoney) < 0) {
                        return ServerResponse.createByErrorMsg("审核金额超出贷款额度:" + user.getLoanLimit());
                    }
                    dkModel.setSpMoney(String.valueOf(spMoney));
                    dkModel.setLoanTime(new Date());
                    //扣除用户贷款
                    user.setLoanLimit(user.getLoanLimit().subtract(spMoney));
                    //发放贷款金额 墨西哥账户
                    iUserAssetsServices.aiAvailableBalanceChange(EStockType.getDefault().getCode(), user.getId(), EUserAssets.DK, spMoney);
                    userMapper.updateById(user);
                } else if (state == 2) { //拒绝
                    dkModel.setDkMessage(message);
                }
                dkModel.setDkState(String.valueOf(state));
                dkMapper.updateById(dkModel);
                return ServerResponse.createBySuccess("贷款审核成功");
            }
        } catch (Exception e) {
            log.error("IDkServices dksp error", e);
        }
        dkModel.setDkMessage(message);
        dkModel.setDkState(state + "");
        dkModel.setSpMoney(shMoney + "");
        dkMapper.updateById(dkModel);
        return true;
        return ServerResponse.createByError();
    }
    /**
     * 还款
     * @param id
     * @param request
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public ServerResponse rtDk(Integer id, HttpServletRequest request) {
        try {
            DkModel dkModel = dkMapper.selectById(id);
            if (dkModel == null) {
                return ServerResponse.createByErrorMsg("无贷款记录", request);
            }
            if (!dkModel.getDkState().equals("1")) {
                return ServerResponse.createByErrorMsg("未审核通过记录不能还款", request);
            }
            String userId = String.valueOf(dkModel.getDkUserId());
            Object lock = locks.computeIfAbsent(Long.valueOf(userId), k -> new Object());
            synchronized (lock){
                User user = userMapper.selectById(Integer.valueOf(userId));
                if (user == null) {
                    return ServerResponse.createByErrorMsg("无用户信息", request);
                }
                UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.getDefault().getCode(), user.getId());
                //应该还款金额
                BigDecimal amount = new BigDecimal(dkModel.getSpMoney());
                if(userAssets.getAvailableBalance().compareTo(amount) < 0){
                    return ServerResponse.createByErrorMsg("可用余额不足:" +  userAssets.getAvailableBalance(), request);
                }
                dkModel.setDkRefundState(1);
                //查看贷款利息
                StockConfig stockConfig = stockConfigMapper.selectOne(new QueryWrapper<StockConfig>().eq("c_key", EConfigKey.LOAN_INTEREST.getCode()));
                if (stockConfig != null) {
                    long day = DateTimeUtil.getDaysRoundedUp(dkModel.getLoanTime());
                    //利息 利率*贷款金额*借款天数
                    BigDecimal intAmount = new BigDecimal(stockConfig.getCValue()).multiply(amount).multiply(BigDecimal.valueOf(day));
                    iUserAssetsServices.aiAvailableBalanceChange(EStockType.getDefault().getCode(), user.getId(), EUserAssets.RT_DK_INT, intAmount);
                }
                //还款
                iUserAssetsServices.aiAvailableBalanceChange(EStockType.getDefault().getCode(), user.getId(), EUserAssets.RT_DK, amount);
                dkMapper.updateById(dkModel);
                return ServerResponse.createBySuccess("贷款审核成功", request);
            }
        } catch (Exception e) {
            log.error("IDkServices rtDk error", e);
        }
        return ServerResponse.createByError();
    }
    @Override
@@ -72,10 +212,32 @@
        return mapper.queryAll();
    }
    public List<DkModelVo> queryByShUserId(HttpServletRequest httpServletRequest) {
        User user = this.iUserService.getCurrentRefreshUser(httpServletRequest);
        return dkMapper.queryByShUserId(user.getId()+"");
    /**
     * 贷款记录
     * @param pageNum
     * @param pageSize
     * @param httpServletRequest
     * @return
     */
    @Override
    public ServerResponse queryByShUserId(int pageNum, int pageSize, Integer state, HttpServletRequest httpServletRequest) {
        try {
            User user = this.iUserService.getCurrentRefreshUser(httpServletRequest);
            if (user == null) {
                return ServerResponse.createByErrorCodeMsg(ResponseCode.NEED_LOGIN.getCode(),"请先登录", httpServletRequest);
            }
            PageHelper.startPage(pageNum,pageSize);
            List<DkModel> dkModelList = dkMapper.selectList(new QueryWrapper<DkModel>()
                    .eq("dk_user_id", String.valueOf(user.getId()))
                    .eq(state != null,"dk_state", state)
                    .orderByDesc("create_time")
            );
            PageInfo<DkModel> pageInfo = new PageInfo<>(dkModelList);
            return ServerResponse.createBySuccess(pageInfo);
        } catch (Exception e) {
            log.error("IDkServices queryByShUserId error", e);
        }
        return ServerResponse.createByError();
    }
    @Override