-- CNC机床数据采集分析系统数据库脚本
-- 创建时间: 2024-01-01
-- 数据库: cnc_business (业务库)

-- 1. 设备管理表
-- 设备信息表
CREATE TABLE `devices` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `device_code` varchar(50) NOT NULL COMMENT '设备编号',
  `device_name` varchar(100) NOT NULL COMMENT '设备名称',
  `ip_address` varchar(15) NOT NULL COMMENT 'IP地址',
  `http_url` varchar(255) NOT NULL COMMENT '采集地址',
  `collection_interval` int(11) NOT NULL DEFAULT '60' COMMENT '采集间隔(秒)',
  `template_id` int(11) NOT NULL COMMENT '模板ID',
  `is_available` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否可用',
  `is_online` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否在线',
  `last_collection_time` datetime DEFAULT NULL COMMENT '最后采集时间',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_device_code` (`device_code`),
  KEY `idx_ip_address` (`ip_address`),
  KEY `idx_template_id` (`template_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备信息表';

-- 设备状态表
CREATE TABLE `device_status` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `device_id` int(11) NOT NULL COMMENT '设备ID',
  `status` varchar(20) NOT NULL COMMENT '设备状态',
  `is_running` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否运行',
  `nc_program` varchar(100) DEFAULT NULL COMMENT 'NC程序名',
  `cumulative_count` int(11) NOT NULL DEFAULT '0' COMMENT '累计数量',
  `operating_mode` varchar(20) DEFAULT NULL COMMENT '操作模式',
  `record_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间',
  PRIMARY KEY (`id`),
  KEY `idx_device_id` (`device_id`),
  KEY `idx_record_time` (`record_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备状态表';

-- 2. 模板管理表
-- 品牌模板表
CREATE TABLE `cnc_templates` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `brand_name` varchar(50) NOT NULL COMMENT '品牌名称',
  `description` varchar(255) DEFAULT NULL COMMENT '描述',
  `is_enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用',
  `field_mappings` json NOT NULL COMMENT '字段映射配置',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_brand_name` (`brand_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='CNC品牌模板表';

-- 字段映射表
CREATE TABLE `template_field_mappings` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `template_id` int(11) NOT NULL COMMENT '模板ID',
  `source_field_path` varchar(255) NOT NULL COMMENT '源字段路径',
  `standard_field_id` varchar(50) NOT NULL COMMENT '标准字段ID',
  `standard_field_desc` varchar(100) NOT NULL COMMENT '标准字段描述',
  `data_type` varchar(20) NOT NULL COMMENT '数据类型',
  `conversion_rule` json DEFAULT NULL COMMENT '转换规则',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_template_id` (`template_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='模板字段映射表';

-- 3. 生产数据表
-- 生产记录表
CREATE TABLE `production_records` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `device_id` int(11) NOT NULL COMMENT '设备ID',
  `nc_program` varchar(100) NOT NULL COMMENT 'NC程序名',
  `production_date` date NOT NULL COMMENT '生产日期',
  `quantity` int(11) NOT NULL DEFAULT '0' COMMENT '产量',
  `quality_rate` decimal(5,2) DEFAULT '100.00' COMMENT '合格率',
  `start_time` datetime DEFAULT NULL COMMENT '开始时间',
  `end_time` datetime DEFAULT NULL COMMENT '结束时间',
  `operator_id` int(11) DEFAULT NULL COMMENT '操作员ID',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_device_id` (`device_id`),
  KEY `idx_nc_program` (`nc_program`),
  KEY `idx_production_date` (`production_date`),
  KEY `idx_operator_id` (`operator_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产记录表';

-- 程序产量统计表
CREATE TABLE `program_production_summary` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `device_id` int(11) NOT NULL COMMENT '设备ID',
  `nc_program` varchar(100) NOT NULL COMMENT 'NC程序名',
  `production_date` date NOT NULL COMMENT '生产日期',
  `total_quantity` int(11) NOT NULL DEFAULT '0' COMMENT '总产量',
  `valid_quantity` int(11) NOT NULL DEFAULT '0' COMMENT '有效产量',
  `invalid_quantity` int(11) NOT NULL DEFAULT '0' COMMENT '无效数量',
  `quality_rate` decimal(5,2) DEFAULT '100.00' COMMENT '合格率',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_device_program_date` (`device_id`,`nc_program`,`production_date`),
  KEY `idx_production_date` (`production_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='程序产量统计表';

-- 4. 用户管理表
-- 用户表
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `password_hash` varchar(255) NOT NULL COMMENT '密码哈希',
  `real_name` varchar(50) NOT NULL COMMENT '真实姓名',
  `email` varchar(100) DEFAULT NULL COMMENT '邮箱',
  `phone` varchar(20) DEFAULT NULL COMMENT '电话',
  `role_id` int(11) NOT NULL COMMENT '角色ID',
  `is_active` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否激活',
  `last_login_time` datetime DEFAULT NULL COMMENT '最后登录时间',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_username` (`username`),
  KEY `idx_role_id` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

-- 角色表
CREATE TABLE `roles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `role_name` varchar(50) NOT NULL COMMENT '角色名称',
  `description` varchar(255) DEFAULT NULL COMMENT '角色描述',
  `permissions` json NOT NULL COMMENT '权限列表',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_role_name` (`role_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';

-- 员工表
CREATE TABLE `employees` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `employee_code` varchar(50) NOT NULL COMMENT '员工编号',
  `name` varchar(50) NOT NULL COMMENT '员工姓名',
  `department` varchar(50) DEFAULT NULL COMMENT '部门',
  `position` varchar(50) DEFAULT NULL COMMENT '职位',
  `assigned_devices` json DEFAULT NULL COMMENT '分配的设备ID列表',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_employee_code` (`employee_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工表';

-- 设备分配表
CREATE TABLE `device_assignments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `device_id` int(11) NOT NULL COMMENT '设备ID',
  `employee_id` int(11) NOT NULL COMMENT '员工ID',
  `assignment_date` date NOT NULL COMMENT '分配日期',
  `end_date` date DEFAULT NULL COMMENT '结束日期',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_device_id` (`device_id`),
  KEY `idx_employee_id` (`employee_id`),
  KEY `idx_assignment_date` (`assignment_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备分配表';

-- 5. 系统管理表
-- 统计规则表
CREATE TABLE `statistic_rules` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `rule_name` varchar(100) NOT NULL COMMENT '规则名称',
  `description` varchar(255) DEFAULT NULL COMMENT '描述',
  `metric_formula` text NOT NULL COMMENT '指标计算公式',
  `group_by_dimensions` json NOT NULL COMMENT '分组维度',
  `is_enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='统计规则表';

-- 告警表
CREATE TABLE `alarms` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `alarm_type` varchar(50) NOT NULL COMMENT '告警类型',
  `alarm_level` varchar(20) NOT NULL COMMENT '告警级别',
  `alarm_content` text NOT NULL COMMENT '告警内容',
  `device_id` int(11) DEFAULT NULL COMMENT '关联设备ID',
  `device_name` varchar(100) DEFAULT NULL COMMENT '设备名称',
  `is_resolved` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已解决',
  `occurrence_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '发生时间',
  `resolution_time` datetime DEFAULT NULL COMMENT '解决时间',
  `resolution_note` text DEFAULT NULL COMMENT '解决备注',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_alarm_type` (`alarm_type`),
  KEY `idx_alarm_level` (`alarm_level`),
  KEY `idx_device_id` (`device_id`),
  KEY `idx_occurrence_time` (`occurrence_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='告警表';

-- 系统配置表
CREATE TABLE `system_config` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `config_key` varchar(100) NOT NULL COMMENT '配置键',
  `config_value` text NOT NULL COMMENT '配置值',
  `description` varchar(255) DEFAULT NULL COMMENT '描述',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_config_key` (`config_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置表';

-- 6. 初始化数据
-- 插入默认角色
INSERT INTO `roles` (`role_name`, `description`, `permissions`) VALUES
('管理员', '系统管理员，拥有所有权限', '["*"]'),
('班组长', '班组长，管理本班组设备', '["device:view", "production:view", "alarm:view"]'),
('操作员', '操作员，查看个人设备', '["device:view_own", "production:view_own"]'),
('访客', '访客，只读权限', '["device:view_readonly", "production:view_readonly"]');

-- 插入默认用户
INSERT INTO `users` (`username`, `password_hash`, `real_name`, `role_id`, `is_active`) VALUES
('admin', '$2a$10$XUn0bQjQoO.nE0zWnYh0uOe2zQzQzQzQzQzQzQzQzQzQzQzQzQzQzQzQzQzQz', '系统管理员', 1, 1);

-- 插入默认系统配置
INSERT INTO `system_config` (`config_key`, `config_value`, `description`) VALUES
('collection_interval', '60', '数据采集间隔（秒）'),
('max_retry_count', '3', '最大重试次数'),
('retry_interval', '30', '重试间隔（秒）'),
('max_concurrent_collections', '100', '最大并发采集数'),
('data_retention_days', '30', '数据保留天数'),
('alarm_email_enabled', 'true', '是否启用告警邮件'),
('alarm_email_smtp', 'smtp.example.com', '邮件服务器'),
('alarm_email_port', '587', '邮件端口'),
('alarm_email_username', 'alarm@example.com', '邮件用户名'),
('alarm_email_password', 'password', '邮件密码'),
('dashboard_refresh_interval', '30', '仪表板刷新间隔（秒）');