diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/entity/CcdiFileUploadRecord.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/entity/CcdiFileUploadRecord.java
index bde85efd..6d3558a0 100644
--- a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/entity/CcdiFileUploadRecord.java
+++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/entity/CcdiFileUploadRecord.java
@@ -44,6 +44,15 @@ public class CcdiFileUploadRecord implements Serializable {
/** 文件状态:uploading-上传中,parsing-解析中,parsed_success-解析成功,parsed_failed-解析失败 */
private String fileStatus;
+ /** 来源类型 */
+ private String sourceType;
+
+ /** 来源项目ID */
+ private Long sourceProjectId;
+
+ /** 来源项目名称 */
+ private String sourceProjectName;
+
/** 主体名称(多个用逗号分隔) */
private String enterpriseNames;
diff --git a/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankStatementMapper.xml b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankStatementMapper.xml
index 92df3289..2bc53df8 100644
--- a/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankStatementMapper.xml
+++ b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankStatementMapper.xml
@@ -328,10 +328,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
bs.cret_no AS cretNo,
bs.CREATE_DATE AS createDate,
fur.file_name AS originalFileName,
- fur.upload_time AS uploadTime
+ fur.upload_time AS uploadTime,
+ fur.source_project_name AS sourceProjectName
FROM ccdi_bank_statement bs
LEFT JOIN (
- SELECT latest_record.project_id, latest_record.log_id, latest_record.file_name, latest_record.upload_time
+ SELECT latest_record.project_id, latest_record.log_id, latest_record.file_name, latest_record.upload_time,
+ latest_record.source_project_name
FROM ccdi_file_upload_record latest_record
INNER JOIN (
SELECT project_id, log_id, MAX(id) AS max_id
diff --git a/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiFileUploadRecordMapper.xml b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiFileUploadRecordMapper.xml
index 2177c0fb..1f6458b5 100644
--- a/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiFileUploadRecordMapper.xml
+++ b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiFileUploadRecordMapper.xml
@@ -12,6 +12,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+
+
+
@@ -21,8 +24,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
select id, project_id, lsfx_project_id, log_id, file_name, file_size,
- file_status, enterprise_names, account_nos, error_message,
- upload_time, upload_user
+ file_status, source_type, source_project_id, source_project_name,
+ enterprise_names, account_nos, error_message, upload_time, upload_user
from ccdi_file_upload_record
@@ -30,13 +33,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
insert into ccdi_file_upload_record (
project_id, lsfx_project_id, file_name, file_size, file_status,
+ source_type, source_project_id, source_project_name,
enterprise_names, account_nos, upload_time, upload_user
) values
(
#{item.projectId}, #{item.lsfxProjectId}, #{item.fileName},
- #{item.fileSize}, #{item.fileStatus}, #{item.enterpriseNames},
- #{item.accountNos}, #{item.uploadTime}, #{item.uploadUser}
+ #{item.fileSize}, #{item.fileStatus}, #{item.sourceType},
+ #{item.sourceProjectId}, #{item.sourceProjectName},
+ #{item.enterpriseNames}, #{item.accountNos}, #{item.uploadTime}, #{item.uploadUser}
)
diff --git a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankStatementMapperXmlTest.java b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankStatementMapperXmlTest.java
index 1406d7c1..16d693d9 100644
--- a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankStatementMapperXmlTest.java
+++ b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankStatementMapperXmlTest.java
@@ -132,6 +132,24 @@ class CcdiBankStatementMapperXmlTest {
}
}
+ @Test
+ void fileUploadRecordMapper_shouldContainHistoryImportSourceFields() throws Exception {
+ try (InputStream inputStream = getClass().getClassLoader()
+ .getResourceAsStream("mapper/ccdi/project/CcdiFileUploadRecordMapper.xml")) {
+ String xml = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
+
+ assertTrue(xml.contains("source_type"), xml);
+ assertTrue(xml.contains("source_project_id"), xml);
+ assertTrue(xml.contains("source_project_name"), xml);
+ }
+
+ try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(RESOURCE)) {
+ String xml = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
+
+ assertTrue(xml.contains("fur.source_project_name"), xml);
+ }
+ }
+
@Test
void insertBatch_shouldAvoidUpdatingAutoIncrementPrimaryKeyInDuplicateBranch() throws Exception {
try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(RESOURCE)) {
diff --git a/docs/reports/implementation/2026-03-29-project-import-history-plan-record.md b/docs/reports/implementation/2026-03-29-project-import-history-plan-record.md
index fab900b5..b03d7749 100644
--- a/docs/reports/implementation/2026-03-29-project-import-history-plan-record.md
+++ b/docs/reports/implementation/2026-03-29-project-import-history-plan-record.md
@@ -17,3 +17,13 @@
- 按仓库约束,本次未启用 subagent
- 已人工检查计划与设计文档的一致性,确认未引入未被批准的新方案
+
+## 执行记录
+
+### 2026-03-29 Task 1 后端数据结构预置
+
+- 新增迁移脚本 `sql/migration/2026-03-29-add-file-upload-history-import-source-fields.sql`,为 `ccdi_file_upload_record` 增加 `source_type`、`source_project_id`、`source_project_name`
+- 扩展 `CcdiFileUploadRecord` 实体与 `CcdiFileUploadRecordMapper.xml`,补齐来源字段映射、查询列和批量插入列
+- 调整 `CcdiBankStatementMapper.xml` 详情查询,补充 `fur.source_project_name` 查询痕迹,为后续历史导入来源展示预留字段
+- 新增 `CcdiBankStatementMapperXmlTest` 断言,先验证缺少来源字段时失败,再验证补齐后通过
+- 验证命令:`mvn -pl ccdi-project -am -Dtest=CcdiBankStatementMapperXmlTest -Dsurefire.failIfNoSpecifiedTests=false test`
diff --git a/sql/migration/2026-03-29-add-file-upload-history-import-source-fields.sql b/sql/migration/2026-03-29-add-file-upload-history-import-source-fields.sql
new file mode 100644
index 00000000..3592e9ee
--- /dev/null
+++ b/sql/migration/2026-03-29-add-file-upload-history-import-source-fields.sql
@@ -0,0 +1,4 @@
+ALTER TABLE ccdi_file_upload_record
+ ADD COLUMN source_type varchar(32) DEFAULT 'UPLOAD' COMMENT '来源类型',
+ ADD COLUMN source_project_id bigint NULL COMMENT '来源项目ID',
+ ADD COLUMN source_project_name varchar(100) NULL COMMENT '来源项目名称';