From 30e592bd0975b41e0b4b4140c4b794c2e1e121de Mon Sep 17 00:00:00 2001
From: zyy <zyy@email.com>
Date: Mon, 09 Feb 2026 15:21:44 +0800
Subject: [PATCH] 平仓

---
 src/main/java/com/nq/service/impl/UserAssetsServices.java      |   55 +++++++++++++++++++++++++++
 src/main/java/com/nq/service/IUserAssetsServices.java          |   11 +++++
 src/main/java/com/nq/service/impl/UserPositionServiceImpl.java |   41 +++++++++++---------
 3 files changed, 89 insertions(+), 18 deletions(-)

diff --git a/src/main/java/com/nq/service/IUserAssetsServices.java b/src/main/java/com/nq/service/IUserAssetsServices.java
index ae7475a..29278bc 100644
--- a/src/main/java/com/nq/service/IUserAssetsServices.java
+++ b/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);
+
 }
diff --git a/src/main/java/com/nq/service/impl/UserAssetsServices.java b/src/main/java/com/nq/service/impl/UserAssetsServices.java
index 49ad7ca..254029f 100644
--- a/src/main/java/com/nq/service/impl/UserAssetsServices.java
+++ b/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){
diff --git a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java b/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
index 5c9e9d9..1f635c4 100644
--- a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
+++ b/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);
     }
 

--
Gitblit v1.9.3