package com.nq.service.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
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 org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Objects;
|
|
/**
|
* 用户资产
|
*/
|
@Service
|
public class UserAssetsServices implements IUserAssetsServices {
|
|
@Resource
|
UserAssetsMapper userAssetsMapper;
|
|
@Resource
|
MoneyLogMapper moneyLogMapper;
|
|
@Autowired
|
UserRechargeServiceImpl userRechargeService;
|
|
@Autowired
|
UserWithdrawServiceImpl withdrawService;
|
|
@Resource
|
UserRechargeMapper userRechargeMapper;
|
|
@Resource
|
UserMapper userMapper;
|
|
@Autowired
|
UserPositionMapper userPositionMapper;
|
|
@Override
|
public UserAssets assetsByTypeAndUserId(String accetType, Integer userId) {
|
if(accetType.equals("SZHB")){
|
accetType = "US";
|
}
|
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 ServerResponse updateUserAssets(Integer id, String amt,String type) {
|
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);
|
if(null != userPosition){
|
userPosition.setAmountToBeCovered(userAssets.getAmountToBeCovered());
|
}
|
}else{
|
BigDecimal amountToBeCovered = userAssets.getAmountToBeCovered().subtract(bigAmt);
|
userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(bigAmt));
|
userAssets.setAmountToBeCovered(amountToBeCovered);
|
if(null != userPosition){
|
userPosition.setAmountToBeCovered(userAssets.getAmountToBeCovered());
|
}
|
}
|
}else{
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(bigAmt));
|
}
|
}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");
|
}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) {
|
|
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();
|
String accectType = userAssets.getAccectType();
|
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 amountToBeCovered = userAssets.getAmountToBeCovered().subtract(amount);
|
userAssets.setAmountToBeCovered(amountToBeCovered);
|
}
|
}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())){
|
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 amountToBeCovered = userAssets.getAmountToBeCovered().subtract(amount);
|
userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(amount));
|
userAssets.setAmountToBeCovered(amountToBeCovered);
|
}
|
}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()));
|
}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());
|
userPositionMapper.updateById(userPosition);
|
}
|
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(accectType);
|
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);
|
}
|
}
|