203 lines
6.0 KiB
Plaintext
203 lines
6.0 KiB
Plaintext
// This is your Prisma schema file,
|
||
// learn more about it in the docs: https://pris.ly/d/prisma-schema
|
||
|
||
// Get a free hosted Postgres database in seconds: `npx create-db`
|
||
|
||
generator client {
|
||
provider = "prisma-client"
|
||
output = "../generated/prisma"
|
||
}
|
||
|
||
datasource db {
|
||
provider = "mysql"
|
||
}
|
||
|
||
model User {
|
||
id Int @id @default(autoincrement())
|
||
name String
|
||
email String @unique
|
||
password String
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
}
|
||
|
||
model Article {
|
||
id Int @id @default(autoincrement())
|
||
title String
|
||
slug String @unique
|
||
content String
|
||
date String
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
}
|
||
|
||
model Strategy {
|
||
id Int @id @default(autoincrement())
|
||
name String
|
||
description String
|
||
data Json
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
}
|
||
|
||
model Indicator {
|
||
id Int @id @default(autoincrement())
|
||
name String @unique
|
||
groupName String
|
||
title String @default("")
|
||
unit String @default("")
|
||
source String @default("")
|
||
frequency String @default("month") // year | quarter | month | day
|
||
hidden Boolean @default(false) // true = 数据/脚本保留, 但不在前端展示
|
||
points IndicatorPoint[]
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
}
|
||
|
||
model IndicatorPoint {
|
||
id Int @id @default(autoincrement())
|
||
indicatorId Int
|
||
indicator Indicator @relation(fields: [indicatorId], references: [id], onDelete: Cascade)
|
||
period String // "2024" | "2024-Q1" | "2024-01" | "2024-01-15"
|
||
value Float
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
|
||
@@unique([indicatorId, period])
|
||
}
|
||
|
||
|
||
// 新闻: 每天 3 点由 mx_finance_search_news 拉取, 按影响大小排序, 累加多日供首页无限滚动
|
||
model News {
|
||
id Int @id @default(autoincrement())
|
||
title String
|
||
summary String @default("")
|
||
content String? @db.Text
|
||
source String @default("")
|
||
url String @default("")
|
||
publishedAt DateTime
|
||
impactRank Int
|
||
createdAt DateTime @default(now())
|
||
|
||
@@unique([title, publishedAt])
|
||
@@index([publishedAt])
|
||
}
|
||
|
||
// 报警: refresh 写库时比对同 (indicatorName, period) 的跨源数据, 差异超阈值记录
|
||
model Alert {
|
||
id Int @id @default(autoincrement())
|
||
indicatorName String
|
||
period String
|
||
valueA Float
|
||
valueB Float
|
||
sourceA String
|
||
sourceB String
|
||
diff Float
|
||
diffRatio Float
|
||
createdAt DateTime @default(now())
|
||
|
||
@@index([createdAt])
|
||
}
|
||
|
||
|
||
// 服务器监控: 对接 komari 公开 API
|
||
model ServerNode {
|
||
id Int @id @default(autoincrement())
|
||
uuid String @unique
|
||
name String
|
||
cpuName String @default("")
|
||
os String @default("")
|
||
region String @default("")
|
||
memTotal BigInt @default(0)
|
||
diskTotal BigInt @default(0)
|
||
cpuCores Int @default(0)
|
||
// 最新实时快照
|
||
cpuUsage Float @default(0)
|
||
ramUsed BigInt @default(0)
|
||
swapUsed BigInt @default(0)
|
||
load1 Float @default(0)
|
||
load5 Float @default(0)
|
||
load15 Float @default(0)
|
||
diskUsed BigInt @default(0)
|
||
netIn BigInt @default(0)
|
||
netOut BigInt @default(0)
|
||
uptime BigInt @default(0)
|
||
process Int @default(0)
|
||
connections Int @default(0)
|
||
status String @default("unknown") // online | offline | unknown
|
||
recordedAt DateTime
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
}
|
||
|
||
// 时序历史: 每节点每分钟一条 (komari records 1 分钟粒度)
|
||
model ServerNodeHistory {
|
||
id Int @id @default(autoincrement())
|
||
uuid String
|
||
period DateTime
|
||
cpu Float @default(0)
|
||
ram BigInt @default(0)
|
||
load Float @default(0)
|
||
disk BigInt @default(0)
|
||
netIn BigInt @default(0)
|
||
netOut BigInt @default(0)
|
||
process Int @default(0)
|
||
connections Int @default(0)
|
||
createdAt DateTime @default(now())
|
||
|
||
@@unique([uuid, period])
|
||
@@index([uuid, period])
|
||
}
|
||
|
||
// 服务健康检查: 本应用自检 (健康端点 / DB / 第三方)
|
||
model ServiceCheck {
|
||
id Int @id @default(autoincrement())
|
||
name String @unique
|
||
url String
|
||
status String @default("unknown") // up | down | unknown
|
||
latencyMs Int @default(0)
|
||
message String @default("")
|
||
lastCheckAt DateTime
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
}
|
||
|
||
model Econ_SowInventory {
|
||
id Int @id @default(autoincrement())
|
||
month String @unique
|
||
inventory Int // 能繁母猪数量(万头)
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
}
|
||
|
||
model ScraperCache {
|
||
id Int @id @default(autoincrement())
|
||
scraperName String @unique // 爬虫名称,如:sow-inventory
|
||
lastDataHash String? // 上次数据指纹
|
||
lastUpdateAt DateTime // 上次更新时间
|
||
metadata Json? // 其他元数据
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
}
|
||
|
||
|
||
|
||
|
||
// 浙江省油价历史 (apizero price 接口每日抓取)
|
||
// 每天 04:00 cron 触发: 检查 schedule 里待定且 <= 昨天的调价日, 抓 price?province=浙江 存本表
|
||
// unique (date, province, fuel) 防重复
|
||
model OilPriceHistory {
|
||
id Int @id @default(autoincrement())
|
||
date DateTime // 调价日次日 (即数据实际抓取日)
|
||
province String // '浙江'
|
||
fuel String // '92' | '95' | '0'
|
||
price Float // 油价 (元/升, 4 位小数足够)
|
||
source String @default("apizero")
|
||
createdAt DateTime @default(now())
|
||
|
||
@@unique([date, province, fuel])
|
||
@@index([province, fuel, date])
|
||
}
|
||
|
||
|