优化
This commit is contained in:
+10
-1
@@ -62,7 +62,16 @@
|
||||
|
||||
## 后续迁移工具(已开始实施)
|
||||
|
||||
机制启用前,以上两份统一 SQL 仍是空库初始化入口;本节工具不会把当前可丢弃的开发/测试存量转换成迁移链。当前已登记一份生产尾程结构补齐迁移 `migrations/overseas/baiyue_lastleg/V1__align_lastleg_production_schema.sql`,由 `scripts/prod-database-schema-acceptance.mjs` 默认只读核对,只有显式确认参数才执行;它只新增字段、放宽生成后才确定字段的可空性并创建缺失表,不执行 DML。
|
||||
机制启用前,以上两份统一 SQL 仍是空库初始化入口;本节工具不会把当前可丢弃的开发/测试存量自动转换成迁移链。现有候选迁移包括:
|
||||
|
||||
| 区域 / schema | 迁移 | 目的 |
|
||||
|---|---|---|
|
||||
| CN / `baiyue_iam` | `migrations/cn/baiyue_iam/V1__align_schema_baseline.sql` | 收敛客户编号、昵称和资质原文件名定义;收紧前检查存量数据 |
|
||||
| CN / `baiyue_firstleg` | `migrations/cn/baiyue_firstleg/V1__align_schema_baseline.sql` | 收敛一件代发托盘码非空定义;收紧前检查存量数据 |
|
||||
| CN / `baiyue_file` | `migrations/cn/baiyue_file/V1__align_schema_baseline.sql` | 补齐 PDA 发布表和固定渠道,收敛文件业务类型长度 |
|
||||
| OVERSEAS / `baiyue_lastleg` | `migrations/overseas/baiyue_lastleg/V1__align_lastleg_production_schema.sql`、`V2__align_schema_baseline.sql` | 补齐尾程字段并收敛字段定义和排序规则;收紧前检查存量数据 |
|
||||
|
||||
上述新增候选当前只完成编写和离线检查,尚未在测试或生产执行。测试通过后必须复用同一份 SQL 和 manifest 晋级生产,不得重新生成或修改候选。`scripts/prod-database-schema-acceptance.mjs` 仍只负责历史尾程 V1 的专用只读核对/受控执行,不代表本批跨 schema 发布入口;本批按迁移 manifest 管理,实际执行须等待环境执行器接入或当前轮明确授权后的受控人工执行。
|
||||
|
||||
迁移范围映射位于 `migration-scopes.json`,按区域、schema、所属服务和顺序登记。迁移文件位于 `migrations/{cn|overseas}/<schema>/`,一个文件只允许修改一个 schema。目录中的 `.gitkeep` 仅用于保留空目录,不是迁移文件。
|
||||
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
-- Region: CN
|
||||
-- Schema: baiyue_file
|
||||
-- Purpose: 补齐 PDA 发布表,并将文件业务类型长度收敛到当前空库基线。
|
||||
-- Preconditions: 连接必须指向 baiyue_file;既有 business_type 不超过 32 字符。
|
||||
-- Postconditions: PDA 发布表及固定渠道存在,file_object.business_type 为 varchar(32)。
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
SET @guard = IF(
|
||||
EXISTS (SELECT 1 FROM file_object WHERE CHAR_LENGTH(business_type) > 32 LIMIT 1),
|
||||
'SIGNAL SQLSTATE ''45000'' SET MESSAGE_TEXT = ''file_object.business_type exceeds 32 characters''',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt FROM @guard; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
ALTER TABLE file_object
|
||||
MODIFY COLUMN business_type varchar(32) DEFAULT NULL COMMENT '关联业务类型';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS file_pda_release_channel (
|
||||
app_code varchar(16) NOT NULL,
|
||||
app_id varchar(64) NOT NULL,
|
||||
current_apk_id char(36) DEFAULT NULL,
|
||||
current_wgt_id char(36) DEFAULT NULL,
|
||||
PRIMARY KEY (app_code)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='国内/海外PDA当前发布指针';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS file_pda_release (
|
||||
id char(36) NOT NULL,
|
||||
app_code varchar(16) NOT NULL,
|
||||
app_id varchar(64) NOT NULL,
|
||||
package_type varchar(8) NOT NULL,
|
||||
version_name varchar(32) NOT NULL,
|
||||
version_code int unsigned NOT NULL,
|
||||
min_app_version_code int unsigned NOT NULL,
|
||||
mandatory tinyint(1) NOT NULL DEFAULT '0',
|
||||
release_notes varchar(1000) NOT NULL DEFAULT '',
|
||||
status varchar(16) NOT NULL DEFAULT 'DRAFT',
|
||||
object_key varchar(128) NOT NULL,
|
||||
sha256 char(64) NOT NULL,
|
||||
size_bytes bigint unsigned NOT NULL,
|
||||
created_by bigint unsigned NOT NULL,
|
||||
created_at datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
published_at datetime(3) DEFAULT NULL,
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uk_pda_release_version (app_code,package_type,version_name),
|
||||
KEY idx_pda_release_created (app_code,created_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='PDA安装包与热更新发布历史';
|
||||
|
||||
INSERT INTO file_pda_release_channel (app_code,app_id)
|
||||
SELECT 'domestic','__UNI__9BFFAF2'
|
||||
WHERE NOT EXISTS (SELECT 1 FROM file_pda_release_channel WHERE app_code = 'domestic');
|
||||
|
||||
INSERT INTO file_pda_release_channel (app_code,app_id)
|
||||
SELECT 'overseas','__UNI__936D079'
|
||||
WHERE NOT EXISTS (SELECT 1 FROM file_pda_release_channel WHERE app_code = 'overseas');
|
||||
@@ -0,0 +1,17 @@
|
||||
-- Region: CN
|
||||
-- Schema: baiyue_firstleg
|
||||
-- Purpose: 将一件代发作业托盘码可空性收敛到当前空库基线。
|
||||
-- Preconditions: 连接必须指向 baiyue_firstleg;fl_dropship_pallet.pallet_no 不存在 NULL。
|
||||
-- Postconditions: pallet_no 为 varchar(32) NOT NULL。
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
SET @guard = IF(
|
||||
EXISTS (SELECT 1 FROM fl_dropship_pallet WHERE pallet_no IS NULL LIMIT 1),
|
||||
'SIGNAL SQLSTATE ''45000'' SET MESSAGE_TEXT = ''fl_dropship_pallet.pallet_no contains NULL''',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt FROM @guard; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
ALTER TABLE fl_dropship_pallet
|
||||
MODIFY COLUMN pallet_no varchar(32) NOT NULL COMMENT '现场扫描的系统DP托盘码';
|
||||
@@ -0,0 +1,35 @@
|
||||
-- Region: CN
|
||||
-- Schema: baiyue_iam
|
||||
-- Purpose: 将客户编号、昵称和资质原文件名定义收敛到当前空库基线。
|
||||
-- Preconditions: 连接必须指向 baiyue_iam;待收紧字段不存在 NULL,tenant_code 不超过 8 字符。
|
||||
-- Postconditions: 三个字段的类型和可空性与头程统一初始化 SQL 一致。
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
SET @guard = IF(
|
||||
EXISTS (SELECT 1 FROM iam_tenant WHERE customer_nickname IS NULL LIMIT 1),
|
||||
'SIGNAL SQLSTATE ''45000'' SET MESSAGE_TEXT = ''iam_tenant.customer_nickname contains NULL''',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt FROM @guard; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @guard = IF(
|
||||
EXISTS (SELECT 1 FROM iam_tenant WHERE CHAR_LENGTH(tenant_code) > 8 LIMIT 1),
|
||||
'SIGNAL SQLSTATE ''45000'' SET MESSAGE_TEXT = ''iam_tenant.tenant_code exceeds 8 characters''',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt FROM @guard; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @guard = IF(
|
||||
EXISTS (SELECT 1 FROM iam_tenant_qualification WHERE original_file_name IS NULL LIMIT 1),
|
||||
'SIGNAL SQLSTATE ''45000'' SET MESSAGE_TEXT = ''iam_tenant_qualification.original_file_name contains NULL''',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt FROM @guard; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
ALTER TABLE iam_tenant
|
||||
MODIFY COLUMN tenant_code varchar(8) NOT NULL COMMENT '客户编号:企业客户固定五位数字,平台技术主体为PLATFORM',
|
||||
MODIFY COLUMN customer_nickname varchar(32) NOT NULL COMMENT '客户昵称:创建时默认取公司名称中文拼音大写首字母,可修改';
|
||||
|
||||
ALTER TABLE iam_tenant_qualification
|
||||
MODIFY COLUMN original_file_name varchar(255) NOT NULL COMMENT '上传时原始文件名';
|
||||
@@ -0,0 +1,66 @@
|
||||
-- Region: OVERSEAS
|
||||
-- Schema: baiyue_lastleg
|
||||
-- Purpose: 补齐测试与生产各自缺失的尾程字段,并将字段定义收敛到当前空库基线。
|
||||
-- Preconditions: 连接必须指向 baiyue_lastleg;待收紧字段不存在 NULL,review_decision 不超过 16 字符。
|
||||
-- Postconditions: 本文件涉及的字段集合、类型、默认值、可空性和测量照片表排序规则与海外统一初始化 SQL 一致。
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- 测试环境当前缺失、生产已存在的 PDA 废弃作业字段。
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_cargo_discard_item' AND column_name = 'actual_discard_packages'), 'ALTER TABLE ll_cargo_discard_item ADD COLUMN actual_discard_packages int NULL COMMENT ''PDA确认实际废弃箱数'' AFTER discard_packages', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_cargo_discard_item' AND column_name = 'pda_status'), 'ALTER TABLE ll_cargo_discard_item ADD COLUMN pda_status varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT ''PENDING'' COMMENT ''PDA处理状态:待处理PENDING、已完成COMPLETED'' AFTER actual_discard_packages', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_cargo_discard_item' AND column_name = 'pda_operator_id'), 'ALTER TABLE ll_cargo_discard_item ADD COLUMN pda_operator_id varchar(128) COLLATE utf8mb4_unicode_ci NULL COMMENT ''PDA操作人'' AFTER pda_status', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_cargo_discard_item' AND column_name = 'pda_completed_at'), 'ALTER TABLE ll_cargo_discard_item ADD COLUMN pda_completed_at datetime(3) NULL COMMENT ''PDA完成时间'' AFTER pda_operator_id', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 生产环境当前缺失、测试已存在的换标与退货字段。
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_relabel_pda_unit_fact' AND column_name = 'quantity'), 'ALTER TABLE ll_relabel_pda_unit_fact ADD COLUMN quantity int NOT NULL DEFAULT 1 COMMENT ''本次事实处理件数,箱级作业固定为1'' AFTER reason', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_inventory_carton' AND column_name = 'pallet_code'), 'ALTER TABLE ll_return_inventory_carton ADD COLUMN pallet_code varchar(128) COLLATE utf8mb4_unicode_ci NULL COMMENT ''签收时绑定的托盘码'' AFTER source_return_no', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_order' AND column_name = 'discrepancy_reason'), 'ALTER TABLE ll_return_order ADD COLUMN discrepancy_reason varchar(500) COLLATE utf8mb4_unicode_ci NULL COMMENT ''手动完结差异原因'' AFTER status', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_order' AND column_name = 'manually_completed_at'), 'ALTER TABLE ll_return_order ADD COLUMN manually_completed_at datetime(3) NULL COMMENT ''手动差异完结时间'' AFTER discrepancy_reason', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_receipt' AND column_name = 'pallet_code'), 'ALTER TABLE ll_return_receipt ADD COLUMN pallet_code varchar(128) COLLATE utf8mb4_unicode_ci NULL COMMENT ''本次签收绑定的托盘码'' AFTER carton_mark', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 收紧测试库漂移字段前先阻断不满足目标定义的数据,不执行自动回填或清理。
|
||||
SET @guard = IF(EXISTS (SELECT 1 FROM ll_delivery_order WHERE delivery_group_key IS NULL LIMIT 1), 'SIGNAL SQLSTATE ''45000'' SET MESSAGE_TEXT = ''ll_delivery_order.delivery_group_key contains NULL''', 'SELECT 1');
|
||||
PREPARE stmt FROM @guard; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @guard = IF(EXISTS (SELECT 1 FROM ll_local_looseboard_order WHERE container_type IS NULL LIMIT 1), 'SIGNAL SQLSTATE ''45000'' SET MESSAGE_TEXT = ''ll_local_looseboard_order.container_type contains NULL''', 'SELECT 1');
|
||||
PREPARE stmt FROM @guard; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @guard = IF(EXISTS (SELECT 1 FROM ll_us_truck_order WHERE container_type IS NULL LIMIT 1), 'SIGNAL SQLSTATE ''45000'' SET MESSAGE_TEXT = ''ll_us_truck_order.container_type contains NULL''', 'SELECT 1');
|
||||
PREPARE stmt FROM @guard; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @guard = IF(EXISTS (SELECT 1 FROM ll_outbound_pda_pick WHERE inventory_position_id IS NULL LIMIT 1), 'SIGNAL SQLSTATE ''45000'' SET MESSAGE_TEXT = ''ll_outbound_pda_pick.inventory_position_id contains NULL''', 'SELECT 1');
|
||||
PREPARE stmt FROM @guard; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @guard = IF(EXISTS (SELECT 1 FROM ll_relabel_item WHERE new_sku_code IS NULL LIMIT 1), 'SIGNAL SQLSTATE ''45000'' SET MESSAGE_TEXT = ''ll_relabel_item.new_sku_code contains NULL''', 'SELECT 1');
|
||||
PREPARE stmt FROM @guard; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @guard = IF(EXISTS (SELECT 1 FROM ll_relabel_item WHERE source_warehouse_id IS NULL LIMIT 1), 'SIGNAL SQLSTATE ''45000'' SET MESSAGE_TEXT = ''ll_relabel_item.source_warehouse_id contains NULL''', 'SELECT 1');
|
||||
PREPARE stmt FROM @guard; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @guard = IF(EXISTS (SELECT 1 FROM ll_relabel_pda_task WHERE CHAR_LENGTH(review_decision) > 16 LIMIT 1), 'SIGNAL SQLSTATE ''45000'' SET MESSAGE_TEXT = ''ll_relabel_pda_task.review_decision exceeds 16 characters''', 'SELECT 1');
|
||||
PREPARE stmt FROM @guard; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
ALTER TABLE ll_delivery_order
|
||||
MODIFY COLUMN delivery_group_key varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '同一出库单内按目的FBA仓拆单的稳定分组键';
|
||||
ALTER TABLE ll_local_looseboard_order
|
||||
MODIFY COLUMN container_type varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '40HQ' COMMENT '平台统一柜型:40GP、40HQ、45HQ';
|
||||
ALTER TABLE ll_us_truck_order
|
||||
MODIFY COLUMN container_type varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '40HQ' COMMENT '平台统一柜型:40GP、40HQ、45HQ';
|
||||
ALTER TABLE ll_outbound_pda_pick
|
||||
MODIFY COLUMN inventory_position_id bigint NOT NULL COMMENT '库存仓位ID';
|
||||
ALTER TABLE ll_relabel_item
|
||||
MODIFY COLUMN new_sku_code varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '换标后SKU编码',
|
||||
MODIFY COLUMN source_warehouse_id varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '原海外中转仓ID';
|
||||
ALTER TABLE ll_relabel_pda_task
|
||||
MODIFY COLUMN review_decision varchar(16) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '最近复核结论:APPROVE或REWORK';
|
||||
|
||||
SET @ddl = IF(
|
||||
(SELECT table_collation FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'll_warehouse_transfer_measurement_photo') <> 'utf8mb4_unicode_ci',
|
||||
'ALTER TABLE ll_warehouse_transfer_measurement_photo CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
Reference in New Issue
Block a user