修改计费订单ID类型为Long,优化相关逻辑

This commit is contained in:
wuweihua
2026-11-14 00:23:47 +08:00
parent 87eab12d51
commit 8b7c346ec4
71 changed files with 929 additions and 346 deletions
@@ -0,0 +1,409 @@
-- 夜间停机:计费/应收/应付 UUID(varchar36) -> bigint AUTO_INCREMENT
-- 执行前:1)停 BMS 应用与异步任务 2)全库或至少关键表备份 3)建议先在从库/备份库干跑
-- 范围 PK:prc_order_bill.bill_id / prc_income_bill.income_bill_id / prc_income_bill_fee.fee_id / prc_pay_bill.pay_bill_id / prc_pay_bill_fee.fee_id
-- 范围 FK/引用:prc_order_bill_ext、income/pay 上 bill_id、prc_billing_task、ar_bill_detail*、ar_bill_generate_task、pay_bill_line/log/diff
-- 不动:ar_bill 等已 bigint;prc_quote* 报价 UUID;任务 taskId
-- 回滚:见文末;更稳妥为整库备份恢复 + 旧后端包
--
-- FK盘点: fk_income_bill_order_bill, fk_income_bill_fee_order, fk_order_bill_ext_bill, fk_pay_bill_order_bill, fk_pay_bill_fee_order
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ========== 0. 前置检查 ==========
SELECT 'prc_order_bill' AS tbl, COUNT(*) AS cnt FROM prc_order_bill
UNION ALL SELECT 'prc_order_bill_ext', COUNT(*) FROM prc_order_bill_ext
UNION ALL SELECT 'prc_income_bill', COUNT(*) FROM prc_income_bill
UNION ALL SELECT 'prc_income_bill_fee', COUNT(*) FROM prc_income_bill_fee
UNION ALL SELECT 'prc_pay_bill', COUNT(*) FROM prc_pay_bill
UNION ALL SELECT 'prc_pay_bill_fee', COUNT(*) FROM prc_pay_bill_fee
UNION ALL SELECT 'ar_bill_detail', COUNT(*) FROM ar_bill_detail
UNION ALL SELECT 'ar_bill_detail_fee', COUNT(*) FROM ar_bill_detail_fee;
SELECT CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = DATABASE()
AND REFERENCED_TABLE_NAME IN ('prc_order_bill','prc_income_bill','prc_income_bill_fee','prc_pay_bill','prc_pay_bill_fee')
ORDER BY TABLE_NAME, CONSTRAINT_NAME;
-- ========== 1. 备份关键表 ==========
DROP TABLE IF EXISTS `prc_order_bill_bak_uuid`;
CREATE TABLE `prc_order_bill_bak_uuid` AS SELECT * FROM `prc_order_bill`;
DROP TABLE IF EXISTS `prc_order_bill_ext_bak_uuid`;
CREATE TABLE `prc_order_bill_ext_bak_uuid` AS SELECT * FROM `prc_order_bill_ext`;
DROP TABLE IF EXISTS `prc_income_bill_bak_uuid`;
CREATE TABLE `prc_income_bill_bak_uuid` AS SELECT * FROM `prc_income_bill`;
DROP TABLE IF EXISTS `prc_income_bill_fee_bak_uuid`;
CREATE TABLE `prc_income_bill_fee_bak_uuid` AS SELECT * FROM `prc_income_bill_fee`;
DROP TABLE IF EXISTS `prc_pay_bill_bak_uuid`;
CREATE TABLE `prc_pay_bill_bak_uuid` AS SELECT * FROM `prc_pay_bill`;
DROP TABLE IF EXISTS `prc_pay_bill_fee_bak_uuid`;
CREATE TABLE `prc_pay_bill_fee_bak_uuid` AS SELECT * FROM `prc_pay_bill_fee`;
-- ========== 2. 映射表 ==========
DROP TABLE IF EXISTS `mig_map_order_bill`;
CREATE TABLE `mig_map_order_bill` (
`old_id` varchar(36) NOT NULL,
`new_id` bigint NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`old_id`),
UNIQUE KEY `uk_new_id` (`new_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `mig_map_order_bill` (`old_id`)
SELECT `bill_id` FROM `prc_order_bill` ORDER BY IFNULL(`create_time`, '1970-01-01'), `bill_id`;
DROP TABLE IF EXISTS `mig_map_income_bill`;
CREATE TABLE `mig_map_income_bill` (
`old_id` varchar(36) NOT NULL,
`new_id` bigint NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`old_id`),
UNIQUE KEY `uk_new_id` (`new_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `mig_map_income_bill` (`old_id`)
SELECT `income_bill_id` FROM `prc_income_bill` ORDER BY IFNULL(`create_time`, '1970-01-01'), `income_bill_id`;
DROP TABLE IF EXISTS `mig_map_income_fee`;
CREATE TABLE `mig_map_income_fee` (
`old_id` varchar(36) NOT NULL,
`new_id` bigint NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`old_id`),
UNIQUE KEY `uk_new_id` (`new_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `mig_map_income_fee` (`old_id`)
SELECT `fee_id` FROM `prc_income_bill_fee` ORDER BY IFNULL(`create_time`, '1970-01-01'), `fee_id`;
DROP TABLE IF EXISTS `mig_map_pay_bill`;
CREATE TABLE `mig_map_pay_bill` (
`old_id` varchar(36) NOT NULL,
`new_id` bigint NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`old_id`),
UNIQUE KEY `uk_new_id` (`new_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `mig_map_pay_bill` (`old_id`)
SELECT `pay_bill_id` FROM `prc_pay_bill` ORDER BY IFNULL(`create_time`, '1970-01-01'), `pay_bill_id`;
DROP TABLE IF EXISTS `mig_map_pay_fee`;
CREATE TABLE `mig_map_pay_fee` (
`old_id` varchar(36) NOT NULL,
`new_id` bigint NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`old_id`),
UNIQUE KEY `uk_new_id` (`new_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `mig_map_pay_fee` (`old_id`)
SELECT `fee_id` FROM `prc_pay_bill_fee` ORDER BY IFNULL(`create_time`, '1970-01-01'), `fee_id`;
-- ========== 3. 重建核心表(动态列) ==========
DROP TABLE IF EXISTS `prc_order_bill_new`;
CREATE TABLE `prc_order_bill_new` LIKE `prc_order_bill`;
ALTER TABLE `prc_order_bill_new` MODIFY COLUMN `bill_id` bigint NOT NULL AUTO_INCREMENT;
SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @cols_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_order_bill' AND COLUMN_NAME NOT IN ('bill_id');
SELECT GROUP_CONCAT(CONCAT('t.`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @sels_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_order_bill' AND COLUMN_NAME NOT IN ('bill_id');
SET @sql := CONCAT(
'INSERT INTO `prc_order_bill_new` (`bill_id`',
IF(@cols_rest IS NULL OR @cols_rest = '', '', CONCAT(', ', @cols_rest)), ') ',
'SELECT mo.new_id',
IF(@sels_rest IS NULL OR @sels_rest = '', '', CONCAT(', ', @sels_rest)), ' ',
'FROM `prc_order_bill` t ',
'JOIN `mig_map_order_bill` mo ON mo.old_id = t.`bill_id` '
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
DROP TABLE IF EXISTS `prc_income_bill_new`;
CREATE TABLE `prc_income_bill_new` LIKE `prc_income_bill`;
ALTER TABLE `prc_income_bill_new` MODIFY COLUMN `income_bill_id` bigint NOT NULL AUTO_INCREMENT;
ALTER TABLE `prc_income_bill_new` MODIFY COLUMN `bill_id` bigint NOT NULL;
SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @cols_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill' AND COLUMN_NAME NOT IN ('income_bill_id','bill_id');
SELECT GROUP_CONCAT(CONCAT('t.`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @sels_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill' AND COLUMN_NAME NOT IN ('income_bill_id','bill_id');
SET @sql := CONCAT(
'INSERT INTO `prc_income_bill_new` (`income_bill_id`, `bill_id`',
IF(@cols_rest IS NULL OR @cols_rest = '', '', CONCAT(', ', @cols_rest)), ') ',
'SELECT mi.new_id, mo.new_id',
IF(@sels_rest IS NULL OR @sels_rest = '', '', CONCAT(', ', @sels_rest)), ' ',
'FROM `prc_income_bill` t ',
'JOIN `mig_map_income_bill` mi ON mi.old_id = t.`income_bill_id` '
,'JOIN `mig_map_order_bill` mo ON mo.old_id = t.`bill_id` '
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
DROP TABLE IF EXISTS `prc_income_bill_fee_new`;
CREATE TABLE `prc_income_bill_fee_new` LIKE `prc_income_bill_fee`;
ALTER TABLE `prc_income_bill_fee_new` MODIFY COLUMN `fee_id` bigint NOT NULL AUTO_INCREMENT;
ALTER TABLE `prc_income_bill_fee_new` MODIFY COLUMN `bill_id` bigint NOT NULL;
ALTER TABLE `prc_income_bill_fee_new` MODIFY COLUMN `income_bill_id` bigint NULL;
SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @cols_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill_fee' AND COLUMN_NAME NOT IN ('fee_id','bill_id','income_bill_id');
SELECT GROUP_CONCAT(CONCAT('t.`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @sels_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill_fee' AND COLUMN_NAME NOT IN ('fee_id','bill_id','income_bill_id');
SET @sql := CONCAT(
'INSERT INTO `prc_income_bill_fee_new` (`fee_id`, `bill_id`, `income_bill_id`',
IF(@cols_rest IS NULL OR @cols_rest = '', '', CONCAT(', ', @cols_rest)), ') ',
'SELECT mf.new_id, mo.new_id, mi.new_id',
IF(@sels_rest IS NULL OR @sels_rest = '', '', CONCAT(', ', @sels_rest)), ' ',
'FROM `prc_income_bill_fee` t ',
'JOIN `mig_map_income_fee` mf ON mf.old_id = t.`fee_id` '
,'JOIN `mig_map_order_bill` mo ON mo.old_id = t.`bill_id` '
,'LEFT JOIN `mig_map_income_bill` mi ON mi.old_id = t.`income_bill_id` '
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
DROP TABLE IF EXISTS `prc_pay_bill_new`;
CREATE TABLE `prc_pay_bill_new` LIKE `prc_pay_bill`;
ALTER TABLE `prc_pay_bill_new` MODIFY COLUMN `pay_bill_id` bigint NOT NULL AUTO_INCREMENT;
ALTER TABLE `prc_pay_bill_new` MODIFY COLUMN `bill_id` bigint NOT NULL;
SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @cols_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill' AND COLUMN_NAME NOT IN ('pay_bill_id','bill_id');
SELECT GROUP_CONCAT(CONCAT('t.`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @sels_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill' AND COLUMN_NAME NOT IN ('pay_bill_id','bill_id');
SET @sql := CONCAT(
'INSERT INTO `prc_pay_bill_new` (`pay_bill_id`, `bill_id`',
IF(@cols_rest IS NULL OR @cols_rest = '', '', CONCAT(', ', @cols_rest)), ') ',
'SELECT mp.new_id, mo.new_id',
IF(@sels_rest IS NULL OR @sels_rest = '', '', CONCAT(', ', @sels_rest)), ' ',
'FROM `prc_pay_bill` t ',
'JOIN `mig_map_pay_bill` mp ON mp.old_id = t.`pay_bill_id` '
,'JOIN `mig_map_order_bill` mo ON mo.old_id = t.`bill_id` '
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
DROP TABLE IF EXISTS `prc_pay_bill_fee_new`;
CREATE TABLE `prc_pay_bill_fee_new` LIKE `prc_pay_bill_fee`;
ALTER TABLE `prc_pay_bill_fee_new` MODIFY COLUMN `fee_id` bigint NOT NULL AUTO_INCREMENT;
ALTER TABLE `prc_pay_bill_fee_new` MODIFY COLUMN `bill_id` bigint NOT NULL;
ALTER TABLE `prc_pay_bill_fee_new` MODIFY COLUMN `pay_bill_id` bigint NULL;
SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @cols_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill_fee' AND COLUMN_NAME NOT IN ('fee_id','bill_id','pay_bill_id');
SELECT GROUP_CONCAT(CONCAT('t.`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @sels_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill_fee' AND COLUMN_NAME NOT IN ('fee_id','bill_id','pay_bill_id');
SET @sql := CONCAT(
'INSERT INTO `prc_pay_bill_fee_new` (`fee_id`, `bill_id`, `pay_bill_id`',
IF(@cols_rest IS NULL OR @cols_rest = '', '', CONCAT(', ', @cols_rest)), ') ',
'SELECT mf.new_id, mo.new_id, mp.new_id',
IF(@sels_rest IS NULL OR @sels_rest = '', '', CONCAT(', ', @sels_rest)), ' ',
'FROM `prc_pay_bill_fee` t ',
'JOIN `mig_map_pay_fee` mf ON mf.old_id = t.`fee_id` '
,'JOIN `mig_map_order_bill` mo ON mo.old_id = t.`bill_id` '
,'LEFT JOIN `mig_map_pay_bill` mp ON mp.old_id = t.`pay_bill_id` '
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- --- prc_order_bill_ext 阴影列 ---
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_order_bill_ext' AND COLUMN_NAME='bill_id_bi')=0,
'ALTER TABLE `prc_order_bill_ext` ADD COLUMN `bill_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
UPDATE `prc_order_bill_ext` e JOIN `mig_map_order_bill` m ON m.old_id = e.bill_id SET e.bill_id_bi = m.new_id;
-- ========== 4. 引用表阴影列 ==========
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail' AND COLUMN_NAME='prc_order_bill_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail' AND COLUMN_NAME='prc_order_bill_id_bi')=0,
'ALTER TABLE `ar_bill_detail` ADD COLUMN `prc_order_bill_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail' AND COLUMN_NAME='prc_order_bill_id')>0,
'UPDATE `ar_bill_detail` x JOIN `mig_map_order_bill` m ON m.old_id = x.`prc_order_bill_id` SET x.`prc_order_bill_id_bi` = m.new_id',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail_fee' AND COLUMN_NAME='prc_income_bill_fee_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail_fee' AND COLUMN_NAME='prc_income_bill_fee_id_bi')=0,
'ALTER TABLE `ar_bill_detail_fee` ADD COLUMN `prc_income_bill_fee_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail_fee' AND COLUMN_NAME='prc_income_bill_fee_id')>0,
'UPDATE `ar_bill_detail_fee` x JOIN `mig_map_income_fee` m ON m.old_id = x.`prc_income_bill_fee_id` SET x.`prc_income_bill_fee_id_bi` = m.new_id',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_generate_task' AND COLUMN_NAME='last_source_bill_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_generate_task' AND COLUMN_NAME='last_source_bill_id_bi')=0,
'ALTER TABLE `ar_bill_generate_task` ADD COLUMN `last_source_bill_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_generate_task' AND COLUMN_NAME='last_source_bill_id')>0,
'UPDATE `ar_bill_generate_task` x JOIN `mig_map_order_bill` m ON m.old_id = x.`last_source_bill_id` SET x.`last_source_bill_id_bi` = m.new_id WHERE x.`last_source_bill_id` IS NOT NULL AND x.`last_source_bill_id` <> \'\'',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_billing_task' AND COLUMN_NAME='bill_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_billing_task' AND COLUMN_NAME='bill_id_bi')=0,
'ALTER TABLE `prc_billing_task` ADD COLUMN `bill_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_billing_task' AND COLUMN_NAME='bill_id')>0,
'UPDATE `prc_billing_task` x JOIN `mig_map_order_bill` m ON m.old_id = x.`bill_id` SET x.`bill_id_bi` = m.new_id WHERE x.`bill_id` IS NOT NULL AND x.`bill_id` <> \'\'',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='order_bill_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='order_bill_id_bi')=0,
'ALTER TABLE `pay_bill_line` ADD COLUMN `order_bill_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='order_bill_id')>0,
'UPDATE `pay_bill_line` x JOIN `mig_map_order_bill` m ON m.old_id = x.`order_bill_id` SET x.`order_bill_id_bi` = m.new_id WHERE x.`order_bill_id` IS NOT NULL AND x.`order_bill_id` <> \'\'',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='fee_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='fee_id_bi')=0,
'ALTER TABLE `pay_bill_line` ADD COLUMN `fee_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='fee_id')>0,
'UPDATE `pay_bill_line` x JOIN `mig_map_pay_fee` m ON m.old_id = x.`fee_id` SET x.`fee_id_bi` = m.new_id WHERE x.`fee_id` IS NOT NULL AND x.`fee_id` <> \'\'',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_log' AND COLUMN_NAME='fee_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_log' AND COLUMN_NAME='fee_id_bi')=0,
'ALTER TABLE `pay_bill_log` ADD COLUMN `fee_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_log' AND COLUMN_NAME='fee_id')>0,
'UPDATE `pay_bill_log` x JOIN `mig_map_pay_fee` m ON m.old_id = x.`fee_id` SET x.`fee_id_bi` = m.new_id WHERE x.`fee_id` IS NOT NULL AND x.`fee_id` <> \'\'',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='fee_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='fee_id_bi')=0,
'ALTER TABLE `pay_bill_diff` ADD COLUMN `fee_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='fee_id')>0,
'UPDATE `pay_bill_diff` x JOIN `mig_map_pay_fee` m ON m.old_id = x.`fee_id` SET x.`fee_id_bi` = m.new_id WHERE x.`fee_id` IS NOT NULL AND x.`fee_id` <> \'\'',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='adjust_fee_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='adjust_fee_id_bi')=0,
'ALTER TABLE `pay_bill_diff` ADD COLUMN `adjust_fee_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='adjust_fee_id')>0,
'UPDATE `pay_bill_diff` x JOIN `mig_map_pay_fee` m ON m.old_id = x.`adjust_fee_id` SET x.`adjust_fee_id_bi` = m.new_id WHERE x.`adjust_fee_id` IS NOT NULL AND x.`adjust_fee_id` <> \'\'',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- ========== 5. 校验(bad 必须为 0,行数必须一致) ==========
SELECT 'ar_detail_orphan' AS chk, COUNT(*) AS bad FROM ar_bill_detail WHERE prc_order_bill_id_bi IS NULL;
SELECT 'ar_fee_orphan' AS chk, COUNT(*) AS bad FROM ar_bill_detail_fee WHERE prc_income_bill_fee_id_bi IS NULL;
SELECT 'ext_orphan' AS chk, COUNT(*) AS bad FROM prc_order_bill_ext WHERE bill_id_bi IS NULL;
SELECT 'order_cnt' AS chk, (SELECT COUNT(*) FROM mig_map_order_bill) m, (SELECT COUNT(*) FROM prc_order_bill) s, (SELECT COUNT(*) FROM prc_order_bill_new) n;
SELECT 'income_cnt' AS chk, (SELECT COUNT(*) FROM mig_map_income_bill) m, (SELECT COUNT(*) FROM prc_income_bill) s, (SELECT COUNT(*) FROM prc_income_bill_new) n;
SELECT 'income_fee_cnt' AS chk, (SELECT COUNT(*) FROM mig_map_income_fee) m, (SELECT COUNT(*) FROM prc_income_bill_fee) s, (SELECT COUNT(*) FROM prc_income_bill_fee_new) n;
SELECT 'pay_cnt' AS chk, (SELECT COUNT(*) FROM mig_map_pay_bill) m, (SELECT COUNT(*) FROM prc_pay_bill) s, (SELECT COUNT(*) FROM prc_pay_bill_new) n;
SELECT 'pay_fee_cnt' AS chk, (SELECT COUNT(*) FROM mig_map_pay_fee) m, (SELECT COUNT(*) FROM prc_pay_bill_fee) s, (SELECT COUNT(*) FROM prc_pay_bill_fee_new) n;
-- 若校验失败:STOP,不执行第 6 步
-- ========== 6. 掉旧 FK 后换表 ==========
SET @sql := IF((SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill' AND CONSTRAINT_NAME='fk_income_bill_order_bill')>0,
'ALTER TABLE `prc_income_bill` DROP FOREIGN KEY `fk_income_bill_order_bill`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill_fee' AND CONSTRAINT_NAME='fk_income_bill_fee_order')>0,
'ALTER TABLE `prc_income_bill_fee` DROP FOREIGN KEY `fk_income_bill_fee_order`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_order_bill_ext' AND CONSTRAINT_NAME='fk_order_bill_ext_bill')>0,
'ALTER TABLE `prc_order_bill_ext` DROP FOREIGN KEY `fk_order_bill_ext_bill`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill' AND CONSTRAINT_NAME='fk_pay_bill_order_bill')>0,
'ALTER TABLE `prc_pay_bill` DROP FOREIGN KEY `fk_pay_bill_order_bill`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill_fee' AND CONSTRAINT_NAME='fk_pay_bill_fee_order')>0,
'ALTER TABLE `prc_pay_bill_fee` DROP FOREIGN KEY `fk_pay_bill_fee_order`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
RENAME TABLE
`prc_order_bill` TO `prc_order_bill_old_uuid`,
`prc_order_bill_new` TO `prc_order_bill`,
`prc_income_bill` TO `prc_income_bill_old_uuid`,
`prc_income_bill_new` TO `prc_income_bill`,
`prc_income_bill_fee` TO `prc_income_bill_fee_old_uuid`,
`prc_income_bill_fee_new` TO `prc_income_bill_fee`,
`prc_pay_bill` TO `prc_pay_bill_old_uuid`,
`prc_pay_bill_new` TO `prc_pay_bill`,
`prc_pay_bill_fee` TO `prc_pay_bill_fee_old_uuid`,
`prc_pay_bill_fee_new` TO `prc_pay_bill_fee`;
-- --- ext / AR / task 引用列落地 ---
ALTER TABLE `prc_order_bill_ext` DROP PRIMARY KEY;
ALTER TABLE `prc_order_bill_ext` DROP COLUMN `bill_id`;
ALTER TABLE `prc_order_bill_ext` CHANGE COLUMN `bill_id_bi` `bill_id` bigint NOT NULL;
ALTER TABLE `prc_order_bill_ext` ADD PRIMARY KEY (`bill_id`);
SET @sql := IF((SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail' AND INDEX_NAME='uk_ar_bill_detail_source')>0,
'ALTER TABLE `ar_bill_detail` DROP INDEX `uk_ar_bill_detail_source`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail' AND INDEX_NAME='idx_ar_bill_detail_source')>0,
'ALTER TABLE `ar_bill_detail` DROP INDEX `idx_ar_bill_detail_source`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
ALTER TABLE `ar_bill_detail` DROP COLUMN `prc_order_bill_id`;
ALTER TABLE `ar_bill_detail` CHANGE COLUMN `prc_order_bill_id_bi` `prc_order_bill_id` bigint NOT NULL;
ALTER TABLE `ar_bill_detail` ADD UNIQUE KEY `uk_ar_bill_detail_source` (`ar_bill_id`,`prc_order_bill_id`);
ALTER TABLE `ar_bill_detail` ADD KEY `idx_ar_bill_detail_source` (`prc_order_bill_id`);
SET @sql := IF((SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail_fee' AND INDEX_NAME='uk_ar_detail_prc_income_fee')>0,
'ALTER TABLE `ar_bill_detail_fee` DROP INDEX `uk_ar_detail_prc_income_fee`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail_fee' AND INDEX_NAME='idx_ar_detail_prc_income_fee')>0,
'ALTER TABLE `ar_bill_detail_fee` DROP INDEX `idx_ar_detail_prc_income_fee`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
ALTER TABLE `ar_bill_detail_fee` DROP COLUMN `prc_income_bill_fee_id`;
ALTER TABLE `ar_bill_detail_fee` CHANGE COLUMN `prc_income_bill_fee_id_bi` `prc_income_bill_fee_id` bigint NOT NULL;
ALTER TABLE `ar_bill_detail_fee` ADD UNIQUE KEY `uk_ar_detail_prc_income_fee` (`detail_id`,`prc_income_bill_fee_id`);
ALTER TABLE `ar_bill_detail_fee` ADD KEY `idx_ar_detail_prc_income_fee` (`prc_income_bill_fee_id`);
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_generate_task' AND COLUMN_NAME='last_source_bill_id_bi')>0,
'ALTER TABLE `ar_bill_generate_task` DROP COLUMN `last_source_bill_id`, CHANGE COLUMN `last_source_bill_id_bi` `last_source_bill_id` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_billing_task' AND COLUMN_NAME='bill_id_bi')>0,
'ALTER TABLE `prc_billing_task` DROP COLUMN `bill_id`, CHANGE COLUMN `bill_id_bi` `bill_id` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='order_bill_id_bi')>0,
'ALTER TABLE `pay_bill_line` DROP COLUMN `order_bill_id`, CHANGE COLUMN `order_bill_id_bi` `order_bill_id` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='fee_id_bi')>0,
'ALTER TABLE `pay_bill_line` DROP COLUMN `fee_id`, CHANGE COLUMN `fee_id_bi` `fee_id` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_log' AND COLUMN_NAME='fee_id_bi')>0,
'ALTER TABLE `pay_bill_log` DROP COLUMN `fee_id`, CHANGE COLUMN `fee_id_bi` `fee_id` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='fee_id_bi')>0,
'ALTER TABLE `pay_bill_diff` DROP COLUMN `fee_id`, CHANGE COLUMN `fee_id_bi` `fee_id` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='adjust_fee_id_bi')>0,
'ALTER TABLE `pay_bill_diff` DROP COLUMN `adjust_fee_id`, CHANGE COLUMN `adjust_fee_id_bi` `adjust_fee_id` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- ========== 7. 重建 FK + AUTO_INCREMENT ==========
ALTER TABLE `prc_order_bill_ext` ADD CONSTRAINT `fk_order_bill_ext_bill` FOREIGN KEY (`bill_id`) REFERENCES `prc_order_bill` (`bill_id`) ON DELETE CASCADE;
ALTER TABLE `prc_income_bill` ADD CONSTRAINT `fk_income_bill_order_bill` FOREIGN KEY (`bill_id`) REFERENCES `prc_order_bill` (`bill_id`) ON DELETE CASCADE;
ALTER TABLE `prc_income_bill_fee` ADD CONSTRAINT `fk_income_bill_fee_order` FOREIGN KEY (`bill_id`) REFERENCES `prc_order_bill` (`bill_id`) ON DELETE CASCADE;
ALTER TABLE `prc_pay_bill` ADD CONSTRAINT `fk_pay_bill_order_bill` FOREIGN KEY (`bill_id`) REFERENCES `prc_order_bill` (`bill_id`) ON DELETE CASCADE;
ALTER TABLE `prc_pay_bill_fee` ADD CONSTRAINT `fk_pay_bill_fee_order` FOREIGN KEY (`bill_id`) REFERENCES `prc_order_bill` (`bill_id`) ON DELETE CASCADE;
SET @ai := (SELECT IFNULL(MAX(`bill_id`),0)+1 FROM `prc_order_bill`);
SET @sql := CONCAT('ALTER TABLE `prc_order_bill` AUTO_INCREMENT=', @ai);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @ai := (SELECT IFNULL(MAX(`income_bill_id`),0)+1 FROM `prc_income_bill`);
SET @sql := CONCAT('ALTER TABLE `prc_income_bill` AUTO_INCREMENT=', @ai);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @ai := (SELECT IFNULL(MAX(`fee_id`),0)+1 FROM `prc_income_bill_fee`);
SET @sql := CONCAT('ALTER TABLE `prc_income_bill_fee` AUTO_INCREMENT=', @ai);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @ai := (SELECT IFNULL(MAX(`pay_bill_id`),0)+1 FROM `prc_pay_bill`);
SET @sql := CONCAT('ALTER TABLE `prc_pay_bill` AUTO_INCREMENT=', @ai);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @ai := (SELECT IFNULL(MAX(`fee_id`),0)+1 FROM `prc_pay_bill_fee`);
SET @sql := CONCAT('ALTER TABLE `prc_pay_bill_fee` AUTO_INCREMENT=', @ai);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
-- ========== 8. 抽查 ==========
SELECT d.detail_id, d.prc_order_bill_id, o.order_no FROM ar_bill_detail d JOIN prc_order_bill o ON o.bill_id = d.prc_order_bill_id LIMIT 5;
SELECT f.detail_fee_id, f.prc_income_bill_fee_id, i.fee_type FROM ar_bill_detail_fee f JOIN prc_income_bill_fee i ON i.fee_id = f.prc_income_bill_fee_id LIMIT 5;
-- ========== 9. 回滚说明(勿自动执行) ==========
-- 推荐:整库从备份恢复 + 部署旧后端包
-- 或:SET FOREIGN_KEY_CHECKS=0; RENAME 把 *_bak_uuid 换回主表名(引用列需另外恢复)
--
-- ========== 10. 次日清理 ==========
-- DROP TABLE IF EXISTS prc_order_bill_old_uuid, prc_order_bill_bak_uuid, prc_income_bill_old_uuid, prc_income_bill_bak_uuid,
-- prc_income_bill_fee_old_uuid, prc_income_bill_fee_bak_uuid, prc_pay_bill_old_uuid, prc_pay_bill_bak_uuid,
-- prc_pay_bill_fee_old_uuid, prc_pay_bill_fee_bak_uuid, prc_order_bill_ext_bak_uuid;
-- DROP TABLE IF EXISTS mig_map_order_bill, mig_map_income_bill, mig_map_income_fee, mig_map_pay_bill, mig_map_pay_fee;
--
-- 冒烟:1)新建/重计费 2)出应收 3)查应付费用 4)旧 AR 明细关联订单
+118
View File
@@ -0,0 +1,118 @@
#!/usr/bin/env bash
# 夜间停机:仅在数据库服务器(或能连库的跳板机)执行
# 依赖:mysql 客户端
#
# export BMS_DB_HOST=127.0.0.1
# export BMS_DB_PORT=3306
# export BMS_DB_NAME=bms
# export BMS_DB_USER=root
# export BMS_DB_PASS='******'
# chmod +x 20261113_uuid_to_bigint_run.sh
# ./20261113_uuid_to_bigint_run.sh
#
# CONFIRM=YES ./20261113_uuid_to_bigint_run.sh
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SQL_FILE="${SQL_FILE:-${SCRIPT_DIR}/20261113_uuid_to_bigint_order_bill.sql}"
LOG_DIR="${LOG_DIR:-${SCRIPT_DIR}/logs}"
TS="$(date +%Y%m%d_%H%M%S)"
LOG_FILE="${LOG_DIR}/uuid_to_bigint_${TS}.log"
BMS_DB_HOST="${BMS_DB_HOST:-127.0.0.1}"
BMS_DB_PORT="${BMS_DB_PORT:-3306}"
BMS_DB_NAME="${BMS_DB_NAME:-bms}"
BMS_DB_USER="${BMS_DB_USER:-root}"
if [[ -z "${BMS_DB_PASS:-}" ]]; then
echo "请先设置环境变量 BMS_DB_PASS(不要把密码写进脚本)"
exit 1
fi
if [[ ! -f "${SQL_FILE}" ]]; then
echo "找不到 SQL 文件: ${SQL_FILE}"
exit 1
fi
if ! command -v mysql >/dev/null 2>&1; then
echo "未找到 mysql 客户端,请先安装"
exit 1
fi
mkdir -p "${LOG_DIR}"
echo "========================================"
echo " UUID -> bigint 迁移"
echo " host=${BMS_DB_HOST} port=${BMS_DB_PORT} db=${BMS_DB_NAME} user=${BMS_DB_USER}"
echo " sql=${SQL_FILE}"
echo " log=${LOG_FILE}"
echo "========================================"
echo
echo "【必须】先停 Java / BMS,再执行本脚本。"
echo "执行前请确认:"
echo " 1) Java / BMS 应用与异步 worker 已全部停掉(不要边跑边迁)"
echo " 2) 已做全库/关键表备份"
echo " 3) 磅盘空间足够(建议 >= 订单+ext+费用表 2~3 倍)"
echo " 4) SQL 成功后,再部署 Long 版后端并启动"
echo
if [[ "${CONFIRM:-}" != "YES" ]]; then
read -r -p "已停 Java?输入 YES 开始执行 SQL: " ans
if [[ "${ans}" != "YES" ]]; then
echo "已取消(请先停 Java 再来)"
exit 1
fi
else
echo "CONFIRM=YES:假定你已停 Java,直接开始 SQL..."
fi
MYSQL_OPTS=(
-h "${BMS_DB_HOST}"
-P "${BMS_DB_PORT}"
-u "${BMS_DB_USER}"
"-p${BMS_DB_PASS}"
--default-character-set=utf8mb4
--comments
"${BMS_DB_NAME}"
)
echo
echo "[$(date '+%F %T')] 连接检查..." | tee -a "${LOG_FILE}"
mysql "${MYSQL_OPTS[@]}" -e "SELECT DATABASE() AS db, NOW() AS now_ts;" | tee -a "${LOG_FILE}"
echo "[$(date '+%F %T')] 行数预览..." | tee -a "${LOG_FILE}"
mysql "${MYSQL_OPTS[@]}" -e "
SELECT 'prc_order_bill' AS tbl, COUNT(*) AS cnt FROM prc_order_bill
UNION ALL SELECT 'prc_order_bill_ext', COUNT(*) FROM prc_order_bill_ext
UNION ALL SELECT 'prc_income_bill', COUNT(*) FROM prc_income_bill
UNION ALL SELECT 'prc_income_bill_fee', COUNT(*) FROM prc_income_bill_fee
UNION ALL SELECT 'prc_pay_bill', COUNT(*) FROM prc_pay_bill
UNION ALL SELECT 'prc_pay_bill_fee', COUNT(*) FROM prc_pay_bill_fee;
" | tee -a "${LOG_FILE}"
START_TS="$(date +%s)"
echo "[$(date '+%F %T')] 开始执行迁移 SQL..." | tee -a "${LOG_FILE}"
set +e
mysql "${MYSQL_OPTS[@]}" < "${SQL_FILE}" 2>&1 | tee -a "${LOG_FILE}"
RC=${PIPESTATUS[0]}
set -e
END_TS="$(date +%s)"
ELAPSED=$((END_TS - START_TS))
if [[ "${RC}" -ne 0 ]]; then
echo "[$(date '+%F %T')] 失败 exit=${RC} 耗时=${ELAPSED}s,请查日志: ${LOG_FILE}" | tee -a "${LOG_FILE}"
echo "若已换表中途失败:优先整库备份恢复,不要部署新后端"
exit "${RC}"
fi
echo "[$(date '+%F %T')] 成功耗时=${ELAPSED}s (约 $((ELAPSED/60)) 分钟)" | tee -a "${LOG_FILE}"
echo
echo "下一步:"
echo " 1) 抽查日志中校验/抽查结果"
echo " 2) 部署 Long 版后端并启应用"
echo " 3) 按 20261113_uuid_to_bigint_runbook.md 做冒烟"
echo "日志: ${LOG_FILE}"
@@ -0,0 +1,64 @@
# UUID -> bigint 夜间执行与冒烟清单
脚本:`bms-back/sql/20261113_uuid_to_bigint_order_bill.sql`
## 必须顺序(不要飞)
1. **先停 Java / BMS 服务**(含计费、出账、导出等异步 worker)
2. 全库或关键表备份
3. 在服务器执行 SQL(下面一键脚本)
4. SQL 成功后,再部署 **Long 版** 后端并启动
5. 冒烟
>旧包连新库或新包连旧库都会挂。**一定先停 Java,再跑 SQL。**
## 服务器一键执行
把同目录下 `20261113_uuid_to_bigint_order_bill.sql` 与 `20261113_uuid_to_bigint_run.sh` 一起上传到服务器。
```bash
# 1) 先停 Java(按你们部署方式改,以下为示例)
# systemctl stop bms-admin
# 或:kill / docker stop / 停掉所有 java -jar bms-*.jar
# 2) 再跑迁移
export BMS_DB_HOST=127.0.0.1
export BMS_DB_PORT=3306
export BMS_DB_NAME=bms
export BMS_DB_USER=root
export BMS_DB_PASS='******'
chmod +x 20261113_uuid_to_bigint_run.sh
./20261113_uuid_to_bigint_run.sh
# 或非交互:CONFIRM=YES ./20261113_uuid_to_bigint_run.sh
```
日志写在 `sql/logs/uuid_to_bigint_*.log`。
## 执行前
1. **已停 Java / BMS**(含计费/出账/导出异步)
2. 全库备份(或至少:prc_order_bill*、prc_income*、prc_pay_bill*、ar_bill_detail*、prc_billing_task、pay_bill_line)
3. 建议在从库/备份库先干跑校验
4. 准备好 Long 版后端包(SQL 成功后再发)
## 执行
1. 确认 Java 已停
2. 跑 `./20261113_uuid_to_bigint_run.sh`(内部会执行整份 SQL)
3. 查日志校验/抽查通过
4. 部署新后端,启应用
## 冒烟
- [ ] 订单列表能打开,billId 为数字
- [ ] 新建/重计费一票,生成新 bigint bill_id
- [ ] 手动加一笔应收费用 / 查费用明细
- [ ] 生成一笔应收账单,明细能关联订单
- [ ] 旧应收账单明细 JOIN prc_order_bill 正常
- [ ] 应付费用/应付账单查看正常
## 回滚
1. 停新包
2. **推荐**:整库从备份恢复
3. 或:`SET FOREIGN_KEY_CHECKS=0` 后将 `*_bak_uuid` RENAME 回主表名(引用列需额外处理)
4. 部署旧后端包
## 次日
- 确认无误后 DROP `*_old_uuid` / `*_bak_uuid` / `mig_map_*`
+16 -16
View File
@@ -127,7 +127,7 @@ CREATE TABLE `ar_bill_void_task` (
CREATE TABLE `ar_bill_detail` (
`detail_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '账单订单明细ID',
`ar_bill_id` bigint(20) NOT NULL COMMENT '应收账单ID',
`prc_order_bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '来源计费订单ID,对应 prc_order_bill.bill_id',
`prc_order_bill_id` bigint(20) NOT NULL COMMENT '来源计费订单ID,对应 prc_order_bill.bill_id',
`detail_no` int(11) NOT NULL COMMENT '账单内顺序号',
`order_no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单号快照',
`tracking_no` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '运单号快照',
@@ -170,7 +170,7 @@ CREATE TABLE `ar_bill_detail` (
CREATE TABLE `ar_bill_detail_fee` (
`detail_fee_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '账单费用明细ID',
`detail_id` bigint(20) NOT NULL COMMENT '账单订单明细ID',
`prc_income_bill_fee_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '来源收入费用ID,对应 prc_income_bill_fee.fee_id',
`prc_income_bill_fee_id` bigint(20) NOT NULL COMMENT '来源收入费用ID,对应 prc_income_bill_fee.fee_id',
`fee_no` int(11) NOT NULL COMMENT '订单内费用顺序号',
`fee_type` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '费用类型快照',
`fee_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '费用名称快照',
@@ -234,7 +234,7 @@ CREATE TABLE `ar_bill_generate_task` (
`selection_mode` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '选择模式:EXPLICIT=手动选择,ALL_MATCHED=全选查询结果',
`request_payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '生成请求快照JSON',
`snapshot_create_time` datetime DEFAULT NULL COMMENT '来源订单创建时间快照',
`last_source_bill_id` varchar(36) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '来源订单游标',
`last_source_bill_id` bigint(20) DEFAULT NULL COMMENT '来源订单游标',
`total_count` int(11) NOT NULL DEFAULT '-1' COMMENT '待处理订单数,-1表示尚未统计',
`processed_count` int(11) NOT NULL DEFAULT '0' COMMENT '已处理订单数',
`success_count` int(11) NOT NULL DEFAULT '0' COMMENT '成功订单数',
@@ -789,7 +789,7 @@ CREATE TABLE `prc_billing_task` (
`bill_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '计费类型:PENDING待计费 REBILL重计费 REFUND退费',
`success_status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'WAITING' COMMENT '是否计费成功:WAITING待处理 SUCCESS成功 FAILED失败',
`bill_time` datetime DEFAULT NULL COMMENT '计费时间',
`bill_id` varchar(36) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '计费订单ID prc_order_bill.bill_id',
`bill_id` bigint(20) DEFAULT NULL COMMENT '计费订单ID prc_order_bill.bill_id',
`fail_code` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '失败码',
`error_message` varchar(1000) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '失败原因',
`create_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
@@ -834,8 +834,8 @@ CREATE TABLE `prc_customer_price_set` (
-- 表结构:`prc_income_bill`
-- ----------------------------
CREATE TABLE `prc_income_bill` (
`income_bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应收主表ID',
`bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '计费订单ID,对应 prc_order_bill.bill_id,一对一',
`income_bill_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '应收主表ID',
`bill_id` bigint(20) NOT NULL COMMENT '计费订单ID,对应 prc_order_bill.bill_id,一对一',
`currency` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT 'CNY' COMMENT '币种',
`product_amount` decimal(18,4) DEFAULT NULL COMMENT '产品价合计',
`redline_amount` decimal(18,4) DEFAULT NULL COMMENT '红线价合计',
@@ -880,9 +880,9 @@ CREATE TABLE `prc_profit_commission_rate` (
-- 表结构:`prc_income_bill_fee`
-- ----------------------------
CREATE TABLE `prc_income_bill_fee` (
`fee_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '费用明细ID',
`bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '计费ID',
`income_bill_id` varchar(36) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '应收主表ID,对应 prc_income_bill.income_bill_id',
`fee_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '费用明细ID',
`bill_id` bigint(20) NOT NULL COMMENT '计费ID',
`income_bill_id` bigint(20) DEFAULT NULL COMMENT '应收主表ID,对应 prc_income_bill.income_bill_id',
`fee_type` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '费用类型(字典bms_fee_type)',
`fee_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '费用名称',
`sc_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '附加费配置ID',
@@ -908,7 +908,7 @@ CREATE TABLE `prc_income_bill_fee` (
-- 表结构:`prc_order_bill`
-- ----------------------------
CREATE TABLE `prc_order_bill` (
`bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '计费ID',
`bill_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '计费ID',
`bill_key` char(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'MD5(order_no)',
`order_no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单号',
`tracking_no` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '运单号',
@@ -1003,7 +1003,7 @@ CREATE TABLE `prc_order_bill` (
-- 表结构:`prc_order_bill_ext`
-- ----------------------------
CREATE TABLE `prc_order_bill_ext` (
`bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '计费订单ID,对应 prc_order_bill.bill_id',
`bill_id` bigint(20) NOT NULL COMMENT '计费订单ID,对应 prc_order_bill.bill_id',
`order_no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单号',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
@@ -1189,8 +1189,8 @@ CREATE TABLE `prc_order_bill_ext` (
-- 表结构:`prc_pay_bill`
-- ----------------------------
CREATE TABLE `prc_pay_bill` (
`pay_bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应付主表ID',
`bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '计费订单ID,对应 prc_order_bill.bill_id,一对一',
`pay_bill_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '应付主表ID',
`bill_id` bigint(20) NOT NULL COMMENT '计费订单ID,对应 prc_order_bill.bill_id,一对一',
`currency` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT 'CNY' COMMENT '币种',
`product_amount` decimal(18,4) DEFAULT NULL COMMENT '产品价合计',
`redline_amount` decimal(18,4) DEFAULT NULL COMMENT '红线价合计',
@@ -1215,9 +1215,9 @@ CREATE TABLE `prc_pay_bill` (
-- 表结构:`prc_pay_bill_fee`
-- ----------------------------
CREATE TABLE `prc_pay_bill_fee` (
`fee_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '费用明细ID',
`bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '计费ID',
`pay_bill_id` varchar(36) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '应付主表ID,对应 prc_pay_bill.pay_bill_id',
`fee_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '费用明细ID',
`bill_id` bigint(20) NOT NULL COMMENT '计费ID',
`pay_bill_id` bigint(20) DEFAULT NULL COMMENT '应付主表ID,对应 prc_pay_bill.pay_bill_id',
`fee_type` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '费用类型(字典bms_fee_type)',
`fee_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '费用名称',
`sc_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '附加费配置ID',
+1 -1
View File
@@ -98,7 +98,7 @@ CREATE TABLE IF NOT EXISTS `pay_bill` (
CREATE TABLE IF NOT EXISTS `pay_bill_line` (
`line_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '账单行ID',
`bill_id` bigint(20) NOT NULL COMMENT '应付账单ID',
`order_bill_id` varchar(36) DEFAULT NULL COMMENT '订单ID',
`order_bill_id` bigint(20) DEFAULT NULL COMMENT '订单ID',
`order_no` varchar(64) DEFAULT NULL COMMENT '订单号',
`lading_no` varchar(64) DEFAULT NULL COMMENT '提单号',
`lading_fee_id` bigint(20) DEFAULT NULL COMMENT '留在主单上的费用',
+4 -4
View File
@@ -23,7 +23,7 @@ ALTER TABLE `bms`.`pay_bill` ADD COLUMN `confirm_by` varchar(64) CHARACTER SET u
ALTER TABLE `bms`.`pay_bill` ADD COLUMN `confirm_time` datetime DEFAULT NULL COMMENT '审核时间' AFTER `confirm_by`;
-- `pay_bill_line` 增加费用明细ID
ALTER TABLE `bms`.`pay_bill_line` ADD COLUMN `fee_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '应付费用明细ID' AFTER `bill_id`;
ALTER TABLE `bms`.`pay_bill_line` ADD COLUMN `fee_id` bigint(20) DEFAULT NULL COMMENT '应付费用明细ID' AFTER `bill_id`;
-- `pay_bill_line` 增加费用来源
ALTER TABLE `bms`.`pay_bill_line` ADD COLUMN `fee_source` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'CALC计算 LADING提单分摊 MANUAL人工' AFTER `fee_name`;
@@ -53,7 +53,7 @@ ALTER TABLE `bms`.`pay_bill_log` ADD COLUMN `biz_id` bigint(20) DEFAULT NULL COM
ALTER TABLE `bms`.`pay_bill_log` ADD COLUMN `line_id` bigint(20) DEFAULT NULL COMMENT '账单行ID' AFTER `biz_id`;
-- `pay_bill_log` 增加费用明细
ALTER TABLE `bms`.`pay_bill_log` ADD COLUMN `fee_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '费用明细ID' AFTER `line_id`;
ALTER TABLE `bms`.`pay_bill_log` ADD COLUMN `fee_id` bigint(20) DEFAULT NULL COMMENT '费用明细ID' AFTER `line_id`;
-- `pay_bill_log` 增加改前金额
ALTER TABLE `bms`.`pay_bill_log` ADD COLUMN `amount_before` decimal(18,4) DEFAULT NULL COMMENT '改前金额' AFTER `operation_desc`;
@@ -66,13 +66,13 @@ CREATE TABLE `bms`.`pay_bill_diff` (
`diff_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '差异ID',
`bill_id` bigint(20) NOT NULL COMMENT '应付账单ID',
`line_id` bigint(20) NOT NULL COMMENT '账单行ID',
`fee_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '费用明细ID',
`fee_id` bigint(20) DEFAULT NULL COMMENT '费用明细ID',
`our_amount` decimal(18,4) NOT NULL COMMENT '我方金额',
`supplier_amount` decimal(18,4) NOT NULL COMMENT '对方金额',
`diff_amount` decimal(18,4) NOT NULL COMMENT '差额,对方减我方',
`reason` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '差异原因',
`handle_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'OPEN未处理 ACCEPT_OURS接受我方 ACCEPT_THEIRS接受对方',
`adjust_fee_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '接受对方时新增的调整费用',
`adjust_fee_id` bigint(20) DEFAULT NULL COMMENT '接受对方时新增的调整费用',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`diff_id`),