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 '买单或退税模式', 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_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 '第三方测量明细唯一号,平台手工明细可为空', 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(32) NOT NULL COMMENT '体积计算和舍入规则版本', source_image_file_id BIGINT UNSIGNED NULL COMMENT '测量设备图片文件ID', 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 '创建时间', 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), CONSTRAINT fk_measure_item_batch FOREIGN KEY (measurement_id) REFERENCES fl_inbound_measurement (id) ) 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', rate_code VARCHAR(50) NOT NULL COMMENT '平台公共价格编码', rate_version INT UNSIGNED NOT NULL COMMENT '价格版本号', origin_warehouse_id BIGINT UNSIGNED NOT NULL COMMENT '起运仓逻辑ID', origin_warehouse_name VARCHAR(128) NOT NULL COMMENT '起运仓名称快照', business_type VARCHAR(32) NOT NULL COMMENT '业务或计费类型', channel_code VARCHAR(64) NULL COMMENT '渠道编码', carrier_id BIGINT UNSIGNED NULL COMMENT '船司逻辑ID', carrier_name VARCHAR(128) NOT NULL COMMENT '船司名称快照', destination_code VARCHAR(32) NOT NULL COMMENT 'FBA目的仓编码', 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 '固定附加费', 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_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_code, charge_unit, status, effective_from, effective_to) ) ENGINE=InnoDB COMMENT='船司FBA目的仓价格版本'; 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 NOT NULL COMMENT '客户计费规则ID', charge_rule_version INT UNSIGNED NOT NULL COMMENT '客户规则版本快照', carrier_rate_id BIGINT UNSIGNED NOT NULL COMMENT '船司FBA价格ID', carrier_rate_version INT UNSIGNED NOT NULL COMMENT '船司价格版本快照', rule_code VARCHAR(50) 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 '业务类型快照', tax_mode VARCHAR(24) NULL COMMENT '包税模式快照', rounding_scale TINYINT UNSIGNED NOT NULL COMMENT '计费量保留位数快照', rounding_mode VARCHAR(24) NOT NULL COMMENT '舍入方式快照', rule_effective_from DATETIME(3) NOT 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 NOT NULL COMMENT '船司ID快照', carrier_name VARCHAR(128) NOT NULL COMMENT '船司名称快照', destination_code VARCHAR(32) NOT NULL COMMENT 'FBA仓编码快照', rate_effective_from DATETIME(3) NOT NULL COMMENT '价格生效开始快照', rate_effective_to DATETIME(3) NULL COMMENT '价格生效结束快照', charge_mode VARCHAR(16) NOT NULL COMMENT '计费口径:KG或CBM', conversion_factor DECIMAL(18,6) NOT 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='第三方测量、审核、费用发送和入库写操作幂等记录';