SET NAMES utf8mb4; USE baiyue_firstleg; CREATE TABLE IF NOT EXISTS fl_ocean_booking ( id BIGINT UNSIGNED NOT NULL COMMENT '海运订舱ID', booking_no VARCHAR(40) NOT NULL COMMENT '平台海运订舱编号', status VARCHAR(24) NOT NULL DEFAULT 'DRAFT' COMMENT '订舱状态:DRAFT草稿、RELEASED已发布且永久只读', customer_id BIGINT UNSIGNED NULL COMMENT '可选客户ID快照', customer_name VARCHAR(128) NULL COMMENT '可选客户名称快照', channel_code VARCHAR(64) NULL COMMENT '订舱渠道编码快照', channel_name VARCHAR(128) NULL COMMENT '订舱渠道名称快照', warehouse_id BIGINT UNSIGNED NULL COMMENT '国内中转仓ID快照', warehouse_name VARCHAR(128) NULL COMMENT '国内中转仓名称快照', bill_of_lading_no VARCHAR(128) NULL COMMENT '提单号', shipping_company_id BIGINT UNSIGNED NULL COMMENT '船公司逻辑ID快照', shipping_company_name VARCHAR(128) NULL COMMENT '船公司名称快照', carrier_code VARCHAR(16) NULL COMMENT '船司标准编码:MATSON/SML/ZIM/COSCO/EMC/HEDE/OTHER;发布前必填', booking_agent_id BIGINT UNSIGNED NULL COMMENT '订舱代理逻辑ID快照', booking_agent_name VARCHAR(128) NULL COMMENT '订舱代理名称快照', vessel_name VARCHAR(128) NULL COMMENT '当前确认船名快照', voyage_no VARCHAR(64) NULL COMMENT '当前确认航次号快照', departure_port_code VARCHAR(32) NULL COMMENT '起运港编码快照', departure_port_name VARCHAR(128) NULL COMMENT '起运港名称快照', destination_port_code VARCHAR(32) NULL COMMENT '目的港编码快照', destination_port_name VARCHAR(128) NULL COMMENT '目的港名称快照', place_of_delivery VARCHAR(128) NULL COMMENT '最终交货地快照', service_term VARCHAR(32) NULL COMMENT '运输服务条款快照;发布前必填', freight_term VARCHAR(32) NULL COMMENT '海运费支付条款快照;发布前必填', estimated_sailing_at DATETIME(3) NULL COMMENT '当前确认预计开船时间', estimated_arrival_at DATETIME(3) NULL COMMENT '当前确认预计到港时间', remark VARCHAR(1000) NULL 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_by BIGINT UNSIGNED NOT NULL COMMENT '最后修改操作人ID', updated_by_name VARCHAR(64) NULL COMMENT '最后修改操作人姓名快照', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '订舱记录最后更新时间', version INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', PRIMARY KEY (id), UNIQUE KEY uk_ocean_booking_no (booking_no), KEY idx_ocean_booking_customer (customer_id,status,updated_at,id), KEY idx_ocean_booking_voyage (vessel_name,voyage_no,updated_at), CONSTRAINT chk_ocean_booking_customer CHECK (customer_id > 0), CONSTRAINT chk_ocean_booking_status CHECK (status IN ('DRAFT','RELEASED')), CONSTRAINT chk_ocean_booking_carrier_code CHECK (carrier_code IS NULL OR carrier_code IN ('MATSON','SML','ZIM','COSCO','EMC','HEDE','OTHER')), CONSTRAINT chk_ocean_booking_schedule CHECK (estimated_sailing_at IS NULL OR estimated_arrival_at IS NULL OR estimated_arrival_at >= estimated_sailing_at) ) ENGINE=InnoDB COMMENT='独立海运订舱聚合;柜次仍由fl_container_booking承载'; -- CREATE TABLE IF NOT EXISTS does not reconcile a database initialized before customer became optional. ALTER TABLE fl_ocean_booking MODIFY COLUMN customer_id BIGINT UNSIGNED NULL COMMENT '可选客户ID快照', MODIFY COLUMN customer_name VARCHAR(128) NULL COMMENT '可选客户名称快照'; -- Recreate triggers and the current two-state constraint on repeatable initialization. DROP TRIGGER IF EXISTS trg_ocean_booking_before_update; DROP TRIGGER IF EXISTS trg_ocean_party_before_insert; DROP TRIGGER IF EXISTS trg_ocean_party_before_update; DROP TRIGGER IF EXISTS trg_ocean_party_before_delete; DROP TRIGGER IF EXISTS trg_ocean_requirement_before_insert; DROP TRIGGER IF EXISTS trg_ocean_requirement_before_update; DROP TRIGGER IF EXISTS trg_ocean_requirement_before_delete; DROP TRIGGER IF EXISTS trg_ocean_history_before_delete; -- Existing CHECK constraints are not reconciled by CREATE TABLE IF NOT EXISTS. SET @ocean_drop_status_check = ( SELECT IF(COUNT(*) > 0, 'ALTER TABLE fl_ocean_booking DROP CHECK chk_ocean_booking_status', 'SELECT 1') FROM information_schema.table_constraints WHERE table_schema=DATABASE() AND table_name='fl_ocean_booking' AND constraint_name='chk_ocean_booking_status' ); PREPARE ocean_drop_status_stmt FROM @ocean_drop_status_check; EXECUTE ocean_drop_status_stmt; DEALLOCATE PREPARE ocean_drop_status_stmt; ALTER TABLE fl_ocean_booking MODIFY COLUMN service_term VARCHAR(32) NULL COMMENT '运输服务条款快照;发布前必填', MODIFY COLUMN freight_term VARCHAR(32) NULL COMMENT '海运费支付条款快照;发布前必填', ADD CONSTRAINT chk_ocean_booking_status CHECK (status IN ('DRAFT','RELEASED')); SET @ocean_drop_failure_reason = ( SELECT IF(COUNT(*) > 0, 'ALTER TABLE fl_ocean_booking DROP COLUMN failure_reason', 'SELECT 1') FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='fl_ocean_booking' AND column_name='failure_reason' ); PREPARE ocean_drop_failure_stmt FROM @ocean_drop_failure_reason; EXECUTE ocean_drop_failure_stmt; DEALLOCATE PREPARE ocean_drop_failure_stmt; CREATE TABLE IF NOT EXISTS fl_ocean_booking_party ( id BIGINT UNSIGNED NOT NULL COMMENT '订舱提单关系方ID', ocean_booking_id BIGINT UNSIGNED NOT NULL COMMENT '所属海运订舱ID', party_type VARCHAR(24) NOT NULL COMMENT '关系方类型:SHIPPER发货人、CONSIGNEE收货人、NOTIFY_PARTY通知人', party_name VARCHAR(255) NOT NULL COMMENT '关系方名称快照', address VARCHAR(1000) NULL COMMENT '关系方地址快照', contact_name VARCHAR(128) NULL COMMENT '关系方联系人快照', contact_phone VARCHAR(64) NULL COMMENT '关系方联系电话快照', PRIMARY KEY (id), UNIQUE KEY uk_ocean_booking_party (ocean_booking_id,party_type), CONSTRAINT fk_ocean_booking_party FOREIGN KEY (ocean_booking_id) REFERENCES fl_ocean_booking(id) ON DELETE CASCADE, CONSTRAINT chk_ocean_booking_party_type CHECK (party_type IN ('SHIPPER','CONSIGNEE','NOTIFY_PARTY')) ) ENGINE=InnoDB COMMENT='订舱提单关系方快照'; CREATE TABLE IF NOT EXISTS fl_ocean_booking_container_requirement ( id BIGINT UNSIGNED NOT NULL COMMENT '订舱箱型需求ID', ocean_booking_id BIGINT UNSIGNED NOT NULL COMMENT '所属海运订舱ID', container_type VARCHAR(32) NOT NULL COMMENT '所需集装箱尺寸类型编码', container_kind VARCHAR(32) NOT NULL COMMENT '所需集装箱箱种编码', capacity_cbm DECIMAL(18,4) NOT NULL COMMENT '该需求柜型可用容量快照m3', max_weight_kg DECIMAL(18,3) NOT NULL COMMENT '该需求柜型最大承重快照kg', quantity INT UNSIGNED NOT NULL COMMENT '该箱型箱种所需柜数', sort_no INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '订舱需求展示顺序', PRIMARY KEY (id), KEY idx_ocean_requirement_booking (ocean_booking_id,sort_no,id), CONSTRAINT fk_ocean_requirement_booking FOREIGN KEY (ocean_booking_id) REFERENCES fl_ocean_booking(id) ON DELETE CASCADE, CONSTRAINT chk_ocean_requirement_quantity CHECK (quantity > 0) ) ENGINE=InnoDB COMMENT='订舱箱型箱种及数量需求'; CREATE TABLE IF NOT EXISTS fl_ocean_booking_container_allocation ( id BIGINT UNSIGNED NOT NULL COMMENT '订舱柜次分配关系ID', ocean_booking_id BIGINT UNSIGNED NOT NULL COMMENT '所属海运订舱ID', requirement_id BIGINT UNSIGNED NOT NULL COMMENT '对应订舱箱型需求ID', container_booking_id BIGINT UNSIGNED NOT NULL COMMENT '明确引用现有柜次ID', allocated_by BIGINT UNSIGNED NOT NULL COMMENT '分配操作人ID', allocated_by_name VARCHAR(64) NULL COMMENT '分配操作人姓名快照', allocated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '柜次分配时间', PRIMARY KEY (id), UNIQUE KEY uk_ocean_allocation_container (container_booking_id), KEY idx_ocean_allocation_booking (ocean_booking_id,requirement_id,allocated_at), CONSTRAINT fk_ocean_allocation_booking FOREIGN KEY (ocean_booking_id) REFERENCES fl_ocean_booking(id) ON DELETE CASCADE, CONSTRAINT fk_ocean_allocation_requirement FOREIGN KEY (requirement_id) REFERENCES fl_ocean_booking_container_requirement(id), 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', from_status VARCHAR(24) NULL COMMENT '变更前订舱状态;创建时为空', to_status VARCHAR(24) NOT NULL COMMENT '变更后订舱状态', action VARCHAR(40) NOT NULL COMMENT '触发状态变更的业务动作', reason VARCHAR(1000) NULL COMMENT '状态变更原因', before_snapshot JSON NULL COMMENT '状态变更前订舱数据快照;创建时为空', after_snapshot JSON NOT 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), KEY idx_ocean_history_booking (ocean_booking_id,created_at,id), CONSTRAINT fk_ocean_history_booking FOREIGN KEY (ocean_booking_id) REFERENCES fl_ocean_booking(id) ON DELETE CASCADE ) ENGINE=InnoDB COMMENT='海运订舱不可变状态历史'; CREATE TABLE IF NOT EXISTS fl_ocean_booking_operation ( id BIGINT UNSIGNED NOT NULL COMMENT '订舱写操作幂等记录ID', ocean_booking_id BIGINT UNSIGNED NULL COMMENT '关联海运订舱ID;创建请求完成前允许为空', operator_id BIGINT UNSIGNED NOT NULL COMMENT '发起写操作的平台操作人ID', operation VARCHAR(40) NOT NULL COMMENT '幂等写操作类型', idempotency_key VARCHAR(128) NOT NULL COMMENT '客户端写操作幂等键', request_hash CHAR(64) NOT NULL COMMENT '规范化请求内容SHA-256摘要;用于识别同键不同请求', status VARCHAR(16) NOT NULL DEFAULT 'PROCESSING' COMMENT '处理状态:PROCESSING处理中、SUCCESS成功', result_json JSON NULL COMMENT '成功结果JSON快照;供幂等重放返回', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '幂等记录创建时间', completed_at DATETIME(3) NULL COMMENT '写操作成功完成时间', PRIMARY KEY (id), UNIQUE KEY uk_ocean_operation (operator_id,operation,idempotency_key), KEY idx_ocean_operation_booking (ocean_booking_id,created_at), CONSTRAINT fk_ocean_operation_booking FOREIGN KEY (ocean_booking_id) REFERENCES fl_ocean_booking(id) ON DELETE CASCADE, CONSTRAINT chk_ocean_operation_status CHECK (status IN ('PROCESSING','SUCCESS')) ) ENGINE=InnoDB COMMENT='海运订舱写操作幂等与请求哈希'; DROP TRIGGER IF EXISTS trg_ocean_booking_before_update; DELIMITER $$ CREATE TRIGGER trg_ocean_booking_before_update BEFORE UPDATE ON fl_ocean_booking FOR EACH ROW BEGIN IF OLD.status = 'RELEASED' THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='已放舱订舱不可修改'; END IF; IF OLD.status <> NEW.status AND NOT ( (OLD.status='DRAFT' AND NEW.status='RELEASED')) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='海运订舱状态迁移非法'; END IF; END$$ DELIMITER ; DROP TRIGGER IF EXISTS trg_ocean_party_before_insert; DROP TRIGGER IF EXISTS trg_ocean_party_before_update; DROP TRIGGER IF EXISTS trg_ocean_party_before_delete; DELIMITER $$ CREATE TRIGGER trg_ocean_party_before_insert BEFORE INSERT ON fl_ocean_booking_party 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_party_before_update BEFORE UPDATE ON fl_ocean_booking_party 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; END$$ CREATE TRIGGER trg_ocean_party_before_delete BEFORE DELETE ON fl_ocean_booking_party 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; END$$ DELIMITER ; DROP TRIGGER IF EXISTS trg_ocean_requirement_before_insert; DROP TRIGGER IF EXISTS trg_ocean_requirement_before_update; DROP TRIGGER IF EXISTS trg_ocean_requirement_before_delete; DELIMITER $$ CREATE TRIGGER trg_ocean_requirement_before_insert BEFORE INSERT ON fl_ocean_booking_container_requirement 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_requirement_before_update BEFORE UPDATE ON fl_ocean_booking_container_requirement 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; END$$ CREATE TRIGGER trg_ocean_requirement_before_delete BEFORE DELETE ON fl_ocean_booking_container_requirement 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; END$$ DELIMITER ; DROP TRIGGER IF EXISTS trg_ocean_allocation_before_insert; DELIMITER $$ CREATE TRIGGER trg_ocean_allocation_before_insert BEFORE INSERT ON fl_ocean_booking_container_allocation FOR EACH ROW BEGIN IF (SELECT ocean_booking_id FROM fl_ocean_booking_container_requirement WHERE id=NEW.requirement_id) <> NEW.ocean_booking_id THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='箱型需求不属于当前订舱'; END IF; IF (SELECT status FROM fl_ocean_booking WHERE id=NEW.ocean_booking_id) <> 'RELEASED' THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='当前订舱状态不可分配柜次'; END IF; END$$ 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$$ CREATE TRIGGER trg_ocean_history_before_delete BEFORE DELETE ON fl_ocean_booking_status_history FOR EACH ROW 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); DROP PROCEDURE IF EXISTS assert_ocean_booking_permission_ids_available; DELIMITER $$ CREATE PROCEDURE assert_ocean_booking_permission_ids_available() BEGIN IF EXISTS ( SELECT 1 FROM iam_permission WHERE (id = 5102140 AND permission_code <> 'platform:firstleg:ocean-booking:list') OR (id = 5102142 AND permission_code <> 'platform:firstleg:ocean-booking:create') OR (id = 5102146 AND permission_code <> 'platform:firstleg:ocean-booking:release') OR (id = 5102147 AND permission_code <> 'platform:firstleg:ocean-booking:edit') OR (id = 5102148 AND permission_code <> 'platform:firstleg:ocean-booking:delete') OR (id = 5102149 AND permission_code <> 'platform:firstleg:ocean-booking:allocate') OR (permission_code LIKE 'platform:firstleg:ocean-booking:%' AND (tenant_id <> 0 OR app_code <> 'PLATFORM' OR id NOT IN (5102140,5102142,5102146,5102147,5102148,5102149))) ) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '三期订舱权限迁移失败:5102140-5102149 ID 或权限码被其他语义占用'; END IF; END$$ DELIMITER ; CALL assert_ocean_booking_permission_ids_available(); DROP PROCEDURE IF EXISTS assert_ocean_booking_permission_ids_available; INSERT INTO iam_permission (id,tenant_id,app_code,permission_type,parent_id,permission_code,permission_name, route_path,http_method,sort_no,status,built_in,deleted) VALUES (5102140,0,'PLATFORM','MENU',5102000,'platform:firstleg:ocean-booking:list','订舱管理','/first-leg/ocean-bookings','GET',80,'ACTIVE',1,0), (5102142,0,'PLATFORM','BUTTON',5102140,'platform:firstleg:ocean-booking:create','创建订舱',NULL,'POST',20,'ACTIVE',1,0), (5102146,0,'PLATFORM','BUTTON',5102140,'platform:firstleg:ocean-booking:release','确认放舱',NULL,'POST',60,'ACTIVE',1,0), (5102147,0,'PLATFORM','BUTTON',5102140,'platform:firstleg:ocean-booking:edit','编辑草稿',NULL,'PUT',70,'ACTIVE',1,0), (5102148,0,'PLATFORM','BUTTON',5102140,'platform:firstleg:ocean-booking:delete','删除草稿',NULL,'DELETE',80,'ACTIVE',1,0), (5102149,0,'PLATFORM','BUTTON',5102140,'platform:firstleg:ocean-booking:allocate','分配柜次',NULL,'POST',90,'ACTIVE',1,0) ON DUPLICATE KEY UPDATE tenant_id=0,app_code='PLATFORM',permission_type=VALUES(permission_type), permission_code=VALUES(permission_code),permission_name=VALUES(permission_name),parent_id=VALUES(parent_id), route_path=VALUES(route_path),http_method=VALUES(http_method),sort_no=VALUES(sort_no),status='ACTIVE',built_in=1,deleted=0; INSERT IGNORE INTO iam_role_permission(role_id,permission_id,tenant_id) SELECT role.id,permission.id,0 FROM iam_role role JOIN iam_permission permission ON permission.tenant_id=0 AND permission.permission_code LIKE 'platform:firstleg:ocean-booking:%' WHERE role.tenant_id=0 AND role.role_code IN ('PLATFORM_ADMIN','ORDER_OPERATOR'); USE baiyue_firstleg;