feat(firstleg): converge phase3 loading models and pda
This commit is contained in:
@@ -8389,6 +8389,141 @@ SET @ddl = IF(
|
||||
'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
/* Phase 3: link inbound preload plans to one or more container loading plans. */
|
||||
CREATE TABLE IF NOT EXISTS fl_preload_loading_plan_link (
|
||||
id BIGINT UNSIGNED NOT NULL,
|
||||
tenant_id BIGINT UNSIGNED NOT NULL,
|
||||
inbound_id BIGINT UNSIGNED NOT NULL,
|
||||
preload_plan_id BIGINT UNSIGNED NOT NULL,
|
||||
loading_plan_id BIGINT UNSIGNED NOT NULL,
|
||||
idempotency_key VARCHAR(128) NOT NULL,
|
||||
request_hash CHAR(64) NOT NULL,
|
||||
created_by BIGINT UNSIGNED NOT NULL,
|
||||
created_by_name VARCHAR(64) NULL,
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uk_preload_loading_pair (tenant_id, inbound_id, loading_plan_id),
|
||||
UNIQUE KEY uk_preload_loading_idempotency (created_by, idempotency_key),
|
||||
KEY idx_preload_loading_preload (preload_plan_id, loading_plan_id),
|
||||
KEY idx_preload_loading_plan (loading_plan_id, tenant_id, inbound_id),
|
||||
CONSTRAINT fk_preload_loading_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id),
|
||||
CONSTRAINT fk_preload_loading_preload FOREIGN KEY (preload_plan_id) REFERENCES fl_preload_plan (id),
|
||||
CONSTRAINT fk_preload_loading_plan FOREIGN KEY (loading_plan_id) REFERENCES fl_loading_plan (id),
|
||||
CONSTRAINT chk_preload_loading_tenant CHECK (tenant_id > 0)
|
||||
) ENGINE=InnoDB COMMENT='入库单预装与柜次装柜计划多对多关联';
|
||||
|
||||
INSERT IGNORE INTO fl_preload_loading_plan_link
|
||||
(id, tenant_id, inbound_id, preload_plan_id, loading_plan_id, idempotency_key,
|
||||
request_hash, created_by, created_by_name, created_at)
|
||||
SELECT CAST(CONV(SUBSTRING(SHA2(CONCAT('PRELOAD_LOADING|', item.account_id, '|', item.inbound_id,
|
||||
'|', item.loading_plan_id), 256), 1, 15), 16, 10) AS UNSIGNED),
|
||||
item.account_id, item.inbound_id, preload.id, item.loading_plan_id,
|
||||
CONCAT('BACKFILL-', item.loading_plan_id, '-', item.inbound_id),
|
||||
SHA2(CONCAT('BACKFILL|', item.account_id, '|', item.inbound_id, '|', item.loading_plan_id), 256),
|
||||
preload.created_by, preload.created_by_name, LEAST(preload.created_at, plan.created_at)
|
||||
FROM (SELECT DISTINCT account_id, inbound_id, loading_plan_id
|
||||
FROM fl_loading_plan_item WHERE deleted = 0) item
|
||||
JOIN fl_preload_plan preload ON preload.tenant_id = item.account_id
|
||||
AND preload.inbound_id = item.inbound_id
|
||||
JOIN fl_loading_plan plan ON plan.id = item.loading_plan_id;
|
||||
|
||||
/* Phase 3: PDA assignment, immutable task operations and review records. */
|
||||
CREATE TABLE IF NOT EXISTS fl_loading_pick_assignment (
|
||||
pick_task_id BIGINT UNSIGNED NOT NULL,
|
||||
assignee_id BIGINT UNSIGNED NOT NULL,
|
||||
assignee_name VARCHAR(64) NOT NULL,
|
||||
assigned_by BIGINT UNSIGNED NOT NULL,
|
||||
assigned_by_name VARCHAR(64) NULL,
|
||||
assignment_type VARCHAR(16) NOT NULL,
|
||||
version INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
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 (pick_task_id),
|
||||
KEY idx_loading_pick_assignee (assignee_id, updated_at),
|
||||
CONSTRAINT fk_loading_pick_assignment_task FOREIGN KEY (pick_task_id) REFERENCES fl_loading_pick_task (id),
|
||||
CONSTRAINT chk_loading_pick_assignment_type CHECK (assignment_type IN ('CLAIMED', 'ASSIGNED'))
|
||||
) ENGINE=InnoDB COMMENT='柜次PDA任务领取与作业员分配';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS fl_loading_pick_review (
|
||||
pick_task_id BIGINT UNSIGNED NOT NULL,
|
||||
review_status VARCHAR(16) NOT NULL DEFAULT 'APPROVED',
|
||||
reviewed_by BIGINT UNSIGNED NOT NULL,
|
||||
reviewed_by_name VARCHAR(64) NULL,
|
||||
remark VARCHAR(500) NULL,
|
||||
version INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
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 (pick_task_id),
|
||||
KEY idx_loading_pick_reviewer (reviewed_by, created_at),
|
||||
CONSTRAINT fk_loading_pick_review_task FOREIGN KEY (pick_task_id) REFERENCES fl_loading_pick_task (id),
|
||||
CONSTRAINT chk_loading_pick_review_status CHECK (review_status = 'APPROVED')
|
||||
) ENGINE=InnoDB COMMENT='柜次PDA任务完成复核';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS fl_loading_pick_operation (
|
||||
id BIGINT UNSIGNED NOT NULL,
|
||||
pick_task_id BIGINT UNSIGNED NOT NULL,
|
||||
operation_id VARCHAR(128) NOT NULL,
|
||||
request_hash CHAR(64) NOT NULL,
|
||||
action_type VARCHAR(16) NOT NULL,
|
||||
operator_id BIGINT UNSIGNED NOT NULL,
|
||||
operator_name VARCHAR(64) NULL,
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uk_loading_pick_operation_id (operation_id),
|
||||
KEY idx_loading_pick_operation_task (pick_task_id, created_at),
|
||||
CONSTRAINT fk_loading_pick_operation_task FOREIGN KEY (pick_task_id) REFERENCES fl_loading_pick_task (id),
|
||||
CONSTRAINT chk_loading_pick_operation_action CHECK (action_type IN ('CLAIM', 'ASSIGN', 'REVIEW'))
|
||||
) ENGINE=InnoDB COMMENT='柜次PDA任务级幂等审计';
|
||||
|
||||
DROP TRIGGER IF EXISTS trg_loading_pick_review_before_update;
|
||||
DELIMITER $$
|
||||
CREATE TRIGGER trg_loading_pick_review_before_update BEFORE UPDATE ON fl_loading_pick_review
|
||||
FOR EACH ROW BEGIN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='PDA复核记录不可修改'; END$$
|
||||
DELIMITER ;
|
||||
DROP TRIGGER IF EXISTS trg_loading_pick_review_before_delete;
|
||||
DELIMITER $$
|
||||
CREATE TRIGGER trg_loading_pick_review_before_delete BEFORE DELETE ON fl_loading_pick_review
|
||||
FOR EACH ROW BEGIN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='PDA复核记录不可删除'; END$$
|
||||
DELIMITER ;
|
||||
DROP TRIGGER IF EXISTS trg_loading_pick_operation_before_update;
|
||||
DELIMITER $$
|
||||
CREATE TRIGGER trg_loading_pick_operation_before_update BEFORE UPDATE ON fl_loading_pick_operation
|
||||
FOR EACH ROW BEGIN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='PDA任务操作历史不可修改'; END$$
|
||||
DELIMITER ;
|
||||
DROP TRIGGER IF EXISTS trg_loading_pick_operation_before_delete;
|
||||
DELIMITER $$
|
||||
CREATE TRIGGER trg_loading_pick_operation_before_delete BEFORE DELETE ON fl_loading_pick_operation
|
||||
FOR EACH ROW BEGIN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='PDA任务操作历史不可删除'; END$$
|
||||
DELIMITER ;
|
||||
|
||||
USE baiyue_iam;
|
||||
DROP PROCEDURE IF EXISTS assert_phase3_pda_permission_ids;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE assert_phase3_pda_permission_ids()
|
||||
BEGIN
|
||||
IF EXISTS (SELECT 1 FROM iam_permission WHERE id BETWEEN 5102190 AND 5102193
|
||||
AND permission_code NOT IN ('platform:firstleg:pda:view','platform:firstleg:pda:assign',
|
||||
'platform:firstleg:pda:work','platform:firstleg:pda:review')) THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='PDA权限ID已被其他资源占用';
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
CALL assert_phase3_pda_permission_ids();
|
||||
DROP PROCEDURE IF EXISTS assert_phase3_pda_permission_ids;
|
||||
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
|
||||
(5102190,0,'PLATFORM','MENU',5102094,'platform:firstleg:pda:view','PDA装柜拣货','/first-leg/pda-loading','GET',10,'ACTIVE',1,0),
|
||||
(5102191,0,'PLATFORM','BUTTON',5102190,'platform:firstleg:pda:assign','分配PDA任务',NULL,'POST',20,'ACTIVE',1,0),
|
||||
(5102192,0,'PLATFORM','BUTTON',5102190,'platform:firstleg:pda:work','执行PDA拣货',NULL,'POST',30,'ACTIVE',1,0),
|
||||
(5102193,0,'PLATFORM','BUTTON',5102190,'platform:firstleg:pda:review','复核PDA任务',NULL,'POST',40,'ACTIVE',1,0)
|
||||
ON DUPLICATE KEY UPDATE 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 r.id,p.id,0 FROM iam_role r JOIN iam_permission p ON p.id BETWEEN 5102190 AND 5102193
|
||||
WHERE r.tenant_id=0 AND r.role_code IN ('PLATFORM_ADMIN','ORDER_OPERATOR') AND p.tenant_id=0 AND p.deleted=0;
|
||||
USE baiyue_firstleg;
|
||||
|
||||
DROP PROCEDURE IF EXISTS assert_phase3_final_schema;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE assert_phase3_final_schema()
|
||||
@@ -8398,7 +8533,9 @@ BEGIN
|
||||
'fl_outbound_dispatch','fl_outbound_dispatch_history','fl_outbound_dispatch_operation',
|
||||
'fl_customs_checklist_version','fl_customs_case','fl_customs_document','fl_customs_supplement_request',
|
||||
'fl_customs_submission_batch','fl_customs_receipt','fl_customs_history','fl_customs_operation',
|
||||
'fl_port_schedule','fl_port_schedule_history','fl_port_schedule_operation')) <> 14 THEN
|
||||
'fl_port_schedule','fl_port_schedule_history','fl_port_schedule_operation',
|
||||
'fl_preload_loading_plan_link','fl_loading_pick_assignment','fl_loading_pick_review',
|
||||
'fl_loading_pick_operation')) <> 18 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='统一迁移失败:三期出仓、报关或船期表未完整创建';
|
||||
END IF;
|
||||
IF (SELECT COUNT(*) FROM information_schema.statistics
|
||||
@@ -8422,13 +8559,17 @@ BEGIN
|
||||
'fk_customs_document_case','fk_customs_supplement_case','fk_customs_batch_case',
|
||||
'fk_customs_receipt_case','fk_customs_receipt_batch','fk_customs_history_case',
|
||||
'fk_port_schedule_booking','fk_port_schedule_container','fk_port_schedule_history',
|
||||
'fk_port_schedule_operation')) <> 13 THEN
|
||||
'fk_port_schedule_operation','fk_preload_loading_inbound','fk_preload_loading_preload',
|
||||
'fk_preload_loading_plan','fk_loading_pick_assignment_task','fk_loading_pick_review_task',
|
||||
'fk_loading_pick_operation_task')) <> 19 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='统一迁移失败:三期关键外键未完整创建';
|
||||
END IF;
|
||||
IF (SELECT COUNT(*) FROM information_schema.triggers
|
||||
WHERE trigger_schema='baiyue_firstleg' AND trigger_name IN (
|
||||
'trg_port_schedule_before_insert','trg_port_schedule_before_update',
|
||||
'trg_port_schedule_history_before_update','trg_port_schedule_history_before_delete')) <> 4 THEN
|
||||
'trg_port_schedule_history_before_update','trg_port_schedule_history_before_delete',
|
||||
'trg_loading_pick_review_before_update','trg_loading_pick_review_before_delete',
|
||||
'trg_loading_pick_operation_before_update','trg_loading_pick_operation_before_delete')) <> 8 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='统一迁移失败:港务船期归属或历史保护触发器未完整创建';
|
||||
END IF;
|
||||
IF (SELECT COUNT(*) FROM baiyue_iam.iam_permission WHERE tenant_id=0 AND app_code='PLATFORM'
|
||||
@@ -8439,6 +8580,10 @@ BEGIN
|
||||
AND id BETWEEN 5102180 AND 5102183 AND permission_code LIKE 'platform:firstleg:port-schedule:%') <> 4 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='统一迁移失败:三期出仓、报关或船期权限未完整写入';
|
||||
END IF;
|
||||
IF (SELECT COUNT(*) FROM baiyue_iam.iam_permission WHERE tenant_id=0 AND app_code='PLATFORM'
|
||||
AND id BETWEEN 5102190 AND 5102193 AND permission_code LIKE 'platform:firstleg:pda:%') <> 4 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='统一迁移失败:PDA权限未完整写入';
|
||||
END IF;
|
||||
IF (SELECT COUNT(DISTINCT CONCAT(r.role_code,'|',p.permission_code))
|
||||
FROM baiyue_iam.iam_role_permission rp
|
||||
JOIN baiyue_iam.iam_role r ON r.id=rp.role_id AND r.tenant_id=rp.tenant_id
|
||||
@@ -8446,7 +8591,8 @@ BEGIN
|
||||
WHERE r.tenant_id=0 AND r.role_code IN ('PLATFORM_ADMIN','ORDER_OPERATOR')
|
||||
AND (p.permission_code LIKE 'platform:firstleg:outbound-dispatch:%'
|
||||
OR p.permission_code LIKE 'platform:firstleg:customs:%'
|
||||
OR p.permission_code LIKE 'platform:firstleg:port-schedule:%')) <> 30 THEN
|
||||
OR p.permission_code LIKE 'platform:firstleg:port-schedule:%'
|
||||
OR p.permission_code LIKE 'platform:firstleg:pda:%')) <> 38 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='统一迁移失败:三期出仓、报关或船期角色授权未完整写入';
|
||||
END IF;
|
||||
END$$
|
||||
@@ -8456,4 +8602,4 @@ DROP PROCEDURE IF EXISTS assert_phase3_final_schema;
|
||||
|
||||
-- WAIT_SPLIT 是二期当前有效终点;统一迁移不得改写主表或历史状态。
|
||||
SELECT 'PASS' AS migration_status,
|
||||
'统一增量全部执行完成;箱号映射、单箱测量、三期订舱、拖车预约、出仓、费用、公共资源及可靠审计结构校验通过' AS message;
|
||||
'统一增量全部执行完成;箱号映射、单箱测量、三期订舱、拖车预约、出仓、报关、船期、装柜模型桥接、PDA收敛、费用、公共资源及可靠审计结构校验通过' AS message;
|
||||
|
||||
Reference in New Issue
Block a user