-- 二期入库测量与 OCR 维护增量(只增不删,可重复执行)。 -- 执行顺序:phase2-inbound-schema.sql 后执行本文件;已有二期库只需执行本文件。 SET NAMES utf8mb4; USE baiyue_firstleg; DROP PROCEDURE IF EXISTS phase2_measure_add_column; DELIMITER $$ CREATE PROCEDURE phase2_measure_add_column( IN p_table_name VARCHAR(64), IN p_column_name VARCHAR(64), IN p_column_definition TEXT ) BEGIN IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = p_table_name AND column_name = p_column_name ) THEN SET @phase2_measure_sql = CONCAT( 'ALTER TABLE `', REPLACE(p_table_name, '`', '``'), '` ADD COLUMN `', REPLACE(p_column_name, '`', '``'), '` ', p_column_definition ); PREPARE phase2_measure_statement FROM @phase2_measure_sql; EXECUTE phase2_measure_statement; DEALLOCATE PREPARE phase2_measure_statement; END IF; END$$ DELIMITER ; CALL phase2_measure_add_column('fl_inbound_measurement', 'original_document_no', 'VARCHAR(64) NULL COMMENT ''原单据号码快照'' AFTER raw_payload_json'); CALL phase2_measure_add_column('fl_inbound_measurement', 'original_gross_weight_kg', 'DECIMAL(18,3) NULL COMMENT ''原单据毛重kg'' AFTER original_document_no'); CALL phase2_measure_add_column('fl_inbound_measurement', 'original_volume_cbm', 'DECIMAL(18,4) NULL COMMENT ''原单据体积或材积m3'' AFTER original_gross_weight_kg'); CALL phase2_measure_add_column('fl_inbound_measurement', 'actual_goods_name', 'VARCHAR(255) NULL COMMENT ''实际品名'' AFTER original_volume_cbm'); CALL phase2_measure_add_column('fl_inbound_measurement', 'volume_weight_kg', 'DECIMAL(18,3) NULL COMMENT ''本批次总材积重kg'' AFTER total_volume_cbm'); CALL phase2_measure_add_column('fl_inbound_measurement', 'version', 'INT NOT NULL DEFAULT 0 COMMENT ''乐观锁版本号'' AFTER updated_at'); CALL phase2_measure_add_column('fl_inbound_measurement_item', 'box_specification', 'VARCHAR(64) NOT NULL DEFAULT '''' COMMENT ''箱规标识'' AFTER item_no'); CALL phase2_measure_add_column('fl_inbound_measurement_item', 'girth_cm', 'DECIMAL(12,3) NOT NULL DEFAULT 0 COMMENT ''周长cm,规则为长+2*(宽+高)'' AFTER height_cm'); CALL phase2_measure_add_column('fl_inbound_measurement_item', 'unit_volume_cbm', 'DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT ''单箱业务体积m3'' AFTER volume_cbm'); CALL phase2_measure_add_column('fl_inbound_measurement_item', 'total_volume_cbm', 'DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT ''本箱规总体积m3'' AFTER volume_cbm'); CALL phase2_measure_add_column('fl_inbound_measurement_item', 'volume_weight_kg', 'DECIMAL(18,3) NOT NULL DEFAULT 0 COMMENT ''本箱规材积重kg'' AFTER total_volume_cbm'); CALL phase2_measure_add_column('fl_inbound_measurement_item', 'over_limit_warning', 'VARCHAR(500) NULL COMMENT ''超线提醒快照'' AFTER source_image_file_id'); CALL phase2_measure_add_column('fl_inbound_measurement_item', 'outer_length_cm', 'DECIMAL(12,3) NULL COMMENT ''外箱规长度cm'' AFTER over_limit_warning'); CALL phase2_measure_add_column('fl_inbound_measurement_item', 'outer_width_cm', 'DECIMAL(12,3) NULL COMMENT ''外箱规宽度cm'' AFTER outer_length_cm'); CALL phase2_measure_add_column('fl_inbound_measurement_item', 'outer_height_cm', 'DECIMAL(12,3) NULL COMMENT ''外箱规高度cm'' AFTER outer_width_cm'); CALL phase2_measure_add_column('fl_inbound_measurement_item', 'manual_outer_length_cm', 'DECIMAL(12,3) NULL COMMENT ''仓库人工外箱规长度计算基数cm'' AFTER outer_height_cm'); CALL phase2_measure_add_column('fl_inbound_measurement_item', 'manual_outer_width_cm', 'DECIMAL(12,3) NULL COMMENT ''仓库人工外箱规宽度计算基数cm'' AFTER manual_outer_length_cm'); CALL phase2_measure_add_column('fl_inbound_measurement_item', 'manual_outer_height_cm', 'DECIMAL(12,3) NULL COMMENT ''仓库人工外箱规高度计算基数cm'' AFTER manual_outer_width_cm'); CALL phase2_measure_add_column('fl_inbound_measurement_item', 'charge_rule_id', 'BIGINT UNSIGNED NULL COMMENT ''该测量明细绑定的客户计费规则ID'' AFTER volume_weight_kg'); CALL phase2_measure_add_column('fl_inbound_measurement_item', 'coefficient_mode', 'VARCHAR(16) NULL COMMENT ''系数模式快照:ADD或MULTIPLY'' AFTER charge_rule_id'); DROP PROCEDURE IF EXISTS phase2_measure_add_column; CREATE TABLE IF NOT EXISTS fl_inbound_weight_revision ( id BIGINT UNSIGNED NOT NULL COMMENT 'OCR重量修订记录ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键', inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', weight_result_id BIGINT UNSIGNED NOT NULL COMMENT 'OCR重量结果ID', revision_no INT UNSIGNED NOT NULL COMMENT '结果版本号,与乐观锁版本一致', action VARCHAR(24) NOT NULL COMMENT '动作:CORRECT或CONFIRM', before_weight_value DECIMAL(18,3) NULL COMMENT '变更前原单位重量', before_weight_unit VARCHAR(8) NULL COMMENT '变更前单位', after_weight_value DECIMAL(18,3) NULL COMMENT '变更后原单位重量', after_weight_unit VARCHAR(8) NULL COMMENT '变更后单位', gross_weight_kg DECIMAL(18,3) NULL COMMENT '确认时统一换算后的含托盘毛重kg', net_weight_kg DECIMAL(18,3) NULL COMMENT '确认毛重扣除托盘皮重后的货物净重kg', reason VARCHAR(500) NULL COMMENT '人工修正原因', operator_id BIGINT UNSIGNED NOT NULL COMMENT '操作人ID', operator_name VARCHAR(64) NULL COMMENT '操作人名称快照', operated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '操作时间', PRIMARY KEY (id), UNIQUE KEY uk_weight_revision_no (tenant_id, weight_result_id, revision_no), KEY idx_weight_revision_time (tenant_id, inbound_id, operated_at), CONSTRAINT fk_weight_revision_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id), CONSTRAINT fk_weight_revision_result FOREIGN KEY (weight_result_id) REFERENCES fl_inbound_weight_result (id) ) ENGINE=InnoDB COMMENT='OCR重量人工修正和确认的不可变版本历史';