diff --git a/空气质量预测/源码/服务端/iapip-svr/prisma/schema.prisma b/空气质量预测/源码/服务端/iapip-svr/prisma/schema.prisma new file mode 100644 index 0000000..8e6f443 --- /dev/null +++ b/空气质量预测/源码/服务端/iapip-svr/prisma/schema.prisma @@ -0,0 +1,677 @@ +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? + 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? + 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 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") +} diff --git a/空气质量预测/源码/服务端/iapip-svr/src/common/constants.ts b/空气质量预测/源码/服务端/iapip-svr/src/common/constants.ts new file mode 100644 index 0000000..980f03d --- /dev/null +++ b/空气质量预测/源码/服务端/iapip-svr/src/common/constants.ts @@ -0,0 +1,53 @@ +export enum ID_PREFIX { + ADMIN = 'A', + USER = 'U', + PROJECT = 'P', + SPACE = 'S', + PUB_TEMP = 'PT', + PUB_TEMP_SPACE = 'PTS', + SELF_TEMP = 'ST', + SELF_TEMP_SPACE = 'STS', + PUB_MATERIAL = 'PM', + SELF_MATERIAL = 'SM' +} + +export enum DATA_TYPE { + PUBLIC = 'pub', + PRIVATE = 'self' +} + +export const IAPIPS_STATIC = 'iapips_static' + +export enum ERR_CODE { + // 1xxx - 参数校验相关 + INVALID_REQ_DATA = '1000', + ERR_NAME_OR_PSW = '1001', + ERR_PSW = '1002', + ACCT_NAME_EXIST = '1003', + ACCT_NOT_FOUND = '1004', + PROJ_NOT_FOUNT = '1005', + SPACE_NOT_FOUNT = '1006', + MTRL_NOT_FOUNT = '1007', + PROJ_PREDICTED = '1008', + PREDICTION_ERROR = '1009', + INVALID_COLLECT = '1010', + CAT_DUPL = '1011', + CAT_EXIST = '1012', + AUDIT_REQ_EXIST = '1013', + AUDIT_REQ_NOT_FOUND = '1014', + AUDIT_REQ_INVALID_STATUS = '1015', + NO_UPLOAD_FILE = '1016', + SMS_CODE_ERR = '1017', + SMS_RATE_LIMIT = '1018', + // 2xxx - 身份校验相关 + UNAUTHORIZED = '2000', + // 3xxx - 权限校验相关 + FORBIDDEN = '3000', + FORBIDDEN_ADMIN_TYPE = '3001', + FORBIDDEN_ACCOUNT = '3002', + // 4xxx - 服务端异常相关 + UNKNOWN_ERR = '4000' +} + +// 论坛板块(固定,不建表) +export const FORUM_BOARDS = ['甲醛治理', '异味TVOC', '环保材料', '装修避坑', '求助问答'] \ No newline at end of file