156 lines
4.1 KiB
Plaintext
156 lines
4.1 KiB
Plaintext
generator client {
|
||
provider = "prisma-client"
|
||
output = "../src/generated/prisma"
|
||
}
|
||
|
||
// 兼容 seed 脚本在 Node.js 直接运行时使用 @prisma/client runtime。
|
||
generator seed_client {
|
||
provider = "prisma-client-js"
|
||
}
|
||
|
||
datasource db {
|
||
provider = "postgresql"
|
||
}
|
||
|
||
// 角色枚举:用于鉴权与数据可见性控制。
|
||
enum Role {
|
||
SYSTEM_ADMIN
|
||
HOSPITAL_ADMIN
|
||
DIRECTOR
|
||
LEADER
|
||
DOCTOR
|
||
ENGINEER
|
||
}
|
||
|
||
// 设备状态枚举:表示设备是否处于使用中。
|
||
enum DeviceStatus {
|
||
ACTIVE
|
||
INACTIVE
|
||
}
|
||
|
||
// 任务状态枚举:定义任务流转状态机。
|
||
enum TaskStatus {
|
||
PENDING
|
||
ACCEPTED
|
||
COMPLETED
|
||
CANCELLED
|
||
}
|
||
|
||
// 医院主表:多租户顶层实体。
|
||
model Hospital {
|
||
id Int @id @default(autoincrement())
|
||
name String
|
||
departments Department[]
|
||
users User[]
|
||
patients Patient[]
|
||
tasks Task[]
|
||
}
|
||
|
||
// 科室表:归属于医院。
|
||
model Department {
|
||
id Int @id @default(autoincrement())
|
||
name String
|
||
hospitalId Int
|
||
hospital Hospital @relation(fields: [hospitalId], references: [id])
|
||
groups Group[]
|
||
users User[]
|
||
|
||
@@index([hospitalId])
|
||
}
|
||
|
||
// 小组表:归属于科室。
|
||
model Group {
|
||
id Int @id @default(autoincrement())
|
||
name String
|
||
departmentId Int
|
||
department Department @relation(fields: [departmentId], references: [id])
|
||
users User[]
|
||
|
||
@@index([departmentId])
|
||
}
|
||
|
||
// 用户表:支持后台密码登录与小程序 openId。
|
||
model User {
|
||
id Int @id @default(autoincrement())
|
||
name String
|
||
phone String
|
||
// 后台登录密码哈希(bcrypt)。
|
||
passwordHash String?
|
||
openId String? @unique
|
||
role Role
|
||
hospitalId Int?
|
||
departmentId Int?
|
||
groupId Int?
|
||
hospital Hospital? @relation(fields: [hospitalId], references: [id])
|
||
department Department? @relation(fields: [departmentId], references: [id])
|
||
group Group? @relation(fields: [groupId], references: [id])
|
||
doctorPatients Patient[] @relation("DoctorPatients")
|
||
createdTasks Task[] @relation("TaskCreator")
|
||
acceptedTasks Task[] @relation("TaskEngineer")
|
||
|
||
@@unique([phone, role, hospitalId])
|
||
@@index([phone])
|
||
@@index([hospitalId, role])
|
||
@@index([departmentId, role])
|
||
@@index([groupId, role])
|
||
}
|
||
|
||
// 患者表:院内患者档案,按医院隔离。
|
||
model Patient {
|
||
id Int @id @default(autoincrement())
|
||
name String
|
||
phone String
|
||
idCardHash String
|
||
hospitalId Int
|
||
doctorId Int
|
||
hospital Hospital @relation(fields: [hospitalId], references: [id])
|
||
doctor User @relation("DoctorPatients", fields: [doctorId], references: [id])
|
||
devices Device[]
|
||
|
||
@@index([phone, idCardHash])
|
||
@@index([hospitalId, doctorId])
|
||
}
|
||
|
||
// 设备表:患者可绑定多个分流设备。
|
||
model Device {
|
||
id Int @id @default(autoincrement())
|
||
snCode String @unique
|
||
currentPressure Int
|
||
status DeviceStatus @default(ACTIVE)
|
||
patientId Int
|
||
patient Patient @relation(fields: [patientId], references: [id])
|
||
taskItems TaskItem[]
|
||
|
||
@@index([patientId, status])
|
||
}
|
||
|
||
// 主任务表:记录调压任务主单。
|
||
model Task {
|
||
id Int @id @default(autoincrement())
|
||
status TaskStatus @default(PENDING)
|
||
creatorId Int
|
||
engineerId Int?
|
||
hospitalId Int
|
||
createdAt DateTime @default(now())
|
||
creator User @relation("TaskCreator", fields: [creatorId], references: [id])
|
||
engineer User? @relation("TaskEngineer", fields: [engineerId], references: [id])
|
||
hospital Hospital @relation(fields: [hospitalId], references: [id])
|
||
items TaskItem[]
|
||
|
||
@@index([hospitalId, status, createdAt])
|
||
}
|
||
|
||
// 任务明细表:一个任务可包含多个设备调压项。
|
||
model TaskItem {
|
||
id Int @id @default(autoincrement())
|
||
taskId Int
|
||
deviceId Int
|
||
oldPressure Int
|
||
targetPressure Int
|
||
task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
|
||
device Device @relation(fields: [deviceId], references: [id])
|
||
|
||
@@index([taskId])
|
||
@@index([deviceId])
|
||
}
|