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.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 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 dkModelVoList = dkMapper.queryDk(); PageInfo 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.MX.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.MX.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().eq("c_key", "loan_interest")); if (stockConfig != null) { long day = DateTimeUtil.getDaysRoundedUp(dkModel.getLoanTime()); //利息 利率*贷款金额*借款天数 BigDecimal intAmount = new BigDecimal(stockConfig.getCValue()).multiply(amount).multiply(BigDecimal.valueOf(day)); iUserAssetsServices.aiAvailableBalanceChange(EStockType.MX.getCode(), user.getId(), EUserAssets.RT_DK_INT, intAmount); } //还款 iUserAssetsServices.aiAvailableBalanceChange(EStockType.MX.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 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 dkModelList = dkMapper.selectList(new QueryWrapper() .eq("dk_user_id", String.valueOf(user.getId())) .eq(state != null,"dk_state", state) .orderByDesc("create_time") ); PageInfo 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 queryDkJg() { return mapper.queryAll(); } @Override public int deleteByDkjg(int id) { return mapper.deleteById(id); } }