88 lines
4.5 KiB
MySQL
88 lines
4.5 KiB
MySQL
|
|
-- Incremental migration: multi-tenant CRM baseline
|
||
|
|
-- Apply to existing muyu_wms schema.
|
||
|
|
|
||
|
|
USE `muyu_wms`;
|
||
|
|
|
||
|
|
-- MySQL 8 does not support ADD COLUMN IF NOT EXISTS; use separate statements.
|
||
|
|
SET @col_exists = (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='muyu_wms' AND TABLE_NAME='sys_operation_log' AND COLUMN_NAME='tenant_id');
|
||
|
|
SET @sql = IF(@col_exists = 0, 'ALTER TABLE `sys_operation_log` ADD COLUMN `tenant_id` VARCHAR(32) NOT NULL DEFAULT \'\' AFTER `user_id`', 'SELECT 1');
|
||
|
|
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||
|
|
|
||
|
|
SET @col_exists = (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='muyu_wms' AND TABLE_NAME='sys_operation_log' AND COLUMN_NAME='target_tenant_id');
|
||
|
|
SET @sql = IF(@col_exists = 0, 'ALTER TABLE `sys_operation_log` ADD COLUMN `target_tenant_id` VARCHAR(32) NOT NULL DEFAULT \'\' AFTER `tenant_id`', 'SELECT 1');
|
||
|
|
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||
|
|
|
||
|
|
CREATE TABLE IF NOT EXISTS `crm_tenant` (
|
||
|
|
`id` BIGINT NOT NULL AUTO_INCREMENT,
|
||
|
|
`tenant_id` VARCHAR(32) NOT NULL,
|
||
|
|
`tenant_name` VARCHAR(100) NOT NULL,
|
||
|
|
`tenant_code` VARCHAR(64) NOT NULL DEFAULT '',
|
||
|
|
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '1:enabled 0:disabled',
|
||
|
|
`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_tenant_id` (`tenant_id`),
|
||
|
|
UNIQUE KEY `uk_tenant_code` (`tenant_code`)
|
||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
|
|
|
||
|
|
CREATE TABLE IF NOT EXISTS `crm_tenant_user` (
|
||
|
|
`id` BIGINT NOT NULL AUTO_INCREMENT,
|
||
|
|
`tenant_user_id` VARCHAR(32) NOT NULL,
|
||
|
|
`tenant_id` VARCHAR(32) NOT NULL,
|
||
|
|
`user_id` VARCHAR(32) NOT NULL,
|
||
|
|
`is_primary` TINYINT NOT NULL DEFAULT 1 COMMENT '1:primary 0:secondary',
|
||
|
|
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '1:enabled 0:disabled',
|
||
|
|
`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_tenant_user_id` (`tenant_user_id`),
|
||
|
|
UNIQUE KEY `uk_tenant_user_pair` (`tenant_id`, `user_id`),
|
||
|
|
KEY `idx_user_id` (`user_id`)
|
||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
|
|
|
||
|
|
CREATE TABLE IF NOT EXISTS `crm_tenant_relationship` (
|
||
|
|
`id` BIGINT NOT NULL AUTO_INCREMENT,
|
||
|
|
`relationship_id` VARCHAR(40) NOT NULL,
|
||
|
|
`owner_tenant_id` VARCHAR(32) NOT NULL,
|
||
|
|
`from_tenant_id` VARCHAR(32) NOT NULL,
|
||
|
|
`to_tenant_id` VARCHAR(32) NOT NULL,
|
||
|
|
`relation_type` VARCHAR(32) NOT NULL,
|
||
|
|
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '1:active 0:inactive',
|
||
|
|
`valid_from` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
`valid_to` DATETIME DEFAULT NULL,
|
||
|
|
`source` VARCHAR(32) NOT NULL DEFAULT 'manual',
|
||
|
|
`created_by` VARCHAR(32) NOT NULL DEFAULT '',
|
||
|
|
`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_relationship_id` (`relationship_id`),
|
||
|
|
UNIQUE KEY `uk_relationship_unique` (`owner_tenant_id`, `from_tenant_id`, `to_tenant_id`, `relation_type`, `valid_from`),
|
||
|
|
KEY `idx_owner_from_status` (`owner_tenant_id`, `from_tenant_id`, `status`),
|
||
|
|
KEY `idx_owner_to_status` (`owner_tenant_id`, `to_tenant_id`, `status`)
|
||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
|
|
|
||
|
|
CREATE TABLE IF NOT EXISTS `crm_tenant_relationship_history` (
|
||
|
|
`id` BIGINT NOT NULL AUTO_INCREMENT,
|
||
|
|
`history_id` VARCHAR(40) NOT NULL,
|
||
|
|
`relationship_id` VARCHAR(40) NOT NULL,
|
||
|
|
`change_type` VARCHAR(32) NOT NULL,
|
||
|
|
`before_json` JSON NULL,
|
||
|
|
`after_json` JSON NULL,
|
||
|
|
`changed_by` VARCHAR(32) NOT NULL DEFAULT '',
|
||
|
|
`changed_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
PRIMARY KEY (`id`),
|
||
|
|
UNIQUE KEY `uk_history_id` (`history_id`),
|
||
|
|
KEY `idx_relationship_id` (`relationship_id`),
|
||
|
|
KEY `idx_changed_at` (`changed_at`)
|
||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
|
|
|
||
|
|
INSERT INTO `crm_tenant` (`tenant_id`, `tenant_name`, `tenant_code`, `status`)
|
||
|
|
VALUES ('t_default_001', '默认租户', 'DEFAULT', 1)
|
||
|
|
ON DUPLICATE KEY UPDATE tenant_name = VALUES(tenant_name), status = VALUES(status);
|
||
|
|
|
||
|
|
INSERT INTO `crm_tenant_user` (`tenant_user_id`, `tenant_id`, `user_id`, `is_primary`, `status`)
|
||
|
|
SELECT 'tu_admin_001', 't_default_001', 'u_admin_001', 1, 1
|
||
|
|
WHERE NOT EXISTS (
|
||
|
|
SELECT 1 FROM `crm_tenant_user` WHERE `tenant_id` = 't_default_001' AND `user_id` = 'u_admin_001'
|
||
|
|
);
|