From 96530cce25ae17962293da17a8c1c162f9a196a9 Mon Sep 17 00:00:00 2001
From: zyy <zyy@email.com>
Date: Fri, 11 Jul 2025 18:26:47 +0800
Subject: [PATCH] 后台AI产品交易

---
 /dev/null                                                                |   38 -------
 src/main/java/com/nq/controller/backend/AdminStockAiController.java      |   47 +++++++++
 src/main/java/com/nq/controller/backend/AdminExchangeRateController.java |   55 +++++++++++
 src/main/java/com/nq/service/impl/ExchangeRateServiceImpl.java           |   16 ---
 src/main/java/com/nq/service/IStockAiService.java                        |    4 
 src/main/java/com/nq/dao/StockAiMapper.java                              |    6 +
 src/main/java/com/nq/vo/stock/StockAiVO.java                             |   15 +++
 src/main/java/com/nq/service/impl/StockAiServiceImpl.java                |   67 +++++++++++++
 src/main/resources/mapper/StockAiMapper.xml                              |   26 +++++
 9 files changed, 219 insertions(+), 55 deletions(-)

diff --git a/src/main/java/com/nq/controller/ExchangeRateController.java b/src/main/java/com/nq/controller/ExchangeRateController.java
deleted file mode 100644
index 54bdb4c..0000000
--- a/src/main/java/com/nq/controller/ExchangeRateController.java
+++ /dev/null
@@ -1,38 +0,0 @@
-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/backend/AdminExchangeRateController.java b/src/main/java/com/nq/controller/backend/AdminExchangeRateController.java
new file mode 100644
index 0000000..e4f0407
--- /dev/null
+++ b/src/main/java/com/nq/controller/backend/AdminExchangeRateController.java
@@ -0,0 +1,55 @@
+package com.nq.controller.backend;
+
+import com.nq.common.ServerResponse;
+import com.nq.enums.EStockType;
+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({"/admin/rate"})
+public class AdminExchangeRateController {
+
+    @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({"editRate.do"})
+    @ResponseBody
+    public ServerResponse editRate(ExchangeRate model, HttpServletRequest request) {
+        if (model == null) {
+            return ServerResponse.createByErrorMsg("editRate 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());
+        }
+        return exchangeRateService.updateRate(model, request);
+    }
+}
diff --git a/src/main/java/com/nq/controller/backend/AdminStockAiController.java b/src/main/java/com/nq/controller/backend/AdminStockAiController.java
new file mode 100644
index 0000000..1c20e77
--- /dev/null
+++ b/src/main/java/com/nq/controller/backend/AdminStockAiController.java
@@ -0,0 +1,47 @@
+ package com.nq.controller.backend;
+
+ import com.nq.common.ServerResponse;
+ import com.nq.pojo.Stock;
+ import com.nq.pojo.StockAI;
+ import com.nq.service.IStockAiService;
+ 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;
+
+ /**
+  * 后台AI产品api
+  */
+ @Controller
+ @RequestMapping({"/admin/stockAi/"})
+ public class AdminStockAiController {
+
+     @Autowired
+     IStockAiService stockAiService;
+     /**
+      * 获取ai交易产品列表
+      * @return
+      */
+     @RequestMapping("getStockAiList.do")
+     @ResponseBody
+     public ServerResponse getStockAiList(@RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                          @RequestParam(value = "pageSize", defaultValue = "5") int pageSize,
+                                          @RequestParam(value = "stockType") String stockType,
+                                          @RequestParam(value = "status") String status,
+                                          @RequestParam(value = "name") String name)   {
+         return stockAiService.getAdminStockAiList(pageNum, pageSize, stockType, status, name);
+     }
+
+     //修改票信息
+     @RequestMapping({"editStockAi.do"})
+     @ResponseBody
+     public ServerResponse editStockAi(StockAI model) {
+
+         return stockAiService.editStockAi(model);
+     }
+
+
+ }
\ No newline at end of file
diff --git a/src/main/java/com/nq/dao/StockAiMapper.java b/src/main/java/com/nq/dao/StockAiMapper.java
index 0d4429c..fdf3659 100644
--- a/src/main/java/com/nq/dao/StockAiMapper.java
+++ b/src/main/java/com/nq/dao/StockAiMapper.java
@@ -2,9 +2,15 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.nq.pojo.StockAI;
+import com.nq.vo.stock.StockAiVO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 @Mapper
 public interface StockAiMapper extends BaseMapper<StockAI> {
 
+    List<StockAiVO> getStockAiList(@Param("stockType") String stockType, @Param("status") String status, @Param("name") String name);
+
 }
\ No newline at end of file
diff --git a/src/main/java/com/nq/service/IStockAiService.java b/src/main/java/com/nq/service/IStockAiService.java
index ae18d6a..0ab1052 100644
--- a/src/main/java/com/nq/service/IStockAiService.java
+++ b/src/main/java/com/nq/service/IStockAiService.java
@@ -1,6 +1,7 @@
 package com.nq.service;
 
 import com.nq.common.ServerResponse;
+import com.nq.pojo.StockAI;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.servlet.http.HttpServletRequest;
@@ -14,4 +15,7 @@
 
   ServerResponse getStockAiOrderList(Integer pageNum, Integer pageSize, String status, HttpServletRequest request);
 
+  ServerResponse getAdminStockAiList(Integer pageNum, Integer pageSize, String stockType, String status, String name);
+
+  ServerResponse editStockAi(StockAI model);
 }
diff --git a/src/main/java/com/nq/service/impl/ExchangeRateServiceImpl.java b/src/main/java/com/nq/service/impl/ExchangeRateServiceImpl.java
index 4c6412d..d703145 100644
--- a/src/main/java/com/nq/service/impl/ExchangeRateServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/ExchangeRateServiceImpl.java
@@ -45,22 +45,6 @@
     @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) {
                 //查询该货币汇率是否存在
diff --git a/src/main/java/com/nq/service/impl/StockAiServiceImpl.java b/src/main/java/com/nq/service/impl/StockAiServiceImpl.java
index b671859..ae549fa 100644
--- a/src/main/java/com/nq/service/impl/StockAiServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/StockAiServiceImpl.java
@@ -10,6 +10,7 @@
 import com.nq.enums.*;
 import com.nq.pojo.*;
 import com.nq.service.*;
+import com.nq.vo.stock.StockAiVO;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -48,7 +49,8 @@
     public ServerResponse getStockAiList(Integer pageNum, Integer pageSize) {
         try {
             PageHelper.startPage(pageNum, pageSize);
-            List<StockAI> stockAiList = stockAiMapper.selectList(new QueryWrapper<StockAI>().eq("status", EStockAIStatus.online.getValue()));
+            List<StockAI> stockAiList = stockAiMapper.selectList(new QueryWrapper<StockAI>()
+                    .eq("status", EStockAIStatus.online.getValue()));
             // 获取分页信息
             PageInfo<StockAI> pageInfo = new PageInfo<>(stockAiList);
             return ServerResponse.createBySuccess(pageInfo);
@@ -158,4 +160,67 @@
         }
         return ServerResponse.createByError();
     }
+
+    @Override
+    public ServerResponse getAdminStockAiList(Integer pageNum, Integer pageSize, String stockType, String status, String name) {
+        try {
+            PageHelper.startPage(pageNum, pageSize);
+            List<StockAiVO> stockAiList = stockAiMapper.getStockAiList(stockType, status, name);
+            // 获取分页信息
+            PageInfo<StockAiVO> pageInfo = new PageInfo<>(stockAiList);
+
+            if (!pageInfo.getList().isEmpty()) {
+                List<StockAiVO> newStockAiList = pageInfo.getList();
+                newStockAiList.forEach(stockAiVO -> {
+                    EStockType eStockType = EStockType.getEStockTypeByCode(stockAiVO.getStockType());
+                    stockAiVO.setStockTypeName(eStockType.getSymbol1());
+                    stockAiVO.setSymbol(stockType);
+                });
+                pageInfo.setList(newStockAiList);
+            }
+
+
+            return ServerResponse.createBySuccess(pageInfo);
+        } catch (Exception ex) {
+            log.error("StockAiService getAdminStockAiList error", ex);
+        }
+        return ServerResponse.createByError();
+    }
+
+    /**
+     * 新增或修改
+     * @param model
+     * @return
+     */
+    @Override
+    public ServerResponse editStockAi(StockAI model) {
+        try {
+            if (model == null) {
+                return ServerResponse.createByErrorMsg("editStockAi model is null");
+            }
+            if (model.getStockType().isEmpty() || model.getStockName().isEmpty() || model.getMinPrice() == null
+                || model.getSuccessRate() == null || model.getExpectedEarning() == null || model.getStatus().isEmpty()) {
+                return ServerResponse.createByErrorMsg("请完善必填信息");
+            }
+            if (!model.getStockType().equals(EStockType.US.getCode()) && !model.getStockType().equals(EStockType.MX.getCode())) {
+                return ServerResponse.createByErrorMsg("只能选择美股或墨西哥股");
+            }
+            //新增
+            if (model.getId() == null) {
+                //查询是否存在
+                StockAI stockAI = stockAiMapper.selectOne(new QueryWrapper<StockAI>().eq("stock_name", model.getStockName()));
+                if (stockAI != null) {
+                    return ServerResponse.createByErrorMsg("当前股票已添加");
+                }
+                model.setCreateDate(new Date());
+                stockAiMapper.insert(model);
+            } else {    //修改
+                stockAiMapper.updateById(model);
+            }
+            return ServerResponse.createBySuccess("操作成功");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return ServerResponse.createByError();
+    }
 }
diff --git a/src/main/java/com/nq/vo/stock/StockAiVO.java b/src/main/java/com/nq/vo/stock/StockAiVO.java
new file mode 100644
index 0000000..12eeed3
--- /dev/null
+++ b/src/main/java/com/nq/vo/stock/StockAiVO.java
@@ -0,0 +1,15 @@
+package com.nq.vo.stock;
+
+import com.nq.pojo.StockAI;
+import lombok.Data;
+
+@Data
+public class StockAiVO extends StockAI {
+
+    //股票类型名
+    private String stockTypeName;
+    //货币符号
+    private String symbol;
+
+}
+
diff --git a/src/main/resources/mapper/StockAiMapper.xml b/src/main/resources/mapper/StockAiMapper.xml
new file mode 100644
index 0000000..4c41451
--- /dev/null
+++ b/src/main/resources/mapper/StockAiMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.nq.dao.StockAiMapper" >
+
+  <sql id="Base_Column_List" >
+    id, stock_type, stock_name, min_price, success_rate, expected_earning, cycle, status, create_date
+  </sql>
+
+  <select id="getStockAiList" resultType="com.nq.vo.stock.StockAiVO">
+    SELECT
+    <include refid="Base_Column_List" />
+    from stock_ai
+    <where>
+      <if test="stockType != null and stockType != ''">
+        and stock_type = #{stockType}
+      </if>
+      <if test="status != null and status != ''">
+        and status = #{status}
+      </if>
+      <if test="name != null and name != ''">
+        and stock_name like concat('%',#{name},'%')
+      </if>
+    </where>
+    ORDER BY create_date DESC
+  </select>
+</mapper>

--
Gitblit v1.9.3