feat(firstleg): enforce booking-owned truck workflow

This commit is contained in:
2026-08-31 19:55:58 +08:00
parent f2a980e5c1
commit 0cc4eae209
27 changed files with 1318 additions and 86 deletions
@@ -139,6 +139,30 @@ CREATE TABLE IF NOT EXISTS fl_ocean_booking_container_allocation (
CONSTRAINT fk_ocean_allocation_container FOREIGN KEY (container_booking_id) REFERENCES fl_container_booking(id)
) ENGINE=InnoDB COMMENT='订舱需求与现有柜次的唯一分配关系';
CREATE TABLE IF NOT EXISTS fl_ocean_booking_document (
id BIGINT UNSIGNED NOT NULL COMMENT '订舱文件关联ID',
ocean_booking_id BIGINT UNSIGNED NOT NULL COMMENT '所属海运订舱ID',
file_id BIGINT UNSIGNED NOT NULL COMMENT 'File服务文件逻辑ID',
document_type VARCHAR(32) NOT NULL COMMENT '文件类型:BOOKING_CONFIRMATION订舱确认、BILL_OF_LADING提单',
file_name VARCHAR(255) NOT NULL COMMENT 'File返回的原始文件名快照',
file_hash CHAR(64) NULL COMMENT 'File返回的SHA-256快照',
size_bytes BIGINT UNSIGNED NULL COMMENT 'File返回的文件大小快照',
content_type VARCHAR(128) NULL COMMENT 'File返回的内容类型快照',
valid TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否为有效文件关联',
uploaded_by BIGINT UNSIGNED NOT NULL COMMENT '上传或关联操作人ID',
uploaded_by_name VARCHAR(64) NULL COMMENT '上传或关联操作人姓名快照',
uploaded_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '上传或关联时间',
invalidated_by BIGINT UNSIGNED NULL COMMENT '作废操作人ID',
invalidated_by_name VARCHAR(64) NULL COMMENT '作废操作人姓名快照',
invalidated_at DATETIME(3) NULL COMMENT '作废时间',
PRIMARY KEY (id),
KEY idx_ocean_document_booking (ocean_booking_id,valid,uploaded_at,id),
KEY idx_ocean_document_file (file_id),
CONSTRAINT fk_ocean_document_booking FOREIGN KEY (ocean_booking_id) REFERENCES fl_ocean_booking(id) ON DELETE CASCADE,
CONSTRAINT chk_ocean_document_type CHECK (document_type IN ('BOOKING_CONFIRMATION','BILL_OF_LADING')),
CONSTRAINT chk_ocean_document_valid CHECK (valid IN (0,1))
) ENGINE=InnoDB COMMENT='订舱聚合拥有的订舱确认与提单文件关联';
CREATE TABLE IF NOT EXISTS fl_ocean_booking_status_history (
id BIGINT UNSIGNED NOT NULL COMMENT '订舱状态历史ID',
ocean_booking_id BIGINT UNSIGNED NOT NULL COMMENT '所属海运订舱ID',
@@ -227,6 +251,9 @@ DELIMITER ;
DROP TRIGGER IF EXISTS trg_ocean_history_before_update;
DROP TRIGGER IF EXISTS trg_ocean_history_before_delete;
DROP TRIGGER IF EXISTS trg_ocean_document_before_insert;
DROP TRIGGER IF EXISTS trg_ocean_document_before_update;
DROP TRIGGER IF EXISTS trg_ocean_document_before_delete;
DELIMITER $$
CREATE TRIGGER trg_ocean_history_before_update BEFORE UPDATE ON fl_ocean_booking_status_history FOR EACH ROW
BEGIN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='订舱状态历史不可修改'; END$$
@@ -234,6 +261,28 @@ CREATE TRIGGER trg_ocean_history_before_delete BEFORE DELETE ON fl_ocean_booking
BEGIN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='订舱状态历史不可删除'; END$$
DELIMITER ;
DELIMITER $$
CREATE TRIGGER trg_ocean_document_before_insert BEFORE INSERT ON fl_ocean_booking_document FOR EACH ROW
BEGIN
IF (SELECT status FROM fl_ocean_booking WHERE id=NEW.ocean_booking_id) <> 'DRAFT' THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='已放舱订舱文件永久只读';
END IF;
END$$
CREATE TRIGGER trg_ocean_document_before_update BEFORE UPDATE ON fl_ocean_booking_document FOR EACH ROW
BEGIN
IF (SELECT status FROM fl_ocean_booking WHERE id=OLD.ocean_booking_id) <> 'DRAFT' THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='已放舱订舱文件永久只读';
END IF;
IF NEW.ocean_booking_id <> OLD.ocean_booking_id OR NEW.file_id <> OLD.file_id
OR NEW.document_type <> OLD.document_type OR NEW.uploaded_by <> OLD.uploaded_by
OR NEW.uploaded_at <> OLD.uploaded_at OR NEW.valid > OLD.valid THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='订舱文件只允许在草稿期作废';
END IF;
END$$
CREATE TRIGGER trg_ocean_document_before_delete BEFORE DELETE ON fl_ocean_booking_document FOR EACH ROW
BEGIN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='订舱文件关联不可物理删除'; END$$
DELIMITER ;
USE baiyue_iam;
DELETE rp FROM iam_role_permission rp WHERE rp.permission_id IN (5102141,5102143,5102144,5102145);
DELETE FROM iam_permission WHERE id IN (5102141,5102143,5102144,5102145);