From a40c44f8b8f17b270294f7947b1f1a33ee53701f Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Mon, 16 Mar 2026 13:35:40 +0800 Subject: [PATCH] Align backend model params CSV --- assets/模型默认参数.csv | 6 +- ...am-csv-alignment-backend-implementation.md | 357 ++++++++++++++++++ ...m-csv-alignment-frontend-implementation.md | 335 ++++++++++++++++ 3 files changed, 695 insertions(+), 3 deletions(-) create mode 100644 docs/plans/2026-03-16-model-param-csv-alignment-backend-implementation.md create mode 100644 docs/plans/2026-03-16-model-param-csv-alignment-frontend-implementation.md diff --git a/assets/模型默认参数.csv b/assets/模型默认参数.csv index d7448028..d1f17970 100644 --- a/assets/模型默认参数.csv +++ b/assets/模型默认参数.csv @@ -13,8 +13,8 @@ id,project_id,model_code,model_name,param_code,param_name,param_desc,param_value 11,0,SUSPICIOUS_FOREIGN_EXCHANGE,可疑外汇交易模型,SINGLE_SETTLEMENT_AMOUNT,单笔结汇金额,单笔结汇超过该金额,50000,美元/笔 12,0,SUSPICIOUS_FOREIGN_EXCHANGE,可疑外汇交易模型,CROSS_BORDER_REMITTANCE,跨境汇款金额,跨境汇款金额超过,200000,美元/笔 ,,,,,,,, -,,ABNORMAL_BEHAVIOR,异常行为模型,stock_tfr_large,银证转账大额金额,,"1,000,000",元 +,,ABNORMAL_BEHAVIOR,异常行为模型,stock_tfr_large,银证转账大额金额,,1000000,元 ,,ABNORMAL_BEHAVIOR,异常行为模型,withdraw_cnt,微信、支付宝单日提现次数,,3,次/日 -,,ABNORMAL_BEHAVIOR,异常行为模型,withdraw_amt,微信、支付宝单日提现金额,,"50,000",元/日 +,,ABNORMAL_BEHAVIOR,异常行为模型,withdraw_amt,微信、支付宝单日提现金额,,50000,元/日 ,,SUSPICIOUS_GAMBLING,疑似赌博交易模型,multi_party_amt_min,疑似赌博金额下限,,500,元 -,,SUSPICIOUS_GAMBLING,疑似赌博交易模型,multi_party_amt_max,疑似赌博金额上限,,"5,000",元 +,,SUSPICIOUS_GAMBLING,疑似赌博交易模型,multi_party_amt_max,疑似赌博金额上限,,5000,元 diff --git a/docs/plans/2026-03-16-model-param-csv-alignment-backend-implementation.md b/docs/plans/2026-03-16-model-param-csv-alignment-backend-implementation.md new file mode 100644 index 00000000..95c1fb58 --- /dev/null +++ b/docs/plans/2026-03-16-model-param-csv-alignment-backend-implementation.md @@ -0,0 +1,357 @@ +# Model Param CSV Alignment Backend Implementation Plan + +> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. + +**Goal:** Align system default model parameters with `assets/模型默认参数.csv` on the backend and database side without changing the existing `listAll/saveAll` API contract. + +**Architecture:** Keep `ccdi_model_param` as the single source of truth for model metadata and default values. Update initialization SQL, add an upgrade SQL for existing environments, and make a small service/mapper cleanup so query ordering and default-project copy behavior remain stable while historical `custom` projects stay untouched. + +**Tech Stack:** Java 21, Spring Boot 3, MyBatis Plus, MySQL, Maven + +--- + +### Task 1: 固化 CSV 对应的系统默认参数清单 + +**Files:** +- Reference: `assets/模型默认参数.csv` +- Modify: `sql/ccdi_model_param.sql` + +**Step 1: 对照 CSV 列出最终参数集合** + +确认最终系统默认参数为 5 个模型、16 个参数: + +- `LARGE_TRANSACTION` +- `SUSPICIOUS_PART_TIME` +- `SUSPICIOUS_FOREIGN_EXCHANGE` +- `ABNORMAL_BEHAVIOR` +- `SUSPICIOUS_GAMBLING` + +并确认每条记录的 `model_code`、`model_name`、`param_code`、`param_name`、`param_desc`、`param_value`、`param_unit`、`sort_order`。 + +**Step 2: 写一个失败前检查** + +运行: + +```bash +Get-Content -Raw 'sql/ccdi_model_param.sql' +``` + +预期:可以看到旧参数定义仍与 CSV 不完全一致,包含已废弃参数或缺失模型。 + +**Step 3: 更新初始化 SQL** + +将 `sql/ccdi_model_param.sql` 中 `project_id = 0` 的初始化数据改为与 CSV 一致,要求: + +- 删除旧的废弃参数 +- 新增 `ABNORMAL_BEHAVIOR`、`SUSPICIOUS_GAMBLING` +- 保证 `sort_order` 从 1 开始递增 +- 不引入任何千分位格式数据 + +**Step 4: 做静态自检** + +运行: + +```bash +Get-Content -Raw 'sql/ccdi_model_param.sql' +``` + +预期:SQL 中只剩 CSV 对应的 16 条系统默认参数记录。 + +**Step 5: 提交** + +```bash +git add sql/ccdi_model_param.sql +git commit -m "feat: 对齐模型默认参数初始化脚本" +``` + +### Task 2: 为已有环境补充默认参数覆盖脚本 + +**Files:** +- Create or Modify: `sql/2026-03-16-update-ccdi-model-param-defaults.sql` + +**Step 1: 写覆盖脚本骨架** + +脚本要求: + +- 以事务包裹 +- 只处理 `project_id = 0` +- 先删除旧的系统默认参数 +- 再插入与 CSV 一致的 16 条新默认参数 + +**Step 2: 写失败前检查** + +运行: + +```bash +Test-Path 'sql/2026-03-16-update-ccdi-model-param-defaults.sql' +Get-Content -Raw 'sql/2026-03-16-update-ccdi-model-param-defaults.sql' +``` + +预期:若文件已存在,内容可能未完全符合最终参数集合;若不存在,则本步骤补齐。 + +**Step 3: 写最小正确实现** + +确保脚本满足: + +- `START TRANSACTION;` +- `DELETE FROM ccdi_model_param WHERE project_id = 0;` +- 插入 16 条目标数据 +- `COMMIT;` + +**Step 4: 自检** + +运行: + +```bash +Get-Content -Raw 'sql/2026-03-16-update-ccdi-model-param-defaults.sql' +``` + +预期:脚本与初始化 SQL 的系统默认参数集合完全一致。 + +**Step 5: 提交** + +```bash +git add sql/2026-03-16-update-ccdi-model-param-defaults.sql +git commit -m "feat: 新增模型默认参数升级脚本" +``` + +### Task 3: 稳定后端查询顺序 + +**Files:** +- Modify: `ccdi-project/src/main/resources/mapper/ccdi/project/CcdiModelParamMapper.xml` + +**Step 1: 先查看当前 SQL** + +运行: + +```bash +Get-Content -Raw 'ccdi-project/src/main/resources/mapper/ccdi/project/CcdiModelParamMapper.xml' +``` + +预期:`selectByProjectId` 已存在,但排序可能仅依赖 `model_code, sort_order`。 + +**Step 2: 写一个小改动** + +将 `selectByProjectId` 的排序改为稳定排序: + +```xml +ORDER BY model_code, sort_order, id +``` + +如有必要,也检查 `selectByProjectAndModel` 是否需要补 `id` 兜底排序。 + +**Step 3: 静态验证** + +运行: + +```bash +Get-Content -Raw 'ccdi-project/src/main/resources/mapper/ccdi/project/CcdiModelParamMapper.xml' +``` + +预期:查询排序稳定,不依赖数据库默认返回顺序。 + +**Step 4: 提交** + +```bash +git add ccdi-project/src/main/resources/mapper/ccdi/project/CcdiModelParamMapper.xml +git commit -m "fix: 稳定模型参数查询顺序" +``` + +### Task 4: 清理服务层的 CSV 对齐边界 + +**Files:** +- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiModelParamServiceImpl.java` + +**Step 1: 查看当前实现** + +运行: + +```bash +Get-Content -Raw 'ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiModelParamServiceImpl.java' +``` + +预期:当前已经支持 `listAll/saveAll`,但需要确认注释、排序依赖和默认项目复制逻辑是否与本次设计一致。 + +**Step 2: 写最小修正** + +仅做与本次设计直接相关的修正: + +- 保持 `projectId=0/default/custom` 的现有读取规则 +- 保持默认项目首次保存时复制系统默认参数全集 +- 不增加任何历史 `custom` 项目补齐逻辑 +- 不引入任何千分位处理逻辑 +- 如有重复或无效的局部变量,顺手清理为更直接的实现 + +**Step 3: 写失败前验证** + +运行: + +```bash +mvn -pl ccdi-project -am -DskipTests compile +``` + +预期:若存在语法或导入问题,本步先暴露出来。 + +**Step 4: 调整到编译通过** + +修正编译问题后再次运行: + +```bash +mvn -pl ccdi-project -am -DskipTests compile +``` + +预期:BUILD SUCCESS。 + +**Step 5: 提交** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiModelParamServiceImpl.java +git commit -m "refactor: 收敛模型参数服务对齐逻辑" +``` + +### Task 5: 验证新旧环境脚本产物一致 + +**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` + +**Step 1: 准备校验项** + +至少检查: + +- 模型总数是否为 5 +- 参数总数是否为 16 +- 每个 `model_code + param_code` 唯一 +- 所有 `param_value` 为原始字符串,不含千分位逗号 + +**Step 2: 执行静态比对** + +运行: + +```bash +Get-Content -Raw 'sql/ccdi_model_param.sql' +Get-Content -Raw 'sql/2026-03-16-update-ccdi-model-param-defaults.sql' +``` + +预期:两个脚本中的系统默认参数集合一致。 + +**Step 3: 如本地有数据库,执行 SQL 验证** + +示例: + +```sql +SELECT model_code, COUNT(*) AS cnt +FROM ccdi_model_param +WHERE project_id = 0 +GROUP BY model_code +ORDER BY model_code; +``` + +```sql +SELECT model_code, param_code, param_value +FROM ccdi_model_param +WHERE project_id = 0 +ORDER BY model_code, sort_order, id; +``` + +预期:返回结果与 CSV 一致。 + +**Step 4: 记录结果** + +将验证过程写入: + +```text +docs/test-records/model-param-backend-alignment-test.md +``` + +**Step 5: 提交** + +```bash +git add docs/test-records/model-param-backend-alignment-test.md +git commit -m "test: 记录模型默认参数后端对齐验证" +``` + +### Task 6: 验证接口行为不变 + +**Files:** +- Reference: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiModelParamController.java` +- Reference: `ruoyi-ui/src/api/ccdi/modelParam.js` + +**Step 1: 启动后端** + +运行: + +```bash +mvn -pl ruoyi-admin -am spring-boot:run +``` + +**Step 2: 验证查询接口** + +使用 Swagger 或 HTTP 工具请求: + +```http +GET /ccdi/modelParam/listAll?projectId=0 +``` + +预期: + +- 返回 `models` 数组 +- 包含 5 个模型 +- 各模型参数与 CSV 一致 + +**Step 3: 验证默认项目查询** + +对一个 `configType=default` 项目请求: + +```http +GET /ccdi/modelParam/listAll?projectId= +``` + +预期:返回系统默认参数全集。 + +**Step 4: 验证默认项目首次保存** + +调用: + +```http +POST /ccdi/modelParam/saveAll +``` + +请求体示例: + +```json +{ + "projectId": 123, + "models": [ + { + "modelCode": "LARGE_TRANSACTION", + "params": [ + { + "paramCode": "SINGLE_TRANSACTION_AMOUNT", + "paramValue": "2222" + } + ] + } + ] +} +``` + +预期: + +- 保存成功 +- 该项目 `config_type` 变为 `custom` +- 项目参数表中只复制当前系统默认参数全集,不补历史 `custom` 项目 + +**Step 5: 停止后端进程并提交** + +测试结束后关闭 `mvn spring-boot:run` 启动的进程,再提交测试记录: + +```bash +git add docs/test-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`. diff --git a/docs/plans/2026-03-16-model-param-csv-alignment-frontend-implementation.md b/docs/plans/2026-03-16-model-param-csv-alignment-frontend-implementation.md new file mode 100644 index 00000000..ffeed621 --- /dev/null +++ b/docs/plans/2026-03-16-model-param-csv-alignment-frontend-implementation.md @@ -0,0 +1,335 @@ +# Model Param CSV Alignment Frontend Implementation Plan + +> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. + +**Goal:** Make the global and project model-parameter pages render all model information dynamically from the query API, remove any thousand-separator related design, and keep unified save behavior stable. + +**Architecture:** Reuse the existing `listAll/saveAll` front-end flow and current card-based layout. Only adjust the page internals so rendering depends entirely on API payloads and modified-state tracking becomes reliably reactive in Vue 2. + +**Tech Stack:** Vue 2, Element UI, Axios, npm + +--- + +### Task 1: 盘点当前页面与 API 的真实状态 + +**Files:** +- Reference: `ruoyi-ui/src/api/ccdi/modelParam.js` +- Reference: `ruoyi-ui/src/views/ccdi/modelParam/index.vue` +- Reference: `ruoyi-ui/src/views/ccdiProject/components/detail/ParamConfig.vue` + +**Step 1: 查看 API 层** + +运行: + +```bash +Get-Content -Raw 'ruoyi-ui/src/api/ccdi/modelParam.js' +``` + +预期:`listAllParams`、`saveAllParams` 已存在,无需重复新增接口方法。 + +**Step 2: 查看全局配置页** + +运行: + +```bash +Get-Content -Raw 'ruoyi-ui/src/views/ccdi/modelParam/index.vue' +``` + +预期:页面已按模型卡片展示,但要确认修改记录实现、动态渲染边界和空状态处理。 + +**Step 3: 查看项目配置页** + +运行: + +```bash +Get-Content -Raw 'ruoyi-ui/src/views/ccdiProject/components/detail/ParamConfig.vue' +``` + +预期:页面已按模型卡片展示,但与全局页一样需要做实现收敛。 + +**Step 4: 记录结论** + +确认本次前端重点不是“重做布局”,而是: + +- 完全依赖接口动态展示 +- 去掉千分位相关设计 +- 优化修改记录实现 + +### Task 2: 重构全局参数页的动态展示实现 + +**Files:** +- Modify: `ruoyi-ui/src/views/ccdi/modelParam/index.vue` + +**Step 1: 先写一个失败前检查** + +启动前端前先做静态检查: + +```bash +Get-Content -Raw 'ruoyi-ui/src/views/ccdi/modelParam/index.vue' +``` + +重点确认是否存在以下问题: + +- 使用 `Set + $forceUpdate` +- 对模型或参数数量有隐含假设 +- 对格式化值有额外处理 + +**Step 2: 写最小实现改动** + +将页面调整为: + +- 直接渲染 `res.data.models || []` +- 通过 `model.modelCode`、`model.modelName`、`row.paramName`、`row.paramDesc`、`row.paramValue`、`row.paramUnit` 动态展示 +- 不做任何千分位格式化或清洗 +- 将修改记录改为响应式对象,例如: + +```javascript +modifiedParams: {} +``` + +并使用类似下面的键: + +```javascript +const modifiedKey = `${modelCode}:${row.paramCode}` +``` + +**Step 3: 写保存组装逻辑** + +保证 `handleSaveAll` 只提交已修改项,且请求体继续符合现有接口: + +```json +{ + "projectId": 0, + "models": [ + { + "modelCode": "LARGE_TRANSACTION", + "params": [ + { + "paramCode": "SINGLE_TRANSACTION_AMOUNT", + "paramValue": "1111" + } + ] + } + ] +} +``` + +**Step 4: 本地编译验证** + +运行: + +```bash +cd ruoyi-ui +npm run build:prod +``` + +预期:构建成功,无语法错误。 + +**Step 5: 提交** + +```bash +git add ruoyi-ui/src/views/ccdi/modelParam/index.vue +git commit -m "feat: 优化全局模型参数页动态展示" +``` + +### Task 3: 重构项目参数页的动态展示实现 + +**Files:** +- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/ParamConfig.vue` + +**Step 1: 查看当前实现** + +运行: + +```bash +Get-Content -Raw 'ruoyi-ui/src/views/ccdiProject/components/detail/ParamConfig.vue' +``` + +预期:与全局页类似,也在使用 `Set + $forceUpdate` 或同类逻辑。 + +**Step 2: 写最小实现改动** + +将页面调整为: + +- 完全根据 `listAllParams({ projectId: this.projectId })` 返回结果动态渲染 +- 不写死模型名称、数量、顺序和参数结构 +- 复用与全局页一致的响应式修改记录方案 +- 保存成功后重新加载接口数据 + +**Step 3: 校验默认项目和自定义项目行为** + +确保页面本身不做 `default/custom` 分支拼装,只消费接口返回结果。 + +**Step 4: 本地编译验证** + +运行: + +```bash +cd ruoyi-ui +npm run build:prod +``` + +预期:构建成功。 + +**Step 5: 提交** + +```bash +git add ruoyi-ui/src/views/ccdiProject/components/detail/ParamConfig.vue +git commit -m "feat: 优化项目模型参数页动态展示" +``` + +### Task 4: 统一前端修改记录与保存逻辑 + +**Files:** +- Modify: `ruoyi-ui/src/views/ccdi/modelParam/index.vue` +- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/ParamConfig.vue` + +**Step 1: 抽出共同规则** + +两个页面都应满足: + +- 修改后才计入 `modifiedCount` +- 未修改时点击保存提示“没有需要保存的修改” +- 保存成功后清空修改记录并重新拉取数据 + +**Step 2: 移除不稳定实现** + +删除或替换: + +- `new Set()` +- `$forceUpdate()` + +改为 Vue 2 可稳定追踪的普通对象结构。 + +**Step 3: 静态验证** + +运行: + +```bash +Get-Content -Raw 'ruoyi-ui/src/views/ccdi/modelParam/index.vue' +Get-Content -Raw 'ruoyi-ui/src/views/ccdiProject/components/detail/ParamConfig.vue' +``` + +预期:页面内部不再依赖 `Set` 的响应式边界。 + +**Step 4: 构建验证** + +运行: + +```bash +cd ruoyi-ui +npm run build:prod +``` + +预期:构建成功。 + +**Step 5: 提交** + +```bash +git add ruoyi-ui/src/views/ccdi/modelParam/index.vue ruoyi-ui/src/views/ccdiProject/components/detail/ParamConfig.vue +git commit -m "refactor: 收敛模型参数页修改状态管理" +``` + +### Task 5: 验证“无千分位设计”和“接口驱动展示” + +**Files:** +- Optional Record: `docs/test-records/model-param-frontend-alignment-test.md` + +**Step 1: 启动前端开发服务** + +运行: + +```bash +cd ruoyi-ui +npm run dev +``` + +**Step 2: 验证全局参数页** + +检查: + +- 页面根据接口返回显示全部模型 +- 模型标题、参数名称、描述、单位均来自接口 +- 输入框不自动插入千分位逗号 + +**Step 3: 验证项目参数页** + +检查: + +- 默认配置项目展示系统默认参数全集 +- 历史 `custom` 项目只展示自身已有参数 +- 页面不写死模型数量和参数数量 + +**Step 4: 验证统一保存** + +检查: + +- 修改一个参数后 `modifiedCount` 正确增加 +- 保存后成功提示正常 +- 重新加载后值与接口一致 + +**Step 5: 停止前端进程并记录结果** + +测试结束后关闭 `npm run dev` 启动的进程,并把结果写入: + +```text +docs/test-records/model-param-frontend-alignment-test.md +``` + +然后提交: + +```bash +git add docs/test-records/model-param-frontend-alignment-test.md +git commit -m "test: 记录模型参数前端动态展示验证" +``` + +### Task 6: 做一次前后端联调验收 + +**Files:** +- Reference: `ruoyi-ui/src/views/ccdi/modelParam/index.vue` +- Reference: `ruoyi-ui/src/views/ccdiProject/components/detail/ParamConfig.vue` +- Reference: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiModelParamServiceImpl.java` + +**Step 1: 同时启动前后端** + +运行: + +```bash +mvn -pl ruoyi-admin -am spring-boot:run +``` + +```bash +cd ruoyi-ui +npm run dev +``` + +**Step 2: 联调全局参数页** + +验证: + +- 接口返回的 5 个模型全部显示 +- 参数值与系统默认参数一致 +- 修改并保存后,刷新仍保持最新值 + +**Step 3: 联调项目参数页** + +验证: + +- `default` 项目读取系统默认参数 +- 首次保存后项目切为 `custom` +- 历史 `custom` 项目不补新增模型或参数 + +**Step 4: 结束测试进程** + +按仓库约定,测试结束后关闭前后端进程。 + +**Step 5: 提交联调记录** + +```bash +git add docs/test-records/model-param-frontend-alignment-test.md docs/test-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`.