85 lines
3.0 KiB
SQL
85 lines
3.0 KiB
SQL
-- 应收模块运行期优化脚本(不回填历史数据)
|
|
--
|
|
-- 用于已经存在业务表的环境。脚本可重复执行:字段或索引已存在时自动跳过,
|
|
-- 不会修改历史订单的 ar_bill_status,也不会重算历史账单版本。
|
|
SET NAMES utf8mb4;
|
|
SET @db_name := DATABASE();
|
|
|
|
-- 1. 账单唯一性调整。
|
|
-- 旧版本 uk_ar_bill_customer_period 会禁止同一客户同一账期再次生成账单,
|
|
-- 与 bill_version 版本化方案冲突,必须删除。
|
|
SET @has_old_bill_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_bill_unique > 0,
|
|
'ALTER TABLE ar_bill DROP INDEX uk_ar_bill_customer_period',
|
|
'SELECT 1');
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
-- 新唯一键要求已有数据的 bill_version 已正确区分。
|
|
-- 如果这里创建失败,请先执行 ar_bill_cutoff_status_migration.sql 回填历史版本。
|
|
SET @has_bill_version_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_bill_version_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;
|
|
|
|
-- 2. 计费订单应收账单占用状态。
|
|
SET @has_ar_bill_status := (
|
|
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_ar_bill_status = 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;
|
|
|
|
-- 3. 订单预览、占用和释放使用的组合索引。
|
|
SET @has_order_status_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_order_status_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;
|
|
|
|
-- 4. 详情页批量关联费用时使用的排序索引。
|
|
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;
|