material_manage_system/scripts/migrations/001_phase1_auth_org.sql
2026-09-16 16:29:04 +08:00

109 lines
4.4 KiB
SQL

CREATE TABLE organizations (
id BIGINT NOT NULL AUTO_INCREMENT,
code VARCHAR(50) NOT NULL,
name VARCHAR(200) NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'active',
default_timezone VARCHAR(64) NOT NULL DEFAULT 'Asia/Shanghai',
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_organizations_code (code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO organizations (id, code, name, status)
VALUES (1, 'DEFAULT', '默认公司组织', 'active');
CREATE TABLE roles (
id BIGINT NOT NULL AUTO_INCREMENT,
code VARCHAR(80) NOT NULL,
name VARCHAR(100) NOT NULL,
enabled BOOLEAN NOT NULL DEFAULT TRUE,
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_roles_code (code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE permissions (
id BIGINT NOT NULL AUTO_INCREMENT,
code VARCHAR(120) NOT NULL,
name VARCHAR(150) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_permissions_code (code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE role_permissions (
role_id BIGINT NOT NULL,
permission_id BIGINT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (role_id, permission_id),
CONSTRAINT fk_role_permissions_role FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
CONSTRAINT fk_role_permissions_permission FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE user_roles (
user_id BIGINT NOT NULL,
role_id BIGINT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (user_id, role_id),
CONSTRAINT fk_user_roles_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
CONSTRAINT fk_user_roles_role FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE user_organizations (
user_id BIGINT NOT NULL,
organization_id BIGINT NOT NULL,
is_default BOOLEAN NOT NULL DEFAULT FALSE,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (user_id, organization_id),
CONSTRAINT fk_user_organizations_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
CONSTRAINT fk_user_organizations_org FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE revoked_tokens (
jti VARCHAR(64) NOT NULL,
user_id BIGINT NOT NULL,
expires_at DATETIME NOT NULL,
revoked_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (jti),
KEY idx_revoked_tokens_expires_at (expires_at),
CONSTRAINT fk_revoked_tokens_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO roles (code, name) VALUES
('super_admin', '超级管理员'),
('warehouse_admin', '仓库管理员'),
('purchaser', '采购人员'),
('technician', '技术人员'),
('production', '生产人员'),
('sales', '销售人员');
INSERT INTO permissions (code, name) VALUES
('master.material.read', '查看物料'),
('master.material.write', '维护物料'),
('master.config.write', '维护物料基础配置'),
('organization.read', '查看公司组织'),
('organization.write', '维护公司组织'),
('organization.user.write', '维护用户'),
('organization.role.write', '维护角色与权限'),
('partner.supplier.read', '查看供应商'),
('partner.supplier.write', '维护供应商'),
('partner.customer.read', '查看客户'),
('partner.customer.write', '维护客户'),
('inventory.stock.read', '查看库存'),
('inventory.warning.write', '维护库存预警'),
('inventory.inbound.write', '维护入库'),
('inventory.outbound.write', '维护出库');
INSERT INTO role_permissions (role_id, permission_id)
SELECT r.id, p.id FROM roles r CROSS JOIN permissions p WHERE r.code = 'super_admin';
INSERT INTO user_organizations (user_id, organization_id, is_default)
SELECT id, 1, TRUE FROM users;
INSERT INTO user_roles (user_id, role_id)
SELECT u.id, r.id
FROM users u
JOIN roles r ON r.code = CASE WHEN u.role = 'admin' THEN 'super_admin' ELSE 'warehouse_admin' END;