165 lines
5.2 KiB
Plaintext
165 lines
5.2 KiB
Plaintext
// 室内装修工程污染物预测系统 — 数据模型
|
||
// 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<Pollutant, {y0,yp,b}>,对应 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<Pollutant, number> (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<Pollutant, number> (mg/m³)
|
||
contribution Json?
|
||
/// 各污染物贡献率 Record<Pollutant, number> (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")
|
||
}
|