-- ============================================= -- CNC机床数据采集系统 - 数据库初始化脚本 -- MariaDB 11.8 + UTF8MB4 -- 生成时间: 2026-04-28 -- ============================================= -- 创建数据库 CREATE DATABASE IF NOT EXISTS cnc_business DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE DATABASE IF NOT EXISTS cnc_log DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci; -- ============================================= -- 业务库 cnc_business(17张表) -- ============================================= USE cnc_business; -- 2.1 车间表 CREATE TABLE IF NOT EXISTS cnc_workshop ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL UNIQUE, sort_order INT NOT NULL DEFAULT 0, is_enabled TINYINT(1) NOT NULL DEFAULT 1, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='车间表'; -- 2.2 品牌模板表 CREATE TABLE IF NOT EXISTS cnc_brand ( id INT AUTO_INCREMENT PRIMARY KEY, brand_name VARCHAR(50) NOT NULL UNIQUE, device_field VARCHAR(50) NOT NULL DEFAULT 'device', tags_path VARCHAR(100) NOT NULL DEFAULT 'tags', is_enabled TINYINT(1) NOT NULL DEFAULT 1, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='CNC品牌模板表'; -- 2.3 品牌字段映射表 CREATE TABLE IF NOT EXISTS cnc_brand_field_mapping ( id INT AUTO_INCREMENT PRIMARY KEY, brand_id INT NOT NULL, standard_field VARCHAR(50) NOT NULL, field_name VARCHAR(50) NOT NULL, match_by VARCHAR(20) NOT NULL DEFAULT 'id', data_type VARCHAR(20) NOT NULL DEFAULT 'string', is_required TINYINT(1) NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (brand_id) REFERENCES cnc_brand(id) ON DELETE CASCADE, UNIQUE KEY uk_brand_standard (brand_id, standard_field) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='品牌字段映射表'; -- 2.4 采集地址表 CREATE TABLE IF NOT EXISTS cnc_collect_address ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, url VARCHAR(500) NOT NULL, brand_id INT NOT NULL, collect_interval INT NOT NULL DEFAULT 30, is_enabled TINYINT(1) NOT NULL DEFAULT 1, last_collect_time DATETIME NULL, last_collect_status VARCHAR(20) NULL, fail_count INT NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (brand_id) REFERENCES cnc_brand(id), INDEX idx_brand (brand_id), INDEX idx_enabled (is_enabled) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采集地址表'; -- 2.5 机床表 CREATE TABLE IF NOT EXISTS cnc_machine ( id INT AUTO_INCREMENT PRIMARY KEY, device_code VARCHAR(100) NOT NULL, name VARCHAR(100) NOT NULL, workshop_id INT NOT NULL, collect_address_id INT NOT NULL, ip_address VARCHAR(50) NOT NULL, brand_id INT NOT NULL, is_enabled TINYINT(1) NOT NULL DEFAULT 1, is_online TINYINT(1) NOT NULL DEFAULT 0, last_ping_time DATETIME NULL, last_collect_time DATETIME NULL, last_device_status VARCHAR(20) NULL, last_run_status VARCHAR(20) NULL, last_program_name VARCHAR(200) NULL, last_part_count DECIMAL(15,5) NULL, last_operate_mode VARCHAR(20) NULL, last_machining_status VARCHAR(20) NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (workshop_id) REFERENCES cnc_workshop(id), FOREIGN KEY (collect_address_id) REFERENCES cnc_collect_address(id), FOREIGN KEY (brand_id) REFERENCES cnc_brand(id), UNIQUE KEY uk_device_code (device_code), INDEX idx_workshop (workshop_id), INDEX idx_collect_address (collect_address_id), INDEX idx_enabled_online (is_enabled, is_online), INDEX idx_enabled_address (is_enabled, collect_address_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='CNC机床表'; -- 2.6 工人表 CREATE TABLE IF NOT EXISTS cnc_worker ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, code VARCHAR(50) NOT NULL UNIQUE, is_enabled TINYINT(1) NOT NULL DEFAULT 1, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工人表'; -- 2.7 工人-机床绑定表 CREATE TABLE IF NOT EXISTS cnc_worker_machine ( id INT AUTO_INCREMENT PRIMARY KEY, worker_id INT NOT NULL, machine_id INT NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (worker_id) REFERENCES cnc_worker(id) ON DELETE CASCADE, FOREIGN KEY (machine_id) REFERENCES cnc_machine(id) ON DELETE CASCADE, UNIQUE KEY uk_machine (machine_id), INDEX idx_worker (worker_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工人-机床绑定表'; -- 2.8 采集结构化记录表(按月分区) -- 注意:分区键collect_time必须包含在PRIMARY KEY中,分区表不支持FOREIGN KEY CREATE TABLE IF NOT EXISTS cnc_collect_record ( id BIGINT AUTO_INCREMENT, machine_id INT NOT NULL, collect_time DATETIME NOT NULL, device_time DATETIME NULL, program_name VARCHAR(200) NULL, part_count DECIMAL(15,5) NULL, device_status VARCHAR(20) NULL, run_status VARCHAR(20) NULL, operate_mode VARCHAR(20) NULL, spindle_speed_set DECIMAL(15,5) NULL, feed_speed_set DECIMAL(15,5) NULL, spindle_speed_actual DECIMAL(15,5) NULL, feed_speed_actual DECIMAL(15,5) NULL, spindle_load DECIMAL(15,5) NULL, spindle_override DECIMAL(5,2) NULL, power_on_time DECIMAL(15,2) NULL, run_time DECIMAL(15,2) NULL, cutting_time DECIMAL(15,2) NULL, cycle_time DECIMAL(15,2) NULL, machining_status VARCHAR(20) NULL, extra_data JSON NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id, collect_time), INDEX idx_machine_time (machine_id, collect_time), INDEX idx_collect_time (collect_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采集结构化记录表(按月分区,90天自动清理)' PARTITION BY RANGE (TO_DAYS(collect_time)) ( PARTITION p202604 VALUES LESS THAN (TO_DAYS('2026-05-01')), PARTITION p202605 VALUES LESS THAN (TO_DAYS('2026-06-01')), PARTITION p202606 VALUES LESS THAN (TO_DAYS('2026-07-01')), PARTITION p_future VALUES LESS THAN MAXVALUE ); -- 2.9 产量分段记录表 CREATE TABLE IF NOT EXISTS cnc_production_segment ( id BIGINT AUTO_INCREMENT PRIMARY KEY, machine_id INT NOT NULL, program_name VARCHAR(200) NOT NULL, production_date DATE NOT NULL, start_time DATETIME NOT NULL, end_time DATETIME NULL, start_part_count DECIMAL(15,5) NOT NULL, end_part_count DECIMAL(15,5) NULL, quantity DECIMAL(15,5) NULL, is_settled TINYINT(1) NOT NULL DEFAULT 0, close_reason VARCHAR(30) NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (machine_id) REFERENCES cnc_machine(id), INDEX idx_machine_date (machine_id, production_date), INDEX idx_machine_date_program (machine_id, production_date, program_name), INDEX idx_active (machine_id, is_settled, end_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产量分段记录表'; -- 2.10 机床日状态表 CREATE TABLE IF NOT EXISTS cnc_machine_daily_status ( id INT AUTO_INCREMENT PRIMARY KEY, machine_id INT NOT NULL, production_date DATE NOT NULL, data_status VARCHAR(20) NOT NULL DEFAULT 'normal', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (machine_id) REFERENCES cnc_machine(id), UNIQUE KEY uk_machine_date (machine_id, production_date), INDEX idx_date_status (production_date, data_status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='机床日状态表'; -- 2.11 日汇总表(按机床+程序) CREATE TABLE IF NOT EXISTS cnc_daily_production ( id INT AUTO_INCREMENT PRIMARY KEY, machine_id INT NOT NULL, production_date DATE NOT NULL, program_name VARCHAR(200) NOT NULL, total_quantity DECIMAL(15,5) NOT NULL DEFAULT 0, segment_count INT NOT NULL DEFAULT 1, total_run_time DECIMAL(15,2) NULL, total_cutting_time DECIMAL(15,2) NULL, total_cycle_time DECIMAL(15,2) NULL, is_adjusted TINYINT(1) NOT NULL DEFAULT 0, adjusted_quantity DECIMAL(15,5) NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (machine_id) REFERENCES cnc_machine(id), UNIQUE KEY uk_machine_date_program (machine_id, production_date, program_name), INDEX idx_date (production_date), INDEX idx_date_program (production_date, program_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='日汇总表(按机床+程序)'; -- 2.12 工人日汇总表 CREATE TABLE IF NOT EXISTS cnc_worker_daily_summary ( id INT AUTO_INCREMENT PRIMARY KEY, worker_id INT NOT NULL, production_date DATE NOT NULL, total_quantity DECIMAL(15,5) NOT NULL DEFAULT 0, machine_count INT NOT NULL DEFAULT 0, program_count INT NOT NULL DEFAULT 0, is_adjusted TINYINT(1) NOT NULL DEFAULT 0, adjusted_quantity DECIMAL(15,5) NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (worker_id) REFERENCES cnc_worker(id) ON DELETE CASCADE, UNIQUE KEY uk_worker_date (worker_id, production_date), INDEX idx_date (production_date), INDEX idx_date_quantity (production_date, total_quantity) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工人日汇总表'; -- 2.13 产量修正审计表 CREATE TABLE IF NOT EXISTS cnc_production_adjustment ( id BIGINT AUTO_INCREMENT PRIMARY KEY, target_table VARCHAR(30) NOT NULL, target_id INT NOT NULL, field_name VARCHAR(50) NOT NULL, old_value DECIMAL(15,5) NULL, new_value DECIMAL(15,5) NOT NULL, reason VARCHAR(500) NOT NULL, operator_ip VARCHAR(50) NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, INDEX idx_target (target_table, target_id), INDEX idx_created (created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产量修正审计表'; -- 2.14 告警表 CREATE TABLE IF NOT EXISTS cnc_alert ( id BIGINT AUTO_INCREMENT PRIMARY KEY, alert_type VARCHAR(30) NOT NULL, machine_id INT NULL, collect_address_id INT NULL, title VARCHAR(200) NOT NULL, detail TEXT NULL, is_resolved TINYINT(1) NOT NULL DEFAULT 0, resolved_at DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (machine_id) REFERENCES cnc_machine(id) ON DELETE SET NULL, FOREIGN KEY (collect_address_id) REFERENCES cnc_collect_address(id) ON DELETE SET NULL, INDEX idx_type_resolved (alert_type, is_resolved), INDEX idx_machine_time (machine_id, created_at), INDEX idx_created (created_at), INDEX idx_unresolved (is_resolved, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='告警表'; -- 2.15 系统配置表 CREATE TABLE IF NOT EXISTS cnc_sys_config ( id INT AUTO_INCREMENT PRIMARY KEY, config_key VARCHAR(100) NOT NULL UNIQUE, config_value TEXT NOT NULL, value_type VARCHAR(20) NOT NULL DEFAULT 'string', description VARCHAR(200) NULL, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统配置表'; -- 2.16 大屏配置表 CREATE TABLE IF NOT EXISTS cnc_screen_config ( id INT AUTO_INCREMENT PRIMARY KEY, card_key VARCHAR(50) NOT NULL UNIQUE, card_type VARCHAR(30) NOT NULL, title VARCHAR(100) NOT NULL, metric VARCHAR(50) NOT NULL, dimension VARCHAR(30) NULL, sort_order INT NOT NULL DEFAULT 0, is_enabled TINYINT(1) NOT NULL DEFAULT 1, chart_config JSON NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='大屏卡片配置表'; -- 2.17 大屏筛选配置表 CREATE TABLE IF NOT EXISTS cnc_screen_filter ( id INT AUTO_INCREMENT PRIMARY KEY, screen_key VARCHAR(50) NOT NULL, filter_type VARCHAR(30) NOT NULL, filter_value VARCHAR(100) NOT NULL, is_default TINYINT(1) NOT NULL DEFAULT 0, sort_order INT NOT NULL DEFAULT 0, UNIQUE KEY uk_screen_filter (screen_key, filter_type, filter_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='大屏筛选配置表'; -- ============================================= -- 日志库 cnc_log(3张表) -- ============================================= USE cnc_log; -- 3.1 原始采集JSON表(按月分区) -- 注意:分区键request_time必须包含在PRIMARY KEY中 CREATE TABLE IF NOT EXISTS log_collect_raw ( id BIGINT AUTO_INCREMENT, collect_address_id INT NOT NULL, request_time DATETIME NOT NULL, response_time DATETIME NOT NULL, response_duration INT NULL, is_success TINYINT(1) NOT NULL DEFAULT 1, status_code INT NULL, raw_json MEDIUMTEXT NOT NULL, error_message VARCHAR(500) NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id, request_time), INDEX idx_address_time (collect_address_id, request_time), INDEX idx_request_time (request_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='原始采集JSON表(按月分区,90天自动清理)' PARTITION BY RANGE (TO_DAYS(request_time)) ( PARTITION p202604 VALUES LESS THAN (TO_DAYS('2026-05-01')), PARTITION p202605 VALUES LESS THAN (TO_DAYS('2026-06-01')), PARTITION p202606 VALUES LESS THAN (TO_DAYS('2026-07-01')), PARTITION p_future VALUES LESS THAN MAXVALUE ); -- 3.2 系统日志表(按月分区) -- 注意:分区键created_at必须包含在PRIMARY KEY中 CREATE TABLE IF NOT EXISTS log_system ( id BIGINT AUTO_INCREMENT, log_level VARCHAR(10) NOT NULL, source VARCHAR(50) NOT NULL, message TEXT NOT NULL, stack_trace TEXT NULL, extra_data JSON NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id, created_at), INDEX idx_level_time (log_level, created_at), INDEX idx_source_time (source, created_at), INDEX idx_created (created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统日志表(按月分区,30天自动清理)' PARTITION BY RANGE (TO_DAYS(created_at)) ( PARTITION p202604 VALUES LESS THAN (TO_DAYS('2026-05-01')), PARTITION p202605 VALUES LESS THAN (TO_DAYS('2026-06-01')), PARTITION p202606 VALUES LESS THAN (TO_DAYS('2026-07-01')), PARTITION p_future VALUES LESS THAN MAXVALUE ); -- 3.3 采集服务心跳表 CREATE TABLE IF NOT EXISTS log_collector_heartbeat ( id BIGINT AUTO_INCREMENT PRIMARY KEY, service_id VARCHAR(50) NOT NULL DEFAULT 'CncCollector', status VARCHAR(20) NOT NULL, collect_address_id INT NULL, last_collect_time DATETIME NULL, success_count INT NOT NULL DEFAULT 0, fail_count INT NOT NULL DEFAULT 0, uptime_seconds BIGINT NULL, detail JSON NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, INDEX idx_service_time (service_id, created_at), INDEX idx_address_time (collect_address_id, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采集服务心跳表(7天自动清理)';