-- Phase-one merchant onboarding state migration. USE baiyue_iam; SET NAMES utf8mb4; ALTER TABLE iam_tenant MODIFY COLUMN status VARCHAR(20) NOT NULL DEFAULT 'PROFILE_REQUIRED' COMMENT 'PROFILE_REQUIRED, PENDING, ACTIVE, REJECTED or DISABLED'; DROP PROCEDURE IF EXISTS phase1_iam_add_column; DELIMITER $$ CREATE PROCEDURE phase1_iam_add_column( IN p_table_name VARCHAR(64), IN p_column_name VARCHAR(64), IN p_definition VARCHAR(1000) ) BEGIN IF NOT EXISTS ( SELECT 1 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = p_table_name AND COLUMN_NAME = p_column_name ) THEN SET @phase1_iam_sql = CONCAT('ALTER TABLE `', p_table_name, '` ADD COLUMN `', p_column_name, '` ', p_definition); PREPARE phase1_iam_stmt FROM @phase1_iam_sql; EXECUTE phase1_iam_stmt; DEALLOCATE PREPARE phase1_iam_stmt; END IF; END$$ DELIMITER ; CALL phase1_iam_add_column('iam_tenant', 'approved_at', "DATETIME(3) NULL COMMENT 'Approval time'"); CALL phase1_iam_add_column('iam_tenant', 'approved_by', "BIGINT NULL COMMENT 'Reviewer ID'"); CALL phase1_iam_add_column('iam_tenant', 'reject_reason', "VARCHAR(500) NULL COMMENT 'Rejection reason'"); CALL phase1_iam_add_column('iam_tenant_qualification', 'review_comment', "VARCHAR(500) NULL COMMENT 'Review comment'"); CALL phase1_iam_add_column('iam_membership', 'created_by', "BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Creator ID'"); CALL phase1_iam_add_column('iam_membership', 'updated_by', "BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Updater ID'"); DROP PROCEDURE phase1_iam_add_column; -- A global merchant owner template is assigned to newly registered enterprises. INSERT INTO iam_role ( id, tenant_id, app_code, role_code, role_name, role_type, status, description, created_by, updated_by, deleted, version ) VALUES ( 4000100, 0, 'MERCHANT', 'MERCHANT_OWNER', '企业管理员', 'SYSTEM', 'ACTIVE', '一期企业全部菜单和操作按钮模板', 1000001, 1000001, 0, 0 ) ON DUPLICATE KEY UPDATE status='ACTIVE', deleted=0; -- Clone the一期 merchant menu/button template into the global scope. INSERT INTO iam_permission ( id, tenant_id, app_code, permission_type, parent_id, permission_code, permission_name, route_path, http_method, sort_no, status, deleted ) SELECT id + 100000, 0, app_code, permission_type, CASE WHEN parent_id = 0 THEN 0 ELSE parent_id + 100000 END, permission_code, permission_name, route_path, NULL, sort_no, 'ACTIVE', 0 FROM iam_permission WHERE tenant_id = 10001 AND app_code = 'MERCHANT' AND permission_type IN ('MENU', 'BUTTON') ON DUPLICATE KEY UPDATE permission_name=VALUES(permission_name), route_path=VALUES(route_path), parent_id=VALUES(parent_id), sort_no=VALUES(sort_no), status='ACTIVE', deleted=0; INSERT IGNORE INTO iam_role_permission (role_id, permission_id, tenant_id) SELECT 4000100, id, 0 FROM iam_permission WHERE app_code='MERCHANT' AND tenant_id=0 AND permission_type IN ('MENU','BUTTON') AND status='ACTIVE' AND deleted=0; -- 不再写入伪造的资质 URL。资质必须先由 File 服务保存真实图片,再由 IAM 记录文件地址和审核结果。 -- 已部署环境中的 /phase1-seed/ 历史记录按 docs/企业资质文件迁移说明.md 处理,本脚本不得将其改成不存在的 UUID。