All checks were successful
Build and Deploy / deploy (push) Successful in 1m2s
Co-authored-by: Cursor <cursoragent@cursor.com>
362 lines
14 KiB
SQL
362 lines
14 KiB
SQL
-- =============================================================================
|
||
-- 存量库增量迁移(合并自 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`, '') <> ''
|
||
);
|