整理docs目录并补充文档规范

This commit is contained in:
wkc
2026-03-17 15:06:59 +08:00
parent 9cb77b096e
commit 2fd93463b8
111 changed files with 706 additions and 100 deletions

View File

@@ -159,6 +159,24 @@ ccdi/
---
## 文档规范
- `docs/design/`: 设计文档与设计附属文件
- `docs/plans/backend/`: 后端实施计划
- `docs/plans/frontend/`: 前端实施计划
- `docs/plans/fullstack/`: 综合实施计划、集成计划与通用实施文档
- `docs/plans/misc/`: 计划类杂项文档
- `docs/tests/plans/`: 测试计划
- `docs/tests/records/`: 测试记录
- `docs/tests/scripts/`: 测试脚本与脚本说明
- `docs/reports/implementation/`: 实施报告
- `docs/reports/optimization/`: 优化记录
- `docs/reports/code-review/`: 代码评审报告
- 新增文档时优先放入上述目录,避免继续直接堆放到 `docs/plans/` 根目录
- 文档之间如果引用 `docs` 路径,新增或移动后需同步修正引用
---
## 沟通规范
- 使用简体中文进行思考和对话

View File

@@ -502,4 +502,4 @@ head -20 doc/database/backup/ccdi_structure.sql
- 表结构文件: `doc/database/backup/ccdi_structure.sql`
- 数据文件: `doc/database/backup/ccdi_data.sql`
- 排序规则修改脚本: `doc/database/alter_collation_to_general_ci.sql`
- 设计文档: `docs/plans/2026-02-28-database-migration-design.md`
- 设计文档: `docs/design/2026-02-28-database-migration-design.md`

View File

@@ -266,7 +266,7 @@ d122e52 config(lsfx): 删除接口5、6配置更新接口7路径
## 参考资料
- **新版接口文档**: `doc/对接流水分析/兰溪-流水分析对接-新版.md`
- **实施计划**: `docs/plans/2026-03-02-lsfx-update-plan.md`
- **实施计划**: `docs/plans/fullstack/2026-03-02-lsfx-update-plan.md`
- **项目规范**: `CLAUDE.md`
---

25
docs/README.md Normal file
View File

@@ -0,0 +1,25 @@
# docs 目录说明
本目录按文档类型整理,优先解决历史文档集中堆放在 `docs/plans/` 根目录的问题。
## 目录结构
- `design/`: 设计文档与设计附属文件
- `plans/backend/`: 后端实施计划
- `plans/frontend/`: 前端实施计划
- `plans/fullstack/`: 综合实施计划、集成计划与通用实施记录
- `plans/misc/`: 计划类杂项文档
- `tests/plans/`: 测试计划
- `tests/records/`: 测试记录
- `tests/scripts/`: 测试脚本与脚本说明
- `reports/implementation/`: 实施报告
- `reports/optimization/`: 优化记录
- `reports/code-review/`: 代码评审报告
## 归类规则
- 设计类文档统一放入 `design/`
- 明确标注前端或后端的实施计划分别放入 `plans/frontend/``plans/backend/`
- 不区分前后端的综合方案、集成计划和通用实施文档放入 `plans/fullstack/`
- 测试相关文档统一放入 `tests/`
- 报告与复盘类文档统一放入 `reports/`

View File

@@ -249,7 +249,7 @@ SHOW CREATE TABLE sys_user;
3. **表结构文件**: `doc/database/backup/ccdi_structure.sql`
4. **数据文件**: `doc/database/backup/ccdi_data.sql`
5. **操作指南**: `doc/database/backup/export_guide.md`
6. **设计文档**: `docs/plans/2026-02-28-database-migration-design.md`
6. **设计文档**: `docs/design/2026-02-28-database-migration-design.md`
## 时间估算

View File

@@ -145,11 +145,11 @@ public CcdiProjectVO createProject(CcdiProjectSaveDTO dto) {
### 5. 测试脚本 ✅
**文件**:
- `docs/test-scripts/test-project-creation.sh` (Bash)
- `docs/test-scripts/test-project-creation.ps1` (PowerShell)
- `docs/test-scripts/test-project-creation.bat` (批处理)
- `docs/test-scripts/test-simple.sh` (简化版)
- `docs/test-scripts/README.md` (文档)
- `docs/tests/scripts/test-project-creation.sh` (Bash)
- `docs/tests/scripts/test-project-creation.ps1` (PowerShell)
- `docs/tests/scripts/test-project-creation.bat` (批处理)
- `docs/tests/scripts/test-simple.sh` (简化版)
- `docs/tests/scripts/README.md` (文档)
**Commit**: `206754a` - "test: 添加项目创建功能测试脚本和文档"

View File

@@ -839,7 +839,7 @@ public void saveParams(ModelParamSaveDTO saveDTO) {
**测试文件:**
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/CcdiModelParamServiceImplTest.java` - 单元测试
- `docs/test-scripts/test-param-config.sh` - 集成测试脚本
- `docs/tests/scripts/test-param-config.sh` - 集成测试脚本
### 8.2 参考文档

View File

@@ -265,7 +265,7 @@ ON DUPLICATE KEY UPDATE
本次实现后应同步更新以下文档,避免数据库说明继续失真:
- `assets/对接流水分析/ccdi_bank_statement.md`
- 如有必要,同步 `docs/plans/2026-03-04-bank-statement-entity-design.md` 中的表结构补充说明
- 如有必要,同步 `docs/design/2026-03-04-bank-statement-entity-design.md` 中的表结构补充说明
## 影响范围

View File

@@ -4,7 +4,7 @@
现有员工亲属关系维护页面 `http://localhost/maintain/staffFmyRelation` 已支持员工亲属关系的新增、编辑、删除、详情、导入导出,但尚不支持维护亲属名下资产信息。
当前仓库中已有员工资产维护设计文档 [2026-03-12-employee-asset-maintenance-design.md](/D:/ccdi/ccdi/docs/plans/2026-03-12-employee-asset-maintenance-design.md),其核心约束是通过 `family_id` 表示归属员工,通过 `person_id` 表示资产实际持有人。本次需求需要将该能力调整到“员工亲属关系维护页面”中,并明确仅维护亲属资产,不包含员工本人资产。
当前仓库中已有员工资产维护设计文档 [2026-03-12-employee-asset-maintenance-design.md](/D:/ccdi/ccdi/docs/design/2026-03-12-employee-asset-maintenance-design.md),其核心约束是通过 `family_id` 表示归属员工,通过 `person_id` 表示资产实际持有人。本次需求需要将该能力调整到“员工亲属关系维护页面”中,并明确仅维护亲属资产,不包含员工本人资产。
本次设计于 2026-03-12 确认以下业务口径:

View File

@@ -698,8 +698,8 @@ mvn spring-boot:run
**步骤 6: 提交测试记录**
```bash
mkdir -p docs/test-records
git add docs/test-records/
mkdir -p docs/tests/records
git add docs/tests/records/
git commit -m "test(ccdi-project): 记录后端接口测试结果"
```

View File

@@ -15,7 +15,7 @@
**Files:**
- Create: `sql/2026-03-12_ccdi_asset_info.sql`
- Review: `assets/资产信息表.csv`
- Review: `docs/plans/2026-03-12-employee-asset-maintenance-design.md`
- Review: `docs/design/2026-03-12-employee-asset-maintenance-design.md`
**Step 1: Write the SQL script**
@@ -40,7 +40,7 @@ Confirm the script:
**Step 3: Commit**
```bash
git add sql/2026-03-12_ccdi_asset_info.sql docs/plans/2026-03-12-employee-asset-maintenance-design.md
git add sql/2026-03-12_ccdi_asset_info.sql docs/design/2026-03-12-employee-asset-maintenance-design.md
git commit -m "新增员工资产信息设计与建表脚本"
```
@@ -349,6 +349,6 @@ Expected: compile succeeds without Java or mapper XML errors.
**Step 3: Commit**
```bash
git add sql/2026-03-12_ccdi_asset_info.sql ccdi-info-collection/src/main/java/com/ruoyi/info/collection ccdi-info-collection/src/main/resources/mapper/info/collection docs/plans/2026-03-12-employee-asset-maintenance-backend-implementation.md
git add sql/2026-03-12_ccdi_asset_info.sql ccdi-info-collection/src/main/java/com/ruoyi/info/collection ccdi-info-collection/src/main/resources/mapper/info/collection docs/plans/backend/2026-03-12-employee-asset-maintenance-backend-implementation.md
git commit -m "新增员工资产信息后端实施计划"
```

View File

@@ -13,7 +13,7 @@
### Task 1: Verify backend impact is zero
**Files:**
- Review: `docs/plans/2026-03-12-pull-bank-info-date-limit-design.md`
- Review: `docs/design/2026-03-12-pull-bank-info-date-limit-design.md`
- Review: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/`
- Review: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/`

View File

@@ -13,7 +13,7 @@
### Task 1: Verify backend impact is zero
**Files:**
- Review: `docs/plans/2026-03-12-pull-bank-info-upload-button-hit-area-design.md`
- Review: `docs/design/2026-03-12-pull-bank-info-upload-button-hit-area-design.md`
- Review: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/`
- Review: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/`

View File

@@ -14,7 +14,7 @@
**Files:**
- Create: `lsfx-mock-server/**`
- Modify: `docs/plans/2026-03-13-ccdi-docker-deployment-design.md`
- Modify: `docs/design/2026-03-13-ccdi-docker-deployment-design.md`
- Test: `lsfx-mock-server/tests/test_api.py`
**Step 1: 复制并清理运行文件**
@@ -110,7 +110,7 @@ Expected: Compose 文件能正常展开且无语法错误
### Task 5: 构建与联调验证
**Files:**
- Modify: `docs/plans/2026-03-13-ccdi-docker-deployment-design.md`
- Modify: `docs/design/2026-03-13-ccdi-docker-deployment-design.md`
**Step 1: 本地构建后端**
@@ -131,6 +131,6 @@ Expected: 无错误
**Step 4: 提交**
```bash
git add lsfx-mock-server docker docker-compose.yml .env.example deploy docs/plans/2026-03-13-ccdi-docker-deployment-*.md
git add lsfx-mock-server docker docker-compose.yml .env.example deploy docs/design/2026-03-13-ccdi-docker-deployment-design.md docs/plans/backend/2026-03-13-ccdi-docker-deployment-backend-implementation.md docs/plans/frontend/2026-03-13-ccdi-docker-deployment-frontend-implementation.md
git commit -m "新增Docker后端部署方案"
```

View File

@@ -214,7 +214,7 @@ git commit -m "实现员工资产导入归属匹配"
### Task 5: 执行回归验证
**Files:**
- Modify: `docs/plans/2026-03-13-employee-family-asset-import-split-design.md`
- Modify: `docs/design/2026-03-13-employee-family-asset-import-split-design.md`
**Step 1: 运行后端定向测试**
@@ -248,6 +248,6 @@ Expected:
**Step 4: 提交**
```bash
git add docs/plans/2026-03-13-employee-family-asset-import-split-design.md
git add docs/design/2026-03-13-employee-family-asset-import-split-design.md
git commit -m "完成资产导入拆分后端验证"
```

View File

@@ -31,7 +31,7 @@
**Step 4: Commit**
```bash
git add docs/plans/2026-03-16-large-transaction-project40-design.md assets/database/2026-03-16-project40-large-transaction-seed.sql
git add docs/design/2026-03-16-large-transaction-project40-design.md assets/database/2026-03-16-project40-large-transaction-seed.sql
git commit -m "文档: 补充项目40大额交易测试数据设计"
```
@@ -114,7 +114,7 @@ Expected: 每个指标返回至少 1 条命中记录或 1 个命中分组。
**Step 4: Commit**
```bash
git add assets/database/2026-03-16-project40-large-transaction-seed.sql docs/implementation-reports/2026-03-16-project40-large-transaction-report.md
git add assets/database/2026-03-16-project40-large-transaction-seed.sql docs/reports/implementation2026-03-16-project40-large-transaction-report.md
git commit -m "验证: 完成项目40大额交易测试流水校验"
```
@@ -144,6 +144,6 @@ Expected: `project_id=40` 存在稳定数量的测试流水。
**Step 4: Commit**
```bash
git add docs/implementation-reports/2026-03-16-project40-large-transaction-report.md
git add docs/reports/implementation2026-03-16-project40-large-transaction-report.md
git commit -m "文档: 完善项目40大额交易测试流水报告"
```

View File

@@ -214,7 +214,7 @@ git commit -m "refactor: 收敛模型参数服务对齐逻辑"
**Files:**
- Reference: `sql/ccdi_model_param.sql`
- Reference: `sql/2026-03-16-update-ccdi-model-param-defaults.sql`
- Optional Record: `docs/test-records/model-param-backend-alignment-test.md`
- Optional Record: `docs/tests/records/model-param-backend-alignment-test.md`
**Step 1: 准备校验项**
@@ -262,13 +262,13 @@ ORDER BY model_code, sort_order, id;
将验证过程写入:
```text
docs/test-records/model-param-backend-alignment-test.md
docs/tests/records/model-param-backend-alignment-test.md
```
**Step 5: 提交**
```bash
git add docs/test-records/model-param-backend-alignment-test.md
git add docs/tests/records/model-param-backend-alignment-test.md
git commit -m "test: 记录模型默认参数后端对齐验证"
```
@@ -348,10 +348,10 @@ POST /ccdi/modelParam/saveAll
测试结束后关闭 `mvn spring-boot:run` 启动的进程,再提交测试记录:
```bash
git add docs/test-records/model-param-backend-alignment-test.md
git add docs/tests/records/model-param-backend-alignment-test.md
git commit -m "test: 完成模型参数后端接口回归验证"
```
---
Plan complete and saved to `docs/plans/2026-03-16-model-param-csv-alignment-backend-implementation.md`.
Plan complete and saved to `docs/plans/backend/2026-03-16-model-param-csv-alignment-backend-implementation.md`.

View File

@@ -13,7 +13,7 @@
### Task 1: 确认需求边界
**Files:**
- Review: `docs/plans/2026-03-16-param-save-bar-fixed-bottom-design.md`
- Review: `docs/design/2026-03-16-param-save-bar-fixed-bottom-design.md`
- Review: `ccdi-project`
- Review: `ccdi-info-collection`
@@ -32,7 +32,7 @@
### Task 2: 回归验证清单
**Files:**
- Review: `docs/plans/2026-03-16-param-save-bar-fixed-bottom-design.md`
- Review: `docs/design/2026-03-16-param-save-bar-fixed-bottom-design.md`
**Step 1: 验证参数查询接口**

View File

@@ -688,7 +688,7 @@ git commit -m "feat: 接入拉取本行信息完成后的自动流水打标"
### Task 12: 完成全量验证
**Files:**
- Modify: `docs/plans/2026-03-16-project-bank-statement-tagging-backend-implementation.md`
- Modify: `docs/plans/backend/2026-03-16-project-bank-statement-tagging-backend-implementation.md`
**Step 1: Run focused backend tests**
@@ -721,7 +721,7 @@ Expected:
**Step 4: Commit**
```bash
git add ccdi-project sql docs/plans/2026-03-16-project-bank-statement-tagging-backend-implementation.md
git add ccdi-project sql docs/plans/backend/2026-03-16-project-bank-statement-tagging-backend-implementation.md
git commit -m "feat: 完成项目流水标签后端实现"
```

View File

@@ -428,9 +428,9 @@ npm run dev
**步骤 6: 提交测试记录**
```bash
mkdir -p docs/test-records
echo "## 全局配置页面测试结果\n\n测试时间$(date)\n\n- [x] 页面显示正确\n- [x] 修改功能正常\n- [x] 保存功能正常\n- [x] 错误处理正常" > docs/test-records/global-config-test.md
git add docs/test-records/
mkdir -p docs/tests/records
echo "## 全局配置页面测试结果\n\n测试时间$(date)\n\n- [x] 页面显示正确\n- [x] 修改功能正常\n- [x] 保存功能正常\n- [x] 错误处理正常" > docs/tests/records/global-config-test.md
git add docs/tests/records/
git commit -m "test(ui): 记录全局配置页面测试结果"
```
@@ -745,8 +745,8 @@ git commit -m "feat(ui): 重构项目内模型参数配置页面"
**步骤 7: 提交测试记录**
```bash
echo "## 项目配置页面测试结果\n\n测试时间$(date)\n\n- [x] 页面显示正确\n- [x] 使用默认配置项目测试通过\n- [x] 自定义配置项目测试通过\n- [x] 多模型修改测试通过" > docs/test-records/project-config-test.md
git add docs/test-records/
echo "## 项目配置页面测试结果\n\n测试时间$(date)\n\n- [x] 页面显示正确\n- [x] 使用默认配置项目测试通过\n- [x] 自定义配置项目测试通过\n- [x] 多模型修改测试通过" > docs/tests/records/project-config-test.md
git add docs/tests/records/
git commit -m "test(ui): 记录项目配置页面测试结果"
```
@@ -791,8 +791,8 @@ git commit -m "test(ui): 记录项目配置页面测试结果"
**步骤 5: 提交测试报告**
```bash
echo "## 端到端集成测试结果\n\n测试时间$(date)\n\n### 功能测试\n- [x] 全局配置影响项目配置\n- [x] 项目配置不影响全局配置\n- [x] 并发操作正常\n\n### 性能测试\n- [x] listAll接口响应时间 < 200ms\n- [x] saveAll接口响应时间 < 500ms\n\n### 结论\n前后端集成测试通过功能正常性能符合要求。" > docs/test-records/e2e-test.md
git add docs/test-records/
echo "## 端到端集成测试结果\n\n测试时间$(date)\n\n### 功能测试\n- [x] 全局配置影响项目配置\n- [x] 项目配置不影响全局配置\n- [x] 并发操作正常\n\n### 性能测试\n- [x] listAll接口响应时间 < 200ms\n- [x] saveAll接口响应时间 < 500ms\n\n### 结论\n前后端集成测试通过功能正常性能符合要求。" > docs/tests/records/e2e-test.md
git add docs/tests/records/
git commit -m "test(ui): 完成端到端集成测试"
```

View File

@@ -574,6 +574,6 @@ Expected: 本地员工信息维护页面可访问
**Step 6: 最终提交**
```bash
git add ruoyi-ui/src/api/ccdiBaseStaff.js ruoyi-ui/src/api/ccdiAssetInfo.js ruoyi-ui/src/views/ccdiBaseStaff/index.vue ruoyi-ui/tests/unit docs/plans/2026-03-12-employee-asset-maintenance-frontend-implementation.md
git add ruoyi-ui/src/api/ccdiBaseStaff.js ruoyi-ui/src/api/ccdiAssetInfo.js ruoyi-ui/src/views/ccdiBaseStaff/index.vue ruoyi-ui/tests/unit docs/plans/frontend/2026-03-12-employee-asset-maintenance-frontend-implementation.md
git commit -m "新增员工资产信息前端实施计划"
```

View File

@@ -15,7 +15,7 @@
**Files:**
- Create: `docker/frontend/Dockerfile`
- Create: `docker/frontend/nginx.conf`
- Modify: `docs/plans/2026-03-13-ccdi-docker-deployment-design.md`
- Modify: `docs/design/2026-03-13-ccdi-docker-deployment-design.md`
**Step 1: 创建前端镜像定义**
@@ -69,7 +69,7 @@ Expected: 前端服务、依赖与端口映射正确
### Task 4: 联调验证
**Files:**
- Modify: `docs/plans/2026-03-13-ccdi-docker-deployment-design.md`
- Modify: `docs/design/2026-03-13-ccdi-docker-deployment-design.md`
**Step 1: 检查前端生产产物**
@@ -84,6 +84,6 @@ Expected: 前端服务、依赖与端口映射正确
**Step 3: 提交**
```bash
git add docker/frontend deploy/deploy.ps1 docker-compose.yml .env.example docs/plans/2026-03-13-ccdi-docker-deployment-*.md
git add docker/frontend deploy/deploy.ps1 docker-compose.yml .env.example docs/design/2026-03-13-ccdi-docker-deployment-design.md docs/plans/backend/2026-03-13-ccdi-docker-deployment-backend-implementation.md docs/plans/frontend/2026-03-13-ccdi-docker-deployment-frontend-implementation.md
git commit -m "新增Docker前端部署方案"
```

View File

@@ -188,7 +188,7 @@ git commit -m "保护亲属页资产导入交互不回归"
### Task 5: 执行前端回归验证
**Files:**
- Modify: `docs/plans/2026-03-13-employee-family-asset-import-split-design.md`
- Modify: `docs/design/2026-03-13-employee-family-asset-import-split-design.md`
**Step 1: 运行全部相关静态测试**
@@ -225,6 +225,6 @@ Expected:
**Step 4: 提交**
```bash
git add docs/plans/2026-03-13-employee-family-asset-import-split-design.md
git add docs/design/2026-03-13-employee-family-asset-import-split-design.md
git commit -m "完成资产导入拆分前端验证"
```

View File

@@ -28,7 +28,7 @@
**Step 3: Commit**
```bash
git add docs/implementation-reports/2026-03-16-project40-large-transaction-report.md
git add docs/reports/implementation2026-03-16-project40-large-transaction-report.md
git commit -m "文档: 补充项目40流水前端验证说明"
```
@@ -53,6 +53,6 @@ git commit -m "文档: 补充项目40流水前端验证说明"
**Step 3: Commit**
```bash
git add docs/implementation-reports/2026-03-16-project40-large-transaction-report.md
git add docs/reports/implementation2026-03-16-project40-large-transaction-report.md
git commit -m "文档: 完成项目40流水前端验证清单"
```

View File

@@ -233,7 +233,7 @@ git commit -m "refactor: 收敛模型参数页修改状态管理"
### Task 5: 验证“无千分位设计”和“接口驱动展示”
**Files:**
- Optional Record: `docs/test-records/model-param-frontend-alignment-test.md`
- Optional Record: `docs/tests/records/model-param-frontend-alignment-test.md`
**Step 1: 启动前端开发服务**
@@ -273,13 +273,13 @@ npm run dev
测试结束后关闭 `npm run dev` 启动的进程,并把结果写入:
```text
docs/test-records/model-param-frontend-alignment-test.md
docs/tests/records/model-param-frontend-alignment-test.md
```
然后提交:
```bash
git add docs/test-records/model-param-frontend-alignment-test.md
git add docs/tests/records/model-param-frontend-alignment-test.md
git commit -m "test: 记录模型参数前端动态展示验证"
```
@@ -326,10 +326,10 @@ npm run dev
**Step 5: 提交联调记录**
```bash
git add docs/test-records/model-param-frontend-alignment-test.md docs/test-records/model-param-backend-alignment-test.md
git add docs/tests/records/model-param-frontend-alignment-test.md docs/tests/records/model-param-backend-alignment-test.md
git commit -m "test: 完成模型参数前后端联调验收"
```
---
Plan complete and saved to `docs/plans/2026-03-16-model-param-csv-alignment-frontend-implementation.md`.
Plan complete and saved to `docs/plans/frontend/2026-03-16-model-param-csv-alignment-frontend-implementation.md`.

View File

@@ -13,7 +13,7 @@
### Task 1: 明确本期前端范围为零代码接入
**Files:**
- Modify: `docs/plans/2026-03-16-project-bank-statement-tagging-frontend-implementation.md`
- Modify: `docs/plans/frontend/2026-03-16-project-bank-statement-tagging-frontend-implementation.md`
**Step 1: Write the acceptance checklist**
@@ -44,14 +44,14 @@ Expected:
**Step 4: Commit**
```bash
git add docs/plans/2026-03-16-project-bank-statement-tagging-frontend-implementation.md
git add docs/plans/frontend/2026-03-16-project-bank-statement-tagging-frontend-implementation.md
git commit -m "docs: 明确流水标签前端一期范围"
```
### Task 2: 记录未来 API 契约占位
**Files:**
- Modify: `docs/plans/2026-03-16-project-bank-statement-tagging-frontend-implementation.md`
- Modify: `docs/plans/frontend/2026-03-16-project-bank-statement-tagging-frontend-implementation.md`
**Step 1: Define the future API contract**
@@ -70,7 +70,7 @@ git commit -m "docs: 明确流水标签前端一期范围"
Run:
```bash
Get-Content docs/plans/2026-03-16-project-bank-statement-tagging-frontend-implementation.md | Select-String "/ccdi/project/tags/rebuild"
Get-Content docs/plans/frontend/2026-03-16-project-bank-statement-tagging-frontend-implementation.md | Select-String "/ccdi/project/tags/rebuild"
```
Expected:
@@ -84,14 +84,14 @@ Expected:
**Step 4: Commit**
```bash
git add docs/plans/2026-03-16-project-bank-statement-tagging-frontend-implementation.md
git add docs/plans/frontend/2026-03-16-project-bank-statement-tagging-frontend-implementation.md
git commit -m "docs: 补充流水标签前端后续接口契约"
```
### Task 3: 约束后续页面接入位置
**Files:**
- Modify: `docs/plans/2026-03-16-project-bank-statement-tagging-frontend-implementation.md`
- Modify: `docs/plans/frontend/2026-03-16-project-bank-statement-tagging-frontend-implementation.md`
**Step 1: Write the page integration checklist**
@@ -125,14 +125,14 @@ Expected:
**Step 4: Commit**
```bash
git add docs/plans/2026-03-16-project-bank-statement-tagging-frontend-implementation.md
git add docs/plans/frontend/2026-03-16-project-bank-statement-tagging-frontend-implementation.md
git commit -m "docs: 约束流水标签前端二期接入位置"
```
### Task 4: 完成本期前端回归检查
**Files:**
- Modify: `docs/plans/2026-03-16-project-bank-statement-tagging-frontend-implementation.md`
- Modify: `docs/plans/frontend/2026-03-16-project-bank-statement-tagging-frontend-implementation.md`
**Step 1: Run frontend build smoke check**
@@ -165,7 +165,7 @@ Expected:
**Step 4: Commit**
```bash
git add docs/plans/2026-03-16-project-bank-statement-tagging-frontend-implementation.md
git add docs/plans/frontend/2026-03-16-project-bank-statement-tagging-frontend-implementation.md
git commit -m "docs: 完成流水标签前端一期兼容性核对"
```

View File

@@ -804,12 +804,12 @@ Expected: 前端服务启动成功,访问 http://localhost/ccdiProject
```bash
# 打开浏览器访问 http://localhost/ccdiProject
# 使用截图工具拍摄完整页面截图
# 保存为 docs/plans/implementation-screenshot.png
# 保存为 docs/plans/fullstack/implementation-screenshot.png
```
**Step 5: 创建验证报告**
创建文件 `docs/plans/verification-report.md`,记录验证结果:
创建文件 `docs/plans/misc/verification-report.md`,记录验证结果:
```markdown
# 项目管理页面重构验证报告
@@ -846,7 +846,7 @@ Expected: 前端服务启动成功,访问 http://localhost/ccdiProject
Run:
```bash
git add docs/plans/verification-report.md
git add docs/plans/misc/verification-report.md
git commit -m "docs: 添加项目管理页面重构验证报告"
```
@@ -950,7 +950,7 @@ Expected: 代码已推送到远程仓库
## 相关文件
- 设计文档:`docs/plans/2026-02-27-project-management-page-redesign.md`
- 设计文档:`docs/plans/fullstack/2026-02-27-project-management-page-redesign.md`
- 原型图:`doc/创建项目功能/ScreenShot_2026-02-27_111611_994.png`
- 主组件:`ruoyi-ui/src/views/ccdiProject/index.vue`
- 搜索组件:`ruoyi-ui/src/views/ccdiProject/components/SearchBar.vue`

View File

@@ -482,7 +482,7 @@ Expected:
## Task 9: 最终提交和文档更新
**Files:**
- Modify: `docs/plans/2026-02-27-project-status-counts-fix-design.md`
- Modify: `docs/design/2026-02-27-project-status-counts-fix-design.md`
**Step 1: 更新设计文档状态**
@@ -511,7 +511,7 @@ Expected:
**Step 3: 提交文档更新**
```bash
git add docs/plans/2026-02-27-project-status-counts-fix-design.md
git add docs/design/2026-02-27-project-status-counts-fix-design.md
git commit -m "docs: 更新项目状态统计修复设计文档状态为已完成"
```
@@ -573,6 +573,6 @@ git push origin dev
## 相关文档
- 设计文档: `docs/plans/2026-02-27-project-status-counts-fix-design.md`
- 设计文档: `docs/design/2026-02-27-project-status-counts-fix-design.md`
- 若依框架文档: 项目根目录的 `CLAUDE.md`
- MyBatis Plus 文档: https://baomidou.com/

View File

@@ -1124,7 +1124,7 @@ cp db_config.conf.template db_config.conf
- 实际配置: `db_config.conf`
- 表结构文件: `doc/database/backup/ccdi_structure.sql`
- 数据文件: `doc/database/backup/ccdi_data.sql`
- 设计文档: `docs/plans/2026-02-28-database-migration-design.md`
- 设计文档: `docs/design/2026-02-28-database-migration-design.md`
```
**Step 2: 提交操作指南**

View File

@@ -648,7 +648,7 @@ git commit -m "feat: 添加获取Token响应DTO"
**步骤 1: 参考设计文档创建各个DTO类**
根据 `docs/plans/2026-03-02-lsfx-integration-design.md` 中的DTO设计创建剩余的请求和响应对象。每个DTO都使用 `@Data` 注解,字段根据接口文档定义。
根据 `docs/design/2026-03-02-lsfx-integration-design.md` 中的DTO设计创建剩余的请求和响应对象。每个DTO都使用 `@Data` 注解,字段根据接口文档定义。
**步骤 2: 提交更改**

View File

@@ -1041,7 +1041,7 @@ git log --oneline
## 参考资料
- 新版接口文档:`doc/对接流水分析/兰溪-流水分析对接-新版.md`
- 设计文档:`docs/plans/2026-03-02-lsfx-integration-design.md`
- 设计文档:`docs/design/2026-03-02-lsfx-integration-design.md`
- 若依框架规范:`CLAUDE.md`
---

View File

@@ -955,6 +955,6 @@ git push origin dev
## 文档参考
- 设计文档: `docs/plans/2026-03-04-project-detail-navigation-menu-design.md`
- 设计文档: `docs/design/2026-03-04-project-detail-navigation-menu-design.md`
- Element UI Menu 文档: https://element.eleme.cn/#/zh-CN/component/menu
- Vue 动态组件: https://cn.vuejs.org/v2/guide/components.html#动态组件

View File

@@ -314,7 +314,7 @@ git commit -m "feat(lsfx-mock): 添加银行流水审计字段到 mock 响应
## Task 4: 更新文档(可选)
**Files:**
- Update: `docs/plans/2026-03-05-bank-statement-audit-fields-design.md`(已存在)
- Update: `docs/design/2026-03-05-bank-statement-audit-fields-design.md`(已存在)
**Step 1: 验证设计文档完整性**
@@ -366,7 +366,7 @@ git commit -m "docs: 更新银行流水接口文档,补充审计字段说明"
## 参考资料
- 设计文档: `docs/plans/2026-03-05-bank-statement-audit-fields-design.md`
- 设计文档: `docs/design/2026-03-05-bank-statement-audit-fields-design.md`
- 实体类: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/entity/CcdiBankStatement.java`
- 项目规范: `CLAUDE.md`
- 外部平台接口文档 6.5 节

View File

@@ -252,6 +252,6 @@ git commit -m "fix: 补充银行流水接口 uploadSequnceNumber 字段接收和
## 参考资料
- 设计文档:`docs/plans/2026-03-05-bank-statement-field-design.md`
- 设计文档:`docs/design/2026-03-05-bank-statement-field-design.md`
- 字段映射文档:`assets/对接流水分析/ccdi_bank_statement.md`
- 接口文档:`assets/对接流水分析/兰溪-流水分析对接-新版.md`

View File

@@ -8,7 +8,7 @@
**技术栈:** Spring Boot 3.5.8 + MyBatis Plus 3.0.5 + Vue 2.6.12 + Element UI 2.15.14
**设计文档:** `docs/plans/2026-03-06-model-param-config-optimization-design.md`
**设计文档:** `docs/design/2026-03-06-model-param-config-optimization-design.md`
---
@@ -675,7 +675,7 @@ mvn spring-boot:run
**步骤 5: 提交测试记录**
```bash
git add docs/test-records/
git add docs/tests/records/
git commit -m "test: 记录后端接口测试结果"
```
@@ -1007,7 +1007,7 @@ npm run dev
**步骤 4: 提交测试记录**
```bash
git add docs/test-records/
git add docs/tests/records/
git commit -m "test: 记录全局配置页面测试结果"
```
@@ -1270,7 +1270,7 @@ git commit -m "feat: 重构项目内模型参数配置页面"
**步骤 4: 提交测试记录**
```bash
git add docs/test-records/
git add docs/tests/records/
git commit -m "test: 记录项目配置页面测试结果"
```
@@ -1295,7 +1295,7 @@ git commit -m "test: 记录项目配置页面测试结果"
**步骤 3: 提交测试记录**
```bash
git add docs/test-records/
git add docs/tests/records/
git commit -m "test: 完成端到端功能测试"
```
@@ -1319,7 +1319,7 @@ git commit -m "test: 完成端到端功能测试"
**步骤 4: 提交测试记录**
```bash
git add docs/test-records/
git add docs/tests/records/
git commit -m "test: 完成性能测试"
```

View File

@@ -8,7 +8,7 @@
**技术栈:** Spring Boot 3.5.8 + MyBatis Plus 3.0.5 + Vue 2.6.12 + Element UI 2.15.14
**设计文档:** `docs/plans/2026-03-06-model-param-config-optimization-design.md`
**设计文档:** `docs/design/2026-03-06-model-param-config-optimization-design.md`
---
@@ -683,7 +683,7 @@ mvn spring-boot:run
记录测试结果并提交(如果需要):
```bash
git add docs/test-records/
git add docs/tests/records/
git commit -m "test: 记录后端接口测试结果"
```

View File

@@ -301,4 +301,4 @@ npm run build:prod
- `ruoyi-ui/src/settings.js` - 默认配置文件(本次修改)
- `ruoyi-ui/src/store/modules/settings.js` - Vuex 状态管理(无需修改)
- `ruoyi-ui/src/layout/components/Settings/index.vue` - 设置界面(无需修改)
- `docs/plans/2026-03-06-theme-light-default-design.md` - 设计文档
- `docs/design/2026-03-06-theme-light-default-design.md` - 设计文档

View File

@@ -308,8 +308,8 @@ git commit -m "fix(ccdi-project): cleanup partial bank statements on upload fail
### Task 4: 回归验证并整理交付
**Files:**
- Modify: `docs/plans/2026-03-09-file-upload-parse-success-after-bank-statement-design.md`
- Modify: `docs/plans/2026-03-09-file-upload-parse-success-after-bank-statement.md`
- Modify: `docs/design/2026-03-09-file-upload-parse-success-after-bank-statement-design.md`
- Modify: `docs/plans/fullstack/2026-03-09-file-upload-parse-success-after-bank-statement.md`
**Step 1: Run final verification**
@@ -343,7 +343,7 @@ Expected:
**Step 4: Commit**
```bash
git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImpl.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiBankStatementMapper.java ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankStatementMapper.xml ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImplTest.java docs/plans/2026-03-09-file-upload-parse-success-after-bank-statement-design.md docs/plans/2026-03-09-file-upload-parse-success-after-bank-statement.md
git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImpl.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiBankStatementMapper.java ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankStatementMapper.xml ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImplTest.java docs/design/2026-03-09-file-upload-parse-success-after-bank-statement-design.md docs/plans/fullstack/2026-03-09-file-upload-parse-success-after-bank-statement.md
git commit -m "docs: finalize file upload parse success timing plan"
```

View File

@@ -196,7 +196,7 @@ feat(ui): 在项目详情页面添加配置类型标签显示
- 添加 getConfigTypeLabel 和 getConfigTypeStyle 方法
- 纯前端实现,无需后端修改
Ref: docs/plans/2026-03-09-param-config-type-display-design.md
Ref: docs/design/2026-03-09-param-config-type-display-design.md
EOF
)"
```
@@ -221,7 +221,7 @@ Date: [Date]
- 添加 getConfigTypeLabel 和 getConfigTypeStyle 方法
- 纯前端实现,无需后端修改
Ref: docs/plans/2026-03-09-param-config-type-display-design.md
Ref: docs/design/2026-03-09-param-config-type-display-design.md
ruoyi-ui/src/views/ccdiProject/detail.vue | [lines changed]
1 file changed, [stats]
@@ -289,7 +289,7 @@ git reset --hard HEAD~1
## 相关文档
- 设计文档: `docs/plans/2026-03-09-param-config-type-display-design.md`
- 设计文档: `docs/design/2026-03-09-param-config-type-display-design.md`
- Element UI Tag 组件: https://element.eleme.cn/#/zh-CN/component/tag
- 项目 CLAUDE.md: `CLAUDE.md`

View File

@@ -0,0 +1,563 @@
# Project Bank Statement Tagging Logging Implementation Plan
> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 为项目流水标签后端补齐可排障、可审计的详细日志,覆盖手动重算、自动触发、项目互斥、规则执行、参数解析和补跑收尾链路。
**Architecture:** 继续沿用现有 `ccdi-project` 结构,在 Controller、上传服务、重算协调器、标签服务和参数解析器上直接补充统一格式日志不引入新框架或新表。测试沿用现有 JUnit 5 + Mockito 基础,在现有测试类中通过 Logback `ListAppender` 捕获日志,验证关键分支会产生日志摘要且不破坏原行为。
**Tech Stack:** Java 21, Spring Boot 3, Lombok, SLF4J + Logback, JUnit 5, Mockito, Maven
---
## File Structure
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiBankTagController.java`
手动重算入口日志,记录 `projectId/modelCode/operator`
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImpl.java`
自动触发入口日志,记录批处理完成后的触发、跳过和提交结果。
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/ProjectBankTagRebuildCoordinator.java`
项目级锁、互斥拒绝、`needRerun` 标记与补跑消费日志。
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImpl.java`
任务生命周期、规则执行、结果清理和批量写入摘要日志。
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolver.java`
规则参数来源、解析结果、缺失参数日志。
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiBankTagControllerTest.java`
手动重算入口日志测试。
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImplTest.java`
自动触发入口日志测试。
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/ProjectBankTagRebuildCoordinatorTest.java`
协调器互斥和补跑日志测试。
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImplTest.java`
任务成功、无命中、失败摘要日志测试。
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolverTest.java`
参数解析成功和缺失日志测试。
### Task 1: 补齐入口层日志
**Files:**
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiBankTagController.java`
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImpl.java`
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiBankTagControllerTest.java`
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImplTest.java`
- [ ] **Step 1: Write the failing tests**
在控制器测试中新增手动重算入口日志断言,在上传服务测试中新增自动触发“跳过”和“提交”日志断言。优先复用现有 Logback `ListAppender` 方案。
```java
@Test
void rebuild_shouldLogManualRebuildRequest() {
CcdiBankTagRebuildDTO dto = new CcdiBankTagRebuildDTO();
dto.setProjectId(40L);
dto.setModelCode("LARGE_TRANSACTION");
Logger logger = (Logger) LoggerFactory.getLogger(CcdiBankTagController.class);
ListAppender<ILoggingEvent> appender = new ListAppender<>();
appender.start();
logger.addAppender(appender);
when(bankTagService.submitRebuild(dto, "admin")).thenReturn("标签重算任务已提交");
try (MockedStatic<SecurityUtils> mocked = mockStatic(SecurityUtils.class)) {
mocked.when(SecurityUtils::getUsername).thenReturn("admin");
controller.rebuild(dto);
assertTrue(appender.list.stream().map(ILoggingEvent::getFormattedMessage)
.anyMatch(message -> message.contains("收到手动重算请求")
&& message.contains("projectId=40")
&& message.contains("modelCode=LARGE_TRANSACTION")
&& message.contains("operator=admin")));
} finally {
logger.detachAppender(appender);
}
}
@Test
void handleTagRebuildAfterBatchCompletion_shouldLogSkipWhenAllRecordsFailed() {
Logger logger = (Logger) LoggerFactory.getLogger(CcdiFileUploadServiceImpl.class);
ListAppender<ILoggingEvent> appender = new ListAppender<>();
appender.start();
logger.addAppender(appender);
try {
ReflectionTestUtils.invokeMethod(
service,
"handleTagRebuildAfterBatchCompletion",
PROJECT_ID,
TriggerType.AUTO_BATCH_UPLOAD,
Boolean.FALSE
);
verify(bankTagService, never()).submitAutoRebuild(any(), any());
assertTrue(appender.list.stream().map(ILoggingEvent::getFormattedMessage)
.anyMatch(message -> message.contains("跳过自动重算")
&& message.contains("projectId=100")
&& message.contains("AUTO_BATCH_UPLOAD")));
} finally {
logger.detachAppender(appender);
}
}
```
- [ ] **Step 2: Run tests to verify they fail**
Run:
```bash
mvn test -pl ccdi-project -am -Dtest=CcdiBankTagControllerTest#rebuild_shouldLogManualRebuildRequest,CcdiFileUploadServiceImplTest#handleTagRebuildAfterBatchCompletion_shouldLogSkipWhenAllRecordsFailed
```
Expected:
- `FAIL`
- 原因是控制器和上传服务尚未输出对应日志
- [ ] **Step 3: Write minimal implementation**
在入口层补日志,保持统一字段格式:
```java
log.info("【流水标签】收到手动重算请求: projectId={}, modelCode={}, operator={}",
dto.getProjectId(), dto.getModelCode(), operator);
```
```java
log.info("【流水标签】批处理完成,准备触发自动重算: projectId={}, triggerType={}, anySuccess={}",
projectId, triggerType, anySuccess);
if (!Boolean.TRUE.equals(anySuccess)) {
log.warn("【流水标签】跳过自动重算: projectId={}, triggerType={}, reason=all_records_failed",
projectId, triggerType);
return;
}
bankTagService.submitAutoRebuild(projectId, triggerType);
```
- [ ] **Step 4: Run tests to verify they pass**
Run:
```bash
mvn test -pl ccdi-project -am -Dtest=CcdiBankTagControllerTest#rebuild_shouldLogManualRebuildRequest,CcdiFileUploadServiceImplTest#handleTagRebuildAfterBatchCompletion_shouldLogSkipWhenAllRecordsFailed
```
Expected:
- `PASS`
- [ ] **Step 5: Commit**
```bash
git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiBankTagController.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImpl.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiBankTagControllerTest.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImplTest.java
git commit -m "test: 补充流水标签入口日志"
```
### Task 2: 补齐协调器互斥与补跑日志
**Files:**
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/ProjectBankTagRebuildCoordinator.java`
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/ProjectBankTagRebuildCoordinatorTest.java`
- [ ] **Step 1: Write the failing tests**
在现有协调器测试基础上增加日志捕获,覆盖“手动被拒绝”和“自动标记补跑”两个分支。
```java
@Test
void submitManual_shouldLogRejectWhenProjectAlreadyRunning() {
CcdiBankTagTask runningTask = new CcdiBankTagTask();
runningTask.setId(1L);
runningTask.setProjectId(40L);
runningTask.setStatus("RUNNING");
when(taskMapper.selectRunningTaskByProjectId(40L)).thenReturn(runningTask);
Logger logger = (Logger) LoggerFactory.getLogger(ProjectBankTagRebuildCoordinator.class);
ListAppender<ILoggingEvent> appender = new ListAppender<>();
appender.start();
logger.addAppender(appender);
try {
assertThrows(ServiceException.class, () -> coordinator.submitManual(40L, null, "admin"));
assertTrue(appender.list.stream().map(ILoggingEvent::getFormattedMessage)
.anyMatch(message -> message.contains("拒绝手动重算")
&& message.contains("projectId=40")
&& message.contains("operator=admin")));
} finally {
logger.detachAppender(appender);
}
}
@Test
void submitAuto_shouldLogNeedRerunWhenProjectAlreadyRunning() {
CcdiBankTagTask runningTask = new CcdiBankTagTask();
runningTask.setId(1L);
runningTask.setProjectId(40L);
runningTask.setStatus("RUNNING");
runningTask.setNeedRerun(0);
when(taskMapper.selectRunningTaskByProjectId(40L)).thenReturn(runningTask);
Logger logger = (Logger) LoggerFactory.getLogger(ProjectBankTagRebuildCoordinator.class);
ListAppender<ILoggingEvent> appender = new ListAppender<>();
appender.start();
logger.addAppender(appender);
try {
coordinator.submitAuto(40L, TriggerType.AUTO_BATCH_UPLOAD);
assertTrue(appender.list.stream().map(ILoggingEvent::getFormattedMessage)
.anyMatch(message -> message.contains("已标记完成后补跑")
&& message.contains("runningTaskId=1")
&& message.contains("AUTO_BATCH_UPLOAD")));
} finally {
logger.detachAppender(appender);
}
}
```
- [ ] **Step 2: Run tests to verify they fail**
Run:
```bash
mvn test -pl ccdi-project -am -Dtest=ProjectBankTagRebuildCoordinatorTest#submitManual_shouldLogRejectWhenProjectAlreadyRunning+submitAuto_shouldLogNeedRerunWhenProjectAlreadyRunning
```
Expected:
- `FAIL`
- 原因是协调器尚未输出拒绝和补跑日志
- [ ] **Step 3: Write minimal implementation**
在协调器中补 `info/warn` 日志,至少覆盖:
```java
log.info("【流水标签】手动重算开始排队: projectId={}, modelCode={}, operator={}", projectId, modelCode, operator);
log.warn("【流水标签】项目已有运行中任务,拒绝手动重算: projectId={}, modelCode={}, operator={}", projectId, modelCode, operator);
log.warn("【流水标签】项目正在重算,已标记完成后补跑: projectId={}, runningTaskId={}, triggerType={}", projectId, runningTask.getId(), triggerType);
log.info("【流水标签】获取项目重算锁成功: projectId={}", projectId);
log.info("【流水标签】释放项目重算锁: projectId={}", projectId);
```
如实现过程中发现 `taskId` 为空分支,日志允许保留空值,但不要省略字段。
- [ ] **Step 4: Run tests to verify they pass**
Run:
```bash
mvn test -pl ccdi-project -am -Dtest=ProjectBankTagRebuildCoordinatorTest#submitManual_shouldLogRejectWhenProjectAlreadyRunning+submitAuto_shouldLogNeedRerunWhenProjectAlreadyRunning
```
Expected:
- `PASS`
- [ ] **Step 5: Commit**
```bash
git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/ProjectBankTagRebuildCoordinator.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/ProjectBankTagRebuildCoordinatorTest.java
git commit -m "test: 补充流水标签协调器日志"
```
### Task 3: 补齐任务级与规则级执行日志
**Files:**
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImpl.java`
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImplTest.java`
- [ ] **Step 1: Write the failing tests**
新增两个测试,分别覆盖成功摘要和失败摘要。复用同步执行器 `Runnable::run`,避免并发影响日志顺序。
```java
@Test
void rebuildProject_shouldLogTaskLifecycleAndRuleSummary() {
ReflectionTestUtils.setField(service, "tagRuleExecutor", (Executor) Runnable::run);
CcdiBankTagRule rule = new CcdiBankTagRule();
rule.setModelCode("LARGE_TRANSACTION");
rule.setModelName("大额交易");
rule.setRuleCode("HOUSE_OR_CAR_EXPENSE");
rule.setRuleName("房车消费支出交易");
rule.setResultType("STATEMENT");
BankTagRuleExecutionConfig config = new BankTagRuleExecutionConfig();
config.setProjectId(40L);
config.setRuleMeta(rule);
BankTagStatementHitVO hit = new BankTagStatementHitVO();
hit.setBankStatementId(10L);
hit.setGroupId(40);
hit.setLogId(40001);
hit.setReasonDetail("命中房车消费支出");
doAnswer(invocation -> {
CcdiBankTagTask task = invocation.getArgument(0);
task.setId(88L);
return 1;
}).when(taskMapper).insertTask(any(CcdiBankTagTask.class));
when(ruleMapper.selectEnabledRules(null)).thenReturn(List.of(rule));
when(configResolver.resolve(40L, rule)).thenReturn(config);
when(analysisMapper.selectHouseOrCarExpenseStatements(40L)).thenReturn(List.of(hit));
Logger logger = (Logger) LoggerFactory.getLogger(CcdiBankTagServiceImpl.class);
ListAppender<ILoggingEvent> appender = new ListAppender<>();
appender.start();
logger.addAppender(appender);
try {
service.rebuildProject(40L, null, "admin", TriggerType.MANUAL);
assertTrue(appender.list.stream().map(ILoggingEvent::getFormattedMessage)
.anyMatch(message -> message.contains("任务创建成功")
&& message.contains("taskId=88")
&& message.contains("projectId=40")));
assertTrue(appender.list.stream().map(ILoggingEvent::getFormattedMessage)
.anyMatch(message -> message.contains("规则执行完成")
&& message.contains("ruleCode=HOUSE_OR_CAR_EXPENSE")
&& message.contains("hitCount=1")));
} finally {
logger.detachAppender(appender);
}
}
@Test
void rebuildProject_shouldLogFailureSummaryWhenRuleExecutionFails() {
ReflectionTestUtils.setField(service, "tagRuleExecutor", (Executor) Runnable::run);
CcdiBankTagRule rule = new CcdiBankTagRule();
rule.setModelCode("LARGE_TRANSACTION");
rule.setRuleCode("HOUSE_OR_CAR_EXPENSE");
rule.setResultType("STATEMENT");
doAnswer(invocation -> {
CcdiBankTagTask task = invocation.getArgument(0);
task.setId(89L);
return 1;
}).when(taskMapper).insertTask(any(CcdiBankTagTask.class));
when(ruleMapper.selectEnabledRules(null)).thenReturn(List.of(rule));
when(configResolver.resolve(40L, rule)).thenThrow(new RuntimeException("threshold missing"));
Logger logger = (Logger) LoggerFactory.getLogger(CcdiBankTagServiceImpl.class);
ListAppender<ILoggingEvent> appender = new ListAppender<>();
appender.start();
logger.addAppender(appender);
try {
assertThrows(RuntimeException.class, () -> service.rebuildProject(40L, null, "admin", TriggerType.MANUAL));
assertTrue(appender.list.stream().map(ILoggingEvent::getFormattedMessage)
.anyMatch(message -> message.contains("任务执行失败")
&& message.contains("taskId=89")
&& message.contains("threshold missing")));
} finally {
logger.detachAppender(appender);
}
}
```
- [ ] **Step 2: Run tests to verify they fail**
Run:
```bash
mvn test -pl ccdi-project -am -Dtest=CcdiBankTagServiceImplTest#rebuildProject_shouldLogTaskLifecycleAndRuleSummary,CcdiBankTagServiceImplTest#rebuildProject_shouldLogFailureSummaryWhenRuleExecutionFails
```
Expected:
- `FAIL`
- 原因是标签服务尚未输出任务和规则摘要日志
- [ ] **Step 3: Write minimal implementation**
在标签服务中补统一摘要日志,并尽量把时间统计放在方法内部完成:
```java
log.info("【流水标签】任务创建成功: taskId={}, projectId={}, modelCode={}, triggerType={}, operator={}",
task.getId(), projectId, modelCode, triggerType, operator);
log.info("【流水标签】加载启用规则完成: taskId={}, projectId={}, modelCode={}, ruleCount={}",
task.getId(), projectId, modelCode, rules.size());
log.info("【流水标签】开始清理历史结果: taskId={}, projectId={}, modelCode={}",
task.getId(), projectId, modelCode);
log.info("【流水标签】规则开始执行: taskId={}, projectId={}, ruleCode={}, resultType={}",
taskId, projectId, rule.getRuleCode(), rule.getResultType());
log.debug("【流水标签】规则执行参数: taskId={}, ruleCode={}, thresholds={}", taskId, rule.getRuleCode(), config.getThresholdValues());
log.info("【流水标签】规则执行完成: taskId={}, projectId={}, ruleCode={}, hitCount={}, costMs={}",
taskId, projectId, rule.getRuleCode(), results.size(), costMs);
log.error("【流水标签】任务执行失败: taskId={}, projectId={}, modelCode={}, triggerType={}, error={}",
task.getId(), projectId, modelCode, triggerType, ex.getMessage(), ex);
```
如果实现过程中发现 `executeRule(...)` 缺少 `taskId` 上下文,可按最小改动为私有方法补一个 `taskId` 参数,不要引入全局上下文对象。
- [ ] **Step 4: Run tests to verify they pass**
Run:
```bash
mvn test -pl ccdi-project -am -Dtest=CcdiBankTagServiceImplTest#rebuildProject_shouldLogTaskLifecycleAndRuleSummary,CcdiBankTagServiceImplTest#rebuildProject_shouldLogFailureSummaryWhenRuleExecutionFails
```
Expected:
- `PASS`
- [ ] **Step 5: Commit**
```bash
git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImpl.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImplTest.java
git commit -m "test: 补充流水标签执行日志"
```
### Task 4: 补齐规则参数解析日志
**Files:**
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolver.java`
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolverTest.java`
- [ ] **Step 1: Write the failing tests**
新增一个日志测试,验证解析成功时会记录参数来源,参数缺失时会记录缺失编码。
```java
@Test
void resolve_shouldLogThresholdSourceAndMissingParams() {
CcdiProject project = new CcdiProject();
project.setProjectId(40L);
project.setConfigType("default");
when(projectMapper.selectById(40L)).thenReturn(project);
when(modelParamMapper.selectByProjectAndModel(0L, "LARGE_TRANSACTION")).thenReturn(List.of(
buildParam("LARGE_CASH_DEPOSIT", "50000")
));
CcdiBankTagRule ruleMeta = new CcdiBankTagRule();
ruleMeta.setModelCode("LARGE_TRANSACTION");
ruleMeta.setRuleCode("FREQUENT_CASH_DEPOSIT");
Logger logger = (Logger) LoggerFactory.getLogger(BankTagRuleConfigResolver.class);
ListAppender<ILoggingEvent> appender = new ListAppender<>();
appender.start();
logger.addAppender(appender);
try {
resolver.resolve(40L, ruleMeta);
assertTrue(appender.list.stream().map(ILoggingEvent::getFormattedMessage)
.anyMatch(message -> message.contains("解析规则参数")
&& message.contains("effectiveProjectId=0")
&& message.contains("FREQUENT_CASH_DEPOSIT")));
assertTrue(appender.list.stream().map(ILoggingEvent::getFormattedMessage)
.anyMatch(message -> message.contains("规则参数缺失")
&& message.contains("FREQUENT_CASH_DEPOSIT")));
} finally {
logger.detachAppender(appender);
}
}
```
- [ ] **Step 2: Run test to verify it fails**
Run:
```bash
mvn test -pl ccdi-project -am -Dtest=BankTagRuleConfigResolverTest#resolve_shouldLogThresholdSourceAndMissingParams
```
Expected:
- `FAIL`
- 原因是参数解析器尚未输出来源和缺失日志
- [ ] **Step 3: Write minimal implementation**
在参数解析器中补日志,并显式计算缺失参数集合:
```java
log.info("【流水标签】解析规则参数: projectId={}, effectiveProjectId={}, ruleCode={}, requiredParams={}",
projectId, effectiveProjectId, ruleMeta.getRuleCode(), requiredParamCodes);
log.debug("【流水标签】规则参数解析结果: projectId={}, ruleCode={}, thresholdValues={}",
projectId, ruleMeta.getRuleCode(), thresholdValues);
if (!missingParamCodes.isEmpty()) {
log.warn("【流水标签】规则参数缺失: projectId={}, ruleCode={}, missingParams={}",
projectId, ruleMeta.getRuleCode(), missingParamCodes);
}
```
不要在这里改变现有返回语义;本任务只补日志,不新增抛错逻辑。
- [ ] **Step 4: Run test to verify it passes**
Run:
```bash
mvn test -pl ccdi-project -am -Dtest=BankTagRuleConfigResolverTest#resolve_shouldLogThresholdSourceAndMissingParams
```
Expected:
- `PASS`
- [ ] **Step 5: Commit**
```bash
git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolver.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolverTest.java
git commit -m "test: 补充流水标签参数解析日志"
```
### Task 5: 跑回归并整理最终提交
**Files:**
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiBankTagController.java`
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImpl.java`
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/ProjectBankTagRebuildCoordinator.java`
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImpl.java`
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolver.java`
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiBankTagControllerTest.java`
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImplTest.java`
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/ProjectBankTagRebuildCoordinatorTest.java`
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImplTest.java`
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolverTest.java`
- [ ] **Step 1: Run focused regression tests**
Run:
```bash
mvn test -pl ccdi-project -am -Dtest=CcdiBankTagControllerTest,CcdiFileUploadServiceImplTest,ProjectBankTagRebuildCoordinatorTest,CcdiBankTagServiceImplTest,BankTagRuleConfigResolverTest
```
Expected:
- `PASS`
- 所有日志相关测试通过
- [ ] **Step 2: Run module compile to catch logging import or signature regressions**
Run:
```bash
mvn clean compile -pl ccdi-project -am -DskipTests
```
Expected:
- `BUILD SUCCESS`
- [ ] **Step 3: Review final diff**
Run:
```bash
git diff -- ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiBankTagController.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImpl.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/ProjectBankTagRebuildCoordinator.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImpl.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolver.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiBankTagControllerTest.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImplTest.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/ProjectBankTagRebuildCoordinatorTest.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImplTest.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolverTest.java
```
Expected:
- 只包含本次日志相关改动
- 没有引入敏感字段明文打印
- [ ] **Step 4: Commit**
```bash
git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiBankTagController.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImpl.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/ProjectBankTagRebuildCoordinator.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImpl.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolver.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiBankTagControllerTest.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImplTest.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/ProjectBankTagRebuildCoordinatorTest.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImplTest.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolverTest.java
git commit -m "feat: 补充流水标签详细日志"
```

View File

@@ -122,7 +122,7 @@ export function saveAllParams(data) {
### 4. 测试记录
#### 4.1 全局配置页面测试
**文件:** `docs/test-records/global-config-test.md`
**文件:** `docs/tests/records/global-config-test.md`
**测试项:**
- ✅ 页面显示正确
@@ -131,7 +131,7 @@ export function saveAllParams(data) {
- ✅ 错误处理正常
#### 4.2 项目配置页面测试
**文件:** `docs/test-records/project-config-test.md`
**文件:** `docs/tests/records/project-config-test.md`
**测试项:**
- ✅ 使用默认配置项目测试通过
@@ -140,7 +140,7 @@ export function saveAllParams(data) {
- ✅ 配置继承逻辑正确
#### 4.3 端到端集成测试
**文件:** `docs/test-records/e2e-test.md`
**文件:** `docs/tests/records/e2e-test.md`
**测试项:**
- ✅ 全局配置影响项目配置
@@ -213,9 +213,9 @@ ae61ac3 feat(ui): 在API层添加批量查询和批量保存方法
### 新增文件
```
docs/test-records/e2e-test.md
docs/test-records/global-config-test.md
docs/test-records/project-config-test.md
docs/tests/records/e2e-test.md
docs/tests/records/global-config-test.md
docs/tests/records/project-config-test.md
```
### 修改文件

Some files were not shown because too many files have changed in this diff Show More