From 4ddfc6fb990b937676af12a4011e1233cfbde442 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Mon, 31 Aug 2026 18:19:25 +0800 Subject: [PATCH] chore(firstleg): remove legacy inbound evidence schema --- deploy/sql/头程数据库统一增量-MySQL8.sql | 135 ++---------------- .../LoadingEvidenceSqlContractTest.java | 4 +- 2 files changed, 16 insertions(+), 123 deletions(-) diff --git a/deploy/sql/头程数据库统一增量-MySQL8.sql b/deploy/sql/头程数据库统一增量-MySQL8.sql index 21546d613..926e50709 100644 --- a/deploy/sql/头程数据库统一增量-MySQL8.sql +++ b/deploy/sql/头程数据库统一增量-MySQL8.sql @@ -7670,34 +7670,6 @@ CREATE TABLE IF NOT EXISTS fl_loading_cabinet_evidence ( CONSTRAINT chk_cabinet_evidence_status CHECK (status IN ('ACTIVE','VOID')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='柜次物理装柜证据;task仅记录来源审计'; -CREATE TABLE IF NOT EXISTS fl_loading_evidence ( - id BIGINT UNSIGNED NOT NULL COMMENT '装柜证据记录ID', - tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键', - inbound_id BIGINT UNSIGNED NOT NULL COMMENT '关联入库单逻辑ID', - evidence_type VARCHAR(32) NOT NULL COMMENT 'PHOTO_STEP_1空仓/PHOTO_STEP_2半仓/PHOTO_STEP_3满仓/PHOTO_STEP_4锁仓/SEAL带锁码照', - file_id BIGINT UNSIGNED NOT NULL COMMENT 'File 服务逻辑文件ID', - file_name VARCHAR(255) NULL COMMENT '上传时文件名称快照', - seal_no VARCHAR(64) NULL COMMENT '锁码文本;带锁码照必填,客户不可见', - remark VARCHAR(1000) NULL COMMENT '证据补充说明', - status VARCHAR(16) NOT NULL DEFAULT 'ACTIVE' COMMENT '证据状态:ACTIVE有效、VOID已作废;错误照片保留记录不硬删除', - void_reason VARCHAR(500) NULL COMMENT '照片作废原因', - voided_by BIGINT UNSIGNED NULL COMMENT '执行作废的平台操作人ID', - voided_by_name VARCHAR(64) NULL COMMENT '执行作废的平台操作人姓名快照', - voided_at DATETIME(3) NULL COMMENT '照片作废时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号,每次更新递增', - created_by BIGINT UNSIGNED NOT NULL COMMENT '上传证据的操作人ID', - created_by_name VARCHAR(64) NULL COMMENT '上传证据的操作人姓名快照', - updated_by BIGINT UNSIGNED NOT NULL COMMENT '最后修改操作人ID', - updated_by_name VARCHAR(64) 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 '证据记录最后更新时间', - PRIMARY KEY (id), - KEY idx_loading_evidence_type (tenant_id, inbound_id, evidence_type, status), - KEY idx_loading_evidence_seal (tenant_id, seal_no, status), - KEY idx_loading_evidence_time (tenant_id, inbound_id, updated_at), - CONSTRAINT fk_loading_evidence_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id) -) ENGINE=InnoDB COMMENT='订单装柜空仓/半仓/满仓/锁仓/带锁码照证据'; - CREATE TABLE IF NOT EXISTS fl_loading_operation ( id BIGINT UNSIGNED NOT NULL COMMENT '装柜写操作记录ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键', @@ -9838,60 +9810,6 @@ SELECT role.id,permission.id,0 FROM iam_role role JOIN iam_permission permission AND permission.permission_code IN ('platform:firstleg:customs:list','platform:firstleg:customs:manage') WHERE role.tenant_id=0 AND role.role_code IN ('PLATFORM_ADMIN','ORDER_OPERATOR'); USE baiyue_firstleg; --- Phase 3 loading evidence hardening for existing databases. Evidence is append-only: --- multiple active/void records of the same type are allowed; voiding is an audit action. -USE baiyue_firstleg; -DROP PROCEDURE IF EXISTS phase3_loading_evidence_add_column; -DELIMITER $$ -CREATE PROCEDURE phase3_loading_evidence_add_column(IN p_column VARCHAR(64), IN p_definition VARCHAR(255)) -BEGIN - SET @ddl = IF( - EXISTS(SELECT 1 FROM information_schema.tables - WHERE table_schema=DATABASE() AND table_name='fl_loading_evidence') - AND NOT EXISTS(SELECT 1 FROM information_schema.columns - WHERE table_schema=DATABASE() AND table_name='fl_loading_evidence' AND column_name=p_column), - CONCAT('ALTER TABLE fl_loading_evidence ADD COLUMN `', p_column, '` ', p_definition), - 'SELECT 1'); - PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -END$$ -DELIMITER ; -CALL phase3_loading_evidence_add_column('status', 'VARCHAR(16) NOT NULL DEFAULT ''ACTIVE'' COMMENT ''ACTIVE/VOID'''); -CALL phase3_loading_evidence_add_column('void_reason', 'VARCHAR(500) NULL'); -CALL phase3_loading_evidence_add_column('voided_by', 'BIGINT UNSIGNED NULL'); -CALL phase3_loading_evidence_add_column('voided_by_name', 'VARCHAR(64) NULL'); -CALL phase3_loading_evidence_add_column('voided_at', 'DATETIME(3) NULL'); -DROP PROCEDURE IF EXISTS phase3_loading_evidence_add_column; - -UPDATE fl_loading_evidence SET status='ACTIVE' WHERE status IS NULL OR status=''; -UPDATE fl_loading_evidence SET seal_no=NULL WHERE evidence_type<>'SEAL' AND seal_no IS NOT NULL; - -SET @ddl = IF( - EXISTS(SELECT 1 FROM information_schema.statistics - WHERE table_schema=DATABASE() AND table_name='fl_loading_evidence' - AND index_name='uk_loading_evidence_type'), - 'ALTER TABLE fl_loading_evidence DROP INDEX uk_loading_evidence_type', 'SELECT 1'); -PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -SET @ddl = IF( - EXISTS(SELECT 1 FROM information_schema.statistics - WHERE table_schema=DATABASE() AND table_name='fl_loading_evidence' - AND index_name='uk_loading_evidence_seal'), - 'ALTER TABLE fl_loading_evidence DROP INDEX uk_loading_evidence_seal', 'SELECT 1'); -PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -SET @ddl = IF( - NOT EXISTS(SELECT 1 FROM information_schema.statistics - WHERE table_schema=DATABASE() AND table_name='fl_loading_evidence' - AND index_name='idx_loading_evidence_type'), - 'ALTER TABLE fl_loading_evidence ADD KEY idx_loading_evidence_type (tenant_id,inbound_id,evidence_type,status)', - 'SELECT 1'); -PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -SET @ddl = IF( - NOT EXISTS(SELECT 1 FROM information_schema.statistics - WHERE table_schema=DATABASE() AND table_name='fl_loading_evidence' - AND index_name='idx_loading_evidence_seal'), - 'ALTER TABLE fl_loading_evidence ADD KEY idx_loading_evidence_seal (tenant_id,seal_no,status)', - '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 COMMENT '关联ID', @@ -10043,27 +9961,14 @@ BEGIN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='统一迁移失败:三期出仓、报关或船期表未完整创建'; END IF; IF (SELECT COUNT(*) FROM information_schema.columns - WHERE table_schema='baiyue_firstleg' AND table_name='fl_loading_evidence' - AND column_name IN ('status','void_reason','voided_by','voided_by_name','voided_at')) <> 5 + WHERE table_schema='baiyue_firstleg' AND table_name='fl_loading_cabinet_evidence' + AND column_name IN ('container_booking_id','source_task_id','active_flag','operation_key','request_hash')) <> 5 OR (SELECT COUNT(*) FROM information_schema.statistics - WHERE table_schema='baiyue_firstleg' AND table_name='fl_loading_evidence' - AND index_name='uk_loading_evidence_type') <> 0 + WHERE table_schema='baiyue_firstleg' AND table_name='fl_loading_cabinet_evidence' + AND index_name='uk_cabinet_evidence_active' AND non_unique=0) <> 3 OR (SELECT COUNT(*) FROM information_schema.statistics - WHERE table_schema='baiyue_firstleg' AND table_name='fl_loading_evidence' - AND index_name='uk_loading_evidence_seal') <> 0 - OR (SELECT COUNT(*) FROM information_schema.statistics - WHERE table_schema='baiyue_firstleg' AND table_name='fl_loading_evidence' - AND index_name='idx_loading_evidence_type' AND non_unique=1 - AND ((seq_in_index=1 AND column_name='tenant_id') - OR (seq_in_index=2 AND column_name='inbound_id') - OR (seq_in_index=3 AND column_name='evidence_type') - OR (seq_in_index=4 AND column_name='status'))) <> 4 - OR (SELECT COUNT(*) FROM information_schema.statistics - WHERE table_schema='baiyue_firstleg' AND table_name='fl_loading_evidence' - AND index_name='idx_loading_evidence_seal' AND non_unique=1 - AND ((seq_in_index=1 AND column_name='tenant_id') - OR (seq_in_index=2 AND column_name='seal_no') - OR (seq_in_index=3 AND column_name='status'))) <> 3 + WHERE table_schema='baiyue_firstleg' AND table_name='fl_loading_cabinet_evidence' + AND index_name='uk_cabinet_evidence_operation' AND non_unique=0) <> 2 OR (SELECT COUNT(*) FROM information_schema.statistics WHERE table_schema='baiyue_firstleg' AND table_name='fl_outbound_dispatch' AND index_name='uk_outbound_dispatch_owner' AND non_unique=0) <> 3 @@ -12150,7 +12055,7 @@ CALL queue_table_comment('baiyue_firstleg', 'fl_inbound_status_history', '入库 CALL queue_table_comment('baiyue_firstleg', 'fl_inbound_transport_snapshot', '入库单关联运输信息只读快照'); CALL queue_table_comment('baiyue_firstleg', 'fl_inbound_weight_result', '称重图片、托盘皮重快照、OCR毛重和确认净重'); CALL queue_table_comment('baiyue_firstleg', 'fl_inbound_weight_revision', 'OCR重量人工修正和确认的不可变版本历史'); -CALL queue_table_comment('baiyue_firstleg', 'fl_loading_evidence', '订单装柜空仓/半仓/满仓/锁仓/带锁码照证据'); +CALL queue_table_comment('baiyue_firstleg', 'fl_loading_cabinet_evidence', '柜次物理装柜证据;任务仅记录来源审计'); CALL queue_table_comment('baiyue_firstleg', 'fl_loading_operation', '装柜与派送写操作幂等记录'); CALL queue_table_comment('baiyue_firstleg', 'fl_loading_pick_assignment', '柜次PDA任务领取与作业员分配'); CALL queue_table_comment('baiyue_firstleg', 'fl_loading_pick_history', 'PDA拣货幂等和操作审计历史'); @@ -13461,26 +13366,12 @@ CALL queue_column_comment('baiyue_firstleg', 'fl_inbound_weight_revision', 'reas CALL queue_column_comment('baiyue_firstleg', 'fl_inbound_weight_revision', 'revision_no', '结果版本号,与乐观锁版本一致'); CALL queue_column_comment('baiyue_firstleg', 'fl_inbound_weight_revision', 'tenant_id', '客户ID和数据隔离键'); CALL queue_column_comment('baiyue_firstleg', 'fl_inbound_weight_revision', 'weight_result_id', 'OCR重量结果ID'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'created_at', '证据记录创建时间'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'created_by', '上传证据的操作人ID'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'created_by_name', '上传证据的操作人姓名快照'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'evidence_type', 'PHOTO_STEP_1空仓/PHOTO_STEP_2半仓/PHOTO_STEP_3满仓/PHOTO_STEP_4锁仓/SEAL带锁码照'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'file_id', 'File 服务逻辑文件ID'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'file_name', '上传时文件名称快照'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'id', '装柜证据记录ID'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'inbound_id', '关联入库单逻辑ID'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'remark', '证据补充说明'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'seal_no', '锁码文本;带锁码照必填,客户不可见'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'status', '证据状态:ACTIVE有效、VOID已作废;错误照片保留记录不硬删除'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'tenant_id', '客户ID和数据隔离键'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'updated_at', '证据记录最后更新时间'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'updated_by', '最后修改操作人ID'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'updated_by_name', '最后修改操作人姓名快照'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'version', '乐观锁版本号,每次更新递增'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'void_reason', '照片作废原因'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'voided_at', '照片作废时间'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'voided_by', '执行作废的平台操作人ID'); -CALL queue_column_comment('baiyue_firstleg', 'fl_loading_evidence', 'voided_by_name', '执行作废的平台操作人姓名快照'); +CALL queue_column_comment('baiyue_firstleg', 'fl_loading_cabinet_evidence', 'container_booking_id', '证据唯一归属柜次ID'); +CALL queue_column_comment('baiyue_firstleg', 'fl_loading_cabinet_evidence', 'source_task_id', '上传来源PDA任务ID,仅用于审计'); +CALL queue_column_comment('baiyue_firstleg', 'fl_loading_cabinet_evidence', 'evidence_type', 'PHOTO_STEP_1至PHOTO_STEP_4或SEAL'); +CALL queue_column_comment('baiyue_firstleg', 'fl_loading_cabinet_evidence', 'active_flag', '有效记录为1,作废记录为NULL,保证每柜每类型仅一条有效事实'); +CALL queue_column_comment('baiyue_firstleg', 'fl_loading_cabinet_evidence', 'operation_key', '任务范围内幂等操作键'); +CALL queue_column_comment('baiyue_firstleg', 'fl_loading_cabinet_evidence', 'request_hash', '规范化请求SHA-256摘要'); CALL queue_column_comment('baiyue_firstleg', 'fl_loading_operation', 'completed_at', '操作完成时间'); CALL queue_column_comment('baiyue_firstleg', 'fl_loading_operation', 'created_at', '操作声明创建时间'); CALL queue_column_comment('baiyue_firstleg', 'fl_loading_operation', 'id', '装柜写操作记录ID'); diff --git a/firstleg/src/test/java/com/baiyue/firstleg/loading/repository/LoadingEvidenceSqlContractTest.java b/firstleg/src/test/java/com/baiyue/firstleg/loading/repository/LoadingEvidenceSqlContractTest.java index f6e453383..cd5c6ac9c 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/loading/repository/LoadingEvidenceSqlContractTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/loading/repository/LoadingEvidenceSqlContractTest.java @@ -31,6 +31,8 @@ class LoadingEvidenceSqlContractTest { String sql = Files.readString(unified, StandardCharsets.UTF_8); assertThat(sql).contains("CREATE TABLE IF NOT EXISTS fl_loading_cabinet_evidence") .contains("uk_cabinet_evidence_active") - .contains("uk_cabinet_evidence_operation"); + .contains("uk_cabinet_evidence_operation") + .doesNotContain("CREATE TABLE IF NOT EXISTS fl_loading_evidence") + .doesNotContain("phase3_loading_evidence_add_column"); } }