修复历史项目导入解环与流水查询SQL

This commit is contained in:
wkc
2026-03-30 13:46:04 +08:00
parent 0a3c03dcf9
commit d582a65978
11 changed files with 330 additions and 23 deletions

View File

@@ -0,0 +1,17 @@
# AGENTS 数据库导入编码约束补充记录
## 本次改动
- 更新根目录 `AGENTS.md` 协作约定,明确 MySQL SQL 执行与数据库导入都必须保证 `utf8mb4` 会话字符集
- 更新根目录 `AGENTS.md` 数据库规范,明确中文数据导入场景默认使用 `bin/mysql_utf8_exec.sh`
- 将“避免导入乱码”写入说明,降低后续执行数据库导入时遗漏编码设置的风险
## 结论
- 仓库级协作约定已覆盖“数据库导入编码”问题,不再仅限于中文 SQL 脚本执行场景
- 后续凡是导入含中文数据的 SQL 或数据库内容,默认按 `utf8mb4` 会话执行
## 验证说明
- 已人工检查文档保存路径位于 `docs/reports/implementation/`
- 本次仅修改文档,无需运行代码测试

View File

@@ -84,3 +84,20 @@
- 扩展 `project-import-history-dialog-behavior.test.js`,补齐“请选择历史项目”“请输入新项目名称”两条关键校验文案断言,锁定导入弹窗最小交互约束
- 扩展 `project-detail-tagging-polling.test.js`,补齐 `this.$route.params.projectId``projectStatusPolling` 代码痕迹断言,确认新项目详情页继续以路由参数承接并保留状态轮询能力
- 完成前端回归验证:`cd ruoyi-ui && node tests/unit/project-import-history-submit-flow.test.js && node tests/unit/project-import-history-dialog-layout.test.js && node tests/unit/project-import-history-dialog-behavior.test.js && node tests/unit/upload-data-file-list-table.test.js && node tests/unit/upload-data-delete-retag-copy.test.js && node tests/unit/upload-data-history-import-readonly.test.js && node tests/unit/project-detail-tagging-polling.test.js`
### 2026-03-29 Task 6 后端历史导入解环修复
- 根据联调时出现的 `CcdiBankTagServiceImpl -> CcdiProjectServiceImpl -> CcdiProjectHistoryImportServiceImpl` 循环依赖,确认根因是 `CcdiProjectServiceImpl#importFromHistory` 直接依赖历史导入服务,而历史导入服务又会回调打标服务
- 新增 `CcdiProjectHistoryImportSubmittedEvent``CcdiProjectHistoryImportEventListener`,将“创建项目后提交历史导入任务”改为事务提交后发布事件,再由监听器委托 `ICcdiProjectHistoryImportService`
- 调整 `CcdiProjectServiceImpl``CcdiProjectServiceImplTest`,锁定“导入历史项目在 `afterCommit` 阶段发布事件”的行为,移除对 `ICcdiProjectHistoryImportService` 的直接注入
- 验证命令:`mvn -pl ccdi-project -am -Dtest=CcdiProjectServiceImplTest -Dsurefire.failIfNoSpecifiedTests=false test`
- 启动验证:`mvn -pl ruoyi-admin -am -DskipTests package` 后执行 `java -jar ruoyi-admin/target/ruoyi-admin.jar`,确认默认启动不再报循环依赖且应用正常启动
### 2026-03-29 Task 7 后端历史导入联调修复
- 针对“通过导入创建的项目一直进行中,上传文件列表也不正确”做联调排查,先执行 `bin/mysql_utf8_exec.sh 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` 字段补齐到联调数据库
- 继续排查异步导入日志,定位 `CcdiBankStatementMapper.xml``selectStatementsForHistoryImport` 存在两处 SQL 组装问题:一处重复拼出 `SELECT select ... FROM ccdi_bank_statement FROM ...`,另一处在日期过滤场景下与动态条件相邻,导致联调日志出现 `?AND`/`17094AND` 形式的拼接结果
- 调整 `selectCcdiBankStatementVo` 为纯列片段,并将历史导入查询的基础条件包裹为 `(bs.project_id = #{projectId}) AND (bs.batch_id = #{batchId})`,避免动态日期条件继续与前置参数直接粘连
- 扩展 `CcdiBankStatementMapperXmlTest`,新增历史导入查询 SQL 渲染断言,锁定“不重复生成 `select` 关键字”与“不生成 `?AND`”两个回归点
- 验证命令:`mvn -pl ccdi-project -am -Dtest=CcdiBankStatementMapperXmlTest -Dsurefire.failIfNoSpecifiedTests=false test`
- 联调验证:`mvn -pl ruoyi-admin -am -DskipTests package` 后启动 `java -jar ruoyi-admin/target/ruoyi-admin.jar`,重新调用 `/ccdi/project/import` 创建项目 `61`;接口轮询确认项目状态从 `0` 进入 `3` 再落到 `1`,上传记录列表返回 `14` 条历史导入文件;数据库确认 `ccdi_project.status = 1``target_count = 12``ccdi_file_upload_record``14` 条且 `source_type = HISTORY_IMPORT``ccdi_bank_statement``20`

View File

@@ -0,0 +1,176 @@
# 2026-03-29 历史项目导入功能测试记录
## 测试目标
- 按实施计划验证“项目管理 -> 导入历史项目”功能的真实链路
- 通过浏览器、数据库、后端日志交叉确认以下能力:
- 历史项目列表是否只展示已完成、已归档项目
- 导入弹窗校验、项目创建、成功跳转是否正常
- 异步历史导入是否生成文件记录与流水数据
- 详情页上传记录是否展示来源信息、是否具备只读限制
## 测试环境
- 测试日期2026-03-29
- 前端地址:`http://127.0.0.1:1026`
- 后端地址:`http://127.0.0.1:62318`
- 数据库:`116.62.17.81:3307/ccdi`
- 登录账号:`admin/admin123`
## 测试前检查
### 1. 默认启动失败
- 使用当前代码重新打包 `ruoyi-admin` 后,按默认参数启动后端,应用未能启动成功。
- 日志报错为 Spring Bean 循环依赖:
- `CcdiBankTagServiceImpl`
- `CcdiProjectServiceImpl`
- `CcdiProjectHistoryImportServiceImpl`
- 结论:当前代码在默认配置下无法完成联调测试。
### 2. 为继续测试临时放开循环依赖
- 仅为继续验证后续功能,临时使用启动参数:
```bash
java -jar ruoyi-admin/target/ruoyi-admin.jar --spring.main.allow-circular-references=true
```
- 说明:以下浏览器与接口测试结果均建立在该临时启动参数下,不代表默认启动已通过。
### 3. 数据库结构预检查
- 执行 `SHOW COLUMNS FROM ccdi_file_upload_record;`
- 结果:数据库中缺少以下字段:
- `source_type`
- `source_project_id`
- `source_project_name`
## 浏览器测试记录
### 1. 历史项目弹窗与列表
- 登录后进入“初核项目管理”页面。
- 点击快捷方式“导入历史项目”,弹窗可正常打开。
- 弹窗中看到“新项目名称 / 备注 / 流水时间 / 历史项目列表”布局,符合计划描述。
- 历史项目列表实际加载成功,只展示“已完成 / 已归档”项目。
- 浏览器看到的历史项目样本包括:
- `phase2联调验证-20260322-1`
- `0320`
- `测试0319`
- `测试0323`
### 2. 表单校验
- 未选择历史项目直接点击“导入”,页面提示:`请选择历史项目`
- 选择历史项目后,不填写新项目名称直接点击“导入”,页面提示:`请输入新项目名称`
- 结论:前端最小校验生效。
### 3. 真实提交
- 选择历史项目:
- `49 phase2联调验证-20260322-1`
- `48 0320`
- 填写:
- 新项目名称:`自动测试-历史导入-20260329-1017`
- 备注:`测试历史项目导入链路`
- 流水时间:`2026-03-17``2026-03-18`
- 点击“导入”后:
- 页面提示:`历史项目导入任务已开始`
- 自动跳转至详情页:`/ccdiProject/detail/57`
- 新项目标题显示为 `自动测试-历史导入-20260329-1017`
- 项目状态显示为 `进行中`
- 上传记录列表显示 `暂无数据`
## 数据库验证
### 1. 历史项目样本确认
- 查询 `ccdi_file_upload_record` 后确认以下项目存在可用于导入的 `parsed_success` 记录:
- `49 phase2联调验证-20260322-1``11`
- `48 0320``9`
- `46 测试0319``4`
### 2. 新项目创建结果
- 提交后数据库生成新项目:
```text
project_id = 57
project_name = 自动测试-历史导入-20260329-1017
status = 0
lsfx_project_id = 1001
target_count = 0
```
### 3. 导入结果落库检查
- 查询 `ccdi_file_upload_record`
- `project_id = 57`,结果 `0`
- 查询 `ccdi_bank_statement`
- `project_id = 57`,结果 `0`
## 日志验证
### 1. 项目创建成功
- 日志记录了项目创建成功:
- `projectId=57`
- `projectName=自动测试-历史导入-20260329-1017`
- 状态初始化为 `进行中`
### 2. 异步导入线程失败
- 后端异步线程 `file-upload-1` 在读取来源上传记录时抛出异常:
```text
Unknown column 'source_type' in 'field list'
```
- 对应 SQL 为:
```sql
select id, project_id, lsfx_project_id, log_id, file_name, file_size,
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
where project_id in (?, ?)
and file_status = 'parsed_success'
and log_id is not null
```
- 结论:异步导入任务在读取来源记录阶段即失败,后续的流水复制、文件记录写入、打标触发都没有执行成功。
## 测试结论
### 已验证通过
- 导入历史项目弹窗可打开
- 历史项目列表能够加载真实数据,且列表范围符合“已完成/已归档”
- 前端校验提示正常
- 点击导入后可创建新项目
- 提交成功后提示文案正确,且会跳转到新项目详情页
### 验证失败
- 默认配置下后端无法启动,存在循环依赖
- 联调用数据库缺少历史导入所需来源字段
- 异步历史导入任务执行失败
- 新项目未生成任何上传记录
- 新项目未生成任何流水数据
### 当前无法继续验证的项
- 上传记录“历史导入 · 来源项目名”展示
- 历史导入文件记录删除入口是否隐藏
- 导入完成后自动触发打标、结果刷新、统计刷新
## 阻塞问题汇总
1. `CcdiBankTagServiceImpl -> CcdiProjectServiceImpl -> CcdiProjectHistoryImportServiceImpl` 存在循环依赖,导致默认启动失败。
2. 联调用数据库 `ccdi_file_upload_record` 未执行来源字段迁移,导致异步导入 SQL 直接失败。
## 清理记录
- 已停止本次测试临时启动的后端进程
- 已停止本次测试临时启动的前端开发进程