-- 本地服务结构补齐;仅创建缺失表、添加缺失字段,不删除现有数据。 SET NAMES utf8mb4; ALTER TABLE `ll_local_looseboard_order` ADD COLUMN product_name VARCHAR(255) NULL COMMENT '商品名称'; ALTER TABLE `ll_local_looseboard_order` ADD COLUMN estimated_pallet_count INT NULL COMMENT '客户申报预计托数,不代表实际收货'; ALTER TABLE `ll_local_looseboard_order` ADD COLUMN origin_contact_name VARCHAR(128) NULL COMMENT '起运地联系人'; ALTER TABLE `ll_local_looseboard_order` ADD COLUMN origin_contact_phone VARCHAR(128) NULL COMMENT '起运地联系电话'; ALTER TABLE `ll_local_looseboard_order` ADD COLUMN destination_contact_name VARCHAR(128) NULL COMMENT '目的地联系人'; ALTER TABLE `ll_local_looseboard_order` ADD COLUMN destination_contact_phone VARCHAR(128) NULL COMMENT '目的地联系电话'; ALTER TABLE `ll_local_looseboard_order` ADD COLUMN pickup_at DATETIME(3) NULL COMMENT '取货时间(当地时间,不转换时区)'; ALTER TABLE `ll_local_looseboard_order` ADD COLUMN delivery_at DATETIME(3) NULL COMMENT '送货时间(当地时间,不转换时区)'; CREATE TABLE ll_appointment_followup ( id BIGINT NOT NULL COMMENT '预约筹划跟进记录ID', source_key VARCHAR(160) NOT NULL COMMENT '稳定ORDER、BOOKING或CONTAINER及接仓点来源键', customer_id VARCHAR(128) NOT NULL COMMENT '货源客户;整柜共享记录由服务端固定为平台作用域0', source_order_id BIGINT NULL COMMENT '已形成的真实尾程货源ID,尚未生成时为空', stage VARCHAR(32) NOT NULL COMMENT '跟进对象:DRAYAGE_CONTACT/TERMINAL_APPOINTMENT/WAREHOUSE_RECEIVING/FBA_RECEIVING', version INT NOT NULL COMMENT '同一货源及跟进对象的记录版本', contacted_party VARCHAR(200) NULL COMMENT '本次联系对象,不替代承运主档', result VARCHAR(1000) NOT NULL COMMENT '本次反馈事实,不自动确认预约或推进实物作业', next_action VARCHAR(500) NULL COMMENT '下一步安排', followup_date DATE NULL COMMENT '按业务地点当地日期记录的下次跟进日', operator_id VARCHAR(128) NOT NULL COMMENT '登录平台操作者ID', operator_name VARCHAR(200) NULL COMMENT '操作人姓名快照', command_key VARCHAR(64) NOT NULL COMMENT '持久幂等键', request_hash CHAR(64) NOT NULL COMMENT '含操作者身份的请求SHA256摘要', created_at DATETIME(3) NOT NULL COMMENT 'UTC记录时间', PRIMARY KEY (id), UNIQUE KEY uk_appointment_followup_version (source_key,stage,version), UNIQUE KEY uk_appointment_followup_command (source_key,stage,command_key), KEY idx_appointment_followup_date (followup_date,source_order_id), CONSTRAINT fk_appointment_followup_order FOREIGN KEY (source_order_id) REFERENCES ll_order(id), CONSTRAINT chk_appointment_followup_stage CHECK (stage IN ('DRAYAGE_CONTACT','TERMINAL_APPOINTMENT','WAREHOUSE_RECEIVING','FBA_RECEIVING')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='真实在途货源的预约筹划联系记录,追加留痕'; CREATE TABLE ll_dispatch_command ( id BIGINT NOT NULL COMMENT '持久命令内部主键', dispatch_id BIGINT NOT NULL COMMENT '命令所属整车排车主单ID', dispatch_no VARCHAR(64) NOT NULL COMMENT '命令所属真实排车业务号', action VARCHAR(40) NOT NULL COMMENT '本次整车作业动作', operator_id VARCHAR(128) NOT NULL COMMENT '原始可信操作主体ID', idempotency_key VARCHAR(255) NOT NULL COMMENT '跨操作主体全局唯一的原始请求键', record_version BIGINT NOT NULL COMMENT '原请求明确提交的排车版本,零为合法首版', command_hash CHAR(64) NOT NULL COMMENT '绑定原主体动作业务号版本和完整载荷的严格摘要', result_json LONGTEXT NOT NULL COMMENT '按动作类型恢复的不可变成功结果JSON', created_at DATETIME(3) NOT NULL COMMENT '成功命令记录时间,使用UTC', PRIMARY KEY (id), UNIQUE KEY uk_dispatch_command_key (idempotency_key), KEY idx_dispatch_command_history (dispatch_id,created_at,id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='整车排车公共持久命令账本'; CREATE TABLE ll_dispatch_delivery_arrangement ( id BIGINT NOT NULL COMMENT '安排事实内部主键', dispatch_order_id BIGINT NOT NULL COMMENT '唯一整车排车主单ID', dispatch_no VARCHAR(128) NOT NULL COMMENT '真实排车业务号', arrangement_key VARCHAR(128) NOT NULL COMMENT '本次唯一安排业务事实标识', business_hash CHAR(64) NOT NULL COMMENT '排除操作者及纯并发版本的安排业务摘要', cargo_hash CHAR(64) NOT NULL COMMENT '本车实际拣货来源摘要', loading_completion_hash CHAR(64) NOT NULL COMMENT '装车完成事实摘要', original_command_key VARCHAR(255) NOT NULL COMMENT '首次安排的全局请求键', original_operator_id VARCHAR(128) NOT NULL COMMENT '首次安排操作主体', result_json JSON NOT NULL COMMENT '全部客户出库及客户目的地派送不可变结果', cargo_json JSON NOT NULL COMMENT '逐客户逐拣货归属的不可变真实来源', created_at DATETIME(3) NOT NULL COMMENT '本次安排实际创建时间', PRIMARY KEY (id), UNIQUE KEY uk_dispatch_arrangement_dispatch (dispatch_order_id), UNIQUE KEY uk_dispatch_arrangement_key (arrangement_key), UNIQUE KEY uk_dispatch_arrangement_command (original_command_key) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='整车排车唯一派送安排事实'; CREATE TABLE ll_delivery_facts_changed ( id BIGINT NOT NULL COMMENT '持久信号内部主键', customer_id VARCHAR(128) NOT NULL COMMENT '真实签收货物客户ID', dispatch_id BIGINT NOT NULL COMMENT '整车排车主单ID', dispatch_no VARCHAR(128) NOT NULL COMMENT '真实排车业务号', delivery_id BIGINT NOT NULL COMMENT '本客户派送单ID', delivery_no VARCHAR(128) NOT NULL COMMENT '真实派送业务号', delivery_version BIGINT NOT NULL COMMENT '触发信号的真实派送版本', facts_hash CHAR(64) NOT NULL COMMENT '该版本真实签收事实摘要', occurred_at DATETIME(3) NOT NULL COMMENT '签收事实实际发生时间', state VARCHAR(16) NOT NULL DEFAULT 'PENDING' COMMENT '待核对PENDING或已核对PROCESSED', attempt_count INT NOT NULL DEFAULT 0 COMMENT '已记录的汇总失败次数', next_attempt_at DATETIME(3) NOT NULL COMMENT '下次可重试时间', last_error_code VARCHAR(64) NULL COMMENT '最近失败诊断码不保存敏感异常正文', processed_at DATETIME(3) NULL COMMENT '与主阶段汇总同事务确认时间', PRIMARY KEY (id), UNIQUE KEY uk_delivery_fact_version (customer_id,delivery_id,delivery_version), KEY idx_delivery_fact_due (state,next_attempt_at,id), KEY idx_delivery_fact_dispatch (dispatch_id,state,id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='正常签收事实变化的本地持久待汇总信号'; ALTER TABLE `ll_outbound_pallet_item` ADD COLUMN dispatch_item_id BIGINT NULL COMMENT '本次整车排车作业明细ID'; ALTER TABLE `ll_outbound_pallet_item` ADD COLUMN source_attribution_id BIGINT NULL COMMENT '不可变PDA真实拣货归属ID'; ALTER TABLE `ll_outbound_pallet_item` ADD COLUMN source_order_id BIGINT NULL COMMENT '本行真实来源尾程订单ID'; ALTER TABLE `ll_outbound_pallet_item` ADD COLUMN source_inventory_position_id BIGINT NULL COMMENT '本行实际拣货库存仓位ID'; ALTER TABLE `ll_outbound_pallet_item` ADD COLUMN source_return_receipt_id BIGINT NULL COMMENT '本行实际退回再派实收记录ID'; ALTER TABLE `ll_outbound_pallet_item` ADD COLUMN source_return_carton_id BIGINT NULL COMMENT '本行实际退货换标来源箱ID'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN purpose VARCHAR(32) NULL COMMENT '费用业务用途;由履约节点确定'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN confirmation_origin VARCHAR(16) NOT NULL DEFAULT 'BUSINESS' COMMENT '核定入口:BUSINESS业务节点、FINANCIAL财务操作'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN fee_version INT NULL COMMENT '同用途费用确认版本'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN active TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否当前有效版本'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN determination VARCHAR(24) NULL COMMENT 'POSITIVE正额、ZERO零元、NOT_APPLICABLE不适用'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN original_currency CHAR(3) NULL COMMENT '核定原币CNY或USD'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN original_amount DECIMAL(20,2) NULL COMMENT '核定原币金额'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN exchange_rate DECIMAL(20,6) NULL COMMENT '已确认汇率快照'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN exchange_rate_month CHAR(7) NULL COMMENT '已确认汇率所属月份'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN business_date DATE NULL COMMENT '实际费用业务日期'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN wallet_business_id BIGINT NULL COMMENT '资金冻结对应采购费用记录'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN wallet_business_no VARCHAR(128) NULL COMMENT '资金冻结业务号;实际国际运费引用原预估'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN wallet_hold_id VARCHAR(64) NULL COMMENT 'Finance冻结引用'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN wallet_ledger_id VARCHAR(64) NULL COMMENT 'Finance实际处理流水引用'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN settled_command_event_id VARCHAR(64) NULL COMMENT '成功实扣或退款的资金命令事件'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN source_fee_id BIGINT NULL COMMENT '已实扣费用来源ID'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN parent_fee_id BIGINT NULL COMMENT '原费用或预估引用'; ALTER TABLE `ll_overseas_procurement_fee` ADD COLUMN request_hash CHAR(64) NULL COMMENT '确认请求摘要'; ALTER TABLE `ll_overseas_procurement_status_history` ADD COLUMN operation_type varchar(32) COLLATE utf8mb4_unicode_ci NULL COMMENT '操作类型:CREATE、REVIEW或UPDATE'; ALTER TABLE `ll_overseas_procurement_status_history` ADD COLUMN change_detail json DEFAULT NULL COMMENT '字段变更前后值JSON'; ALTER TABLE `ll_receiving_container_session` ADD COLUMN source_container_booking_id varchar(128) COLLATE utf8mb4_unicode_ci NULL COMMENT '稳定来源柜预订ID'; ALTER TABLE `ll_receiving_container_session` ADD COLUMN container_fact_hash varchar(64) COLLATE utf8mb4_unicode_ci NULL COMMENT '领取时整柜订单与计划事实摘要'; ALTER TABLE `ll_receiving_container_session` ADD COLUMN overseas_warehouse_code varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '海外接柜仓业务编码快照'; ALTER TABLE `ll_return_inventory_outbound_movement` ADD COLUMN return_sku_quantity BIGINT NULL COMMENT '退货单SKU本来源计划出库件数快照,NULL为历史整箱出库'; ALTER TABLE `ll_us_truck_order` ADD COLUMN vehicle_type VARCHAR(32) NULL COMMENT '车辆类型:PALLET_15为15拖,PALLET_30为30拖;拼车未提供时为空'; ALTER TABLE `ll_us_truck_order` ADD COLUMN origin_contact_name VARCHAR(128) NULL COMMENT '起运地联系人'; ALTER TABLE `ll_us_truck_order` ADD COLUMN origin_contact_phone VARCHAR(128) NULL COMMENT '起运地联系电话'; ALTER TABLE `ll_us_truck_order` ADD COLUMN destination_contact_name VARCHAR(128) NULL COMMENT '目的地联系人'; ALTER TABLE `ll_us_truck_order` ADD COLUMN destination_contact_phone VARCHAR(128) NULL COMMENT '目的地联系电话'; ALTER TABLE `ll_us_truck_order` ADD COLUMN pickup_at DATETIME NULL COMMENT '取货时间,按填写的日期时分保存,不转换时区'; ALTER TABLE `ll_us_truck_order` ADD COLUMN delivery_at DATETIME NULL COMMENT '送货时间,按填写的日期时分保存;拼车来源未提供时为空'; CREATE TABLE event_delivery_retry_audit ( request_id VARCHAR(36) NOT NULL COMMENT '人工重试请求UUID和幂等键', producer_table VARCHAR(64) NOT NULL COMMENT '本服务发件箱表名', entry_id VARCHAR(64) NOT NULL COMMENT '发件箱记录主键', event_id VARCHAR(128) NOT NULL COMMENT '原事件全局标识', event_type VARCHAR(64) NOT NULL COMMENT '原事件类型', payload_hash VARCHAR(71) NOT NULL COMMENT '原事件不可变负载摘要', operator_name VARCHAR(128) NOT NULL COMMENT '持有运维凭据的操作人标识', reason VARCHAR(500) NOT NULL COMMENT '人工重试原因', previous_failures INT NOT NULL COMMENT '重试前累计失败次数', previous_error VARCHAR(1000) NULL COMMENT '重试前最后一次脱敏错误', requested_at DATETIME(3) NOT NULL COMMENT '重试申请提交时间', PRIMARY KEY (request_id), KEY idx_event_retry_entry (producer_table,entry_id,requested_at), KEY idx_event_retry_event (event_id,requested_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='业务事件人工重试审计,与恢复待发送状态同事务提交'; CREATE TABLE ll_procurement_wallet_attempt ( id BIGINT NOT NULL COMMENT '请求尝试ID', order_id BIGINT NOT NULL COMMENT '采购订单ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户隔离键', fee_id BIGINT NOT NULL COMMENT '不可变费用版本ID', attempt_no BIGINT NOT NULL COMMENT '费用版本内请求序号', operation VARCHAR(32) NOT NULL COMMENT '资金操作:FREEZE冻结、SETTLE结算、SETTLE_ACTUAL实际结算、RELEASE释放、REFUND退款', business_no VARCHAR(128) NOT NULL COMMENT 'Finance资金业务号', amount DECIMAL(20,2) NULL COMMENT '请求金额;全额结算或释放可空', command_event_id VARCHAR(64) NOT NULL COMMENT '资金指令事件唯一引用', status VARCHAR(16) NOT NULL COMMENT '资金请求结果:PENDING未决、SUCCEEDED成功、FAILED明确失败', result_hash CHAR(64) NULL COMMENT '原业务回执摘要', wallet_hold_id VARCHAR(64) NULL COMMENT 'Finance冻结引用', wallet_ledger_id VARCHAR(64) NULL COMMENT 'Finance处理流水引用', error_code VARCHAR(64) NULL COMMENT '业务失败码', error_message VARCHAR(500) NULL COMMENT '内部失败诊断,不直接对客展示', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '请求时间', completed_at DATETIME(3) NULL COMMENT '最终结果时间', PRIMARY KEY(id), UNIQUE KEY uk_procurement_attempt_event(command_event_id), UNIQUE KEY uk_procurement_attempt_number(fee_id,attempt_no), KEY idx_procurement_attempt_order(customer_id,order_id,status), CONSTRAINT chk_procurement_attempt_status CHECK(status IN('PENDING','SUCCEEDED','FAILED')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购费用资金命令尝试与不可变结果'; CREATE TABLE ll_procurement_flow ( order_id BIGINT NOT NULL COMMENT '采购订单ID,一单一个履约批次', customer_id VARCHAR(128) NOT NULL COMMENT '客户隔离键', purchased_at DATETIME(3) NULL COMMENT '真实购买时间', purchased_product_name VARCHAR(255) NULL COMMENT '实际购买商品', purchased_specification VARCHAR(500) NULL COMMENT '实际购买规格', purchased_quantity BIGINT NULL COMMENT '实际购买件数', purchase_amount DECIMAL(20,2) NULL COMMENT '供应商实付原币金额', purchase_currency CHAR(3) NULL COMMENT '供应商实付原币CNY或USD', purchase_voucher_id BIGINT NULL COMMENT '购买凭证引用', purchase_issue VARCHAR(500) NULL COMMENT '购买未核定或异常说明', purchase_confirmed_at DATETIME(3) NULL COMMENT '货款核定时间,不代表扣费成功', actual_warehouse_id BIGINT NULL COMMENT '首次实际收货冻结的仓库ID', actual_warehouse_code VARCHAR(128) NULL COMMENT '实际收货仓编码快照', actual_warehouse_name VARCHAR(255) NULL COMMENT '实际收货仓名称快照', overseas_received_at DATETIME(3) NULL COMMENT '海外整批收货完成时间', packing_version INT NULL COMMENT '当前确认装箱清单版本', overseas_shipped_at DATETIME(3) NULL COMMENT '国际段整批实际交寄时间', domestic_received_at DATETIME(3) NULL COMMENT '国内整批收货完成时间', charges_confirmed_at DATETIME(3) NULL COMMENT '国内整单费用核定时间', customer_shipped_at DATETIME(3) NULL COMMENT '国内寄客户实际交寄时间', domestic_receiver_name VARCHAR(128) NULL COMMENT '国际段国内收件人', domestic_receiver_phone VARCHAR(64) NULL COMMENT '国际段国内收件电话', domestic_receiver_address VARCHAR(1000) NULL COMMENT '国际段国内接收地址', cancelled_at DATETIME(3) NULL COMMENT '购买前取消时间', closed_at DATETIME(3) NULL COMMENT '异常关闭时间', control_reason VARCHAR(1000) 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(order_id), KEY idx_procurement_flow_customer(customer_id,order_id), CONSTRAINT chk_procurement_purchase_quantity CHECK(purchased_quantity IS NULL OR purchased_quantity>0), CONSTRAINT chk_procurement_purchase_amount CHECK(purchase_amount IS NULL OR purchase_amount>=0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购单一批次履约事实'; CREATE TABLE ll_procurement_command ( id BIGINT NOT NULL COMMENT '操作记录ID', order_id BIGINT NOT NULL COMMENT '采购订单ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户隔离键', action VARCHAR(48) NOT NULL COMMENT '采购节点动作', idempotency_key VARCHAR(128) NOT NULL COMMENT '操作幂等键', request_hash CHAR(64) NOT NULL COMMENT '请求摘要', operator_id VARCHAR(128) NOT NULL COMMENT '执行人', reason VARCHAR(1000) NOT NULL COMMENT '操作依据', detail_json JSON NOT NULL COMMENT '内部操作及更正依据快照,不直接对客展示', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '执行时间', PRIMARY KEY(id), UNIQUE KEY uk_procurement_command(order_id,action,idempotency_key), KEY idx_procurement_command_customer(customer_id,order_id,created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购节点幂等与不可变审计'; CREATE TABLE ll_procurement_budget_authorization ( id BIGINT NOT NULL COMMENT '预算授权ID', order_id BIGINT NOT NULL COMMENT '采购订单ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户隔离键', previous_amount DECIMAL(20,2) NULL COMMENT '原货款预算总上限;未授权保持空', previous_currency CHAR(3) NOT NULL COMMENT '原预算币种', authorized_amount DECIMAL(20,2) NOT NULL COMMENT '客户授权的新货款总上限', currency CHAR(3) NOT NULL COMMENT '客户授权币种', voucher_file_id BIGINT NOT NULL COMMENT '客户确认书面或聊天凭证', reason VARCHAR(1000) NOT NULL COMMENT '授权依据', reviewed_by VARCHAR(128) NOT NULL COMMENT '核验人员', reviewed_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '核验时间', PRIMARY KEY(id), KEY idx_procurement_budget_order(customer_id,order_id,id), CONSTRAINT chk_procurement_budget_amount CHECK(authorized_amount>=0 AND previous_amount>=0), CONSTRAINT chk_procurement_budget_currency CHECK(currency IN('CNY','USD') AND previous_currency IN('CNY','USD')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购货款预算授权核验历史'; CREATE TABLE ll_procurement_receipt ( id BIGINT NOT NULL COMMENT '实收明细ID', order_id BIGINT NOT NULL COMMENT '采购订单ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户隔离键', receipt_no VARCHAR(64) NOT NULL COMMENT '采购收货业务编号', leg VARCHAR(16) NOT NULL COMMENT 'OVERSEAS海外或DOMESTIC国内', source_carton_id BIGINT NULL COMMENT '国内实收关联原国际交寄箱,海外为空', warehouse_id BIGINT NULL COMMENT '海外实际收货仓', good_quantity BIGINT NOT NULL COMMENT '可发合格件数', damaged_quantity BIGINT NOT NULL COMMENT '破损待处置件数', extra_quantity BIGINT NOT NULL COMMENT '多到件数,不增加可发数量', received_at DATETIME(3) NOT NULL COMMENT '实际收货时间', active TINYINT(1) NOT NULL DEFAULT 1 COMMENT '当前有效实收事实', supersedes_id BIGINT NULL COMMENT '受控更正所替代的原实收记录', created_by VARCHAR(128) NOT NULL COMMENT '登记人员', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '登记时间', PRIMARY KEY(id), UNIQUE KEY uk_procurement_receipt_no(receipt_no), KEY idx_procurement_receipt_source(order_id,leg,source_carton_id,active), CONSTRAINT chk_procurement_receipt_quantity CHECK(good_quantity>=0 AND damaged_quantity>=0 AND extra_quantity>=0 AND good_quantity+damaged_quantity+extra_quantity>0), CONSTRAINT chk_procurement_receipt_leg CHECK((leg='OVERSEAS' AND source_carton_id IS NULL) OR (leg='DOMESTIC' AND source_carton_id IS NOT NULL)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购分次实收与受控更正事实'; CREATE TABLE ll_procurement_disposition ( id BIGINT NOT NULL COMMENT '差异处理ID', order_id BIGINT NOT NULL COMMENT '采购订单ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户隔离键', leg VARCHAR(16) NOT NULL COMMENT 'OVERSEAS海外或DOMESTIC国内', source_carton_id BIGINT NULL COMMENT '国内原交寄箱来源', receipt_id BIGINT NULL COMMENT '破损或多货对应实收记录,短少为空', kind VARCHAR(24) NOT NULL COMMENT 'SHORTAGE短少、DAMAGED破损、EXTRA多货', quantity BIGINT NOT NULL COMMENT '已批准处置件数', decision VARCHAR(32) NOT NULL COMMENT 'ACCEPT_SHORTAGE确认短少、DISPOSE_DAMAGED拒收或处置、RETURN_EXTRA退回多货', active TINYINT(1) NOT NULL DEFAULT 1 COMMENT '当前有效处置;撤销只改变有效性并保留原事实', voucher_file_id BIGINT NOT NULL COMMENT '本单客户确认或实际处置凭证', reason VARCHAR(1000) NOT NULL COMMENT '处置依据', created_by VARCHAR(128) NOT NULL COMMENT '采购管理人员', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '确认时间', PRIMARY KEY(id), KEY idx_procurement_disposition_source(order_id,leg,source_carton_id,receipt_id,kind), CONSTRAINT chk_procurement_disposition_quantity CHECK(quantity>0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购单内差异处置,不自动退款'; CREATE TABLE ll_procurement_manifest ( id BIGINT NOT NULL COMMENT '装箱清单ID', order_id BIGINT NOT NULL COMMENT '采购订单ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户隔离键', version INT NOT NULL COMMENT '订单内装箱版本', status VARCHAR(16) NOT NULL COMMENT 'DRAFT草稿、CONFIRMED已确认、SUPERSEDED已替代', confirmed_at DATETIME(3) NULL COMMENT '确认时间', created_by VARCHAR(128) NOT NULL COMMENT '制单人', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '版本保存时间', PRIMARY KEY(id), UNIQUE KEY uk_procurement_manifest_version(order_id,version), CONSTRAINT chk_procurement_manifest_status CHECK(status IN('DRAFT','CONFIRMED','SUPERSEDED')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购装箱清单不可变版本'; CREATE TABLE ll_procurement_carton ( id BIGINT NOT NULL COMMENT '版本内箱记录ID', order_id BIGINT NOT NULL COMMENT '采购订单ID', manifest_id BIGINT NOT NULL COMMENT '装箱清单版本', carton_no VARCHAR(64) NOT NULL COMMENT '采购订单内业务箱号', length_cm DECIMAL(12,2) NOT NULL COMMENT '外箱长厘米', width_cm DECIMAL(12,2) NOT NULL COMMENT '外箱宽厘米', height_cm DECIMAL(12,2) NOT NULL COMMENT '外箱高厘米', gross_weight_kg DECIMAL(12,3) NOT NULL COMMENT '封箱毛重千克', quantity BIGINT NOT NULL COMMENT '本箱合格商品总件数', PRIMARY KEY(id), UNIQUE KEY uk_procurement_carton_version(manifest_id,carton_no), KEY idx_procurement_carton_order(order_id,manifest_id), CONSTRAINT chk_procurement_carton_measurement CHECK(length_cm>0 AND width_cm>0 AND height_cm>0 AND gross_weight_kg>0 AND quantity>0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购版本化逐箱实测与件数'; CREATE TABLE ll_procurement_carton_source ( carton_id BIGINT NOT NULL COMMENT '版本内箱ID', receipt_id BIGINT NOT NULL COMMENT '海外实收明细来源', quantity BIGINT NOT NULL COMMENT '从该实收装入本箱的件数', PRIMARY KEY(carton_id,receipt_id), KEY idx_procurement_carton_receipt(receipt_id), CONSTRAINT chk_procurement_carton_source_quantity CHECK(quantity>0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购箱内货物的实收来源与数量'; CREATE TABLE ll_procurement_shipment ( id BIGINT NOT NULL COMMENT '采购交寄ID', order_id BIGINT NOT NULL COMMENT '采购订单ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户隔离键', shipment_no VARCHAR(64) NOT NULL COMMENT '交寄业务编号', leg VARCHAR(16) NOT NULL COMMENT 'OVERSEAS国际交寄或DOMESTIC寄客户', manifest_id BIGINT NOT NULL COMMENT '原海外装箱清单版本', shipped_at DATETIME(3) NOT NULL COMMENT '整批真实交承运方时间', address_snapshot JSON NOT NULL COMMENT '本段交寄时的收寄姓名电话地址快照', created_by VARCHAR(128) NOT NULL COMMENT '交寄确认人', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '确认时间', PRIMARY KEY(id), UNIQUE KEY uk_procurement_shipment_leg(order_id,leg), UNIQUE KEY uk_procurement_shipment_no(shipment_no), CONSTRAINT chk_procurement_shipment_leg CHECK(leg IN('OVERSEAS','DOMESTIC')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购两段各一次整批真实交寄'; CREATE TABLE ll_procurement_shipment_item ( shipment_id BIGINT NOT NULL COMMENT '采购交寄ID', carton_id BIGINT NOT NULL COMMENT '原海外装箱版本内箱ID', quantity BIGINT NOT NULL COMMENT '本次实际交寄件数', carrier VARCHAR(128) NOT NULL COMMENT '承运商快照', tracking_no VARCHAR(128) NOT NULL COMMENT '运单号快照', label_snapshot JSON NOT NULL COMMENT '当次箱规、面单及货物来源快照', PRIMARY KEY(shipment_id,carton_id), CONSTRAINT chk_procurement_shipment_item_quantity CHECK(quantity>0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购整批交寄逐箱事实'; CREATE TABLE ll_procurement_label_set ( id BIGINT NOT NULL COMMENT '面单批版本ID', order_id BIGINT NOT NULL COMMENT '采购订单ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户隔离键', leg VARCHAR(16) NOT NULL COMMENT 'OVERSEAS国际段或DOMESTIC寄客户段', version INT NOT NULL COMMENT '订单段内面单版本', manifest_id BIGINT NOT NULL COMMENT '原海外确认装箱版本', cargo_hash CHAR(64) NOT NULL COMMENT '箱规及有效货物来源摘要', sender_snapshot JSON NOT NULL COMMENT '寄件人姓名电话地址快照', receiver_snapshot JSON NOT NULL COMMENT '收件人姓名电话地址快照', created_by VARCHAR(128) NOT NULL COMMENT '制单操作人', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '上传确认时间', PRIMARY KEY(id), UNIQUE KEY uk_procurement_label_version(order_id,leg,version), CONSTRAINT chk_procurement_label_leg CHECK(leg IN('OVERSEAS','DOMESTIC')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购两段面单不可变版本和地址快照'; CREATE TABLE ll_procurement_label_item ( label_set_id BIGINT NOT NULL COMMENT '面单批版本ID', carton_id BIGINT NOT NULL COMMENT '原海外清单箱ID', file_id BIGINT NOT NULL COMMENT '本采购订单面单文件', page_no INT NOT NULL COMMENT '该箱对应文件页码,从1开始', carrier VARCHAR(128) NOT NULL COMMENT '承运商', tracking_no VARCHAR(128) NOT NULL COMMENT '箱主或子运单号', applied_at DATETIME(3) NULL COMMENT '真实贴单时间', applied_by VARCHAR(128) NULL COMMENT '贴单确认人', PRIMARY KEY(label_set_id,carton_id), CONSTRAINT chk_procurement_label_page CHECK(page_no>0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购逐箱文件页关联及贴单事实'; CREATE TABLE ll_procurement_estimate_review ( id BIGINT NOT NULL COMMENT '预估核对ID', order_id BIGINT NOT NULL COMMENT '采购订单ID', label_set_id BIGINT NOT NULL COMMENT '已核对国际面单版本', fee_id BIGINT NOT NULL COMMENT '唯一有效预估费用版本', reviewed_by VARCHAR(128) NOT NULL COMMENT '核价人员', reviewed_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '核对时间', PRIMARY KEY(id), UNIQUE KEY uk_procurement_estimate_review(label_set_id,fee_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='面单清单与预估冻结的显式核对关联'; CREATE TABLE ll_procurement_repack ( id BIGINT NOT NULL COMMENT '换包装版本ID', order_id BIGINT NOT NULL COMMENT '采购订单ID', carton_id BIGINT NOT NULL COMMENT '原国际交寄箱ID,保持一对一来源', length_cm DECIMAL(12,2) NOT NULL COMMENT '新外箱长厘米', width_cm DECIMAL(12,2) NOT NULL COMMENT '新外箱宽厘米', height_cm DECIMAL(12,2) NOT NULL COMMENT '新外箱高厘米', gross_weight_kg DECIMAL(12,3) NOT NULL COMMENT '新封箱毛重千克', voucher_file_id BIGINT NOT NULL COMMENT '本单换包装证据', reason VARCHAR(1000) NOT NULL COMMENT '换包装依据', created_by VARCHAR(128) NOT NULL COMMENT '国内作业人员', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '登记时间', PRIMARY KEY(id), KEY idx_procurement_repack_carton(order_id,carton_id,id), CONSTRAINT chk_procurement_repack_measurement CHECK(length_cm>0 AND width_cm>0 AND height_cm>0 AND gross_weight_kg>0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购国内原箱一对一换包装不可变历史'; CREATE TABLE ll_procurement_fee_correction ( id BIGINT NOT NULL COMMENT '费用链更正ID', order_id BIGINT NOT NULL COMMENT '采购订单ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户隔离键', correction_no VARCHAR(64) NOT NULL COMMENT '财务更正业务号', root_fee_id BIGINT NOT NULL COMMENT '原实际费用链根', idempotency_key VARCHAR(128) NOT NULL COMMENT '本单更正请求幂等键', request_hash CHAR(64) NOT NULL COMMENT '更正目标及凭证请求摘要', target_original_amount DECIMAL(20,2) NOT NULL COMMENT '本次正确原币总额', original_currency CHAR(3) NOT NULL COMMENT '沿用原费用币种', exchange_rate DECIMAL(20,6) NOT NULL COMMENT '沿用原费用汇率快照', exchange_rate_month CHAR(7) NOT NULL COMMENT '原汇率月份,不取本次操作月份', target_amount DECIMAL(20,2) NOT NULL COMMENT '正确总额折算CNY', previous_net_amount DECIMAL(20,2) NOT NULL COMMENT '确认前整链净实扣CNY', difference_amount DECIMAL(20,2) NOT NULL COMMENT 'CNY正差额追加、负差额退款、零差额仅留核对记录', voucher_file_id BIGINT NOT NULL COMMENT '本订单财务更正凭证', reason VARCHAR(500) NOT NULL COMMENT '更正依据', created_by VARCHAR(128) NOT NULL COMMENT '授权财务操作人', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '确认时间', PRIMARY KEY(id), UNIQUE KEY uk_procurement_correction_no(correction_no), UNIQUE KEY uk_procurement_correction_request(order_id,idempotency_key), KEY idx_procurement_correction_root(order_id,root_fee_id,id), CONSTRAINT chk_procurement_correction_amount CHECK(target_original_amount>=0 AND target_amount>=0 AND previous_net_amount>=0 AND exchange_rate>0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购费用链更正目标与原汇率快照'; CREATE TABLE ll_procurement_fee_correction_item ( correction_id BIGINT NOT NULL COMMENT '本次费用链更正ID', fee_id BIGINT NOT NULL COMMENT '本次产生的独立正差额或退款费用ID', PRIMARY KEY(correction_id,fee_id), UNIQUE KEY uk_procurement_correction_fee(fee_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购费用目标更正与逐笔资金事实关联'; CREATE TABLE ll_procurement_control_note ( id BIGINT NOT NULL COMMENT '采购更正说明ID', order_id BIGINT NOT NULL COMMENT '采购订单ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户隔离键', note_no VARCHAR(64) NOT NULL COMMENT '更正说明业务号', target_type VARCHAR(24) NOT NULL COMMENT '购买、仓库、实收或交寄事实类型', target_id BIGINT NULL COMMENT '本单事实对象引用,购买为空', blocking TINYINT(1) NOT NULL COMMENT '是否阻断后续计划履约', voucher_file_id BIGINT NOT NULL COMMENT '本单内部事实更正凭证', reason VARCHAR(1000) NOT NULL COMMENT '内部更正说明', client_summary VARCHAR(500) NULL COMMENT '人工确认的对客摘要,不复制内部原始内容', original_value_json JSON NULL COMMENT '服务端记录的原事实快照', corrected_value_json JSON NULL COMMENT '服务端记录的更正事实快照', created_by VARCHAR(128) NOT NULL COMMENT '采购管理操作人', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '登记时间', resolved_by VARCHAR(128) NULL COMMENT '处理确认人', resolved_at DATETIME(3) NULL COMMENT '阻断解除时间', resolution_reason VARCHAR(1000) NULL COMMENT '内部处理结果', resolution_voucher_id BIGINT NULL COMMENT '本单处理凭证', PRIMARY KEY(id), UNIQUE KEY uk_procurement_note_no(note_no), KEY idx_procurement_note_block(order_id,blocking,resolved_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购不可覆盖事实的更正说明及阻断异常'; CREATE TABLE ll_procurement_closure ( id BIGINT NOT NULL COMMENT '采购异常关闭ID', order_id BIGINT NOT NULL COMMENT '采购订单ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户隔离键', closure_no VARCHAR(64) NOT NULL COMMENT '异常关闭业务号', customer_voucher_file_id BIGINT NOT NULL COMMENT '客户同意停止履约凭证', financial_conclusion VARCHAR(1000) NOT NULL COMMENT '已知费用及后续无需收费的处理结论,不改变资金事实', reason VARCHAR(1000) NOT NULL COMMENT '内部关闭原因', client_summary VARCHAR(500) NOT NULL COMMENT '人工确认的对客关闭摘要', created_by VARCHAR(128) NOT NULL COMMENT '采购管理确认人', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '关闭确认时间', PRIMARY KEY(id), UNIQUE KEY uk_procurement_closure_order(order_id), UNIQUE KEY uk_procurement_closure_no(closure_no) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采购实物资金收口后的异常关闭事实'; CREATE TABLE ll_procurement_closure_item ( id BIGINT NOT NULL COMMENT '关闭货物处置ID', closure_id BIGINT NOT NULL COMMENT '采购关闭ID', source_kind VARCHAR(32) NOT NULL COMMENT '购买未达、在途未达、合格、破损或多货来源', source_id BIGINT NULL COMMENT '原实收或国际交寄箱,购买未达为空', quantity BIGINT NOT NULL COMMENT '本来源最终明确去向件数', decision VARCHAR(40) NOT NULL COMMENT '供应商保管、退还、报失、客户授权保管或处置', destination VARCHAR(500) NOT NULL COMMENT '实际去向及接收方说明', voucher_file_id BIGINT NOT NULL COMMENT '本单实物处置证明', PRIMARY KEY(id), KEY idx_procurement_closure_source(closure_id,source_kind,source_id), CONSTRAINT chk_procurement_closure_quantity CHECK(quantity>0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='异常关闭逐来源剩余货物最终去向,不产生新发运'; CREATE TABLE ll_selfop_outbound_discovery_scope ( id BIGINT NOT NULL COMMENT '应用生成的记录标识', created_at DATETIME(3) NOT NULL COMMENT 'UTC创建时间', updated_at DATETIME(3) NOT NULL COMMENT 'UTC更新时间', source_account VARCHAR(64) NOT NULL COMMENT '受控来源账号别名,不保存密钥', catalog_from_utc DATETIME(3) NULL COMMENT '账号完整目录连续覆盖UTC下界,不等同销量覆盖', catalog_until_utc DATETIME(3) NULL COMMENT '账号完整目录连续覆盖UTC上界,不等同销量覆盖', next_sequence BIGINT NOT NULL DEFAULT 1 COMMENT '新发现任务的单调调度序号;重试沿用,只安排任务,不判断对象内容的新旧', next_observation_sequence BIGINT NOT NULL DEFAULT 1 COMMENT '每次实际出库详情请求前分配的单调采集代次;与 task 调度序号独立,重试请求也分配新代次', active_task_id BIGINT NULL COMMENT '当前共享发现/详情补齐任务', lease_owner VARCHAR(128) NULL COMMENT '账号发现执行者', lease_until_utc DATETIME(3) NULL COMMENT '账号发现租约到期时刻', fence_token BIGINT NOT NULL DEFAULT 0 COMMENT '防止过期发现进程继续写共享暂存或派发任务', request_budget INT NOT NULL COMMENT '一次调度允许的目录、详情请求总预算,必须为正', time_budget_seconds INT NOT NULL COMMENT '一次调度允许占用的执行时长,必须为正', min_request_interval_ms INT NOT NULL COMMENT '同账号请求最小间隔,按已核准配额配置', api_budget_json JSON NULL COMMENT '账号所有采集族共用的预算、统计日、保守预留及确认消耗、尝试许可和独占交接依据', api_cooldown_until_utc DATETIME(3) NULL COMMENT '账号全部真实请求共用冷却UTC截止,重启与跨日不清除', api_pause_reason VARCHAR(64) NULL COMMENT '账号停止或等待的固定原因码,不保存供应商原始错误或凭据', PRIMARY KEY (id), UNIQUE KEY uk_selfop_discovery_account (source_account), CONSTRAINT chk_selfop_outbound_discovery_scope CHECK (request_budget > 0 AND time_budget_seconds > 0 AND min_request_interval_ms > 0 AND fence_token >= 0 AND next_sequence > 0 AND next_observation_sequence > 0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='账号共享出库目录与详情发现协调作用域'; CREATE TABLE ll_selfop_sync_scope ( id BIGINT NOT NULL COMMENT '应用生成的记录标识', created_at DATETIME(3) NOT NULL COMMENT 'UTC创建时间', updated_at DATETIME(3) NOT NULL COMMENT 'UTC更新时间', source_account VARCHAR(64) NOT NULL COMMENT '受控来源账号别名,不保存密钥', warehouse_code VARCHAR(64) NOT NULL COMMENT '来源仓库原始编码,按仓独立统计', data_family VARCHAR(16) NOT NULL COMMENT 'OUTBOUND 或 INVENTORY;按账号+仓库+任务族互斥', scope_json JSON NOT NULL COMMENT '本仓范围规则,customerMode=ALL_AUTHORIZED,库存为全部品质;当前账号全部授权货主均自营,不将当天出现的货主列表当白名单', scope_hash CHAR(64) NOT NULL COMMENT '仓库、货主范围规则、品质、时区及单位口径的规范化摘要;不包含当天观测到的客户/SKU 集合', business_timezone VARCHAR(64) NOT NULL COMMENT '本仓报表及调度时区,初始建议值为 Asia/Shanghai,各仓独立核准', source_timezone VARCHAR(64) NULL COMMENT '本仓已核准的出库源时间时区', schedule_cron VARCHAR(128) NOT NULL COMMENT '本仓、本任务族的调度表达式,按 business_timezone 执行', stale_after_seconds INT NOT NULL COMMENT '本仓、本任务族数据过期阈值,必须为正;库存初始可采用 26 小时,后续按仓调整', warehouse_policy_ref VARCHAR(128) NULL COMMENT '未来按仓告警/补货策略的稳定引用;一期为空,不建告警规则表', initial_from_utc DATETIME(3) NULL COMMENT '首采固定UTC下界,按本仓业务时区减一个月', initial_until_utc DATETIME(3) NULL COMMENT '首采固定UTC截止,重试不重新取当前时间', discovery_from_utc DATETIME(3) NULL COMMENT '本仓已发布的连续销量覆盖UTC下界', discovery_until_utc DATETIME(3) NULL COMMENT '本仓已发布的连续销量覆盖UTC上界,不含端点', fact_revision BIGINT NOT NULL DEFAULT 0 COMMENT '出库事实归并修订号;内容实际变化才增加', published_fact_revision BIGINT NOT NULL DEFAULT 0 COMMENT '本仓最后已发布销量版所使用的事实修订号', rebuild_required TINYINT NOT NULL DEFAULT 0 COMMENT '事实变化待重建标记;跨仓修订同时置旧、新仓为 1', invalidated_at_utc DATETIME(3) NULL COMMENT '最近一次因事实修订使当前版待重建的时刻', published_run_id BIGINT NULL COMMENT '唯一对外可见版本,指向本任务族已发布执行批次', lease_owner VARCHAR(128) NULL COMMENT '当前执行者令牌,不使用仅进程内锁', lease_until_utc DATETIME(3) NULL COMMENT '租约到期时刻', fence_token BIGINT NOT NULL DEFAULT 0 COMMENT '每次取得租约递增,事实提交和发布均校验', known_order_cursor_id BIGINT NULL COMMENT '本仓已可靠处理的稳定订单内部标识游标', known_order_round_max_id BIGINT NULL COMMENT '本轮已知单复查固定最大内部标识', known_order_round_started_at_utc DATETIME(3) NULL COMMENT '本仓已知单复查轮次开始UTC时间', known_order_round_finished_at_utc DATETIME(3) NULL COMMENT '本仓已知单完整轮转完成UTC时间', history_round_from_utc DATETIME(3) NULL COMMENT '本仓历史核对固定UTC下界', history_round_until_utc DATETIME(3) NULL COMMENT '本仓历史核对固定UTC上界', history_slice_cursor_utc DATETIME(3) NULL COMMENT '本仓下一待核对历史切片UTC位置', history_round_finished_at_utc DATETIME(3) NULL COMMENT '上一轮历史时间片全部完成时刻', review_request_budget INT NOT NULL COMMENT '本仓单次复查最大请求数,必须为正', review_time_budget_seconds INT NOT NULL COMMENT '本仓单次复查最大执行秒数,必须为正', review_target_days INT NOT NULL DEFAULT 7 COMMENT '建议每 7 天轮转一遍,属于待配额验证的目标,不保证首次大量详情在单次调度内完成', PRIMARY KEY (id), UNIQUE KEY uk_selfop_scope (source_account,warehouse_code,data_family), KEY idx_selfop_scope_lease (lease_until_utc), CONSTRAINT chk_selfop_sync_scope CHECK (data_family IN ('OUTBOUND','INVENTORY') AND stale_after_seconds > 0 AND review_request_budget > 0 AND review_time_budget_seconds > 0 AND review_target_days > 0 AND fact_revision >= 0 AND published_fact_revision >= 0 AND fence_token >= 0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='分仓任务族租约及发布指针'; CREATE TABLE ll_selfop_sync_task ( id BIGINT NOT NULL COMMENT '应用生成的记录标识', created_at DATETIME(3) NOT NULL COMMENT 'UTC创建时间', updated_at DATETIME(3) NOT NULL COMMENT 'UTC更新时间', task_no VARCHAR(64) NOT NULL COMMENT '稳定采集业务任务号,重试沿用,不展示内部数据库标识', execution_purpose VARCHAR(16) NOT NULL COMMENT 'BUSINESS或VALIDATION;由服务端冻结用途,子任务继承', validation_root_task_id BIGINT NULL COMMENT '验证会话唯一预算根任务,根引用自身,正式任务为空', validation_budget_json JSON NULL COMMENT '验证根冻结硬预算、累计消耗、库存分仓页数、截止时刻及停止原因', business_root_task_id BIGINT NULL COMMENT '测试人工正式采集共享预算根任务;生产任务为空', business_budget_json JSON NULL COMMENT '仅测试正式采集根保存冻结请求上限、截止时间、消耗及停止原因', source_account VARCHAR(64) NOT NULL COMMENT '受控来源账号别名,不保存密钥', task_role VARCHAR(24) NOT NULL COMMENT 'ACCOUNT_DISCOVERY 或 WAREHOUSE_SYNC', scope_id BIGINT NULL COMMENT '分仓任务必须引用分仓作用域;仅账号共享发现为空', warehouse_code VARCHAR(64) NULL COMMENT '来源仓库原始编码,按仓独立统计', discovery_scope_id BIGINT NULL COMMENT '共享发现必填,引用账号发现协调器', upstream_task_id BIGINT NULL COMMENT '出库分仓任务引用已持久化目录的共享发现切片;库存无此上游', discovery_sequence BIGINT NULL COMMENT '共享任务及分仓子任务继承的调度顺序;重试保持不变,不用于事实覆盖判定', observation_baseline BIGINT NULL COMMENT '共享任务建立时已分配的最大详情采集代次,分仓子任务继承;用于识别旧任务恢复期间出现的其他任务新观测', request_key VARCHAR(128) NOT NULL COMMENT '共享发现包含切片/计划槽位;分仓任务包含仓库、任务族及切片或计划槽位;人工附请求幂等键', request_hash CHAR(64) NOT NULL COMMENT '请求类型、查询范围、范围摘要的指纹;同键不同请求拒绝', task_type VARCHAR(24) NOT NULL COMMENT '计划、补采、复核、重建与验证;INVENTORY_FLOW_HISTORY为流水片,INVENTORY_HISTORY_BUILD为本地历史还原', planned_at_utc DATETIME(3) NULL COMMENT '计划时点;人工请求可空', query_from_utc DATETIME(3) NULL COMMENT '出库查询区间UTC下界,库存不填', query_until_utc DATETIME(3) NULL COMMENT '出库查询区间UTC上界,不含端点,库存不填', query_scope_json JSON NOT NULL COMMENT '不变的账号、货主、仓库、品质和查询条件快照;按单补查在此记录单号', routing_manifest_json JSON NULL COMMENT '共享切片目录完整标记、每仓对象键集合/数量和详情就绪状态;各对象记录 effectiveStageId,需新代次复查时记录 refreshTaskId,完成后指向新有效暂存;不改写旧载荷', scope_hash CHAR(64) NOT NULL COMMENT '建任务时的业务范围摘要', status VARCHAR(20) NOT NULL COMMENT 'WAITING_SOURCE、READY、RUNNING、RETRY_WAIT、SUCCEEDED、DEAD、SAMPLE_DONE;样本结束不等于正式成功', apply_state VARCHAR(20) NOT NULL COMMENT '正式出库归并NOT_STARTED、APPLYING、BLOCKED、APPLIED;共享发现、库存、重建及验证为NOT_APPLICABLE', affected_warehouse_codes_json JSON NULL COMMENT '本次归并可能改变的仓集合,包含原仓与新仓;首段事实写入前登记,扩大集合须先取得新增仓租约并锁 scope,不能写完再补', apply_started_at_utc DATETIME(3) NULL COMMENT '首段事实提交UTC时间', apply_completed_at_utc DATETIME(3) NULL COMMENT '全部必需事实归并完成UTC时间,失败不填', attempt_count INT NOT NULL DEFAULT 0 COMMENT '已创建的执行尝试数', next_retry_at_utc DATETIME(3) NULL COMMENT '有限退避后下一次可执行时刻', requested_by VARCHAR(128) NULL COMMENT '人工请求的平台操作人,仅内部审计', result_published_run_id BIGINT NULL COMMENT '正式成功任务实际发布或复用的版本;验证和共享发现为空', progress_json JSON NULL COMMENT '与可靠检查点一起提交的有界阶段、单位、尝试和质量进度,不保存单据集合', progress_updated_at_utc DATETIME(3) NULL COMMENT '最后可靠业务检查点UTC时间,与执行心跳分开', PRIMARY KEY (id), UNIQUE KEY uk_selfop_task_no (task_no), UNIQUE KEY uk_selfop_task_request (source_account,request_key), KEY idx_selfop_task_poll (status,next_retry_at_utc,id), KEY idx_selfop_task_upstream (upstream_task_id,warehouse_code), KEY idx_selfop_task_apply (apply_state,id), KEY idx_selfop_task_scope_list (scope_id,created_at,id), KEY idx_selfop_task_account_list (source_account,task_role,created_at,id), KEY idx_selfop_task_business_root (business_root_task_id,status,id), CONSTRAINT chk_selfop_business_budget CHECK ((business_root_task_id IS NULL AND business_budget_json IS NULL) OR (execution_purpose='BUSINESS' AND business_root_task_id IS NOT NULL AND ((business_root_task_id=id AND business_budget_json IS NOT NULL) OR (business_root_task_id<>id AND business_budget_json IS NULL)))), CONSTRAINT chk_selfop_sync_task CHECK (attempt_count >= 0 AND execution_purpose IN ('BUSINESS','VALIDATION') AND ((execution_purpose = 'BUSINESS' AND validation_root_task_id IS NULL AND validation_budget_json IS NULL) OR (execution_purpose = 'VALIDATION' AND validation_root_task_id IS NOT NULL AND apply_state = 'NOT_APPLICABLE' AND result_published_run_id IS NULL AND status <> 'SUCCEEDED')) AND ((task_role = 'ACCOUNT_DISCOVERY' AND scope_id IS NULL AND warehouse_code IS NULL AND discovery_scope_id IS NOT NULL) OR (task_role = 'WAREHOUSE_SYNC' AND scope_id IS NOT NULL AND warehouse_code IS NOT NULL))) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='一次计划或人工请求'; CREATE TABLE ll_selfop_sync_run ( id BIGINT NOT NULL COMMENT '应用生成的记录标识', created_at DATETIME(3) NOT NULL COMMENT 'UTC创建时间', updated_at DATETIME(3) NOT NULL COMMENT 'UTC更新时间', task_id BIGINT NOT NULL COMMENT '本次执行请求', execution_purpose VARCHAR(16) NOT NULL COMMENT '从逻辑任务冻结继承,验证尝试不能作为正式统计版本', scope_id BIGINT NULL COMMENT '仅账号共享发现为空;分仓执行必须有作用域', source_account VARCHAR(64) NOT NULL COMMENT '受控来源账号别名,不保存密钥', warehouse_code VARCHAR(64) NULL COMMENT '来源仓库原始编码,按仓独立统计', run_role VARCHAR(24) NOT NULL COMMENT 'ACCOUNT_DISCOVERY 或 WAREHOUSE_SYNC', upstream_task_id BIGINT NULL COMMENT '分仓出库计算引用的共享切片及其稳定暂存集合', attempt_no INT NOT NULL COMMENT '同一请求从 1 起递增', scope_hash CHAR(64) NOT NULL COMMENT '本版本的业务范围摘要', scope_snapshot_json JSON NOT NULL COMMENT '分仓版只含本仓货主/品质、固定首采 [B,E0)、时区、调度与过期阈值;账号发现保存待路由仓集合,不冒充业务版', observed_dimensions_json JSON NULL COMMENT '本次实际出现的仓库/货主集合及数量摘要,仅作采集证据;例如已观测 70 货主不等于固定授权范围', fence_token BIGINT NOT NULL COMMENT '本尝试持有的栅栏版本', base_published_run_id BIGINT NULL COMMENT '执行开始时的上一可见版本', reference_sales_run_id BIGINT NULL COMMENT '库存构建开始时固定的本仓已发布销量版,用其不可变 SKU 维度生成出库已知商品占位;没有已发布销量版时为空,不读取半归并订单事实', inventory_daily_sample_date DATE NULL COMMENT '北京时间当日首个合格计划库存发布代表日期,非代表为空', inventory_sample_rule_version VARCHAR(32) NULL COMMENT '日库存代表选择规则 DAILY_SCHEDULED_FIRST_V1,与日标记原子保存', status VARCHAR(24) NOT NULL COMMENT 'FETCHING、VALIDATED、ROUTED、FACTS_APPLIED、BUILDING、READY、PUBLISHED、REUSED、YIELDED、FAILED、ABORTED、SAMPLE_DONE;复用和验证不是版本头', last_phase VARCHAR(24) NOT NULL COMMENT '失败/中止前所在阶段,支持判断是否已经归并事实', fetch_started_at_utc DATETIME(3) NULL COMMENT '实际采集开始UTC时间', fetch_finished_at_utc DATETIME(3) NULL COMMENT '实际采集完成UTC时间,未完成为空', build_started_at_utc DATETIME(3) NULL COMMENT '实际开始有界候选构建UTC时间,用于构建耗时及首采合并间隔', warehouse_daily_ready TINYINT NOT NULL DEFAULT 0 COMMENT '仓库日汇总已完整构建并校验,含完整空版本', finished_at_utc DATETIME(3) NULL COMMENT '本次尝试终止UTC时间', published_at_utc DATETIME(3) NULL COMMENT '实际原子切换发布指针UTC时间', superseded_at_utc DATETIME(3) NULL COMMENT '被新发布版替代的首次UTC时间,同事务填写且重试不重置', page_count INT NOT NULL DEFAULT 0 COMMENT '已完整获取页数', source_total_count BIGINT NULL COMMENT '上游可靠返回的总数;未返回则为空', unique_object_count BIGINT NOT NULL DEFAULT 0 COMMENT '规范化去重后对象数', progress_snapshot_json JSON NULL COMMENT '尝试终止时冻结的有界可靠进度摘要,历史尝试不随逻辑任务改写', heartbeat_at_utc DATETIME(3) NULL COMMENT '有效执行者最新UTC心跳,不代表业务检查点推进', coverage_status VARCHAR(16) NOT NULL COMMENT 'UNKNOWN、PARTIAL、COMPLETE;分页完整与数值有效性分别判断', covered_from_utc DATETIME(3) NULL COMMENT '本仓销量版本实际连续覆盖UTC下界', covered_until_utc DATETIME(3) NULL COMMENT '本仓销量版本实际连续覆盖UTC上界,不含端点', complete_day_from DATE NULL COMMENT '本仓完整自然日区间首日,包含', complete_day_until DATE NULL COMMENT '本仓完整自然日区间末日,不含', applied_fact_revision BIGINT NULL COMMENT '本次尝试归并后的事实修订号,库存为空', calculated_fact_revision BIGINT NULL COMMENT '候选销量版本计算所依据的固定事实修订号', error_code VARCHAR(64) NULL COMMENT '内部可诊断错误分类,不保存认证信息', error_message VARCHAR(500) NULL COMMENT '脱敏后的固定错误摘要', PRIMARY KEY (id), UNIQUE KEY uk_selfop_run_attempt (task_id,attempt_no), UNIQUE KEY uk_selfop_inventory_daily (source_account,warehouse_code,inventory_daily_sample_date), KEY idx_selfop_run_scope (scope_id,id), KEY idx_selfop_run_status (status,updated_at), CONSTRAINT chk_selfop_inventory_daily CHECK ((inventory_daily_sample_date IS NULL AND inventory_sample_rule_version IS NULL) OR (inventory_daily_sample_date IS NOT NULL AND inventory_sample_rule_version IS NOT NULL AND inventory_sample_rule_version = 'DAILY_SCHEDULED_FIRST_V1' AND execution_purpose = 'BUSINESS' AND run_role = 'WAREHOUSE_SYNC' AND status = 'PUBLISHED' AND coverage_status = 'COMPLETE')), CONSTRAINT chk_selfop_sync_run CHECK (attempt_no > 0 AND page_count >= 0 AND unique_object_count >= 0 AND execution_purpose IN ('BUSINESS','VALIDATION') AND (execution_purpose <> 'VALIDATION' OR status NOT IN ('PUBLISHED','REUSED')) AND (source_total_count IS NULL OR source_total_count >= 0) AND ((run_role = 'ACCOUNT_DISCOVERY' AND scope_id IS NULL AND warehouse_code IS NULL) OR (run_role = 'WAREHOUSE_SYNC' AND scope_id IS NOT NULL AND warehouse_code IS NOT NULL))) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='执行尝试、覆盖证明和版本头'; CREATE TABLE ll_selfop_sync_stage ( id BIGINT NOT NULL COMMENT '应用生成的记录标识', created_at DATETIME(3) NOT NULL COMMENT 'UTC创建时间', updated_at DATETIME(3) NOT NULL COMMENT 'UTC更新时间', run_id BIGINT NOT NULL COMMENT '首次写入该暂存对象的执行尝试', stage_batch_id BIGINT NOT NULL COMMENT '出库取共享发现 task.id,便于断点续取;库存取本次 run.id,严禁跨尝试混页', last_fetch_run_id BIGINT NOT NULL COMMENT '最后一次补齐该对象的执行尝试,保留重试来源', observation_sequence BIGINT NULL COMMENT '该完整出库详情实际请求的采集代次;有效出库对象必填,目录待补对象和库存为空;不能填 task 调度序号', warehouse_code VARCHAR(64) NOT NULL COMMENT '来源仓库原始编码,按仓独立统计', previous_warehouse_code VARCHAR(64) NULL COMMENT '路由时从已有单据识别的原仓库;归并前再校验,跨仓时通知两仓', object_type VARCHAR(16) NOT NULL COMMENT 'OUTBOUND_ORDER 或 PRODUCT_STOCK', object_key_hash CHAR(64) NOT NULL COMMENT '规范化业务键摘要;原业务键保留在载荷中并核对', first_page_no INT NOT NULL COMMENT '首次发现页码', observed_at_utc DATETIME(3) NOT NULL COMMENT '实际接收该对象的时刻', content_hash CHAR(64) NOT NULL COMMENT '完整规范化对象摘要', payload_json JSON NOT NULL COMMENT '目录阶段可先存订单头,详情齐后补完整 SKU;VALID 后不再修改;库存保存产品库存字段', before_payload_json JSON NULL COMMENT '订单归并事务内记录归并前的完整规范化事实;新增单为空', validation_status VARCHAR(16) NOT NULL COMMENT '暂存校验状态:PENDING待核验、VALID有效、INVALID异常', validation_code VARCHAR(64) NULL COMMENT '字段缺失、冲突、未知时区等原因', PRIMARY KEY (id), UNIQUE KEY uk_selfop_stage_object (stage_batch_id,object_type,object_key_hash), KEY idx_selfop_stage_history (object_type,object_key_hash,stage_batch_id), KEY idx_selfop_stage_observation (object_type,object_key_hash,validation_status,observation_sequence), KEY idx_selfop_stage_fact_observation (observation_sequence,warehouse_code,object_type,validation_status,run_id,observed_at_utc), KEY idx_selfop_stage_route (stage_batch_id,warehouse_code,validation_status), CONSTRAINT chk_selfop_sync_stage CHECK (first_page_no > 0 AND (object_type <> 'OUTBOUND_ORDER' OR validation_status <> 'VALID' OR observation_sequence IS NOT NULL)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='待验证事实与修订证据'; CREATE TABLE ll_selfop_outbound_order ( id BIGINT NOT NULL COMMENT '应用生成的记录标识', created_at DATETIME(3) NOT NULL COMMENT 'UTC创建时间', updated_at DATETIME(3) NOT NULL COMMENT 'UTC更新时间', source_account VARCHAR(64) NOT NULL COMMENT '受控来源账号别名,不保存密钥', customer_code VARCHAR(64) NOT NULL COMMENT '领星货主原始编码,不等同平台客户标识', warehouse_code VARCHAR(64) NOT NULL COMMENT '来源仓库原始编码,按仓独立统计', delivery_no VARCHAR(128) NOT NULL COMMENT 'OMP 发货单号,采用列表及详情同一身份', source_no VARCHAR(128) NULL COMMENT 'WMS 来源出库单号,缺失不以内部 ID 回退展示', source_status INT NOT NULL COMMENT '原始状态,100 已出库、99 已取消;不改造成内部状态码', source_created_time VARCHAR(64) NULL COMMENT '来源创建时间原始字符串,不使用采集时间替代', source_outbound_time VARCHAR(64) NULL COMMENT '来源实际出库时间原始字符串,不使用采集时间替代', source_timezone VARCHAR(64) NULL COMMENT '解析采用的源时区', outbound_at_utc DATETIME(3) NULL COMMENT '已核准的实际出库时间点;非出库状态可空', business_date DATE NULL COMMENT '已核准业务时区下的出库日', business_timezone VARCHAR(64) NOT NULL COMMENT '该事实当前归属仓所用业务时区,迁仓后重新确定业务日', sales_eligible TINYINT NOT NULL DEFAULT 0 COMMENT '仅已出库、时间与全部数量有效时为 1', revision_no BIGINT NOT NULL DEFAULT 1 COMMENT '该单内容变更次数,不等于拉取次数', content_hash CHAR(64) NOT NULL COMMENT '订单头及完整 SKU 明细规范化摘要', last_run_id BIGINT NOT NULL COMMENT '最后一次确认或修订的执行尝试', last_observation_sequence BIGINT NOT NULL COMMENT '最后接受的完整详情采集代次;仅防旧观测重放,不按 task 调度序号拒绝较晚实际读取的事实,不冒充领星源版本号', PRIMARY KEY (id), UNIQUE KEY uk_selfop_order (source_account,customer_code,delivery_no), KEY idx_selfop_order_daily (source_account,warehouse_code,sales_eligible,business_date,id), KEY idx_selfop_order_run (last_run_id), CONSTRAINT chk_selfop_outbound_order CHECK (revision_no > 0 AND last_observation_sequence > 0 AND sales_eligible IN (0,1) AND (sales_eligible = 0 OR (source_status = 100 AND source_timezone IS NOT NULL AND outbound_at_utc IS NOT NULL AND business_date IS NOT NULL))) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='最后确认的单据事实'; CREATE TABLE ll_selfop_outbound_item ( id BIGINT NOT NULL COMMENT '应用生成的记录标识', created_at DATETIME(3) NOT NULL COMMENT 'UTC创建时间', updated_at DATETIME(3) NOT NULL COMMENT 'UTC更新时间', order_id BIGINT NOT NULL COMMENT '对应外部出库事实', sku_code VARCHAR(128) NOT NULL COMMENT '原始 productSku', product_name VARCHAR(255) NULL COMMENT '来源商品名称,仅作展示', actual_quantity DECIMAL(20,6) NOT NULL COMMENT '详情 actualDeliveryQty,必须为非负有效数值', quantity_unit VARCHAR(32) NOT NULL COMMENT '已核准业务单位;未确认单位不发布正式数量统计', PRIMARY KEY (id), UNIQUE KEY uk_selfop_order_sku (order_id,sku_code), KEY idx_selfop_item_sku (sku_code,order_id), CONSTRAINT chk_selfop_outbound_item CHECK (actual_quantity >= 0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='整单替换的实际出库明细'; CREATE TABLE ll_selfop_inventory_snapshot ( id BIGINT NOT NULL COMMENT '应用生成的记录标识', created_at DATETIME(3) NOT NULL COMMENT 'UTC创建时间', updated_at DATETIME(3) NOT NULL COMMENT 'UTC更新时间', snapshot_run_id BIGINT NOT NULL COMMENT 'INVENTORY 执行尝试;发布后该批明细不可修改', source_account VARCHAR(64) NOT NULL COMMENT '受控来源账号别名,不保存密钥', customer_code VARCHAR(64) NOT NULL COMMENT '领星货主原始编码,不等同平台客户标识', warehouse_code VARCHAR(64) NOT NULL COMMENT '来源仓库原始编码,按仓独立统计', sku_code VARCHAR(128) NOT NULL COMMENT '原始产品 SKU', product_quality SMALLINT NOT NULL COMMENT '来源品质,当前 0 正品、1 次品;全量均保存,不套用整箱库存', product_name VARCHAR(255) NULL COMMENT '来源名称', physical_quantity DECIMAL(20,6) NULL COMMENT '来源stkQty实物库存,未知为空', available_quantity DECIMAL(20,6) NULL COMMENT '来源useStkQty可用库存,未知为空,不再次扣冻结', frozen_quantity DECIMAL(20,6) NULL COMMENT '来源freezeQty冻结库存,未知为空', transit_quantity DECIMAL(20,6) NULL COMMENT '来源transitQty在途数量,未知为空,不计可售库存', source_unique_key VARCHAR(512) NULL COMMENT '原 uniqueKey4tenant,只作来源证据', observed_at_utc DATETIME(3) NOT NULL COMMENT '所在页实际采集时间;缺行占位取本批采集完成时间', quality_status VARCHAR(16) NOT NULL COMMENT 'VALID、UNKNOWN、INVALID;STALE 按批次年龄实时派生', quality_reason VARCHAR(64) NULL COMMENT 'SOURCE_ROW_MISSING、FIELD_MISSING、NEGATIVE_QUANTITY 等', PRIMARY KEY (id), UNIQUE KEY uk_selfop_stock_snapshot (snapshot_run_id,source_account,customer_code,warehouse_code,sku_code,product_quality), KEY idx_selfop_stock_lookup (source_account,customer_code,warehouse_code,sku_code,product_quality,snapshot_run_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='产品库存全量批次明细'; CREATE TABLE ll_selfop_sku_daily_sales ( id BIGINT NOT NULL COMMENT '应用生成的记录标识', created_at DATETIME(3) NOT NULL COMMENT 'UTC创建时间', updated_at DATETIME(3) NOT NULL COMMENT 'UTC更新时间', sales_run_id BIGINT NOT NULL COMMENT 'OUTBOUND 执行尝试,同时是计算版本', source_account VARCHAR(64) NOT NULL COMMENT '受控来源账号别名,不保存密钥', customer_code VARCHAR(64) NOT NULL COMMENT '领星货主原始编码,不等同平台客户标识', warehouse_code VARCHAR(64) NOT NULL COMMENT '来源仓库原始编码,按仓独立统计', sku_code VARCHAR(128) NOT NULL COMMENT '原始产品 SKU', business_date DATE NOT NULL COMMENT '已核准业务日', outbound_quantity DECIMAL(20,6) NOT NULL COMMENT '有效出库实际件数之和,非负', outbound_order_count BIGINT NOT NULL COMMENT '该维度去重发货单数,非负', quantity_unit VARCHAR(32) NOT NULL COMMENT '同一统计维度内一致的业务单位', PRIMARY KEY (id), UNIQUE KEY uk_selfop_daily_version (sales_run_id,source_account,customer_code,warehouse_code,sku_code,business_date), KEY idx_selfop_daily_window_cover (sales_run_id,source_account,warehouse_code,business_date,customer_code,sku_code,outbound_quantity,outbound_order_count,quantity_unit), KEY idx_selfop_daily_sku_cover (sales_run_id,source_account,warehouse_code,customer_code,sku_code,business_date,outbound_quantity,outbound_order_count,quantity_unit), CONSTRAINT chk_selfop_sku_daily_sales CHECK (outbound_quantity >= 0 AND outbound_order_count >= 0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='完整销量版本的稀疏日事实'; CREATE TABLE ll_selfop_warehouse_daily_sales ( sales_run_id BIGINT NOT NULL COMMENT '完整销量计算版本标识', source_account VARCHAR(64) NOT NULL COMMENT '受控来源账号别名,不保存密钥', warehouse_code VARCHAR(64) NOT NULL COMMENT '来源仓库原始编码', business_date DATE NOT NULL COMMENT '已核准业务日', observed_quantity DECIMAL(38,6) NULL COMMENT '该日PCS非负有效出库量之和,无有效行时为空', invalid_row_count BIGINT NOT NULL COMMENT '该日数量为空或负数或单位非PCS的日事实行数', source_row_count BIGINT NOT NULL COMMENT '该日参与仓库汇总的SKU日事实总行数', created_at DATETIME(3) NOT NULL COMMENT 'UTC创建时间', updated_at DATETIME(3) NOT NULL COMMENT 'UTC更新时间', PRIMARY KEY (sales_run_id,source_account,warehouse_code,business_date), CONSTRAINT chk_selfop_warehouse_daily_sales CHECK (source_row_count > 0 AND invalid_row_count >= 0 AND invalid_row_count <= source_row_count AND (observed_quantity IS NULL OR observed_quantity >= 0)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='完整销量版本按仓按日汇总,随SKU日事实批次原子构建'; CREATE TABLE ll_selfop_sku_profile ( id BIGINT NOT NULL COMMENT '应用生成的记录标识', created_at DATETIME(3) NOT NULL COMMENT 'UTC创建时间', updated_at DATETIME(3) NOT NULL COMMENT 'UTC更新时间', profile_run_id BIGINT NOT NULL COMMENT '本仓销量或库存候选版本;与对应 daily/snapshot 使用同一 run,发布后该版本全部维度行不可修改', source_account VARCHAR(64) NOT NULL COMMENT '受控来源账号别名,不保存密钥', customer_code VARCHAR(64) NOT NULL COMMENT '领星货主原始编码,不等同平台客户标识', warehouse_code VARCHAR(64) NOT NULL COMMENT '来源仓库原始编码,按仓独立统计', sku_code VARCHAR(128) NOT NULL COMMENT '原始产品 SKU', product_name VARCHAR(255) NULL COMMENT '本版本确认的名称,不实时连接其他版本名称', quantity_unit VARCHAR(32) NULL COMMENT '本版本已核准单位;未知或两版本单位冲突时不计算混合指标', first_seen_at_utc DATETIME(3) NULL COMMENT '本证据族真实观测到本仓商品的最早接收时刻;缺行占位不能生成观察证据', earliest_evidence_at_utc DATETIME(3) NULL COMMENT '库存版取真实库存首次观察时刻;销量版从该版有效事实重新求最早已核准出库时间,可随改期、取消或迁仓撤回/后移', evidence_type VARCHAR(24) NOT NULL COMMENT 'INVENTORY_OBSERVATION、VALID_OUTBOUND、NONE;不得将销量证据复制成库存真实观察证据', evidence_run_id BIGINT NULL COMMENT '本证据族真实依据的采集批次,无证据占位为空', last_seen_run_id BIGINT NULL COMMENT '本证据族最近真实观测批次,无证据占位为空', PRIMARY KEY (id), UNIQUE KEY uk_selfop_profile_version (profile_run_id,source_account,customer_code,warehouse_code,sku_code), KEY idx_selfop_profile_evidence (profile_run_id,earliest_evidence_at_utc,customer_code,sku_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='随发布版本固定的 SKU 维度与观察依据'; CREATE TABLE ll_appointment_impact ( container_booking_id VARCHAR(64) NOT NULL COMMENT '稳定柜次关联键,不作业务编号展示', impact_no VARCHAR(40) NOT NULL COMMENT '船期核对事项业务号', baseline_json LONGTEXT NOT NULL COMMENT '已核对基准或首次变化前观察,原来源时间口径', latest_json LONGTEXT NOT NULL COMMENT '最新已读取观察,未知可为JSON null', forecast_token CHAR(64) NOT NULL COMMENT '最新观察摘要,处理时防止旧预测结案', status VARCHAR(20) NOT NULL COMMENT '事项状态:MONITORING监测/OPEN待处理/RESOLVED已完成', reason VARCHAR(64) NULL COMMENT '预测变化或资料待核实原因', owner_id VARCHAR(128) NULL COMMENT '认领平台人员ID', owner_name VARCHAR(200) NULL COMMENT '负责人姓名快照', version INT NOT NULL COMMENT '观察及人工处理共同版本', updated_at DATETIME(3) NOT NULL COMMENT 'UTC更新时间', PRIMARY KEY (container_booking_id), UNIQUE KEY uk_appointment_impact_no (impact_no), KEY idx_appointment_impact_work (status,updated_at), CONSTRAINT chk_appointment_impact_status CHECK (status IN ('MONITORING','OPEN','RESOLVED')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='一柜一个稳定船期变化核对事项,不改写预约或运输'; CREATE TABLE ll_appointment_impact_history ( id BIGINT NOT NULL COMMENT '历史记录标识', container_booking_id VARCHAR(64) NOT NULL COMMENT '关联柜次标识', version INT NOT NULL COMMENT '记录版本', action VARCHAR(20) NOT NULL COMMENT '操作类型:OBSERVED观察/CLAIM认领/RECORD记录/RESOLVE完成', operator_id VARCHAR(128) NOT NULL COMMENT '操作人标识', operator_name VARCHAR(200) NULL COMMENT '操作人姓名', result VARCHAR(1000) NULL COMMENT '人工处理结果;观察记录为空', next_action VARCHAR(500) NULL COMMENT '下一步处理事项', followup_date DATE NULL COMMENT '业务跟进日期', command_key VARCHAR(64) NULL COMMENT '人工命令幂等键;观察记录为空', request_hash CHAR(64) NULL COMMENT '请求内容摘要', response_json LONGTEXT NOT NULL COMMENT '该版本完整响应快照,支持精确重放', created_at DATETIME(3) NOT NULL COMMENT 'UTC记录时间', PRIMARY KEY (id), UNIQUE KEY uk_appointment_impact_version (container_booking_id,version), UNIQUE KEY uk_appointment_impact_command (container_booking_id,operator_id,command_key), CONSTRAINT fk_appointment_impact_history FOREIGN KEY (container_booking_id) REFERENCES ll_appointment_impact(container_booking_id), CONSTRAINT chk_appointment_impact_action CHECK (action IN ('OBSERVED','CLAIM','RECORD','RESOLVE')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='船期观察及人工处理追加历史'; CREATE TABLE ll_selfop_owner ( id BIGINT NOT NULL COMMENT '主键', run_id BIGINT NOT NULL COMMENT '完整资料采集版本', source_account VARCHAR(64) COLLATE utf8mb4_bin NOT NULL COMMENT '来源账号', customer_code VARCHAR(64) COLLATE utf8mb4_bin NOT NULL COMMENT '领星货主编码', customer_name VARCHAR(255) NULL COMMENT '领星货主名称', source_status VARCHAR(32) NULL COMMENT '来源启停状态', observed_at_utc DATETIME(6) NOT NULL COMMENT '资料观测时间', PRIMARY KEY (id), UNIQUE KEY uk_selfop_owner_version (run_id,source_account,customer_code), KEY idx_selfop_owner_lookup (source_account,customer_code,run_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自营领星货主资料版本'; CREATE TABLE ll_selfop_product ( id BIGINT NOT NULL COMMENT '主键', run_id BIGINT NOT NULL COMMENT '完整资料采集版本', source_account VARCHAR(64) COLLATE utf8mb4_bin NOT NULL COMMENT '来源账号', customer_code VARCHAR(64) COLLATE utf8mb4_bin NOT NULL COMMENT '领星货主编码', sku_code VARCHAR(128) COLLATE utf8mb4_bin NOT NULL COMMENT '货主商品编码', product_name VARCHAR(255) NULL COMMENT '商品名称', declared_length DECIMAL(24,6) NULL COMMENT '商品资料长度', declared_width DECIMAL(24,6) NULL COMMENT '商品资料宽度', declared_height DECIMAL(24,6) NULL COMMENT '商品资料高度', declared_size_unit VARCHAR(32) NULL COMMENT '商品资料尺寸单位', measured_length DECIMAL(24,6) NULL COMMENT '仓库实测长度', measured_width DECIMAL(24,6) NULL COMMENT '仓库实测宽度', measured_height DECIMAL(24,6) NULL COMMENT '仓库实测高度', measured_size_unit VARCHAR(32) NULL COMMENT '仓库实测尺寸单位', observed_at_utc DATETIME(6) NOT NULL COMMENT '资料观测时间', PRIMARY KEY (id), UNIQUE KEY uk_selfop_product_version (run_id,source_account,customer_code,sku_code), KEY idx_selfop_product_lookup (source_account,customer_code,sku_code,run_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自营领星商品资料版本'; CREATE TABLE ll_selfop_inventory_flow ( id BIGINT NOT NULL COMMENT '应用生成的流水记录标识', source_account VARCHAR(64) NOT NULL COMMENT '受控来源账号', warehouse_code VARCHAR(64) NOT NULL COMMENT '来源仓库编码', customer_code VARCHAR(64) NOT NULL COMMENT '来源货主编码', sku_code VARCHAR(128) NOT NULL COMMENT '来源商品编码', source_flow_id VARCHAR(64) NOT NULL COMMENT '来源流水字符串标识', product_quality INT NOT NULL COMMENT '来源品质,零正品一次品,其他未知', cell_no VARCHAR(128) NULL COMMENT '来源库位编码', inner_batch_no VARCHAR(128) NULL COMMENT '来源内部批次号', bill_no VARCHAR(128) NULL COMMENT '来源业务单号', source_no VARCHAR(128) NULL COMMENT '来源关联单号', bill_type VARCHAR(32) NULL COMMENT '来源业务类型,未验证类型不得参与正式还原', book_qty DECIMAL(20,6) NULL COMMENT '来源记账增减量,未知为空', book_change_qty_raw VARCHAR(64) NULL COMMENT '来源带符号变动量原文', delta_quantity DECIMAL(20,6) NULL COMMENT '解析后的有符号实物变动量', close_quantity DECIMAL(20,6) NULL COMMENT '对应库位批次品质链的结存', source_create_time VARCHAR(64) NULL COMMENT '来源北京时间原文', event_at_utc DATETIME(3) NULL COMMENT '流水发生UTC时刻,无法解析时为空', business_date DATE NULL COMMENT '北京时间业务日期', quantity_unit VARCHAR(16) NULL COMMENT '已确认数量单位,未知为空', content_hash CHAR(64) NOT NULL COMMENT '当前事实内容摘要', revision_no BIGINT NOT NULL COMMENT '同来源流水单调增加的修订号', stage_id BIGINT NOT NULL COMMENT '当前事实对应不可变暂存证据', first_run_id BIGINT NOT NULL COMMENT '首次观察执行尝试', last_run_id BIGINT NOT NULL COMMENT '最近确认执行尝试', last_observed_at DATETIME(3) NOT NULL COMMENT '最近观察UTC时刻', validation_status VARCHAR(16) NOT NULL COMMENT '字段资格,有效或未知', validation_reason VARCHAR(64) NULL COMMENT '数量或身份待核验原因', PRIMARY KEY (id), UNIQUE KEY uk_selfop_flow_source (source_account,warehouse_code,source_flow_id), KEY idx_selfop_flow_sku (source_account,warehouse_code,customer_code,sku_code,event_at_utc), KEY idx_selfop_flow_day (source_account,warehouse_code,business_date), CONSTRAINT chk_selfop_flow_revision CHECK (revision_no > 0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='自营历史库存流水最新事实,旧版本保留于暂存证据'; CREATE TABLE ll_selfop_inventory_day_version ( id BIGINT NOT NULL COMMENT '不可变历史日版本标识', source_account VARCHAR(64) NOT NULL COMMENT '受控来源账号', warehouse_code VARCHAR(64) NOT NULL COMMENT '来源仓库编码', business_date DATE NOT NULL COMMENT '北京时间日末所属日期', scope_hash CHAR(64) NOT NULL COMMENT '业务范围摘要', rule_version VARCHAR(32) NOT NULL COMMENT '日末库存还原规则版本', build_run_id BIGINT NOT NULL COMMENT '历史重建执行尝试', publication_group_id BIGINT NOT NULL COMMENT '必须一起切换的发布组标识', sales_run_id BIGINT NULL COMMENT '构建时固定的销量证据版本', anchor_run_id BIGINT NOT NULL COMMENT '固定的独立库存锚点版本', input_hash CHAR(64) NOT NULL COMMENT '冻结流水修订与覆盖及锚点输入摘要', evidence_json JSON NOT NULL COMMENT '固定输入清单及不可变证据引用', status VARCHAR(16) NOT NULL COMMENT '构建中、就绪、已发布、已替代或失败', head_slot TINYINT NULL COMMENT '当前日头为一,非当前版本为空', valid_sku_count BIGINT NOT NULL DEFAULT 0 COMMENT '合格商品数', unknown_sku_count BIGINT NOT NULL DEFAULT 0 COMMENT '待核验商品数', created_at DATETIME(3) NOT NULL COMMENT '版本创建UTC时刻', published_at DATETIME(3) NULL COMMENT '发布组提交UTC时刻', superseded_at DATETIME(3) NULL COMMENT '被新组替代的UTC时刻', invalidated_at DATETIME(3) NULL COMMENT '已确认输入失效的UTC时刻', invalidation_reason VARCHAR(64) NULL COMMENT '旧版本失效原因', rebuild_run_id BIGINT NULL COMMENT '处理失效版本的重建尝试', PRIMARY KEY (id), UNIQUE KEY uk_selfop_history_head (source_account,warehouse_code,business_date,head_slot), UNIQUE KEY uk_selfop_history_build_day (build_run_id,business_date), KEY idx_selfop_history_group (publication_group_id,status), CONSTRAINT chk_selfop_history_head CHECK (head_slot IS NULL OR (head_slot=1 AND status='PUBLISHED')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='历史日库存不可变版本及原子发布日头'; CREATE TABLE ll_selfop_inventory_daily ( day_version_id BIGINT NOT NULL COMMENT '所属历史日版本', customer_code VARCHAR(64) NOT NULL COMMENT '来源货主编码', sku_code VARCHAR(128) NOT NULL COMMENT '来源商品编码', product_quality INT NOT NULL COMMENT '来源库存品质', physical_quantity DECIMAL(20,6) NULL COMMENT '日末实物库存,未知为空,已确认零为零', quality_status VARCHAR(16) NOT NULL COMMENT '日末资格,有效或未知', quality_reason VARCHAR(64) NULL COMMENT '缺覆盖或锚点等未知原因', anchor_reference BIGINT NULL COMMENT '独立库存锚点版本', evidence_hash CHAR(64) NOT NULL COMMENT '该日计算证据摘要', source VARCHAR(32) NOT NULL COMMENT '库存来源标记,流水还原', PRIMARY KEY (day_version_id,customer_code,sku_code,product_quality), KEY idx_selfop_daily_identity (customer_code,sku_code,day_version_id), CONSTRAINT chk_selfop_daily_quantity CHECK ((quality_status='VALID' AND physical_quantity IS NOT NULL AND physical_quantity>=0) OR (quality_status='UNKNOWN' AND physical_quantity IS NULL)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='历史日末分货主商品品质实物库存';