SET NAMES utf8mb4; -- 订单服务独占数据库。其他服务只能通过 OpenAPI 或领域事件获取订单数据。 CREATE DATABASE IF NOT EXISTS baiyue_order DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; USE baiyue_order; CREATE TABLE IF NOT EXISTS ord_order ( id BIGINT UNSIGNED NOT NULL COMMENT '订单ID(雪花ID)', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', order_no VARCHAR(32) NOT NULL COMMENT '租户内唯一订单号', customer_id BIGINT UNSIGNED NULL COMMENT '客户逻辑ID', customer_name VARCHAR(128) NOT NULL COMMENT '下单时客户名称快照', status VARCHAR(24) NOT NULL DEFAULT 'DRAFT' COMMENT '订单业务状态', transport_mode VARCHAR(16) NOT NULL COMMENT '运输方式', trade_term VARCHAR(16) NULL COMMENT '贸易条款', destination_country_code CHAR(2) NOT NULL COMMENT '目的国家二字码', destination_warehouse_id BIGINT UNSIGNED NULL COMMENT '目的仓逻辑ID', destination_warehouse_name VARCHAR(128) NOT NULL COMMENT '目的仓名称快照', expected_ship_date DATE NULL COMMENT '预计发运日期', customer_remark VARCHAR(1000) NULL COMMENT '客户可见备注', pickup_method VARCHAR(24) NULL COMMENT '取货方式', receiving_warehouse_id BIGINT UNSIGNED NULL COMMENT '国内收货仓ID', receiving_warehouse_name VARCHAR(128) NULL COMMENT '国内收货仓快照', receiving_warehouse_address VARCHAR(512) NULL COMMENT '国内收货仓完整地址快照', receiving_time VARCHAR(128) NULL COMMENT '国内收货仓收货时间快照', channel_code VARCHAR(64) NULL COMMENT '渠道编码', channel_name VARCHAR(128) NULL COMMENT '渠道名称快照', tax_mode VARCHAR(24) NULL COMMENT '买单或退税', container_mode VARCHAR(24) NULL COMMENT '整柜或散货', customs_inspection TINYINT(1) NULL COMMENT '是否商检', destination_type VARCHAR(24) NULL COMMENT 'FBA/OVERSEAS/PRIVATE', amazon_warehouse_code VARCHAR(32) NULL COMMENT '亚马逊仓库编码', shipment_id VARCHAR(64) NULL COMMENT 'Amazon Shipment ID', reference_id VARCHAR(64) NULL COMMENT 'Amazon Reference ID', express_company VARCHAR(64) NULL COMMENT '履约快递公司名称快照', express_tracking_no VARCHAR(128) NULL COMMENT '履约快递单号', submitted_at DATETIME(3) NULL COMMENT '提交时间', completed_at DATETIME(3) NULL COMMENT '完成时间', created_by BIGINT UNSIGNED NOT NULL COMMENT '创建人ID', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', updated_by BIGINT UNSIGNED NOT NULL COMMENT '最后修改人ID', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', deleted TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除标记', version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', PRIMARY KEY (id), UNIQUE KEY uk_order_tenant_no (tenant_id, order_no), KEY idx_order_tenant_status_time (tenant_id, status, created_at), KEY idx_order_tenant_customer (tenant_id, customer_id), KEY idx_order_tenant_warehouse (tenant_id, destination_warehouse_id) ) ENGINE=InnoDB COMMENT='头程订单主表:保存商户委托、目的仓、运输方式和订单当前状态'; CREATE TABLE IF NOT EXISTS ord_order_party ( id BIGINT UNSIGNED NOT NULL COMMENT '参与方快照ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', order_id BIGINT UNSIGNED NOT NULL COMMENT '所属订单ID', party_type VARCHAR(16) NOT NULL COMMENT '参与方类型:SHIPPER或CONSIGNEE', company_name VARCHAR(128) NOT NULL COMMENT '公司名称快照', contact_name VARCHAR(64) NOT NULL COMMENT '联系人快照', phone VARCHAR(32) NOT NULL COMMENT '联系电话快照', email VARCHAR(128) NULL COMMENT '联系邮箱快照', country_code CHAR(2) NOT NULL COMMENT '国家二字码', province VARCHAR(64) NULL COMMENT '省/州', city VARCHAR(64) NOT NULL COMMENT '城市', district VARCHAR(64) NULL COMMENT '区县', address_line VARCHAR(255) NOT NULL COMMENT '详细地址', postal_code VARCHAR(20) NULL COMMENT '邮政编码', created_by BIGINT UNSIGNED NOT NULL COMMENT '创建人ID', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', updated_by BIGINT UNSIGNED NOT NULL COMMENT '最后修改人ID', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', deleted TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除标记', version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', PRIMARY KEY (id), UNIQUE KEY uk_party_order_type (tenant_id, order_id, party_type), CONSTRAINT fk_party_order FOREIGN KEY (order_id) REFERENCES ord_order (id) ) ENGINE=InnoDB COMMENT='订单收发货方快照表:固化下单时发货人和收货人信息,避免主数据变化影响历史订单'; CREATE TABLE IF NOT EXISTS ord_order_cargo ( id BIGINT UNSIGNED NOT NULL COMMENT '货物明细ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', order_id BIGINT UNSIGNED NOT NULL COMMENT '所属订单ID', item_no INT NOT NULL COMMENT '订单内明细序号', cargo_name VARCHAR(128) NOT NULL COMMENT '货物名称', hs_code VARCHAR(20) NULL COMMENT '海关商品编码', package_type VARCHAR(32) NOT NULL COMMENT '包装类型', package_count INT UNSIGNED NOT NULL COMMENT '包装件数', gross_weight_kg DECIMAL(18,3) NOT NULL COMMENT '毛重(千克)', volume_cbm DECIMAL(18,4) NOT NULL COMMENT '体积(立方米)', length_cm DECIMAL(12,2) NULL COMMENT '单件长度(厘米)', width_cm DECIMAL(12,2) NULL COMMENT '单件宽度(厘米)', height_cm DECIMAL(12,2) NULL COMMENT '单件高度(厘米)', declared_value DECIMAL(18,2) NULL COMMENT '申报价值', currency CHAR(3) NULL COMMENT '币种三字码', dangerous_goods TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否危险品', cargo_remark VARCHAR(500) NULL COMMENT '货物备注', sku_no VARCHAR(64) NULL COMMENT 'SKU', upc_no VARCHAR(64) NULL COMMENT 'UPC', cargo_name_en VARCHAR(128) NULL COMMENT '英文品名', customs_hs_code VARCHAR(20) NULL COMMENT '目的国清关HS CODE', units_per_package INT UNSIGNED NULL COMMENT '每箱件数', total_quantity INT UNSIGNED NULL COMMENT '总件数', net_weight_kg DECIMAL(18,3) NULL COMMENT '净重kg', unit_declared_value DECIMAL(18,2) NULL COMMENT '单件申报价值', material VARCHAR(128) NULL COMMENT '材质', product_usage VARCHAR(128) NULL COMMENT '用途', model VARCHAR(64) NULL COMMENT '型号', brand VARCHAR(64) NULL COMMENT '品牌', created_by BIGINT UNSIGNED NOT NULL COMMENT '创建人ID', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', updated_by BIGINT UNSIGNED NOT NULL COMMENT '最后修改人ID', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', deleted TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除标记', version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', PRIMARY KEY (id), UNIQUE KEY uk_cargo_item (tenant_id, order_id, item_no), KEY idx_cargo_order (tenant_id, order_id), CONSTRAINT fk_cargo_order FOREIGN KEY (order_id) REFERENCES ord_order (id) ) ENGINE=InnoDB COMMENT='订单货物明细表:记录件数、重量、体积、申报价值和危险品属性'; CREATE TABLE IF NOT EXISTS ord_order_internal_note ( id BIGINT UNSIGNED NOT NULL COMMENT '内部备注ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', order_id BIGINT UNSIGNED NOT NULL COMMENT '所属订单ID', content VARCHAR(2000) NOT NULL COMMENT '仅内部人员可见的备注内容', created_by BIGINT UNSIGNED NOT NULL COMMENT '创建人ID', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', updated_by BIGINT UNSIGNED NOT NULL COMMENT '最后修改人ID', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', deleted TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除标记', version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', PRIMARY KEY (id), KEY idx_note_order_time (tenant_id, order_id, created_at), CONSTRAINT fk_note_order FOREIGN KEY (order_id) REFERENCES ord_order (id) ) ENGINE=InnoDB COMMENT='订单内部备注表:保存平台运营或履约人员的内部协作记录,不向商户客户展示'; CREATE TABLE IF NOT EXISTS ord_order_status_history ( id BIGINT UNSIGNED NOT NULL COMMENT '状态历史ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', order_id BIGINT UNSIGNED NOT NULL COMMENT '所属订单ID', from_status VARCHAR(24) NULL COMMENT '变更前状态,首次创建可为空', to_status VARCHAR(24) NOT NULL COMMENT '变更后状态', action VARCHAR(24) NOT NULL COMMENT '触发状态变化的业务动作', reason VARCHAR(500) NULL COMMENT '变更原因', operator_id BIGINT UNSIGNED NOT NULL COMMENT '操作人ID', operator_name VARCHAR(64) NULL COMMENT '操作人名称快照', occurred_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '状态变化时间', PRIMARY KEY (id), KEY idx_history_order_time (tenant_id, order_id, occurred_at), CONSTRAINT fk_history_order FOREIGN KEY (order_id) REFERENCES ord_order (id) ) ENGINE=InnoDB COMMENT='订单状态不可变历史表:按时间记录每次状态迁移、动作、原因和操作人'; CREATE TABLE IF NOT EXISTS ord_outbox_event ( id BIGINT UNSIGNED NOT NULL COMMENT '领域事件全局ID,同时作为消费幂等键', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '事件所属租户ID', aggregate_type VARCHAR(32) NOT NULL COMMENT '聚合类型,例如 ORDER', aggregate_id BIGINT UNSIGNED NOT NULL COMMENT '发生变更的聚合根ID,例如订单ID', event_type VARCHAR(64) NOT NULL COMMENT '领域事件类型,例如 ORDER_SUBMITTED', payload_json JSON NOT NULL COMMENT '供下游消费的事件负载快照', publish_status VARCHAR(16) NOT NULL DEFAULT 'PENDING' COMMENT '发布状态:PENDING、PUBLISHED或FAILED', retry_count INT NOT NULL DEFAULT 0 COMMENT '投递失败后的累计重试次数', next_retry_at DATETIME(3) NULL COMMENT '允许再次投递的最早时间', published_at DATETIME(3) NULL COMMENT '成功发布到消息中间件的时间', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '事件在本地事务中的创建时间', PRIMARY KEY (id), KEY idx_outbox_publish (publish_status, next_retry_at, created_at) ) ENGINE=InnoDB COMMENT='订单事务Outbox表:与订单业务变更在同一本地事务写入,供后台发布器可靠投递RocketMQ,保证数据库状态与领域事件最终一致;不是普通操作日志'; 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,创建草稿时为0', idempotency_key VARCHAR(128) NOT NULL COMMENT '客户端幂等键', request_hash CHAR(64) NOT NULL COMMENT '请求内容SHA-256摘要', status VARCHAR(16) NOT NULL COMMENT '处理状态:PROCESSING或COMPLETED', 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='订单写接口持久化幂等记录:唯一键保证同租户同操作者并发请求只执行一次';