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.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.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.math.BigDecimal;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.concurrent.ConcurrentHashMap;
|
|
@Service
|
public class DkServices implements IDkServices {
|
|
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 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);
|
}
|
return ServerResponse.createByError();
|
}
|
|
@Override
|
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
|
@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);
|
}
|
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
|
public List<DkJgBean> queryAll() {
|
return mapper.queryAll();
|
}
|
|
/**
|
* 贷款记录
|
* @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
|
public int inserDkJG(String dkjgName) {
|
DkJgBean dkJgBean = new DkJgBean();
|
dkJgBean.setDkJg(dkjgName);
|
return mapper.insert(dkJgBean);
|
}
|
|
|
|
@Override
|
public int update(DkJgBean dkJgBean) {
|
return mapper.updateById(dkJgBean);
|
}
|
|
@Override
|
public List<DkJgBean> queryDkJg() {
|
return mapper.queryAll();
|
}
|
|
@Override
|
public int deleteByDkjg(int id) {
|
return mapper.deleteById(id);
|
}
|
}
|