fix(iam): 收敛仓库角色权限并纳入统一迁移
This commit is contained in:
@@ -40,9 +40,8 @@ CREATE TABLE IF NOT EXISTS fl_split_operation (
|
||||
|
||||
/*
|
||||
* 部分装柜拆单契约:
|
||||
* 1. parent_inbound_id 为空的是主单,非空的是唯一二级子单;
|
||||
* 2. 锁定阶段只记录箱数,完成阶段绑定由剩余箱数生成的子单;
|
||||
* 3. 子单不能再作为父单,锁定数量创建后不可修改。
|
||||
* 本文件仅保留历史部分锁定明细;主单、LOADED/REMAINDER 多分片及层级约束
|
||||
* 统一由 phase3-inbound-parent-child-schema.sql 维护。
|
||||
*/
|
||||
DROP PROCEDURE IF EXISTS phase3_split_add_column;
|
||||
DELIMITER $$
|
||||
@@ -76,8 +75,8 @@ SET @phase3_split_index_exists = (
|
||||
WHERE table_schema = DATABASE() AND table_name = 'fl_inbound_order'
|
||||
AND index_name = 'uk_inbound_one_secondary'
|
||||
);
|
||||
SET @phase3_split_ddl = IF(@phase3_split_index_exists = 0,
|
||||
'ALTER TABLE fl_inbound_order ADD UNIQUE KEY uk_inbound_one_secondary (tenant_id, parent_inbound_id)',
|
||||
SET @phase3_split_ddl = IF(@phase3_split_index_exists > 0,
|
||||
'ALTER TABLE fl_inbound_order DROP INDEX uk_inbound_one_secondary',
|
||||
'SELECT 1');
|
||||
PREPARE phase3_split_stmt FROM @phase3_split_ddl;
|
||||
EXECUTE phase3_split_stmt;
|
||||
@@ -88,8 +87,8 @@ SET @phase3_split_fk_exists = (
|
||||
WHERE constraint_schema = DATABASE() AND table_name = 'fl_inbound_order'
|
||||
AND constraint_name = 'fk_inbound_parent' AND constraint_type = 'FOREIGN KEY'
|
||||
);
|
||||
SET @phase3_split_ddl = IF(@phase3_split_fk_exists = 0,
|
||||
'ALTER TABLE fl_inbound_order ADD CONSTRAINT fk_inbound_parent FOREIGN KEY (parent_inbound_id) REFERENCES fl_inbound_order (id)',
|
||||
SET @phase3_split_ddl = IF(@phase3_split_fk_exists > 0,
|
||||
'ALTER TABLE fl_inbound_order DROP FOREIGN KEY fk_inbound_parent',
|
||||
'SELECT 1');
|
||||
PREPARE phase3_split_stmt FROM @phase3_split_ddl;
|
||||
EXECUTE phase3_split_stmt;
|
||||
@@ -140,58 +139,6 @@ DROP TRIGGER IF EXISTS trg_inbound_split_detail_before_insert;
|
||||
DROP TRIGGER IF EXISTS trg_inbound_split_detail_before_update;
|
||||
DROP TRIGGER IF EXISTS trg_inbound_split_detail_before_delete;
|
||||
DELIMITER $$
|
||||
CREATE TRIGGER trg_inbound_split_before_insert
|
||||
BEFORE INSERT ON fl_inbound_order
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
DECLARE v_parent_tenant BIGINT UNSIGNED;
|
||||
DECLARE v_parent_parent BIGINT UNSIGNED;
|
||||
IF NEW.parent_inbound_id IS NOT NULL THEN
|
||||
SELECT tenant_id, parent_inbound_id INTO v_parent_tenant, v_parent_parent
|
||||
FROM fl_inbound_order WHERE id = NEW.parent_inbound_id AND deleted = 0;
|
||||
IF v_parent_tenant <> NEW.tenant_id THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二级子入库单与主单客户归属不一致';
|
||||
END IF;
|
||||
IF v_parent_parent IS NOT NULL THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二级子入库单不能继续拆分';
|
||||
END IF;
|
||||
IF NEW.split_status <> 'NOT_SPLIT' THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二级子入库单拆单状态必须为NOT_SPLIT';
|
||||
END IF;
|
||||
END IF;
|
||||
END$$
|
||||
|
||||
CREATE TRIGGER trg_inbound_split_before_update
|
||||
BEFORE UPDATE ON fl_inbound_order
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NOT (NEW.parent_inbound_id <=> OLD.parent_inbound_id) THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '入库单主子关系创建后不可修改';
|
||||
END IF;
|
||||
IF OLD.parent_inbound_id IS NOT NULL AND NEW.split_status <> 'NOT_SPLIT' THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二级子入库单不能继续拆分';
|
||||
END IF;
|
||||
IF OLD.parent_inbound_id IS NULL
|
||||
AND NEW.split_status NOT IN ('NOT_SPLIT', 'PARTIALLY_SPLIT', 'FULLY_SPLIT') THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '主入库单拆单状态非法';
|
||||
END IF;
|
||||
IF OLD.split_status = 'FULLY_SPLIT' AND NEW.split_status <> 'FULLY_SPLIT' THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '已完成拆单不能回退';
|
||||
END IF;
|
||||
IF NEW.split_status = 'FULLY_SPLIT' AND (
|
||||
(SELECT COUNT(*) FROM fl_inbound_order child
|
||||
WHERE child.tenant_id = NEW.tenant_id AND child.parent_inbound_id = NEW.id
|
||||
AND child.deleted = 0) <> 1
|
||||
OR (SELECT COUNT(*) FROM fl_inbound_split_detail detail
|
||||
WHERE detail.tenant_id = NEW.tenant_id AND detail.parent_inbound_id = NEW.id) = 0
|
||||
OR EXISTS (SELECT 1 FROM fl_inbound_split_detail detail
|
||||
WHERE detail.tenant_id = NEW.tenant_id AND detail.parent_inbound_id = NEW.id
|
||||
AND detail.status <> 'COMPLETED')
|
||||
) THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '剩余箱数二级子单及拆分明细未完成';
|
||||
END IF;
|
||||
END$$
|
||||
|
||||
CREATE TRIGGER trg_inbound_split_detail_before_insert
|
||||
BEFORE INSERT ON fl_inbound_split_detail
|
||||
FOR EACH ROW
|
||||
@@ -239,6 +186,11 @@ BEGIN
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
-- 主子关系及不可回退规则由 phase3-inbound-parent-child-schema.sql 统一维护。
|
||||
-- 旧触发器要求“一父一子”,会阻止 LOADED/REMAINDER 多分片,迁移完成后必须移除。
|
||||
DROP TRIGGER IF EXISTS trg_inbound_split_before_insert;
|
||||
DROP TRIGGER IF EXISTS trg_inbound_split_before_update;
|
||||
|
||||
DROP PROCEDURE IF EXISTS phase3_split_assert_contract;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE phase3_split_assert_contract()
|
||||
@@ -254,17 +206,16 @@ BEGIN
|
||||
END IF;
|
||||
IF (SELECT COUNT(DISTINCT index_name) FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND index_name IN ('uk_inbound_one_secondary', 'uk_inbound_split_parent_detail',
|
||||
'uk_inbound_split_child_detail', 'uk_inbound_split_operation')) <> 4 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '拆单迁移失败:唯一子单或部分锁定幂等索引缺失';
|
||||
AND index_name IN ('uk_inbound_split_parent_detail',
|
||||
'uk_inbound_split_child_detail', 'uk_inbound_split_operation')) <> 3 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_inbound_split_before_insert', 'trg_inbound_split_before_update',
|
||||
'trg_inbound_split_detail_before_insert',
|
||||
AND trigger_name IN ('trg_inbound_split_detail_before_insert',
|
||||
'trg_inbound_split_detail_before_update',
|
||||
'trg_inbound_split_detail_before_delete')) <> 5 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '拆单迁移失败:主子层级或部分锁定触发器未完整创建';
|
||||
'trg_inbound_split_detail_before_delete')) <> 3 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '拆单迁移失败:部分锁定触发器未完整创建';
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
Reference in New Issue
Block a user