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