USE baiyue_firstleg; CREATE TABLE IF NOT EXISTS fl_coload_group ( id BIGINT UNSIGNED NOT NULL COMMENT '同柜不可拆组ID', group_no VARCHAR(40) NOT NULL COMMENT '稳定组号CLG-{id}', group_status VARCHAR(16) NOT NULL COMMENT '组状态:ACTIVE、LOCKED、CONSUMED、CANCELLED', warehouse_id BIGINT UNSIGNED NOT NULL COMMENT '国内收货仓ID快照', channel_code VARCHAR(64) NOT NULL COMMENT '物流渠道编码快照', locked_plan_id BIGINT UNSIGNED NULL COMMENT 'LOCKED/CONSUMED绑定装柜计划ID', version INT UNSIGNED NOT NULL DEFAULT 0 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_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', locked_by BIGINT UNSIGNED NULL COMMENT '锁定操作人ID', locked_by_name VARCHAR(64) NULL COMMENT '锁定操作人名称快照', locked_at DATETIME(3) NULL COMMENT '锁定时间', consumed_by BIGINT UNSIGNED NULL COMMENT '消费操作人ID', consumed_by_name VARCHAR(64) NULL COMMENT '消费操作人名称快照', consumed_at DATETIME(3) NULL COMMENT '消费完成时间', cancelled_by BIGINT UNSIGNED NULL COMMENT '取消操作人ID', cancelled_by_name VARCHAR(64) NULL COMMENT '取消操作人名称快照', cancelled_at DATETIME(3) NULL COMMENT '取消时间', PRIMARY KEY (id), UNIQUE KEY uk_coload_group_no (group_no), KEY idx_coload_group_status (group_status,updated_at,id), KEY idx_coload_group_plan (locked_plan_id,group_status), CONSTRAINT fk_coload_group_plan FOREIGN KEY (locked_plan_id) REFERENCES fl_loading_plan(id), CONSTRAINT chk_coload_group_status CHECK (group_status IN ('ACTIVE','LOCKED','CONSUMED','CANCELLED')), CONSTRAINT chk_coload_group_lock CHECK ( (group_status IN ('ACTIVE','CANCELLED') AND locked_plan_id IS NULL) OR (group_status IN ('LOCKED','CONSUMED') AND locked_plan_id IS NOT NULL)) ) ENGINE=InnoDB COMMENT='同柜且不可拆业务组聚合根'; CREATE TABLE IF NOT EXISTS fl_coload_group_member ( id BIGINT UNSIGNED NOT NULL COMMENT '组成员ID', group_id BIGINT UNSIGNED NOT NULL COMMENT '同柜不可拆组ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '成员客户ID;允许跨客户成组', order_id BIGINT UNSIGNED NOT NULL COMMENT '订单ID', inbound_id BIGINT UNSIGNED NOT NULL COMMENT '创建时权威入库单ID', full_package_count INT UNSIGNED NOT NULL COMMENT '必须整组分配的满箱数快照', active_flag TINYINT UNSIGNED NULL DEFAULT 1 COMMENT '当前约束唯一标识;取消或消费后置NULL', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '成员创建时间', closed_at DATETIME(3) NULL COMMENT '成员约束关闭时间', PRIMARY KEY (id), UNIQUE KEY uk_coload_group_member (group_id,inbound_id), UNIQUE KEY uk_coload_active_inbound (tenant_id,inbound_id,active_flag), KEY idx_coload_member_order (order_id,created_at,group_id), CONSTRAINT fk_coload_member_group FOREIGN KEY (group_id) REFERENCES fl_coload_group(id), CONSTRAINT fk_coload_member_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order(id), CONSTRAINT chk_coload_member_packages CHECK (full_package_count > 0), CONSTRAINT chk_coload_member_active CHECK (active_flag IS NULL OR active_flag = 1) ) ENGINE=InnoDB COMMENT='同柜不可拆组成员与满箱数快照'; CREATE TABLE IF NOT EXISTS fl_coload_group_history ( id BIGINT UNSIGNED NOT NULL COMMENT '状态历史ID', group_id BIGINT UNSIGNED NOT NULL COMMENT '同柜不可拆组ID', action_type VARCHAR(16) NOT NULL COMMENT '操作类型:CREATE、CANCEL、LOCK、UNLOCK、CONSUME', from_status VARCHAR(16) NULL COMMENT '变更前组状态', to_status VARCHAR(16) NOT NULL COMMENT '变更后组状态', plan_id BIGINT UNSIGNED NULL COMMENT '关联装柜计划ID', operation_id VARCHAR(128) NOT NULL COMMENT '稳定幂等操作ID', remark VARCHAR(500) NULL COMMENT '操作原因或备注', operator_id BIGINT UNSIGNED NOT NULL COMMENT '操作人ID', operator_name VARCHAR(64) NULL COMMENT '操作人名称快照', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '历史记录时间', PRIMARY KEY (id), UNIQUE KEY uk_coload_history_operation (group_id,action_type,operation_id), KEY idx_coload_history_group (group_id,created_at,id), CONSTRAINT fk_coload_history_group FOREIGN KEY (group_id) REFERENCES fl_coload_group(id), CONSTRAINT chk_coload_history_action CHECK ( action_type IN ('CREATE','CANCEL','LOCK','UNLOCK','CONSUME')) ) ENGINE=InnoDB COMMENT='同柜不可拆组不可变状态历史'; CREATE TABLE IF NOT EXISTS fl_coload_command ( id BIGINT UNSIGNED NOT NULL COMMENT '幂等命令ID', actor_id BIGINT UNSIGNED NOT NULL COMMENT '平台或内部操作人ID', action_type VARCHAR(16) NOT NULL COMMENT '命令动作类型', idempotency_key VARCHAR(128) NOT NULL COMMENT '幂等键', request_hash CHAR(64) NOT NULL COMMENT '请求摘要', command_status VARCHAR(16) NOT NULL COMMENT '命令状态:PROCESSING、SUCCESS', result_group_id BIGINT UNSIGNED NULL COMMENT '命令结果组ID', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '命令创建时间', completed_at DATETIME(3) NULL COMMENT '命令完成时间', PRIMARY KEY (id), UNIQUE KEY uk_coload_command (actor_id,action_type,idempotency_key), CONSTRAINT fk_coload_command_group FOREIGN KEY (result_group_id) REFERENCES fl_coload_group(id), CONSTRAINT chk_coload_command_status CHECK (command_status IN ('PROCESSING','SUCCESS')) ) ENGINE=InnoDB COMMENT='同柜不可拆组幂等写命令';