Files

160 lines
7.9 KiB
SQL

-- 用户表(若项目使用 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 ='文件附件存储索引表';