-- ============================================================================= -- 存量库增量迁移(合并自 sql/migrate_*.sql) -- 可按整文件执行;多数段可重复执行(information_schema 判断)。 -- 注意:揽收 Direction / FeePush 两段为裸 ALTER,已执行过的库请跳过或手工注释。 -- ============================================================================= SET @db := DATABASE(); -- ----------------------------------------------------------------------------- -- 1) 排货规则服务商表:MatchCondition -- 原:migrate_allocation_match_condition.sql -- ----------------------------------------------------------------------------- SET @exists := ( SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 't_sales_product_allocation_provider' AND COLUMN_NAME = 'MatchCondition' ); SET @sql := IF( @exists = 0, 'ALTER TABLE `t_sales_product_allocation_provider` ADD COLUMN `MatchCondition` TEXT NULL COMMENT ''排货判断条件(中文公式),空表示全部订单可用'' AFTER `CustomerIds`', 'SELECT ''MatchCondition already exists'' AS info' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ----------------------------------------------------------------------------- -- 2) 客户出口资质备案表(含 IsDefault / Remark) -- 原:migrate_customer_export_qualification.sql -- ----------------------------------------------------------------------------- SET @exists := ( SELECT COUNT(1) FROM information_schema.TABLES WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 't_customer_export_qualification' ); SET @sql := IF( @exists = 0, 'CREATE TABLE `t_customer_export_qualification` ( `Id` INT NOT NULL AUTO_INCREMENT COMMENT ''主键'', `CustomerId` INT NOT NULL COMMENT ''归属客户 t_customer.Id'', `CompanyName` VARCHAR(200) NOT NULL COMMENT ''企业名称'', `SocialCreditCode` VARCHAR(64) NOT NULL COMMENT ''企业社会信用代码'', `DomesticConsignor` VARCHAR(200) NOT NULL COMMENT ''境内发货人'', `DomesticConsignorCustomsCode` VARCHAR(64) NULL COMMENT ''境内发货人海关代码'', `ProducerName` VARCHAR(200) NOT NULL COMMENT ''生产销售单位'', `ProducerCustomsCode` VARCHAR(64) NULL COMMENT ''生产销售单位海关代码'', `CustomsPort` VARCHAR(100) NULL COMMENT ''备案海关港口地'', `IsDefault` TINYINT NOT NULL DEFAULT 0 COMMENT ''是否默认:0-否,1-是(同客户仅一条)'', `Remark` VARCHAR(512) NULL COMMENT ''备注'', `IsDeleted` TINYINT NOT NULL DEFAULT 0 COMMENT ''软删除:0-否,1-是'', `ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT (UUID()) COMMENT ''并发戳'', `CreateUserId` INT NOT NULL DEFAULT 0 COMMENT ''创建人'', `CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ''创建时间'', `UpdateUserId` INT NULL COMMENT ''更新人'', `UpdateTime` DATETIME NULL COMMENT ''更新时间'', PRIMARY KEY (`Id`), KEY `idx_ceq_customer` (`CustomerId`, `IsDeleted`, `Id`), KEY `idx_ceq_credit` (`SocialCreditCode`, `IsDeleted`), KEY `idx_ceq_customer_default` (`CustomerId`, `IsDefault`) ) COMMENT=''客户出口资质备案''', 'SELECT ''t_customer_export_qualification already exists'' AS info' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @col := ( SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 't_customer_export_qualification' AND COLUMN_NAME = 'IsDefault' ); SET @sql := IF( @col = 0, 'ALTER TABLE `t_customer_export_qualification` ADD COLUMN `IsDefault` TINYINT NOT NULL DEFAULT 0 COMMENT ''是否默认:0-否,1-是(同客户仅一条)'' AFTER `CustomsPort`', 'SELECT ''IsDefault already exists'' AS info' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @col := ( SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 't_customer_export_qualification' AND COLUMN_NAME = 'Remark' ); SET @sql := IF( @col = 0, 'ALTER TABLE `t_customer_export_qualification` ADD COLUMN `Remark` VARCHAR(512) NULL COMMENT ''备注'' AFTER `IsDefault`', 'SELECT ''Remark already exists'' AS info' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @idx := ( SELECT COUNT(1) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 't_customer_export_qualification' AND INDEX_NAME = 'idx_ceq_customer_default' ); SET @sql := IF( @idx = 0, 'ALTER TABLE `t_customer_export_qualification` ADD KEY `idx_ceq_customer_default` (`CustomerId`, `IsDefault`)', 'SELECT ''idx_ceq_customer_default already exists'' AS info' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ----------------------------------------------------------------------------- -- 3) t_order:出口资质备案 Id -- 原:migrate_order_export_qualification_id.sql -- ----------------------------------------------------------------------------- SET @exists := ( SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 't_order' AND COLUMN_NAME = 'ExportQualificationId' ); SET @sql := IF( @exists = 0, 'ALTER TABLE `t_order` ADD COLUMN `ExportQualificationId` INT NULL COMMENT ''出口资质备案 Id(t_customer_export_qualification.Id)'' AFTER `ExportCustomsMode`, ADD KEY `idx_order_export_qualification` (`ExportQualificationId`)', 'SELECT ''t_order.ExportQualificationId already exists'' AS info' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ----------------------------------------------------------------------------- -- 4) SKU / 订单申报:DeclareElement -- 原:migrate_declare_element.sql -- ----------------------------------------------------------------------------- SET @exists := ( SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'c_sku' AND COLUMN_NAME = 'DeclareElement' ); SET @sql := IF( @exists = 0, 'ALTER TABLE `c_sku` ADD COLUMN `DeclareElement` VARCHAR(255) NULL COMMENT ''出口申报要素'' AFTER `ImHsCode`', 'SELECT ''c_sku.DeclareElement already exists'' AS info' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @exists := ( SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 't_order_declaration' AND COLUMN_NAME = 'DeclareElement' ); SET @sql := IF( @exists = 0, 'ALTER TABLE `t_order_declaration` ADD COLUMN `DeclareElement` VARCHAR(255) NULL COMMENT ''出口申报要素'' AFTER `ExHsCode`', 'SELECT ''t_order_declaration.DeclareElement already exists'' AS info' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ----------------------------------------------------------------------------- -- 5) 问题模板:处理人字段 -- 原:migrate_issue_template_handler.sql -- ----------------------------------------------------------------------------- SET @exists := ( SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 't_issue_template' AND COLUMN_NAME = 'HandlerType' ); SET @sql := IF( @exists = 0, 'ALTER TABLE `t_issue_template` ADD COLUMN `HandlerType` VARCHAR(16) NULL COMMENT ''处理人类型:customer=订单所属客户,user=指定用户'' AFTER `NotifyMethod`', 'SELECT ''HandlerType already exists'' AS info' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @exists := ( SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 't_issue_template' AND COLUMN_NAME = 'HandlerUserId' ); SET @sql := IF( @exists = 0, 'ALTER TABLE `t_issue_template` ADD COLUMN `HandlerUserId` INT NULL COMMENT ''指定处理人用户Id(HandlerType=user 时必填)'' AFTER `HandlerType`', 'SELECT ''HandlerUserId already exists'' AS info' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; UPDATE `t_issue_template` SET `HandlerType` = 'user' WHERE (`HandlerType` IS NULL OR `HandlerType` = '') AND `IsDeleted` = 0; -- ----------------------------------------------------------------------------- -- 6) 揽收方向 + 客户地址类型 -- 原:migrate_pickup_direction_and_address_type.sql -- 注意:裸 ALTER,已执行过勿再跑本段 -- ----------------------------------------------------------------------------- ALTER TABLE `t_pickup_order` ADD COLUMN `Direction` VARCHAR(16) NOT NULL DEFAULT 'forward' COMMENT 'forward正向(客户→仓)/reverse逆向(仓→客户)' AFTER `SenderAddressId`; ALTER TABLE `t_pickup_order` ADD KEY `idx_pickup_direction_status` (`Direction`, `Status`, `CreateTime`); ALTER TABLE `t_customer_sender_address` MODIFY COLUMN `AddressType` VARCHAR(16) NOT NULL DEFAULT 'sender' COMMENT 'sender国内发件/return国内退件/pickup国内揽收/receiver海外收件'; -- ----------------------------------------------------------------------------- -- 7) 揽收单:承运推送件重尺 + 费用快照 -- 原:migrate_pickup_fee_push.sql -- 注意:裸 ALTER,已执行过勿再跑本段 -- ----------------------------------------------------------------------------- ALTER TABLE `t_pickup_order` ADD COLUMN `VolumetricWeight` DECIMAL(18,3) NULL COMMENT '体积重' AFTER `ChargeableWeight`, ADD COLUMN `PackageSizesJson` TEXT NULL COMMENT '承运回传尺寸 JSON' AFTER `VolumetricWeight`, ADD COLUMN `CarrierFreightWeight` DECIMAL(18,3) NULL COMMENT '承运计费重(对照)' AFTER `PackageSizesJson`, ADD COLUMN `CarrierQuotedFreightAmount` DECIMAL(18,2) NULL COMMENT '承运报价运费(对照)' AFTER `CarrierFreightWeight`, ADD COLUMN `CarrierQuotedReceivableAmount` DECIMAL(18,2) NULL COMMENT '承运报文应收(对照)' AFTER `CarrierQuotedFreightAmount`, ADD COLUMN `CarrierQuoteJson` TEXT NULL COMMENT '承运报价原文' AFTER `CarrierQuotedReceivableAmount`, ADD COLUMN `ReceivableFeeJson` TEXT NULL COMMENT '系统卖价费用明细 JSON' AFTER `CarrierQuoteJson`, ADD COLUMN `PayableFeeJson` TEXT NULL COMMENT '系统买价费用明细 JSON' AFTER `ReceivableFeeJson`, ADD COLUMN `FeePushedAt` DATETIME NULL COMMENT '承运推送件重尺时间' AFTER `PayableFeeJson`; -- ----------------------------------------------------------------------------- -- 8) 客户 OpenAPI 机机凭证 -- 原:migrate_customer_openapi_credential.sql -- ----------------------------------------------------------------------------- SET @exists := ( SELECT COUNT(1) FROM information_schema.TABLES WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 't_customer_openapi_credential' ); SET @sql := IF( @exists = 0, 'CREATE TABLE `t_customer_openapi_credential` ( `Id` INT NOT NULL AUTO_INCREMENT COMMENT ''主键'', `CustomerId` INT NOT NULL COMMENT ''归属主客户 t_customer.Id'', `AppKey` VARCHAR(64) NOT NULL COMMENT ''开放接口 AppKey'', `AppSecret` VARCHAR(128) NOT NULL COMMENT ''开放接口 AppSecret(明文,创建/重置时返回)'', `Enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT ''是否启用:0-否,1-是'', `LastUsedAt` DATETIME NULL COMMENT ''最近鉴权成功时间'', `LastUsedIp` VARCHAR(64) NULL COMMENT ''最近鉴权成功 IP'', `Remark` VARCHAR(512) NULL COMMENT ''备注'', `IsDeleted` TINYINT NOT NULL DEFAULT 0 COMMENT ''软删除:0-否,1-是'', `ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT (UUID()) COMMENT ''并发戳'', `CreateUserId` INT NOT NULL DEFAULT 0 COMMENT ''创建人'', `CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ''创建时间'', `UpdateUserId` INT NULL COMMENT ''更新人'', `UpdateTime` DATETIME NULL COMMENT ''更新时间'', PRIMARY KEY (`Id`), UNIQUE KEY `uk_coc_customer` (`CustomerId`), UNIQUE KEY `uk_coc_app_key` (`AppKey`), KEY `idx_coc_enabled` (`Enabled`, `IsDeleted`) ) COMMENT=''客户 OpenAPI 机机凭证''', 'SELECT ''t_customer_openapi_credential already exists'' AS info' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ----------------------------------------------------------------------------- -- 9) 分区明细:匹配维度 / 方式 / 前缀长度 -- ----------------------------------------------------------------------------- SET @col := ( SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 't_kpi_area_info' AND COLUMN_NAME = 'MatchDim' ); SET @sql := IF( @col = 0, 'ALTER TABLE `t_kpi_area_info` ADD COLUMN `MatchDim` VARCHAR(16) NOT NULL DEFAULT ''country'' COMMENT ''匹配维度:zip/state/city/country'' AFTER `RightPostcode`, ADD COLUMN `MatchMode` VARCHAR(16) NOT NULL DEFAULT ''all'' COMMENT ''匹配方式:prefix/exact/range/all'' AFTER `MatchDim`, ADD COLUMN `PrefixLen` INT NOT NULL DEFAULT 0 COMMENT ''邮编前缀长度(zip+prefix)'' AFTER `MatchMode`', 'SELECT ''kpi area match columns already exist'' AS info' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @idx := ( SELECT COUNT(1) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 't_kpi_area_info' AND INDEX_NAME = 'idx_kpi_info_area_dim' ); SET @sql := IF( @idx = 0, 'ALTER TABLE `t_kpi_area_info` ADD KEY `idx_kpi_info_area_dim` (`AreaId`, `CountryCode`, `MatchDim`)', 'SELECT ''idx_kpi_info_area_dim already exists'' AS info' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; UPDATE `t_kpi_area_info` SET `MatchDim` = CASE WHEN IFNULL(`LeftPostcode`, '') <> '' OR IFNULL(`RightPostcode`, '') <> '' THEN 'zip' WHEN IFNULL(`City`, '') <> '' THEN 'city' WHEN IFNULL(`Province`, '') <> '' THEN 'state' ELSE 'country' END, `MatchMode` = CASE WHEN IFNULL(`LeftPostcode`, '') <> '' AND IFNULL(`RightPostcode`, '') = '' THEN 'prefix' WHEN IFNULL(`LeftPostcode`, '') <> '' AND `LeftPostcode` = `RightPostcode` THEN 'exact' WHEN IFNULL(`LeftPostcode`, '') <> '' AND IFNULL(`RightPostcode`, '') <> '' THEN 'range' WHEN IFNULL(`City`, '') <> '' OR IFNULL(`Province`, '') <> '' THEN 'exact' ELSE 'all' END, `PrefixLen` = CASE WHEN IFNULL(`LeftPostcode`, '') <> '' AND IFNULL(`RightPostcode`, '') = '' THEN CHAR_LENGTH(`LeftPostcode`) WHEN IFNULL(`LeftPostcode`, '') <> '' AND `LeftPostcode` = `RightPostcode` THEN CHAR_LENGTH(`LeftPostcode`) WHEN IFNULL(`LeftPostcode`, '') <> '' AND IFNULL(`RightPostcode`, '') <> '' THEN LEAST(CHAR_LENGTH(`LeftPostcode`), CHAR_LENGTH(`RightPostcode`)) ELSE 0 END WHERE IFNULL(`MatchDim`, '') IN ('', 'country') AND ( IFNULL(`LeftPostcode`, '') <> '' OR IFNULL(`RightPostcode`, '') <> '' OR IFNULL(`Province`, '') <> '' OR IFNULL(`City`, '') <> '' );