diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml new file mode 100644 index 0000000..9c210b8 --- /dev/null +++ b/.idea/sqldialects.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/schema.sql b/schema.sql new file mode 100644 index 0000000..e1ab51f --- /dev/null +++ b/schema.sql @@ -0,0 +1,228 @@ +-- 用户表(若项目使用 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 departments; +CREATE TABLE departments +( + id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(100) NOT NULL, + code VARCHAR(50), + 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_departments_parent FOREIGN KEY (parent_id) REFERENCES departments (id) ON DELETE SET NULL +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='组织/部门'; + +-- 人员表(可映射到 Django 的 profile) +DROP TABLE IF EXISTS personnel; +CREATE TABLE personnel +( + id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + user_id BIGINT UNSIGNED, -- 关联 account 表(可为空) + employee_no VARCHAR(64) UNIQUE, + name VARCHAR(100) NOT NULL, + department_id BIGINT UNSIGNED, + phone VARCHAR(50), + email VARCHAR(254), + role VARCHAR(100), + is_active 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, + CONSTRAINT fk_personnel_user FOREIGN KEY (user_id) REFERENCES account (id) ON DELETE SET NULL, + CONSTRAINT fk_personnel_department FOREIGN KEY (department_id) REFERENCES departments (id) ON DELETE SET NULL +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 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, + 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 personnel (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, -- personnel 操作者 + 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 personnel (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_id BIGINT UNSIGNED NOT NULL, -- personnel id + 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_id BIGINT UNSIGNED 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, + CONSTRAINT fk_borrow_borrower FOREIGN KEY (borrower_id) REFERENCES personnel (id) ON DELETE CASCADE, + CONSTRAINT fk_borrow_approver FOREIGN KEY (approver_id) REFERENCES personnel (id) ON DELETE SET NULL, + INDEX (borrower_id), + INDEX (status) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='借用/归还记录'; + +-- 备忘/便签 +DROP TABLE IF EXISTS memos; +CREATE TABLE memos +( + id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + title VARCHAR(200), + content TEXT, + author_id BIGINT UNSIGNED, + related_item_id BIGINT UNSIGNED, + is_public 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, + CONSTRAINT fk_memo_author FOREIGN KEY (author_id) REFERENCES personnel (id) ON DELETE SET NULL, + CONSTRAINT fk_memo_item FOREIGN KEY (related_item_id) REFERENCES items (id) ON DELETE SET NULL +) 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, + 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 personnel (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 ='邮件通知规则/历史'; + +-- 评价/反馈(evaluation 模块对应) +DROP TABLE IF EXISTS evaluations; +CREATE TABLE evaluations +( + id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + related_item_id BIGINT UNSIGNED, + evaluator_id BIGINT UNSIGNED, + score TINYINT UNSIGNED, -- 1-5 + comment TEXT, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT fk_evaluation_item FOREIGN KEY (related_item_id) REFERENCES items (id) ON DELETE SET NULL, + CONSTRAINT fk_evaluation_user FOREIGN KEY (evaluator_id) REFERENCES personnel (id) ON DELETE SET NULL +) 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','memos' + 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, + uploaded_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT fk_attachments_user FOREIGN KEY (uploaded_by) REFERENCES personnel (id) ON DELETE SET NULL, + INDEX (related_table, related_id) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='文件附件存储索引表';