diff --git a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillExportMapper.xml b/bms-back/bms-system/src/main/resources/mapper/ar/ArBillExportMapper.xml
index 121e8a06..12433438 100644
--- a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillExportMapper.xml
+++ b/bms-back/bms-system/src/main/resources/mapper/ar/ArBillExportMapper.xml
@@ -44,7 +44,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
export_by,
export_time,
remark
- from ar_bill_export
+ from ar_bill_detail_export
- insert into ar_bill_export (
+ insert into ar_bill_detail_export (
ar_bill_id, file_name, file_type, template_id, template_code, template_version,
template_storage_type, template_storage_key, template_hash, storage_key,
file_size, file_hash, row_count, export_status, export_by, export_time, remark
@@ -80,7 +80,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- update ar_bill_export
+ update ar_bill_detail_export
set storage_key = #{storageKey},
file_size = #{fileSize},
file_hash = #{fileHash},
@@ -90,13 +90,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- update ar_bill_export
+ update ar_bill_detail_export
set export_status = 'FAILED', remark = #{remark}
where export_id = #{exportId} and export_status = 'PROCESSING'
- update ar_bill_export
+ update ar_bill_detail_export
set export_status = 'FAILED', remark = #{remark}
where export_status = 'PROCESSING' and export_time < #{expiredBefore}
diff --git a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillLogMapper.xml b/bms-back/bms-system/src/main/resources/mapper/ar/ArBillLogMapper.xml
index a38a271d..4254aa23 100644
--- a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillLogMapper.xml
+++ b/bms-back/bms-system/src/main/resources/mapper/ar/ArBillLogMapper.xml
@@ -38,7 +38,7 @@
l.operation_source, l.request_id, l.trace_id, l.result, l.error_message, l.client_ip, l.create_time
from ar_bill_log l
left join ar_bill b on b.ar_bill_id = l.ar_bill_id
- left join ar_bill_export e on e.export_id = case when l.object_type = 'EXPORT' then cast(l.object_id as
+ left join ar_bill_detail_export e on e.export_id = case when l.object_type = 'EXPORT' then cast(l.object_id as
unsigned) end
left join ar_balance_writeoff bw on bw.writeoff_id = case when l.object_type = 'BALANCE_WRITEOFF' then
cast(l.object_id as unsigned) end
diff --git a/bms-back/docs/oss-bill-storage.md b/bms-back/docs/oss-bill-storage.md
index cf9f7732..3ba28ec1 100644
--- a/bms-back/docs/oss-bill-storage.md
+++ b/bms-back/docs/oss-bill-storage.md
@@ -2,7 +2,7 @@
新生成的应收账单导出 Excel 上传到 `lionqueen` Bucket。
生产路径为 `bms/prod/ar/bill/yyyy/MM/dd/.xlsx`,本地、测试路径为
-`bms/test/ar/bill/yyyy/MM/dd/.xlsx`。数据库 `ar_bill_export.storage_key`
+`bms/test/ar/bill/yyyy/MM/dd/.xlsx`。数据库 `ar_bill_detail_export.storage_key`
保存包含完整对象路径的 `oss://lionqueen/...`,不需要数据库变更。
生产环境启动需启用 `prod` Profile,可通过 `OSS_PATH_PREFIX` 覆盖目录前缀
(不以 `/` 开头或结尾)。同 Bucket 下的目录划分用于区分文件,权限隔离仍需配置 RAM 策略。
diff --git a/bms-back/sql/20261018_rename_ar_bill_export_to_ar_bill_detail_export.sql b/bms-back/sql/20261018_rename_ar_bill_export_to_ar_bill_detail_export.sql
new file mode 100644
index 00000000..248f01fe
--- /dev/null
+++ b/bms-back/sql/20261018_rename_ar_bill_export_to_ar_bill_detail_export.sql
@@ -0,0 +1,104 @@
+-- 应收账单行级“导出明细”任务与文件元数据表改名,保留既有数据。
+-- 脚本可重复执行;若新旧表同时存在,请先核对数据再手动合并,避免覆盖任一表。
+
+SET @old_table_exists := (
+ SELECT COUNT(1) FROM information_schema.TABLES
+ WHERE TABLE_SCHEMA = DATABASE()
+ AND TABLE_NAME = 'ar_bill_export'
+);
+SET @new_table_exists := (
+ SELECT COUNT(1) FROM information_schema.TABLES
+ WHERE TABLE_SCHEMA = DATABASE()
+ AND TABLE_NAME = 'ar_bill_detail_export'
+);
+SET @sql := IF(@old_table_exists > 0 AND @new_table_exists = 0,
+ 'RENAME TABLE `ar_bill_export` TO `ar_bill_detail_export`',
+ 'SELECT 1'
+);
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+-- 索引随表名统一;旧索引不存在或新索引已经存在时跳过。
+SET @old_index_exists := (
+ SELECT COUNT(1) FROM information_schema.STATISTICS
+ WHERE TABLE_SCHEMA = DATABASE()
+ AND TABLE_NAME = 'ar_bill_detail_export'
+ AND INDEX_NAME = 'idx_ar_bill_export_bill'
+);
+SET @new_index_exists := (
+ SELECT COUNT(1) FROM information_schema.STATISTICS
+ WHERE TABLE_SCHEMA = DATABASE()
+ AND TABLE_NAME = 'ar_bill_detail_export'
+ AND INDEX_NAME = 'idx_ar_bill_detail_export_bill'
+);
+SET @sql := IF(@old_index_exists > 0 AND @new_index_exists = 0,
+ 'ALTER TABLE `ar_bill_detail_export` RENAME INDEX `idx_ar_bill_export_bill` TO `idx_ar_bill_detail_export_bill`',
+ 'SELECT 1'
+);
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+SET @old_index_exists := (
+ SELECT COUNT(1) FROM information_schema.STATISTICS
+ WHERE TABLE_SCHEMA = DATABASE()
+ AND TABLE_NAME = 'ar_bill_detail_export'
+ AND INDEX_NAME = 'idx_ar_bill_export_status'
+);
+SET @new_index_exists := (
+ SELECT COUNT(1) FROM information_schema.STATISTICS
+ WHERE TABLE_SCHEMA = DATABASE()
+ AND TABLE_NAME = 'ar_bill_detail_export'
+ AND INDEX_NAME = 'idx_ar_bill_detail_export_status'
+);
+SET @sql := IF(@old_index_exists > 0 AND @new_index_exists = 0,
+ 'ALTER TABLE `ar_bill_detail_export` RENAME INDEX `idx_ar_bill_export_status` TO `idx_ar_bill_detail_export_status`',
+ 'SELECT 1'
+);
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+SET @old_index_exists := (
+ SELECT COUNT(1) FROM information_schema.STATISTICS
+ WHERE TABLE_SCHEMA = DATABASE()
+ AND TABLE_NAME = 'ar_bill_detail_export'
+ AND INDEX_NAME = 'idx_ar_bill_export_template'
+);
+SET @new_index_exists := (
+ SELECT COUNT(1) FROM information_schema.STATISTICS
+ WHERE TABLE_SCHEMA = DATABASE()
+ AND TABLE_NAME = 'ar_bill_detail_export'
+ AND INDEX_NAME = 'idx_ar_bill_detail_export_template'
+);
+SET @sql := IF(@old_index_exists > 0 AND @new_index_exists = 0,
+ 'ALTER TABLE `ar_bill_detail_export` RENAME INDEX `idx_ar_bill_export_template` TO `idx_ar_bill_detail_export_template`',
+ 'SELECT 1'
+);
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+-- MySQL 没有外键重命名语法,通过同一 ALTER TABLE 替换约束名。
+SET @old_constraint_exists := (
+ SELECT COUNT(1) FROM information_schema.TABLE_CONSTRAINTS
+ WHERE CONSTRAINT_SCHEMA = DATABASE()
+ AND TABLE_NAME = 'ar_bill_detail_export'
+ AND CONSTRAINT_NAME = 'fk_ar_bill_export_bill'
+ AND CONSTRAINT_TYPE = 'FOREIGN KEY'
+);
+SET @new_constraint_exists := (
+ SELECT COUNT(1) FROM information_schema.TABLE_CONSTRAINTS
+ WHERE CONSTRAINT_SCHEMA = DATABASE()
+ AND TABLE_NAME = 'ar_bill_detail_export'
+ AND CONSTRAINT_NAME = 'fk_ar_bill_detail_export_bill'
+ AND CONSTRAINT_TYPE = 'FOREIGN KEY'
+);
+SET @sql := IF(@old_constraint_exists > 0 AND @new_constraint_exists = 0,
+ 'ALTER TABLE `ar_bill_detail_export` DROP FOREIGN KEY `fk_ar_bill_export_bill`, ADD CONSTRAINT `fk_ar_bill_detail_export_bill` FOREIGN KEY (`ar_bill_id`) REFERENCES `ar_bill` (`ar_bill_id`)',
+ 'SELECT 1'
+);
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
diff --git a/bms-back/sql/bms_init.sql b/bms-back/sql/bms_init.sql
index df2f4738..bff5eae5 100644
--- a/bms-back/sql/bms_init.sql
+++ b/bms-back/sql/bms_init.sql
@@ -172,9 +172,9 @@ CREATE TABLE `ar_bill_detail_fee` (
) ENGINE=InnoDB AUTO_INCREMENT=151 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='应收账单费用快照';
-- ----------------------------
--- 表结构:`ar_bill_export`
+-- 表结构:`ar_bill_detail_export`
-- ----------------------------
-CREATE TABLE `ar_bill_export` (
+CREATE TABLE `ar_bill_detail_export` (
`export_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '导出ID',
`ar_bill_id` bigint(20) NOT NULL COMMENT '应收账单ID',
`file_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '下载展示名称',
@@ -194,11 +194,11 @@ CREATE TABLE `ar_bill_export` (
`export_time` datetime NOT NULL COMMENT '导出时间',
`remark` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '失败原因或备注',
PRIMARY KEY (`export_id`),
- KEY `idx_ar_bill_export_bill` (`ar_bill_id`,`export_time`),
- KEY `idx_ar_bill_export_status` (`export_status`),
- KEY `idx_ar_bill_export_template` (`template_id`),
- CONSTRAINT `fk_ar_bill_export_bill` FOREIGN KEY (`ar_bill_id`) REFERENCES `ar_bill` (`ar_bill_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='应收账单导出文件元数据';
+ KEY `idx_ar_bill_detail_export_bill` (`ar_bill_id`,`export_time`),
+ KEY `idx_ar_bill_detail_export_status` (`export_status`),
+ KEY `idx_ar_bill_detail_export_template` (`template_id`),
+ CONSTRAINT `fk_ar_bill_detail_export_bill` FOREIGN KEY (`ar_bill_id`) REFERENCES `ar_bill` (`ar_bill_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='应收账单明细导出任务和文件元数据';
-- ----------------------------
-- 表结构:`ar_bill_generate_task`