// 室内装修工程污染物预测系统 — 数据模型 // Prisma schema. 详见各模型注释(字段来自对原系统的功能抓取)。 generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } /// 组织/账号(登录主体)。原系统一个账号对应一个组织,如 YPJKKJ → 一品健康空间。 model Organization { id String @id @default(cuid()) username String @unique // 账号名,如 YPJKKJ name String // 组织展示名,如 一品健康空间 passwordHash String createdAt DateTime @default(now()) materials Material[] projects Project[] favorites Favorite[] @@map("organizations") } /// 材料库条目。公共库由平台维护,自建库归属某组织。 model Material { id String @id // 业务ID,如 PM13000003 name String // 材料名称 category String // 材料类别,如 人造板/胶合板 brand String? // 材料品牌 manufacturer String? // 材料厂家 spec String? // 材料规格,如 2.7SE / 18mm envGrade String? // 环保等级 E0/E1/E2(甲醛释放量分级) healthGrade String? // 健康等级 A/B/C(综合健康评级,独立于环保等级) usageUnit String @default("m²") // 用量单位 sortOrder Int @default(0) // 手动排序权重(越小越靠前,为厂商竞价排名预留) /// 污染物散发参数 Record,对应 shared 的 EmissionParams emissionParams Json isPublic Boolean @default(false) // true=公共库 ownerOrg Organization? @relation(fields: [ownerOrgId], references: [id]) ownerOrgId String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt spaceMaterials SpaceMaterial[] @@index([category]) @@index([brand]) @@index([envGrade]) @@index([healthGrade]) @@index([isPublic]) @@index([sortOrder]) @@map("materials") } /// 预测项目;isTemplate=true 时作为项目模板库条目。 model Project { id String @id // 业务ID,如 P36WEVFEV / 模板ID name String // 工程名称 type String // 项目类型:住宅/酒店/办公楼/医院/学校/养老院/其他 province String // 省 city String // 市 area Float // 建筑面积 m² rating String? // 预测评级 A/B/C/D status String @default("draft") // draft|configuring|report_generated isTemplate Boolean @default(false) isPublic Boolean @default(false) owner Organization @relation(fields: [ownerOrgId], references: [id]) ownerOrgId String reportGeneratedAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt spaces Space[] reports Report[] @@index([ownerOrgId]) @@index([isTemplate, isPublic]) @@map("projects") } /// 项目内的空间(房间)。 model Space { id String @id // 业务ID,如 S36WF116D project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) projectId String name String // 空间名称 type String // 空间类型:客厅/卧室/... layout String @default("uniform") // uniform=等高 | non-uniform=非等高 height Float? // 高度 m area Float // 面积 m² volume Float // 体积 m³ temperature Float // 温度 ℃ humidity Float // 湿度 %rh ventilationRate Float // 通风换气率 次/小时 standard String @default("GB50325-2020") // 污染物浓度限值标准 /// 预测浓度 Record (mg/m³),预计算/生成报告后写入 predictedConc Json? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt materials SpaceMaterial[] @@index([projectId]) @@map("spaces") } /// 空间-材料关联及该材料的用量与污染物贡献。 model SpaceMaterial { id String @id @default(cuid()) space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade) spaceId String material Material @relation(fields: [materialId], references: [id]) materialId String usageUnit String @default("m²") usageAmount Float /// 各污染物贡献量 Record (mg/m³) contribution Json? /// 各污染物贡献率 Record (0~1) contributionRate Json? @@index([spaceId]) @@index([materialId]) @@map("space_materials") } /// 收藏(材料或模板)。 model Favorite { id String @id @default(cuid()) org Organization @relation(fields: [orgId], references: [id]) orgId String targetType String // 'material' | 'template' targetId String createdAt DateTime @default(now()) @@unique([orgId, targetType, targetId]) @@map("favorites") } /// 生成的预测报告快照。 model Report { id String @id @default(cuid()) project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) projectId String rating String? /// 报告完整数据快照(项目+空间+材料+预测结果) payload Json generatedAt DateTime @default(now()) @@index([projectId]) @@map("reports") }