package com.nq.service.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.nq.common.ServerResponse;
|
import com.nq.dao.MoneyLogMapper;
|
import com.nq.dao.UserAssetsMapper;
|
import com.nq.dao.UserOptionLogMapper;
|
import com.nq.enums.EStockType;
|
import com.nq.enums.EUserAssets;
|
import com.nq.pojo.MoneyLog;
|
import com.nq.pojo.UserAssets;
|
import com.nq.pojo.UserOptionLog;
|
import com.nq.service.IUserAssetsServices;
|
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
|
UserOptionLogMapper userOptionLogMapper;
|
|
@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.selectOne(new LambdaQueryWrapper<>(UserAssets.class).eq(UserAssets::getUserId,id));
|
// 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());
|
if(availableBalance.compareTo(BigDecimal.ZERO) > 0){
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(availableBalance));
|
userAssets.setAmountToBeCovered(BigDecimal.ZERO);
|
}else{
|
BigDecimal amountToBeCovered = userAssets.getAmountToBeCovered().subtract(bigAmt);
|
userAssets.setAmountToBeCovered(amountToBeCovered);
|
}
|
}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( userAssetsMapper.updateById(userAssets)>0){
|
userOptionLogMapper.insert(UserOptionLog.builder()
|
.userId(userAssets.getUserId())
|
.money(bigAmt)
|
.userAccectId(userAssets.getId())
|
.createTime(new Date())
|
.type(amt.contains("-")?0:1)
|
.build());
|
return ServerResponse.createBySuccess();
|
}else{
|
return ServerResponse.createByErrorMsg("修改金额失败");
|
}
|
}else{
|
if(type.equals("2")){
|
return userRechargeService.createOrder(id,1,bigAmt.intValue(),"1");
|
}else{
|
|
|
return ServerResponse.createBySuccess();
|
}
|
}
|
}
|
|
|
@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);
|
|
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());
|
if(availableBalance.compareTo(BigDecimal.ZERO) > 0){
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(availableBalance));
|
userAssets.setAmountToBeCovered(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());
|
if(availableBalance.compareTo(BigDecimal.ZERO) > 0){
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(availableBalance));
|
userAssets.setAmountToBeCovered(BigDecimal.ZERO);
|
}else{
|
BigDecimal amountToBeCovered = userAssets.getAmountToBeCovered().subtract(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));
|
}else if(Objects.equals(eUserAssets.getCode(), EUserAssets.HANDLING_CHARGE.getCode())){
|
userAssets.setHandlingCharge(userAssets.getHandlingCharge().add(amount.abs()));
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount.negate()));
|
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);
|
}
|
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);
|
}
|
}
|