-- ============================================ -- Warehouse Material Management System (WMMS) -- Database Initialization Script -- MySQL 5.7+ -- ============================================ -- Create database CREATE DATABASE IF NOT EXISTS wmms; USE wmms; -- ============================================ -- Table: materials -- ============================================ CREATE TABLE IF NOT EXISTS materials ( id BIGINT AUTO_INCREMENT PRIMARY KEY, material_code VARCHAR(50) NOT NULL UNIQUE, name VARCHAR(200) NOT NULL, material_image VARCHAR(500), spec VARCHAR(200), category VARCHAR(100), unit VARCHAR(20), warning_stock INT DEFAULT 0, current_stock INT DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_material_code (material_code), INDEX idx_category (category) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================ -- Table: tags -- ============================================ CREATE TABLE IF NOT EXISTS tags ( id BIGINT AUTO_INCREMENT PRIMARY KEY, material_id BIGINT NOT NULL, tag_code VARCHAR(100) NOT NULL UNIQUE, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_material_id (material_id), INDEX idx_tag_code (tag_code), CONSTRAINT fk_tags_material FOREIGN KEY (material_id) REFERENCES materials(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================ -- Table: apply_orders -- ============================================ CREATE TABLE IF NOT EXISTS apply_orders ( id BIGINT AUTO_INCREMENT PRIMARY KEY, applicant VARCHAR(100) NOT NULL, apply_date DATE NOT NULL, status ENUM('draft', 'pending', 'approved', 'rejected') DEFAULT 'draft', approval_comment TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_applicant (applicant), INDEX idx_status (status), INDEX idx_apply_date (apply_date) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================ -- Table: apply_items -- ============================================ CREATE TABLE IF NOT EXISTS apply_items ( id BIGINT AUTO_INCREMENT PRIMARY KEY, apply_order_id BIGINT NOT NULL, material_id BIGINT NOT NULL, quantity INT NOT NULL, purpose TEXT, INDEX idx_apply_order_id (apply_order_id), INDEX idx_material_id (material_id), CONSTRAINT fk_apply_items_order FOREIGN KEY (apply_order_id) REFERENCES apply_orders(id) ON DELETE CASCADE, CONSTRAINT fk_apply_items_material FOREIGN KEY (material_id) REFERENCES materials(id) ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================ -- Table: inbound_orders -- ============================================ CREATE TABLE IF NOT EXISTS inbound_orders ( id BIGINT AUTO_INCREMENT PRIMARY KEY, inbound_date DATETIME NOT NULL, handler VARCHAR(100) NOT NULL, supplier VARCHAR(200), created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_inbound_date (inbound_date), INDEX idx_handler (handler) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================ -- Table: inbound_items -- ============================================ CREATE TABLE IF NOT EXISTS inbound_items ( id BIGINT AUTO_INCREMENT PRIMARY KEY, inbound_order_id BIGINT NOT NULL, material_id BIGINT NOT NULL, quantity INT NOT NULL, INDEX idx_inbound_order_id (inbound_order_id), INDEX idx_material_id (material_id), CONSTRAINT fk_inbound_items_order FOREIGN KEY (inbound_order_id) REFERENCES inbound_orders(id) ON DELETE CASCADE, CONSTRAINT fk_inbound_items_material FOREIGN KEY (material_id) REFERENCES materials(id) ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================ -- Table: outbound_orders -- ============================================ CREATE TABLE IF NOT EXISTS outbound_orders ( id BIGINT AUTO_INCREMENT PRIMARY KEY, outbound_date DATETIME NOT NULL, handler VARCHAR(100) NOT NULL, receiver VARCHAR(100) NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_outbound_date (outbound_date), INDEX idx_handler (handler), INDEX idx_receiver (receiver) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================ -- Table: outbound_items -- ============================================ CREATE TABLE IF NOT EXISTS outbound_items ( id BIGINT AUTO_INCREMENT PRIMARY KEY, outbound_order_id BIGINT NOT NULL, material_id BIGINT NOT NULL, quantity INT NOT NULL, INDEX idx_outbound_order_id (outbound_order_id), INDEX idx_material_id (material_id), CONSTRAINT fk_outbound_items_order FOREIGN KEY (outbound_order_id) REFERENCES outbound_orders(id) ON DELETE CASCADE, CONSTRAINT fk_outbound_items_material FOREIGN KEY (material_id) REFERENCES materials(id) ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================ -- Table: material_logs -- ============================================ CREATE TABLE IF NOT EXISTS material_logs ( id BIGINT AUTO_INCREMENT PRIMARY KEY, operation_type VARCHAR(50) NOT NULL, material_id BIGINT NOT NULL, old_value TEXT, new_value TEXT, operator VARCHAR(100), description TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_operation_type (operation_type), INDEX idx_material_id (material_id), INDEX idx_created_at (created_at), CONSTRAINT fk_material_logs_material FOREIGN KEY (material_id) REFERENCES materials(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================ -- Table: stock_logs -- ============================================ CREATE TABLE IF NOT EXISTS stock_logs ( id BIGINT AUTO_INCREMENT PRIMARY KEY, material_id BIGINT NOT NULL, type ENUM('in', 'out') NOT NULL, quantity INT NOT NULL, related_order_type VARCHAR(50) NOT NULL, related_order_id BIGINT NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_material_id (material_id), INDEX idx_type (type), INDEX idx_related_order (related_order_type, related_order_id), CONSTRAINT fk_stock_logs_material FOREIGN KEY (material_id) REFERENCES materials(id) ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================ -- Table: users -- ============================================ CREATE TABLE IF NOT EXISTS users ( id BIGINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, role ENUM('admin','user') NOT NULL DEFAULT 'user', description VARCHAR(500) DEFAULT '', created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================ -- Category Code Reference -- A01-A07: 标准件, 成品件, 简易加工件, 精密加工件, 钣金件, 塑胶件, 其他 -- B01-B07: 成品件, 简易加工件, PCB硬板, FPC软板, 线束, 组装组件, 其他 -- C01-C03: 连接耗材, 密封耗材, 其他 -- D01-D04: 自研程序固件, 外购软件授权, 授权介质, 其他 -- E01-E02: 成品, 半成品 -- F01-F05: 资料文档, 标识标牌, 包装物料, 随机工具配件, 其他 -- ============================================ -- ============================================ -- Table: materials_category (reference table) -- ============================================ CREATE TABLE IF NOT EXISTS materials_category ( category_code VARCHAR(10) PRIMARY KEY, category_name VARCHAR(100) NOT NULL, parent_category VARCHAR(10), description VARCHAR(200) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- Insert category reference data INSERT INTO materials_category (category_code, category_name, description) VALUES ('A01', '标准件', 'Standard parts'), ('A02', '成品件', 'Finished parts'), ('A03', '简易加工件', 'Simple machined parts'), ('A04', '精密加工件', 'Precision machined parts'), ('A05', '钣金件', 'Sheet metal parts'), ('A06', '塑胶件', 'Plastic parts'), ('A07', '其他', 'Other (A series)'), ('B01', '成品件', 'Finished parts'), ('B02', '简易加工件', 'Simple machined parts'), ('B03', 'PCB硬板', 'PCB hard board'), ('B04', 'FPC软板', 'FPC flexible board'), ('B05', '线束', 'Wire harness'), ('B06', '组装组件', 'Assembly component'), ('B07', '其他', 'Other (B series)'), ('C01', '连接耗材', 'Connection consumable'), ('C02', '密封耗材', 'Sealing consumable'), ('C03', '其他', 'Other (C series)'), ('D01', '自研程序固件', 'In-house firmware'), ('D02', '外购软件授权', 'Purchased software license'), ('D03', '授权介质', 'License media'), ('D04', '其他', 'Other (D series)'), ('E01', '成品', 'Finished product'), ('E02', '半成品', 'Semi-finished product'), ('F01', '资料文档', 'Documentation'), ('F02', '标识标牌', 'Label/signage'), ('F03', '包装物料', 'Packaging material'), ('F04', '随机工具配件', 'Bundled tools/accessories'), ('F05', '其他', 'Other (F series)'); -- ============================================ -- Test Data: 5 Materials (using category codes) -- ============================================ INSERT INTO materials (material_code, name, spec, category, unit, warning_stock, current_stock) VALUES ('MAT-001', 'Steel Plate', '1000x2000x5mm', 'A01', 'Sheet', 50, 200), ('MAT-002', 'Aluminum Rod', 'D20x1000mm', 'A01', 'Piece', 100, 500), ('MAT-003', 'Hex Bolt M10', 'M10x30mm SS304', 'A01', 'Box', 20, 80), ('MAT-004', 'Hydraulic Oil', 'ISO VG 46', 'C01', 'Barrel', 10, 25), ('MAT-005', 'Bearing 6205', '6205-2RS Deep Groove', 'A02', 'Piece', 30, 120);