143 lines
4.8 KiB
SQL
143 lines
4.8 KiB
SQL
-- 应收账单:订单占用状态 + 单日期截止日迁移
|
|
-- 适用于已经执行过 ar/ar_bill.sql、price/bill.sql 的数据库。
|
|
-- 请在业务低峰期执行;本脚本只做字段、索引和历史状态初始化,不删除账单明细。
|
|
SET NAMES utf8mb4;
|
|
SET @db_name := DATABASE();
|
|
|
|
-- 1. 给正式账单增加账单名称。历史账单使用账单号生成默认名称。
|
|
SET @has_bill_name := (
|
|
SELECT COUNT(*)
|
|
FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = @db_name
|
|
AND TABLE_NAME = 'ar_bill'
|
|
AND COLUMN_NAME = 'bill_name'
|
|
);
|
|
SET @sql := IF(@has_bill_name = 0,
|
|
'ALTER TABLE ar_bill ADD COLUMN bill_name VARCHAR(100) NULL COMMENT ''账单名称'' AFTER bill_no',
|
|
'SELECT 1');
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
UPDATE ar_bill
|
|
SET bill_name = CONCAT('应收账单-', bill_no)
|
|
WHERE bill_name IS NULL OR TRIM(bill_name) = '';
|
|
|
|
SET @sql := 'ALTER TABLE ar_bill MODIFY COLUMN bill_name VARCHAR(100) NOT NULL COMMENT ''账单名称''';
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
-- 2. 给来源计费订单增加应收账单占用状态。
|
|
SET @has_column := (
|
|
SELECT COUNT(*)
|
|
FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = @db_name
|
|
AND TABLE_NAME = 'prc_order_bill'
|
|
AND COLUMN_NAME = 'ar_bill_status'
|
|
);
|
|
SET @sql := IF(@has_column = 0,
|
|
'ALTER TABLE prc_order_bill ADD COLUMN ar_bill_status VARCHAR(20) NOT NULL DEFAULT ''UNBILLED'' COMMENT ''应收账单占用状态:UNBILLED/BILLED'' AFTER currency',
|
|
'SELECT 1');
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
SET @has_index := (
|
|
SELECT COUNT(*)
|
|
FROM information_schema.STATISTICS
|
|
WHERE TABLE_SCHEMA = @db_name
|
|
AND TABLE_NAME = 'prc_order_bill'
|
|
AND INDEX_NAME = 'idx_bill_ar_status'
|
|
);
|
|
SET @sql := IF(@has_index = 0,
|
|
'ALTER TABLE prc_order_bill ADD INDEX idx_bill_ar_status (customer_id, currency, ar_bill_status, biz_date)',
|
|
'SELECT 1');
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
-- 3. 根据已有账单明细回填历史订单状态。作废账单不占用订单。
|
|
UPDATE prc_order_bill o
|
|
JOIN (
|
|
SELECT DISTINCT d.prc_bill_id
|
|
FROM ar_bill_detail d
|
|
JOIN ar_bill b ON b.ar_bill_id = d.ar_bill_id
|
|
WHERE b.status <> 'VOID'
|
|
) billed ON billed.prc_bill_id = o.bill_id
|
|
SET o.ar_bill_status = 'BILLED'
|
|
WHERE COALESCE(o.ar_bill_status, 'UNBILLED') <> 'BILLED';
|
|
|
|
-- 4. 账单唯一性改为“客户 + 币种 + 截止日 + 版本”。
|
|
-- 同一截止日的作废账单保留历史,新账单使用递增版本号。
|
|
DROP TEMPORARY TABLE IF EXISTS tmp_ar_bill_versions;
|
|
CREATE TEMPORARY TABLE tmp_ar_bill_versions AS
|
|
SELECT ar_bill_id,
|
|
ROW_NUMBER() OVER (
|
|
PARTITION BY customer_id, currency, bill_period_end
|
|
ORDER BY create_time, ar_bill_id
|
|
) AS version_no
|
|
FROM ar_bill;
|
|
|
|
UPDATE ar_bill a
|
|
JOIN tmp_ar_bill_versions v ON v.ar_bill_id = a.ar_bill_id
|
|
SET a.bill_version = v.version_no;
|
|
DROP TEMPORARY TABLE tmp_ar_bill_versions;
|
|
|
|
SET @has_old_unique := (
|
|
SELECT COUNT(*)
|
|
FROM information_schema.STATISTICS
|
|
WHERE TABLE_SCHEMA = @db_name
|
|
AND TABLE_NAME = 'ar_bill'
|
|
AND INDEX_NAME = 'uk_ar_bill_customer_period'
|
|
);
|
|
SET @sql := IF(@has_old_unique > 0,
|
|
'ALTER TABLE ar_bill DROP INDEX uk_ar_bill_customer_period',
|
|
'SELECT 1');
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
SET @has_new_unique := (
|
|
SELECT COUNT(*)
|
|
FROM information_schema.STATISTICS
|
|
WHERE TABLE_SCHEMA = @db_name
|
|
AND TABLE_NAME = 'ar_bill'
|
|
AND INDEX_NAME = 'uk_ar_bill_customer_cutoff_version'
|
|
);
|
|
SET @sql := IF(@has_new_unique = 0,
|
|
'ALTER TABLE ar_bill ADD UNIQUE KEY uk_ar_bill_customer_cutoff_version (customer_id, currency, bill_period_end, bill_version)',
|
|
'SELECT 1');
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
SET @has_cutoff_index := (
|
|
SELECT COUNT(*)
|
|
FROM information_schema.STATISTICS
|
|
WHERE TABLE_SCHEMA = @db_name
|
|
AND TABLE_NAME = 'ar_bill'
|
|
AND INDEX_NAME = 'idx_ar_bill_customer_cutoff'
|
|
);
|
|
SET @sql := IF(@has_cutoff_index = 0,
|
|
'ALTER TABLE ar_bill ADD INDEX idx_ar_bill_customer_cutoff (customer_id, currency, bill_period_end)',
|
|
'SELECT 1');
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
-- 5. 详情页按账单加载费用时使用的排序索引。可重复执行,不会重复创建。
|
|
SET @has_detail_fee_index := (
|
|
SELECT COUNT(*)
|
|
FROM information_schema.STATISTICS
|
|
WHERE TABLE_SCHEMA = @db_name
|
|
AND TABLE_NAME = 'ar_bill_detail_fee'
|
|
AND INDEX_NAME = 'idx_ar_detail_fee_order'
|
|
);
|
|
SET @sql := IF(@has_detail_fee_index = 0,
|
|
'ALTER TABLE ar_bill_detail_fee ADD INDEX idx_ar_detail_fee_order (detail_id, fee_no, detail_fee_id)',
|
|
'SELECT 1');
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|