chore(firstleg): remove legacy inbound evidence schema

This commit is contained in:
2026-08-31 18:19:25 +08:00
parent df0fbc1c7f
commit 4ddfc6fb99
2 changed files with 16 additions and 123 deletions
+13 -122
View File
@@ -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');
@@ -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");
}
}