SET NAMES utf8mb4; CREATE DATABASE IF NOT EXISTS baiyue_firstleg DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; USE baiyue_firstleg; CREATE TABLE IF NOT EXISTS fl_inbound_order ( id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID(雪花ID)', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', task_id BIGINT UNSIGNED NULL COMMENT '头程履约任务ID', order_id BIGINT UNSIGNED NOT NULL COMMENT '订单服务订单ID,不建立跨库外键', order_no VARCHAR(32) NOT NULL COMMENT '订单号快照', inbound_code VARCHAR(40) NOT NULL COMMENT '租户内唯一入仓码', process_status VARCHAR(24) NOT NULL DEFAULT 'WAIT_MEASURE' COMMENT '入库流程状态', order_status_snapshot VARCHAR(24) NOT NULL COMMENT '订单状态快照', measure_review_status VARCHAR(24) NOT NULL DEFAULT 'NOT_SUBMITTED' COMMENT '测量数据审核状态', fee_status VARCHAR(24) NOT NULL DEFAULT 'UNPRICED' COMMENT '费用业务状态', fee_review_status VARCHAR(24) NOT NULL DEFAULT 'NOT_SUBMITTED' COMMENT '费用审核状态', notification_status VARCHAR(24) NOT NULL DEFAULT 'NOT_CREATED' COMMENT '客户通知状态', expected_arrival_at DATETIME(3) NULL COMMENT '预计到达时间', customer_id BIGINT UNSIGNED NULL COMMENT '客户逻辑ID', customer_name VARCHAR(128) NOT NULL COMMENT '客户名称快照', company_id BIGINT UNSIGNED NULL COMMENT '运营公司逻辑ID', company_name VARCHAR(128) NULL COMMENT '运营公司名称快照', warehouse_id BIGINT UNSIGNED NOT NULL COMMENT '实际作业仓库ID', warehouse_name VARCHAR(128) NOT NULL COMMENT '实际作业仓库名称快照', delivery_warehouse_id BIGINT UNSIGNED NULL COMMENT '交货仓逻辑ID', delivery_warehouse_name VARCHAR(128) NULL COMMENT '交货仓名称快照', business_type VARCHAR(32) NOT NULL COMMENT '业务类型', channel_code VARCHAR(64) NULL COMMENT '渠道编码', channel_name VARCHAR(128) NULL COMMENT '渠道名称快照', carrier_id BIGINT UNSIGNED NULL COMMENT '计费船司逻辑ID', carrier_name VARCHAR(128) NULL COMMENT '计费船司名称快照', tax_mode VARCHAR(24) NULL COMMENT '买单或退税模式', pricing_tax_mode VARCHAR(16) NULL COMMENT '报价包税维度:TAX_INCLUDED/TAX_EXCLUDED', container_mode VARCHAR(24) NULL COMMENT '整柜或散货模式', customs_inspection TINYINT(1) NULL COMMENT '是否商检', destination_type VARCHAR(24) NULL COMMENT '目的仓类型', destination_warehouse_id BIGINT UNSIGNED NULL COMMENT '目的仓逻辑ID', destination_code VARCHAR(32) NULL COMMENT '目的仓编码,例如FBA仓编码', destination_name VARCHAR(128) NULL COMMENT '目的仓名称快照', hold_flag TINYINT(1) NOT NULL DEFAULT 0 COMMENT '当前是否扣货', current_hold_reason VARCHAR(500) NULL COMMENT '当前扣货理由快照', total_package_count INT UNSIGNED NULL COMMENT '确认后的总箱数', actual_gross_weight_kg DECIMAL(18,3) NULL COMMENT '确认后的实际总毛重kg', chargeable_weight_kg DECIMAL(18,3) NULL COMMENT '当前费用快照的计费重量kg', actual_volume_cbm DECIMAL(18,4) NULL COMMENT '确认后的实际总体积m3', chargeable_volume_cbm DECIMAL(18,4) NULL COMMENT '当前费用快照的计费体积m3', pallet_count INT UNSIGNED NULL COMMENT '已分配总托盘数快照', volume_weight_kg DECIMAL(18,3) NULL COMMENT '总材积重kg', actual_net_weight_kg DECIMAL(18,3) NULL COMMENT '总净重kg', measure_completed_at DATETIME(3) NULL COMMENT '测量完成时间', inbounded_at DATETIME(3) NULL COMMENT '入库完成时间', express_company_code VARCHAR(64) NULL COMMENT '快递公司编码快照', express_company_name VARCHAR(128) NULL COMMENT '快递公司名称快照', express_tracking_no VARCHAR(128) NULL COMMENT '快递单号快照', public_remark VARCHAR(1000) NULL COMMENT '客户可见备注', created_by BIGINT UNSIGNED NOT NULL COMMENT '创建人ID', created_by_name VARCHAR(64) NULL COMMENT '创建人名称快照', 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_inbound_tenant_code (tenant_id, inbound_code), UNIQUE KEY uk_inbound_tenant_order (tenant_id, order_id), KEY idx_inbound_process_time (tenant_id, process_status, created_at, id), KEY idx_inbound_measure_time (tenant_id, measure_review_status, created_at, id), KEY idx_inbound_fee_time (tenant_id, fee_review_status, created_at, id), KEY idx_inbound_warehouse_status (tenant_id, warehouse_id, process_status, created_at), KEY idx_inbound_customer_time (tenant_id, customer_id, created_at), KEY idx_inbound_company_time (tenant_id, company_id, created_at), KEY idx_inbound_arrival (tenant_id, expected_arrival_at), KEY idx_inbound_destination (tenant_id, destination_code, created_at), KEY idx_inbound_channel (tenant_id, channel_code, created_at), CONSTRAINT fk_inbound_task FOREIGN KEY (task_id) REFERENCES fl_fulfillment_task (id) ) ENGINE=InnoDB COMMENT='二期头程入库单聚合根和列表查询快照'; CREATE TABLE IF NOT EXISTS fl_inbound_pickup_snapshot ( id BIGINT UNSIGNED NOT NULL COMMENT '提货信息快照ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', pickup_method VARCHAR(24) NULL COMMENT '提货方式', pickup_at DATETIME(3) NULL COMMENT '提货时间', contact_name VARCHAR(64) NULL COMMENT '提货联系人', contact_phone VARCHAR(32) NULL COMMENT '提货联系人电话', contact_email VARCHAR(128) NULL COMMENT '提货联系人邮箱', country_code CHAR(2) NULL COMMENT '国家二字码', province VARCHAR(64) NULL COMMENT '省或州', city VARCHAR(64) NULL COMMENT '城市', district VARCHAR(64) NULL COMMENT '区县', address_line VARCHAR(512) NULL COMMENT '提货详细地址', postal_code VARCHAR(20) NULL COMMENT '提货邮编', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', PRIMARY KEY (id), UNIQUE KEY uk_pickup_inbound (tenant_id, inbound_id), CONSTRAINT fk_pickup_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id) ) ENGINE=InnoDB COMMENT='入库单提货信息不可变快照'; CREATE TABLE IF NOT EXISTS fl_inbound_destination_snapshot ( id BIGINT UNSIGNED NOT NULL COMMENT '目的仓地址快照ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', destination_type VARCHAR(24) NULL COMMENT '目的仓类型', destination_code VARCHAR(32) NULL COMMENT '目的仓编码', destination_name VARCHAR(128) NULL COMMENT '目的仓名称', country_code CHAR(2) NULL COMMENT '国家二字码', state_province VARCHAR(100) NULL COMMENT '省或州', city VARCHAR(100) NULL COMMENT '城市', address_line VARCHAR(512) NULL COMMENT '详细地址', postal_code VARCHAR(20) NULL COMMENT '邮编', contact_name VARCHAR(64) NULL COMMENT '联系人', contact_phone VARCHAR(32) NULL COMMENT '联系人电话', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', PRIMARY KEY (id), UNIQUE KEY uk_destination_inbound (tenant_id, inbound_id), CONSTRAINT fk_destination_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id) ) ENGINE=InnoDB COMMENT='入库单目的仓地址和联系人快照'; CREATE TABLE IF NOT EXISTS fl_inbound_transport_snapshot ( id BIGINT UNSIGNED NOT NULL COMMENT '运输信息快照ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', loading_status VARCHAR(24) NULL COMMENT '配载状态快照', container_no VARCHAR(64) NULL COMMENT '集装箱号', cabinet_no VARCHAR(64) NULL COMMENT '柜号或内部柜单号', vessel_name VARCHAR(128) NULL COMMENT '船名', voyage_no VARCHAR(64) NULL COMMENT '航次', sailing_at DATETIME(3) NULL COMMENT '开船时间', port_arrival_at DATETIME(3) NULL COMMENT '到港时间', source_updated_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_transport_inbound (tenant_id, inbound_id), KEY idx_transport_container (tenant_id, container_no), KEY idx_transport_cabinet (tenant_id, cabinet_no), KEY idx_transport_loading (tenant_id, loading_status, sailing_at), CONSTRAINT fk_transport_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id) ) ENGINE=InnoDB COMMENT='入库单关联运输信息只读快照'; CREATE TABLE IF NOT EXISTS fl_inbound_carton_label ( id BIGINT UNSIGNED NOT NULL COMMENT '实际箱唛头映射ID(雪花ID)', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '当前客户隔离ID', inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', order_id BIGINT UNSIGNED NOT NULL COMMENT '订单服务订单ID快照', inbound_detail_id BIGINT UNSIGNED NOT NULL COMMENT '订单货物明细ID,不建立跨库外键', cargo_item_no INT UNSIGNED NOT NULL COMMENT '订单货物明细序号快照', cargo_name VARCHAR(255) NULL COMMENT '货物名称快照', detail_package_count INT UNSIGNED NOT NULL COMMENT '该订单货物明细箱数快照', inbound_code VARCHAR(40) NOT NULL COMMENT '入仓码快照', box_code VARCHAR(80) NOT NULL COMMENT '固定二维码内容:入仓码#总箱数-箱下标', total_carton_count INT UNSIGNED NOT NULL COMMENT '首次分配时整单总箱数', carton_index INT UNSIGNED NOT NULL COMMENT '整单从1开始的稳定箱下标', box_specification VARCHAR(255) NOT NULL COMMENT '订单箱规或货物明细描述快照', length_cm DECIMAL(12,3) NULL COMMENT '下单箱规长度cm快照', width_cm DECIMAL(12,3) NULL COMMENT '下单箱规宽度cm快照', height_cm DECIMAL(12,3) NULL COMMENT '下单箱规高度cm快照', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '首次分配时间', PRIMARY KEY (id), UNIQUE KEY uk_carton_label_box_code (tenant_id, box_code), UNIQUE KEY uk_carton_label_index (tenant_id, inbound_id, carton_index), KEY idx_carton_label_detail (tenant_id, inbound_id, inbound_detail_id), CONSTRAINT fk_carton_label_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id) ) ENGINE=InnoDB COMMENT='首次打印前冻结的实际箱号与订单货物明细映射'; CREATE TABLE IF NOT EXISTS fl_inbound_measurement ( id BIGINT UNSIGNED NOT NULL COMMENT '测量批次ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', source_type VARCHAR(24) NOT NULL COMMENT '数据来源:THIRD_PARTY或MANUAL', source_code VARCHAR(64) NULL COMMENT '第三方应用或来源编码', external_event_no VARCHAR(128) NULL COMMENT '第三方事件号', external_request_hash CHAR(64) NULL COMMENT '第三方data原文和图片内容联合请求哈希', device_code VARCHAR(64) NULL COMMENT '测量设备编码', warehouse_code VARCHAR(50) NULL COMMENT '第三方回传仓库编码', measured_at DATETIME(3) NULL COMMENT '设备测量时间', status VARCHAR(24) NOT NULL DEFAULT 'RECEIVED' COMMENT '测量批次状态', raw_payload_json JSON NULL COMMENT '第三方原始报文', original_document_no VARCHAR(64) NULL COMMENT '原单据号码快照', original_gross_weight_kg DECIMAL(18,3) NULL COMMENT '原单据毛重kg', original_volume_cbm DECIMAL(18,4) NULL COMMENT '原单据体积或材积m3', actual_goods_name VARCHAR(255) NULL COMMENT '实际品名', total_package_count INT UNSIGNED NULL COMMENT '本批次总箱数', total_volume_raw_cbm DECIMAL(18,6) NULL COMMENT '本批次原始总体积m3', total_volume_cbm DECIMAL(18,4) NULL COMMENT '本批次业务总体积m3', volume_weight_kg DECIMAL(18,3) NULL COMMENT '本批次总材积重kg', created_by BIGINT UNSIGNED NULL COMMENT '创建人或系统主体ID', 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 '更新时间', version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', PRIMARY KEY (id), UNIQUE KEY uk_measure_external_event (tenant_id, source_code, external_event_no), KEY idx_measure_inbound_time (tenant_id, inbound_id, created_at), CONSTRAINT fk_measure_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id) ) ENGINE=InnoDB COMMENT='入库长宽高测量批次和第三方原始数据'; CREATE TABLE IF NOT EXISTS fl_inbound_measurement_item ( id BIGINT UNSIGNED NOT NULL COMMENT '测量明细ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', measurement_id BIGINT UNSIGNED NOT NULL COMMENT '测量批次ID', inbound_detail_id BIGINT UNSIGNED NULL COMMENT '绑定的订单货物明细ID,平台手工明细可为空', external_detail_no VARCHAR(128) NULL COMMENT '第三方测量明细唯一号,平台手工明细可为空', box_code VARCHAR(128) NULL COMMENT '柏悦唛头箱号;设备单箱测量时同一客户内唯一', item_no VARCHAR(32) NOT NULL COMMENT '批次内明细号', box_specification VARCHAR(64) NOT NULL COMMENT '箱规标识', package_count INT UNSIGNED NOT NULL COMMENT '相同箱规箱数', length_cm DECIMAL(12,3) NOT NULL COMMENT '原始长度cm', width_cm DECIMAL(12,3) NOT NULL COMMENT '原始宽度cm', height_cm DECIMAL(12,3) NOT NULL COMMENT '原始高度cm', girth_cm DECIMAL(12,3) NOT NULL COMMENT '周长cm,规则为长+2*(宽+高)', unit_weight_kg DECIMAL(18,3) NULL COMMENT '单箱重量kg,第三方仅回传尺寸时可为空', unit_volume_cbm DECIMAL(18,4) NOT NULL COMMENT '单箱业务体积m3', volume_raw_cbm DECIMAL(18,6) NOT NULL COMMENT '原始体积m3', volume_cbm DECIMAL(18,4) NOT NULL COMMENT '业务体积m3', total_weight_kg DECIMAL(18,3) NULL COMMENT '本箱规总重量kg', total_volume_cbm DECIMAL(18,4) NOT NULL COMMENT '本箱规总体积m3', volume_weight_kg DECIMAL(18,3) NOT NULL COMMENT '本箱规材积重kg', calculation_rule_version VARCHAR(64) NOT NULL COMMENT '体积计算和舍入规则版本', source_image_file_id BIGINT UNSIGNED NULL COMMENT '测量设备图片文件ID', machine_no VARCHAR(64) NULL COMMENT '本次测量设备编号', device_measured_at DATETIME(3) NULL COMMENT '本次设备测量时间', over_limit_warning VARCHAR(500) NULL COMMENT '超线提醒快照', outer_length_cm DECIMAL(12,3) NULL COMMENT '外箱规长度cm', outer_width_cm DECIMAL(12,3) NULL COMMENT '外箱规宽度cm', outer_height_cm DECIMAL(12,3) NULL COMMENT '外箱规高度cm', remark VARCHAR(500) 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_measure_item_no (tenant_id, measurement_id, item_no), UNIQUE KEY uk_measure_external_detail (tenant_id, inbound_detail_id, external_detail_no), UNIQUE KEY uk_measure_box_code (tenant_id, box_code), CONSTRAINT fk_measure_item_batch FOREIGN KEY (measurement_id) REFERENCES fl_inbound_measurement (id) ) ENGINE=InnoDB COMMENT='入库长宽高和箱数测量明细'; CREATE TABLE IF NOT EXISTS fl_mojia_measurement_receipt ( id BIGINT UNSIGNED NOT NULL COMMENT '墨家联调收件记录ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户隔离ID', subject_id BIGINT UNSIGNED NOT NULL COMMENT '设备应用操作主体ID', box_code VARCHAR(128) NOT NULL COMMENT '设备扫描的原始箱码', length_cm DECIMAL(12,3) NOT NULL COMMENT '设备实测长度cm', width_cm DECIMAL(12,3) NOT NULL COMMENT '设备实测宽度cm', height_cm DECIMAL(12,3) NOT NULL COMMENT '设备实测高度cm', weight_kg DECIMAL(18,3) NULL COMMENT '设备实测重量kg', machine_no VARCHAR(64) NOT NULL COMMENT '设备编号', measured_at DATETIME(3) NOT NULL COMMENT '设备测量时间或服务接收时间', image_file_id BIGINT UNSIGNED NOT NULL COMMENT 'File服务中的墨家联调图片ID', status VARCHAR(24) NOT NULL DEFAULT 'UNMATCHED' COMMENT '收件状态', match_failure_code VARCHAR(16) NOT NULL COMMENT '正式业务匹配失败码', match_failure_reason VARCHAR(500) NOT NULL COMMENT '脱敏后的匹配失败原因', request_id VARCHAR(128) NULL COMMENT '请求链路ID', trace_id VARCHAR(128) NULL COMMENT '调用链ID', 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), KEY idx_mojia_receipt_status_time (tenant_id, status, created_at), KEY idx_mojia_receipt_box_time (tenant_id, box_code, created_at) ) ENGINE=InnoDB COMMENT='墨家模拟或未匹配入库单的原始测量收件箱'; CREATE TABLE IF NOT EXISTS fl_inbound_weight_result ( id BIGINT UNSIGNED NOT NULL COMMENT 'OCR重量结果ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', file_id BIGINT UNSIGNED NOT NULL COMMENT '称重图片文件ID', ocr_provider VARCHAR(64) NULL COMMENT 'OCR服务商编码', ocr_raw_text VARCHAR(1000) NULL COMMENT 'OCR原始文本', ocr_weight_value DECIMAL(18,3) NULL COMMENT 'OCR识别原始重量值', ocr_weight_unit VARCHAR(8) NULL COMMENT 'OCR识别原始单位', confidence DECIMAL(6,5) NULL COMMENT '识别置信度', adjusted_weight_value DECIMAL(18,3) NULL COMMENT '人工修正后的原单位重量', adjusted_weight_unit VARCHAR(8) NULL COMMENT '人工修正后的单位', final_weight_kg DECIMAL(18,3) NULL COMMENT '确认并统一换算后的重量kg', recognition_status VARCHAR(24) NOT NULL DEFAULT 'PENDING' COMMENT '识别和确认状态', adjustment_reason VARCHAR(500) NULL COMMENT '人工修正原因', adjusted_by BIGINT UNSIGNED NULL COMMENT '修正人ID', adjusted_at DATETIME(3) NULL COMMENT '修正时间', confirmed_by BIGINT UNSIGNED NULL COMMENT '确认人ID', confirmed_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_weight_inbound_file (tenant_id, inbound_id, file_id), KEY idx_weight_inbound_status (tenant_id, inbound_id, recognition_status), CONSTRAINT fk_weight_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id) ) ENGINE=InnoDB COMMENT='称重图片OCR原值、人工修正值和确认重量'; CREATE TABLE IF NOT EXISTS fl_inbound_weight_revision ( id BIGINT UNSIGNED NOT NULL COMMENT 'OCR重量修订记录ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', weight_result_id BIGINT UNSIGNED NOT NULL COMMENT 'OCR重量结果ID', revision_no INT UNSIGNED NOT NULL COMMENT '结果版本号,与乐观锁版本一致', action VARCHAR(24) NOT NULL COMMENT '动作:CORRECT或CONFIRM', before_weight_value DECIMAL(18,3) NULL COMMENT '变更前原单位重量', before_weight_unit VARCHAR(8) NULL COMMENT '变更前单位', after_weight_value DECIMAL(18,3) NULL COMMENT '变更后原单位重量', after_weight_unit VARCHAR(8) NULL COMMENT '变更后单位', final_weight_kg DECIMAL(18,3) NULL COMMENT '确认时统一换算后的重量kg', reason VARCHAR(500) NULL COMMENT '人工修正原因', operator_id BIGINT UNSIGNED NOT NULL COMMENT '操作人ID', operator_name VARCHAR(64) NULL COMMENT '操作人名称快照', operated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '操作时间', PRIMARY KEY (id), UNIQUE KEY uk_weight_revision_no (tenant_id, weight_result_id, revision_no), KEY idx_weight_revision_time (tenant_id, inbound_id, operated_at), CONSTRAINT fk_weight_revision_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id), CONSTRAINT fk_weight_revision_result FOREIGN KEY (weight_result_id) REFERENCES fl_inbound_weight_result (id) ) ENGINE=InnoDB COMMENT='OCR重量人工修正和确认的不可变版本历史'; CREATE TABLE IF NOT EXISTS fl_measure_review_record ( id BIGINT UNSIGNED NOT NULL COMMENT '测量审核记录ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', measurement_id BIGINT UNSIGNED NULL COMMENT '被审核的测量批次ID', review_result VARCHAR(24) NOT NULL COMMENT '审核结果', review_reason VARCHAR(1000) NULL COMMENT '审核或驳回原因', exception_release TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否异常放行', release_reason VARCHAR(1000) NULL COMMENT '异常放行原因', allow_rejected_config TINYINT(1) NOT NULL DEFAULT 0 COMMENT '操作时Nacos异常放行开关值', reviewer_id BIGINT UNSIGNED NOT NULL COMMENT '审核人ID', reviewer_name VARCHAR(64) NULL COMMENT '审核人名称快照', reviewed_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '审核时间', PRIMARY KEY (id), KEY idx_review_inbound_time (tenant_id, inbound_id, reviewed_at), KEY idx_review_exception_release (tenant_id, inbound_id, exception_release, reviewed_at), CONSTRAINT fk_review_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id), CONSTRAINT fk_review_measurement FOREIGN KEY (measurement_id) REFERENCES fl_inbound_measurement (id) ) ENGINE=InnoDB COMMENT='测量审核、驳回和异常放行不可变记录'; CREATE TABLE IF NOT EXISTS fl_customer_charge_rule ( id BIGINT UNSIGNED NOT NULL COMMENT '客户计费规则ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', rule_code VARCHAR(50) NOT NULL COMMENT '租户内规则编码', rule_version INT UNSIGNED NOT NULL COMMENT '规则版本号', customer_id BIGINT UNSIGNED NOT NULL COMMENT '客户逻辑ID', customer_name VARCHAR(128) NOT NULL COMMENT '客户名称快照', business_type VARCHAR(32) NOT NULL COMMENT '业务类型', charge_mode VARCHAR(16) NOT NULL COMMENT '计费口径:KG或CBM', tax_mode VARCHAR(24) NULL COMMENT '包税或不包税类型', conversion_factor DECIMAL(18,6) NOT NULL COMMENT '重量体积换算系数', rounding_scale TINYINT UNSIGNED NOT NULL DEFAULT 3 COMMENT '结果保留小数位数', rounding_mode VARCHAR(24) NOT NULL DEFAULT 'CEILING' COMMENT '舍入方式', currency CHAR(3) NOT NULL COMMENT '默认币种', effective_from DATETIME(3) NOT NULL COMMENT '生效开始时间', effective_to DATETIME(3) NULL COMMENT '生效结束时间', status VARCHAR(16) NOT NULL DEFAULT 'ACTIVE' COMMENT '规则状态', remark VARCHAR(500) 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_charge_rule_version (tenant_id, rule_code, rule_version), KEY idx_charge_rule_match (tenant_id, customer_id, business_type, status, effective_from, effective_to) ) ENGINE=InnoDB COMMENT='客户头程计费规则版本'; CREATE TABLE IF NOT EXISTS fl_carrier_fba_rate ( id BIGINT UNSIGNED NOT NULL COMMENT '船司FBA价格ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '平台价格作用域ID,船司价格固定为0', price_book_version_id BIGINT UNSIGNED NULL COMMENT '整表价格版本ID;历史兼容价格可为空', rate_code VARCHAR(50) NOT NULL COMMENT '平台公共价格编码', rate_version INT UNSIGNED NOT NULL COMMENT '价格版本号', origin_warehouse_id BIGINT UNSIGNED NULL COMMENT '确认前可为空;确认后绑定平台公共起运仓逻辑ID', origin_warehouse_code VARCHAR(64) NULL COMMENT '起运仓稳定编码', origin_warehouse_name VARCHAR(128) NOT NULL COMMENT '起运仓名称快照', business_type VARCHAR(32) NOT NULL COMMENT '业务或计费类型', channel_code VARCHAR(64) NULL COMMENT '渠道编码', price_model VARCHAR(32) NOT NULL DEFAULT 'FBA_WAREHOUSE_RATE' COMMENT '价格模型', carrier_id BIGINT UNSIGNED NULL COMMENT '船司逻辑ID', carrier_name VARCHAR(128) NULL COMMENT '历史承运商名称;渠道价格可为空', destination_type VARCHAR(16) NULL COMMENT '目的地类型:FBA或OVERSEAS;REGION_WEIGHT_TIER区域阶梯行为空', destination_code VARCHAR(32) NULL COMMENT 'FBA目的仓编码;区域阶梯模型为空', destination_warehouse_id BIGINT UNSIGNED NULL COMMENT '平台海外仓稳定ID;不存环境专属ID', destination_name VARCHAR(128) NULL COMMENT '目的仓名称快照', region_code VARCHAR(16) NULL COMMENT '区域阶梯模型区域编码', pricing_tax_mode VARCHAR(16) NULL COMMENT '报价包税维度;独立于订单tax_mode', weight_from_kg DECIMAL(18,6) NULL COMMENT '区域阶梯起始计费重量KG', charge_unit VARCHAR(16) NOT NULL COMMENT '计费单位:KG或CBM', unit_price DECIMAL(18,6) NOT NULL COMMENT '基础单价', currency CHAR(3) NOT NULL COMMENT '币种', additional_fee DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '固定附加费', source_sheet_name VARCHAR(128) NULL COMMENT '原始Excel Sheet', source_row_number INT UNSIGNED NULL COMMENT '原始Excel行号', source_destination_text VARCHAR(1000) NULL COMMENT '原始组合仓库或区域文本', effective_from DATETIME(3) NOT NULL COMMENT '生效开始时间', effective_to DATETIME(3) NULL COMMENT '生效结束时间', status VARCHAR(24) NOT NULL DEFAULT 'ACTIVE' COMMENT '价格状态:PENDING_CONFIRMATION、ACTIVE或SUPERSEDED', remark VARCHAR(500) 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_fba_rate_version (tenant_id, rate_code, rate_version), KEY idx_fba_rate_match (tenant_id, origin_warehouse_id, business_type, channel_code, carrier_id, destination_type, destination_code, destination_warehouse_id, charge_unit, status, effective_from, effective_to), KEY idx_fba_rate_book (price_book_version_id, channel_code, origin_warehouse_id, price_model, status), KEY idx_fba_rate_destination (price_book_version_id, channel_code, origin_warehouse_id, destination_type, destination_warehouse_id, destination_code), KEY idx_fba_rate_region (price_book_version_id, channel_code, origin_warehouse_id, region_code, weight_from_kg) ) ENGINE=InnoDB COMMENT='船司FBA目的仓价格版本'; CREATE TABLE IF NOT EXISTS fl_price_channel_catalog ( id BIGINT UNSIGNED NOT NULL COMMENT '渠道目录ID', channel_code VARCHAR(64) NOT NULL COMMENT '稳定渠道编码', display_name VARCHAR(128) NOT NULL COMMENT '平台渠道名称', price_model VARCHAR(32) NOT NULL COMMENT '默认价格模型', source_sheet_name VARCHAR(128) NOT NULL COMMENT '来源Sheet名称;海派为同一Sheet', aliases_json JSON NOT NULL COMMENT '上传名称别名数组', status VARCHAR(16) NOT NULL DEFAULT 'ACTIVE' COMMENT '目录状态', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_price_channel_code (channel_code), KEY idx_price_channel_status (status, price_model) ) ENGINE=InnoDB COMMENT='平台公共船期价格固定渠道目录'; CREATE TABLE IF NOT EXISTS fl_price_origin_alias ( id BIGINT UNSIGNED NOT NULL COMMENT '起运仓别名ID', warehouse_code VARCHAR(64) NOT NULL COMMENT '平台仓库稳定编码,不存环境专属ID', alias_name VARCHAR(128) NOT NULL COMMENT 'Excel起运仓名称别名', status VARCHAR(16) NOT NULL DEFAULT 'ACTIVE', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_price_origin_alias (warehouse_code, alias_name), KEY idx_price_origin_alias_name (alias_name, status) ) ENGINE=InnoDB COMMENT='价格表起运仓名称别名映射'; CREATE TABLE IF NOT EXISTS fl_price_warehouse_mapping ( id BIGINT UNSIGNED NOT NULL COMMENT '价格仓映射ID', source_type VARCHAR(24) NOT NULL COMMENT '来源维度:ORIGIN_CODE或OVERSEAS_NAME', source_value VARCHAR(128) NOT NULL COMMENT '解析后的来源仓编码或海外仓名称', warehouse_id BIGINT UNSIGNED NOT NULL COMMENT '固定平台公共仓库ID', warehouse_code VARCHAR(64) NOT NULL COMMENT '平台仓库稳定编码快照', warehouse_type VARCHAR(16) NOT NULL COMMENT 'DOMESTIC或OVERSEAS', status VARCHAR(16) NOT NULL DEFAULT 'ACTIVE', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_price_warehouse_mapping_source (source_type, source_value), KEY idx_price_warehouse_mapping_target (warehouse_id, status) ) ENGINE=InnoDB COMMENT='价格表来源仓与固定平台公共仓映射'; CREATE TABLE IF NOT EXISTS fl_price_book_version ( id BIGINT UNSIGNED NOT NULL COMMENT '整表价格版本ID', tenant_id BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '平台公共价格作用域固定为0', version_no INT UNSIGNED NOT NULL COMMENT '整表版本号', original_file_name VARCHAR(255) NOT NULL COMMENT '原始Excel文件名', source_file_id BIGINT UNSIGNED NULL COMMENT 'File服务原始文件ID', source_sha256 CHAR(64) NULL COMMENT '原始文件SHA-256', status VARCHAR(24) NOT NULL DEFAULT 'PENDING_CONFIRMATION' COMMENT '待确认上传记录;ACTIVE/SUPERSEDED/FAILED', blocking_error_count INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '阻断错误数', warning_count INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '警告数', parse_issues_json JSON NULL COMMENT '上传解析问题及待确认重新校验结果', channel_count INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '解析渠道数', rate_count INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '解析价格数', created_by BIGINT UNSIGNED NOT NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), published_by BIGINT UNSIGNED NULL, published_at DATETIME(3) NULL COMMENT '确认并生效时间', superseded_at DATETIME(3) NULL COMMENT '被下一版本替换时间', updated_by BIGINT UNSIGNED NOT NULL, updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), deleted TINYINT(1) NOT NULL DEFAULT 0, version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', PRIMARY KEY (id), UNIQUE KEY uk_price_book_version (tenant_id, version_no), KEY idx_price_book_status (tenant_id, status, published_at), KEY idx_price_book_source_hash (tenant_id, source_sha256) ) ENGINE=InnoDB COMMENT='平台公共船期价格整表版本'; CREATE TABLE IF NOT EXISTS fl_price_book_channel ( id BIGINT UNSIGNED NOT NULL COMMENT '版本渠道快照ID', price_book_version_id BIGINT UNSIGNED NOT NULL COMMENT '整表价格版本ID', channel_code VARCHAR(64) NOT NULL COMMENT '固定渠道编码', channel_name VARCHAR(128) NOT NULL COMMENT '渠道名称快照', price_model VARCHAR(32) NOT NULL COMMENT '价格模型快照', source_sheet_name VARCHAR(128) NOT NULL COMMENT '原始Excel Sheet', estimated_departure_date DATE NULL COMMENT '标准预计开船日期', estimated_departure_text VARCHAR(128) NULL COMMENT '原始预计开船日期文本', latest_warehouse_entry VARCHAR(128) NULL COMMENT '最晚进仓时间', vessel_name VARCHAR(128) NULL COMMENT '船名', voyage_no VARCHAR(64) NULL COMMENT '航次', reference_transit VARCHAR(128) NULL COMMENT '参考时效', surcharge_description VARCHAR(2000) NULL COMMENT '附加费说明,仅展示', remark VARCHAR(2000) NULL COMMENT '渠道备注', created_by BIGINT UNSIGNED NOT NULL COMMENT '创建人ID', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_by BIGINT UNSIGNED NOT NULL COMMENT '最后修改人ID', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), deleted TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除标记', version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', PRIMARY KEY (id), UNIQUE KEY uk_price_book_channel (price_book_version_id, channel_code), KEY idx_price_book_channel_code (channel_code, price_book_version_id) ) ENGINE=InnoDB COMMENT='价格版本渠道及船期快照'; INSERT INTO fl_price_channel_catalog (id, channel_code, display_name, price_model, source_sheet_name, aliases_json, status) VALUES (1, 'MATSON_CLX_TRUCK', '美森正班海卡', 'FBA_WAREHOUSE_RATE', '美森正班海卡', JSON_ARRAY('美森正班海卡'), 'ACTIVE'), (2, 'MATSON_MAX_TRUCK', '美森加班海卡', 'FBA_WAREHOUSE_RATE', '美森加班海卡', JSON_ARRAY('美森加班海卡'), 'ACTIVE'), (3, 'EXX_TRUCK', 'EXX海卡', 'FBA_WAREHOUSE_RATE', 'EXX海卡', JSON_ARRAY('EXX海卡'), 'ACTIVE'), (4, 'HEDE_TRUCK', '合德海卡', 'FBA_WAREHOUSE_RATE', '合德海卡', JSON_ARRAY('合德海卡'), 'ACTIVE'), (5, 'EXX_RAIL_NY', '纽约EXX海铁', 'FBA_WAREHOUSE_RATE', '纽约EXX海铁', JSON_ARRAY('纽约EXX海铁'), 'ACTIVE'), (6, 'OA_LA_TRUCK', '洛杉矶普船海卡', 'FBA_WAREHOUSE_RATE', '洛杉矶普船海卡', JSON_ARRAY('洛杉矶普船海卡'), 'ACTIVE'), (7, 'OA_LA_FULL_TRUCK', '洛杉矶普船全卡', 'FBA_WAREHOUSE_RATE', '洛杉矶普船全卡', JSON_ARRAY('洛杉矶普船全卡'), 'ACTIVE'), (8, 'OA_CHICAGO_RAIL', '芝加哥普船海铁', 'FBA_WAREHOUSE_RATE', '芝加哥普船海铁', JSON_ARRAY('芝加哥普船海铁'), 'ACTIVE'), (9, 'OA_HOUSTON_TRUCK', '休斯顿普船海卡', 'FBA_WAREHOUSE_RATE', '休斯顿普船海卡', JSON_ARRAY('休斯顿普船海卡'), 'ACTIVE'), (10, 'OA_NEW_YORK_TRUCK', '纽约普船海卡', 'FBA_WAREHOUSE_RATE', '纽约普船海卡', JSON_ARRAY('纽约普船海卡'), 'ACTIVE'), (11, 'OA_SAVANNAH_TRUCK', '萨凡纳普船海卡', 'FBA_WAREHOUSE_RATE', '萨凡纳普船海卡', JSON_ARRAY('萨凡纳普船海卡'), 'ACTIVE'), (12, 'MATSON_CLX_PARCEL', '美森正班海派', 'REGION_WEIGHT_TIER', '海派', JSON_ARRAY('美森正班海派'), 'ACTIVE'), (13, 'MATSON_MAX_PARCEL', '美森加班海派', 'REGION_WEIGHT_TIER', '海派', JSON_ARRAY('美森加班海派'), 'ACTIVE'), (14, 'HEDE_PARCEL', '合德海派', 'REGION_WEIGHT_TIER', '海派', JSON_ARRAY('合德海派'), 'ACTIVE'), (15, 'OA_PARCEL', '普船海派', 'REGION_WEIGHT_TIER', '海派', JSON_ARRAY('普船海派'), 'ACTIVE') ON DUPLICATE KEY UPDATE display_name = VALUES(display_name), price_model = VALUES(price_model), source_sheet_name = VALUES(source_sheet_name), aliases_json = VALUES(aliases_json), status = VALUES(status); INSERT INTO fl_price_origin_alias (id, warehouse_code, alias_name, status) VALUES (1, 'CN-YIWU-01', '华东仓(义乌)', 'ACTIVE'), (2, 'CN-YIWU-01', '义乌仓', 'ACTIVE'), (3, 'CN-YIWU-01', '义乌', 'ACTIVE'), (4, 'CN-DONGGUAN-01', '华南仓(深圳)', 'ACTIVE'), (5, 'CN-DONGGUAN-01', '东莞仓', 'ACTIVE'), (6, 'CN-DONGGUAN-01', '深圳仓', 'ACTIVE'), (7, 'CN-DONGGUAN-01', '华南仓(深圳/东莞)', 'ACTIVE') ON DUPLICATE KEY UPDATE status = VALUES(status); INSERT INTO fl_price_warehouse_mapping (id, source_type, source_value, warehouse_id, warehouse_code, warehouse_type, status) VALUES (1, 'ORIGIN_CODE', 'CN-YIWU-01', 193000000000200001, 'CN-YIWU-01', 'DOMESTIC', 'ACTIVE'), (2, 'ORIGIN_CODE', 'CN-DONGGUAN-01', 193000000000200002, 'CN-DONGGUAN-01', 'DOMESTIC', 'ACTIVE'), (3, 'OVERSEAS_NAME', '洛杉矶仓', 193000000000200003, 'US-LAX-01', 'OVERSEAS', 'ACTIVE'), (4, 'OVERSEAS_NAME', '纽约仓', 193000000000200004, 'US-NYC-01', 'OVERSEAS', 'ACTIVE') ON DUPLICATE KEY UPDATE warehouse_id = VALUES(warehouse_id), warehouse_code = VALUES(warehouse_code), warehouse_type = VALUES(warehouse_type), status = VALUES(status); CREATE TABLE IF NOT EXISTS fl_inbound_fee ( id BIGINT UNSIGNED NOT NULL COMMENT '入库费用ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', fee_no VARCHAR(40) NOT NULL COMMENT '租户内唯一费用单号', fee_version INT UNSIGNED NOT NULL DEFAULT 1 COMMENT '费用快照版本', charge_rule_id BIGINT UNSIGNED NULL COMMENT '历史客户计费规则ID;渠道价格可为空', charge_rule_version INT UNSIGNED NULL COMMENT '历史客户规则版本快照', carrier_rate_id BIGINT UNSIGNED NOT NULL COMMENT '船司FBA价格ID', carrier_rate_version INT UNSIGNED NOT NULL COMMENT '船司价格版本快照', price_book_version_id BIGINT UNSIGNED NULL COMMENT '整表价格版本ID快照', rule_code VARCHAR(50) NULL COMMENT '历史客户规则编码快照', customer_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID快照', customer_name VARCHAR(128) NOT NULL COMMENT '客户名称快照', business_type VARCHAR(32) NOT NULL COMMENT '业务类型快照', tax_mode VARCHAR(24) NULL COMMENT '订单买单或退税模式快照', pricing_tax_mode VARCHAR(16) NULL COMMENT '报价包税维度快照', rounding_scale TINYINT UNSIGNED NULL COMMENT '历史客户规则计费量保留位数快照', rounding_mode VARCHAR(24) NULL COMMENT '历史客户规则舍入方式快照', rule_effective_from DATETIME(3) NULL COMMENT '历史客户规则生效开始快照', rule_effective_to DATETIME(3) NULL COMMENT '客户规则生效结束快照', rate_code VARCHAR(50) NOT NULL COMMENT '船司价格编码快照', origin_warehouse_id BIGINT UNSIGNED NOT NULL COMMENT '起运仓ID快照', origin_warehouse_name VARCHAR(128) NOT NULL COMMENT '起运仓名称快照', channel_code VARCHAR(64) NOT NULL COMMENT '渠道编码快照', carrier_id BIGINT UNSIGNED NULL COMMENT '历史承运商ID;渠道价格可为空', carrier_name VARCHAR(128) NULL COMMENT '历史承运商名称;渠道价格可为空', destination_type VARCHAR(16) NULL COMMENT '目的地类型快照:FBA或OVERSEAS', destination_warehouse_id BIGINT UNSIGNED NULL COMMENT '海外仓或FBA目的仓ID快照', destination_name VARCHAR(128) NULL COMMENT '目的仓名称快照', destination_code VARCHAR(32) NULL COMMENT 'FBA仓编码快照;海外仓可为空', rate_effective_from DATETIME(3) NOT NULL COMMENT '价格生效开始快照', rate_effective_to DATETIME(3) NULL COMMENT '价格生效结束快照', charge_mode VARCHAR(16) NULL COMMENT '计费口径:KG或CBM', conversion_factor DECIMAL(18,6) NULL COMMENT '历史客户规则使用的换算系数快照', actual_weight_kg DECIMAL(18,3) NOT NULL COMMENT '试算时实际重量kg', actual_volume_cbm DECIMAL(18,4) NOT NULL COMMENT '试算时实际体积m3', converted_quantity DECIMAL(18,4) NOT NULL COMMENT '换算后的重量或体积', chargeable_quantity DECIMAL(18,4) NOT NULL COMMENT '最终计费量', charge_unit VARCHAR(16) NOT NULL COMMENT '计费单位', currency CHAR(3) NOT NULL COMMENT '币种', subtotal_amount DECIMAL(18,2) NOT NULL COMMENT '基础费用金额', additional_amount DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '附加费金额', total_amount DECIMAL(18,2) NOT NULL COMMENT '总金额', fee_status VARCHAR(24) NOT NULL DEFAULT 'CALCULATED' COMMENT '费用状态', review_status VARCHAR(24) NOT NULL DEFAULT 'NOT_SUBMITTED' COMMENT '费用审核状态', exception_release TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否基于测量异常放行生成', calculated_by BIGINT UNSIGNED NOT NULL COMMENT '试算人ID', calculated_at DATETIME(3) NOT NULL COMMENT '试算时间', confirmed_by BIGINT UNSIGNED NULL COMMENT '确认人ID', confirmed_at DATETIME(3) NULL COMMENT '确认时间', sent_by BIGINT UNSIGNED NULL COMMENT '发送人ID', sent_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_inbound_fee_no (tenant_id, fee_no), UNIQUE KEY uk_inbound_fee_version (tenant_id, inbound_id, fee_version), KEY idx_inbound_fee_status (tenant_id, inbound_id, fee_status, review_status), CONSTRAINT fk_fee_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id), CONSTRAINT fk_fee_charge_rule FOREIGN KEY (charge_rule_id) REFERENCES fl_customer_charge_rule (id), CONSTRAINT fk_fee_carrier_rate FOREIGN KEY (carrier_rate_id) REFERENCES fl_carrier_fba_rate (id) ) ENGINE=InnoDB COMMENT='入库头程费用计算和确认快照'; CREATE TABLE IF NOT EXISTS fl_inbound_fee_item ( id BIGINT UNSIGNED NOT NULL COMMENT '费用明细ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', fee_id BIGINT UNSIGNED NOT NULL COMMENT '费用头ID', item_no INT UNSIGNED NOT NULL COMMENT '费用单内序号', fee_code VARCHAR(50) NOT NULL COMMENT '费用项目编码', fee_name VARCHAR(128) NOT NULL COMMENT '费用项目名称快照', quantity DECIMAL(18,4) NOT NULL COMMENT '计费数量', unit VARCHAR(16) NOT NULL COMMENT '计费单位', unit_price DECIMAL(18,6) NOT NULL COMMENT '单价', amount DECIMAL(18,2) NOT NULL COMMENT '金额', currency CHAR(3) NOT NULL COMMENT '币种', automatic_flag TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否自动计算', remark VARCHAR(500) NULL COMMENT '费用备注', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', PRIMARY KEY (id), UNIQUE KEY uk_fee_item_no (tenant_id, fee_id, item_no), CONSTRAINT fk_fee_item_header FOREIGN KEY (fee_id) REFERENCES fl_inbound_fee (id) ) ENGINE=InnoDB COMMENT='入库头程费用项目明细'; CREATE TABLE IF NOT EXISTS fl_inbound_pallet_allocation ( id BIGINT UNSIGNED NOT NULL COMMENT '头程托盘分配引用ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', allocation_no INT UNSIGNED NOT NULL COMMENT '入库单内分配序号', warehouse_id BIGINT UNSIGNED NOT NULL COMMENT '仓库服务仓库ID', warehouse_resource_tenant_id BIGINT UNSIGNED NOT NULL COMMENT '平台公共仓储资源固定使用 0;tenant_id 仍是客户隔离键', pallet_id BIGINT UNSIGNED NOT NULL COMMENT '仓库服务托盘ID', pallet_code VARCHAR(50) NOT NULL COMMENT '托盘编码快照', pallet_capacity_cbm DECIMAL(18,4) NOT NULL COMMENT '托盘可用容积快照', allocated_volume_cbm DECIMAL(18,4) NOT NULL COMMENT '本托盘分配体积', allocated_package_count INT UNSIGNED NULL COMMENT '本托盘分配箱数', location_id BIGINT UNSIGNED NOT NULL COMMENT '仓库服务库位ID', location_code VARCHAR(50) NOT NULL COMMENT '库位编码快照', reservation_no VARCHAR(64) NOT NULL COMMENT '仓库库位预占单号', allocation_status VARCHAR(24) NOT NULL DEFAULT 'RESERVED' 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_pallet_allocation_no (tenant_id, inbound_id, allocation_no), UNIQUE KEY uk_pallet_allocation_pallet (tenant_id, inbound_id, pallet_id), KEY idx_allocation_location (tenant_id, warehouse_id, location_id, allocation_status), CONSTRAINT fk_allocation_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id) ) ENGINE=InnoDB COMMENT='头程侧托盘、库位和仓库预占结果引用'; CREATE TABLE IF NOT EXISTS fl_inbound_file ( id BIGINT UNSIGNED NOT NULL COMMENT '入库单文件关系ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', file_id BIGINT UNSIGNED NOT NULL COMMENT '文件服务文件ID', file_type VARCHAR(24) NOT NULL COMMENT '文件类型:RELATED、MARK、PC_ORDER、MEASURE或WEIGHT', file_name_snapshot VARCHAR(255) NOT NULL COMMENT '文件名快照', visibility VARCHAR(16) NOT NULL DEFAULT 'INTERNAL' COMMENT '可见范围', file_version INT UNSIGNED NOT NULL DEFAULT 1 COMMENT '业务文件版本', uploaded_by BIGINT UNSIGNED NOT NULL COMMENT '上传人ID', uploaded_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '上传时间', deleted TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除标记', PRIMARY KEY (id), UNIQUE KEY uk_inbound_file_relation (tenant_id, inbound_id, file_id, file_type), KEY idx_inbound_file_type (tenant_id, inbound_id, file_type, deleted), CONSTRAINT fk_file_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id) ) ENGINE=InnoDB COMMENT='入库单与文件中心对象的分类关系'; CREATE TABLE IF NOT EXISTS fl_inbound_hold_record ( id BIGINT UNSIGNED NOT NULL COMMENT '扣货记录ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', hold_action VARCHAR(16) NOT NULL COMMENT '动作:HOLD或RELEASE', reason VARCHAR(1000) NOT NULL COMMENT '扣货或解除原因', evidence_file_id BIGINT UNSIGNED NULL COMMENT '证据文件ID', operator_id BIGINT UNSIGNED NOT NULL COMMENT '操作人ID', operator_name VARCHAR(64) NULL COMMENT '操作人名称快照', operated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '操作时间', PRIMARY KEY (id), KEY idx_hold_inbound_time (tenant_id, inbound_id, operated_at), CONSTRAINT fk_hold_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id) ) ENGINE=InnoDB COMMENT='入库单扣货和解除扣货不可变历史'; CREATE TABLE IF NOT EXISTS fl_inbound_internal_note ( id BIGINT UNSIGNED NOT NULL COMMENT '客服内部备注ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', content VARCHAR(2000) NOT NULL COMMENT '仅内部可见备注', created_by BIGINT UNSIGNED NOT NULL COMMENT '创建人ID', created_by_name VARCHAR(64) NULL COMMENT '创建人名称快照', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', PRIMARY KEY (id), KEY idx_internal_note_time (tenant_id, inbound_id, created_at), CONSTRAINT fk_internal_note_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id) ) ENGINE=InnoDB COMMENT='入库单客服内部备注历史'; CREATE TABLE IF NOT EXISTS fl_inbound_status_history ( id BIGINT UNSIGNED NOT NULL COMMENT '入库状态历史ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '数据所属租户ID', inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', from_status VARCHAR(24) NULL COMMENT '变更前状态', to_status VARCHAR(24) NOT NULL COMMENT '变更后状态', action VARCHAR(32) NOT NULL COMMENT '触发动作', reason VARCHAR(1000) 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_inbound_history_time (tenant_id, inbound_id, occurred_at), CONSTRAINT fk_history_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id) ) ENGINE=InnoDB COMMENT='入库单流程状态不可变历史'; CREATE TABLE IF NOT EXISTS fl_inbound_outbox ( id BIGINT UNSIGNED NOT NULL COMMENT '领域事件全局ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '事件所属租户ID', aggregate_type VARCHAR(32) NOT NULL DEFAULT 'INBOUND' COMMENT '聚合类型', aggregate_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', event_type VARCHAR(64) NOT NULL COMMENT '事件类型', payload_json JSON NOT NULL COMMENT '事件负载快照', publish_status VARCHAR(16) NOT NULL DEFAULT 'PENDING' COMMENT '发布状态', 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_inbound_outbox_publish (publish_status, next_retry_at, created_at) ) ENGINE=InnoDB COMMENT='入库事务Outbox事件表'; CREATE TABLE IF NOT EXISTS fl_inbound_idempotency ( id BIGINT UNSIGNED NOT NULL COMMENT '入库写操作幂等记录ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '租户ID', operation VARCHAR(40) NOT NULL COMMENT '操作类型', operator_id BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '操作者或外部应用ID', inbound_id BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '入库单ID,创建前可为0', idempotency_key VARCHAR(128) NOT NULL COMMENT '幂等键', request_hash CHAR(64) NOT NULL COMMENT '请求内容摘要', status VARCHAR(16) NOT NULL COMMENT '处理状态', result_json JSON NULL COMMENT '成功结果摘要', result_resource_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_inbound_idempotency (tenant_id, operation, operator_id, idempotency_key), KEY idx_inbound_idempotency_created (created_at) ) ENGINE=InnoDB COMMENT='第三方测量、审核、费用发送和入库写操作幂等记录'; CREATE TABLE IF NOT EXISTS fl_customer_dimension_config ( id BIGINT UNSIGNED NOT NULL COMMENT '配置ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户隔离ID', box_type VARCHAR(24) NOT NULL COMMENT '固定箱规类型:SMALL/MEDIUM/LARGE/EXTRA_LARGE', inner_length_cm DECIMAL(9,3) NOT NULL COMMENT '箱规内长(厘米)', inner_width_cm DECIMAL(9,3) NOT NULL COMMENT '箱规内宽(厘米)', inner_height_cm DECIMAL(9,3) NOT NULL COMMENT '箱规内高(厘米)', edge_addition_cm DECIMAL(6,3) NOT NULL DEFAULT 2.000 COMMENT '每个尺寸方向的单侧加宽厘米数', remark VARCHAR(500) NULL COMMENT '备注', initialization_key VARCHAR(128) 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), UNIQUE KEY uk_customer_dimension_config_tenant_box (tenant_id, box_type), KEY idx_customer_dimension_config_initialization (tenant_id, initialization_key), CONSTRAINT chk_customer_dimension_box_type CHECK (box_type IN ('SMALL', 'MEDIUM', 'LARGE', 'EXTRA_LARGE')), CONSTRAINT chk_customer_dimension_inner_size CHECK (inner_length_cm >= 0.001 AND inner_width_cm >= 0.001 AND inner_height_cm >= 0.001), CONSTRAINT chk_customer_dimension_edge_addition CHECK (edge_addition_cm >= 0.001 AND edge_addition_cm <= 100.000) ) ENGINE=InnoDB COMMENT='客户固定四箱规尺寸配置';