generator client { provider = "prisma-client-js" } datasource db { provider = "mysql" url = env("DATABASE_URL") } // ============================================ // 基础数据表 // ============================================ // 交易日历表 model TradeDate { id Int @id @default(autoincrement()) date DateTime @unique @db.Date week Int @default(0) isTrade Boolean @default(true) @map("is_trade") createdAt DateTime @default(now()) @map("created_at") @@index([date]) @@index([isTrade]) @@map("trade_dates") } // 股票基础信息表(新表) model StockBasic { id String @id @default(uuid()) code String @unique name String // 东财行业分类 blemind2 String? @map("blemind2") // 东财行业指数2级 blemind3 String? @map("blemind3") // 东财行业指数3级 // 上市信息 listDate DateTime? @map("list_date") // 首发上市日期 tradeDays Int @default(0) @map("trade_days") // 上市天数 // 机构持股 agenciesHold Float? @map("agencies_hold") // 机构持股比例(%) // 市场信息 market String? // 所属市场(SH/SZ/BJ) industry String? // 所属行业 // 关联数据 dailyQuotes StockDailyQuote[] momentumRecords StockMomentum[] limitRecords StockLimit[] newRecords StockNewRecord[] // 时间戳 updatedAt DateTime @updatedAt @map("updated_at") createdAt DateTime @default(now()) @map("created_at") @@index([code]) @@index([blemind2]) @@index([blemind3]) @@index([listDate]) @@map("stock_basics") } // ============================================ // 交易数据表 // ============================================ // 股票日行情数据表(基础数据,从数据服务获取) model StockDailyQuote { id Int @id @default(autoincrement()) stockCode String @map("stock_code") stock StockBasic @relation(fields: [stockCode], references: [code], onDelete: Cascade) tradeDay DateTime @map("trade_day") @db.Date // 基础价格数据 open Float // 开盘价 close Float // 收盘价 high Float // 最高价 low Float // 最低价 // 成交量额 volume BigInt // 成交量 amount BigInt // 成交额 // 涨跌幅 differrange Float // 当日涨跌幅(%) // 状态标记 isLimit Boolean @default(false) @map("is_limit") // 是否涨停 isDrop Boolean @default(false) @map("is_drop") // 是否跌停 // 关联的多周期涨跌幅 returns StockReturn[] createdAt DateTime @default(now()) @map("created_at") @@unique([stockCode, tradeDay]) @@index([stockCode]) @@index([tradeDay]) @@index([stockCode, tradeDay]) @@map("stock_daily_quotes") } // 股票多周期涨跌幅表(计算数据) model StockReturn { id Int @id @default(autoincrement()) stockCode String @map("stock_code") quoteId Int @map("quote_id") quote StockDailyQuote @relation(fields: [quoteId], references: [id], onDelete: Cascade) tradeDay DateTime @map("trade_day") @db.Date // 多周期涨跌幅 period Int // 周期(1,3,5,10,15,20,30,60) returnRate Float @map("return_rate") // 涨跌幅(%) // 计算来源 basePrice Float @map("base_price") // 基准价格(N日前收盘价) createdAt DateTime @default(now()) @map("created_at") @@unique([stockCode, tradeDay, period]) @@index([stockCode]) @@index([tradeDay]) @@index([period]) @@index([stockCode, tradeDay]) @@map("stock_returns") } // 涨停跌停记录表 model StockLimit { id Int @id @default(autoincrement()) stockCode String @map("stock_code") stock StockBasic @relation(fields: [stockCode], references: [code], onDelete: Cascade) tradeDay DateTime @map("trade_day") @db.Date blemind2 String? @map("blemind2") isLimit Boolean @default(false) @map("is_limit") // 是否涨停 isDrop Boolean @default(false) @map("is_drop") // 是否跌停 createdAt DateTime @default(now()) @map("created_at") @@unique([stockCode, tradeDay]) @@index([stockCode]) @@index([tradeDay]) @@index([blemind2]) @@map("stock_limits") } // 新高新低记录表 model StockNewRecord { id Int @id @default(autoincrement()) stockCode String @map("stock_code") stock StockBasic @relation(fields: [stockCode], references: [code], onDelete: Cascade) tradeDay DateTime @map("trade_day") @db.Date blemind2 String? @map("blemind2") isHigh Boolean @default(false) @map("is_high") // 是否300天新高 isLow Boolean @default(false) @map("is_low") // 是否300天新低 daysToHigh Int @default(0) @map("days_to_high") // 距离前高天数 daysToLow Int @default(0) @map("days_to_low") // 距离前低天数 createdAt DateTime @default(now()) @map("created_at") @@unique([stockCode, tradeDay]) @@index([stockCode]) @@index([tradeDay]) @@index([blemind2]) @@map("stock_new_records") } // ============================================ // 动量计算结果表 // ============================================ // 动量个股表(计算结果) model StockMomentum { id Int @id @default(autoincrement()) stockCode String @map("stock_code") stock StockBasic @relation(fields: [stockCode], references: [code], onDelete: Cascade) tradeDay DateTime @map("trade_day") @db.Date // 动量排名信息 sort Int // 排名 type Int // 动量数据类型(1,3,5,10,15,20,30,60日) // 股票基本信息(冗余存储,便于查询) name String? blemind2 String? @map("blemind2") blemind3 String? @map("blemind3") // 价格数据 open Float? // 开盘价 close Float? // 收盘价 differrange Float? @map("differrange") // 当日涨跌幅 // 多周期涨跌幅 differrange10 Float? @map("differrange10") differrange20 Float? @map("differrange20") differrange60 Float? @map("differrange60") // 最大回撤 backdifferrange10 Float? @map("backdifferrange10") backdifferrange20 Float? @map("backdifferrange20") backdifferrange60 Float? @map("backdifferrange60") // 筛选条件(记录当时的数据) tradeDays Int? @map("trade_days") // 上市天数 agenciesHold Float? @map("agencies_hold") // 机构持股比例 createdAt DateTime @default(now()) @map("created_at") @@unique([stockCode, tradeDay, type]) @@index([stockCode]) @@index([tradeDay]) @@index([type]) @@index([tradeDay, type]) @@index([blemind2, tradeDay, type]) @@index([sort]) @@map("stock_momentum") } // 板块动量结果表 model SectorMomentum { id Int @id @default(autoincrement()) tradeDay DateTime @map("trade_day") @db.Date blemind2 String @map("blemind2") // 所属东财行业指数2级 // 动量计算结果 stocksCount Int @map("stocks_count") // 动量个股数量 totalStocks Int @map("total_stocks") // 板块总个股数 trendValue Float @map("trend_value") // 动量值 = (stocksCount^2) / totalStocks trendValueChange Float? @map("trend_value_change") // 动量值变化 // 排名信息 sort Int // 板块排名 sortChange Int @map("sort_change") // 板块排名变化 // 动量类型 type Int // 动量数据类型(1,3,5,10,15,20,30,60日) // 昨日数据快照(用于计算变化) lastTrendValue Float? @map("last_trend_value") lastSort Int? @map("last_sort") createdAt DateTime @default(now()) @map("created_at") @@unique([tradeDay, blemind2, type]) @@index([tradeDay]) @@index([blemind2]) @@index([type]) @@index([tradeDay, type]) @@index([sort]) @@map("sector_momentum") } // ============================================ // 系统配置和任务表 // ============================================ // 数据同步任务记录 model DataSyncTask { id Int @id @default(autoincrement()) taskType String @map("task_type") // 任务类型(daily_quote/momentum/etc) tradeDay DateTime? @map("trade_day") @db.Date status String // pending/running/completed/failed startTime DateTime? @map("start_time") endTime DateTime? @map("end_time") message String? // 执行信息/错误信息 recordCount Int? @map("record_count") // 处理记录数 createdAt DateTime @default(now()) @map("created_at") @@index([taskType]) @@index([status]) @@index([tradeDay]) @@map("data_sync_tasks") } // ============================================ // 保留原有表(保持兼容性) // ============================================ // 市场指数 model MarketIndex { id Int @id @default(autoincrement()) name String @unique code String @unique current Float change Float changePercent Float volume BigInt turnover BigInt updatedAt DateTime @updatedAt createdAt DateTime @default(now()) @@index([code]) @@map("market_indices") } // 版块信息(系统板块)- 保留原表名 model Sector { id String @id @default(uuid()) name String @unique code String @unique stocks Stock[] quotes SectorQuote[] klines SectorKLine[] updatedAt DateTime @updatedAt createdAt DateTime @default(now()) @@index([code]) @@map("sectors") } // 版块行情(兼容原表) model SectorQuote { id Int @id @default(autoincrement()) sectorCode String @map("sector_code") sector Sector @relation(fields: [sectorCode], references: [code]) current Float change Float changePercent Float volume BigInt turnover BigInt momentumScore Float @default(50) rank Int @default(0) previousRank Int @default(0) @map("previous_rank") quoteTime DateTime @map("quote_time") @@index([sectorCode]) @@index([quoteTime]) @@map("sector_quotes") } // 版块K线数据(兼容原表) model SectorKLine { id Int @id @default(autoincrement()) sectorCode String @map("sector_code") sector Sector @relation(fields: [sectorCode], references: [code]) period String // day/week/month date DateTime open Float high Float low Float close Float volume BigInt @@unique([sectorCode, period, date]) @@index([sectorCode]) @@index([date]) @@map("sector_klines") } // 股票信息(兼容原表) model Stock { id String @id @default(uuid()) code String @unique name String sectorCode String? @map("sector_code") sector Sector? @relation(fields: [sectorCode], references: [code]) marketCap BigInt? @map("market_cap") pe Float? pb Float? quotes StockQuote[] klines StockKLine[] favorites UserFavorite[] updatedAt DateTime @updatedAt createdAt DateTime @default(now()) @@index([code]) @@index([sectorCode]) @@map("stocks") } // 股票行情(兼容原表) model StockQuote { id Int @id @default(autoincrement()) stockCode String @map("stock_code") stock Stock @relation(fields: [stockCode], references: [code]) price Float open Float high Float low Float preClose Float @map("pre_close") volume BigInt turnover BigInt changePercent Float @map("change_percent") turnoverRate Float? @map("turnover_rate") amplitude Float? quoteTime DateTime @map("quote_time") @@index([stockCode]) @@index([quoteTime]) @@map("stock_quotes") } // 股票K线数据(兼容原表) model StockKLine { id Int @id @default(autoincrement()) stockCode String @map("stock_code") stock Stock @relation(fields: [stockCode], references: [code]) period String // day/week/month date DateTime open Float high Float low Float close Float volume BigInt ma5 Float? ma10 Float? ma20 Float? ma30 Float? ma60 Float? @@unique([stockCode, period, date]) @@index([stockCode]) @@index([date]) @@map("stock_klines") } // 用户 model User { id String @id @default(uuid()) username String @unique email String @unique password String favorites UserFavorite[] createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("users") } // 用户自选股 model UserFavorite { id Int @id @default(autoincrement()) userId String @map("user_id") user User @relation(fields: [userId], references: [id], onDelete: Cascade) stockCode String @map("stock_code") stock Stock @relation(fields: [stockCode], references: [code]) createdAt DateTime @default(now()) @map("created_at") @@unique([userId, stockCode]) @@index([userId]) @@map("user_favorites") } // 新高新低股票记录(保留原表兼容性) model HighLowStock { id Int @id @default(autoincrement()) stockCode String @map("stock_code") type String // high/low price Float date DateTime daysToHighLow Int @map("days_to_highlow") createdAt DateTime @default(now()) @map("created_at") @@index([stockCode]) @@index([type]) @@index([date]) @@map("high_low_stocks") } // 动量股票推荐(保留原表兼容性) model MomentumStock { id Int @id @default(autoincrement()) stockCode String @map("stock_code") momentumScore Float @map("momentum_score") tags String? // JSON array volumeRatio Float @map("volume_ratio") breakThrough Boolean @default(false) @map("break_through") date DateTime createdAt DateTime @default(now()) @map("created_at") @@unique([stockCode, date]) @@index([stockCode]) @@index([date]) @@map("momentum_stocks") }