You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
haoliang-net/database/01-init-schema.sql

370 lines
17 KiB
SQL

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

-- =============================================
-- 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_business17张表
-- =============================================
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_log3张表
-- =============================================
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天自动清理';