zyy
2026-02-09 30e592bd0975b41e0b4b4140c4b794c2e1e121de
平仓
3 files modified
107 ■■■■ changed files
src/main/java/com/nq/service/IUserAssetsServices.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/UserAssetsServices.java 55 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/UserPositionServiceImpl.java 41 ●●●●● patch | view | raw | blame | history
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);
    }