2026-08-06 11:49:51 +08:00
|
|
|
SET NAMES utf8mb4;
|
|
|
|
|
USE baiyue_firstleg;
|
|
|
|
|
|
2026-08-10 11:28:57 +08:00
|
|
|
/* 装柜证据、PDA 拣货复核和派送完成。五类证据按有效记录计数,同类型允许多图追加;作废记录保留审计。 */
|
2026-08-06 11:49:51 +08:00
|
|
|
CREATE TABLE IF NOT EXISTS fl_loading_evidence (
|
|
|
|
|
id BIGINT UNSIGNED NOT NULL,
|
|
|
|
|
tenant_id BIGINT UNSIGNED NOT NULL,
|
|
|
|
|
inbound_id BIGINT UNSIGNED NOT NULL,
|
2026-08-10 11:28:57 +08:00
|
|
|
evidence_type VARCHAR(32) NOT NULL COMMENT 'PHOTO_STEP_1空仓/PHOTO_STEP_2半仓/PHOTO_STEP_3满仓/PHOTO_STEP_4锁仓/SEAL带锁码照',
|
2026-08-08 22:36:41 +08:00
|
|
|
file_id BIGINT UNSIGNED NOT NULL COMMENT 'File 服务逻辑文件ID',
|
2026-08-06 11:49:51 +08:00
|
|
|
file_name VARCHAR(255) NULL,
|
|
|
|
|
seal_no VARCHAR(64) NULL,
|
|
|
|
|
remark VARCHAR(1000) NULL,
|
2026-08-10 11:28:57 +08:00
|
|
|
status VARCHAR(16) NOT NULL DEFAULT 'ACTIVE' COMMENT 'ACTIVE/VOID,作废不硬删除',
|
|
|
|
|
void_reason VARCHAR(500) NULL,
|
|
|
|
|
voided_by BIGINT UNSIGNED NULL,
|
|
|
|
|
voided_by_name VARCHAR(64) NULL,
|
|
|
|
|
voided_at DATETIME(3) NULL,
|
2026-08-06 11:49:51 +08:00
|
|
|
version INT NOT NULL DEFAULT 0,
|
|
|
|
|
created_by BIGINT UNSIGNED NOT NULL,
|
|
|
|
|
created_by_name VARCHAR(64) NULL,
|
|
|
|
|
updated_by BIGINT UNSIGNED NOT NULL,
|
|
|
|
|
updated_by_name VARCHAR(64) NULL,
|
|
|
|
|
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),
|
2026-08-10 11:28:57 +08:00
|
|
|
KEY idx_loading_evidence_type (tenant_id, inbound_id, evidence_type, status),
|
|
|
|
|
KEY idx_loading_evidence_seal (tenant_id, seal_no, status),
|
2026-08-06 11:49:51 +08:00
|
|
|
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)
|
2026-08-10 11:28:57 +08:00
|
|
|
) ENGINE=InnoDB COMMENT='订单装柜空仓/半仓/满仓/锁仓/带锁码照证据';
|
|
|
|
|
|
|
|
|
|
/* Repeatable migration for installations that already created the single-slot table. */
|
|
|
|
|
DROP PROCEDURE IF EXISTS phase3_loading_add_column;
|
|
|
|
|
DELIMITER $$
|
|
|
|
|
CREATE PROCEDURE phase3_loading_add_column(IN p_column VARCHAR(64), IN p_definition VARCHAR(512))
|
|
|
|
|
BEGIN
|
|
|
|
|
IF NOT EXISTS (
|
|
|
|
|
SELECT 1 FROM information_schema.columns
|
|
|
|
|
WHERE table_schema=DATABASE() AND table_name='fl_loading_evidence' AND column_name=p_column
|
|
|
|
|
) THEN
|
|
|
|
|
SET @phase3_loading_ddl = CONCAT('ALTER TABLE fl_loading_evidence ADD COLUMN `', p_column, '` ', p_definition);
|
|
|
|
|
PREPARE phase3_loading_stmt FROM @phase3_loading_ddl;
|
|
|
|
|
EXECUTE phase3_loading_stmt;
|
|
|
|
|
DEALLOCATE PREPARE phase3_loading_stmt;
|
|
|
|
|
END IF;
|
|
|
|
|
END$$
|
|
|
|
|
DELIMITER ;
|
|
|
|
|
CALL phase3_loading_add_column('status', 'VARCHAR(16) NOT NULL DEFAULT ''ACTIVE'' COMMENT ''ACTIVE/VOID,作废不硬删除''');
|
|
|
|
|
CALL phase3_loading_add_column('void_reason', 'VARCHAR(500) NULL');
|
|
|
|
|
CALL phase3_loading_add_column('voided_by', 'BIGINT UNSIGNED NULL');
|
|
|
|
|
CALL phase3_loading_add_column('voided_by_name', 'VARCHAR(64) NULL');
|
|
|
|
|
CALL phase3_loading_add_column('voided_at', 'DATETIME(3) NULL');
|
|
|
|
|
DROP PROCEDURE IF EXISTS phase3_loading_add_column;
|
|
|
|
|
|
|
|
|
|
SET @phase3_loading_has_legacy_type_index = (
|
|
|
|
|
SELECT COUNT(*) FROM information_schema.statistics
|
|
|
|
|
WHERE table_schema=DATABASE() AND table_name='fl_loading_evidence' AND index_name='uk_loading_evidence_type'
|
|
|
|
|
);
|
|
|
|
|
SET @phase3_loading_drop_legacy_type_index = IF(@phase3_loading_has_legacy_type_index > 0,
|
|
|
|
|
'ALTER TABLE fl_loading_evidence DROP INDEX uk_loading_evidence_type', 'SELECT 1');
|
|
|
|
|
PREPARE phase3_loading_drop_stmt FROM @phase3_loading_drop_legacy_type_index;
|
|
|
|
|
EXECUTE phase3_loading_drop_stmt;
|
|
|
|
|
DEALLOCATE PREPARE phase3_loading_drop_stmt;
|
|
|
|
|
|
|
|
|
|
SET @phase3_loading_has_type_index = (
|
|
|
|
|
SELECT COUNT(*) FROM information_schema.statistics
|
|
|
|
|
WHERE table_schema=DATABASE() AND table_name='fl_loading_evidence' AND index_name='idx_loading_evidence_type'
|
|
|
|
|
);
|
|
|
|
|
SET @phase3_loading_add_type_index = IF(@phase3_loading_has_type_index = 0,
|
|
|
|
|
'ALTER TABLE fl_loading_evidence ADD KEY idx_loading_evidence_type (tenant_id, inbound_id, evidence_type, status)', 'SELECT 1');
|
|
|
|
|
PREPARE phase3_loading_type_stmt FROM @phase3_loading_add_type_index;
|
|
|
|
|
EXECUTE phase3_loading_type_stmt;
|
|
|
|
|
DEALLOCATE PREPARE phase3_loading_type_stmt;
|
|
|
|
|
|
|
|
|
|
SET @phase3_loading_has_legacy_seal_index = (
|
|
|
|
|
SELECT COUNT(*) FROM information_schema.statistics
|
|
|
|
|
WHERE table_schema=DATABASE() AND table_name='fl_loading_evidence' AND index_name='uk_loading_evidence_seal'
|
|
|
|
|
);
|
|
|
|
|
SET @phase3_loading_drop_legacy_seal_index = IF(@phase3_loading_has_legacy_seal_index > 0,
|
|
|
|
|
'ALTER TABLE fl_loading_evidence DROP INDEX uk_loading_evidence_seal', 'SELECT 1');
|
|
|
|
|
PREPARE phase3_loading_drop_seal_stmt FROM @phase3_loading_drop_legacy_seal_index;
|
|
|
|
|
EXECUTE phase3_loading_drop_seal_stmt;
|
|
|
|
|
DEALLOCATE PREPARE phase3_loading_drop_seal_stmt;
|
|
|
|
|
|
|
|
|
|
SET @phase3_loading_has_seal_index = (
|
|
|
|
|
SELECT COUNT(*) FROM information_schema.statistics
|
|
|
|
|
WHERE table_schema=DATABASE() AND table_name='fl_loading_evidence' AND index_name='idx_loading_evidence_seal'
|
|
|
|
|
);
|
|
|
|
|
SET @phase3_loading_add_seal_index = IF(@phase3_loading_has_seal_index = 0,
|
|
|
|
|
'ALTER TABLE fl_loading_evidence ADD KEY idx_loading_evidence_seal (tenant_id, seal_no, status)', 'SELECT 1');
|
|
|
|
|
PREPARE phase3_loading_seal_stmt FROM @phase3_loading_add_seal_index;
|
|
|
|
|
EXECUTE phase3_loading_seal_stmt;
|
|
|
|
|
DEALLOCATE PREPARE phase3_loading_seal_stmt;
|
2026-08-06 11:49:51 +08:00
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS fl_loading_operation (
|
|
|
|
|
id BIGINT UNSIGNED NOT NULL,
|
|
|
|
|
tenant_id BIGINT UNSIGNED NOT NULL,
|
|
|
|
|
inbound_id BIGINT UNSIGNED NOT NULL,
|
|
|
|
|
operator_id BIGINT UNSIGNED NOT NULL,
|
|
|
|
|
operation VARCHAR(48) NOT NULL,
|
|
|
|
|
idempotency_key VARCHAR(128) NOT NULL,
|
|
|
|
|
request_hash CHAR(64) NOT NULL,
|
|
|
|
|
status VARCHAR(16) NOT NULL DEFAULT 'PROCESSING',
|
|
|
|
|
result_json JSON NULL,
|
|
|
|
|
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
|
|
|
|
completed_at DATETIME(3) NULL,
|
|
|
|
|
PRIMARY KEY (id),
|
|
|
|
|
UNIQUE KEY uk_loading_operation (tenant_id, inbound_id, operator_id, operation, idempotency_key),
|
|
|
|
|
KEY idx_loading_operation_time (tenant_id, inbound_id, created_at),
|
|
|
|
|
CONSTRAINT fk_loading_operation_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id)
|
|
|
|
|
) ENGINE=InnoDB COMMENT='装柜与派送写操作幂等记录';
|
|
|
|
|
|
2026-08-08 11:33:20 +08:00
|
|
|
CREATE TABLE IF NOT EXISTS fl_inbound_loading_pick_task (
|
2026-08-06 11:49:51 +08:00
|
|
|
id BIGINT UNSIGNED NOT NULL,
|
|
|
|
|
tenant_id BIGINT UNSIGNED NOT NULL,
|
|
|
|
|
inbound_id BIGINT UNSIGNED NOT NULL,
|
|
|
|
|
status VARCHAR(24) NOT NULL DEFAULT 'PENDING' COMMENT 'PENDING/IN_PROGRESS/COMPLETED',
|
|
|
|
|
version INT NOT NULL DEFAULT 0,
|
|
|
|
|
expected_count INT UNSIGNED NULL,
|
|
|
|
|
picked_count INT UNSIGNED NULL,
|
|
|
|
|
remark VARCHAR(1000) NULL,
|
|
|
|
|
updated_by BIGINT UNSIGNED NOT NULL,
|
|
|
|
|
updated_by_name VARCHAR(64) NULL,
|
|
|
|
|
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_loading_pick_tenant_inbound (tenant_id, inbound_id),
|
|
|
|
|
KEY idx_loading_pick_status (tenant_id, status, updated_at),
|
|
|
|
|
CONSTRAINT fk_loading_pick_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id)
|
|
|
|
|
) ENGINE=InnoDB COMMENT='PDA拣货任务及结果';
|