@@ -1,6 +1,6 @@
-- 一期回归测试环境增量迁移汇总
-- 适用版本:MySQL 8.0
-- 涉及数据库:baiyue_iam、baiyue_warehouse、baiyue_order、baiyue_firstleg
-- 涉及数据库:baiyue_iam、baiyue_warehouse、baiyue_order、baiyue_firstleg、baiyue_file
-- 安全边界:不创建数据库、不清表、不删除业务数据、不写入演示租户及演示业务数据。
-- 可重复执行:所有新增字段、表、索引和权限均带存在性判断或幂等写入。
-- 重要说明:MySQL DDL 会隐式提交,本脚本不能作为一个跨库事务整体回滚。
@@ -32,8 +32,15 @@ CALL regression_assert_table('iam_permission');
CALL regression_assert_table ( ' iam_role ' ) ;
CALL regression_assert_table ( ' iam_role_permission ' ) ;
CALL regression_assert_table ( ' iam_tenant ' ) ;
CALL regression_assert_table ( ' iam_tenant_review ' ) ;
CALL regression_assert_table ( ' iam_tenant_qualification ' ) ;
CALL regression_assert_table ( ' iam_membership ' ) ;
DROP PROCEDURE regression_assert_table ;
ALTER TABLE iam_tenant
MODIFY COLUMN status VARCHAR ( 20 ) NOT NULL DEFAULT ' PROFILE_REQUIRED '
COMMENT ' 租户状态:PROFILE_REQUIRED、PENDING、ACTIVE、REJECTED、DISABLED ' ;
SET @ iam_permission_built_in_sql = IF (
EXISTS (
SELECT 1 FROM information_schema . columns
@@ -48,6 +55,50 @@ PREPARE iam_permission_built_in_stmt FROM @iam_permission_built_in_sql;
EXECUTE iam_permission_built_in_stmt ;
DEALLOCATE PREPARE iam_permission_built_in_stmt ;
-- 审核通过自动开户依赖全局企业管理员模板。通过自然键幂等补齐,避免存量环境
-- 已存在同编码但 ID 不同的角色时,把权限错误授予固定 ID。
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
role_name = VALUES ( role_name ) , role_type = ' SYSTEM ' , status = ' ACTIVE ' ,
description = VALUES ( description ) , deleted = 0 ;
-- 从一期商户权限基线复制全局模板;不创建演示租户或业务数据。
INSERT INTO iam_permission (
id , tenant_id , app_code , permission_type , parent_id , permission_code ,
permission_name , route_path , http_method , sort_no , status , built_in , deleted
)
SELECT permission . id + 100000 , 0 , permission . app_code , permission . permission_type ,
CASE WHEN permission . parent_id = 0 THEN 0 ELSE permission . parent_id + 100000 END ,
permission . permission_code , permission . permission_name , permission . route_path ,
permission . http_method , permission . sort_no , ' ACTIVE ' , 1 , 0
FROM iam_permission permission
WHERE permission . tenant_id = 10001 AND permission . app_code = ' MERCHANT '
AND permission . permission_type IN ( ' MENU ' , ' BUTTON ' )
AND permission . deleted = 0
ON DUPLICATE KEY UPDATE
permission_type = VALUES ( permission_type ) , parent_id = VALUES ( parent_id ) ,
permission_name = VALUES ( permission_name ) , route_path = VALUES ( route_path ) ,
http_method = VALUES ( http_method ) , sort_no = VALUES ( sort_no ) ,
status = ' ACTIVE ' , built_in = 1 , deleted = 0 ;
INSERT INTO iam_role_permission ( role_id , permission_id , tenant_id )
SELECT owner_role . id , permission . id , 0
FROM iam_role owner_role
JOIN iam_permission permission
ON permission . tenant_id = 0 AND permission . app_code = ' MERCHANT '
AND permission . permission_type IN ( ' MENU ' , ' BUTTON ' )
AND permission . status = ' ACTIVE ' AND permission . deleted = 0
WHERE owner_role . tenant_id = 0 AND owner_role . app_code = ' MERCHANT '
AND owner_role . role_code = ' MERCHANT_OWNER '
AND owner_role . status = ' ACTIVE ' AND owner_role . deleted = 0
ON DUPLICATE KEY UPDATE tenant_id = VALUES ( tenant_id ) ;
-- 一期客户档案字段;与 iam/db/phase1-customer-profile.sql 保持一致。
DROP PROCEDURE IF EXISTS regression_add_iam_column ;
DELIMITER $ $
@@ -73,6 +124,7 @@ END$$
DELIMITER ;
CALL regression_add_iam_column ( ' contact_wechat ' , ' VARCHAR(64) NULL COMMENT '' 联系微信 '' AFTER contact_email ' ) ;
CALL regression_add_iam_column ( ' legal_representative ' , ' VARCHAR(64) NULL COMMENT '' 法定代表人 '' AFTER legal_name ' ) ;
CALL regression_add_iam_column ( ' sales_owner_name ' , ' VARCHAR(64) NULL COMMENT '' 销售负责人姓名 '' AFTER contact_wechat ' ) ;
CALL regression_add_iam_column ( ' payment_term_days ' , ' SMALLINT UNSIGNED NULL COMMENT '' 账期天数 '' AFTER sales_owner_name ' ) ;
CALL regression_add_iam_column ( ' enterprise_type ' , ' VARCHAR(64) NULL COMMENT '' 企业类型 '' AFTER payment_term_days ' ) ;
@@ -81,8 +133,40 @@ CALL regression_add_iam_column('registered_capital', 'DECIMAL(18,2) NULL COMMENT
CALL regression_add_iam_column ( ' registered_capital_currency ' , ' CHAR(3) NULL COMMENT '' 注册资本币种 ISO 4217 '' AFTER registered_capital ' ) ;
CALL regression_add_iam_column ( ' registered_address ' , ' VARCHAR(500) NULL COMMENT '' 注册地址文本 '' AFTER registered_capital_currency ' ) ;
CALL regression_add_iam_column ( ' internal_remark ' , ' VARCHAR(1000) NULL COMMENT '' 平台内部备注 '' AFTER registered_address ' ) ;
CALL regression_add_iam_column ( ' approved_at ' , ' DATETIME(3) NULL COMMENT '' 审核通过时间 '' AFTER internal_remark ' ) ;
CALL regression_add_iam_column ( ' approved_by ' , ' BIGINT NULL COMMENT '' 审核人ID '' AFTER approved_at ' ) ;
CALL regression_add_iam_column ( ' reject_reason ' , ' VARCHAR(500) NULL COMMENT '' 驳回原因 '' AFTER approved_by ' ) ;
DROP PROCEDURE regression_add_iam_column ;
-- 注册审核和资质替换依赖的辅助字段;存量测试库也必须具备同一契约。
DROP PROCEDURE IF EXISTS regression_add_iam_related_column ;
DELIMITER $ $
CREATE PROCEDURE regression_add_iam_related_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 @ regression_iam_related_sql = CONCAT (
' ALTER TABLE ` ' , p_table_name , ' ` ADD COLUMN ` ' , p_column_name , ' ` ' , p_definition
) ;
PREPARE regression_iam_related_stmt FROM @ regression_iam_related_sql ;
EXECUTE regression_iam_related_stmt ;
DEALLOCATE PREPARE regression_iam_related_stmt ;
END IF ;
END $ $
DELIMITER ;
CALL regression_add_iam_related_column ( ' iam_tenant_qualification ' , ' review_comment ' , ' VARCHAR(500) NULL COMMENT '' 审核意见 '' ' ) ;
CALL regression_add_iam_related_column ( ' iam_membership ' , ' created_by ' , ' BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '' 创建人ID '' ' ) ;
CALL regression_add_iam_related_column ( ' iam_membership ' , ' updated_by ' , ' BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '' 最后修改人ID '' ' ) ;
DROP PROCEDURE regression_add_iam_related_column ;
-- 先写入父菜单,再写入按钮,避免新增环境出现悬空父节点。
INSERT INTO iam_permission
( id , tenant_id , app_code , permission_type , parent_id , permission_code ,
@@ -100,7 +184,8 @@ VALUES
( 5102010 , 0 , ' PLATFORM ' , ' MENU ' , 5102000 , ' platform:order:list ' , ' 订单列表 ' , ' /first-leg-orders/list ' , NULL , 10 , ' ACTIVE ' , 1 , 0 ) ,
( 5102020 , 0 , ' PLATFORM ' , ' MENU ' , 5102000 , ' platform:firstleg:task:list ' , ' 履约任务 ' , ' /first-leg-tasks/list ' , NULL , 20 , ' ACTIVE ' , 1 , 0 ) ,
( 5103020 , 0 , ' PLATFORM ' , ' MENU ' , 5103000 , ' platform:express:list ' , ' 快递公司 ' , ' /master-data/express ' , NULL , 20 , ' ACTIVE ' , 1 , 0 ) ,
( 5103030 , 0 , ' PLATFORM ' , ' MENU ' , 5103000 , ' platform:counterparty:list ' , ' 往来单位 ' , ' /master-data/counterparties ' , NULL , 30 , ' ACTIVE ' , 1 , 0 )
( 5103030 , 0 , ' PLATFORM ' , ' MENU ' , 5103000 , ' platform:counterparty:list ' , ' 往来单位 ' , ' /master-data/counterparties ' , NULL , 30 , ' ACTIVE ' , 1 , 0 ) ,
( 5103040 , 0 , ' PLATFORM ' , ' MENU ' , 5103000 , ' platform:download:list ' , ' 下载中心 ' , ' /downloads ' , NULL , 40 , ' ACTIVE ' , 1 , 0 )
ON DUPLICATE KEY UPDATE
permission_type = VALUES ( permission_type ) ,
parent_id = VALUES ( parent_id ) ,
@@ -120,6 +205,10 @@ VALUES
( 5100014 , 0 , ' PLATFORM ' , ' BUTTON ' , 5100010 , ' platform:customer:view ' , ' 查看企业客户档案 ' , NULL , NULL , 15 , ' ACTIVE ' , 1 , 0 ) ,
( 5100012 , 0 , ' PLATFORM ' , ' BUTTON ' , 5100010 , ' platform:customer:edit ' , ' 编辑企业客户 ' , NULL , NULL , 20 , ' ACTIVE ' , 1 , 0 ) ,
( 5100013 , 0 , ' PLATFORM ' , ' BUTTON ' , 5100010 , ' platform:customer:status ' , ' 启停企业客户 ' , NULL , NULL , 30 , ' ACTIVE ' , 1 , 0 ) ,
( 5100015 , 0 , ' PLATFORM ' , ' BUTTON ' , 5100010 , ' platform:customer:export ' , ' 导出企业客户 ' , NULL , NULL , 40 , ' ACTIVE ' , 1 , 0 ) ,
( 5100020 , 0 , ' PLATFORM ' , ' BUTTON ' , 5100010 , ' platform:customer:review ' , ' 客户审核 ' , NULL , NULL , 50 , ' ACTIVE ' , 1 , 0 ) ,
( 5100021 , 0 , ' PLATFORM ' , ' BUTTON ' , 5100010 , ' platform:customer:approve ' , ' 审核通过 ' , NULL , NULL , 60 , ' ACTIVE ' , 1 , 0 ) ,
( 5100022 , 0 , ' PLATFORM ' , ' BUTTON ' , 5100010 , ' platform:customer:reject ' , ' 审核驳回 ' , NULL , NULL , 70 , ' ACTIVE ' , 1 , 0 ) ,
( 5101011 , 0 , ' PLATFORM ' , ' BUTTON ' , 5101010 , ' platform:user:create ' , ' 新增内部用户 ' , NULL , NULL , 10 , ' ACTIVE ' , 1 , 0 ) ,
( 5101012 , 0 , ' PLATFORM ' , ' BUTTON ' , 5101010 , ' platform:user:edit ' , ' 编辑内部用户 ' , NULL , NULL , 20 , ' ACTIVE ' , 1 , 0 ) ,
( 5101013 , 0 , ' PLATFORM ' , ' BUTTON ' , 5101010 , ' platform:user:status ' , ' 启停内部用户 ' , NULL , NULL , 30 , ' ACTIVE ' , 1 , 0 ) ,
@@ -146,7 +235,8 @@ VALUES
( 5103023 , 0 , ' PLATFORM ' , ' BUTTON ' , 5103020 , ' platform:express:status ' , ' 启停快递公司 ' , NULL , NULL , 30 , ' ACTIVE ' , 1 , 0 ) ,
( 5103031 , 0 , ' PLATFORM ' , ' BUTTON ' , 5103030 , ' platform:counterparty:create ' , ' 新增往来单位 ' , NULL , NULL , 10 , ' ACTIVE ' , 1 , 0 ) ,
( 5103032 , 0 , ' PLATFORM ' , ' BUTTON ' , 5103030 , ' platform:counterparty:edit ' , ' 编辑往来单位 ' , NULL , NULL , 20 , ' ACTIVE ' , 1 , 0 ) ,
( 5103033 , 0 , ' PLATFORM ' , ' BUTTON ' , 5103030 , ' platform:counterparty:status ' , ' 启停往来单位 ' , NULL , NULL , 30 , ' ACTIVE ' , 1 , 0 )
( 5103033 , 0 , ' PLATFORM ' , ' BUTTON ' , 5103030 , ' platform:counterparty:status ' , ' 启停往来单位 ' , NULL , NULL , 30 , ' ACTIVE ' , 1 , 0 ) ,
( 5103041 , 0 , ' PLATFORM ' , ' BUTTON ' , 5103040 , ' platform:download:all ' , ' 查看全部下载任务 ' , NULL , NULL , 10 , ' ACTIVE ' , 1 , 0 )
ON DUPLICATE KEY UPDATE
permission_type = VALUES ( permission_type ) ,
parent_id = VALUES ( parent_id ) ,
@@ -203,7 +293,8 @@ SELECT r.id, p.id, 0
AND r . deleted = 0
AND p . permission_code IN (
' platform:customer ' , ' platform:customer:list ' , ' platform:customer:create ' ,
' platform:customer:view ' , ' platform:customer:edit ' , ' platform:customer:status ' ,
' platform:customer:view ' , ' platform:customer:edit ' , ' platform:customer:status ' , ' platform:customer:export ' ,
' platform:customer:review ' , ' platform:customer:approve ' , ' platform:customer:reject ' ,
' platform:system ' , ' platform:user:list ' , ' platform:user:create ' , ' platform:user:edit ' ,
' platform:user:status ' , ' platform:user:reset-password ' , ' platform:user:grant-role ' ,
' platform:role:list ' , ' platform:role:create ' , ' platform:role:grant ' ,
@@ -218,7 +309,8 @@ SELECT r.id, p.id, 0
' platform:master-data ' , ' platform:express:list ' , ' platform:express:create ' ,
' platform:express:edit ' , ' platform:express:status ' ,
' platform:counterparty:list ' , ' platform:counterparty:create ' ,
' platform:counterparty:edit ' , ' platform:counterparty:status '
' platform:counterparty:edit ' , ' platform:counterparty:status ' ,
' platform:download:list ' , ' platform:download:all '
)
ON DUPLICATE KEY UPDATE tenant_id = VALUES ( tenant_id ) ;
@@ -237,6 +329,20 @@ SELECT DISTINCT existing_grant.role_id, view_permission.id, existing_grant.tenan
AND existing_permission . permission_code IN ( ' platform:customer:list ' , ' platform:customer:review ' )
ON DUPLICATE KEY UPDATE tenant_id = VALUES ( tenant_id ) ;
-- 已有客户列表或审核角色获得客户导出及本人下载任务查询,不继承查看全部任务权限。
INSERT INTO iam_role_permission ( role_id , permission_id , tenant_id )
SELECT DISTINCT existing_grant . role_id , added_permission . id , existing_grant . tenant_id
FROM iam_role_permission existing_grant
JOIN iam_permission existing_permission ON existing_permission . id = existing_grant . permission_id
JOIN iam_permission added_permission
ON added_permission . tenant_id = 0
AND added_permission . app_code = ' PLATFORM '
AND added_permission . permission_code IN ( ' platform:customer:export ' , ' platform:download:list ' )
WHERE existing_permission . tenant_id = 0
AND existing_permission . app_code = ' PLATFORM '
AND existing_permission . permission_code IN ( ' platform:customer:list ' , ' platform:customer:review ' )
ON DUPLICATE KEY UPDATE tenant_id = VALUES ( tenant_id ) ;
-- 已存在的商户超级管理员/企业管理员获得对应租户的角色维护权限。
INSERT INTO iam_role_permission ( role_id , permission_id , tenant_id )
SELECT r . id , p . id , r . tenant_id
@@ -627,18 +733,60 @@ EXECUTE firstleg_task_list_index_stmt;
DEALLOCATE PREPARE firstleg_task_list_index_stmt ;
-- ============================================================================
-- 5. 执行后只读核验
-- 5. File:公共导出与下载中心任务表
-- ============================================================================
USE baiyue_file ;
CREATE TABLE IF NOT EXISTS file_export_task (
id BIGINT UNSIGNED NOT NULL COMMENT ' 导出任务ID(雪花ID) ' ,
tenant_id BIGINT UNSIGNED NOT NULL COMMENT ' 申请人所属租户ID,平台任务为0 ' ,
app_code VARCHAR ( 24 ) NOT NULL COMMENT ' 申请端 ' ,
task_no VARCHAR ( 40 ) NOT NULL COMMENT ' 导出任务编号 ' ,
export_type VARCHAR ( 64 ) NOT NULL COMMENT ' 导出类型 ' ,
format VARCHAR ( 16 ) NOT NULL DEFAULT ' XLSX ' COMMENT ' 导出格式 ' ,
task_name VARCHAR ( 128 ) NOT NULL COMMENT ' 任务名称 ' ,
parameters_json JSON NOT NULL COMMENT ' 筛选条件快照 ' ,
status VARCHAR ( 24 ) NOT NULL DEFAULT ' PENDING ' COMMENT ' 任务状态 ' ,
total_rows BIGINT UNSIGNED NULL ,
processed_rows BIGINT UNSIGNED NOT NULL DEFAULT 0 ,
file_name VARCHAR ( 255 ) NULL ,
object_key VARCHAR ( 512 ) NULL ,
content_type VARCHAR ( 128 ) NULL ,
size_bytes BIGINT UNSIGNED NULL ,
failure_message VARCHAR ( 1000 ) NULL ,
requested_by BIGINT UNSIGNED NOT NULL ,
requested_username VARCHAR ( 128 ) NULL ,
requested_at DATETIME ( 3 ) NOT NULL ,
started_at DATETIME ( 3 ) NULL ,
completed_at DATETIME ( 3 ) NULL ,
expires_at DATETIME ( 3 ) NULL ,
created_by BIGINT UNSIGNED NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ,
updated_by BIGINT UNSIGNED NULL ,
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ) ,
deleted TINYINT ( 1 ) NOT NULL DEFAULT 0 ,
version INT NOT NULL DEFAULT 0 ,
PRIMARY KEY ( id ) ,
UNIQUE KEY uk_file_export_task_no ( task_no ) ,
KEY idx_file_export_owner ( tenant_id , app_code , requested_by , requested_at ) ,
KEY idx_file_export_status ( status , requested_at ) ,
KEY idx_file_export_expiry ( status , expires_at )
) ENGINE = InnoDB COMMENT = ' 公共异步导出任务表 ' ;
-- ============================================================================
-- 6. 执行后只读核验
-- ============================================================================
SELECT
' IAM权限资源 ' AS check_item ,
COUNT ( * ) AS actual_count ,
44 AS expected_count ,
IF ( COUNT ( * ) = 44 , ' 通过 ' , ' 请检查缺失权限 ' ) AS check_result
47 AS expected_count ,
IF ( COUNT ( * ) = 47 , ' 通过 ' , ' 请检查缺失权限 ' ) AS check_result
FROM baiyue_iam . iam_permission
WHERE deleted = 0
AND permission_code IN (
' platform:customer ' , ' platform:customer:list ' , ' platform:customer:create ' ,
' platform:customer:view ' , ' platform:customer:edit ' , ' platform:customer:status ' ,
' platform:customer:view ' , ' platform:customer:edit ' , ' platform:customer:status ' , ' platform:customer:export ' ,
' platform:customer:review ' , ' platform:customer:approve ' , ' platform:customer:reject ' ,
' platform:system ' , ' platform:user:list ' , ' platform:user:create ' , ' platform:user:edit ' ,
' platform:user:status ' , ' platform:user:reset-password ' , ' platform:user:grant-role ' ,
' platform:role:list ' , ' platform:role:create ' , ' platform:role:grant ' ,
@@ -653,23 +801,89 @@ WHERE deleted = 0
' platform:master-data ' , ' platform:express:list ' , ' platform:express:create ' ,
' platform:express:edit ' , ' platform:express:status ' ,
' platform:counterparty:list ' , ' platform:counterparty:create ' ,
' platform:counterparty:edit ' , ' platform:counterparty:status '
' platform:counterparty:edit ' , ' platform:counterparty:status ' ,
' platform:download:list ' , ' platform:download:all '
) ;
SELECT
' IAM客户档案字段 ' AS check_item ,
COUNT ( * ) AS actual_count ,
9 AS expected_count ,
IF ( COUNT ( * ) = 9 , ' 通过 ' , ' 请检查客户档案字段迁移 ' ) AS check_result
10 AS expected_count ,
IF ( COUNT ( * ) = 10 , ' 通过 ' , ' 请检查客户档案字段迁移 ' ) AS check_result
FROM information_schema . columns
WHERE table_schema = ' baiyue_iam '
AND table_name = ' iam_tenant '
AND column_name IN (
' contact_wechat ' , ' sales_owner_name ' , ' payment_term_days ' , ' enterprise_type ' ,
' legal_representative ' , ' contact_wechat ' , ' sales_owner_name ' , ' payment_term_days ' , ' enterprise_type ' ,
' established_date ' , ' registered_capital ' , ' registered_capital_currency ' ,
' registered_address ' , ' internal_remark '
) ;
SELECT
' IAM注册审核字段 ' AS check_item ,
COUNT ( * ) AS actual_count ,
4 AS expected_count ,
IF ( COUNT ( * ) = 4 , ' 通过 ' , ' 请检查租户审核状态和结果字段 ' ) AS check_result
FROM information_schema . columns
WHERE table_schema = ' baiyue_iam '
AND table_name = ' iam_tenant '
AND column_name IN ( ' status ' , ' approved_at ' , ' approved_by ' , ' reject_reason ' ) ;
SELECT
' IAM资质与成员审计字段 ' AS check_item ,
(
SELECT COUNT ( * ) FROM information_schema . columns
WHERE table_schema = ' baiyue_iam '
AND table_name = ' iam_tenant_qualification '
AND column_name = ' review_comment '
) + (
SELECT COUNT ( * ) FROM information_schema . columns
WHERE table_schema = ' baiyue_iam '
AND table_name = ' iam_membership '
AND column_name IN ( ' created_by ' , ' updated_by ' )
) AS actual_count ,
3 AS expected_count ,
IF (
(
SELECT COUNT ( * ) FROM information_schema . columns
WHERE table_schema = ' baiyue_iam '
AND table_name = ' iam_tenant_qualification '
AND column_name = ' review_comment '
) + (
SELECT COUNT ( * ) FROM information_schema . columns
WHERE table_schema = ' baiyue_iam '
AND table_name = ' iam_membership '
AND column_name IN ( ' created_by ' , ' updated_by ' )
) = 3 ,
' 通过 ' , ' 请检查资质审核备注和成员审计字段 '
) AS check_result ;
SELECT
' IAM全局企业管理员模板 ' AS check_item ,
COUNT ( DISTINCT owner_role . id ) AS role_count ,
COUNT ( DISTINCT role_permission . permission_id ) AS actual_permission_count ,
( SELECT COUNT ( * ) FROM baiyue_iam . iam_permission permission
WHERE permission . tenant_id = 0 AND permission . app_code = ' MERCHANT '
AND permission . permission_type IN ( ' MENU ' , ' BUTTON ' )
AND permission . status = ' ACTIVE ' AND permission . deleted = 0 ) AS expected_permission_count ,
IF (
COUNT ( DISTINCT owner_role . id ) = 1
AND COUNT ( DISTINCT role_permission . permission_id ) = (
SELECT COUNT ( * ) FROM baiyue_iam . iam_permission permission
WHERE permission . tenant_id = 0 AND permission . app_code = ' MERCHANT '
AND permission . permission_type IN ( ' MENU ' , ' BUTTON ' )
AND permission . status = ' ACTIVE ' AND permission . deleted = 0
)
AND COUNT ( DISTINCT role_permission . permission_id ) > 0 ,
' 通过 ' , ' 请检查全局MERCHANT_OWNER角色及授权 '
) AS check_result
FROM baiyue_iam . iam_role owner_role
LEFT JOIN baiyue_iam . iam_role_permission role_permission
ON role_permission . role_id = owner_role . id AND role_permission . tenant_id = 0
WHERE owner_role . tenant_id = 0 AND owner_role . app_code = ' MERCHANT '
AND owner_role . role_code = ' MERCHANT_OWNER '
AND owner_role . role_type = ' SYSTEM ' AND owner_role . status = ' ACTIVE ' AND owner_role . deleted = 0 ;
SELECT
table_name ,
COUNT ( * ) AS column_count
@@ -705,5 +919,12 @@ WHERE table_schema = 'baiyue_firstleg'
AND table_name = ' fl_fulfillment_task '
AND index_name = ' idx_task_tenant_created ' ;
SELECT
IF ( COUNT ( * ) = 1 , ' 通过 ' , ' 缺失 ' ) AS export_task_table ,
' baiyue_file.file_export_task ' AS object_name
FROM information_schema . tables
WHERE table_schema = ' baiyue_file '
AND table_name = ' file_export_task ' ;
SELECT ' MIGRATION_COMPLETED ' AS migration_status ,
' 请确认上方所有核验结果均为通过后再启动服务回归 ' AS message ;