89 lines
5.4 KiB
SQL
89 lines
5.4 KiB
SQL
-- Firstleg费用来源事件消费模型存量升级(MySQL 8,可重复执行)
|
|
USE baiyue_finance;
|
|
|
|
DROP PROCEDURE IF EXISTS finance_fee_source_add_column;
|
|
DELIMITER $$
|
|
CREATE PROCEDURE finance_fee_source_add_column(
|
|
IN target_table VARCHAR(64), IN target_column VARCHAR(64), IN column_definition TEXT
|
|
)
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM information_schema.columns
|
|
WHERE table_schema = DATABASE() AND table_name = target_table AND column_name = target_column
|
|
) THEN
|
|
SET @ddl = CONCAT('ALTER TABLE `', target_table, '` ADD COLUMN `', target_column, '` ', column_definition);
|
|
PREPARE statement FROM @ddl;
|
|
EXECUTE statement;
|
|
DEALLOCATE PREPARE statement;
|
|
END IF;
|
|
END$$
|
|
DELIMITER ;
|
|
|
|
CALL finance_fee_source_add_column('fin_fee_source', 'source_type',
|
|
"VARCHAR(32) NULL COMMENT '来源费用类型:INBOUND_FEE入库单费用、CONTAINER_FEE柜子费用' AFTER customer_id");
|
|
CALL finance_fee_source_add_column('fin_fee_source', 'source_no',
|
|
"VARCHAR(64) NULL COMMENT '来源入库单号或柜号快照,可为空' AFTER source_type");
|
|
CALL finance_fee_source_add_column('fin_fee_source', 'direction',
|
|
"VARCHAR(16) NULL COMMENT '费用方向:RECEIVABLE应收、PAYABLE应付' AFTER source_no");
|
|
CALL finance_fee_source_add_column('fin_fee_source', 'container_id',
|
|
"BIGINT UNSIGNED NULL COMMENT '来源Firstleg装柜计划ID,可为空' AFTER inbound_id");
|
|
CALL finance_fee_source_add_column('fin_fee_source', 'fee_item_code',
|
|
"VARCHAR(64) NULL COMMENT '来源费用项目编码快照' AFTER container_id");
|
|
CALL finance_fee_source_add_column('fin_fee_source', 'source_hash',
|
|
"CHAR(64) NULL COMMENT 'Firstleg费用来源完整快照SHA-256哈希' AFTER currency_code");
|
|
CALL finance_fee_source_add_column('fin_fee_source', 'source_snapshot',
|
|
"JSON NULL COMMENT 'Firstleg费用来源完整不可变JSON快照' AFTER source_hash");
|
|
CALL finance_fee_source_add_column('fin_fee_source', 'updated_at',
|
|
"DATETIME(3) NULL COMMENT '来源状态最后更新时间,数据修改时自动刷新' AFTER created_at");
|
|
CALL finance_fee_source_add_column('fin_inbox_event', 'payload_hash',
|
|
"CHAR(64) NULL COMMENT '规范化事件内容SHA-256哈希,用于同事件ID冲突检测' AFTER payload");
|
|
CALL finance_fee_source_add_column('fin_inbox_event', 'result_resource_id',
|
|
"BIGINT UNSIGNED NULL COMMENT '成功处理生成或定位的费用来源快照ID' AFTER payload_hash");
|
|
CALL finance_fee_source_add_column('fin_inbox_event', 'error_code',
|
|
"VARCHAR(64) NULL COMMENT '处理失败时的稳定FIN错误码' AFTER result_resource_id");
|
|
|
|
DROP PROCEDURE IF EXISTS finance_fee_source_add_column;
|
|
|
|
-- 产品确认无历史财务数据;以下兼容值仅用于空环境重复迁移时保证结构收敛。
|
|
UPDATE fin_fee_source
|
|
SET source_type = COALESCE(source_type, 'INBOUND_FEE'),
|
|
direction = COALESCE(direction, 'RECEIVABLE'),
|
|
fee_item_code = COALESCE(fee_item_code, 'LEGACY'),
|
|
source_hash = COALESCE(source_hash, SHA2(CONCAT_WS('|', source_system, source_fee_id, source_fee_version), 256)),
|
|
source_snapshot = COALESCE(source_snapshot, JSON_OBJECT('migrated', TRUE)),
|
|
updated_at = COALESCE(updated_at, created_at);
|
|
UPDATE fin_inbox_event
|
|
SET payload_hash = COALESCE(payload_hash, SHA2(CAST(payload AS CHAR), 256));
|
|
|
|
ALTER TABLE fin_fee_source
|
|
MODIFY COLUMN source_type VARCHAR(32) NOT NULL COMMENT '来源费用类型:INBOUND_FEE入库单费用、CONTAINER_FEE柜子费用',
|
|
MODIFY COLUMN direction VARCHAR(16) NOT NULL COMMENT '费用方向:RECEIVABLE应收、PAYABLE应付',
|
|
MODIFY COLUMN fee_item_code VARCHAR(64) NOT NULL COMMENT '来源费用项目编码快照',
|
|
MODIFY COLUMN source_hash CHAR(64) NOT NULL COMMENT 'Firstleg费用来源完整快照SHA-256哈希',
|
|
MODIFY COLUMN source_snapshot JSON NOT NULL COMMENT 'Firstleg费用来源完整不可变JSON快照',
|
|
MODIFY COLUMN status VARCHAR(16) NOT NULL DEFAULT 'AVAILABLE' COMMENT '费用来源状态:AVAILABLE可结算、SUPERSEDED已被新版本替代、VOIDED已作废',
|
|
MODIFY COLUMN updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '来源状态最后更新时间,数据修改时自动刷新';
|
|
ALTER TABLE fin_inbox_event
|
|
MODIFY COLUMN payload_hash CHAR(64) NOT NULL COMMENT '规范化事件内容SHA-256哈希,用于同事件ID冲突检测',
|
|
MODIFY COLUMN status VARCHAR(16) NOT NULL DEFAULT 'RECEIVED' COMMENT '事件处理状态:RECEIVED已接收、PROCESSED已完成、FAILED处理失败';
|
|
|
|
DROP PROCEDURE IF EXISTS finance_fee_source_assert_schema;
|
|
DELIMITER $$
|
|
CREATE PROCEDURE finance_fee_source_assert_schema()
|
|
BEGIN
|
|
IF (SELECT COUNT(*) FROM information_schema.columns
|
|
WHERE table_schema = DATABASE() AND table_name = 'fin_fee_source'
|
|
AND column_name IN ('source_type','source_no','direction','container_id','fee_item_code',
|
|
'source_hash','source_snapshot','updated_at')) <> 8 THEN
|
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Finance费用来源迁移失败:来源快照字段不完整';
|
|
END IF;
|
|
IF (SELECT COUNT(*) FROM information_schema.columns
|
|
WHERE table_schema = DATABASE() AND table_name = 'fin_inbox_event'
|
|
AND column_name IN ('payload_hash','result_resource_id','error_code')) <> 3 THEN
|
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Finance费用来源迁移失败:Inbox幂等字段不完整';
|
|
END IF;
|
|
END$$
|
|
DELIMITER ;
|
|
CALL finance_fee_source_assert_schema();
|
|
DROP PROCEDURE IF EXISTS finance_fee_source_assert_schema;
|