generator client { provider = "prisma-client-js" binaryTargets = ["windows"] } datasource db { provider = "mysql" url = env("DATABASE_URL") } // 管理员账号 model Admin { id String @id // 账号ID A(RRRRRR) name String @unique // 账号名 password String // 密码 username String // 用户名 type Int @default(1) // 账号类型 1 - 超级管理员, 2 - 管理员 status Int @default(1) // 账号状态 0 - 禁用, 1 - 可用 authz_hist_mgmt Int @default(1) // 历史管理 authz_tmpl_mgmt Int @default(1) // 模板管理 authz_mtrl_mgmt Int @default(1) // 材料管理 authz_audit_mgmt Int @default(1) // 审核管理 authz_acct_mgmt Int @default(1) // 账号管理 authz_sys_cfg Int @default(1) // 系统设置 templates PublicTemplate[] materials PublicMaterial[] applied_requests AuditRequest[] @relation("applied_requests") reviewed_requests AuditRequest[] @relation("reviewed_requests") creator_id String creator_name String created_at DateTime @default(now()) updated_at DateTime @updatedAt deleted Int @default(0) @@map("admin") } // 用户账号 model User { id String @id // 账号ID U(RRRRRR) name String @unique // 账户名 password String // 密码 username String // 用户名 status Int @default(1) // 账号状态 0 - 禁用, 1 - 可用 projects Project[] templates SelfTemplate[] materials SelfMaterial[] pub_temp_colls PublicTemplateCollection[] // 收藏的公共模板 pub_mtrl_colls PublicMaterialCollection[] // 收藏的公共材料 pub_templates PublicTemplate[] pub_materials PublicMaterial[] creator_id String creator_name String created_at DateTime @default(now()) updated_at DateTime @updatedAt deleted Int @default(0) phone String? @unique // 手机号(手机注册用户) @@map("user") } // ------ // 项目 model Project { id String @id // 项目ID P(yMdHmSRR) name String? // 项目名称 category String? // 项目类型 province String? // 所在省份 city String? // 所在城市 climatic_zone String? // 所在气候区 constr_area Float? // 建筑面积 usage_area Float? // 使用面积 spaces Space[] // 包含空间 status Int @default(0) // 状态 0 - 未生成预测报告, 1 - 已生成预测报告 predicted_at DateTime? // 预测报告生成时间 score Float? // 得分 grade String? // 评级 creator_id String? creator_name String creator User? @relation(fields: [creator_id], references: [id], onDelete: SetNull) created_at DateTime @default(now()) updated_at DateTime @updatedAt @@map("project") } // 项目空间 model Space { id String @id // 空间ID S(yMdHmSRR) project_id String // 所属项目ID project Project @relation(fields: [project_id], references: [id], onDelete: Cascade) // 所属项目 name String? // 空间名称 category String? // 空间类型 layout Int? // 空间布局 height Float? // 空间高度 area Float? // 空间面积 volume Float? // 空间体积 env_temp Float? // 环境温度 env_hum Float? // 环境湿度 env_vent_rate Float? // 环境通风换气率 apc_lmt_std_id String? // 空气污染物浓度限值标准ID apc_lmt_std ApcLimitStandard? @relation(fields: [apc_lmt_std_id], references: [id], onDelete: SetNull) // 空气污染物浓度限值标准 materials Material[] // 包含材料 methanal_c Float? // 甲醛浓度 tvoc_c Float? // TVOC浓度 benzene_c Float? // 苯浓度 toluene_c Float? // 甲苯浓度 p_xylene_c Float? // 二甲苯浓度 methanal_c_exceed Int? // 甲醛是否超标 tvoc_c_exceed Int? // TVOC是否超标 benzene_c_exceed Int? // 苯是否超标 toluene_c_exceed Int? // 甲苯是否超标 p_xylene_c_exceed Int? // 二甲苯是否超标 creator_id String creator_name String created_at DateTime @default(now()) updated_at DateTime @updatedAt @@map("space") } // 空间材料 model Material { id Int @id @default(autoincrement()) // 材料ID material_id String // 所属材料ID project_id String // 所属项目ID space_id String // 所属空间ID space Space @relation(fields: [space_id], references: [id], onDelete: Cascade) // 所属空间 name String? // 材料名称 category String? // 材料类型 brand String? // 材料品牌 factory String? // 材料厂家 spec String? // 材料规格 eco_level String? // 环保等级 unit String? // 用量单位 AREA - 面积, LEN - 长度 qty Float? // 用量值 methanal Float? // 甲醛 methanal_min_be Float? // 甲醛最低平衡释放量 methanal_be_area Float? // 甲醛平衡释放量范围 methanal_be_roc Float? // 甲醛平衡释放量变化率 tvoc Float? // TVOC tvoc_min_be Float? // TVOC最低平衡释放量 tvoc_be_area Float? // TVOC平衡释放量范围 tvoc_be_roc Float? // TVOC平衡释放量变化率 benzene Float? // 苯 benzene_min_be Float? // 苯最低平衡释放量 benzene_be_area Float? // 苯平衡释放量范围 benzene_be_roc Float? // 苯平衡释放量变化率 toluene Float? // 甲苯 toluene_min_be Float? // 甲苯最低平衡释放量 toluene_be_area Float? // 甲苯平衡释放量范围 toluene_be_roc Float? // 甲苯平衡释放量变化率 p_xylene Float? // 二甲苯 p_xylene_min_be Float? // 二甲苯最低平衡释放量 p_xylene_be_area Float? // 二甲苯平衡释放量范围 p_xylene_be_roc Float? // 二甲苯平衡释放量变化率 methanal_cr Float? // 甲醛贡献率 tvoc_cr Float? // TVOC贡献率 benzene_cr Float? // 苯贡献率 toluene_cr Float? // 甲苯贡献率 p_xylene_cr Float? // 二甲苯贡献率 methanal_cr_exceed Int? // 甲醛贡献率是否超标 tvoc_cr_exceed Int? // TVOC贡献率是否超标 benzene_cr_exceed Int? // 苯贡献率是否超标 toluene_cr_exceed Int? // 甲苯贡献率是否超标 p_xylene_cr_exceed Int? // 二甲苯贡献率是否超标 is_methanal_ps Int? // 是否为甲醛污染源 is_tvoc_ps Int? // 是否为TVOC污染源 is_benzene_ps Int? // 是否为苯污染源 is_toluene_ps Int? // 是否为甲苯污染源 is_p_xylene_ps Int? // 是否为二甲苯污染源 user_id String user_name String creator_id String creator_name String created_at DateTime @default(now()) updated_at DateTime @updatedAt @@map("material") } // ------ // 公共项目模板 model PublicTemplate { id String @id // PT(yMdHmSRR) name String? category String? province String? city String? climatic_zone String? constr_area Float? usage_area Float? spaces PublicTemplateSpace[] display Int @default(0) // 是否展示 collectors PublicTemplateCollection[] // 收藏此模板的用户 pry_no Int @default(0) score Float? grade String? from String? creator_id String creator_name String related_user_id String? related_user User? @relation(fields: [related_user_id], references: [id], onDelete: SetNull) related_admin_id String? related_admin Admin? @relation(fields: [related_admin_id], references: [id], onDelete: SetNull) created_at DateTime @default(now()) updated_at DateTime @updatedAt @@map("public_template") } // 公共项目模板空间 model PublicTemplateSpace { id String @id // PTS(yMdHmSRR) project_id String project PublicTemplate @relation(fields: [project_id], references: [id], onDelete: Cascade) name String? category String? layout Int? height Float? area Float? volume Float? env_temp Float? env_hum Float? env_vent_rate Float? apc_lmt_std_id String? apc_lmt_std ApcLimitStandard? @relation(fields: [apc_lmt_std_id], references: [id], onDelete: SetNull) materials PublicTemplateMaterial[] methanal_c Float? tvoc_c Float? benzene_c Float? toluene_c Float? p_xylene_c Float? methanal_c_exceed Int? tvoc_c_exceed Int? benzene_c_exceed Int? toluene_c_exceed Int? p_xylene_c_exceed Int? creator_id String creator_name String created_at DateTime @default(now()) updated_at DateTime @updatedAt @@map("public_template_space") } // 公共项目模板材料 model PublicTemplateMaterial { id Int @id @default(autoincrement()) material_id String project_id String space_id String space PublicTemplateSpace @relation(fields: [space_id], references: [id], onDelete: Cascade) name String? category String? brand String? factory String? spec String? eco_level String? unit String? qty Float? methanal Float? methanal_min_be Float? methanal_be_area Float? methanal_be_roc Float? tvoc Float? tvoc_min_be Float? tvoc_be_area Float? tvoc_be_roc Float? benzene Float? benzene_min_be Float? benzene_be_area Float? benzene_be_roc Float? toluene Float? toluene_min_be Float? toluene_be_area Float? toluene_be_roc Float? p_xylene Float? p_xylene_min_be Float? p_xylene_be_area Float? p_xylene_be_roc Float? methanal_cr Float? tvoc_cr Float? benzene_cr Float? toluene_cr Float? p_xylene_cr Float? methanal_cr_exceed Int? tvoc_cr_exceed Int? benzene_cr_exceed Int? toluene_cr_exceed Int? p_xylene_cr_exceed Int? is_methanal_ps Int? is_tvoc_ps Int? is_benzene_ps Int? is_toluene_ps Int? is_p_xylene_ps Int? user_id String user_name String creator_id String creator_name String created_at DateTime @default(now()) updated_at DateTime @updatedAt @@map("public_template_material") } // ------ // 自建模板 model SelfTemplate { id String // ST(yMdHmSRR) name String? category String? province String? city String? climatic_zone String? constr_area Float? usage_area Float? spaces SelfTemplateSpace[] score Float? grade String? creator_id String creator_name String creator User @relation(fields: [creator_id], references: [id], onDelete: Cascade) created_at DateTime @default(now()) updated_at DateTime @updatedAt @@id([id, creator_id]) @@map("self_template") } // 自建模板空间 model SelfTemplateSpace { id String // STS(yMdHmSRR) project_id String project SelfTemplate @relation(fields: [project_id, creator_id], references: [id, creator_id], onDelete: Cascade) name String? category String? layout Int? height Float? area Float? volume Float? env_temp Float? env_hum Float? env_vent_rate Float? apc_lmt_std_id String? apc_lmt_std ApcLimitStandard? @relation(fields: [apc_lmt_std_id], references: [id], onDelete: SetNull) materials SelfTemplateMaterial[] methanal_c Float? tvoc_c Float? benzene_c Float? toluene_c Float? p_xylene_c Float? methanal_c_exceed Int? tvoc_c_exceed Int? benzene_c_exceed Int? toluene_c_exceed Int? p_xylene_c_exceed Int? creator_id String creator_name String created_at DateTime @default(now()) updated_at DateTime @updatedAt @@id([id, project_id]) @@map("self_template_space") } // 自建项目模板材料 model SelfTemplateMaterial { id Int @id @default(autoincrement()) material_id String project_id String space_id String space SelfTemplateSpace @relation(fields: [space_id, project_id], references: [id, project_id], onDelete: Cascade) name String? category String? brand String? factory String? spec String? eco_level String? unit String? qty Float? methanal Float? methanal_min_be Float? methanal_be_area Float? methanal_be_roc Float? tvoc Float? tvoc_min_be Float? tvoc_be_area Float? tvoc_be_roc Float? benzene Float? benzene_min_be Float? benzene_be_area Float? benzene_be_roc Float? toluene Float? toluene_min_be Float? toluene_be_area Float? toluene_be_roc Float? p_xylene Float? p_xylene_min_be Float? p_xylene_be_area Float? p_xylene_be_roc Float? methanal_cr Float? tvoc_cr Float? benzene_cr Float? toluene_cr Float? p_xylene_cr Float? methanal_cr_exceed Int? tvoc_cr_exceed Int? benzene_cr_exceed Int? toluene_cr_exceed Int? p_xylene_cr_exceed Int? is_methanal_ps Int? is_tvoc_ps Int? is_benzene_ps Int? is_toluene_ps Int? is_p_xylene_ps Int? user_id String user_name String creator_id String creator_name String created_at DateTime @default(now()) updated_at DateTime @updatedAt @@map("self_template_material") } // ------ // 公共材料 model PublicMaterial { material_id String @id // PM(yMdHmSRR) name String? category String? brand String? factory String? spec String? eco_level String? health_level String? model_name String? sample_image String? reference_price String? application_case String? effect_image String? supplier String? contact_person String? contact_phone String? production_date String? batch_no String? sample_source String? client_unit String? test_date String? test_standard String? report_no String? test_org String? methanal Float? methanal_min_be Float? methanal_be_area Float? methanal_be_roc Float? tvoc Float? tvoc_min_be Float? tvoc_be_area Float? tvoc_be_roc Float? benzene Float? benzene_min_be Float? benzene_be_area Float? benzene_be_roc Float? toluene Float? toluene_min_be Float? toluene_be_area Float? toluene_be_roc Float? p_xylene Float? p_xylene_min_be Float? p_xylene_be_area Float? p_xylene_be_roc Float? sort_order Int @default(0) // 手动排序权重,升序 display Int @default(0) // 是否展示 collectors PublicMaterialCollection[] // 收藏此材料的用户 pry_no Int @default(0) from String? creator_id String creator_name String related_user_id String? related_user User? @relation(fields: [related_user_id], references: [id], onDelete: SetNull) related_admin_id String? related_admin Admin? @relation(fields: [related_admin_id], references: [id], onDelete: SetNull) created_at DateTime @default(now()) updated_at DateTime @updatedAt @@map("public_material") } // 自建材料 model SelfMaterial { material_id String // SM(yMdHmSRR) name String? category String? brand String? factory String? spec String? eco_level String? health_level String? model_name String? sample_image String? reference_price String? application_case String? effect_image String? supplier String? contact_person String? contact_phone String? production_date String? batch_no String? sample_source String? client_unit String? test_date String? test_standard String? report_no String? test_org String? methanal Float? methanal_min_be Float? methanal_be_area Float? methanal_be_roc Float? tvoc Float? tvoc_min_be Float? tvoc_be_area Float? tvoc_be_roc Float? benzene Float? benzene_min_be Float? benzene_be_area Float? benzene_be_roc Float? toluene Float? toluene_min_be Float? toluene_be_area Float? toluene_be_roc Float? p_xylene Float? p_xylene_min_be Float? p_xylene_be_area Float? p_xylene_be_roc Float? sort_order Int @default(0) creator_id String creator_name String creator User @relation(fields: [creator_id], references: [id], onDelete: Cascade) created_at DateTime @default(now()) updated_at DateTime @updatedAt @@id([material_id, creator_id]) @@map("self_material") } // ------ // 用户收藏的公共模板 model PublicTemplateCollection { user_id String user User @relation(fields: [user_id], references: [id], onDelete: Cascade) project_id String project PublicTemplate @relation(fields: [project_id], references: [id], onDelete: Cascade) @@id([user_id, project_id]) @@map("public_template_collection") } // 用户收藏的公共材料 model PublicMaterialCollection { user_id String user User @relation(fields: [user_id], references: [id], onDelete: Cascade) material_id String material PublicMaterial @relation(fields: [material_id], references: [material_id], onDelete: Cascade) @@id([user_id, material_id]) @@map("public_material_collection") } // ------ // 审核单 model AuditRequest { id String @id status Int @default(0) source_id String? source_creator_id String? source String type String desc String? remark String? reason String? details AuditRequestDetails[] auditor_id String? auditor_name String? auditor Admin? @relation(name: "reviewed_requests", fields: [auditor_id], references: [id], onDelete: SetNull) audited_at DateTime? creator_id String? creator_name String creator Admin? @relation(name: "applied_requests", fields: [creator_id], references: [id], onDelete: SetNull) created_at DateTime @default(now()) updated_at DateTime @updatedAt @@map("audit_request") } // 审核单详情 model AuditRequestDetails { id Int @id @default(autoincrement()) aduit_request_id String audit_request AuditRequest @relation(fields: [aduit_request_id], references: [id], onDelete: Cascade) content Json @@map("audit_request_details") } // ------ // 项目-空间类型 model ProjectSpaceCategory { pry_no_1 Int @default(0) pry_no_2 Int @default(0) project_category String space_category String @@id([project_category, space_category]) @@map("project_space_category") } // 材料类型 model MaterialCategory { pry_no_1 Int @default(0) pry_no_2 Int @default(0) first_category String second_category String unit String? @@id([first_category, second_category]) @@map("material_category") } // 省-市-气候区-温度-湿度 model CityInformation { pry_no_1 Int @default(0) pry_no_2 Int @default(0) province String city String climatic_zone String? env_temp Float env_hum Float @@id([province, city]) @@map("city_information") } // 空气污染物浓度限值标准 model ApcLimitStandard { id String @id // 标准ID methanal_c_lmt Float // 甲醛浓度限值 tvoc_c_lmt Float // TVOC浓度限值 benzene_c_lmt Float // 苯浓度限值 toluene_c_lmt Float // 甲苯浓度限值 p_xylene_c_lmt Float // 二甲苯浓度限值 spaces Space[] // 使用该模板的项目空间 pub_temp_spaces PublicTemplateSpace[] // 使用该标准的公共模板空间 self_temp_spaces SelfTemplateSpace[] // 使用该标准的自建模板空间 @@map("apc_limit_standard") } // ------ 论坛 ------ model SiteConfig { key String @id value String @db.Text updated_at DateTime @updatedAt @@map("site_config") } // ------ 论坛 ------ model ForumThread { id Int @id @default(autoincrement()) board String // 板块(取值属于 FORUM_BOARDS) title String content String @db.Text author_id String // User.id author_name String // 冗余 username like_count Int @default(0) reply_count Int @default(0) created_at DateTime @default(now()) updated_at DateTime @updatedAt deleted Int @default(0) replies ForumReply[] likes ForumThreadLike[] @@map("forum_thread") } model ForumReply { id Int @id @default(autoincrement()) thread_id Int thread ForumThread @relation(fields: [thread_id], references: [id], onDelete: Cascade) floor Int // 楼层 content String @db.Text author_id String author_name String created_at DateTime @default(now()) deleted Int @default(0) @@map("forum_reply") } model ForumThreadLike { thread_id Int thread ForumThread @relation(fields: [thread_id], references: [id], onDelete: Cascade) user_id String created_at DateTime @default(now()) @@id([thread_id, user_id]) @@map("forum_thread_like") }