You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
6.1 KiB
240 lines
6.1 KiB
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "mysql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
enum UserStatus {
|
|
ACTIVE
|
|
DISABLED
|
|
}
|
|
|
|
enum PermissionType {
|
|
MENU
|
|
BUTTON
|
|
API
|
|
}
|
|
|
|
enum LampStatus {
|
|
NORMAL
|
|
FAULT
|
|
MAINTENANCE
|
|
OFFLINE
|
|
}
|
|
|
|
enum OnlineStatus {
|
|
ONLINE
|
|
OFFLINE
|
|
}
|
|
|
|
enum AlarmLevel {
|
|
LOW
|
|
MEDIUM
|
|
HIGH
|
|
CRITICAL
|
|
}
|
|
|
|
enum AlarmStatus {
|
|
OPEN
|
|
PROCESSING
|
|
RESOLVED
|
|
IGNORED
|
|
}
|
|
|
|
model Tenant {
|
|
id String @id @default(cuid())
|
|
name String
|
|
code String @unique
|
|
enabled Boolean @default(true)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
users User[]
|
|
roles Role[]
|
|
lamps StreetLamp[]
|
|
alarms Alarm[]
|
|
}
|
|
|
|
model User {
|
|
id String @id @default(cuid())
|
|
username String
|
|
passwordHash String
|
|
name String
|
|
phone String?
|
|
email String?
|
|
status UserStatus @default(ACTIVE)
|
|
tenantId String?
|
|
tenant Tenant? @relation(fields: [tenantId], references: [id])
|
|
roles UserRole[]
|
|
regionScopes UserRegionScope[]
|
|
alarmHandles AlarmHandleRecord[]
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@unique([tenantId, username])
|
|
}
|
|
|
|
model Role {
|
|
id String @id @default(cuid())
|
|
name String
|
|
code String
|
|
description String?
|
|
tenantId String?
|
|
tenant Tenant? @relation(fields: [tenantId], references: [id])
|
|
users UserRole[]
|
|
permissions RolePermission[]
|
|
regionScopes RoleRegionScope[]
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@unique([tenantId, code])
|
|
}
|
|
|
|
model Permission {
|
|
id String @id @default(cuid())
|
|
name String
|
|
code String @unique
|
|
type PermissionType
|
|
parentId String?
|
|
path String?
|
|
sort Int @default(0)
|
|
roles RolePermission[]
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
|
|
model UserRole {
|
|
userId String
|
|
roleId String
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)
|
|
|
|
@@id([userId, roleId])
|
|
}
|
|
|
|
model RolePermission {
|
|
roleId String
|
|
permissionId String
|
|
role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)
|
|
permission Permission @relation(fields: [permissionId], references: [id], onDelete: Cascade)
|
|
|
|
@@id([roleId, permissionId])
|
|
}
|
|
|
|
model Region {
|
|
id String @id @default(cuid())
|
|
code String @unique
|
|
name String
|
|
level Int
|
|
parentId String?
|
|
parent Region? @relation("RegionTree", fields: [parentId], references: [id])
|
|
children Region[] @relation("RegionTree")
|
|
longitude Decimal? @db.Decimal(10, 6)
|
|
latitude Decimal? @db.Decimal(10, 6)
|
|
userScopes UserRegionScope[]
|
|
roleScopes RoleRegionScope[]
|
|
lamps StreetLamp[]
|
|
alarms Alarm[]
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
|
|
model UserRegionScope {
|
|
userId String
|
|
regionId String
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
region Region @relation(fields: [regionId], references: [id], onDelete: Cascade)
|
|
|
|
@@id([userId, regionId])
|
|
}
|
|
|
|
model RoleRegionScope {
|
|
roleId String
|
|
regionId String
|
|
role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)
|
|
region Region @relation(fields: [regionId], references: [id], onDelete: Cascade)
|
|
|
|
@@id([roleId, regionId])
|
|
}
|
|
|
|
model StreetLamp {
|
|
id String @id @default(cuid())
|
|
code String @unique
|
|
name String
|
|
tenantId String?
|
|
tenant Tenant? @relation(fields: [tenantId], references: [id])
|
|
regionId String
|
|
region Region @relation(fields: [regionId], references: [id])
|
|
address String?
|
|
longitude Decimal @db.Decimal(10, 6)
|
|
latitude Decimal @db.Decimal(10, 6)
|
|
deviceType String?
|
|
status LampStatus @default(NORMAL)
|
|
onlineStatus OnlineStatus @default(ONLINE)
|
|
isPowerOn Boolean?
|
|
lastReportedAt DateTime?
|
|
alarms Alarm[]
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@index([regionId])
|
|
}
|
|
|
|
model Alarm {
|
|
id String @id @default(cuid())
|
|
sourceAlarmId String? @unique
|
|
tenantId String?
|
|
tenant Tenant? @relation(fields: [tenantId], references: [id])
|
|
lampId String
|
|
lamp StreetLamp @relation(fields: [lampId], references: [id])
|
|
regionId String
|
|
region Region @relation(fields: [regionId], references: [id])
|
|
type String
|
|
title String
|
|
description String?
|
|
level AlarmLevel @default(MEDIUM)
|
|
status AlarmStatus @default(OPEN)
|
|
occurredAt DateTime
|
|
recoveredAt DateTime?
|
|
handledAt DateTime?
|
|
handleRecords AlarmHandleRecord[]
|
|
events AlarmEvent[]
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@index([regionId, status])
|
|
@@index([lampId])
|
|
}
|
|
|
|
model AlarmEvent {
|
|
id String @id @default(cuid())
|
|
alarmId String
|
|
alarm Alarm @relation(fields: [alarmId], references: [id], onDelete: Cascade)
|
|
eventType String
|
|
payload Json?
|
|
createdAt DateTime @default(now())
|
|
}
|
|
|
|
model AlarmHandleRecord {
|
|
id String @id @default(cuid())
|
|
alarmId String
|
|
alarm Alarm @relation(fields: [alarmId], references: [id], onDelete: Cascade)
|
|
userId String?
|
|
user User? @relation(fields: [userId], references: [id])
|
|
action String
|
|
remark String?
|
|
createdAt DateTime @default(now())
|
|
}
|
|
|
|
model OperationLog {
|
|
id String @id @default(cuid())
|
|
userId String?
|
|
action String
|
|
resource String
|
|
detail Json?
|
|
ip String?
|
|
createdAt DateTime @default(now())
|
|
}
|