2026-07-30 18:01:36 +08:00
|
|
|
-- Phase-one first-leg order fields. Safe to run repeatedly on MySQL 8.
|
|
|
|
|
USE baiyue_order;
|
|
|
|
|
SET NAMES utf8mb4;
|
|
|
|
|
|
|
|
|
|
DROP PROCEDURE IF EXISTS phase1_add_column;
|
|
|
|
|
DELIMITER $$
|
|
|
|
|
CREATE PROCEDURE phase1_add_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 @phase1_sql = CONCAT('ALTER TABLE `', p_table_name, '` ADD COLUMN `',
|
|
|
|
|
p_column_name, '` ', p_definition);
|
|
|
|
|
PREPARE phase1_stmt FROM @phase1_sql;
|
|
|
|
|
EXECUTE phase1_stmt;
|
|
|
|
|
DEALLOCATE PREPARE phase1_stmt;
|
|
|
|
|
END IF;
|
|
|
|
|
END$$
|
|
|
|
|
DELIMITER ;
|
|
|
|
|
|
|
|
|
|
CALL phase1_add_column('ord_order', 'pickup_method', "VARCHAR(24) NULL COMMENT 'Pickup method'");
|
|
|
|
|
CALL phase1_add_column('ord_order', 'receiving_warehouse_id', "BIGINT UNSIGNED NULL COMMENT 'Domestic receiving warehouse ID'");
|
|
|
|
|
CALL phase1_add_column('ord_order', 'receiving_warehouse_name', "VARCHAR(128) NULL COMMENT 'Domestic receiving warehouse snapshot'");
|
2026-07-31 16:53:07 +08:00
|
|
|
CALL phase1_add_column('ord_order', 'receiving_warehouse_address', "VARCHAR(512) NULL COMMENT '国内收货仓完整地址快照'");
|
|
|
|
|
CALL phase1_add_column('ord_order', 'receiving_time', "VARCHAR(128) NULL COMMENT '国内收货仓收货时间快照'");
|
2026-07-30 18:01:36 +08:00
|
|
|
CALL phase1_add_column('ord_order', 'channel_code', "VARCHAR(64) NULL COMMENT 'Shipping channel code'");
|
|
|
|
|
CALL phase1_add_column('ord_order', 'channel_name', "VARCHAR(128) NULL COMMENT 'Shipping channel snapshot'");
|
|
|
|
|
CALL phase1_add_column('ord_order', 'tax_mode', "VARCHAR(24) NULL COMMENT 'BUY_DECLARATION or TAX_REFUND'");
|
|
|
|
|
CALL phase1_add_column('ord_order', 'container_mode', "VARCHAR(24) NULL COMMENT 'FULL_CONTAINER or LCL'");
|
|
|
|
|
CALL phase1_add_column('ord_order', 'customs_inspection', "TINYINT(1) NULL COMMENT 'Whether customs inspection is required'");
|
|
|
|
|
CALL phase1_add_column('ord_order', 'destination_type', "VARCHAR(24) NULL COMMENT 'FBA, OVERSEAS or PRIVATE'");
|
|
|
|
|
CALL phase1_add_column('ord_order', 'amazon_warehouse_code', "VARCHAR(32) NULL COMMENT 'Amazon warehouse code'");
|
|
|
|
|
CALL phase1_add_column('ord_order', 'shipment_id', "VARCHAR(64) NULL COMMENT 'Amazon Shipment ID'");
|
|
|
|
|
CALL phase1_add_column('ord_order', 'reference_id', "VARCHAR(64) NULL COMMENT 'Amazon Reference ID'");
|
2026-07-31 16:53:07 +08:00
|
|
|
CALL phase1_add_column('ord_order', 'express_company', "VARCHAR(64) NULL COMMENT '履约快递公司名称快照'");
|
|
|
|
|
CALL phase1_add_column('ord_order', 'express_tracking_no', "VARCHAR(128) NULL COMMENT '履约快递单号'");
|
2026-07-30 18:01:36 +08:00
|
|
|
|
|
|
|
|
CALL phase1_add_column('ord_order_cargo', 'sku_no', "VARCHAR(64) NULL COMMENT 'SKU number'");
|
|
|
|
|
CALL phase1_add_column('ord_order_cargo', 'upc_no', "VARCHAR(64) NULL COMMENT 'UPC number'");
|
|
|
|
|
CALL phase1_add_column('ord_order_cargo', 'cargo_name_en', "VARCHAR(128) NULL COMMENT 'English cargo name'");
|
|
|
|
|
CALL phase1_add_column('ord_order_cargo', 'customs_hs_code', "VARCHAR(20) NULL COMMENT 'Destination customs HS code'");
|
|
|
|
|
CALL phase1_add_column('ord_order_cargo', 'units_per_package', "INT UNSIGNED NULL COMMENT 'Units per carton'");
|
|
|
|
|
CALL phase1_add_column('ord_order_cargo', 'total_quantity', "INT UNSIGNED NULL COMMENT 'Total units'");
|
|
|
|
|
CALL phase1_add_column('ord_order_cargo', 'net_weight_kg', "DECIMAL(18,3) NULL COMMENT 'Net weight in kilograms'");
|
|
|
|
|
CALL phase1_add_column('ord_order_cargo', 'unit_declared_value', "DECIMAL(18,2) NULL COMMENT 'Declared value per unit'");
|
|
|
|
|
CALL phase1_add_column('ord_order_cargo', 'material', "VARCHAR(128) NULL COMMENT 'Material'");
|
|
|
|
|
CALL phase1_add_column('ord_order_cargo', 'product_usage', "VARCHAR(128) NULL COMMENT 'Usage'");
|
|
|
|
|
CALL phase1_add_column('ord_order_cargo', 'model', "VARCHAR(64) NULL COMMENT 'Model'");
|
|
|
|
|
CALL phase1_add_column('ord_order_cargo', 'brand', "VARCHAR(64) NULL COMMENT 'Brand'");
|
2026-08-07 18:44:51 +08:00
|
|
|
CALL phase1_add_column('ord_order_cargo', 'product_length_cm', "DECIMAL(12,2) NULL COMMENT 'Product length in centimeters'");
|
|
|
|
|
CALL phase1_add_column('ord_order_cargo', 'product_width_cm', "DECIMAL(12,2) NULL COMMENT 'Product width in centimeters'");
|
|
|
|
|
CALL phase1_add_column('ord_order_cargo', 'product_height_cm', "DECIMAL(12,2) NULL COMMENT 'Product height in centimeters'");
|
|
|
|
|
CALL phase1_add_column('ord_order_cargo', 'shipment_id', "VARCHAR(64) NULL COMMENT 'Cargo Amazon Shipment ID'");
|
|
|
|
|
CALL phase1_add_column('ord_order_cargo', 'reference_id', "VARCHAR(64) NULL COMMENT 'Cargo Amazon Reference ID'");
|
|
|
|
|
CALL phase1_add_column('ord_order_cargo', 'product_image_file_id', "BIGINT UNSIGNED NULL COMMENT 'Product image logical file ID'");
|
2026-07-30 18:01:36 +08:00
|
|
|
|
2026-08-07 19:23:40 +08:00
|
|
|
-- 货物级字段上线前,FBA 编号只保存在主单;回填后提交校验可统一按每条货物执行。
|
|
|
|
|
UPDATE ord_order_cargo cargo
|
|
|
|
|
JOIN ord_order orders ON orders.id = cargo.order_id AND orders.tenant_id = cargo.tenant_id
|
|
|
|
|
SET cargo.shipment_id = COALESCE(NULLIF(cargo.shipment_id, ''), orders.shipment_id),
|
|
|
|
|
cargo.reference_id = COALESCE(NULLIF(cargo.reference_id, ''), orders.reference_id)
|
|
|
|
|
WHERE orders.destination_type = 'FBA'
|
|
|
|
|
AND ((cargo.shipment_id IS NULL OR cargo.shipment_id = '')
|
|
|
|
|
OR (cargo.reference_id IS NULL OR cargo.reference_id = ''));
|
|
|
|
|
|
2026-07-30 18:01:36 +08:00
|
|
|
DROP PROCEDURE phase1_add_column;
|
2026-07-31 16:53:07 +08:00
|
|
|
|
|
|
|
|
-- 已有订单库的幂等记录迁移,和订单写入处于同一个本地事务。
|
|
|
|
|
CREATE TABLE IF NOT EXISTS ord_idempotency_record (
|
|
|
|
|
id BIGINT UNSIGNED NOT NULL COMMENT '幂等记录 ID',
|
|
|
|
|
tenant_id BIGINT UNSIGNED NOT NULL COMMENT '租户 ID',
|
|
|
|
|
operator_id BIGINT UNSIGNED NOT NULL COMMENT '操作人 ID',
|
|
|
|
|
operation VARCHAR(32) NOT NULL COMMENT '操作类型',
|
|
|
|
|
resource_id BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '资源 ID',
|
|
|
|
|
idempotency_key VARCHAR(128) NOT NULL COMMENT '客户端幂等键',
|
|
|
|
|
request_hash CHAR(64) NOT NULL COMMENT '请求内容摘要',
|
|
|
|
|
status VARCHAR(16) NOT NULL COMMENT '处理状态',
|
|
|
|
|
result_order_id BIGINT UNSIGNED NULL COMMENT '重放结果订单 ID',
|
|
|
|
|
completed_at DATETIME(3) NULL COMMENT '完成时间',
|
|
|
|
|
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
|
|
|
|
|
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
|
|
|
|
|
PRIMARY KEY (id),
|
|
|
|
|
UNIQUE KEY uk_order_idempotency_scope (tenant_id, operator_id, operation, idempotency_key),
|
|
|
|
|
KEY idx_order_idempotency_created (created_at)
|
|
|
|
|
) ENGINE=InnoDB COMMENT='订单写接口持久化幂等记录';
|