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? // 该时间点之前签发的 token 一律失效。 tokenValidAfter DateTime @default(now()) 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]) // 小组删除必须先清理成员,避免静默把用户 groupId 置空。 group Group? @relation(fields: [groupId], references: [id], onDelete: Restrict) 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 // 患者身份证号,录入与查询都使用原始证件号。 idCard String hospitalId Int doctorId Int hospital Hospital @relation(fields: [hospitalId], references: [id]) doctor User @relation("DoctorPatients", fields: [doctorId], references: [id]) devices Device[] @@index([phone, idCard]) @@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]) }