package com.nq.service.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.nq.Repository.ExchangeRateRepository;
|
import com.nq.common.ServerResponse;
|
import com.nq.dao.*;
|
import com.nq.enums.EStockType;
|
import com.nq.enums.EUserAssets;
|
import com.nq.pojo.*;
|
import com.nq.service.IUserAssetsServices;
|
import com.nq.utils.KeyUtils;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.util.Arrays;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Objects;
|
|
/**
|
* 用户资产
|
*/
|
@Slf4j
|
@Service
|
public class UserAssetsServices implements IUserAssetsServices {
|
|
@Resource
|
UserAssetsMapper userAssetsMapper;
|
|
@Resource
|
MoneyLogMapper moneyLogMapper;
|
|
@Autowired
|
UserRechargeServiceImpl userRechargeService;
|
|
@Resource
|
UserRechargeMapper userRechargeMapper;
|
|
@Resource
|
UserMapper userMapper;
|
|
@Autowired
|
UserPositionMapper userPositionMapper;
|
|
@Autowired
|
ExchangeRateRepository exchangeRateRepository;
|
|
|
@Override
|
public UserAssets assetsByTypeAndUserId(String accetType, Integer userId) {
|
/*if(!accetType.equals(EStockType.US.getCode())){
|
accetType = EStockType.US.getCode();
|
}*/
|
QueryWrapper<UserAssets> queryWrapper = new QueryWrapper<>();
|
queryWrapper.eq("accect_type",accetType);
|
queryWrapper.eq("user_id",userId);
|
UserAssets userAssets = userAssetsMapper.selectOne(queryWrapper);
|
if(userAssets == null){
|
userAssets = new UserAssets();
|
userAssets.setAccectType(accetType);
|
userAssets.setUserId(userId);
|
userAssetsMapper.insert(userAssets);
|
}
|
userAssets = userAssetsMapper.selectOne(queryWrapper);
|
return userAssets;
|
}
|
|
@Override
|
public void addUserAssetsListByUserId(Integer userId) {
|
QueryWrapper<UserAssets> queryWrapper = new QueryWrapper<>();
|
queryWrapper.eq("user_id",userId);
|
List<UserAssets> userAssetsList = userAssetsMapper.selectList(queryWrapper);
|
List<EStockType> stockTypes = Arrays.asList(
|
EStockType.US,
|
EStockType.HK,
|
EStockType.IN,
|
EStockType.TW
|
);
|
for (EStockType stockType : stockTypes) {
|
//是否存在记录
|
boolean isExist = false;
|
if (!userAssetsList.isEmpty()) {
|
boolean hasType = userAssetsList.stream()
|
.anyMatch(assets -> stockType.getCode().equals(assets.getAccectType()));
|
if (hasType) {
|
isExist = true;
|
}
|
}
|
if (!isExist) { //不存在账户新增
|
UserAssets userAssets = new UserAssets();
|
userAssets.setUserId(userId);
|
userAssets.setAccectType(stockType.getCode());
|
userAssetsMapper.insert(userAssets);
|
}
|
}
|
}
|
|
@Override
|
public ServerResponse updateUserAssets(Integer id, String amt,String type, String accectType) {
|
UserAssets userAssets = userAssetsMapper.selectById(id);
|
//UserPosition userPosition = userPositionMapper.selectOne(new LambdaQueryWrapper<UserPosition>().gt(UserPosition::getAmountToBeCovered, BigDecimal.ZERO).eq(UserPosition::getUserId,userAssets.getUserId()));
|
// 0 入款 1是扣钱 2 是充值 3 是提币
|
BigDecimal bigAmt = new BigDecimal(amt);
|
if(type.equals("0") || type.equals("1")){
|
if(type.equals("1")){
|
bigAmt = bigAmt.negate();
|
}
|
if(type.equals("0")){
|
if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
|
BigDecimal availableBalance = bigAmt.subtract(userAssets.getAmountToBeCovered());
|
availableBalance = availableBalance.subtract(userAssets.getHandlingChargeWritten());
|
if(availableBalance.compareTo(BigDecimal.ZERO) >= 0){
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(availableBalance));
|
userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(userAssets.getAmountToBeCovered()));
|
userAssets.setAmountToBeCovered(BigDecimal.ZERO);
|
userAssets.setHandlingChargeWritten(BigDecimal.ZERO);
|
}else{
|
BigDecimal subtract = bigAmt.subtract(userAssets.getHandlingChargeWritten());
|
if(subtract.compareTo(BigDecimal.ZERO) >= 0) {
|
BigDecimal decimal = bigAmt.subtract(userAssets.getAmountToBeCovered());
|
decimal = decimal.subtract(userAssets.getHandlingChargeWritten());
|
userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(bigAmt.subtract(userAssets.getHandlingChargeWritten())));
|
userAssets.setHandlingChargeWritten(BigDecimal.ZERO);
|
userAssets.setAmountToBeCovered(decimal.negate());
|
}else{
|
userAssets.setHandlingChargeWritten(userAssets.getHandlingChargeWritten().subtract(bigAmt));
|
}
|
}
|
}else{
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(bigAmt));
|
}
|
/*if(null != userPosition){
|
userPosition.setAmountToBeCovered(userAssets.getAmountToBeCovered().add(userAssets.getHandlingChargeWritten()));
|
userPositionMapper.updateById(userPosition);
|
}*/
|
}else{
|
if(userAssets.getAvailableBalance().compareTo(BigDecimal.ZERO) <= 0){
|
return ServerResponse.createByErrorMsg("客户账户余额为0");
|
}else if(userAssets.getAvailableBalance().subtract(bigAmt.abs()).compareTo(BigDecimal.ZERO) < 0){
|
return ServerResponse.createByErrorMsg("客户账户余额不足扣款");
|
}
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(bigAmt));
|
}
|
/*if(null != userPosition){
|
userPositionMapper.updateById(userPosition);
|
}*/
|
if( userAssetsMapper.updateById(userAssets)>0){
|
// saveUserRecharge(userAssets.getUserId(),bigAmt);
|
return ServerResponse.createBySuccess();
|
}else{
|
return ServerResponse.createByErrorMsg("修改金额失败");
|
}
|
}else{
|
if(type.equals("2")){
|
return userRechargeService.createOrder(userAssets.getUserId(),1,bigAmt.intValue(),"1", accectType);
|
}else{
|
return ServerResponse.createBySuccess();
|
}
|
}
|
}
|
|
public void saveUserRecharge(Integer userId ,BigDecimal amt){
|
User user = this.userMapper.selectById(userId);
|
if (user == null) {
|
return;
|
}
|
UserRecharge userRecharge = new UserRecharge();
|
userRecharge.setUserId(user.getId());
|
userRecharge.setNickName(user.getRealName());
|
userRecharge.setAgentId(user.getAgentId());
|
|
String ordersn = KeyUtils.getRechargeOrderSn();
|
userRecharge.setOrderSn(ordersn);
|
|
userRecharge.setPayChannel("1");
|
userRecharge.setPayAmt(new BigDecimal(amt.intValue()));
|
userRecharge.setAddTime(new Date());
|
userRecharge.setPayTime(new Date());
|
userRecharge.setOrderStatus(Integer.valueOf(1));
|
userRecharge.setPayId(1);
|
userRechargeMapper.insert(userRecharge);
|
}
|
|
|
@Override
|
public List<UserAssets> assetsByUserId(Integer userId) {
|
QueryWrapper<UserAssets> queryWrapper = new QueryWrapper<>();
|
queryWrapper.eq("user_id",userId);
|
return userAssetsMapper.selectList(queryWrapper);
|
}
|
|
@Override
|
public BigDecimal getAvailableBalance(String accetType, Integer userId) {
|
if(accetType.equals("SZHB")){
|
accetType = "US";
|
}
|
return assetsByTypeAndUserId(accetType,userId).getAvailableBalance();
|
}
|
|
|
@Override
|
public Boolean availablebalanceChange(String accetType, Integer userId, EUserAssets eUserAssets, BigDecimal amount, String desc, String descType) throws Exception {
|
//查询账户
|
/*UserAssets userAssets = assetsByTypeAndUserId(EStockType.getDefault().getCode(), userId);
|
//是否需要转换金额
|
if (!accetType.equals(EStockType.getDefault().getCode())) {
|
amount = exchangeAmountByRate(accetType, amount);
|
}*/
|
UserAssets userAssets = assetsByTypeAndUserId(accetType, userId);
|
//UserPosition userPosition = userPositionMapper.selectOne(new LambdaQueryWrapper<UserPosition>().gt(UserPosition::getAmountToBeCovered, BigDecimal.ZERO).eq(UserPosition::getUserId,userAssets.getUserId()));
|
String type = eUserAssets.getDesc();
|
String before = userAssets.getAvailableBalance().toString();
|
accetType = userAssets.getAccectType();
|
BigDecimal amountLog = amount;
|
if(Objects.equals(eUserAssets.getCode(), EUserAssets.BUY.getCode())){
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
|
userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(amount.negate()));
|
}else if(Objects.equals(eUserAssets.getCode(), EUserAssets.CLOSE_POSITION.getCode())){
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
|
extracted(amount, userAssets);
|
}else if(Objects.equals(eUserAssets.getCode(), EUserAssets.CLOSE_POSITION_RETURN_SECURITY_DEPOSIT.getCode())){
|
if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
|
BigDecimal availableBalance = amount.subtract(userAssets.getAmountToBeCovered());
|
availableBalance = availableBalance.subtract(userAssets.getHandlingChargeWritten());
|
if(availableBalance.compareTo(BigDecimal.ZERO) >= 0){
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(availableBalance));
|
userAssets.setAmountToBeCovered(BigDecimal.ZERO);
|
userAssets.setHandlingChargeWritten(BigDecimal.ZERO);
|
}else{
|
BigDecimal subtract = amount.subtract(userAssets.getHandlingChargeWritten());
|
if(subtract.compareTo(BigDecimal.ZERO) >= 0) {
|
BigDecimal decimal = amount.subtract(userAssets.getAmountToBeCovered());
|
decimal = decimal.subtract(userAssets.getHandlingChargeWritten());
|
userAssets.setHandlingChargeWritten(BigDecimal.ZERO);
|
userAssets.setAmountToBeCovered(decimal.negate());
|
}else{
|
userAssets.setHandlingChargeWritten(userAssets.getHandlingChargeWritten().subtract(amount));
|
}
|
}
|
}else{
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
|
}
|
userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(amount));
|
}else if(Objects.equals(eUserAssets.getCode(), EUserAssets.CALCULATE_PROFIT_AND_LOSS.getCode())){
|
extracted(amount, userAssets);
|
}else if(Objects.equals(eUserAssets.getCode(), EUserAssets.TRANSFER.getCode())){
|
if (amount.compareTo(BigDecimal.ZERO) > 0) { //转换加钱,先补待补资金
|
if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
|
BigDecimal availableBalance = amount.subtract(userAssets.getAmountToBeCovered());
|
availableBalance = availableBalance.subtract(userAssets.getHandlingChargeWritten());
|
if(availableBalance.compareTo(BigDecimal.ZERO) >= 0){
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(availableBalance));
|
userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(userAssets.getAmountToBeCovered()));
|
userAssets.setAmountToBeCovered(BigDecimal.ZERO);
|
userAssets.setHandlingChargeWritten(BigDecimal.ZERO);
|
}else{
|
BigDecimal subtract = amount.subtract(userAssets.getHandlingChargeWritten());
|
if(subtract.compareTo(BigDecimal.ZERO) >= 0) {
|
BigDecimal decimal = amount.subtract(userAssets.getAmountToBeCovered());
|
decimal = decimal.subtract(userAssets.getHandlingChargeWritten());
|
userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(amount.subtract(userAssets.getHandlingChargeWritten())));
|
userAssets.setHandlingChargeWritten(BigDecimal.ZERO);
|
userAssets.setAmountToBeCovered(decimal.negate());
|
}else{
|
userAssets.setHandlingChargeWritten(userAssets.getHandlingChargeWritten().subtract(amount));
|
}
|
}
|
}else{
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
|
}
|
} else { //扣钱
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
|
}
|
eUserAssets.setDesc(desc);
|
}else if(Objects.equals(eUserAssets.getCode(), EUserAssets.TOP_UP.getCode())){
|
if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
|
BigDecimal availableBalance = amount.subtract(userAssets.getAmountToBeCovered());
|
availableBalance = availableBalance.subtract(userAssets.getHandlingChargeWritten());
|
if(availableBalance.compareTo(BigDecimal.ZERO) >= 0){
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(availableBalance));
|
userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(userAssets.getAmountToBeCovered()));
|
userAssets.setAmountToBeCovered(BigDecimal.ZERO);
|
userAssets.setHandlingChargeWritten(BigDecimal.ZERO);
|
}else{
|
BigDecimal subtract = amount.subtract(userAssets.getHandlingChargeWritten());
|
if(subtract.compareTo(BigDecimal.ZERO) >= 0) {
|
BigDecimal decimal = amount.subtract(userAssets.getAmountToBeCovered());
|
decimal = decimal.subtract(userAssets.getHandlingChargeWritten());
|
userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(amount.subtract(userAssets.getHandlingChargeWritten())));
|
userAssets.setHandlingChargeWritten(BigDecimal.ZERO);
|
userAssets.setAmountToBeCovered(decimal.negate());
|
}else{
|
userAssets.setHandlingChargeWritten(userAssets.getHandlingChargeWritten().subtract(amount));
|
}
|
}
|
}else{
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
|
}
|
}else if(Objects.equals(eUserAssets.getCode(), EUserAssets.WITHDRAW.getCode())){
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
|
userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(amount.abs()));
|
}else if(Objects.equals(eUserAssets.getCode(), EUserAssets.HANDLING_CHARGE.getCode())){
|
if(userAssets.getAvailableBalance().compareTo(amount.abs()) >= 0){
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount.negate()));
|
amountLog = amount.negate();
|
}else {
|
userAssets.setHandlingChargeWritten(userAssets.getHandlingChargeWritten().add(amount.abs()));
|
}
|
userAssets.setHandlingCharge(userAssets.getHandlingCharge().add(amount.abs()));
|
|
extracted(amount.negate(),userAssets);
|
}else if(Objects.equals(eUserAssets.getCode(), EUserAssets.CONSTRAINT_CLOSE_POSITION.getCode())){
|
userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(amount));
|
if(userAssets.getIsZf() == 0){
|
userAssets.setCumulativeProfitAndLoss(userAssets.getCumulativeProfitAndLoss().subtract(amount));
|
}else{
|
userAssets.setCumulativeProfitAndLoss(userAssets.getCumulativeProfitAndLoss().add(amount));
|
}
|
extracted(userAssets);
|
}
|
|
/*if(null != userPosition){
|
userPosition.setAmountToBeCovered(userAssets.getAmountToBeCovered().add(userAssets.getHandlingChargeWritten()));
|
userPositionMapper.updateById(userPosition);
|
}*/
|
String after = userAssets.getAvailableBalance().toString();
|
MoneyLog moneyLog = new MoneyLog();
|
moneyLog.setDescs(eUserAssets.getDesc());
|
moneyLog.setBeFore(before);
|
moneyLog.setAfter(after);
|
moneyLog.setAmount(amountLog.toString());
|
moneyLog.setAccectType(accetType);
|
moneyLog.setType(eUserAssets.getCode());
|
moneyLog.setUserId(userId+"");
|
moneyLog.setSymbol(EStockType.getEStockTypeByCode(accetType).getSymbol());
|
moneyLog.setCreateTime(new Date());
|
moneyLogMapper.insert(moneyLog);
|
return userAssetsMapper.updateById(userAssets)>1;
|
}
|
|
//只要涉及到cumulativeProfitAndLoss变动重新设置状态
|
private static void extracted(UserAssets userAssets) {
|
if(userAssets.getCumulativeProfitAndLoss().compareTo(BigDecimal.ZERO) >= 0){
|
userAssets.setIsZf(0);
|
}else{
|
userAssets.setIsZf(1);
|
userAssets.setCumulativeProfitAndLoss(userAssets.getCumulativeProfitAndLoss().abs());
|
}
|
}
|
|
private static void extracted(BigDecimal amount, UserAssets userAssets) {
|
if(userAssets.getIsZf() == 1){
|
userAssets.setCumulativeProfitAndLoss(userAssets.getCumulativeProfitAndLoss().negate());
|
}
|
if(userAssets.getIsZf() == 0){
|
if(amount.compareTo(BigDecimal.ZERO) >= 0){
|
userAssets.setCumulativeProfitAndLoss(userAssets.getCumulativeProfitAndLoss().add(amount.abs()));
|
}else{
|
userAssets.setCumulativeProfitAndLoss(userAssets.getCumulativeProfitAndLoss().subtract(amount.abs()));
|
}
|
}else{
|
if(amount.compareTo(BigDecimal.ZERO) >= 0){
|
userAssets.setCumulativeProfitAndLoss(userAssets.getCumulativeProfitAndLoss().add(amount.abs()));
|
}else{
|
userAssets.setCumulativeProfitAndLoss(userAssets.getCumulativeProfitAndLoss().subtract(amount.abs()));
|
}
|
}
|
extracted(userAssets);
|
}
|
|
|
public Boolean aiAvailableBalanceChange(String accetType, Integer userId, EUserAssets eUserAssets, BigDecimal amount) throws Exception {
|
//查询账户
|
/*UserAssets userAssets = assetsByTypeAndUserId(EStockType.getDefault().getCode(), userId);
|
//是否需要转换金额
|
if (!accetType.equals(EStockType.getDefault().getCode())) {
|
amount = exchangeAmountByRate(accetType, amount);
|
}*/
|
UserAssets userAssets = assetsByTypeAndUserId(accetType, userId);
|
String before = userAssets.getAvailableBalance().toString();
|
if (eUserAssets.getCode().equals(EUserAssets.BUY_AI.getCode())) {
|
//冻结金额
|
userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(amount));
|
//扣除可用金额
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().subtract(amount));
|
amount = amount.negate();
|
} else if (eUserAssets.getCode().equals(EUserAssets.BUY_AI_REJECT.getCode())) {
|
//解除冻结金额
|
userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(amount));
|
//归还可用金额
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
|
} else if (eUserAssets.getCode().equals(EUserAssets.AI_SETTLEMENT.getCode())) {
|
//解除购买冻结金额
|
userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(amount));
|
//归还购买金额
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
|
} else if (eUserAssets.getCode().equals(EUserAssets.AI_SETTLEMENT_INT.getCode())) {
|
//收益
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
|
} else if(eUserAssets.getCode().equals(EUserAssets.DK.getCode())) {
|
//发放贷款金额
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
|
} else if(eUserAssets.getCode().equals(EUserAssets.RT_DK.getCode())) {
|
//归还贷款
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().subtract(amount));
|
amount = amount.negate();
|
} else if(eUserAssets.getCode().equals(EUserAssets.RT_DK_INT.getCode())) {
|
//贷款利息
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().subtract(amount));
|
amount = amount.negate();
|
}
|
|
String after = userAssets.getAvailableBalance().toString();
|
//资金明细
|
MoneyLog moneyLog = new MoneyLog();
|
moneyLog.setDescs(eUserAssets.getDesc());
|
moneyLog.setBeFore(before);
|
moneyLog.setAfter(after);
|
moneyLog.setAmount(amount.toString());
|
moneyLog.setAccectType(userAssets.getAccectType());
|
moneyLog.setType(eUserAssets.getCode());
|
moneyLog.setUserId(userAssets.getUserId()+"");
|
moneyLog.setSymbol(EStockType.getEStockTypeByCode(userAssets.getAccectType()).getSymbol());
|
moneyLog.setCreateTime(new Date());
|
moneyLogMapper.insert(moneyLog);
|
return userAssetsMapper.updateById(userAssets)>1;
|
}
|
|
@Override
|
public BigDecimal exchangeAmountByRate(String fromType, String toType, BigDecimal amount) throws Exception {
|
EStockType stockType = EStockType.getEStockTypeByCode(fromType);
|
EStockType toStockType = EStockType.getEStockTypeByCode(toType);
|
ExchangeRate exchangeRate = exchangeRateRepository.findExchangeRateByCurrencyAndConversionCurrency(
|
stockType.getSymbol(), toStockType.getSymbol()).orElse(null);
|
if (exchangeRate != null) {
|
//转换为默认货币 保留5位小数
|
return amount.multiply(exchangeRate.getRata()).setScale(5, RoundingMode.HALF_UP);
|
} else {
|
log.error("exchangeAmountByRate is null:{}>>{}", stockType.getSymbol(), toStockType.getSymbol());
|
throw new Exception("货币转换汇率未设置");
|
}
|
|
|
}
|
}
|