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`