-- 宏量点云处理软件 - 数据库初始化脚本 -- 该脚本在MySQL容器首次启动时自动执行 -- 后续增量迁移由 server/_core/index.ts runMigrations() 从 drizzle/*.sql 自动应用 -- 设置字符集 SET NAMES utf8mb4; SET CHARACTER SET utf8mb4; -- 确保数据库存在 CREATE DATABASE IF NOT EXISTS pointcloud_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE pointcloud_db; -- 用户表 CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(64) NOT NULL UNIQUE, passwordHash VARCHAR(255), name TEXT, email VARCHAR(320), role ENUM('user', 'admin', 'super_admin') NOT NULL DEFAULT 'user', isActive INT NOT NULL DEFAULT 1, mustChangePassword INT NOT NULL DEFAULT 1, sessionVersion INT NOT NULL DEFAULT 0, createdAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, lastLoginAt TIMESTAMP NULL, INDEX idx_email (email(255)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 点云项目表(旧版,兼容保留) CREATE TABLE IF NOT EXISTS point_cloud_projects ( id INT AUTO_INCREMENT PRIMARY KEY, userId INT NOT NULL, name VARCHAR(255) NOT NULL, description TEXT, cadModelUrl TEXT, cadModelName VARCHAR(255), totalChunks INT NOT NULL DEFAULT 0, processedChunks INT NOT NULL DEFAULT 0, totalPoints BIGINT NOT NULL DEFAULT 0, status ENUM('pending', 'uploading', 'processing', 'completed', 'error') NOT NULL DEFAULT 'pending', createdAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_userId (userId), INDEX idx_status (status), FOREIGN KEY (userId) REFERENCES users(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 点云数据块表(旧版,兼容保留) CREATE TABLE IF NOT EXISTS point_cloud_chunks ( id INT AUTO_INCREMENT PRIMARY KEY, projectId INT NOT NULL, chunkIndex INT NOT NULL, fileName VARCHAR(255) NOT NULL, fileUrl TEXT NOT NULL, fileSize BIGINT NOT NULL DEFAULT 0, pointCount INT NOT NULL DEFAULT 0, status ENUM('pending', 'uploading', 'processing', 'completed', 'error') NOT NULL DEFAULT 'pending', lodLevel INT NOT NULL DEFAULT 0, boundingBox JSON, createdAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_projectId (projectId), INDEX idx_status (status), UNIQUE KEY uk_project_chunk (projectId, chunkIndex), FOREIGN KEY (projectId) REFERENCES point_cloud_projects(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- CAD模型表(旧版,兼容保留) CREATE TABLE IF NOT EXISTS cad_models ( id INT AUTO_INCREMENT PRIMARY KEY, userId INT NOT NULL, name VARCHAR(255) NOT NULL, format VARCHAR(32) NOT NULL, fileUrl TEXT NOT NULL, fileSize BIGINT NOT NULL DEFAULT 0, vertices INT NOT NULL DEFAULT 0, faces INT NOT NULL DEFAULT 0, boundingBox JSON, createdAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, INDEX idx_userId (userId), FOREIGN KEY (userId) REFERENCES users(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 分析结果表(旧版,兼容保留) CREATE TABLE IF NOT EXISTS analysis_results ( id INT AUTO_INCREMENT PRIMARY KEY, projectId INT NOT NULL, analysisType ENUM('error', 'measurement', 'compression') NOT NULL, resultData JSON NOT NULL, createdAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, INDEX idx_projectId (projectId), INDEX idx_type (analysisType), FOREIGN KEY (projectId) REFERENCES point_cloud_projects(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ─── 车系/车型/检测任务/分析结果 层级结构 ────────────────────────────────────── CREATE TABLE IF NOT EXISTS `vehicle_series` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(100) NOT NULL, `description` TEXT, `createdAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `updatedAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `vehicle_models` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `seriesId` INT NOT NULL, `name` VARCHAR(100) NOT NULL, `description` TEXT, `createdAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `updatedAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `model_cad_files` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `modelId` INT NOT NULL, `name` VARCHAR(255) NOT NULL, `format` VARCHAR(32) NOT NULL, `fileSize` BIGINT NOT NULL, `filePath` VARCHAR(512) NOT NULL, `createdAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `model_pointcloud_files` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `modelId` INT NOT NULL, `name` VARCHAR(255) NOT NULL, `fileSize` BIGINT NOT NULL, `filePath` VARCHAR(512) NOT NULL, `metadataStatus` ENUM('pending','ready','unsupported','error') NOT NULL DEFAULT 'pending', `pointCount` BIGINT NULL, `pointAttributes` JSON NULL, `pointDataFormat` VARCHAR(32) NULL, `bytesPerPoint` INT NULL, `metadataError` TEXT NULL, `createdAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, INDEX `idx_model_pointcloud_modelId` (`modelId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `inspection_tasks` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `modelId` INT NOT NULL, `name` VARCHAR(255) NOT NULL, `inspector` VARCHAR(100), `notes` TEXT, `status` ENUM('created','pending','processing','completed','error') NOT NULL DEFAULT 'created', `createdAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `updatedAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `completedAt` TIMESTAMP NULL, UNIQUE KEY `uk_inspection_tasks_model_name` (`modelId`, `name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `task_pointcloud_files` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `taskId` INT NOT NULL, `name` VARCHAR(255) NOT NULL, `fileSize` BIGINT NOT NULL, `filePath` VARCHAR(512) NOT NULL, `source` VARCHAR(32) NOT NULL DEFAULT 'uploaded', `sourceResultId` INT NULL, `sourcePointcloudFileId` INT NULL, `sourceModelPointcloudId` INT NULL, `metadataStatus` ENUM('pending','ready','unsupported','error') NOT NULL DEFAULT 'pending', `pointCount` BIGINT NULL, `pointAttributes` JSON NULL, `pointDataFormat` VARCHAR(32) NULL, `bytesPerPoint` INT NULL, `metadataError` TEXT NULL, `createdAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `task_analysis_results` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `taskId` INT NOT NULL, `type` ENUM('error_analysis','measurement','compression','smooth_heatmap','assembly_inspection','obj_deviation','plugin') NOT NULL, `status` ENUM('pending','processing','completed','error','cancelled') NOT NULL DEFAULT 'pending', `errorStats` JSON, `measurements` JSON, `resultData` JSON, `createdAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `updatedAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 输出初始化完成信息 SELECT 'Database initialization completed successfully!' AS message;