feat(firstleg): add indivisible coload groups
This commit is contained in:
@@ -16411,6 +16411,57 @@ CREATE TABLE IF NOT EXISTS fl_customs_command(
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),completed_at DATETIME(3) NULL,PRIMARY KEY(id),
|
||||
UNIQUE KEY uk_customs_command(actor_id,action,idempotency_key),CONSTRAINT chk_customs_command_status CHECK(status IN('PROCESSING','SUCCESS'))
|
||||
)ENGINE=InnoDB COMMENT='整柜报关写命令幂等事实';
|
||||
-- 同柜且不可拆组:跨客户但同国内仓、渠道和目的仓港,整组锁定/解锁/消费。
|
||||
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 '物流渠道编码快照',
|
||||
destination_type VARCHAR(32) NOT NULL COMMENT '目的类型快照',destination_warehouse_id BIGINT UNSIGNED NULL COMMENT '目的仓ID快照',
|
||||
destination_code VARCHAR(64) 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,created_by_name VARCHAR(64) NULL,
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
|
||||
locked_by BIGINT UNSIGNED NULL,locked_by_name VARCHAR(64) NULL,locked_at DATETIME(3) NULL,
|
||||
consumed_by BIGINT UNSIGNED NULL,consumed_by_name VARCHAR(64) NULL,consumed_at DATETIME(3) NULL,
|
||||
cancelled_by BIGINT UNSIGNED NULL,cancelled_by_name VARCHAR(64) NULL,cancelled_at DATETIME(3) NULL,
|
||||
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_destination CHECK(destination_warehouse_id IS NOT NULL OR destination_code IS NOT NULL),
|
||||
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,group_id BIGINT UNSIGNED NOT NULL,tenant_id BIGINT UNSIGNED NOT NULL COMMENT '成员客户ID;允许跨客户成组',
|
||||
order_id BIGINT UNSIGNED NOT NULL,inbound_id BIGINT UNSIGNED NOT NULL,full_package_count INT UNSIGNED NOT NULL,
|
||||
active_flag TINYINT UNSIGNED NULL DEFAULT 1 COMMENT '当前约束唯一标识;取消或消费后置NULL',
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),closed_at DATETIME(3) NULL,
|
||||
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,group_id BIGINT UNSIGNED NOT NULL,action_type VARCHAR(16) NOT NULL,
|
||||
from_status VARCHAR(16) NULL,to_status VARCHAR(16) NOT NULL,plan_id BIGINT UNSIGNED NULL,
|
||||
operation_id VARCHAR(128) NOT NULL,remark VARCHAR(500) NULL,operator_id BIGINT UNSIGNED NOT NULL,operator_name VARCHAR(64) NULL,
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),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,actor_id BIGINT UNSIGNED NOT NULL,action_type VARCHAR(16) NOT NULL,
|
||||
idempotency_key VARCHAR(128) NOT NULL,request_hash CHAR(64) NOT NULL,command_status VARCHAR(16) NOT NULL,
|
||||
result_group_id BIGINT UNSIGNED NULL,created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),completed_at DATETIME(3) NULL,
|
||||
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='同柜不可拆组幂等写命令';
|
||||
|
||||
CALL baiyue_firstleg.assert_unified_final_schema();
|
||||
DROP PROCEDURE IF EXISTS baiyue_firstleg.assert_unified_final_schema;
|
||||
SELECT 'PASS' AS migration_status,
|
||||
|
||||
Reference in New Issue
Block a user