| | |
| | | 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 |
| | |
| | | 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 |