-- 用户表(若项目使用 Django auth,可忽略或与 auth_user 对应) DROP TABLE IF EXISTS account; CREATE TABLE account ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, username VARCHAR(150) NOT NULL UNIQUE, password VARCHAR(128) NOT NULL, email VARCHAR(254), full_name VARCHAR(200), is_active TINYINT(1) NOT NULL DEFAULT 1, is_staff TINYINT(1) NOT NULL DEFAULT 0, 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 ='系统用户/认证信息'; -- 物品类别 DROP TABLE IF EXISTS categories; CREATE TABLE categories ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(150) NOT NULL, parent_id BIGINT UNSIGNED, description TEXT, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT fk_categories_parent FOREIGN KEY (parent_id) REFERENCES categories (id) ON DELETE SET NULL ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='物品类别'; -- 物品(物品主表) DROP TABLE IF EXISTS items; CREATE TABLE items ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, code VARCHAR(100) NOT NULL UNIQUE, -- 物品编号/资产编号 name VARCHAR(200) NOT NULL, category_id BIGINT UNSIGNED, model VARCHAR(150), brand VARCHAR(150), location VARCHAR(200), total_quantity INT NOT NULL DEFAULT 0, available_quantity INT NOT NULL DEFAULT 0, unit VARCHAR(30) DEFAULT '件', price DECIMAL(12, 2) DEFAULT NULL, purchase_date DATE DEFAULT NULL, supplier VARCHAR(200) DEFAULT NULL, status VARCHAR(50) DEFAULT 'normal', -- 如 normal/disabled/lost/repair description TEXT, image_path VARCHAR(500), created_by BIGINT UNSIGNED, -- 关联 account.id created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT fk_items_category FOREIGN KEY (category_id) REFERENCES categories (id) ON DELETE SET NULL, CONSTRAINT fk_items_creator FOREIGN KEY (created_by) REFERENCES account (id) ON DELETE SET NULL, INDEX (name), INDEX (code) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='物品基本信息'; -- 物品库存/流水(每次入库/出库/调整都记录) DROP TABLE IF EXISTS item_transactions; CREATE TABLE item_transactions ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, item_id BIGINT UNSIGNED NOT NULL, trans_type ENUM ('IN','OUT','ADJUST','TRANSFER') NOT NULL, quantity INT NOT NULL, from_location VARCHAR(200), to_location VARCHAR(200), related_id BIGINT UNSIGNED, -- 可关联采购单/借用记录/调拨单 id operator_id BIGINT UNSIGNED, -- 关联 account.id(操作者) note TEXT, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT fk_trans_item FOREIGN KEY (item_id) REFERENCES items (id) ON DELETE CASCADE, CONSTRAINT fk_trans_operator FOREIGN KEY (operator_id) REFERENCES account (id) ON DELETE SET NULL, INDEX (item_id), INDEX (trans_type) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='物品出入库与调整流水'; -- 借用记录(借/还) DROP TABLE IF EXISTS borrow_records; CREATE TABLE borrow_records ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, item_id BIGINT UNSIGNED NOT NULL, borrower VARCHAR(100) NOT NULL, -- 借入人(姓名,字符串) quantity INT NOT NULL DEFAULT 1, borrow_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, due_date DATETIME DEFAULT NULL, return_date DATETIME DEFAULT NULL, status ENUM ('BORROWED','RETURNED','OVERDUE','CANCELED') NOT NULL DEFAULT 'BORROWED', approver VARCHAR(100) DEFAULT NULL, -- 借出/审批人(姓名,字符串) note TEXT, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT fk_borrow_item FOREIGN KEY (item_id) REFERENCES items (id) ON DELETE CASCADE, INDEX (borrower), INDEX (status) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='借用/归还记录'; -- 财务记录(采购/报销等) DROP TABLE IF EXISTS finance_records; CREATE TABLE finance_records ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, record_no VARCHAR(100) UNIQUE, type ENUM ('PURCHASE','REFUND','REPAIR','DEPRECIATION','OTHER') NOT NULL, related_item_id BIGINT UNSIGNED, amount DECIMAL(14, 2) NOT NULL DEFAULT 0.00, currency VARCHAR(10) DEFAULT 'CNY', vendor VARCHAR(200), occurred_at DATETIME, recorded_by BIGINT UNSIGNED, -- 关联 account.id(记录人) note TEXT, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT fk_finance_item FOREIGN KEY (related_item_id) REFERENCES items (id) ON DELETE SET NULL, CONSTRAINT fk_finance_user FOREIGN KEY (recorded_by) REFERENCES account (id) ON DELETE SET NULL, INDEX (record_no) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='财务相关记录'; -- 邮件通知规则/历史 DROP TABLE IF EXISTS email_notices; CREATE TABLE email_notices ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(200), target_emails TEXT, -- 以逗号分隔或 JSON 数组 subject VARCHAR(300), body TEXT, enabled TINYINT(1) NOT NULL DEFAULT 1, schedule_cron VARCHAR(100), -- 若使用定时任务 last_sent_at DATETIME, 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 COMMENT ='邮件通知规则/历史'; -- 附件表(文件存储路径) DROP TABLE IF EXISTS attachments; CREATE TABLE attachments ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, related_table VARCHAR(100), -- 指示关联表,如 'items' related_id BIGINT UNSIGNED, -- 关联记录 ID file_name VARCHAR(300), file_path VARCHAR(1000), file_size BIGINT UNSIGNED, content_type VARCHAR(200), uploaded_by BIGINT UNSIGNED, -- 关联 account.id(上传者) uploaded_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT fk_attachments_user FOREIGN KEY (uploaded_by) REFERENCES account (id) ON DELETE SET NULL, INDEX (related_table, related_id) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='文件附件存储索引表';