Merge remote-tracking branch 'origin/test' into test-01
# Conflicts: # config/nacos/cn/file-service.yml # config/nacos/local/file-service.yml # deploy/sql/README.md # firstleg/pom.xml
This commit is contained in:
@@ -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;
|
||||
|
||||
+46
-2
@@ -16,7 +16,10 @@
|
||||
1. IAM 基线表必须已存在(`iam.sql`)。
|
||||
2. 权限父菜单和既有客户列表/审核权限基线(`phase1-admin-rbac.sql`、`rbac-role-management-v2.sql`)。
|
||||
3. `phase1-platform-master-data-and-permission-management.sql` 中的 `platform:customer:view`、既有角色继承及管理员授权。
|
||||
4. `phase1-customer-profile.sql` 中的九个 `iam_tenant` 客户档案字段。
|
||||
4. `phase1-customer-profile.sql` 中的十个 `iam_tenant` 客户档案字段。
|
||||
5. `phase1-onboarding.sql` 中的 `PROFILE_REQUIRED` 默认状态、审核结果字段、资质审核备注及成员审计字段。
|
||||
|
||||
统一入口同时幂等补齐审核自动开户所需的全局 `MERCHANT_OWNER` 角色模板、全局商户菜单/按钮权限和角色授权;执行后应使用 `iam/src/test/resources/db/verify-phase1-admin-rbac.sql` 确认模板存在且权限完整。
|
||||
|
||||
测试环境只执行统一入口;模块脚本用于新环境基线构建或单模块升级,不应在统一入口执行后再次串行执行。
|
||||
|
||||
@@ -24,7 +27,48 @@
|
||||
|
||||
在 Navicat、DataGrip 或 MySQL 命令行中以“运行脚本”方式完整执行,确保客户端支持 `DELIMITER`。不要只选中局部语句执行。
|
||||
|
||||
执行结束后必须看到 `MIGRATION_COMPLETED`,并确认其前面的 IAM 权限、IAM 客户档案九字段、Warehouse 表结构、Order 幂等表和 Firstleg 索引核验均通过。
|
||||
执行结束后必须看到 `MIGRATION_COMPLETED`,并确认其前面的 IAM 权限、IAM 客户档案十字段、IAM 注册审核字段、资质与成员审计字段、Warehouse 表结构、Order 幂等表和 Firstleg 索引核验均通过。
|
||||
|
||||
## 公共导出中心开发阶段重建
|
||||
|
||||
统一迁移脚本中的 `file_export_task` 是一期旧基线,不能自动升级已经存在的表。公共导出中心尚未进入生产、测试环境确认没有需要保留的导出任务时,按下列顺序重建;这一步是公共导出中心上线的额外步骤,不得用于已有真实导出数据的生产环境。
|
||||
|
||||
先只读确认任务数为 0:
|
||||
|
||||
```sql
|
||||
SELECT COUNT(*) AS export_task_count FROM baiyue_file.file_export_task;
|
||||
```
|
||||
|
||||
只有结果为 0 才允许执行:
|
||||
|
||||
```sql
|
||||
USE baiyue_file;
|
||||
DROP TABLE IF EXISTS file_export_outbox;
|
||||
DROP TABLE IF EXISTS file_export_task_guard;
|
||||
DROP TABLE IF EXISTS file_export_task;
|
||||
SOURCE file/src/main/resources/db/file.sql;
|
||||
```
|
||||
|
||||
`SOURCE` 的相对路径以 MySQL 客户端启动目录为准;图形客户端可直接完整执行 `file/src/main/resources/db/file.sql`。完成后必须核验:
|
||||
|
||||
```sql
|
||||
SELECT COUNT(*) = 3 AS export_tables_ready
|
||||
FROM information_schema.tables
|
||||
WHERE table_schema = 'baiyue_file'
|
||||
AND table_name IN ('file_export_task', 'file_export_outbox', 'file_export_task_guard');
|
||||
|
||||
SELECT COUNT(*) = 1 AS creation_guard_ready
|
||||
FROM baiyue_file.file_export_task_guard
|
||||
WHERE guard_key = 'GLOBAL_CREATE';
|
||||
|
||||
SELECT COUNT(*) = 8 AS scheduler_columns_ready
|
||||
FROM information_schema.columns
|
||||
WHERE table_schema = 'baiyue_file' AND table_name = 'file_export_task'
|
||||
AND column_name IN ('dispatch_version', 'attempt_count', 'max_attempts', 'next_retry_at',
|
||||
'lease_owner', 'lease_until', 'last_heartbeat_at', 'execution_deadline_at');
|
||||
```
|
||||
|
||||
任一结果不是 1,禁止启动 File Service。后续一旦表内存在生产数据,必须改用可重复执行的增量迁移,不能继续 DROP 重建。
|
||||
|
||||
## 二期第三方测量增量
|
||||
|
||||
|
||||
Reference in New Issue
Block a user