Explorar el Código

超短池与强势池修正

Zhangbw hace 3 meses
padre
commit
dea4ac60f0

+ 34 - 0
src/main/java/com/yingpai/gupiao/controller/StockPoolController.java

@@ -0,0 +1,34 @@
+package com.yingpai.gupiao.controller;
+
+import com.yingpai.gupiao.domain.vo.Result;
+import com.yingpai.gupiao.domain.vo.StockPoolVO;
+import com.yingpai.gupiao.service.StockPoolService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 股票池控制器(小程序端)
+ */
+@RestController
+@RequestMapping("/v1/stock/pool")
+@RequiredArgsConstructor
+public class StockPoolController {
+    
+    private final StockPoolService stockPoolService;
+    
+    /**
+     * 获取股票池列表
+     * @param poolType 池类型:1-超短池,2-强势池
+     */
+    @GetMapping("/list")
+    public Result<List<StockPoolVO>> getPoolStocks(@RequestParam("poolType") Integer poolType) {
+        if (poolType == null || (poolType != 1 && poolType != 2)) {
+            return Result.error(400, "池类型无效,1=超短池,2=强势池");
+        }
+        
+        List<StockPoolVO> stocks = stockPoolService.getPoolStocks(poolType);
+        return Result.success(stocks);
+    }
+}

+ 4 - 0
src/main/java/com/yingpai/gupiao/controller/UserStockController.java

@@ -48,6 +48,10 @@ public class UserStockController {
             return Result.error(400, "股票代码不能为空");
             return Result.error(400, "股票代码不能为空");
         }
         }
         
         
+        if (dto.getPoolType() == null || (dto.getPoolType() != 1 && dto.getPoolType() != 2)) {
+            return Result.error(400, "池类型无效,1=超短池,2=强势池");
+        }
+        
         boolean success = userStockService.addStock(userId, dto);
         boolean success = userStockService.addStock(userId, dto);
         if (success) {
         if (success) {
             return Result.success(true);
             return Result.success(true);

+ 5 - 0
src/main/java/com/yingpai/gupiao/domain/dto/AddUserStockDTO.java

@@ -18,6 +18,11 @@ public class AddUserStockDTO {
      */
      */
     private String stockName;
     private String stockName;
     
     
+    /**
+     * 来源池类型:1-超短池,2-强势池
+     */
+    private Integer poolType;
+    
     /**
     /**
      * 当前价格
      * 当前价格
      */
      */

+ 27 - 12
src/main/java/com/yingpai/gupiao/domain/po/StockInfo.java

@@ -3,35 +3,50 @@ package com.yingpai.gupiao.domain.po;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
-import lombok.NoArgsConstructor;
 
 
+import java.io.Serial;
+import java.io.Serializable;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 
 
 /**
 /**
- * 对应 MySQL 表 stock_info
+ * 股票信息实体类
  */
  */
 @Data
 @Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
 @TableName("stock_info")
 @TableName("stock_info")
-public class StockInfo {
+public class StockInfo implements Serializable {
 
 
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 股票ID
+     */
     @TableId(type = IdType.AUTO)
     @TableId(type = IdType.AUTO)
     private Long id;
     private Long id;
 
 
+    /**
+     * 股票代码
+     */
     private String stockCode;
     private String stockCode;
 
 
+    /**
+     * 股票名称
+     */
     private String stockName;
     private String stockName;
 
 
+    /**
+     * 市场代码 SH/SZ
+     */
     private String market;
     private String market;
 
 
-    private LocalDateTime createdAt;
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
 
 
-    private LocalDateTime updatedAt;
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
 }
 }
-
-

+ 72 - 0
src/main/java/com/yingpai/gupiao/domain/po/StockPool.java

@@ -0,0 +1,72 @@
+package com.yingpai.gupiao.domain.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * 股票池实体类
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("stock_pool")
+public class StockPool {
+    
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    
+    /**
+     * 股票代码
+     */
+    private String stockCode;
+    
+    /**
+     * 股票名称
+     */
+    private String stockName;
+    
+    /**
+     * 池类型:1-超短池,2-强势池
+     */
+    private Integer poolType;
+    
+    /**
+     * 加入时的价格
+     */
+    private BigDecimal addPrice;
+    
+    /**
+     * 加入日期
+     */
+    private LocalDate addDate;
+    
+    /**
+     * 状态:1-有效,0-已移除
+     */
+    private Integer status;
+    
+    /**
+     * 操作管理员ID
+     */
+    private Long adminId;
+    
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+    
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+}

+ 6 - 1
src/main/java/com/yingpai/gupiao/domain/po/UserStock.java

@@ -19,7 +19,7 @@ import java.time.LocalDateTime;
 @Builder
 @Builder
 @NoArgsConstructor
 @NoArgsConstructor
 @AllArgsConstructor
 @AllArgsConstructor
-@TableName("user_stock")
+@TableName("user_pool_stock")
 public class UserStock {
 public class UserStock {
     
     
     @TableId(type = IdType.AUTO)
     @TableId(type = IdType.AUTO)
@@ -40,6 +40,11 @@ public class UserStock {
      */
      */
     private String stockName;
     private String stockName;
     
     
+    /**
+     * 来源池类型:1-超短池,2-强势池
+     */
+    private Integer poolType;
+    
     /**
     /**
      * 加入时的价格
      * 加入时的价格
      */
      */

+ 36 - 0
src/main/java/com/yingpai/gupiao/domain/vo/StockPoolVO.java

@@ -0,0 +1,36 @@
+package com.yingpai.gupiao.domain.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 股票池VO
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class StockPoolVO {
+    
+    /**
+     * 股票代码
+     */
+    private String code;
+    
+    /**
+     * 股票名称
+     */
+    private String name;
+    
+    /**
+     * 加入时的价格
+     */
+    private String addPrice;
+    
+    /**
+     * 加入日期
+     */
+    private String addDate;
+}

+ 10 - 0
src/main/java/com/yingpai/gupiao/domain/vo/UserStockVO.java

@@ -27,6 +27,16 @@ public class UserStockVO {
      */
      */
     private String stockName;
     private String stockName;
     
     
+    /**
+     * 来源池类型:1-超短池,2-强势池
+     */
+    private Integer poolType;
+    
+    /**
+     * 来源池名称
+     */
+    private String poolTypeName;
+    
     /**
     /**
      * 加入时的价格
      * 加入时的价格
      */
      */

+ 3 - 2
src/main/java/com/yingpai/gupiao/mapper/StockInfoMapper.java

@@ -4,8 +4,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yingpai.gupiao.domain.po.StockInfo;
 import com.yingpai.gupiao.domain.po.StockInfo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
 
 
+/**
+ * 股票信息Mapper
+ */
 @Mapper
 @Mapper
 public interface StockInfoMapper extends BaseMapper<StockInfo> {
 public interface StockInfoMapper extends BaseMapper<StockInfo> {
 }
 }
-
-

+ 12 - 0
src/main/java/com/yingpai/gupiao/mapper/StockPoolMapper.java

@@ -0,0 +1,12 @@
+package com.yingpai.gupiao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yingpai.gupiao.domain.po.StockPool;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 股票池Mapper
+ */
+@Mapper
+public interface StockPoolMapper extends BaseMapper<StockPool> {
+}

+ 18 - 0
src/main/java/com/yingpai/gupiao/service/StockPoolService.java

@@ -0,0 +1,18 @@
+package com.yingpai.gupiao.service;
+
+import com.yingpai.gupiao.domain.vo.StockPoolVO;
+
+import java.util.List;
+
+/**
+ * 股票池服务接口
+ */
+public interface StockPoolService {
+    
+    /**
+     * 获取股票池列表
+     * @param poolType 池类型:1-超短池,2-强势池
+     * @return 股票列表
+     */
+    List<StockPoolVO> getPoolStocks(Integer poolType);
+}

+ 53 - 0
src/main/java/com/yingpai/gupiao/service/impl/StockPoolServiceImpl.java

@@ -0,0 +1,53 @@
+package com.yingpai.gupiao.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yingpai.gupiao.domain.po.StockPool;
+import com.yingpai.gupiao.domain.vo.StockPoolVO;
+import com.yingpai.gupiao.mapper.StockPoolMapper;
+import com.yingpai.gupiao.service.StockPoolService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 股票池服务实现
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class StockPoolServiceImpl implements StockPoolService {
+    
+    private final StockPoolMapper stockPoolMapper;
+    
+    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    
+    @Override
+    public List<StockPoolVO> getPoolStocks(Integer poolType) {
+        log.info("[获取股票池] poolType={}", poolType);
+        
+        LambdaQueryWrapper<StockPool> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StockPool::getPoolType, poolType)
+               .eq(StockPool::getStatus, 1)  // 只查询有效的
+               .orderByDesc(StockPool::getAddDate);
+        
+        List<StockPool> stocks = stockPoolMapper.selectList(wrapper);
+        log.info("[获取股票池] 查询到 {} 条记录", stocks.size());
+        
+        List<StockPoolVO> result = new ArrayList<>();
+        for (StockPool stock : stocks) {
+            StockPoolVO vo = StockPoolVO.builder()
+                    .code(stock.getStockCode())
+                    .name(stock.getStockName())
+                    .addPrice(stock.getAddPrice() != null ? stock.getAddPrice().toString() : "")
+                    .addDate(stock.getAddDate() != null ? stock.getAddDate().format(DATE_FORMATTER) : "")
+                    .build();
+            result.add(vo);
+        }
+        
+        return result;
+    }
+}

+ 18 - 2
src/main/java/com/yingpai/gupiao/service/impl/UserStockServiceImpl.java

@@ -46,6 +46,8 @@ public class UserStockServiceImpl implements UserStockService {
             UserStockVO vo = UserStockVO.builder()
             UserStockVO vo = UserStockVO.builder()
                     .stockCode(stock.getStockCode())
                     .stockCode(stock.getStockCode())
                     .stockName(stock.getStockName())
                     .stockName(stock.getStockName())
+                    .poolType(stock.getPoolType())
+                    .poolTypeName(stock.getPoolType() == 1 ? "超短池" : "强势池")
                     .addPrice(stock.getAddPrice().toString())
                     .addPrice(stock.getAddPrice().toString())
                     .addDate(stock.getAddDate().format(DATE_FORMATTER))
                     .addDate(stock.getAddDate().format(DATE_FORMATTER))
                     .build();
                     .build();
@@ -57,9 +59,10 @@ public class UserStockServiceImpl implements UserStockService {
     
     
     @Override
     @Override
     public boolean addStock(Long userId, AddUserStockDTO dto) {
     public boolean addStock(Long userId, AddUserStockDTO dto) {
-        log.info("[添加股票] userId={}, stockCode={}, stockName={}", userId, dto.getStockCode(), dto.getStockName());
+        log.info("[添加股票] userId={}, stockCode={}, stockName={}, poolType={}", 
+                userId, dto.getStockCode(), dto.getStockName(), dto.getPoolType());
         
         
-        // 检查是否已存在
+        // 检查是否已存在(同一用户、同一股票,不区分池类型)
         if (isStockAdded(userId, dto.getStockCode())) {
         if (isStockAdded(userId, dto.getStockCode())) {
             log.info("[添加股票] 股票已存在,跳过添加");
             log.info("[添加股票] 股票已存在,跳过添加");
             return false;
             return false;
@@ -78,6 +81,7 @@ public class UserStockServiceImpl implements UserStockService {
                 .userId(userId)
                 .userId(userId)
                 .stockCode(dto.getStockCode())
                 .stockCode(dto.getStockCode())
                 .stockName(dto.getStockName())
                 .stockName(dto.getStockName())
+                .poolType(dto.getPoolType())
                 .addPrice(price)
                 .addPrice(price)
                 .addDate(LocalDate.now())
                 .addDate(LocalDate.now())
                 .build();
                 .build();
@@ -104,4 +108,16 @@ public class UserStockServiceImpl implements UserStockService {
         
         
         return userStockMapper.selectCount(wrapper) > 0;
         return userStockMapper.selectCount(wrapper) > 0;
     }
     }
+    
+    /**
+     * 检查指定池类型的股票是否已添加
+     */
+    private boolean isStockAdded(Long userId, String stockCode, Integer poolType) {
+        LambdaQueryWrapper<UserStock> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(UserStock::getUserId, userId)
+               .eq(UserStock::getStockCode, stockCode)
+               .eq(UserStock::getPoolType, poolType);
+        
+        return userStockMapper.selectCount(wrapper) > 0;
+    }
 }
 }

+ 0 - 1
src/main/java/com/yingpai/gupiao/util/UserContext.java

@@ -1,7 +1,6 @@
 package com.yingpai.gupiao.util;
 package com.yingpai.gupiao.util;
 
 
 /**
 /**
- * 用户上下文工具类
  * 使用 ThreadLocal 存储当前请求的用户ID
  * 使用 ThreadLocal 存储当前请求的用户ID
  */
  */
 public class UserContext {
 public class UserContext {

+ 45 - 0
src/main/resources/sql/stock_pool.sql

@@ -0,0 +1,45 @@
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- =====================================================
+-- 股票池表 - 管理员将股票加入超短池/强势池
+-- 关联 stock_info 表获取股票基础信息
+-- =====================================================
+CREATE TABLE IF NOT EXISTS `stock_pool` (
+    `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+    `stock_code` VARCHAR(10) NOT NULL COMMENT '股票代码',
+    `stock_name` VARCHAR(50) NOT NULL COMMENT '股票名称',
+    `pool_type` TINYINT NOT NULL COMMENT '池类型:1-超短池,2-强势池',
+    `add_price` DECIMAL(10, 2) NOT NULL COMMENT '加入时的价格',
+    `add_date` DATE NOT NULL COMMENT '加入日期',
+    `status` TINYINT DEFAULT 1 COMMENT '状态:1-有效,0-已移除',
+    `admin_id` BIGINT DEFAULT NULL COMMENT '操作管理员ID',
+    `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_pool_type` (`pool_type`),
+    KEY `idx_add_date` (`add_date`),
+    KEY `idx_stock_code` (`stock_code`),
+    KEY `idx_status` (`status`),
+    UNIQUE KEY `uk_stock_pool_type` (`stock_code`, `pool_type`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='股票池表(超短池/强势池)';
+
+-- =====================================================
+-- 用户自选股票表 - 用户添加的自选股票
+-- =====================================================
+CREATE TABLE IF NOT EXISTS `user_pool_stock` (
+    `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+    `user_id` BIGINT NOT NULL COMMENT '用户ID',
+    `stock_code` VARCHAR(10) NOT NULL COMMENT '股票代码',
+    `stock_name` VARCHAR(50) NOT NULL COMMENT '股票名称',
+    `add_price` DECIMAL(10, 2) DEFAULT 0 COMMENT '加入时的价格',
+    `add_date` DATE NOT NULL COMMENT '加入日期',
+    `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_user_id` (`user_id`),
+    KEY `idx_stock_code` (`stock_code`),
+    UNIQUE KEY `uk_user_stock` (`user_id`, `stock_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户自选股票表';
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 19 - 0
src/main/resources/sql/user_pool_stock.sql

@@ -0,0 +1,19 @@
+-- =====================================================
+-- 用户自选股票表 - 用户从股票池添加的自选股票
+-- =====================================================
+CREATE TABLE IF NOT EXISTS `user_pool_stock` (
+    `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+    `user_id` BIGINT NOT NULL COMMENT '用户ID',
+    `stock_code` VARCHAR(10) NOT NULL COMMENT '股票代码',
+    `stock_name` VARCHAR(50) NOT NULL COMMENT '股票名称',
+    `pool_type` TINYINT NOT NULL COMMENT '来源池类型:1-超短池,2-强势池',
+    `add_price` DECIMAL(10, 2) DEFAULT 0 COMMENT '加入时的价格',
+    `add_date` DATE NOT NULL COMMENT '加入日期',
+    `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_user_id` (`user_id`),
+    KEY `idx_stock_code` (`stock_code`),
+    KEY `idx_pool_type` (`pool_type`),
+    UNIQUE KEY `uk_user_stock` (`user_id`, `stock_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户自选股票表';

+ 0 - 14
src/main/resources/sql/user_stock.sql

@@ -1,14 +0,0 @@
--- 用户自选股票表
-CREATE TABLE IF NOT EXISTS `user_stock` (
-    `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
-    `user_id` BIGINT NOT NULL COMMENT '用户ID',
-    `stock_code` VARCHAR(10) NOT NULL COMMENT '股票代码',
-    `stock_name` VARCHAR(50) NOT NULL COMMENT '股票名称',
-    `add_price` DECIMAL(10, 2) NOT NULL COMMENT '加入时的价格',
-    `add_date` DATE NOT NULL COMMENT '加入日期',
-    `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
-    `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
-    PRIMARY KEY (`id`),
-    UNIQUE KEY `uk_user_stock` (`user_id`, `stock_code`),
-    KEY `idx_user_id` (`user_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户自选股票表';