From c4138c0e4850caac954c24a63fbb9edf81955df9 Mon Sep 17 00:00:00 2001 From: haoliang <821644@qq.com> Date: Tue, 28 Apr 2026 15:56:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(database):=20=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E5=AE=9A=E7=A8=BF=E8=90=BD=E5=9C=B0=EF=BC=8Ccnc=5Fbusiness(17?= =?UTF-8?q?=E8=A1=A8)+cnc=5Flog(3=E8=A1=A8)=EF=BC=8C=E5=90=AB=E9=A2=84?= =?UTF-8?q?=E7=BD=AE=E6=95=B0=E6=8D=AE=EF=BC=88=E8=BD=A6=E9=97=B4/?= =?UTF-8?q?=E5=93=81=E7=89=8C/=E9=85=8D=E7=BD=AE/=E5=A4=A7=E5=B1=8F?= =?UTF-8?q?=E5=8D=A1=E7=89=87=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/01-init-schema.sql | 369 ++++++++++++++++++++++++++++++++++++ database/02-init-data.sql | 71 +++++++ docs/01-数据库设计.md | 16 +- 3 files changed, 450 insertions(+), 6 deletions(-) create mode 100644 database/01-init-schema.sql create mode 100644 database/02-init-data.sql diff --git a/database/01-init-schema.sql b/database/01-init-schema.sql new file mode 100644 index 0000000..978c604 --- /dev/null +++ b/database/01-init-schema.sql @@ -0,0 +1,369 @@ +-- ============================================= +-- 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天自动清理)'; diff --git a/database/02-init-data.sql b/database/02-init-data.sql new file mode 100644 index 0000000..f58b0d3 --- /dev/null +++ b/database/02-init-data.sql @@ -0,0 +1,71 @@ +-- ============================================= +-- CNC机床数据采集系统 - 预置数据 +-- 生成时间: 2026-04-28 +-- ============================================= + +USE cnc_business; + +-- 车间预置 +INSERT IGNORE INTO cnc_workshop (name, sort_order, is_enabled) VALUES +('A栋', 1, 1), +('B栋', 2, 1), +('C栋', 3, 1); + +-- 品牌预置(FANUC) +INSERT IGNORE INTO cnc_brand (brand_name, device_field, tags_path, is_enabled) VALUES +('FANUC', 'device', 'tags', 1); + +-- FANUC字段映射预置 +SET @fanuc_brand_id = (SELECT id FROM cnc_brand WHERE brand_name = 'FANUC'); + +INSERT IGNORE INTO cnc_brand_field_mapping (brand_id, standard_field, field_name, match_by, data_type, is_required) VALUES +(@fanuc_brand_id, 'program_name', 'program_name', 'id', 'string', 1), +(@fanuc_brand_id, 'part_count', 'part_count', 'id', 'number', 1), +(@fanuc_brand_id, 'device_status', 'device_status', 'id', 'number', 0), +(@fanuc_brand_id, 'run_status', 'run_status', 'id', 'number', 0), +(@fanuc_brand_id, 'operate_mode', 'operate_mode', 'id', 'number', 0), +(@fanuc_brand_id, 'spindle_speed_set', 'spindle_speed_set', 'id', 'number', 0), +(@fanuc_brand_id, 'feed_speed_set', 'feed_speed_set', 'id', 'number', 0), +(@fanuc_brand_id, 'spindle_speed_actual', 'spindle_speed_actual', 'id', 'number', 0), +(@fanuc_brand_id, 'feed_speed_actual', 'feed_speed_actual', 'id', 'number', 0), +(@fanuc_brand_id, 'spindle_load', 'spindle_load', 'id', 'number', 0), +(@fanuc_brand_id, 'spindle_override', 'spindle_override', 'id', 'number', 0), +(@fanuc_brand_id, 'power_on_time', 'power_on_time', 'id', 'number', 0), +(@fanuc_brand_id, 'run_time', 'run_time', 'id', 'number', 0), +(@fanuc_brand_id, 'cutting_time', 'cutting_time', 'id', 'number', 0), +(@fanuc_brand_id, 'cycle_time', 'cycle_time', 'id', 'number', 0), +(@fanuc_brand_id, 'machining_status', 'machining_status', 'id', 'string', 0); + +-- 系统配置预置 +INSERT IGNORE INTO cnc_sys_config (config_key, config_value, value_type, description) VALUES +('ping_interval', '60', 'number', 'Ping检测间隔(秒)'), +('collect_retry_count', '3', 'number', '采集失败重试次数'), +('collect_retry_interval', '30', 'number', '采集重试间隔(秒)'), +('collect_fail_alert_threshold', '5', 'number', '连续失败N次触发告警'), +('heartbeat_interval', '10', 'number', '心跳写入间隔(秒)'), +('daily_summary_time', '01:00', 'string', '日终汇总执行时间'), +('config_poll_interval', '30', 'number', '采集服务轮询配置间隔(秒)'), +('log_retention_days', '90', 'number', '原始采集日志保留天数'), +('system_log_retention_days', '30', 'number', '系统日志保留天数'), +('alert_log_retention_days', '180', 'number', '异常日志保留天数'), +('heartbeat_retention_days', '7', 'number', '心跳记录保留天数'), +('bigscreen_refresh_interval', '10', 'number', '大屏刷新间隔(秒)'), +('api_token', '', 'string', '前端API Token'), +('collector_api_port', '5800', 'number', '采集服务管理API端口'), +('collector_api_key', '', 'string', '采集服务间通信API Key'), +('error_retry_base_interval', '60', 'number', '任务错误重试基础间隔(秒)'), +('admin_username', 'admin', 'string', '管理员用户名(不可修改)'), +('admin_password_hash', '$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy', 'string', '管理员密码哈希(默认admin123)'); + +-- 大屏卡片配置预置 +INSERT IGNORE INTO cnc_screen_config (card_key, card_type, title, metric, dimension, sort_order, is_enabled) VALUES +('total_online', 'stat_number', '在线机床数', 'online_count', NULL, 1, 1), +('total_production_today', 'stat_number', '今日总产量', 'part_count', NULL, 2, 1), +('workshop_production', 'bar_chart', '各车间产量', 'part_count', 'workshop', 3, 1), +('worker_rank', 'rank_list', '工人产量排行', 'part_count', 'worker', 4, 1), +('machine_rank', 'rank_list', '机床产量排行', 'part_count', 'machine', 5, 1), +('machine_status', 'status_grid', '机床状态总览', 'status', NULL, 6, 1), +('collector_status', 'stat_number', '采集服务状态', 'status', NULL, 7, 1), +('production_trend', 'line_chart', '产量趋势(7天)', 'part_count', NULL, 8, 1); + + diff --git a/docs/01-数据库设计.md b/docs/01-数据库设计.md index 6768fc1..01fe219 100644 --- a/docs/01-数据库设计.md +++ b/docs/01-数据库设计.md @@ -1,7 +1,7 @@ # CNC机床数据采集系统 - 数据库设计文档 -> 最后更新:2026-04-25 -> 状态:草案(界面设计确认后定稿,允许根据界面需求调整表结构) +> 最后更新:2026-04-28 +> 状态:定稿(界面设计已全部确认,数据库结构已落地) --- @@ -202,7 +202,7 @@ CREATE TABLE cnc_worker_machine ( ``sql CREATE TABLE cnc_collect_record ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, + id BIGINT AUTO_INCREMENT, machine_id INT NOT NULL, collect_time DATETIME NOT NULL, device_time DATETIME NULL, @@ -224,7 +224,7 @@ CREATE TABLE cnc_collect_record ( machining_status VARCHAR(20) NULL, extra_data JSON NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (machine_id) REFERENCES cnc_machine(id), + 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 @@ -455,6 +455,8 @@ CREATE TABLE cnc_sys_config ( | collector_api_port | 5800 | 采集服务管理API端口 | | collector_api_key | (自动生成) | 采集服务间通信API Key | | error_retry_base_interval | 60 | 任务错误重试基础间隔(秒) | +| admin_username | admin | 管理员用户名(不可修改) | +| admin_password_hash | (bcrypt hash of admin123) | 管理员密码哈希 | --- @@ -515,7 +517,7 @@ CREATE TABLE cnc_screen_filter ( ``sql CREATE TABLE log_collect_raw ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, + id BIGINT AUTO_INCREMENT, collect_address_id INT NOT NULL, request_time DATETIME NOT NULL, response_time DATETIME NOT NULL, @@ -525,6 +527,7 @@ CREATE TABLE log_collect_raw ( 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 @@ -545,13 +548,14 @@ CREATE TABLE log_collect_raw ( ``sql CREATE TABLE log_system ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, + 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)