From 05c70aec6fb13c9df2c90f84d9411cafe63570a8 Mon Sep 17 00:00:00 2001
From: zyy <zyy@email.com>
Date: Thu, 07 Aug 2025 10:53:50 +0800
Subject: [PATCH] 8.6修改

---
 src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java     |   20 +-
 src/main/java/com/nq/ws/WebsocketRunClient.java                          |   14 
 src/main/java/com/nq/controller/backend/AdminExchangeRateController.java |   10 
 src/main/java/com/nq/service/impl/DkServices.java                        |    8 
 src/main/java/com/nq/controller/echo/EChoController.java                 |    8 
 src/main/java/com/nq/utils/task/stock/StockTask.java                     |   98 ++++-----
 src/main/java/com/nq/service/impl/EchoServices.java                      |    3 
 src/main/java/com/nq/service/impl/UserPositionServiceImpl.java           |   64 ++++-
 src/main/java/com/nq/service/impl/UserServiceImpl.java                   |   12 
 src/main/java/com/nq/ws/TWWebsocketRunClient.java                        |   20 +-
 src/main/resources/application.properties                                |   22 +-
 src/main/java/com/nq/service/impl/UserRechargeServiceImpl.java           |    6 
 src/main/java/com/nq/service/IUserAssetsServices.java                    |    1 
 src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java           |    6 
 src/main/java/com/nq/service/impl/StockAiServiceImpl.java                |   14 
 src/main/java/com/nq/StockApplication.java                               |    4 
 src/main/java/com/nq/service/impl/PayServiceImpl.java                    |    4 
 src/main/java/com/nq/utils/task/stock/CarryPositionTask.java             |    2 
 src/main/java/com/nq/enums/EStockType.java                               |   51 +++-
 src/main/java/com/nq/service/impl/UserAssetsServices.java                |   31 +-
 src/main/java/com/nq/service/impl/StockServiceImpl.java                  |  104 ++++++----
 src/main/java/com/nq/utils/redis/RedisKeyUtil.java                       |    4 
 src/main/java/com/nq/utils/StringUtils.java                              |    6 
 src/main/java/com/nq/ws/WebSocketClientBeanConfig.java                   |   26 +-
 src/main/java/com/nq/service/impl/SiteNewsServiceImpl.java               |   11 
 25 files changed, 309 insertions(+), 240 deletions(-)

diff --git a/src/main/java/com/nq/StockApplication.java b/src/main/java/com/nq/StockApplication.java
index af81232..1ae826f 100644
--- a/src/main/java/com/nq/StockApplication.java
+++ b/src/main/java/com/nq/StockApplication.java
@@ -22,9 +22,9 @@
 
 
     public static void main(String[] args) throws UnknownHostException, SocketException {
-        ipUtil iputil = new ipUtil();
+        /*ipUtil iputil = new ipUtil();
         InetAddress inetAddress = InetAddress.getLocalHost();
-        String localMacAddress2 = NetUtil.getMacAddress(inetAddress);
+        String localMacAddress2 = NetUtil.getMacAddress(inetAddress);*/
         SpringApplication.run(StockApplication.class, args);
 ////        if ("38.55.201.101".equals(iputil.getPublicIP()) && "66-45-97-00-00-37".equals(localMacAddress2)) {
 //            SpringApplication.run(StockApplication.class, args);
diff --git a/src/main/java/com/nq/controller/backend/AdminExchangeRateController.java b/src/main/java/com/nq/controller/backend/AdminExchangeRateController.java
index d7b815a..64d0ea0 100644
--- a/src/main/java/com/nq/controller/backend/AdminExchangeRateController.java
+++ b/src/main/java/com/nq/controller/backend/AdminExchangeRateController.java
@@ -45,12 +45,12 @@
         if (model.getCurrency().equals(model.getConversionCurrency())) {
             return ServerResponse.createByErrorMsg("原始货币和转换货币不能相同");
         }
-        //货币只能为US或MX
-        if (!model.getCurrency().equals(EStockType.US.getSymbol()) && !model.getCurrency().equals(EStockType.MX.getSymbol())) {
-            return ServerResponse.createByErrorMsg("货币只能为:" + EStockType.US.getSymbol() + " 或 " +  EStockType.MX.getSymbol());
+
+        if (EStockType.getEStockTypeBySymbol(model.getCurrency()) == null) {
+            return ServerResponse.createByErrorMsg("货币不能为:" + model.getCurrency());
         }
-        if (!model.getConversionCurrency().equals(EStockType.US.getSymbol()) && !model.getConversionCurrency().equals(EStockType.MX.getSymbol())) {
-            return ServerResponse.createByErrorMsg("转换货币只能为:" + EStockType.US.getSymbol() + " 或 " +  EStockType.MX.getSymbol());
+        if (EStockType.getEStockTypeBySymbol(model.getConversionCurrency()) == null) {
+            return ServerResponse.createByErrorMsg("转换货币不能为:" + model.getConversionCurrency());
         }
         return exchangeRateService.updateRate(model, request);
     }
diff --git a/src/main/java/com/nq/controller/echo/EChoController.java b/src/main/java/com/nq/controller/echo/EChoController.java
index ba58565..17dbdc7 100644
--- a/src/main/java/com/nq/controller/echo/EChoController.java
+++ b/src/main/java/com/nq/controller/echo/EChoController.java
@@ -68,17 +68,17 @@
             }
         }
         User user = this.iUserService.getCurrentRefreshUser(request);
-        UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId(EStockType.MX.getCode(), user.getId());
+        UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId(EStockType.getDefault().getCode(), user.getId());
         if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
             return ServerResponse.createByErrorMsg("请先缴清待补资金", request);
         }
         if(userAssets.getAvailableBalance().compareTo(money) < 0){
-            return ServerResponse.createByErrorMsg("配资不足",request);
+            return ServerResponse.createByErrorMsg("配资不足", request);
         }
         if (iEchoServices.buyECho(eid, money, userAssets.getAccectType(), request)) {
-            return ServerResponse.createBySuccess("购买成功",request);
+            return ServerResponse.createBySuccess("购买成功", request);
         } else {
-            return ServerResponse.createByErrorMsg("购买失败",request);
+            return ServerResponse.createByErrorMsg("购买失败", request);
         }
     }
 
diff --git a/src/main/java/com/nq/enums/EStockType.java b/src/main/java/com/nq/enums/EStockType.java
index 75e9620..ff06d8c 100644
--- a/src/main/java/com/nq/enums/EStockType.java
+++ b/src/main/java/com/nq/enums/EStockType.java
@@ -14,14 +14,14 @@
     US("US","美国股票","5",PropertiesUtil.getProperty("US_HTTP_API"),PropertiesUtil.getProperty("US_KEY"),"USD","$"),
 
     HK("HK","香港股票","39",PropertiesUtil.getProperty("HK_HTTP_API"),PropertiesUtil.getProperty("HK_KEY"),"HKD","HK$"),
-//    MAS("MAS","马来西亚股票","42",PropertiesUtil.getProperty("MAS_HTTP_API"),PropertiesUtil.getProperty("MAS_KEY"),"MYR","RM"),
-//
-    IN("IN","印度股票","14", PropertiesUtil.getProperty("JS_IN_HTTP_API"),PropertiesUtil.getProperty("JS_IN_KEY"),"INR","₹"),
-    MX("MEX","墨西哥股票","7",PropertiesUtil.getProperty("MX_HTTP_API"),PropertiesUtil.getProperty("MX_KEY"),"MXN","MX$");
 
-//    TH("TH","泰国股票","41",PropertiesUtil.getProperty("TH_HTTP_API"),PropertiesUtil.getProperty("TH_KEY")),
-//    HG("HG","韩国股票","11",PropertiesUtil.getProperty("HG_HTTP_API"),PropertiesUtil.getProperty("HG_KEY")),
-//    SZHB("SZHB","数字货币","41",PropertiesUtil.getProperty("SZHB_HTTP_API"),PropertiesUtil.getProperty("SZHB_KEY"));
+    IN("IN","印度股票","14", PropertiesUtil.getProperty("JS_IN_HTTP_URL"),PropertiesUtil.getProperty("JS_IN_KEY"),"INR","₹"),
+
+    //MX("MEX","墨西哥股票","7",PropertiesUtil.getProperty("MX_HTTP_API"),PropertiesUtil.getProperty("MX_KEY"),"MXN","MX$"),
+
+    TW("TW","台湾股票","46",PropertiesUtil.getProperty("TW_HTTP_API"),PropertiesUtil.getProperty("TW_KEY"),"TWD","NT$");
+
+
     private String code;
     private String typeDesc;
     public String contryId;
@@ -33,6 +33,9 @@
 
     private String symbol1;
 
+    public static EStockType getDefault() {
+        return US; // 指定默认
+    }
 
     EStockType(String code, String typeDesc, String contryId, String stockUrl, String stockKey,String  symbol,String symbol1) {
         this.code = code;
@@ -47,10 +50,28 @@
     public static EStockType getEStockTypeByCode(String code){
         if(EStockType.US.getCode().equals(code)){
             return US;
-        }else if(EStockType.MX.getCode().equals(code)){
-            return  MX;
+        }else if(EStockType.HK.getCode().equals(code)){
+            return HK;
+        }else if(EStockType.IN.getCode().equals(code)){
+            return IN;
+        }else if(EStockType.TW.getCode().equals(code)){
+            return TW;
         }else{
-            return  MX;
+            return US;
+        }
+    }
+
+    public static boolean isExistByCode(String code){
+        if(EStockType.US.getCode().equals(code)){
+            return true;
+        }else if(EStockType.HK.getCode().equals(code)){
+            return true;
+        }else if(EStockType.IN.getCode().equals(code)){
+            return true;
+        }else if(EStockType.TW.getCode().equals(code)){
+            return true;
+        }else{
+            return false;
         }
     }
 
@@ -58,10 +79,14 @@
     public static EStockType getEStockTypeBySymbol(String symbol){
         if(EStockType.US.getSymbol().equals(symbol)){
             return US;
-        }else if(EStockType.MX.getSymbol().equals(symbol)){
-            return  MX;
+        }else if(EStockType.HK.getSymbol().equals(symbol)){
+            return HK;
+        }else if(EStockType.IN.getSymbol().equals(symbol)){
+            return IN;
+        }else if(EStockType.TW.getSymbol().equals(symbol)){
+            return TW;
         }else{
-            return  MX;
+            return null;
         }
     }
 
diff --git a/src/main/java/com/nq/service/IUserAssetsServices.java b/src/main/java/com/nq/service/IUserAssetsServices.java
index 02153d5..578745d 100644
--- a/src/main/java/com/nq/service/IUserAssetsServices.java
+++ b/src/main/java/com/nq/service/IUserAssetsServices.java
@@ -53,7 +53,6 @@
      * @param userId
      * @param eUserAssets
      * @param amount
-     * @param buyAmount
      * @return
      */
     Boolean aiAvailableBalanceChange(String accetType, Integer userId, EUserAssets eUserAssets, BigDecimal amount) throws Exception;
diff --git a/src/main/java/com/nq/service/impl/DkServices.java b/src/main/java/com/nq/service/impl/DkServices.java
index c3f38d9..e178195 100644
--- a/src/main/java/com/nq/service/impl/DkServices.java
+++ b/src/main/java/com/nq/service/impl/DkServices.java
@@ -141,7 +141,7 @@
                     //扣除用户贷款
                     user.setLoanLimit(user.getLoanLimit().subtract(spMoney));
                     //发放贷款金额 墨西哥账户
-                    iUserAssetsServices.aiAvailableBalanceChange(EStockType.MX.getCode(), user.getId(), EUserAssets.DK, spMoney);
+                    iUserAssetsServices.aiAvailableBalanceChange(EStockType.getDefault().getCode(), user.getId(), EUserAssets.DK, spMoney);
                     userMapper.updateById(user);
                 } else if (state == 2) { //拒绝
                     dkModel.setDkMessage(message);
@@ -180,7 +180,7 @@
                 if (user == null) {
                     return ServerResponse.createByErrorMsg("无用户信息", request);
                 }
-                UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.MX.getCode(), user.getId());
+                UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.getDefault().getCode(), user.getId());
                 //应该还款金额
                 BigDecimal amount = new BigDecimal(dkModel.getSpMoney());
                 if(userAssets.getAvailableBalance().compareTo(amount) < 0){
@@ -193,10 +193,10 @@
                     long day = DateTimeUtil.getDaysRoundedUp(dkModel.getLoanTime());
                     //利息 利率*贷款金额*借款天数
                     BigDecimal intAmount = new BigDecimal(stockConfig.getCValue()).multiply(amount).multiply(BigDecimal.valueOf(day));
-                    iUserAssetsServices.aiAvailableBalanceChange(EStockType.MX.getCode(), user.getId(), EUserAssets.RT_DK_INT, intAmount);
+                    iUserAssetsServices.aiAvailableBalanceChange(EStockType.getDefault().getCode(), user.getId(), EUserAssets.RT_DK_INT, intAmount);
                 }
                 //还款
-                iUserAssetsServices.aiAvailableBalanceChange(EStockType.MX.getCode(), user.getId(), EUserAssets.RT_DK, amount);
+                iUserAssetsServices.aiAvailableBalanceChange(EStockType.getDefault().getCode(), user.getId(), EUserAssets.RT_DK, amount);
                 dkMapper.updateById(dkModel);
                 return ServerResponse.createBySuccess("贷款审核成功", request);
             }
diff --git a/src/main/java/com/nq/service/impl/EchoServices.java b/src/main/java/com/nq/service/impl/EchoServices.java
index 67e3ae1..14faec9 100644
--- a/src/main/java/com/nq/service/impl/EchoServices.java
+++ b/src/main/java/com/nq/service/impl/EchoServices.java
@@ -140,8 +140,7 @@
         // 创建固定大小的线程池,根据需求调整线程数量
         ExecutorService executor = Executors.newFixedThreadPool(2);
         try {
-            executor.submit(() -> sendMoney(EStockType.US.getCode()));
-            executor.submit(() -> sendMoney(EStockType.MX.getCode()));
+            executor.submit(() -> sendMoney(EStockType.getDefault().getCode()));
         } finally {
             // 关闭线程池
             executor.shutdown();
diff --git a/src/main/java/com/nq/service/impl/PayServiceImpl.java b/src/main/java/com/nq/service/impl/PayServiceImpl.java
index 4a0063a..fc93449 100644
--- a/src/main/java/com/nq/service/impl/PayServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/PayServiceImpl.java
@@ -726,7 +726,7 @@
             }
             UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<>(UserAssets.class)
                     .eq(UserAssets::getUserId, paymentRecharge.getUserId())
-                    .eq(UserAssets::getAccectType, EStockType.MX.getCode())
+                    .eq(UserAssets::getAccectType, EStockType.getDefault().getCode())
             );
             ServerResponse serverResponse = iUserAssetsServices.updateUserAssets(userAssets.getId(), vo.getOriAmount().toString(), "2");
             if(serverResponse.getStatus() == 0){
@@ -938,7 +938,7 @@
             }
             UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<>(UserAssets.class)
                     .eq(UserAssets::getUserId, paymentRecharge.getUserId())
-                    .eq(UserAssets::getAccectType, EStockType.MX.getCode())
+                    .eq(UserAssets::getAccectType, EStockType.getDefault().getCode())
             );
             ServerResponse serverResponse = iUserAssetsServices.updateUserAssets(userAssets.getId(), vo.getAccount_fee().toString(), "2");
             if(serverResponse.getStatus() == 0){
diff --git a/src/main/java/com/nq/service/impl/SiteNewsServiceImpl.java b/src/main/java/com/nq/service/impl/SiteNewsServiceImpl.java
index a3d1f0a..d1ea032 100644
--- a/src/main/java/com/nq/service/impl/SiteNewsServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/SiteNewsServiceImpl.java
@@ -136,13 +136,18 @@
         // 创建固定大小的线程池,根据需求调整线程数量
         ExecutorService executor = Executors.newFixedThreadPool(2);
         try {
-            // 提交美国新闻抓取任务
+            // 提交新闻抓取任务
             executor.submit(() ->
                     addNews(1, PropertiesUtil.getProperty("US_HTTP_API") + "stock-markets?key=" + PropertiesUtil.getProperty("US_KEY") + "&type=1")
             );
-            // 提交墨西哥新闻抓取任务
             executor.submit(() ->
-                    addNews(1, PropertiesUtil.getProperty("MX_HTTP_API") + "stock-markets?key=" + PropertiesUtil.getProperty("MX_KEY") + "&type=1")
+                    addNews(1, PropertiesUtil.getProperty("HK_HTTP_API") + "stock-markets?key=" + PropertiesUtil.getProperty("HK_KEY") + "&type=1")
+            );
+            executor.submit(() ->
+                    addNews(1, PropertiesUtil.getProperty("JS_IN_HTTP_URL") + "stock-markets?key=" + PropertiesUtil.getProperty("JS_IN_KEY") + "&type=1")
+            );
+            executor.submit(() ->
+                    addNews(1, PropertiesUtil.getProperty("TW_HTTP_API") + "stock-markets?key=" + PropertiesUtil.getProperty("TW_KEY") + "&type=1")
             );
         } finally {
             // 关闭线程池
diff --git a/src/main/java/com/nq/service/impl/StockAiServiceImpl.java b/src/main/java/com/nq/service/impl/StockAiServiceImpl.java
index ef8d8d5..c51b3a0 100644
--- a/src/main/java/com/nq/service/impl/StockAiServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/StockAiServiceImpl.java
@@ -106,10 +106,10 @@
                     return ServerResponse.createByErrorMsg("最低购买数量" + stockAI.getMinPrice(), request);
                 }
                 //获取用户账户
-                UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.MX.getCode(), user.getId());
+                UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.getDefault().getCode(), user.getId());
                 BigDecimal finalBuyNum = buyNum;
-                //如果不是墨西哥币需要转换金额
-                if (!stockAI.getStockType().equals(EStockType.MX.getCode())) {
+                //如果不是默认货币需要转换金额
+                if (!stockAI.getStockType().equals(EStockType.getDefault().getCode())) {
                     buyNum = userAssetsServices.exchangeAmountByRate(stockAI.getStockType(), buyNum);
                 }
                 if(buyNum.compareTo(userAssets.getAvailableBalance()) > 0){
@@ -119,8 +119,8 @@
                 if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
                     return ServerResponse.createByErrorMsg("请先缴清待补资金", request);
                 }
-                //已经转化 直接穿MEX类型
-                iUserAssetsServices.aiAvailableBalanceChange(EStockType.MX.getCode(), user.getId(), EUserAssets.BUY_AI, buyNum);
+                //已经转化 直接穿默认类型
+                iUserAssetsServices.aiAvailableBalanceChange(EStockType.getDefault().getCode(), user.getId(), EUserAssets.BUY_AI, buyNum);
                 StockAIOrder stockAIOrder = new StockAIOrder();
                 stockAIOrder.setUserId(user.getId());
                 stockAIOrder.setStockAiId(id.intValue());
@@ -203,8 +203,8 @@
                 || model.getSuccessRate() == null || model.getExpectedEarning() == null || StringUtils.isBlank(model.getStatus())) {
                 return ServerResponse.createByErrorMsg("请完善必填信息");
             }
-            if (!model.getStockType().equals(EStockType.US.getCode()) && !model.getStockType().equals(EStockType.MX.getCode())) {
-                return ServerResponse.createByErrorMsg("只能选择美股或墨西哥股");
+            if (!EStockType.isExistByCode(model.getStockType())) {
+                return ServerResponse.createByErrorMsg("股票市场不存在");
             }
             //新增
             if (model.getId() == null) {
diff --git a/src/main/java/com/nq/service/impl/StockServiceImpl.java b/src/main/java/com/nq/service/impl/StockServiceImpl.java
index cd61cca..ffc26df 100644
--- a/src/main/java/com/nq/service/impl/StockServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/StockServiceImpl.java
@@ -703,49 +703,35 @@
             List<SiteNews> newsList = this.siteNewsMapper.getTopNewsList(pageSize);
 
             String usCodeList = PropertiesUtil.getProperty("us_home_indices_code");
-            String mxCodeList = PropertiesUtil.getProperty("mx_home_indices_code");
+            String hkCodeList = PropertiesUtil.getProperty("hk_home_indices_code");
+            String inCodeList = PropertiesUtil.getProperty("in_home_indices_code");
+            String twCodeList = PropertiesUtil.getProperty("tw_home_indices_code");
+
             List<String> usStockCodeList = Arrays.asList(usCodeList.split(","));
-            List<String> mxStockCodeList = Arrays.asList(mxCodeList.split(","));
+            List<String> hkStockCodeList = Arrays.asList(hkCodeList.split(","));
+            List<String> inStockCodeList = Arrays.asList(inCodeList.split(","));
+            List<String> twStockCodeList = Arrays.asList(twCodeList.split(","));
+
             List<DataStockBean> usDataStockBeans = Lists.newArrayList();
-            List<DataStockBean> mxDataStockBeans = Lists.newArrayList();
-            for (int i = 0; i < usStockCodeList.size(); i++) {
-                String stockCode = usStockCodeList.get(i);
-                String stockType = EStockType.US.getCode();
-                DataStockBean cacheBaseStock = RedisKeyUtil.getCacheBaseStock(stockType, stockCode);
-                // 获取K线数据
-                Object kData = RedisKeyUtil.getCaCheStockKData(stockType, stockCode);
-                if (kData == null) {
-                    //重新获取并缓存redis
-                    kData = getKData(stockCode, "D", stockType);
-                    RedisKeyUtil.setCaCheStockKData(stockType, stockCode, kData);
-                }
-                Gson gson = new Gson();
-                List<kData> dataList = gson.fromJson(kData.toString(), new TypeToken<List<kData>>(){}.getType());
-                cacheBaseStock.setKData(dataList);
-                cacheBaseStock.setStockType(stockType);
-                usDataStockBeans.add(cacheBaseStock);
-            }
-            for (int i = 0; i < mxStockCodeList.size(); i++) {
-                String stockCode = mxStockCodeList.get(i);
-                String stockType = EStockType.MX.getCode();
-                DataStockBean cacheBaseStock = RedisKeyUtil.getCacheBaseStock(stockType, stockCode);
-                // 获取K线数据
-                Object kData = RedisKeyUtil.getCaCheStockKData(stockType, stockCode);
-                if (kData == null) {
-                    //重新获取并缓存redis
-                    kData = getKData(stockCode, "D", stockType);
-                    RedisKeyUtil.setCaCheStockKData(stockType, stockCode, kData);
-                }
-                Gson gson = new Gson();
-                List<kData> dataList = gson.fromJson(kData.toString(), new TypeToken<List<kData>>(){}.getType());
-                cacheBaseStock.setKData(dataList);
-                cacheBaseStock.setStockType(stockType);
-                mxDataStockBeans.add(cacheBaseStock);
-            }
+            List<DataStockBean> hkDataStockBeans = Lists.newArrayList();
+            List<DataStockBean> inDataStockBeans = Lists.newArrayList();
+            List<DataStockBean> twDataStockBeans = Lists.newArrayList();
+            // 创建Gson对象(全局复用,避免重复创建)
+            Gson gson = new Gson();
+
+            // 统一处理各地区股票数据
+            processStockData(usStockCodeList, EStockType.US.getCode(), usDataStockBeans, gson);
+            processStockData(hkStockCodeList, EStockType.HK.getCode(), hkDataStockBeans, gson);
+            processStockData(inStockCodeList, EStockType.IN.getCode(), inDataStockBeans, gson);
+            processStockData(twStockCodeList, EStockType.TW.getCode(), twDataStockBeans, gson);
+
+            // 组装返回结果
             Map<String, Object> resultMap = new HashMap<>();
             resultMap.put("newsList", newsList);                //新闻列表
             resultMap.put("usDataStockBeans", usDataStockBeans);//美国指数
-            resultMap.put("mxDataStockBeans", mxDataStockBeans);//墨西哥指数
+            resultMap.put("hkDataStockBeans", hkDataStockBeans);//香港指数
+            resultMap.put("inDataStockBeans", inDataStockBeans);//印度指数
+            resultMap.put("twDataStockBeans", twDataStockBeans);//台湾指数
             return ServerResponse.createBySuccess(resultMap);
         } catch (Exception e){
             e.printStackTrace();
@@ -753,15 +739,49 @@
         return ServerResponse.createByError();
     }
 
+    // 提取的通用处理方法
+    private void processStockData(List<String> stockCodeList, String stockType,
+                                  List<DataStockBean> targetList, Gson gson) {
+        for (String stockCode : stockCodeList) {  // 增强for循环简化代码
+            // 获取基础股票数据
+            DataStockBean cacheBaseStock = RedisKeyUtil.getCacheBaseStock(stockType, stockCode);
+            if (cacheBaseStock == null) {  // 增加空指针防护(可选,根据实际业务)
+                continue;
+            }
+
+            // 获取K线数据(缓存优先)
+            Object kData = RedisKeyUtil.getCaCheStockKData(stockType, stockCode);
+            if (kData == null) {
+                // 缓存未命中时重新获取并缓存
+                kData = getKData(stockCode, "D", stockType);
+                RedisKeyUtil.setCaCheStockKData(stockType, stockCode, kData);
+            }
+
+            // 解析K线数据并设置到对象
+            List<kData> dataList = gson.fromJson(kData.toString(), new TypeToken<List<kData>>(){}.getType());
+            cacheBaseStock.setKData(dataList);
+            cacheBaseStock.setStockType(stockType);
+
+            // 添加到目标集合
+            targetList.add(cacheBaseStock);
+        }
+    }
+
     @Override
     public ServerResponse getIndicesList(String stockType) {
         try {
             String codeList;
-            if(stockType.equals(EStockType.MX.getCode()) || stockType.equals("MX")) {
-                codeList = PropertiesUtil.getProperty("mx_home_indices_code");
-            } else {
+            if(stockType.equals(EStockType.US.getCode())) {
                 codeList = PropertiesUtil.getProperty("us_home_indices_code");
-            }
+            } else if(stockType.equals(EStockType.HK.getCode())) {
+                codeList = PropertiesUtil.getProperty("hk_home_indices_code");
+            } else if(stockType.equals(EStockType.IN.getCode())) {
+                codeList = PropertiesUtil.getProperty("in_home_indices_code");
+            } else if(stockType.equals(EStockType.TW.getCode())) {
+                codeList = PropertiesUtil.getProperty("tw_home_indices_code");
+            } else
+                codeList = PropertiesUtil.getProperty("us_home_indices_code");
+
             List<String> stockCodeList = Arrays.asList(codeList.split(","));
 
             Map<Integer, Object> resultMap = new HashMap<>();
diff --git a/src/main/java/com/nq/service/impl/UserAssetsServices.java b/src/main/java/com/nq/service/impl/UserAssetsServices.java
index 207fe27..4560957 100644
--- a/src/main/java/com/nq/service/impl/UserAssetsServices.java
+++ b/src/main/java/com/nq/service/impl/UserAssetsServices.java
@@ -52,11 +52,8 @@
 
     @Override
     public UserAssets assetsByTypeAndUserId(String accetType, Integer userId) {
-        /*if(accetType.equals("SZHB")){
-            accetType = "US";
-        }*/
-        if(accetType.equals(EStockType.US.getCode()) || accetType.equals("IN")){
-            accetType = EStockType.MX.getCode();
+        if(!accetType.equals(EStockType.US.getCode())){
+            accetType = EStockType.US.getCode();
         }
         QueryWrapper<UserAssets>  queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("accect_type",accetType);
@@ -172,13 +169,13 @@
 
     @Override
     public Boolean availablebalanceChange(String accetType, Integer userId, EUserAssets eUserAssets, BigDecimal amount, String desc, String descType) throws Exception {
-        //UserAssets userAssets = assetsByTypeAndUserId(accetType,userId);
-        //查询墨西哥账户
-        UserAssets userAssets = assetsByTypeAndUserId(EStockType.MX.getCode(), userId);
-        //如果不是墨西哥币需要转换金额
-        if (!accetType.equals(EStockType.MX.getCode())) {
+        //查询账户
+        UserAssets userAssets = assetsByTypeAndUserId(EStockType.getDefault().getCode(), userId);
+        //是否需要转换金额
+        if (!accetType.equals(EStockType.getDefault().getCode())) {
             amount = exchangeAmountByRate(accetType, amount);
         }
+
         UserPosition userPosition = userPositionMapper.selectOne(new LambdaQueryWrapper<UserPosition>().gt(UserPosition::getAmountToBeCovered, BigDecimal.ZERO).eq(UserPosition::getUserId,userAssets.getUserId()));
         String type = eUserAssets.getDesc();
         String before = userAssets.getAvailableBalance().toString();
@@ -309,10 +306,10 @@
 
 
     public Boolean aiAvailableBalanceChange(String accetType, Integer userId, EUserAssets eUserAssets, BigDecimal amount) throws Exception {
-        //查询墨西哥账户
-        UserAssets userAssets = assetsByTypeAndUserId(EStockType.MX.getCode(), userId);
-        //如果不是墨西哥币需要转换金额
-        if (!accetType.equals(EStockType.MX.getCode())) {
+        //查询账户
+        UserAssets userAssets = assetsByTypeAndUserId(EStockType.getDefault().getCode(), userId);
+        //是否需要转换金额
+        if (!accetType.equals(EStockType.getDefault().getCode())) {
             amount = exchangeAmountByRate(accetType, amount);
         }
         String before = userAssets.getAvailableBalance().toString();
@@ -368,12 +365,12 @@
     public BigDecimal exchangeAmountByRate(String accetType, BigDecimal amount) throws Exception {
         EStockType stockType = EStockType.getEStockTypeByCode(accetType);
         ExchangeRate exchangeRate = exchangeRateRepository.findExchangeRateByCurrencyAndConversionCurrency(
-                stockType.getSymbol(), EStockType.MX.getSymbol()).orElse(null);
+                stockType.getSymbol(), EStockType.getDefault().getSymbol()).orElse(null);
         if (exchangeRate != null) {
-            //转换为墨西哥币 保留5位小数
+            //转换为默认货币 保留5位小数
             return amount.multiply(exchangeRate.getRata()).setScale(5, RoundingMode.HALF_UP);
         } else {
-            log.error("exchangeAmountByRate is null:{}>>{}", stockType.getSymbol(), EStockType.MX.getSymbol());
+            log.error("exchangeAmountByRate is null:{}>>{}", stockType.getSymbol(), EStockType.getDefault().getSymbol());
             throw new Exception("货币转换汇率未设置");
         }
 
diff --git a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java b/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
index 70a8209..6275641 100644
--- a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
@@ -180,8 +180,8 @@
 
                 BigDecimal buyAmt = nowPrice.multiply(new BigDecimal(buyNum)).divide(new BigDecimal(lever));
                 BigDecimal finalBuyAmt = buyAmt;
-                //如果不是墨西哥币需要转换金额
-                if (!stock.getStockType().equals(EStockType.MX.getCode())) {
+                //如果不是默认货币需要转换金额
+                if (!stock.getStockType().equals(EStockType.getDefault().getCode())) {
                     buyAmt = userAssetsServices.exchangeAmountByRate(stock.getStockType(), buyAmt);
                 }
                 BigDecimal orderFree = siteSettingBuyFee.multiply(buyAmt);
@@ -1808,8 +1808,8 @@
             }
 
             BigDecimal newBuyAmt = buyAmt;
-            //如果不是墨西哥币需要转换金额
-            if (!stock.getStockType().equals(EStockType.MX.getCode())) {
+            //如果不是默认货币需要转换金额
+            if (!stock.getStockType().equals(EStockType.getDefault().getCode())) {
                 newBuyAmt = userAssetsServices.exchangeAmountByRate(stock.getStockType(), buyAmt);
             }
             if(newBuyAmt.compareTo(userAssets.getAvailableBalance()) > 0){
@@ -1829,9 +1829,9 @@
             UserPosition userPosition = getUserPosition(dzId,num, user, stockDz, nowPrice, stock, buyAmt);
             userPositionMapper.insert(userPosition);
             BigDecimal buy_fee_amt = siteSettingBuyFee.multiply(newBuyAmt);
-            //已经转化 直接穿MEX类型
-            userAssetsServices.availablebalanceChange(EStockType.MX.getCode(), user.getId(), EUserAssets.BUY, newBuyAmt.negate(),"","");
-            iUserAssetsServices.availablebalanceChange(EStockType.MX.getCode(), userAssets.getUserId(), EUserAssets.HANDLING_CHARGE, buy_fee_amt, "", "");
+            //已经转化 直接传默认类型
+            userAssetsServices.availablebalanceChange(EStockType.getDefault().getCode(), user.getId(), EUserAssets.BUY, newBuyAmt.negate(),"","");
+            iUserAssetsServices.availablebalanceChange(EStockType.getDefault().getCode(), userAssets.getUserId(), EUserAssets.HANDLING_CHARGE, buy_fee_amt, "", "");
             return ServerResponse.createBySuccess("购买成功", request);
         } catch (Exception e) {
             log.error("大宗下单异常{}", e.getMessage());
@@ -2112,11 +2112,19 @@
                             null, null, state, null);
 
             BigDecimal usMarketValue = BigDecimal.ZERO; //美股市值
-            BigDecimal mxMarketValue = BigDecimal.ZERO; //墨西哥股市值
+            BigDecimal hkMarketValue = BigDecimal.ZERO; //港股市值
+            BigDecimal inMarketValue = BigDecimal.ZERO; //印股市值
+            BigDecimal twMarketValue = BigDecimal.ZERO; //台股市值
+
             BigDecimal usPositionEarnings = BigDecimal.ZERO; //美股持仓收益
-            BigDecimal mxPositionEarnings = BigDecimal.ZERO; //墨西哥持仓收益
+            BigDecimal hkPositionEarnings = BigDecimal.ZERO; //港股持仓收益
+            BigDecimal inPositionEarnings = BigDecimal.ZERO; //印股持仓收益
+            BigDecimal twPositionEarnings = BigDecimal.ZERO; //台股持仓收益
+
             BigDecimal usPositionEarningsParent = BigDecimal.ZERO; //美股持仓收益百分比
-            BigDecimal mxPositionEarningsParent = BigDecimal.ZERO; //墨西哥持仓收益百分比
+            BigDecimal hkPositionEarningsParent = BigDecimal.ZERO; //港股持仓收益百分比
+            BigDecimal inPositionEarningsParent = BigDecimal.ZERO; //印股持仓收益百分比
+            BigDecimal twPositionEarningsParent = BigDecimal.ZERO; //台股持仓收益百分比
 
             if (!userPositions.isEmpty()) {
                 for (UserPosition position : userPositions) {
@@ -2148,14 +2156,25 @@
                         usMarketValue = usMarketValue.add(nowPrice);
                         usPositionEarnings = usPositionEarnings.add(userPositionVO.getProfitAndLose());
                         usPositionEarningsParent = usPositionEarningsParent.add(userPositionVO.getProfitAndLoseParent2());
-                    } else if(position.getStockGid().equals(EStockType.MX.getCode())) {
-                        mxMarketValue = mxMarketValue.add(nowPrice);
-                        mxPositionEarnings = mxPositionEarnings.add(userPositionVO.getProfitAndLose());
-                        mxPositionEarningsParent = mxPositionEarningsParent.add(userPositionVO.getProfitAndLoseParent2());
+                    } else if(position.getStockGid().equals(EStockType.HK.getCode())) {
+                        hkMarketValue = hkMarketValue.add(nowPrice);
+                        hkPositionEarnings = hkPositionEarnings.add(userPositionVO.getProfitAndLose());
+                        hkPositionEarningsParent = hkPositionEarningsParent.add(userPositionVO.getProfitAndLoseParent2());
+                    } else if(position.getStockGid().equals(EStockType.IN.getCode())) {
+                        inMarketValue = inMarketValue.add(nowPrice);
+                        inPositionEarnings = inPositionEarnings.add(userPositionVO.getProfitAndLose());
+                        inPositionEarningsParent = inPositionEarningsParent.add(userPositionVO.getProfitAndLoseParent2());
+                    } else if(position.getStockGid().equals(EStockType.TW.getCode())) {
+                        twMarketValue = twMarketValue.add(nowPrice);
+                        twPositionEarnings = twPositionEarnings.add(userPositionVO.getProfitAndLose());
+                        twPositionEarningsParent = twPositionEarningsParent.add(userPositionVO.getProfitAndLoseParent2());
                     }
+
                 }
                 usPositionEarnings = usPositionEarnings.setScale(2, RoundingMode.DOWN);
-                mxPositionEarnings = mxPositionEarnings.setScale(2, RoundingMode.DOWN);
+                hkPositionEarnings = hkPositionEarnings.setScale(2, RoundingMode.DOWN);
+                inPositionEarnings = inPositionEarnings.setScale(2, RoundingMode.DOWN);
+                twPositionEarnings = twPositionEarnings.setScale(2, RoundingMode.DOWN);
             }
 
             Map<String, String> map = new HashMap<>();
@@ -2163,9 +2182,18 @@
             map.put("usPositionEarnings", String.valueOf(usPositionEarnings));  //美股持仓收益
             map.put("usPositionEarningsParent", usPositionEarningsParent + "%");//美股持仓收益率
 
-            map.put("mxMarketValue", String.valueOf(mxMarketValue));       //墨西哥股市值
-            map.put("mxPositionEarnings", String.valueOf(mxPositionEarnings));  //墨西哥持仓收益
-            map.put("mxPositionEarningsParent", mxPositionEarningsParent + "%");//墨西哥持仓收益率
+            map.put("hkMarketValue", String.valueOf(hkMarketValue));            //港股市值
+            map.put("hkPositionEarnings", String.valueOf(hkPositionEarnings));  //港股持仓收益
+            map.put("hkPositionEarningsParent", hkPositionEarningsParent + "%");//港股持仓收益率
+
+            map.put("inMarketValue", String.valueOf(inMarketValue));            //印股市值
+            map.put("inPositionEarnings", String.valueOf(inPositionEarnings));  //印股持仓收益
+            map.put("inPositionEarningsParent", inPositionEarningsParent + "%");//印股持仓收益率
+
+            map.put("twMarketValue", String.valueOf(twMarketValue));            //台股市值
+            map.put("twPositionEarnings", String.valueOf(twPositionEarnings));  //台股持仓收益
+            map.put("twPositionEarningsParent", twPositionEarningsParent + "%");//台股持仓收益率
+
             return ServerResponse.createBySuccess(map);
         } catch (Exception e) {
             log.error("IUserPositionService getMyPositionProfitAndLose error", e);
diff --git a/src/main/java/com/nq/service/impl/UserRechargeServiceImpl.java b/src/main/java/com/nq/service/impl/UserRechargeServiceImpl.java
index c3740e6..3a74ca2 100644
--- a/src/main/java/com/nq/service/impl/UserRechargeServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserRechargeServiceImpl.java
@@ -218,8 +218,8 @@
 
         for (int i = 0; i <userRecharges.size() ; i++) {
           SitePay s =   sitePayMapper.selectById(userRecharges.get(i).getPayId());
-            userRecharges.get(i).setAssetsType(EStockType.MX.getSymbol1());
-            userRecharges.get(i).setChannelName(EStockType.MX.getSymbol());
+            userRecharges.get(i).setAssetsType(EStockType.getDefault().getSymbol1());
+            userRecharges.get(i).setChannelName(EStockType.getDefault().getSymbol());
         }
 
         return ServerResponse.createBySuccess(pageInfo);
@@ -340,7 +340,7 @@
             userRecharge.setPayTime(new Date());
             userRecharge.setOrderStatus(Integer.valueOf(1));
             userRecharge.setPayId(1);
-            userAssetsServices.availablebalanceChange(EStockType.MX.getCode(),
+            userAssetsServices.availablebalanceChange(EStockType.getDefault().getCode(),
                     userId,EUserAssets.TOP_UP,new BigDecimal(amt),"","");
             int insertCount = this.userRechargeMapper.insert(userRecharge);
             if (insertCount > 0) {
diff --git a/src/main/java/com/nq/service/impl/UserServiceImpl.java b/src/main/java/com/nq/service/impl/UserServiceImpl.java
index 7357ab5..f5c8a42 100644
--- a/src/main/java/com/nq/service/impl/UserServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserServiceImpl.java
@@ -193,8 +193,8 @@
             if (user.getIsLogin().intValue() == 1) {
                 return ServerResponse.createByErrorMsg("登录失败。账户锁定",request);
             }
-            //默认墨西哥资产
-            userAssetsServices.assetsByTypeAndUserId(EStockType.MX.getCode(),user.getId());
+            //默认资产
+            userAssetsServices.assetsByTypeAndUserId(EStockType.getDefault().getCode(),user.getId());
             this.iSiteLoginLogService.saveLog(user, request);
             return ServerResponse.createBySuccess(user);
         }
@@ -757,7 +757,7 @@
             ServerResponse money = iUserService.getMoney(user.getId());
             List<RUserAssets> rUserAssetsList = (List<RUserAssets>) money.getData();
             RUserAssets rUserAssets = rUserAssetsList.stream()
-                    .filter(stock -> EStockType.MX.getCode().equals(stock.getAccectType()))
+                    .filter(stock -> EStockType.getDefault().getCode().equals(stock.getAccectType()))
                     .findFirst()
                     .orElse(null);
 
@@ -814,8 +814,8 @@
 
             int insertCount = this.userMapper.insert(user);
             dbUser = userMapper.selectOne(queryWrapper);
-            userAssetsServices.getAvailableBalance(EStockType.MX.getCode(),dbUser.getId() );
-            userAssetsServices.availablebalanceChange(EStockType.MX.getCode(),dbUser.getId(),EUserAssets.TOP_UP,new BigDecimal(amt),"","");
+            userAssetsServices.getAvailableBalance(EStockType.getDefault().getCode(),dbUser.getId() );
+            userAssetsServices.availablebalanceChange(EStockType.getDefault().getCode(),dbUser.getId(),EUserAssets.TOP_UP,new BigDecimal(amt),"","");
             if (insertCount > 0) {
                 return ServerResponse.createBySuccessMsg("Success");
             }
@@ -843,7 +843,7 @@
             ServerResponse money = iUserService.getMoney(user.getId());
             List<RUserAssets> rUserAssetsList = (List<RUserAssets>) money.getData();
             RUserAssets rUserAssets = rUserAssetsList.stream()
-                    .filter(stock -> EStockType.MX.getCode().equals(stock.getAccectType()))
+                    .filter(stock -> EStockType.getDefault().getCode().equals(stock.getAccectType()))
                     .findFirst()
                     .orElse(null);
 
diff --git a/src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java b/src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java
index 027f2a9..f3f21f4 100644
--- a/src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java
@@ -144,8 +144,8 @@
                 }else{
                     bound =  new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getPrice());
                 }
-                //如果不是墨西哥币需要转换金额
-                if (!stockSubscribe.getStockType().equals(EStockType.MX.getCode())) {
+                //如果不是默认货币需要转换金额
+                if (!stockSubscribe.getStockType().equals(EStockType.getDefault().getCode())) {
                     bound = iUserAssetsServices.exchangeAmountByRate(stockSubscribe.getStockType(), bound);
                 }
                 if(userAssets.getAvailableBalance().compareTo(bound) < 0){
@@ -186,10 +186,10 @@
                     moneyLog.setBeFore(before);
                     moneyLog.setAfter(userAssets.getAvailableBalance().toString());
                     moneyLog.setAmount(bound.negate().toString());
-                    moneyLog.setAccectType(EStockType.MX.getCode());
+                    moneyLog.setAccectType(EStockType.getDefault().getCode());
                     moneyLog.setType(eUserAssets.getCode());
                     moneyLog.setUserId(user.getId()+"");
-                    moneyLog.setSymbol(EStockType.MX.getSymbol());
+                    moneyLog.setSymbol(EStockType.getDefault().getSymbol());
                     moneyLog.setCreateTime(new Date());
                     moneyLogMapper.insert(moneyLog);
                     if (ret > 0) {
@@ -287,8 +287,8 @@
                             if(applyNumber > 0){
                                 //需要退回的资金
                                 refundPrice = userStockSubscribe.getBuyPrice().multiply(new BigDecimal(applyNumber));
-                                //如果不是墨西哥币需要转换金额
-                                if (!stockSubscribe.getStockType().equals(EStockType.MX.getCode())) {
+                                //如果不是默认货币需要转换金额
+                                if (!stockSubscribe.getStockType().equals(EStockType.getDefault().getCode())) {
                                     refundPrice = iUserAssetsServices.exchangeAmountByRate(stockSubscribe.getStockType(), refundPrice);
                                 }
                                 userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(refundPrice));
@@ -297,8 +297,8 @@
                         }else{
                             if(applyNumber > 0){
                                 refundPrice = userStockSubscribe.getBuyPrice().multiply(new BigDecimal(applyNumber));
-                                //如果不是墨西哥币需要转换金额
-                                if (!stockSubscribe.getStockType().equals(EStockType.MX.getCode())) {
+                                //如果不是默认货币需要转换金额
+                                if (!stockSubscribe.getStockType().equals(EStockType.getDefault().getCode())) {
                                     refundPrice = iUserAssetsServices.exchangeAmountByRate(stockSubscribe.getStockType(), refundPrice);
                                 }
                                 BigDecimal subtract = refundPrice.subtract(userAssets.getAmountToBeCovered());
@@ -319,10 +319,10 @@
                             moneyLog.setBeFore(before);
                             moneyLog.setAfter(userAssets.getAvailableBalance().toString());
                             moneyLog.setAmount(refundPrice.toString());
-                            moneyLog.setAccectType(EStockType.MX.getCode());
+                            moneyLog.setAccectType(EStockType.getDefault().getCode());
                             moneyLog.setType(eUserAssets.getCode());
                             moneyLog.setUserId(userAssets.getUserId()+"");
-                            moneyLog.setSymbol(EStockType.MX.getSymbol());
+                            moneyLog.setSymbol(EStockType.getDefault().getSymbol());
                             moneyLog.setCreateTime(new Date());
                             moneyLogMapper.insert(moneyLog);
                         }
diff --git a/src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java b/src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java
index 38b6de0..a81175e 100644
--- a/src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java
@@ -148,7 +148,7 @@
     }
 
     private boolean getServerResponse() {
-        StockTimeSetting stockTimeSetting = stockTimeSettingMapper.selectOne(new QueryWrapper<StockTimeSetting>().eq("accets_type", EStockType.MX.getCode()));
+        StockTimeSetting stockTimeSetting = stockTimeSettingMapper.selectOne(new QueryWrapper<StockTimeSetting>().eq("accets_type", EStockType.getDefault().getCode()));
         if (stockTimeSetting == null) {
             return false;
         }
@@ -216,7 +216,7 @@
             User user = this.userMapper.selectById(userWithdraw.getUserId());
 
 
-            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.MX.getCode(), user.getId());
+            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.getDefault().getCode(), user.getId());
             if (userAssets == null) {
                 return ServerResponse.createByErrorMsg("用户资金账户不存在");
             }
@@ -330,7 +330,7 @@
             if (user == null) {
                 return ServerResponse.createByErrorMsg("用户不存在");
             }
-            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.MX.getCode(), user.getId());
+            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.getDefault().getCode(), user.getId());
             if (userAssets == null) {
                 return ServerResponse.createByErrorMsg("用户资金账户不存在");
             }
diff --git a/src/main/java/com/nq/utils/StringUtils.java b/src/main/java/com/nq/utils/StringUtils.java
index e88f17b..2d54011 100644
--- a/src/main/java/com/nq/utils/StringUtils.java
+++ b/src/main/java/com/nq/utils/StringUtils.java
@@ -76,6 +76,12 @@
         return htmlStr.trim(); //返迴文本字符串
     }
 
+    public static String trim(String str){
+        if (str == null || str.isEmpty()) {
+            return str;
+        }
+        return str.replaceAll("^[\\s\u3000]+|[\\s\u3000]+$", "");
+    }
 
 
 }
diff --git a/src/main/java/com/nq/utils/redis/RedisKeyUtil.java b/src/main/java/com/nq/utils/redis/RedisKeyUtil.java
index fdc5ad3..788075d 100644
--- a/src/main/java/com/nq/utils/redis/RedisKeyUtil.java
+++ b/src/main/java/com/nq/utils/redis/RedisKeyUtil.java
@@ -69,7 +69,9 @@
             stockRealTimeBean.setLow(stringObjectMap.get("Low").toString());
             stockRealTimeBean.setBid(stringObjectMap.get("Id").toString());
             stockRealTimeBean.setPc(stringObjectMap.get("PrevClose").toString());
-            stockRealTimeBean.setAsk(stringObjectMap.get("Ask").toString());
+            if (stringObjectMap.get("Ask") != null) {
+                stockRealTimeBean.setAsk(stringObjectMap.get("Ask").toString());
+            }
         }
         stockRealTimeBean.setPcp(stockRealTimeBean.getPcp().replace("%",""));
         return  stockRealTimeBean;
diff --git a/src/main/java/com/nq/utils/task/stock/CarryPositionTask.java b/src/main/java/com/nq/utils/task/stock/CarryPositionTask.java
index bad2a99..d72bae2 100644
--- a/src/main/java/com/nq/utils/task/stock/CarryPositionTask.java
+++ b/src/main/java/com/nq/utils/task/stock/CarryPositionTask.java
@@ -113,7 +113,7 @@
                 List<UserStockSubscribe> userStockSubscribes = userStockSubscribeMapper.selectList(new LambdaQueryWrapper<UserStockSubscribe>()
                         .eq(UserStockSubscribe::getStatus, 3));
                 userStockSubscribes.forEach(f->{
-                    UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId(EStockType.MX.getCode(), f.getUserId());
+                    UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId(EStockType.getDefault().getCode(), f.getUserId());
                     if(null != userAssets && userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) == 0){
                         f.setStatus(4);
                         userStockSubscribeMapper.updateById(f);
diff --git a/src/main/java/com/nq/utils/task/stock/StockTask.java b/src/main/java/com/nq/utils/task/stock/StockTask.java
index 2ffd21b..071f9f7 100644
--- a/src/main/java/com/nq/utils/task/stock/StockTask.java
+++ b/src/main/java/com/nq/utils/task/stock/StockTask.java
@@ -16,6 +16,7 @@
 import com.nq.service.IUserPositionService;
 import com.nq.service.impl.StockServiceImpl;
 import com.nq.utils.PropertiesUtil;
+import com.nq.utils.StringUtils;
 import com.nq.utils.http.HttpClientRequest;
 import com.nq.utils.http.HttpRequest;
 import com.nq.utils.redis.RedisKeyUtil;
@@ -94,14 +95,25 @@
             try {
                 syncINStockData.set(true);
 
-                // 使用CompletableFuture并行执行任务
-                CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> loadAllStock(EStockType.US), taskExecutor);
-                CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> loadAllStock(EStockType.MX), taskExecutor);
-                CompletableFuture<Void> future3 = CompletableFuture.runAsync(() -> syncIndices(EStockType.US), taskExecutor);
-                CompletableFuture<Void> future4 = CompletableFuture.runAsync(() -> syncIndices(EStockType.MX), taskExecutor);
+                // 1. 定义需要处理的所有股票类型(集中管理,新增类型只需添加到列表)
+                List<EStockType> stockTypes = Arrays.asList(
+                        EStockType.US,
+                        EStockType.HK,
+                        EStockType.IN,
+                        EStockType.TW
+                );
 
-                // 等待所有任务完成
-                CompletableFuture.allOf(future1, future2, future3, future4).join();
+                // 2. 批量创建所有异步任务
+                List<CompletableFuture<Void>> futures = new ArrayList<>();
+                for (EStockType type : stockTypes) {
+                    // 添加loadAllStock任务
+                    futures.add(CompletableFuture.runAsync(() -> loadAllStock(type), taskExecutor));
+                    // 添加syncIndices任务
+                    futures.add(CompletableFuture.runAsync(() -> syncIndices(type), taskExecutor));
+                }
+
+                // 3. 等待所有任务完成(将List转换为数组传入allOf)
+                CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
             } catch (Exception e) {
                 log.error("同步股票数据出错", e);
             } finally {
@@ -115,6 +127,7 @@
      * 加载所有指数数据
      */
     private void syncIndices(EStockType eStockType) {
+        log.info("同步指数 数据 {}", eStockType.getCode());
         List<DataStockBean> list = new ArrayList<>();
         int totleStock = 1;
         try {
@@ -147,7 +160,7 @@
                     stock = new Stock();
                 }
                 stock.setStockCode(o.getId());
-                stock.setStockName(o.getName());
+                stock.setStockName(StringUtils.trim(o.getName()));
                 stock.setStockType(eStockType.getCode());
                 //指数数据类型
                 stock.setStockGid(EConfigKey.INDICES.getCode());
@@ -157,29 +170,15 @@
                 stock.setDataBase(0);
                 stock.setAddTime(new Date());
                 updateStockList.add(stock);
-                /*if (stock.getId() == null) {
-                    stockMapper.insert1(stock);
-                } else {
-                    stockMapper.updateById(stock);
-                }*/
-                RedisKeyUtil.setCaCheKeyBaseStock(eStockType, o);
 
-                /*StockRealTimeBean stockRealTimeBean = new StockRealTimeBean();
-                stockRealTimeBean.setPid(o.getId());
-                stockRealTimeBean.setLast(o.getLast());
-                stockRealTimeBean.setHigh(o.getHigh());
-                stockRealTimeBean.setLow(o.getLow());
-                stockRealTimeBean.setPc(o.getChg());
-                stockRealTimeBean.setPcp(o.getChgPct()+ "%");
-                stockRealTimeBean.setTime(o.getTime());
-                RedisKeyUtil.setCacheRealTimeStock(eStockType, stockRealTimeBean);*/
+                RedisKeyUtil.setCaCheKeyBaseStock(eStockType, o);
             }
             stockRepository.saveAll(updateStockList);
             cacheKData(eStockType.getCode(), list);
             log.info("同步指数 数据 成功 {}  总共同步数据 {}", eStockType.getCode(), list.size());
         } catch (Exception e) {
             e.printStackTrace();
-            log.error("同步指数列表出现异常: {}", e.getMessage());
+            log.error("同步指数列表出现异常: {}", eStockType.getCode());
         }
     }
 
@@ -187,11 +186,14 @@
      * 同步指数股票后缓存k线图
      */
     public void cacheKData(String stockType, List<DataStockBean> list) {
-        String usCodeList = PropertiesUtil.getProperty("us_home_indices_code");
-        String mxCodeList = PropertiesUtil.getProperty("mx_home_indices_code");
+        StringBuilder codeList = new StringBuilder();
+        codeList.append(PropertiesUtil.getProperty("us_home_indices_code"));
+        codeList.append(PropertiesUtil.getProperty("hk_home_indices_code"));
+        codeList.append(PropertiesUtil.getProperty("in_home_indices_code"));
+        codeList.append(PropertiesUtil.getProperty("tw_home_indices_code"));
         for (DataStockBean dataStockBean : list) {
             //缓存首页指数k线图
-            if (usCodeList.contains(dataStockBean.getId()) || mxCodeList.contains(dataStockBean.getId())) {
+            if (codeList.toString().contains(dataStockBean.getId())) {
                 // 获取K线数据
                 Object kData = istockService.getKData(dataStockBean.getId(), "D", stockType);
                 if (kData != null) {
@@ -268,36 +270,20 @@
                         .orElse(null);
                 if (stock == null) {
                     stock = new Stock();
-                    stock.setStockCode(o.getId());
-                    stock.setStockName(o.getName());
-                    stock.setStockType(eStockType.getCode());
-                    if (o.getType() == null) {
-                        stock.setStockGid(eStockType.getCode());
-                    } else {
-                        stock.setStockGid(o.getType());
-                    }
-                    stock.setStockSpell(o.getSymbol());
-                    stock.setIsLock(0);
-                    stock.setIsShow(0);
-                    stock.setDataBase(0);
-                    stock.setAddTime(new Date());
-                    //stockMapper.insert1(stock);
-                } else {
-                    stock.setStockCode(o.getId());
-                    stock.setStockName(o.getName());
-                    stock.setStockType(eStockType.getCode());
-                    if (o.getType() == null) {
-                        stock.setStockGid(eStockType.getCode());
-                    } else {
-                        stock.setStockGid(o.getType());
-                    }
-                    stock.setStockSpell(o.getSymbol());
-                    stock.setIsLock(0);
-                    stock.setIsShow(0);
-                    stock.setDataBase(0);
-                    stock.setAddTime(new Date());
-                    //stockMapper.updateById(stock);
                 }
+                stock.setStockCode(o.getId());
+                stock.setStockName(StringUtils.trim(o.getName()));
+                stock.setStockType(eStockType.getCode());
+                if (o.getType() == null) {
+                    stock.setStockGid(eStockType.getCode());
+                } else {
+                    stock.setStockGid(o.getType());
+                }
+                stock.setStockSpell(o.getSymbol());
+                stock.setIsLock(0);
+                stock.setIsShow(0);
+                stock.setDataBase(0);
+                stock.setAddTime(new Date());
                 updateStockList.add(stock);
                 RedisKeyUtil.setCaCheKeyBaseStock(eStockType, o);
             }
diff --git a/src/main/java/com/nq/ws/MXWebsocketRunClient.java b/src/main/java/com/nq/ws/TWWebsocketRunClient.java
similarity index 88%
rename from src/main/java/com/nq/ws/MXWebsocketRunClient.java
rename to src/main/java/com/nq/ws/TWWebsocketRunClient.java
index cb86135..fc98ae0 100644
--- a/src/main/java/com/nq/ws/MXWebsocketRunClient.java
+++ b/src/main/java/com/nq/ws/TWWebsocketRunClient.java
@@ -24,11 +24,11 @@
 import java.util.*;
 
 @Slf4j
-public class MXWebsocketRunClient  extends WebSocketClient {
+public class TWWebsocketRunClient extends WebSocketClient {
 
     private EStockType eStockType;
-    public MXWebsocketRunClient(URI serverUri,
-                              EStockType eStockType
+    public TWWebsocketRunClient(URI serverUri,
+                                EStockType eStockType
     ) {
         super(serverUri);
         this.eStockType = eStockType;
@@ -62,10 +62,10 @@
     @Override
     public void onMessage(String message) {
         if (message.contains("身份验证成功") || message.contains("pong") || message.contains("身份验证失败") || message.contains("ws连接点只能有一个")) {
-            System.out.println("mex" + message);
+            System.out.println("tw" + message);
             return;
         }
-        //System.out.println("mex2" + message);
+        System.out.println("tw2" + message);
         Map<String, String> stringObjectMap = jsonToMap(message);
         StockRealTimeBean stockRealTimeBean = new StockRealTimeBean();
         stockRealTimeBean.setPid(stringObjectMap.get("Id").toString());
@@ -77,7 +77,7 @@
         stockRealTimeBean.setPc(stringObjectMap.get("Chg").toString());
         stockRealTimeBean.setPcp(stringObjectMap.get("ChgPct").toString()+"%");
         stockRealTimeBean.setTime(stringObjectMap.get("Time").toString());
-        RedisKeyUtil.setCacheRealTimeStock(EStockType.MX,stockRealTimeBean);
+        RedisKeyUtil.setCacheRealTimeStock(EStockType.TW,stockRealTimeBean);
         ObjectMapper objectMapper = new ObjectMapper();
         try {
             if(!stockRealTimeBean.getPcp().contains("-")){
@@ -86,9 +86,9 @@
             String json = objectMapper.writeValueAsString(stockRealTimeBean);
             sendLoca(json);
             StockRealTimeBean stockDetailBean =  new Gson().fromJson(message, StockRealTimeBean.class);
-            RedisKeyUtil.setCacheRealTimeStock(EStockType.MX,stockDetailBean);
+            RedisKeyUtil.setCacheRealTimeStock(EStockType.TW,stockDetailBean);
         } catch (JsonProcessingException e) {
-            log.error("websocket 墨西哥股票 消息错误:{}", e.getMessage());
+            log.error("websocket 台湾股票 消息错误:{}", e.getMessage());
         }
     }
 
@@ -100,12 +100,12 @@
 
     @Override
     public void onClose(int i, String s, boolean b) {
-        log.info("websocket 墨西哥股票 关闭 {} ", i);
+        log.info("websocket 台湾股票 关闭 {} ", i);
     }
 
     @Override
     public void onError(Exception e) {
-        log.info("websocket 墨西哥股票 错误{}", e.getMessage());
+        log.info("websocket 台湾股票 错误{}", e.getMessage());
     }
 
     public void sendLoca(String message) {
diff --git a/src/main/java/com/nq/ws/WebSocketClientBeanConfig.java b/src/main/java/com/nq/ws/WebSocketClientBeanConfig.java
index 4e6b9f8..c702380 100644
--- a/src/main/java/com/nq/ws/WebSocketClientBeanConfig.java
+++ b/src/main/java/com/nq/ws/WebSocketClientBeanConfig.java
@@ -21,22 +21,22 @@
 
         Map<String, WebSocketClient> retMap = new HashMap<>(2);
         try {
-            WebsocketRunClient usWebsocketRunClient = new WebsocketRunClient(new URI(PropertiesUtil.getProperty("US_WS_URL")),EStockType.US);
-            usWebsocketRunClient.connect();
-            usWebsocketRunClient.setConnectionLostTimeout(0);
-            startHeartbeatThread(usWebsocketRunClient);
-            retMap.put(EStockType.US.getStockKey(), usWebsocketRunClient);
+            WebsocketRunClient hkWebsocketRunClient = new WebsocketRunClient(new URI(PropertiesUtil.getProperty("HK_WS_URL")), EStockType.HK);
+            hkWebsocketRunClient.connect();
+            hkWebsocketRunClient.setConnectionLostTimeout(0);
+            startHeartbeatThread(hkWebsocketRunClient);
+            retMap.put(EStockType.HK.getStockKey(), hkWebsocketRunClient);
         } catch (Exception e) {
-            log.error("usWebsocketRunClient 异常: {}", e.getMessage());
+            log.error("hkWebsocketRunClient 异常: {}", e.getMessage());
         }
         try {
-            MXWebsocketRunClient mxWebsocketRunClient = new MXWebsocketRunClient(new URI(PropertiesUtil.getProperty("MX_WS_URL")),EStockType.MX);
-            mxWebsocketRunClient.connect();
-            mxWebsocketRunClient.setConnectionLostTimeout(0);
-            startHeartbeatThread(mxWebsocketRunClient);
-            retMap.put(EStockType.MX.getStockKey(), mxWebsocketRunClient);
+            TWWebsocketRunClient twWebsocketRunClient = new TWWebsocketRunClient(new URI(PropertiesUtil.getProperty("TW_WS_URL")), EStockType.TW);
+            twWebsocketRunClient.connect();
+            twWebsocketRunClient.setConnectionLostTimeout(0);
+            startHeartbeatThread(twWebsocketRunClient);
+            retMap.put(EStockType.TW.getStockKey(), twWebsocketRunClient);
         } catch (Exception e) {
-            log.error("mxWebsocketRunClient 异常: {}", e.getMessage());
+            log.error("twWebsocketRunClient 异常: {}", e.getMessage());
         }
         return retMap;
     }
@@ -66,4 +66,4 @@
     }
 
 
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/nq/ws/WebsocketRunClient.java b/src/main/java/com/nq/ws/WebsocketRunClient.java
index 3274792..b0021de 100644
--- a/src/main/java/com/nq/ws/WebsocketRunClient.java
+++ b/src/main/java/com/nq/ws/WebsocketRunClient.java
@@ -64,10 +64,10 @@
     @Override
     public void onMessage(String message) {
         if (message.contains("身份验证成功") || message.contains("pong") || message.contains("身份验证失败") || message.contains("ws连接点只能有一个")) {
-            System.out.println("us" + message);
+            System.out.println("hk" + message);
             return;
         }
-        //System.out.println("us2" + message);
+        System.out.println("hk2" + message);
         Map<String, String> stringObjectMap = jsonToMap(message);
         StockRealTimeBean stockRealTimeBean = new StockRealTimeBean();
         stockRealTimeBean.setPid(stringObjectMap.get("Id").toString());
@@ -79,7 +79,7 @@
         stockRealTimeBean.setPc(stringObjectMap.get("Chg").toString());
         stockRealTimeBean.setPcp(stringObjectMap.get("ChgPct").toString()+"%");
         stockRealTimeBean.setTime(stringObjectMap.get("Time").toString());
-        RedisKeyUtil.setCacheRealTimeStock(EStockType.US,stockRealTimeBean);
+        RedisKeyUtil.setCacheRealTimeStock(EStockType.HK,stockRealTimeBean);
         ObjectMapper objectMapper = new ObjectMapper();
         try {
             if(!stockRealTimeBean.getPcp().contains("-")){
@@ -88,9 +88,9 @@
             String json = objectMapper.writeValueAsString(stockRealTimeBean);
             sendLoca(json);
             StockRealTimeBean stockDetailBean =  new Gson().fromJson(message, StockRealTimeBean.class);
-            RedisKeyUtil.setCacheRealTimeStock(EStockType.US,stockDetailBean);
+            RedisKeyUtil.setCacheRealTimeStock(EStockType.HK,stockDetailBean);
         } catch (JsonProcessingException e) {
-            log.error("websocket 美国股票 消息错误:{}", e.getMessage());
+            log.error("websocket 香港股票 消息错误:{}", e.getMessage());
         }
     }
 
@@ -102,12 +102,12 @@
 
     @Override
     public void onClose(int i, String s, boolean b) {
-        log.info("websocket 美国股票 关闭 {} ", i);
+        log.info("websocket 香港股票 关闭 {} ", i);
     }
 
     @Override
     public void onError(Exception e) {
-        log.info("websocket 美国股票 错误{}", e.getMessage());
+        log.info("websocket 香港股票 错误{}", e.getMessage());
     }
 
     public void sendLoca(String message) {
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 962a923..763aee3 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -44,22 +44,24 @@
 #US_WS_URL = ws://api-us-v2-ws.js-stock.top
 US_KEY = SIjHECiI3cIVfHXwsLsL
 
-HK_HTTP_API =
-HK_WS_URL =
-HK_KEY =
+HK_HTTP_API = http://api-hk.js-stock.top/
+HK_WS_URL = ws://api-hk-ws.js-stock.top
+HK_KEY = Ra98BDaCU8kqDQbJ9dK1
 
-JS_IN_HTTP_API =
-JS_IN_URL =
-JS_IN_KEY =
+JS_IN_HTTP_URL = http://api-in-pro.js-stock.top/
+#JS_IN_WS_URL = ws://api-in-pro-ws.js-stock.top
+JS_IN_KEY = xKChgi47AP1NMwMeYI3c
 
-TW_HTTP_API =
-TW_WS_URL =
-TW_KEY =
+TW_HTTP_API = http://api-tw.js-stock.top/
+TW_WS_URL = ws://api-tw-ws.js-stock.top
+TW_KEY = wgUxwQPf0XatK5Z3u3xU
 
 
 #默认首页显示指数code
 us_home_indices_code=15882,15881,16571
-mx_home_indices_code=535610327,535610374,535610333
+hk_home_indices_code=535606773,535606776,535606785
+in_home_indices_code=535582575,535582576,535582577
+tw_home_indices_code=535584911,535584912,535584922
 
 #?? ?? - ????
 admin.auth.email.subject=???? - ??????

--
Gitblit v1.9.3