From d15bc9b58323ee59f60f039b70f2d2a767b66168 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Mon, 10 Aug 2026 13:45:09 +0800 Subject: [PATCH] fix(deploy): restore unified migration final assertions --- deploy/sql/头程数据库统一增量-MySQL8.sql | 241 +++++++++++++++++++++++ 1 file changed, 241 insertions(+) diff --git a/deploy/sql/头程数据库统一增量-MySQL8.sql b/deploy/sql/头程数据库统一增量-MySQL8.sql index 15664e8b0..38bc2ad99 100644 --- a/deploy/sql/头程数据库统一增量-MySQL8.sql +++ b/deploy/sql/头程数据库统一增量-MySQL8.sql @@ -9349,6 +9349,247 @@ DROP PROCEDURE assert_phase3_warehouse_roles_ready; DROP TEMPORARY TABLE IF EXISTS tmp_phase3_warehouse_role_permission; +-- 三期统一最终总断言:稳定箱号、单箱测量、墨家收件箱、客户尺寸和装柜权限。 +USE baiyue_firstleg; +DROP PROCEDURE IF EXISTS assert_unified_final_schema; +DELIMITER $$ +CREATE PROCEDURE assert_unified_final_schema() +BEGIN + IF (SELECT COUNT(*) FROM information_schema.tables + WHERE table_schema = 'baiyue_firstleg' + AND table_name = 'fl_inbound_carton_label') <> 1 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:稳定箱号映射表未创建'; + END IF; + IF (SELECT COUNT(*) FROM information_schema.columns + WHERE table_schema = 'baiyue_firstleg' + AND table_name = 'fl_inbound_measurement_item' + AND column_name IN ('box_code', 'machine_no', 'device_measured_at', 'updated_at')) <> 4 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:单箱当前测量字段未完整创建'; + END IF; + IF (SELECT COUNT(DISTINCT CONCAT(table_name, '.', index_name)) + FROM information_schema.statistics + WHERE table_schema = 'baiyue_firstleg' + AND ((table_name = 'fl_inbound_carton_label' + AND index_name IN ('uk_carton_label_box_code', 'uk_carton_label_index')) + OR (table_name = 'fl_inbound_measurement_item' + AND index_name = 'uk_measure_box_code')) + AND non_unique = 0) <> 3 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:稳定箱号或单箱测量唯一约束未完整创建'; + END IF; + IF (SELECT COUNT(*) FROM information_schema.columns + WHERE table_schema = 'baiyue_firstleg' + AND table_name = 'fl_mojia_measurement_receipt' + AND column_name IN ('id', 'tenant_id', 'subject_id', 'box_code', 'length_cm', 'width_cm', + 'scanned_shipment_id', 'height_cm', 'weight_kg', 'machine_no', 'measured_at', 'image_file_id', + 'status', 'match_failure_code', 'match_failure_reason', 'request_id', + 'trace_id', 'created_at', 'updated_at')) <> 19 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:墨家未匹配测量收件箱字段未完整创建'; + END IF; + IF (SELECT COUNT(*) FROM information_schema.columns + WHERE table_schema = 'baiyue_firstleg' + AND table_name = 'fl_inbound_measurement_item' + AND column_name = 'scanned_shipment_id' + AND character_maximum_length = 64) <> 1 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:箱级测量实扫Shipment ID字段未创建'; + END IF; + IF (SELECT character_maximum_length FROM information_schema.columns + WHERE table_schema = 'baiyue_firstleg' + AND table_name = 'fl_inbound_measurement_item' + AND column_name = 'calculation_rule_version') <> 64 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:测量计算规则版本字段长度不是64'; + END IF; + IF (SELECT COUNT(*) FROM information_schema.tables + WHERE table_schema = 'baiyue_firstleg' + AND table_name = 'fl_customer_dimension_config') <> 1 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:客户尺寸计算配置表未创建'; + END IF; + IF (SELECT COUNT(*) FROM information_schema.statistics + WHERE table_schema = 'baiyue_firstleg' + AND table_name = 'fl_customer_dimension_config' + AND index_name = 'uk_customer_dimension_config_tenant_box' + AND non_unique = 0 + AND ((seq_in_index = 1 AND column_name = 'tenant_id') + OR (seq_in_index = 2 AND column_name = 'box_type'))) <> 2 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:客户四箱规尺寸配置唯一约束未创建'; + END IF; + IF (SELECT COUNT(*) FROM information_schema.columns + WHERE table_schema = 'baiyue_firstleg' AND table_name = 'fl_customer_dimension_config' + AND column_name IN ('id', 'tenant_id', 'box_type', 'inner_length_cm', 'inner_width_cm', + 'inner_height_cm', 'edge_addition_cm', 'remark', 'initialization_key', + 'created_by', 'created_at', 'updated_by', 'updated_at', 'deleted', 'version')) <> 15 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:客户四箱规尺寸配置字段不完整'; + END IF; + IF EXISTS ( + SELECT tenant.id + FROM baiyue_iam.iam_tenant tenant + LEFT JOIN baiyue_firstleg.fl_customer_dimension_config config + ON config.tenant_id = tenant.id AND config.deleted = 0 + WHERE tenant.tenant_type = 'MERCHANT' AND tenant.deleted = 0 AND tenant.id > 0 + GROUP BY tenant.id + HAVING COUNT(config.id) <> 4 + OR COUNT(DISTINCT CASE + WHEN config.box_type IN ('SMALL', 'MEDIUM', 'LARGE', 'EXTRA_LARGE') + THEN config.box_type END) <> 4 + ) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:现有企业客户未完整持有固定四箱规尺寸配置'; + END IF; + IF (SELECT COUNT(*) FROM baiyue_iam.iam_permission + WHERE id = 5100010 AND tenant_id = 0 AND app_code = 'PLATFORM' + AND permission_code = 'platform:customer:list' AND permission_name = '企业客户' + AND status = 'ACTIVE' AND deleted = 0) <> 1 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:客户尺寸计算配置权限父节点企业客户不存在'; + END IF; + IF (SELECT COUNT(*) FROM information_schema.columns + WHERE table_schema = 'baiyue_auth' AND table_name = 'auth_account' + AND column_name = 'password_change_required') <> 1 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:客户管理员强制改密字段未创建'; + END IF; + IF (SELECT COUNT(*) FROM baiyue_iam.iam_permission + WHERE tenant_id = 0 AND app_code = 'PLATFORM' AND permission_type = 'BUTTON' + AND parent_id = 5100010 AND status = 'ACTIVE' AND deleted = 0 + AND ((id = 5100016 AND permission_code = 'platform:customer:reset-password') + OR (id = 5100017 AND permission_code = 'platform:customer:delete') + OR (id = 5100018 AND permission_code = 'platform:customer:impersonate'))) <> 3 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:平台客户操作权限未完整创建'; + END IF; + IF (SELECT COUNT(DISTINCT p.permission_code) + FROM baiyue_iam.iam_role_permission rp + JOIN baiyue_iam.iam_role r ON r.id = rp.role_id AND r.tenant_id = rp.tenant_id + JOIN baiyue_iam.iam_permission p ON p.id = rp.permission_id AND p.tenant_id = rp.tenant_id + WHERE r.tenant_id = 0 AND r.app_code = 'PLATFORM' AND r.role_code = 'PLATFORM_ADMIN' + AND p.permission_code IN ('platform:customer:reset-password', + 'platform:customer:delete', + 'platform:customer:impersonate')) <> 3 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:平台管理员未获得客户操作权限'; + END IF; + IF (SELECT COUNT(*) FROM baiyue_iam.iam_permission + WHERE tenant_id = 0 AND app_code = 'PLATFORM' AND permission_type = 'BUTTON' + AND parent_id = 5100010 AND status = 'ACTIVE' AND deleted = 0 + AND ((id = 5102111 AND permission_code = 'firstleg:dimension-config:view') + OR (id = 5102112 AND permission_code = 'firstleg:dimension-config:edit'))) <> 2 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:客户尺寸计算配置权限码、固定ID或父节点不正确'; + END IF; + IF (SELECT COUNT(DISTINCT p.permission_code) + FROM baiyue_iam.iam_role_permission rp + JOIN baiyue_iam.iam_role r ON r.id = rp.role_id AND r.tenant_id = rp.tenant_id + JOIN baiyue_iam.iam_permission p ON p.id = rp.permission_id AND p.tenant_id = rp.tenant_id + WHERE r.tenant_id = 0 AND r.app_code = 'PLATFORM' AND r.role_code = 'PLATFORM_ADMIN' + AND p.permission_code IN ('firstleg:dimension-config:view', 'firstleg:dimension-config:edit')) <> 2 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:平台管理员未获得客户尺寸计算配置读写权限'; + END IF; + IF (SELECT COUNT(DISTINCT p.permission_code) + FROM baiyue_iam.iam_role_permission rp + JOIN baiyue_iam.iam_role r ON r.id = rp.role_id AND r.tenant_id = rp.tenant_id + JOIN baiyue_iam.iam_permission p ON p.id = rp.permission_id AND p.tenant_id = rp.tenant_id + WHERE r.tenant_id = 0 AND r.app_code = 'PLATFORM' AND r.role_code = 'ORDER_OPERATOR' + AND p.permission_code = 'firstleg:dimension-config:view') <> 1 + OR (SELECT COUNT(*) + FROM baiyue_iam.iam_role_permission rp + JOIN baiyue_iam.iam_role r ON r.id = rp.role_id AND r.tenant_id = rp.tenant_id + JOIN baiyue_iam.iam_permission p ON p.id = rp.permission_id AND p.tenant_id = rp.tenant_id + WHERE r.tenant_id = 0 AND r.app_code = 'PLATFORM' AND r.role_code = 'ORDER_OPERATOR' + AND p.permission_code = 'firstleg:dimension-config:edit') <> 0 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:订单运营角色的客户尺寸计算配置权限不是只读'; + END IF; + IF (SELECT COUNT(*) FROM information_schema.columns + WHERE table_schema = 'baiyue_firstleg' AND table_name = 'fl_loading_pick_task' + AND column_name IN ('loading_plan_id', 'container_no', 'task_status')) <> 3 + OR (SELECT COUNT(*) FROM information_schema.columns + WHERE table_schema = 'baiyue_firstleg' AND table_name = 'fl_loading_pick_task' + AND column_name IN ('tenant_id', 'inbound_id', 'status', 'expected_count', 'picked_count')) <> 0 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:智能装柜拣货任务表型不正确'; + END IF; + IF (SELECT COUNT(*) FROM information_schema.columns + WHERE table_schema = 'baiyue_firstleg' AND table_name = 'fl_inbound_loading_pick_task' + AND column_name IN ('tenant_id', 'inbound_id', 'status', 'expected_count', 'picked_count')) <> 5 + OR (SELECT COUNT(*) FROM information_schema.columns + WHERE table_schema = 'baiyue_firstleg' AND table_name = 'fl_inbound_loading_pick_task' + AND column_name IN ('loading_plan_id', 'container_no', 'task_status')) <> 0 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:入库汇总拣货任务表型不正确'; + END IF; + IF (SELECT COUNT(*) FROM baiyue_iam.iam_permission + WHERE tenant_id = 0 AND app_code = 'PLATFORM' + AND ((id = 5103040 AND permission_code = 'platform:download:list' + AND permission_name = '下载中心' AND route_path = '/downloads') + OR (id = 5103041 AND permission_code = 'platform:download:all' AND parent_id = 5103040))) <> 2 + OR (SELECT COUNT(*) FROM baiyue_iam.iam_permission + WHERE tenant_id = 0 AND app_code = 'PLATFORM' + AND ((id = 5103060 AND permission_code = 'platform:location:list' AND parent_id = 5103000) + OR (id = 5103061 AND permission_code = 'platform:location:create' AND parent_id = 5103060) + OR (id = 5103062 AND permission_code = 'platform:location:edit' AND parent_id = 5103060) + OR (id = 5103063 AND permission_code = 'platform:location:status' AND parent_id = 5103060) + OR (id = 5103064 AND permission_code = 'platform:location:delete' AND parent_id = 5103060))) <> 5 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:下载中心或库位权限语义未修复'; + END IF; + IF (SELECT COUNT(*) FROM baiyue_iam.iam_permission + WHERE tenant_id = 0 AND app_code = 'PLATFORM' + AND id BETWEEN 5102121 AND 5102129 + AND permission_code IN ('firstleg:inbound:split', 'firstleg:inbound:preload', + 'firstleg:inbound:preload-view', 'platform:firstleg:inbound:loading:edit', + 'platform:firstleg:inbound:loading:view', 'platform:firstleg:inbound:loading:complete', + 'platform:firstleg:inbound:delivery:complete', 'platform:firstleg:inbound:picking:edit', + 'platform:firstleg:inbound:picking:view')) <> 9 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:三期入库装柜权限 ID 未完成迁移'; + END IF; + IF (SELECT COUNT(DISTINCT CONCAT(role.role_code, '|', permission.permission_code)) + FROM baiyue_iam.iam_role_permission role_permission + JOIN baiyue_iam.iam_role role + ON role.id = role_permission.role_id AND role.tenant_id = role_permission.tenant_id + JOIN baiyue_iam.iam_permission permission + ON permission.id = role_permission.permission_id + AND permission.tenant_id = role_permission.tenant_id + WHERE role.tenant_id = 0 + AND role.role_code IN ('PLATFORM_ADMIN', 'ORDER_OPERATOR') + AND permission.permission_code IN ( + 'firstleg:inbound:split', 'firstleg:inbound:preload', + 'firstleg:inbound:preload-view', 'platform:firstleg:inbound:loading:edit', + 'platform:firstleg:inbound:loading:view', 'platform:firstleg:inbound:loading:complete', + 'platform:firstleg:inbound:delivery:complete', 'platform:firstleg:inbound:picking:edit', + 'platform:firstleg:inbound:picking:view')) <> 18 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:三期入库装柜角色授权未完整写入'; + END IF; + IF (SELECT COUNT(*) FROM baiyue_iam.iam_permission + WHERE tenant_id = 0 AND app_code = 'PLATFORM' + AND ((id = 5102091 AND permission_code = 'platform:firstleg:container:view' AND parent_id = 5102090) + OR (id = 5102092 AND permission_code = 'platform:firstleg:container:create' AND parent_id = 5102090) + OR (id = 5102093 AND permission_code = 'platform:firstleg:container:edit' AND parent_id = 5102090) + OR (id = 5102094 AND permission_code = 'platform:firstleg:smart-loading:list' AND parent_id = 5102000) + OR (id = 5102096 AND permission_code = 'platform:firstleg:smart-loading:create' AND parent_id = 5102094) + OR (id = 5102097 AND permission_code = 'platform:firstleg:smart-loading:assign' AND parent_id = 5102094) + OR (id = 5102098 AND permission_code = 'platform:firstleg:smart-loading:delete' AND parent_id = 5102094) + OR (id = 5102099 AND permission_code = 'platform:firstleg:smart-loading:push' AND parent_id = 5102094))) <> 8 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '统一迁移失败:智能装柜权限 ID 或父子关系不正确'; + END IF; +END$$ +DELIMITER ; +CALL assert_unified_final_schema(); +DROP PROCEDURE IF EXISTS assert_unified_final_schema; +CALL assert_loading_pick_task_shapes(1); +DROP PROCEDURE IF EXISTS assert_loading_pick_task_shapes; + -- 二、三期对外统一使用 INBOUNDED;历史 WAIT_SPLIT 仅由查询适配为 INBOUNDED,统一迁移不改写主表或历史状态。 SELECT 'PASS' AS migration_status, '统一增量全部执行完成;父子订单、履约分片、装柜门禁、订舱拖车、报关船期、船司查询、仓库角色、费用、公共资源及可靠审计结构校验通过' AS message;