This commit is contained in:
2026-08-11 09:25:41 +08:00
parent 66b3a0cc9b
commit 540a6f5d88
18 changed files with 757 additions and 90 deletions
@@ -7282,7 +7282,7 @@ CREATE TABLE IF NOT EXISTS ord_order_fulfillment_split (
PRIMARY KEY(id),
UNIQUE KEY uk_order_split_operation (tenant_id,operation_id,split_role),
UNIQUE KEY uk_order_split_idempotency (tenant_id,parent_order_id,idempotency_key,split_role),
UNIQUE KEY uk_order_split_child (tenant_id,child_order_id),
UNIQUE KEY uk_order_split_child_role (tenant_id,child_order_id,split_role),
KEY idx_order_split_parent (tenant_id,parent_order_id,created_at,id),
KEY idx_order_split_source (tenant_id,source_order_id,split_role),
KEY idx_order_split_container (tenant_id,container_booking_id,created_at,id),
@@ -7294,6 +7294,8 @@ CREATE TABLE IF NOT EXISTS ord_order_fulfillment_split (
DROP TRIGGER IF EXISTS trg_ord_order_parent_insert;
DROP TRIGGER IF EXISTS trg_ord_order_parent_update;
DROP TRIGGER IF EXISTS trg_order_fulfillment_split_insert;
DROP TRIGGER IF EXISTS trg_order_fulfillment_split_update;
DELIMITER $$
CREATE TRIGGER trg_ord_order_parent_insert BEFORE INSERT ON ord_order FOR EACH ROW
BEGIN
@@ -7353,6 +7355,10 @@ BEGIN
AND table_name='ord_order_fulfillment_split' AND index_name='uk_order_split_idempotency') THEN
ALTER TABLE ord_order_fulfillment_split DROP INDEX uk_order_split_idempotency;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.statistics WHERE table_schema=DATABASE()
AND table_name='ord_order_fulfillment_split' AND index_name='uk_order_split_child') THEN
ALTER TABLE ord_order_fulfillment_split DROP INDEX uk_order_split_child;
END IF;
END$$
DELIMITER ;
CALL phase3_order_drop_split_index();
@@ -7361,6 +7367,36 @@ CALL phase3_order_add_index('ord_order_fulfillment_split','uk_order_split_operat
'UNIQUE KEY `uk_order_split_operation` (`tenant_id`,`operation_id`,`split_role`)');
CALL phase3_order_add_index('ord_order_fulfillment_split','uk_order_split_idempotency',
'UNIQUE KEY `uk_order_split_idempotency` (`tenant_id`,`parent_order_id`,`idempotency_key`,`split_role`)');
CALL phase3_order_add_index('ord_order_fulfillment_split','uk_order_split_child_role',
'UNIQUE KEY `uk_order_split_child_role` (`tenant_id`,`child_order_id`,`split_role`)');
DELIMITER $$
CREATE TRIGGER trg_order_fulfillment_split_insert
BEFORE INSERT ON ord_order_fulfillment_split FOR EACH ROW
BEGIN
IF NEW.split_role NOT IN ('LOADED','REMAINDER') THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='订单履约分片角色非法';
END IF;
IF NEW.split_role='LOADED' AND NEW.child_order_id<>NEW.source_order_id THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='实装台账必须由来源订单自身承接';
END IF;
IF NEW.split_role='REMAINDER'
AND (NEW.child_order_id=NEW.source_order_id OR NEW.remaining_package_count=0) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='余量台账必须指向有剩余数量的新子订单';
END IF;
END$$
CREATE TRIGGER trg_order_fulfillment_split_update
BEFORE UPDATE ON ord_order_fulfillment_split FOR EACH ROW
BEGIN
IF NOT (NEW.tenant_id<=>OLD.tenant_id)
OR NOT (NEW.parent_order_id<=>OLD.parent_order_id)
OR NOT (NEW.source_order_id<=>OLD.source_order_id)
OR NOT (NEW.child_order_id<=>OLD.child_order_id)
OR NOT (NEW.split_role<=>OLD.split_role) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='订单履约分片来源、子片与角色不可修改';
END IF;
END$$
DELIMITER ;
DROP PROCEDURE IF EXISTS phase3_order_add_column;
DROP PROCEDURE IF EXISTS phase3_order_add_index;
@@ -7384,9 +7420,20 @@ BEGIN
IF (SELECT COUNT(DISTINCT index_name) FROM information_schema.statistics
WHERE table_schema=DATABASE() AND table_name='ord_order_fulfillment_split'
AND index_name IN ('idx_order_split_source','uk_order_split_operation',
'uk_order_split_idempotency'))<>3 THEN
'uk_order_split_idempotency','uk_order_split_child_role'))<>4 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='订单拆分来源或幂等索引未完整创建';
END IF;
IF EXISTS (SELECT 1 FROM information_schema.statistics
WHERE table_schema=DATABASE() AND table_name='ord_order_fulfillment_split'
AND index_name='uk_order_split_child') THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='旧订单拆分子单唯一索引仍阻止跨角色分片';
END IF;
IF (SELECT COUNT(*) FROM information_schema.triggers
WHERE trigger_schema=DATABASE()
AND trigger_name IN ('trg_order_fulfillment_split_insert',
'trg_order_fulfillment_split_update'))<>2 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='订单履约分片写入保护触发器未完整创建';
END IF;
END$$
DELIMITER ;
CALL phase3_order_assert();