Merge remote-tracking branch 'origin/test' into test

This commit is contained in:
2026-09-28 11:59:16 +08:00
85 changed files with 4157 additions and 162 deletions
@@ -1756,6 +1756,9 @@ CREATE TABLE fl_customs_container (
completed_by bigint unsigned DEFAULT NULL COMMENT '完成报关操作人ID',
completed_by_name varchar(64) DEFAULT NULL COMMENT '完成报关操作人名称快照',
completed_at datetime(3) DEFAULT NULL COMMENT '报关完成时间',
broker_submitted_by bigint unsigned DEFAULT NULL COMMENT '发送报关行执行操作人ID',
broker_submitted_by_name varchar(64) DEFAULT NULL COMMENT '发送报关行执行操作人名称快照',
broker_submitted_at datetime(3) DEFAULT NULL COMMENT '发送报关行执行时间',
created_at datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) 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 '乐观锁版本号',
@@ -1824,7 +1827,26 @@ CREATE TABLE fl_customs_completion_document (
PRIMARY KEY (id),
UNIQUE KEY uk_customs_completion_source (source_document_id),
CONSTRAINT fk_customs_completion_source FOREIGN KEY (source_document_id) REFERENCES fl_customs_customer_document (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='报关完成文件当前版本';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='报关行回执当前版本';
CREATE TABLE fl_customs_final_document (
id bigint unsigned NOT NULL COMMENT '真实报关完税文件ID',
source_document_id bigint unsigned NOT NULL COMMENT '一份冻结客户资料严格对应一份完税文件逻辑根',
file_id bigint unsigned NOT NULL COMMENT 'File服务文件ID',
file_name varchar(255) NOT NULL COMMENT '完税文件名称快照',
file_hash char(64) NOT NULL COMMENT '完税文件SHA-256摘要',
content_type varchar(128) DEFAULT NULL COMMENT '完税文件媒体类型',
size_bytes bigint unsigned NOT NULL COMMENT '完税文件大小(字节)',
uploaded_by bigint unsigned NOT NULL COMMENT '上传操作人ID',
uploaded_by_name varchar(64) DEFAULT NULL COMMENT '上传操作人名称快照',
uploaded_at datetime(3) NOT NULL COMMENT '上传时间',
version int unsigned NOT NULL DEFAULT '1' COMMENT '完税文件版本号',
created_at datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '完税文件创建时间',
updated_at datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '完税文件更新时间',
PRIMARY KEY (id),
UNIQUE KEY uk_customs_final_source (source_document_id),
CONSTRAINT fk_customs_final_source FOREIGN KEY (source_document_id) REFERENCES fl_customs_customer_document (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='真实报关完税文件当前版本';
CREATE TABLE fl_customs_completion_document_version (
id bigint unsigned NOT NULL COMMENT '完成文件版本记录ID',
@@ -3316,6 +3338,7 @@ CREATE TABLE fl_mojia_measurement_receipt (
tenant_id bigint unsigned NOT NULL COMMENT '客户ID和数据隔离键',
subject_id bigint unsigned NOT NULL COMMENT '设备应用操作主体ID',
box_code varchar(128) NOT NULL COMMENT '设备扫描的原始箱码或不带#的SKU',
inbound_code varchar(64) DEFAULT NULL COMMENT '箱码命中后的权威入仓码;SKU记录为空',
measurement_kind varchar(16) NOT NULL DEFAULT 'BOX_LABEL' COMMENT '测量分流:BOX_LABEL箱唛;SKU一件代发SKU',
scanned_shipment_id varchar(64) DEFAULT NULL COMMENT '设备从Amazon FBA箱标实扫的Shipment ID',
length_cm decimal(12,3) NOT NULL COMMENT '设备实测长度cm',
@@ -6121,9 +6144,9 @@ INSERT INTO iam_permission (id, tenant_id, app_code, permission_type, parent_id,
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, created_at, updated_at, deleted) VALUES (5102127,0,'PLATFORM','BUTTON',5102030,'platform:firstleg:inbound:delivery:complete','完成派送',NULL,NULL,200,'ACTIVE',1,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3),0);
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, created_at, updated_at, deleted) VALUES (5102128,0,'PLATFORM','BUTTON',5102030,'platform:firstleg:inbound:picking:edit','执行拣货',NULL,NULL,210,'ACTIVE',1,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3),0);
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, created_at, updated_at, deleted) VALUES (5102129,0,'PLATFORM','BUTTON',5102030,'platform:firstleg:inbound:picking:view','查看拣货任务',NULL,NULL,220,'ACTIVE',1,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3),0);
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, created_at, updated_at, deleted) VALUES (5102131,0,'PLATFORM','MENU',5103000,'platform:mojia-sku-sync:list','一件代发SKU同步','/general/mojia-sku-sync','GET',130,'ACTIVE',1,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3),0);
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, created_at, updated_at, deleted) VALUES (5102132,0,'PLATFORM','BUTTON',5102131,'platform:mojia-sku-sync:edit','编辑一件代发SKU测量数据',NULL,'PUT',10,'ACTIVE',1,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3),0);
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, created_at, updated_at, deleted) VALUES (5102133,0,'PLATFORM','BUTTON',5102131,'platform:mojia-sku-sync:retry','重新推送一件代发SKU',NULL,'POST',20,'ACTIVE',1,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3),0);
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, created_at, updated_at, deleted) VALUES (5102131,0,'PLATFORM','MENU',5103000,'platform:mojia-sku-sync:list','称重机器','/general/mojia-sku-sync','GET',130,'ACTIVE',1,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3),0);
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, created_at, updated_at, deleted) VALUES (5102132,0,'PLATFORM','BUTTON',5102131,'platform:mojia-sku-sync:edit','编辑SKU测量数据',NULL,'PUT',10,'ACTIVE',1,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3),0);
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, created_at, updated_at, deleted) VALUES (5102133,0,'PLATFORM','BUTTON',5102131,'platform:mojia-sku-sync:retry','重新推送SKU测量',NULL,'POST',20,'ACTIVE',1,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3),0);
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, created_at, updated_at, deleted) VALUES (5102140,0,'PLATFORM','MENU',5102000,'platform:firstleg:ocean-booking:list','订舱管理','/first-leg/ocean-bookings','GET',80,'ACTIVE',1,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3),0);
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, created_at, updated_at, deleted) VALUES (5102142,0,'PLATFORM','BUTTON',5102140,'platform:firstleg:ocean-booking:create','创建订舱',NULL,'POST',20,'ACTIVE',1,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3),0);
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, created_at, updated_at, deleted) VALUES (5102146,0,'PLATFORM','BUTTON',5102140,'platform:firstleg:ocean-booking:release','确认放舱',NULL,'POST',60,'ACTIVE',1,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3),0);
@@ -7755,4 +7778,276 @@ USE baiyue_finance;
-- 系统基线 fin_subject:1 行。
INSERT INTO fin_subject (id, subject_code, subject_name, status, version, created_by, updated_by, created_at, updated_at) VALUES (1,'PLATFORM_DEFAULT','平台','ACTIVE',0,0,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3));
SELECT 'PASS' AS initialization_status, 'CN' AS region, 210 AS initialized_tables;
-- phase4-sailing-calendar-schema.sql
SET NAMES utf8mb4;
USE baiyue_firstleg;
-- 船期计划日历首版基线。与 fl_port_schedule(港务船期观测)分离。
CREATE TABLE fl_sailing_channel (
id BIGINT NOT NULL,
channel_code VARCHAR(64) NOT NULL,
channel_name VARCHAR(128) NOT NULL,
source_type VARCHAR(24) NOT NULL,
mapped_channel_code VARCHAR(64) NULL,
default_departure_port_code VARCHAR(32) NULL,
default_destination_port_code VARCHAR(32) NULL,
default_cutoff_days TINYINT NOT NULL DEFAULT 3,
status VARCHAR(16) NOT NULL DEFAULT 'ACTIVE',
remark VARCHAR(1000) NULL,
created_by BIGINT NOT NULL,
created_by_name VARCHAR(128) NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_by BIGINT NOT NULL,
updated_by_name VARCHAR(128) NULL,
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
version INT NOT NULL DEFAULT 0,
PRIMARY KEY (id),
UNIQUE KEY uk_fl_sailing_channel_code (channel_code),
KEY idx_fl_sailing_channel_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE fl_sailing_template (
id BIGINT NOT NULL,
template_no VARCHAR(64) NOT NULL,
template_name VARCHAR(128) NOT NULL,
channel_id BIGINT NOT NULL,
channel_code_snapshot VARCHAR(64) NOT NULL,
channel_name_snapshot VARCHAR(128) NOT NULL,
warehouse_id BIGINT NOT NULL,
warehouse_name_snapshot VARCHAR(128) NULL,
departure_port_code VARCHAR(32) NOT NULL,
destination_port_code VARCHAR(32) NOT NULL,
weekday TINYINT NOT NULL,
weekday_mask TINYINT NOT NULL DEFAULT 1,
etd_local_time TIME NOT NULL,
cutoff_days TINYINT NOT NULL DEFAULT 3,
cutoff_local_time TIME NOT NULL DEFAULT '18:00:00',
valid_from DATE NOT NULL,
valid_to DATE NULL,
voyage_rule VARCHAR(64) NULL,
vessel_name VARCHAR(128) NULL,
status VARCHAR(16) NOT NULL DEFAULT 'ACTIVE',
remark VARCHAR(1000) NULL,
created_by BIGINT NOT NULL,
created_by_name VARCHAR(128) NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_by BIGINT NOT NULL,
updated_by_name VARCHAR(128) NULL,
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
version INT NOT NULL DEFAULT 0,
PRIMARY KEY (id),
UNIQUE KEY uk_fl_sailing_template_no (template_no),
KEY idx_fl_sailing_template_filter (warehouse_id,channel_id,status,weekday),
CONSTRAINT ck_fl_sailing_template_weekday CHECK (weekday BETWEEN 1 AND 7),
CONSTRAINT ck_fl_sailing_template_cutoff_days CHECK (cutoff_days BETWEEN 0 AND 30)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE fl_sailing (
id BIGINT NOT NULL,
sailing_no VARCHAR(64) NOT NULL,
template_id BIGINT NULL,
channel_id BIGINT NOT NULL,
channel_code_snapshot VARCHAR(64) NOT NULL,
channel_name_snapshot VARCHAR(128) NOT NULL,
warehouse_id BIGINT NOT NULL,
warehouse_name_snapshot VARCHAR(128) NULL,
departure_port_code VARCHAR(32) NOT NULL,
destination_port_code VARCHAR(32) NOT NULL,
vessel_name VARCHAR(128) NOT NULL,
voyage_no VARCHAR(64) NOT NULL,
etd_at DATETIME(3) NOT NULL,
warehouse_cutoff_at DATETIME(3) NOT NULL,
eta_at DATETIME(3) NULL,
status VARCHAR(16) NOT NULL DEFAULT 'OPEN',
source_type VARCHAR(24) NOT NULL DEFAULT 'MANUAL',
generated_key VARCHAR(192) NULL,
planned_capacity_cbm DECIMAL(14,3) NULL,
remark VARCHAR(1000) NULL,
created_by BIGINT NOT NULL,
created_by_name VARCHAR(128) NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_by BIGINT NOT NULL,
updated_by_name VARCHAR(128) NULL,
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
version INT NOT NULL DEFAULT 0,
PRIMARY KEY (id),
UNIQUE KEY uk_fl_sailing_no (sailing_no),
UNIQUE KEY uk_fl_sailing_generated_key (generated_key),
UNIQUE KEY uk_fl_sailing_business (warehouse_id,channel_code_snapshot,departure_port_code,destination_port_code,etd_at,voyage_no),
KEY idx_fl_sailing_calendar (etd_at,warehouse_id,channel_id,status),
KEY idx_fl_sailing_route (departure_port_code,destination_port_code),
CONSTRAINT ck_fl_sailing_status CHECK (status IN ('DRAFT','OPEN','CLOSED','DEPARTED','CANCELLED','COMPLETED'))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE fl_sailing_history (
id BIGINT NOT NULL,
sailing_id BIGINT NOT NULL,
action VARCHAR(32) NOT NULL,
from_status VARCHAR(16) NULL,
to_status VARCHAR(16) NULL,
reason VARCHAR(1000) NULL,
operator_id BIGINT NULL,
operator_name VARCHAR(128) NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
KEY idx_fl_sailing_history_sailing (sailing_id,created_at,id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
USE baiyue_iam;
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
(5102206,0,'PLATFORM','MENU',5102000,'platform:firstleg:sailing-calendar:list','船期日历','/sailing-calendar','GET',125,'ACTIVE',1,0),
(5102207,0,'PLATFORM','BUTTON',5102206,'platform:firstleg:sailing-calendar:create','新增船期','/sailing-calendar','POST',10,'ACTIVE',1,0),
(5102208,0,'PLATFORM','BUTTON',5102206,'platform:firstleg:sailing-calendar:edit','编辑船期','/sailing-calendar','PUT',20,'ACTIVE',1,0),
(5102209,0,'PLATFORM','BUTTON',5102206,'platform:firstleg:sailing-template:manage','管理渠道与周模板','/sailing-calendar','POST',30,'ACTIVE',1,0),
(5102210,0,'PLATFORM','BUTTON',5102206,'platform:firstleg:sailing-booking:link','关联订舱','/sailing-calendar','POST',40,'ACTIVE',1,0),
(5102211,0,'PLATFORM','BUTTON',5102206,'platform:firstleg:sailing-volume:forecast-manage','维护货量预报','/sailing-calendar','POST',50,'ACTIVE',1,0),
(5102212,0,'PLATFORM','BUTTON',5102206,'platform:firstleg:sailing-volume:exception-reassign','异常重新安排','/sailing-calendar','POST',60,'ACTIVE',1,0);
INSERT INTO iam_role_permission(role_id,permission_id,tenant_id)
SELECT r.id,p.id,0 FROM iam_role r JOIN iam_permission p
ON p.tenant_id=0 AND p.app_code='PLATFORM'
AND p.permission_code IN (
'platform:firstleg:sailing-calendar:list',
'platform:firstleg:sailing-calendar:create',
'platform:firstleg:sailing-calendar:edit',
'platform:firstleg:sailing-template:manage',
'platform:firstleg:sailing-booking:link',
'platform:firstleg:sailing-volume:forecast-manage',
'platform:firstleg:sailing-volume:exception-reassign'
)
WHERE r.tenant_id=0 AND r.role_code IN ('PLATFORM_ADMIN','ORDER_OPERATOR');
-- phase4-sailing-facts-schema.sql
SET NAMES utf8mb4;
USE baiyue_firstleg;
/*
* 船期日历的事实契约。
*
* 这些表不修改入库单或海运订舱聚合:入库单仍是履约主数据,订舱仍是
* RELEASED/DRAFT 聚合。船期日历只消费这里的稳定事实和审计版本。
*/
CREATE TABLE fl_sailing_receipt_batch_fact (
id BIGINT UNSIGNED NOT NULL COMMENT '稳定收货批次事实ID(receiptBatchId)',
tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户隔离键,继承入库事实',
receipt_batch_key VARCHAR(64) NOT NULL COMMENT '同一物理收货批次的不可变业务键',
fact_version INT UNSIGNED NOT NULL DEFAULT 1 COMMENT '同一批次复测/冲正版本',
inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID',
measurement_id BIGINT UNSIGNED NULL COMMENT '最终审核测量批次ID',
receiving_warehouse_id BIGINT UNSIGNED NOT NULL COMMENT '实际收货仓ID',
channel_code VARCHAR(64) NULL COMMENT '收货渠道编码快照',
channel_name VARCHAR(128) NULL COMMENT '收货渠道名称快照',
departure_port_code VARCHAR(32) NULL COMMENT '起运港编码快照',
destination_port_code VARCHAR(32) NULL COMMENT '目的港编码快照',
received_at DATETIME(3) NOT NULL COMMENT '实际收货完成时间,不使用入库单inbounded_at替代',
actual_volume_cbm DECIMAL(18,4) NOT NULL COMMENT '最终审核实测体积m3',
fact_status VARCHAR(24) NOT NULL DEFAULT 'APPROVED' COMMENT '事实状态:APPROVED/REVERSED/VOIDED/SUPERSEDED',
reversal_of_fact_id BIGINT UNSIGNED NULL COMMENT '冲正所替代的事实ID',
source_type VARCHAR(32) NOT NULL DEFAULT 'FIRSTLEG_RECEIPT' COMMENT '事实来源',
created_by BIGINT UNSIGNED NULL COMMENT '写入人或系统主体',
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),
PRIMARY KEY (id),
UNIQUE KEY uk_sailing_receipt_batch_version (tenant_id, receipt_batch_key, fact_version),
KEY idx_sailing_receipt_batch_current (tenant_id, receipt_batch_key, fact_status, fact_version),
KEY idx_sailing_receipt_match (tenant_id, receiving_warehouse_id, channel_code, received_at, id),
KEY idx_sailing_receipt_inbound (tenant_id, inbound_id, received_at, id),
CONSTRAINT chk_sailing_receipt_volume CHECK (actual_volume_cbm > 0),
CONSTRAINT chk_sailing_receipt_status CHECK (fact_status IN ('APPROVED','REVERSED','VOIDED','SUPERSEDED'))
) ENGINE=InnoDB COMMENT='船期日历稳定收货批次实测事实及版本历史';
CREATE TABLE fl_sailing_inbound_volume_forecast (
id BIGINT UNSIGNED NOT NULL COMMENT '货量预报事实ID(forecastId)',
tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户隔离键,继承入库事实',
forecast_key VARCHAR(64) NOT NULL COMMENT '同一未收货对象的不可变业务键',
fact_version INT UNSIGNED NOT NULL DEFAULT 1 COMMENT '预报修订版本',
inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID',
receiving_warehouse_id BIGINT UNSIGNED NOT NULL COMMENT '预计收货仓ID',
channel_code VARCHAR(64) NULL COMMENT '预计渠道编码快照',
channel_name VARCHAR(128) NULL COMMENT '预计渠道名称快照',
departure_port_code VARCHAR(32) NULL COMMENT '预计起运港编码快照',
destination_port_code VARCHAR(32) NULL COMMENT '预计目的港编码快照',
expected_arrival_at DATETIME(3) NOT NULL COMMENT '预计到仓时间',
forecast_volume_cbm DECIMAL(18,4) NOT NULL COMMENT '未收货预计体积m3,不得使用申报体积代替',
source_type VARCHAR(32) NOT NULL COMMENT '预报来源,例如OPERATIONS/UPSTREAM_MEASUREMENT;不得使用客户申报体积冒充预报',
fact_status VARCHAR(24) NOT NULL DEFAULT 'VALID' COMMENT '事实状态:VALID/SUPERSEDED/VOIDED/CONSUMED',
effective_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '本版本生效时间',
created_by BIGINT UNSIGNED NULL COMMENT '写入人或系统主体',
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),
PRIMARY KEY (id),
UNIQUE KEY uk_sailing_forecast_version (tenant_id, forecast_key, fact_version),
KEY idx_sailing_forecast_current (tenant_id, forecast_key, fact_status, fact_version),
KEY idx_sailing_forecast_match (tenant_id, receiving_warehouse_id, channel_code, expected_arrival_at, id),
KEY idx_sailing_forecast_inbound (tenant_id, inbound_id, expected_arrival_at, id),
CONSTRAINT chk_sailing_forecast_volume CHECK (forecast_volume_cbm > 0),
CONSTRAINT chk_sailing_forecast_status CHECK (fact_status IN ('VALID','SUPERSEDED','VOIDED','CONSUMED'))
) ENGINE=InnoDB COMMENT='船期日历未收货量预报事实及版本历史';
CREATE TABLE fl_sailing_assignment (
id BIGINT UNSIGNED NOT NULL COMMENT '归班事实ID',
tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户隔离键',
sailing_id BIGINT UNSIGNED NULL COMMENT '船期实例ID,UNMATCHED为空',
origin_sailing_id BIGINT UNSIGNED NULL COMMENT '异常重排/取消前的原船期实例ID',
inbound_id BIGINT UNSIGNED NULL COMMENT '归班对象入库单ID',
inbound_code VARCHAR(64) NULL COMMENT '入仓码快照,仅用于展示',
receipt_batch_id BIGINT UNSIGNED NULL COMMENT '收货批次事实ID',
forecast_id BIGINT UNSIGNED NULL COMMENT '货量预报事实ID',
assignment_source VARCHAR(24) NOT NULL DEFAULT 'AUTO' COMMENT '归班来源:AUTO/MANUAL/ROLLOVER',
assignment_version INT UNSIGNED NOT NULL COMMENT '同一对象的归班版本',
match_status VARCHAR(24) NOT NULL COMMENT 'FORECAST_MATCHED/RECEIVED/LATE/UNMATCHED/SUPERSEDED',
volume_cbm DECIMAL(18,4) NULL COMMENT '已收实测体积',
forecast_volume_cbm DECIMAL(18,4) NULL COMMENT '未收有效预计体积',
route_source VARCHAR(32) NULL COMMENT '航线来源:INBOUND_FACT/FORECAST_FACT/CHANNEL_DEFAULT',
volume_source VARCHAR(32) NULL COMMENT 'MEASURED_ACTUAL或预报来源',
rule_version VARCHAR(64) NOT NULL COMMENT '自动归班规则版本',
matched_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
superseded_at DATETIME(3) NULL,
locked_at DATETIME(3) NULL COMMENT '截止/订舱/关闭后冻结时间',
lock_reason VARCHAR(32) NULL COMMENT 'CUTOFF/BOOKING_CONFIRMED/CLOSED',
operator_id BIGINT UNSIGNED NULL,
reason VARCHAR(500) NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
KEY idx_sailing_assignment_current (tenant_id, sailing_id, match_status, matched_at, id),
KEY idx_sailing_assignment_origin (tenant_id, origin_sailing_id, match_status, id),
KEY idx_sailing_assignment_receipt (tenant_id, receipt_batch_id, assignment_version, id),
KEY idx_sailing_assignment_forecast (tenant_id, forecast_id, assignment_version, id),
KEY idx_sailing_assignment_inbound (tenant_id, inbound_id, match_status, id),
CONSTRAINT chk_sailing_assignment_status CHECK (match_status IN ('FORECAST_MATCHED','RECEIVED','LATE','UNMATCHED','SUPERSEDED')),
CONSTRAINT chk_sailing_assignment_source CHECK (assignment_source IN ('AUTO','MANUAL','ROLLOVER'))
) ENGINE=InnoDB COMMENT='船期日历自动归班事实及不可变版本历史';
CREATE TABLE fl_sailing_booking_link (
id BIGINT UNSIGNED NOT NULL COMMENT '船期-订舱关联ID',
tenant_id BIGINT UNSIGNED NOT NULL COMMENT '平台关联隔离键',
sailing_id BIGINT UNSIGNED NOT NULL COMMENT '计划船期实例ID',
ocean_booking_id BIGINT UNSIGNED NOT NULL COMMENT '海运订舱ID',
link_status VARCHAR(24) NOT NULL DEFAULT 'ACTIVE' COMMENT '关联状态:ACTIVE/REVOKED',
active_booking_guard TINYINT NULL COMMENT 'ACTIVE为1,REVOKED为空,用于唯一约束',
booking_status_snapshot VARCHAR(24) NOT NULL COMMENT '关联时订舱状态快照;只有RELEASED可建立',
warehouse_id BIGINT UNSIGNED NULL COMMENT '关联仓库快照',
channel_code VARCHAR(64) NULL COMMENT '关联渠道快照',
departure_port_code VARCHAR(32) NULL COMMENT '关联起运港快照',
destination_port_code VARCHAR(32) NULL COMMENT '关联目的港快照',
linked_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
revoked_at DATETIME(3) NULL,
operator_id BIGINT UNSIGNED NULL,
operator_name VARCHAR(64) NULL,
reason VARCHAR(500) NULL,
PRIMARY KEY (id),
UNIQUE KEY uk_sailing_booking_active (ocean_booking_id, active_booking_guard),
KEY idx_sailing_booking_link (sailing_id, link_status, ocean_booking_id),
KEY idx_sailing_booking_booking (ocean_booking_id, link_status, id),
CONSTRAINT chk_sailing_booking_link_status CHECK (link_status IN ('ACTIVE','REVOKED')),
CONSTRAINT chk_sailing_booking_link_guard CHECK ((link_status='ACTIVE' AND active_booking_guard=1) OR (link_status='REVOKED' AND active_booking_guard IS NULL)),
CONSTRAINT chk_sailing_booking_released CHECK (booking_status_snapshot='RELEASED')
) ENGINE=InnoDB COMMENT='船期计划与已放舱订舱的最小关联及历史';
SELECT 'PASS' AS initialization_status, 'CN' AS region, 219 AS initialized_tables;