From a66b2a41f265cc9526781e39c1d6c6d5f5d7c013 Mon Sep 17 00:00:00 2001
From: peter <14100000001@qq.com>
Date: Thu, 01 Jan 2026 02:29:08 +0800
Subject: [PATCH] 新增港股

---
 src/main/java/com/nq/service/impl/UserPositionServiceImpl.java |  242 ++++++++++++++++++++++--------------------------
 1 files changed, 112 insertions(+), 130 deletions(-)

diff --git a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java b/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
index 61f7920..901e9ea 100644
--- a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.google.gson.Gson;
+import com.nq.config.StockType;
 import com.nq.dao.*;
 import com.nq.pojo.*;
 import com.nq.service.*;
@@ -128,6 +129,7 @@
             return ServerResponse.createByErrorMsg("下单失败,请先实名认证");
         }
         BigDecimal user_enable_amt = user.getEnableAmt();
+
         BigDecimal user_enable_withdraw_amt = user.getEnaleWithdrawAmt();
         log.info("用户 {} 下单,股票id = {} ,数量 = {} , 方向 = {} , 杠杆 = {}", new Object[]{user
                 .getId(), stockId, buyNum, buyType, lever});
@@ -169,7 +171,7 @@
             boolean am_flag = BuyAndSellUtils.isTransTime(am_begin, am_end);
             boolean pm_flag = BuyAndSellUtils.isTransTime(pm_begin, pm_end);
             log.info("是否在上午交易时间 = {} 是否在下午交易时间 = {}", Boolean.valueOf(am_flag), Boolean.valueOf(pm_flag));
-
+            //TODO
             if (!am_flag && !pm_flag) {
                 return ServerResponse.createByErrorMsg("下单失败,不在港股股交易时段内");
             }
@@ -184,7 +186,7 @@
             boolean am_flag = BuyAndSellUtils.isTransTime(am_begin, am_end);
             boolean pm_flag = BuyAndSellUtils.isTransTime(pm_begin, pm_end);
             log.info("是否在上午交易时间 = {} 是否在下午交易时间 = {}", Boolean.valueOf(am_flag), Boolean.valueOf(pm_flag));
-
+            //TODO
             if (!am_flag && !pm_flag) {
                 return ServerResponse.createByErrorMsg("下单失败,不在交易时段内");
             }
@@ -221,44 +223,17 @@
         }
         BigDecimal now_price;
         StockListVO stockListVO = new StockListVO();
-        StockCoin stockCoin = new StockCoin();
         //股票类型 现价 数据源的处理
         stockListVO = SinaStockApi.assembleLideStockListVO(LiDeDataUtils.getStock(stock.getStockCode()));
         if (ObjectUtils.isEmpty(stockListVO)) {
-            stockListVO = SinaStockApi.assembleStockListVO(SinaStockApi.getSinaStock(stock.getStockGid()));
+            if(StockType.HK.getCode().equals(stock.getStockType())){
+                stockListVO = SinaStockApi.assembleStockListVOHk(SinaStockApi.getSinaStock(StockType.HK.getCode()+stock.getStockGid()));
+            }else {
+                stockListVO = SinaStockApi.assembleStockListVO(SinaStockApi.getSinaStock(stock.getStockGid()));
+            }
         }
-        now_price = new BigDecimal(stockListVO.getNowPrice());
-//        if (stock.getDataBase()!=0){
-//             String date = getCurrentTimeMiaoZero();
-//            String result = HttpClientRequest.doGet(PropertiesUtil.getProperty("changePrice.url")+"?cat_time="+date+"&stock_gid="+stock.getStockGid()+"&price="+stockListVO.getNowPrice());
-//            JSONObject jsonObject = JSONObject.fromObject(result);
-//            String nowPrice = jsonObject.getJSONObject("data").getString("new_price");
-//            if (nowPrice!=null){
-//                if ("us".equals(stock.getStockType())){
-//                    ExchangeVO exchangeVO = this.iStockFuturesService.queryExchangeVO("USD").getData();
-//                    now_price =new BigDecimal(nowPrice).multiply(new BigDecimal(exchangeVO.getNowPrice()));
-//                } else if ("hk".equals(stock.getStockType())){
-//                    ExchangeVO exchangeVO = this.iStockFuturesService.queryExchangeVO("HKD").getData();
-//                    now_price =new BigDecimal(nowPrice).multiply(new BigDecimal(exchangeVO.getNowPrice()));
-//                } else {
-//                    now_price = new BigDecimal(nowPrice);
-//                }
-//
-//            }else {
-//                stockListVO.setNowPrice(stockListVO.getNowPrice());
-//                if ("us".equals(stock.getStockType())){
-//                    ExchangeVO exchangeVO = this.iStockFuturesService.queryExchangeVO("USD").getData();
-//                    now_price =new BigDecimal(nowPrice).multiply(new BigDecimal(exchangeVO.getNowPrice()));
-//                } else if ("hk".equals(stock.getStockType())){
-//                    ExchangeVO exchangeVO = this.iStockFuturesService.queryExchangeVO("HKD").getData();
-//                    now_price =new BigDecimal(nowPrice).multiply(new BigDecimal(exchangeVO.getNowPrice()));
-//                } else {
-//                    now_price = new BigDecimal(nowPrice);
-//                }
-//            }
-//        }
-//            String stockOther = RedisShardedPoolUtils.get(stock.getStockName(), 8);
 
+        now_price = new BigDecimal(stockListVO.getNowPrice());
 
         if (now_price.compareTo(new BigDecimal("0")) == 0) {
             return ServerResponse.createByErrorMsg("报价0,请稍后再试");
@@ -341,8 +316,14 @@
         }
 
 
-        ServerResponse serverResponse = this.iStockService.selectRateByDaysAndStockCode(stock
-                .getStockCode(), siteSetting.getStockDays().intValue());
+        ServerResponse serverResponse = null;
+        if(StockType.HK.getCode().equals(stock.getStockType())){
+            serverResponse = this.iStockService.selectRateByDaysAndStockCode(stock
+                    .getStockGid(), siteSetting.getStockDays().intValue());
+        }else {
+            serverResponse = this.iStockService.selectRateByDaysAndStockCode(stock
+                    .getStockCode(), siteSetting.getStockDays().intValue());
+        }
         if (!serverResponse.isSuccess()) {
             return serverResponse;
         }
@@ -371,7 +352,9 @@
                     .getBuyMinAmt() + "元");
         }
 
-
+        if(StockType.HK.getCode().equals(stock.getStockType())){
+            user_enable_amt = user.getHkAmt();
+        }
         BigDecimal max_buy_amt = user_enable_amt.multiply(siteSetting.getBuyMaxAmtPercent());
         int compareCwInt = buy_amt_autual.compareTo(max_buy_amt);
         if (compareCwInt == 1) {
@@ -416,7 +399,7 @@
         userPosition.setBuyOrderTime(new Date());
         userPosition.setBuyOrderPrice(now_price);
         userPosition.setOrderDirection((buyType.intValue() == 0) ? "买涨" : "买跌");
-
+        userPosition.setStockType(stock.getStockType());
         userPosition.setOrderNum(buyNum);
 
 
@@ -479,7 +462,7 @@
             //修改用户可用余额= 当前余额-下单金额-买入手续费-印花税-点差费
             //BigDecimal reckon_enable = user_enable_amt.subtract(buy_amt_autual).subtract(buy_fee_amt).subtract(buy_yhs_amt).subtract(spread_rate_amt);
             //修改用户可用余额= 当前余额-下单总金额
-            BigDecimal reckon_enable = user_enable_amt.subtract(buy_amt_autual);
+            BigDecimal reckon_enable = user_enable_amt.subtract(buy_amt_autual);;
             //修改用户可取余额=当前可取余额-下单总金额
             int compareUserWithdrawAmtInt = user_enable_withdraw_amt.compareTo(buy_amt_autual);
             if (compareUserWithdrawAmtInt == -1) {
@@ -489,7 +472,12 @@
                 user_enable_withdraw_amt = user_enable_withdraw_amt.subtract(buy_amt_autual);
                 user.setEnaleWithdrawAmt(user_enable_withdraw_amt);
             }
-            user.setEnableAmt(reckon_enable);
+            if(StockType.HK.getCode().equals(stock.getStockType())){
+                user.setHkAmt(reckon_enable);
+            }else {
+                user.setEnableAmt(reckon_enable);
+            }
+
             int updateUserCount = this.userMapper.updateByPrimaryKeySelective(user);
             if (updateUserCount > 0) {
                 log.info("【用户交易下单】修改用户金额成功");
@@ -595,6 +583,7 @@
                 boolean am_flag = BuyAndSellUtils.isTransTime(am_begin, am_end);
                 boolean pm_flag = BuyAndSellUtils.isTransTime(pm_begin, pm_end);
                 log.info("是否在上午交易時間 = {} 是否在下午交易時間 = {}", Boolean.valueOf(am_flag), Boolean.valueOf(pm_flag));
+                //TODO
                 if (!am_flag && !pm_flag) {
                     return ServerResponse.createByErrorMsg("平仓失败,不在交易时段内");
                 }
@@ -646,39 +635,13 @@
         //股票賣出的 價格 數據源
         stockListVO = SinaStockApi.assembleLideStockListVO(LiDeDataUtils.getStock(userPosition.getStockCode()));
         if (ObjectUtils.isEmpty(stockListVO)) {
-            stockListVO = SinaStockApi.assembleStockListVO(SinaStockApi.getSinaStock(userPosition.getStockGid()));
+            if(StockType.HK.getCode().equals(userPosition.getStockType())){
+                stockListVO = SinaStockApi.assembleStockListVOHk(SinaStockApi.getSinaStock(StockType.HK.getCode()+userPosition.getStockGid()));
+            }else {
+                stockListVO = SinaStockApi.assembleStockListVO(SinaStockApi.getSinaStock(userPosition.getStockGid()));
+            }
+//            stockListVO = SinaStockApi.assembleStockListVO(SinaStockApi.getSinaStock(userPosition.getStockGid()));
         }
-        //stockListVO = SinaStockApi.assembleStockListVO(SinaStockApi.getSinaStock(userPosition.getStockGid()));
-//            if (stock.getDataBase() != 0) {
-//                  String date = getCurrentTimeMiaoZero();
-//                String result = HttpClientRequest.doGet(PropertiesUtil.getProperty("changePrice.url")+"?cat_time="+date+"&stock_gid="+stock.getStockGid()+"&price="+stockListVO.getNowPrice());
-//                JSONObject jsonObject = JSONObject.fromObject(result);
-//                String nowPrice1 = jsonObject.getJSONObject("data").getString("new_price");
-//                if (nowPrice1!=null){
-//                    if ("us".equals(stock.getStockType())){
-//                        ExchangeVO exchangeVO = this.iStockFuturesService.queryExchangeVO("USD").getData();
-//                        now_price = new BigDecimal(nowPrice1).multiply(new BigDecimal(exchangeVO.getNowPrice()));
-//                    } else if ("hk".equals(stock.getStockType())){
-//                        ExchangeVO exchangeVO = this.iStockFuturesService.queryExchangeVO("HKD").getData();
-//                        now_price = new BigDecimal(nowPrice1).multiply(new BigDecimal(exchangeVO.getNowPrice()));
-//                    } else {
-//                        now_price = new BigDecimal(nowPrice1);
-//                    }
-//
-//                }else {
-//                    stockListVO.setNowPrice(stockListVO.getNowPrice());
-//                    if ("us".equals(stock.getStockType())){
-//                        ExchangeVO exchangeVO = this.iStockFuturesService.queryExchangeVO("USD").getData();
-//                        now_price = new BigDecimal(stockListVO.getNowPrice()).multiply(new BigDecimal(exchangeVO.getNowPrice()));
-//                    } else if ("hk".equals(stock.getStockType())){
-//                        ExchangeVO exchangeVO = this.iStockFuturesService.queryExchangeVO("HKD").getData();
-//                        now_price = new BigDecimal(stockListVO.getNowPrice()).multiply(new BigDecimal(exchangeVO.getNowPrice()));
-//                    } else {
-//                        now_price = new BigDecimal(stockListVO.getNowPrice());
-//                    }
-//                }
-//
-//        }
 
         if (stockListVO.getNowPrice() == null) {
             return ServerResponse.createByErrorMsg("平仓失败,获取股票信息失败");
@@ -728,7 +691,12 @@
         }
         log.info("買入總金額 = {} , 賣出總金額 = {} , 盈虧 = {}", new Object[]{all_buy_amt, all_sell_amt, profitLoss});
 
-        BigDecimal user_all_amt = user.getUserAmt();
+        BigDecimal user_all_amt = BigDecimal.ZERO;
+        if(StockType.HK.getCode().equals(userPosition.getStockType())){
+            user_all_amt = user.getHkAmt();
+        }else {
+            user_all_amt = user.getUserAmt();
+        }
         BigDecimal user_enable_amt = user.getEnableAmt();
         log.info("用戶原本總資金 = {} , 可用 = {}", user_all_amt, user_enable_amt);
 
@@ -773,14 +741,17 @@
 
         BigDecimal freez_amt = all_buy_amt.divide(new BigDecimal(userPosition.getOrderLever().intValue()), 2, 4);
         //BigDecimal freez_amt = all_buy_amt;
-
         BigDecimal reckon_all = user_all_amt.add(all_profit);
         //修改用戶可用余額=當前可用余額+總盈虧+買入總金額+追加保證金
         BigDecimal reckon_enable = user_enable_amt.add(all_profit).add(freez_amt).add(userPosition.getMarginAdd());
-
         log.info("用戶平倉後的總資金  = {} , 可用資金 = {}", reckon_all, reckon_enable);
-        user.setUserAmt(reckon_all);
-        user.setEnableAmt(reckon_enable);
+
+        if(StockType.HK.getCode().equals(userPosition.getStockType())){
+            user.setHkAmt(reckon_enable);
+        }else {
+            user.setUserAmt(reckon_all);
+            user.setEnableAmt(reckon_enable);
+        }
         int updateUserCount = this.userMapper.updateByPrimaryKeySelective(user);
         if (updateUserCount > 0) {
             log.info("【用戶平倉】修改用戶金額成功");
@@ -1217,61 +1188,67 @@
 
         BigDecimal allProfitAndLose = new BigDecimal("0");
         BigDecimal allFreezAmt = new BigDecimal("0");
+        BigDecimal allProfitAndLoseHk = new BigDecimal("0");
+        BigDecimal allFreezAmtHk = new BigDecimal("0");
         for (UserPosition position : userPositions) {
-
             StockListVO stockListVO = SinaStockApi.assembleLideStockListVO(LiDeDataUtils.getStock(position.getStockCode()));
             if (ObjectUtils.isEmpty(stockListVO)) {
-                stockListVO = SinaStockApi.assembleStockListVO(SinaStockApi.getSinaStock(position.getStockGid()));
-            }
-
-            if (stockListVO.getNowPrice() == null || new BigDecimal(stockListVO.getNowPrice()).compareTo(BigDecimal.ZERO) <= 0) {
-//                stockListVO.setNowPrice("0");
-                stockListVO.setNowPrice(String.valueOf(position.getBuyOrderIdIndex()));
-            }
-
-
-            BigDecimal nowPrice = new BigDecimal(stockListVO.getNowPrice());
-
-
-            if (nowPrice.compareTo(new BigDecimal("0")) != 0) {
-
-                BigDecimal buyPrice = position.getBuyOrderPrice();
-                BigDecimal subPrice = nowPrice.subtract(buyPrice);
-
-                BigDecimal profit_and_lose = subPrice.multiply(new BigDecimal(position.getOrderNum().intValue()));
-                //BigDecimal profit_and_lose = subPrice.multiply(new BigDecimal(position.getOrderNum().intValue())).divide(new BigDecimal(position.getOrderLever())).setScale(2,4);
-                if ("买跌".equals(position.getOrderDirection())) {
-                    profit_and_lose = profit_and_lose.negate();
+                if(StockType.HK.getCode().equals(position.getStockType())){
+                    stockListVO = SinaStockApi.assembleStockListVOHk(SinaStockApi.getSinaStock(position.getStockType()+position.getStockGid()));
+                    if (stockListVO.getNowPrice() == null || new BigDecimal(stockListVO.getNowPrice()).compareTo(BigDecimal.ZERO) <= 0) {
+                        stockListVO.setNowPrice(String.valueOf(position.getBuyOrderIdIndex()));
+                    }
+                    BigDecimal nowPrice = new BigDecimal(stockListVO.getNowPrice());
+                    if (nowPrice.compareTo(new BigDecimal("0")) != 0) {
+                        BigDecimal buyPrice = position.getBuyOrderPrice();
+                        BigDecimal subPrice = nowPrice.subtract(buyPrice);
+                        BigDecimal profit_and_lose = subPrice.multiply(new BigDecimal(position.getOrderNum().intValue()));
+                        if ("买跌".equals(position.getOrderDirection())) {
+                            profit_and_lose = profit_and_lose.negate();
+                        }
+                        BigDecimal total_fee = position.getOrderFee().add(position.getOrderSpread()).add(position.getOrderStayFee());
+                        BigDecimal position_profit = profit_and_lose.subtract(total_fee);
+                        allProfitAndLoseHk = allProfitAndLoseHk.add(position_profit);
+                        BigDecimal position_freez = position.getOrderTotalPrice().divide(new BigDecimal(position.getOrderLever().intValue()), 2, 4);
+                        allFreezAmtHk = allFreezAmtHk.add(position_freez).add(position.getMarginAdd());
+                        continue;
+                    }
+                    log.info("查询所有持仓单的总盈亏,现价返回0,当前为集合竞价");
+                }else {
+                    stockListVO = SinaStockApi.assembleStockListVO(SinaStockApi.getSinaStock(position.getStockGid()));
+                    if (stockListVO.getNowPrice() == null || new BigDecimal(stockListVO.getNowPrice()).compareTo(BigDecimal.ZERO) <= 0) {
+                        stockListVO.setNowPrice(String.valueOf(position.getBuyOrderIdIndex()));
+                    }
+                    BigDecimal nowPrice = new BigDecimal(stockListVO.getNowPrice());
+                    if (nowPrice.compareTo(new BigDecimal("0")) != 0) {
+                        BigDecimal buyPrice = position.getBuyOrderPrice();
+                        BigDecimal subPrice = nowPrice.subtract(buyPrice);
+                        BigDecimal profit_and_lose = subPrice.multiply(new BigDecimal(position.getOrderNum().intValue()));
+                        if ("买跌".equals(position.getOrderDirection())) {
+                            profit_and_lose = profit_and_lose.negate();
+                        }
+                        BigDecimal total_fee = position.getOrderFee().add(position.getOrderSpread()).add(position.getOrderStayFee());
+                        BigDecimal position_profit = profit_and_lose.subtract(total_fee);
+                        allProfitAndLose = allProfitAndLose.add(position_profit);
+                        BigDecimal position_freez = position.getOrderTotalPrice().divide(new BigDecimal(position.getOrderLever().intValue()), 2, 4);
+                        allFreezAmt = allFreezAmt.add(position_freez).add(position.getMarginAdd());
+                        continue;
+                    }
+                    log.info("查询所有持仓单的总盈亏,现价返回0,当前为集合竞价");
                 }
-
-
-                BigDecimal total_fee = position.getOrderFee().add(position.getOrderSpread()).add(position.getOrderStayFee());
-
-
-                BigDecimal position_profit = profit_and_lose.subtract(total_fee);
-
-
-                allProfitAndLose = allProfitAndLose.add(position_profit);
-
-
-                BigDecimal position_freez = position.getOrderTotalPrice().divide(new BigDecimal(position.getOrderLever().intValue()), 2, 4);
-                //BigDecimal position_freez = position.getOrderTotalPrice();
-                allFreezAmt = allFreezAmt.add(position_freez).add(position.getMarginAdd());
-                continue;
             }
-            log.info("查询所有持仓单的总盈亏,现价返回0,当前为集合竞价");
         }
 
         //加上分仓交易保证金
-        List<FundsApply> fundsApplyList = fundsApplyMapper.getUserMarginList(userId);
-        for (FundsApply fundsApply : fundsApplyList) {
-            allFreezAmt = allFreezAmt.add(fundsApply.getMargin());
-        }
-
-
+//                    List<FundsApply> fundsApplyList = fundsApplyMapper.getUserMarginList(userId);
+//                    for (FundsApply fundsApply : fundsApplyList) {
+//                        allFreezAmt = allFreezAmt.add(fundsApply.getMargin());
+//                    }
         PositionVO positionVO = new PositionVO();
         positionVO.setAllProfitAndLose(allProfitAndLose);
         positionVO.setAllFreezAmt(allFreezAmt);
+        positionVO.setAllProfitAndLoseHk(allProfitAndLoseHk);
+        positionVO.setAllFreezAmtHk(allFreezAmtHk);
         return positionVO;
     }
 
@@ -1873,12 +1850,14 @@
             allProfitAndLose = profitAndLose.subtract(position.getOrderFee()).subtract(position.getOrderSpread()).subtract(position.getOrderStayFee()).subtract(position.getSpreadRatePrice());
         } else {
             StockListVO stockListVO = new StockListVO();
-            StockCoin stockCoin = new StockCoin();
             stockListVO = SinaStockApi.assembleLideStockListVO(LiDeDataUtils.getStock(position.getStockCode()));
             if (ObjectUtils.isEmpty(stockListVO)) {
-                stockListVO = SinaStockApi.assembleStockListVO(SinaStockApi.getSinaStock(position.getStockGid()));
+                if(StockType.HK.getCode().equals(position.getStockType())){
+                    stockListVO = SinaStockApi.assembleStockListVOHk(SinaStockApi.getSinaStock(StockType.HK.getCode()+position.getStockGid()));
+                }else {
+                    stockListVO = SinaStockApi.assembleStockListVO(SinaStockApi.getSinaStock(position.getStockGid()));
+                }
             }
-            //    stockListVO = SinaStockApi.assembleStockListVO(SinaStockApi.getSinaStock(position.getStockGid()));
             nowPrice = stockListVO.getNowPrice();
             if (nowPrice == null || new BigDecimal(stockListVO.getNowPrice()).compareTo(BigDecimal.ZERO) <= 0) {
                 if(null != position.getBuyOrderIdIndex() && position.getBuyOrderIdIndex().compareTo(BigDecimal.ZERO) > 0){
@@ -1893,14 +1872,17 @@
             BigDecimal subPrice = (new BigDecimal(nowPrice)).subtract(position.getBuyOrderPrice());
 //            profitAndLose = subPrice.multiply(new BigDecimal(position.getOrderNum().intValue())).multiply(new BigDecimal(position.getOrderLever())).setScale(2,4);
             profitAndLose = subPrice.multiply(new BigDecimal(position.getOrderNum().intValue())).setScale(2,4);
-            if ("买跌".equals(position.getOrderDirection())) {
-                profitAndLose = profitAndLose.negate();
-            }
-            //总盈亏= 浮动盈亏 – 手续费 – 印花税 – 留仓费 – 点差费
-            allProfitAndLose = profitAndLose.subtract(position.getOrderFee()).subtract(position.getOrderSpread()).subtract(position.getOrderStayFee()).subtract(position.getSpreadRatePrice());
             //改成盈亏百分比
             BigDecimal allProfitAndLoseStrTemp = new BigDecimal(nowPrice).subtract(position.getBuyOrderPrice()).divide(position.getBuyOrderPrice(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).setScale(2,4);
             allProfitAndLoseStr = allProfitAndLoseStrTemp.toString() + "%";
+            if ("买跌".equals(position.getOrderDirection())) {
+                profitAndLose = profitAndLose.negate();
+                allProfitAndLoseStr = allProfitAndLoseStrTemp.negate() + "%";
+            }
+            //总盈亏= 浮动盈亏 – 手续费 – 印花税 – 留仓费 – 点差费
+            allProfitAndLose = profitAndLose.subtract(position.getOrderFee()).subtract(position.getOrderSpread()).subtract(position.getOrderStayFee()).subtract(position.getSpreadRatePrice());
+
+
         }
         PositionProfitVO positionProfitVO = new PositionProfitVO();
         positionProfitVO.setProfitAndLose(profitAndLose);

--
Gitblit v1.9.3