airpredict/apps/api/prisma/schema.prisma

165 lines
5.2 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 室内装修工程污染物预测系统 — 数据模型
// 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")
}