From 61202ae3cb115ae13f3f646764c0f36f27f5392f Mon Sep 17 00:00:00 2001
From: zyy <zyy@email.com>
Date: Thu, 10 Jul 2025 17:19:58 +0800
Subject: [PATCH] 汇率管理

---
 src/main/java/com/nq/enums/EStockType.java                     |    2 
 src/main/java/com/nq/service/impl/StockServiceImpl.java        |    2 
 src/main/java/com/nq/service/impl/ExchangeRateServiceImpl.java |   91 ++++++++++++++++++
 src/main/java/com/nq/controller/echo/EChoController.java       |    2 
 src/main/java/com/nq/service/ExchangeRateService.java          |   25 +++++
 src/main/java/com/nq/pojo/ExchangeRate.java                    |   48 +++++++++
 src/main/java/com/nq/utils/task/stock/StockTask.java           |   10 ++
 src/main/java/com/nq/ws/MXWebsocketRunClient.java              |    4 
 src/main/java/com/nq/Repository/ExchangeRateRepository.java    |   12 ++
 src/main/java/com/nq/dao/ExchangeRateMapper.java               |    9 +
 src/main/java/com/nq/controller/ExchangeRateController.java    |   38 +++++++
 11 files changed, 238 insertions(+), 5 deletions(-)

diff --git a/src/main/java/com/nq/Repository/ExchangeRateRepository.java b/src/main/java/com/nq/Repository/ExchangeRateRepository.java
new file mode 100644
index 0000000..c826379
--- /dev/null
+++ b/src/main/java/com/nq/Repository/ExchangeRateRepository.java
@@ -0,0 +1,12 @@
+package com.nq.Repository;
+
+import com.nq.pojo.ExchangeRate;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.Optional;
+
+public interface ExchangeRateRepository extends JpaRepository<ExchangeRate, Long> {
+
+    Optional<ExchangeRate> findExchangeRateByCurrencyAndConversionCurrency(String currency, String conversionCurrency);
+
+}
diff --git a/src/main/java/com/nq/controller/ExchangeRateController.java b/src/main/java/com/nq/controller/ExchangeRateController.java
new file mode 100644
index 0000000..54bdb4c
--- /dev/null
+++ b/src/main/java/com/nq/controller/ExchangeRateController.java
@@ -0,0 +1,38 @@
+package com.nq.controller;
+
+import com.nq.common.ServerResponse;
+import com.nq.pojo.ExchangeRate;
+import com.nq.service.ExchangeRateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 汇率管理
+ */
+@Controller
+@RequestMapping({"/stock/rate"})
+public class ExchangeRateController {
+
+    @Autowired
+    ExchangeRateService exchangeRateService;
+
+    //查询汇率列表
+    @RequestMapping({"getInfo.do"})
+    @ResponseBody
+    public ServerResponse getInfo(@RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                  @RequestParam(value = "pageSize", defaultValue = "15") int pageSize) {
+        return exchangeRateService.getInfo(pageNum, pageSize);
+    }
+
+    //修改汇率
+    @RequestMapping({"updateRate.do"})
+    @ResponseBody
+    public ServerResponse updateRate(ExchangeRate model, HttpServletRequest request) {
+        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 a47b0c2..c28cc43 100644
--- a/src/main/java/com/nq/controller/echo/EChoController.java
+++ b/src/main/java/com/nq/controller/echo/EChoController.java
@@ -62,7 +62,7 @@
             }
         }
         User user = this.iUserService.getCurrentRefreshUser(request);
-        UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("MX", user.getId());
+        UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("MEX", user.getId());
         if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
             return ServerResponse.createByErrorMsg("请先缴清待补资金", request);
         }
diff --git a/src/main/java/com/nq/dao/ExchangeRateMapper.java b/src/main/java/com/nq/dao/ExchangeRateMapper.java
new file mode 100644
index 0000000..3495921
--- /dev/null
+++ b/src/main/java/com/nq/dao/ExchangeRateMapper.java
@@ -0,0 +1,9 @@
+package com.nq.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.nq.pojo.ExchangeRate;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ExchangeRateMapper extends BaseMapper<ExchangeRate>{
+}
diff --git a/src/main/java/com/nq/enums/EStockType.java b/src/main/java/com/nq/enums/EStockType.java
index e54303b..73dde29 100644
--- a/src/main/java/com/nq/enums/EStockType.java
+++ b/src/main/java/com/nq/enums/EStockType.java
@@ -17,7 +17,7 @@
 //    MAS("MAS","马来西亚股票","42",PropertiesUtil.getProperty("MAS_HTTP_API"),PropertiesUtil.getProperty("MAS_KEY"),"MYR","RM"),
 //
 //    IN("IN","印度股票","14", PropertiesUtil.getProperty("JS_IN_HTTP_URL"),PropertiesUtil.getProperty("JS_IN_KEY"),"INR","₹"),
-    MX("MX","墨西哥股票","7",PropertiesUtil.getProperty("MX_HTTP_API"),PropertiesUtil.getProperty("MX_KEY"),"MXN","MXN$");
+    MX("MEX","墨西哥股票","7",PropertiesUtil.getProperty("MX_HTTP_API"),PropertiesUtil.getProperty("MX_KEY"),"MXN","MXN$");
 
 //    TH("TH","泰国股票","41",PropertiesUtil.getProperty("TH_HTTP_API"),PropertiesUtil.getProperty("TH_KEY")),
 //    HG("HG","韩国股票","11",PropertiesUtil.getProperty("HG_HTTP_API"),PropertiesUtil.getProperty("HG_KEY")),
diff --git a/src/main/java/com/nq/pojo/ExchangeRate.java b/src/main/java/com/nq/pojo/ExchangeRate.java
new file mode 100644
index 0000000..17407aa
--- /dev/null
+++ b/src/main/java/com/nq/pojo/ExchangeRate.java
@@ -0,0 +1,48 @@
+package com.nq.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 汇率表
+ */
+@Data
+@TableName("exchange_rate")
+@Entity
+public class ExchangeRate{
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+    /**
+     * 汇率
+     */
+    private BigDecimal rata;
+    /**
+     * 原始货币
+     */
+    private String currency;
+
+    /**
+     * 转换货币
+     */
+    private String conversionCurrency;
+
+    /**
+     * 修改时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/nq/service/ExchangeRateService.java b/src/main/java/com/nq/service/ExchangeRateService.java
new file mode 100644
index 0000000..ff08f01
--- /dev/null
+++ b/src/main/java/com/nq/service/ExchangeRateService.java
@@ -0,0 +1,25 @@
+package com.nq.service;
+
+import com.nq.common.ServerResponse;
+import com.nq.pojo.ExchangeRate;
+
+import javax.servlet.http.HttpServletRequest;
+
+public interface ExchangeRateService {
+
+    /**
+     * 获取列表
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    ServerResponse getInfo(Integer pageNum, Integer pageSize);
+
+    /**
+     * 新增或编辑
+     * @param model
+     * @param request
+     * @return
+     */
+    ServerResponse updateRate(ExchangeRate model, HttpServletRequest request);
+}
diff --git a/src/main/java/com/nq/service/impl/ExchangeRateServiceImpl.java b/src/main/java/com/nq/service/impl/ExchangeRateServiceImpl.java
new file mode 100644
index 0000000..4c6412d
--- /dev/null
+++ b/src/main/java/com/nq/service/impl/ExchangeRateServiceImpl.java
@@ -0,0 +1,91 @@
+package com.nq.service.impl;
+
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.nq.Repository.ExchangeRateRepository;
+import com.nq.common.ServerResponse;
+import com.nq.dao.ExchangeRateMapper;
+import com.nq.enums.EStockType;
+import com.nq.pojo.ExchangeRate;
+import com.nq.service.ExchangeRateService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class ExchangeRateServiceImpl implements ExchangeRateService {
+
+    private static final Logger log = LoggerFactory.getLogger(ExchangeRateServiceImpl.class);
+
+    @Autowired
+    ExchangeRateRepository exchangeRateRepository;
+
+    @Autowired
+    ExchangeRateMapper exchangeRateMapper;
+
+    @Override
+    public ServerResponse getInfo(Integer pageNum, Integer pageSize) {
+        try {
+            PageHelper.startPage(pageNum, pageSize);
+            List<ExchangeRate> exchangeRateList = exchangeRateMapper.selectList(null);
+            // 获取分页信息
+            PageInfo<ExchangeRate> pageInfo = new PageInfo<>(exchangeRateList);
+            return ServerResponse.createBySuccess(pageInfo);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return ServerResponse.createByError();
+    }
+
+    @Override
+    public ServerResponse updateRate(ExchangeRate model, HttpServletRequest request) {
+        try {
+            if (model == null) {
+                return ServerResponse.createByErrorMsg("model is null");
+            }
+            if (model.getRata() == null || model.getCurrency().isEmpty() || model.getConversionCurrency().isEmpty()) {
+                return ServerResponse.createByErrorMsg("请输入货币和汇率参数不能为空");
+            }
+            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 (!model.getConversionCurrency().equals(EStockType.US.getSymbol()) && !model.getConversionCurrency().equals(EStockType.MX.getSymbol())) {
+                return ServerResponse.createByErrorMsg("转换货币只能为:" + EStockType.US.getSymbol() + " 或 " +  EStockType.MX.getSymbol());
+            }
+            //新增
+            if (model.getId() == null) {
+                //查询该货币汇率是否存在
+                ExchangeRate exchangeRate = exchangeRateRepository.findExchangeRateByCurrencyAndConversionCurrency(model.getCurrency(),
+                        model.getConversionCurrency()).orElse(null);
+                if (exchangeRate != null) {
+                    return ServerResponse.createByErrorMsg("当前货币转换已存在");
+                }
+                model.setUpdateTime(new Date());
+                model = exchangeRateRepository.saveAndFlush(model);
+            } else {    //修改
+                ExchangeRate exchangeRate = exchangeRateRepository.findById(model.getId()).orElse(null);
+                if (exchangeRate  == null) {
+                    return ServerResponse.createByErrorMsg("修改失败,记录不存在!");
+                }
+                //只能修改汇率
+                exchangeRate.setRata(model.getRata());
+                exchangeRate.setUpdateTime(new Date());
+                model = exchangeRateRepository.saveAndFlush(exchangeRate);
+            }
+            model = exchangeRateRepository.saveAndFlush(model);
+            return ServerResponse.createBySuccess("操作成功", model);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return ServerResponse.createByError();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/nq/service/impl/StockServiceImpl.java b/src/main/java/com/nq/service/impl/StockServiceImpl.java
index 7c601bd..80f6722 100644
--- a/src/main/java/com/nq/service/impl/StockServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/StockServiceImpl.java
@@ -110,7 +110,7 @@
         List<Stock> stockList = new ArrayList<>();
         if (stockType.equals("99")) {
             PageHelper.startPage(pageNum, pageSize);
-            stockList.addAll(stockMapper.findZtStockListByKeyWords(keyWords, stockPlate, "MX", Integer.valueOf(0)));
+            stockList.addAll(stockMapper.findZtStockListByKeyWords(keyWords, stockPlate, "MEX", Integer.valueOf(0)));
         } else if (stockType.equals("100")) {
             User user = iUserService.getCurrentRefreshUser(request);
             if (user == null) {
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 ec13638..4665c3b 100644
--- a/src/main/java/com/nq/utils/task/stock/StockTask.java
+++ b/src/main/java/com/nq/utils/task/stock/StockTask.java
@@ -9,6 +9,7 @@
 import com.nq.dao.UserPositionMapper;
 import com.nq.enums.EStockType;
 import com.nq.pojo.*;
+import com.nq.service.ExchangeRateService;
 import com.nq.service.IMandatoryLiquidationService;
 import com.nq.service.IStockService;
 import com.nq.service.IUserPositionService;
@@ -25,6 +26,7 @@
 import org.springframework.stereotype.Component;
 
 import java.lang.reflect.Type;
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -58,6 +60,8 @@
     private ThreadPoolTaskExecutor taskExecutor;
     @Autowired
     private StockServiceImpl iStockService;
+    @Autowired
+    private ExchangeRateService exchangeRateService;
 
     /**
      * test
@@ -65,6 +69,12 @@
     //@Scheduled(cron = "0 0/1 * * * ?")
     @Scheduled(cron = "*/5 * * * * *")
     public void test() {
+        /*ExchangeRate model = new ExchangeRate();
+        model.setCurrency("MXN");
+        model.setConversionCurrency("USD");
+        model.setRata(BigDecimal.valueOf(0.0520));
+        exchangeRateService.updateRate(model,null);*/
+
         //iStockService.getStockByType(1, 20, "desc","st" , "US", null);
         //istockService.getIndicesList("US");
         //istockService.getIndicesAndKData("15882", "US");
diff --git a/src/main/java/com/nq/ws/MXWebsocketRunClient.java b/src/main/java/com/nq/ws/MXWebsocketRunClient.java
index c7f540c..135a63f 100644
--- a/src/main/java/com/nq/ws/MXWebsocketRunClient.java
+++ b/src/main/java/com/nq/ws/MXWebsocketRunClient.java
@@ -61,10 +61,10 @@
     @Override
     public void onMessage(String message) {
         if (message.contains("身份验证成功") || message.contains("pong") || message.contains("身份验证失败") || message.contains("ws连接点只能有一个")) {
-            System.out.println("mx" + message);
+            System.out.println("mex" + message);
             return;
         }
-        System.out.println("mx2" + message);
+        System.out.println("mex2" + message);
         Map<String, String> stringObjectMap = jsonToMap(message);
         StockRealTimeBean stockRealTimeBean = new StockRealTimeBean();
         stockRealTimeBean.setPid(stringObjectMap.get("Id").toString());

--
Gitblit v1.9.3