修复历史项目导入解环与流水查询SQL
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
# AGENTS 数据库导入编码约束补充记录
|
||||
|
||||
## 本次改动
|
||||
|
||||
- 更新根目录 `AGENTS.md` 协作约定,明确 MySQL SQL 执行与数据库导入都必须保证 `utf8mb4` 会话字符集
|
||||
- 更新根目录 `AGENTS.md` 数据库规范,明确中文数据导入场景默认使用 `bin/mysql_utf8_exec.sh`
|
||||
- 将“避免导入乱码”写入说明,降低后续执行数据库导入时遗漏编码设置的风险
|
||||
|
||||
## 结论
|
||||
|
||||
- 仓库级协作约定已覆盖“数据库导入编码”问题,不再仅限于中文 SQL 脚本执行场景
|
||||
- 后续凡是导入含中文数据的 SQL 或数据库内容,默认按 `utf8mb4` 会话执行
|
||||
|
||||
## 验证说明
|
||||
|
||||
- 已人工检查文档保存路径位于 `docs/reports/implementation/`
|
||||
- 本次仅修改文档,无需运行代码测试
|
||||
@@ -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` 条
|
||||
|
||||
@@ -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 直接失败。
|
||||
|
||||
## 清理记录
|
||||
|
||||
- 已停止本次测试临时启动的后端进程
|
||||
- 已停止本次测试临时启动的前端开发进程
|
||||
Reference in New Issue
Block a user