src/main/java/com/nq/service/IUserAssetsServices.java
@@ -48,4 +48,15 @@ Boolean availablebalanceChange(String accetType, Integer userId, EUserAssets eUserAssets, BigDecimal amount, String desc, String descType); /** * 平仓返回保证金 * @param accetType * @param userId * @param eUserAssets * @param amount * @param fzAmount 解冻资金 * @return */ Boolean availablebalanceSell(String accetType, Integer userId, EUserAssets eUserAssets, BigDecimal amount, BigDecimal fzAmount); } src/main/java/com/nq/service/impl/UserAssetsServices.java
@@ -184,10 +184,15 @@ BigDecimal availableBalance = amount.subtract(userAssets.getAmountToBeCovered()); availableBalance = availableBalance.subtract(userAssets.getHandlingChargeWritten()); if(availableBalance.compareTo(BigDecimal.ZERO) >= 0){ //冻结 扣除的已补金额 userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(userAssets.getAmountToBeCovered())); userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(availableBalance)); userAssets.setAmountToBeCovered(BigDecimal.ZERO); userAssets.setHandlingChargeWritten(BigDecimal.ZERO); }else{ userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(amount)); BigDecimal amountToBeCovered = userAssets.getAmountToBeCovered().subtract(amount); userAssets.setAmountToBeCovered(amountToBeCovered); } @@ -265,6 +270,56 @@ return userAssetsMapper.updateById(userAssets)>1; } //平仓返回保证金 @Override public Boolean availablebalanceSell(String accetType, Integer userId, EUserAssets eUserAssets, BigDecimal amount, BigDecimal fzAmount) { UserAssets userAssets = assetsByTypeAndUserId(accetType,userId); UserPosition userPosition = userPositionMapper.selectOne(new LambdaQueryWrapper<UserPosition>().gt(UserPosition::getAmountToBeCovered, BigDecimal.ZERO).eq(UserPosition::getUserId,userAssets.getUserId())); String before = userAssets.getAvailableBalance().toString(); String accectType = userAssets.getAccectType(); if(Objects.equals(eUserAssets.getCode(), EUserAssets.CLOSE_POSITION_RETURN_SECURITY_DEPOSIT.getCode())){ userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(fzAmount)); 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.setFreezeMoney(userAssets.getFreezeMoney().add(userAssets.getAmountToBeCovered())); userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(availableBalance)); userAssets.setAmountToBeCovered(BigDecimal.ZERO); userAssets.setHandlingChargeWritten(BigDecimal.ZERO); }else{ userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(amount)); BigDecimal amountToBeCovered = userAssets.getAmountToBeCovered().subtract(amount); userAssets.setAmountToBeCovered(amountToBeCovered); } }else{ userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount)); } } 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(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){ src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
@@ -306,9 +306,9 @@ .eq(UserAssets::getUserId, userPosition.getUserId()) .eq(UserAssets::getAccectType, "JP") ); if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ /*if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ return ServerResponse.createByErrorMsg("用户待补资金未补齐,禁止平仓"); } }*/ if (userPosition.getSellOrderId() != null) { return ServerResponse.createByErrorMsg("平仓失败, 订单已平仓"); } @@ -327,16 +327,21 @@ BigDecimal sellOrderTotel = nowPrice.multiply(new BigDecimal(userPosition.getOrderNum())); BigDecimal xsPrice = sellOrderTotel.multiply(siitteBuyFee); userPositionMapper.updateById(userPosition); userAssetsServices.availablebalanceChange(stock.getStockType(), PositionProfitVO profitVO = UserPointUtil.getPositionProfitVO(userPosition, priceServices.getNowPrice(userPosition.getStockCode())); /*userAssetsServices.availablebalanceChange(stock.getStockType(), userPosition.getUserId(), EUserAssets.CLOSE_POSITION, profitVO.getAllProfitAndLose(), "", "");*/ //从保证金里计算盈亏 BigDecimal returnAmt = userPosition.getOrderTotalPrice().add(profitVO.getAllProfitAndLose()); userAssetsServices.availablebalanceSell(stock.getStockType(), userPosition.getUserId(), EUserAssets.CLOSE_POSITION_RETURN_SECURITY_DEPOSIT, userPosition.getOrderTotalPrice(), "", ""); returnAmt, userPosition.getOrderTotalPrice()); userAssetsServices.availablebalanceChange(stock.getStockType(), userPosition.getUserId(), EUserAssets.HANDLING_CHARGE, xsPrice, "", ""); PositionProfitVO profitVO = UserPointUtil.getPositionProfitVO(userPosition, priceServices.getNowPrice(userPosition.getStockCode())); userAssetsServices.availablebalanceChange(stock.getStockType(), userPosition.getUserId(), EUserAssets.CLOSE_POSITION, profitVO.getAllProfitAndLose(), "", ""); return ServerResponse.createBySuccessMsg("平仓成功!"); } @@ -360,9 +365,9 @@ .eq(UserAssets::getUserId, userPosition.getUserId()) .eq(UserAssets::getAccectType, "JP") ); if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ /*if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ return ServerResponse.createByErrorMsg("请先缴清待补资金", request); } }*/ StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new LambdaQueryWrapper<StockSubscribe>() .eq(StockSubscribe::getCode, userPosition.getStockCode())); if (null != stockSubscribe && DateUtil.date().before(stockSubscribe.getListDate())) { @@ -444,20 +449,20 @@ BigDecimal xsPrice = sellOrderTotel.multiply(siitteBuyFee); userPosition.setOrderFee(userPosition.getOrderFee().add(xsPrice)); userPositionMapper.updateById(userPosition); userAssetsServices.availablebalanceChange(stock.getStockType(), PositionProfitVO profitVO = UserPointUtil.getPositionProfitVO(userPosition, priceServices.getNowPrice(userPosition.getStockCode())); /*userAssetsServices.availablebalanceChange(stock.getStockType(), userPosition.getUserId(), EUserAssets.CLOSE_POSITION, profitVO.getAllProfitAndLose(), "", "");*/ //从保证金里计算盈亏 BigDecimal returnAmt = userPosition.getOrderTotalPrice().add(profitVO.getAllProfitAndLose()); userAssetsServices.availablebalanceSell(stock.getStockType(), userPosition.getUserId(), EUserAssets.CLOSE_POSITION_RETURN_SECURITY_DEPOSIT, userPosition.getOrderTotalPrice(), "", ""); returnAmt, userPosition.getOrderTotalPrice()); userAssetsServices.availablebalanceChange(stock.getStockType(), userPosition.getUserId(), EUserAssets.HANDLING_CHARGE, xsPrice, "", ""); PositionProfitVO profitVO = UserPointUtil.getPositionProfitVO(userPosition, priceServices.getNowPrice(userPosition.getStockCode())); userAssetsServices.availablebalanceChange(stock.getStockType(), userPosition.getUserId(), EUserAssets.CLOSE_POSITION, profitVO.getAllProfitAndLose(), "", ""); return ServerResponse.createBySuccessMsg("平仓成功!", request); }