From e553cd8dbcc8529d591e084aba0a74b45988ea1f Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Fri, 6 Mar 2026 16:13:24 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E9=85=8D=E7=BD=AE=E9=A1=B5=E9=9D=A2=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=AE=9E=E6=96=BD=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6-03-06-model-param-config-optimization.md | 821 ++++++++++++++++++ 1 file changed, 821 insertions(+) create mode 100644 docs/plans/2026-03-06-model-param-config-optimization.md diff --git a/docs/plans/2026-03-06-model-param-config-optimization.md b/docs/plans/2026-03-06-model-param-config-optimization.md new file mode 100644 index 0000000..d577167 --- /dev/null +++ b/docs/plans/2026-03-06-model-param-config-optimization.md @@ -0,0 +1,821 @@ +# 模型参数配置页面优化实施计划 + +> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. + +**目标:** 优化模型参数配置页面,取消模型下拉切换,改为垂直堆叠展示所有模型参数,并实现统一保存 + +**架构:** 采用前后端分离架构,后端新增批量查询和批量保存接口,前端重构两个配置页面使用统一布局 + +**技术栈:** 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` + +--- + +## 后端开发任务 + +### Task 1: 创建批量查询请求DTO + +**文件:** +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/ModelParamAllQueryDTO.java` + +**步骤 1: 创建 ModelParamAllQueryDTO 类** + +```java +package com.ruoyi.ccdi.project.domain.dto; + +import lombok.Data; + +/** + * 批量查询所有模型参数DTO + */ +@Data +public class ModelParamAllQueryDTO { + + /** 项目ID(0表示全局配置,>0表示项目配置) */ + private Long projectId; +} +``` + +**步骤 2: 提交代码** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/ModelParamAllQueryDTO.java +git commit -m "feat: 添加批量查询所有模型参数DTO" +``` + +--- + +### Task 2: 创建模型分组VO + +**文件:** +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/ModelGroupVO.java` + +**步骤 1: 创建 ModelGroupVO 类** + +```java +package com.ruoyi.ccdi.project.domain.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 模型分组VO(用于按模型分组展示参数) + */ +@Data +public class ModelGroupVO { + + /** 模型编码 */ + private String modelCode; + + /** 模型名称 */ + private String modelName; + + /** 参数列表 */ + private List params; +} +``` + +**步骤 2: 提交代码** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/ModelGroupVO.java +git commit -m "feat: 添加模型分组VO" +``` + +--- + +### Task 3: 创建批量查询响应VO + +**文件:** +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/ModelParamAllVO.java` + +**步骤 1: 创建 ModelParamAllVO 类** + +```java +package com.ruoyi.ccdi.project.domain.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 批量查询所有模型参数响应VO + */ +@Data +public class ModelParamAllVO { + + /** 模型列表(包含每个模型及其参数) */ + private List models; +} +``` + +**步骤 2: 提交代码** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/ModelParamAllVO.java +git commit -m "feat: 添加批量查询所有模型参数响应VO" +``` + +--- + +### Task 4: 创建批量保存参数项DTO + +**文件:** +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/ParamValueItem.java` + +**步骤 1: 创建 ParamValueItem 类** + +```java +package com.ruoyi.ccdi.project.domain.dto; + +import lombok.Data; + +/** + * 参数值项DTO + */ +@Data +public class ParamValueItem { + + /** 参数编码 */ + private String paramCode; + + /** 参数值 */ + private String paramValue; +} +``` + +**步骤 2: 提交代码** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/ParamValueItem.java +git commit -m "feat: 添加参数值项DTO" +``` + +--- + +### Task 5: 创建批量保存模型参数组DTO + +**文件:** +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/ModelParamGroupDTO.java` + +**步骤 1: 创建 ModelParamGroupDTO 类** + +```java +package com.ruoyi.ccdi.project.domain.dto; + +import lombok.Data; + +import java.util.List; + +/** + * 模型参数分组DTO(用于批量保存) + */ +@Data +public class ModelParamGroupDTO { + + /** 模型编码 */ + private String modelCode; + + /** 该模型下修改过的参数 */ + private List params; +} +``` + +**步骤 2: 提交代码** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/ModelParamGroupDTO.java +git commit -m "feat: 添加模型参数分组DTO" +``` + +--- + +### Task 6: 创建批量保存请求DTO + +**文件:** +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/ModelParamSaveAllDTO.java` + +**步骤 1: 创建 ModelParamSaveAllDTO 类** + +```java +package com.ruoyi.ccdi.project.domain.dto; + +import lombok.Data; + +import java.util.List; + +/** + * 批量保存所有模型参数DTO + */ +@Data +public class ModelParamSaveAllDTO { + + /** 项目ID */ + private Long projectId; + + /** 所有模型的参数修改(只包含修改过的参数) */ + private List models; +} +``` + +**步骤 2: 提交代码** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/ModelParamSaveAllDTO.java +git commit -m "feat: 添加批量保存所有模型参数DTO" +``` + +--- + +### Task 7: 在Mapper接口中添加批量查询方法 + +**文件:** +- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiModelParamMapper.java` + +**步骤 1: 添加 selectByProjectId 方法** + +打开 `CcdiModelParamMapper.java` 文件,在接口中添加新方法: + +```java +/** + * 根据项目ID查询所有模型参数 + * + * @param projectId 项目ID + * @return 参数列表 + */ +List selectByProjectId(@Param("projectId") Long projectId); +``` + +**步骤 2: 检查导入语句** + +确保文件顶部包含必要的导入: +```java +import org.apache.ibatis.annotations.Param; +import java.util.List; +``` + +**步骤 3: 提交代码** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiModelParamMapper.java +git commit -m "feat: 在Mapper接口中添加批量查询方法" +``` + +--- + +### Task 8: 在Mapper XML中添加SQL查询 + +**文件:** +- Modify: `ccdi-project/src/main/resources/mapper/ccdi/project/CcdiModelParamMapper.xml` + +**步骤 1: 添加 selectByProjectId SQL** + +打开 `CcdiModelParamMapper.xml` 文件,在 `` 标签内添加: + +```xml + + +``` + +**步骤 2: 提交代码** + +```bash +git add ccdi-project/src/main/resources/mapper/ccdi/project/CcdiModelParamMapper.xml +git commit -m "feat: 在Mapper XML中添加批量查询SQL" +``` + +--- + +### Task 9: 在Service接口中添加批量查询方法 + +**文件:** +- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiModelParamService.java` + +**步骤 1: 添加 selectAllParams 方法签名** + +打开 `ICcdiModelParamService.java` 文件,在接口中添加: + +```java +/** + * 查询所有模型及其参数(按模型分组) + * + * @param projectId 项目ID(0表示全局配置) + * @return 所有模型的参数配置 + */ +ModelParamAllVO selectAllParams(Long projectId); +``` + +**步骤 2: 添加导入语句** + +在文件顶部添加: +```java +import com.ruoyi.ccdi.project.domain.vo.ModelParamAllVO; +``` + +**步骤 3: 提交代码** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiModelParamService.java +git commit -m "feat: 在Service接口中添加批量查询方法" +``` + +--- + +### Task 10: 在Service接口中添加批量保存方法 + +**文件:** +- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiModelParamService.java` + +**步骤 1: 添加 saveAllParams 方法签名** + +打开 `ICcdiModelParamService.java` 文件,在接口中添加: + +```java +/** + * 批量保存所有模型的参数修改 + * + * @param saveAllDTO 所有模型的参数修改数据 + */ +void saveAllParams(ModelParamSaveAllDTO saveAllDTO); +``` + +**步骤 2: 添加导入语句** + +在文件顶部添加: +```java +import com.ruoyi.ccdi.project.domain.dto.ModelParamSaveAllDTO; +``` + +**步骤 3: 提交代码** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiModelParamService.java +git commit -m "feat: 在Service接口中添加批量保存方法" +``` + +--- + +### Task 11: 实现批量查询方法(第一部分) + +**文件:** +- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiModelParamServiceImpl.java` + +**步骤 1: 添加必要的导入语句** + +在文件顶部的导入区域添加: + +```java +import com.ruoyi.ccdi.project.domain.dto.ModelParamSaveAllDTO; +import com.ruoyi.ccdi.project.domain.dto.ModelParamGroupDTO; +import com.ruoyi.ccdi.project.domain.dto.ParamValueItem; +import com.ruoyi.ccdi.project.domain.vo.ModelParamAllVO; +import com.ruoyi.ccdi.project.domain.vo.ModelGroupVO; +import java.util.Comparator; +``` + +**步骤 2: 提交代码** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiModelParamServiceImpl.java +git commit -m "feat: 添加批量操作所需的导入语句" +``` + +--- + +### Task 12: 实现批量查询方法(第二部分) + +**文件:** +- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiModelParamServiceImpl.java` + +**步骤 1: 实现 selectAllParams 方法** + +在 `CcdiModelParamServiceImpl` 类中添加方法实现: + +```java +@Override +public ModelParamAllVO selectAllParams(Long projectId) { + // 1. 参数验证 + if (projectId == null) { + projectId = 0L; + } + + // 2. 如果是项目查询,根据 configType 决定查询哪组参数 + Long effectiveProjectId = projectId; + if (projectId > 0) { + CcdiProject project = projectMapper.selectById(projectId); + if (project == null) { + throw new ServiceException("项目不存在"); + } + if ("default".equals(project.getConfigType())) { + effectiveProjectId = 0L; + } + } + + // 3. 查询所有模型的参数 + List allParams = modelParamMapper.selectByProjectId(effectiveProjectId); + + // 4. 按模型分组 + Map> groupedParams = allParams.stream() + .collect(Collectors.groupingBy(CcdiModelParam::getModelCode)); + + // 5. 转换为VO + ModelParamAllVO result = new ModelParamAllVO(); + List models = new ArrayList<>(); + + groupedParams.forEach((modelCode, params) -> { + ModelGroupVO groupVO = new ModelGroupVO(); + groupVO.setModelCode(modelCode); + groupVO.setModelName(params.get(0).getModelName()); + + List paramVOs = params.stream() + .map(param -> { + ModelParamVO vo = new ModelParamVO(); + BeanUtils.copyProperties(param, vo); + return vo; + }) + .collect(Collectors.toList()); + + groupVO.setParams(paramVOs); + models.add(groupVO); + }); + + // 6. 按模型编码排序(保证固定顺序) + models.sort(Comparator.comparing(ModelGroupVO::getModelCode)); + + result.setModels(models); + return result; +} +``` + +**步骤 2: 提交代码** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiModelParamServiceImpl.java +git commit -m "feat: 实现批量查询所有模型参数方法" +``` + +--- + +### Task 13: 实现批量保存方法 + +**文件:** +- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiModelParamServiceImpl.java` + +**步骤 1: 实现 saveAllParams 方法** + +在 `CcdiModelParamServiceImpl` 类中添加方法实现: + +```java +@Override +@Transactional(rollbackFor = Exception.class) +public void saveAllParams(ModelParamSaveAllDTO saveAllDTO) { + try { + // 1. 参数验证 + if (saveAllDTO.getProjectId() == null) { + throw new ServiceException("项目ID不能为空"); + } + if (saveAllDTO.getModels() == null || saveAllDTO.getModels().isEmpty()) { + throw new ServiceException("参数列表不能为空"); + } + + Long projectId = saveAllDTO.getProjectId(); + + // 2. 如果是项目保存,检查是否需要复制默认参数 + if (projectId > 0) { + CcdiProject project = projectMapper.selectById(projectId); + if (project == null) { + throw new ServiceException("项目不存在"); + } + + // 如果是首次保存(configType=default),需要复制所有模型的系统默认参数 + if ("default".equals(project.getConfigType())) { + for (ModelParamGroupDTO modelGroup : saveAllDTO.getModels()) { + copyDefaultParamsToProject(projectId, modelGroup.getModelCode()); + } + + // 更新项目配置类型为 custom + project.setConfigType("custom"); + projectMapper.updateById(project); + } + } + + // 3. 批量更新所有模型的参数值 + for (ModelParamGroupDTO modelGroup : saveAllDTO.getModels()) { + for (ParamValueItem item : modelGroup.getParams()) { + int updated = modelParamMapper.updateParamValue( + projectId, + modelGroup.getModelCode(), + item.getParamCode(), + item.getParamValue() + ); + if (updated == 0) { + log.warn("参数不存在或未更新,modelCode={}, paramCode={}", + modelGroup.getModelCode(), item.getParamCode()); + } + } + } + + } catch (ServiceException e) { + throw e; + } catch (Exception e) { + log.error("批量保存模型参数失败", e); + throw new ServiceException("批量保存模型参数失败:" + e.getMessage()); + } +} +``` + +**步骤 2: 提交代码** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiModelParamServiceImpl.java +git commit -m "feat: 实现批量保存所有模型参数方法" +``` + +--- + +### Task 14: 在Controller中添加批量查询接口 + +**文件:** +- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiModelParamController.java` + +**步骤 1: 添加必要的导入语句** + +在文件顶部添加: + +```java +import com.ruoyi.ccdi.project.domain.dto.ModelParamAllQueryDTO; +import com.ruoyi.ccdi.project.domain.dto.ModelParamSaveAllDTO; +import com.ruoyi.ccdi.project.domain.vo.ModelParamAllVO; +``` + +**步骤 2: 添加 listAll 接口方法** + +在 `CcdiModelParamController` 类中添加: + +```java +/** + * 查询所有模型及其参数(按模型分组) + */ +@Operation(summary = "查询所有模型及其参数") +@GetMapping("/listAll") +public AjaxResult listAll(@Validated ModelParamAllQueryDTO queryDTO) { + ModelParamAllVO result = modelParamService.selectAllParams(queryDTO.getProjectId()); + return success(result); +} +``` + +**步骤 3: 提交代码** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiModelParamController.java +git commit -m "feat: 在Controller中添加批量查询接口" +``` + +--- + +### Task 15: 在Controller中添加批量保存接口 + +**文件:** +- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiModelParamController.java` + +**步骤 1: 添加 saveAll 接口方法** + +在 `CcdiModelParamController` 类中添加: + +```java +/** + * 批量保存所有模型的参数修改 + */ +@Operation(summary = "批量保存所有模型参数") +@Log(title = "模型参数配置", businessType = BusinessType.UPDATE) +@PostMapping("/saveAll") +public AjaxResult saveAll(@Validated @RequestBody ModelParamSaveAllDTO saveAllDTO) { + modelParamService.saveAllParams(saveAllDTO); + return success("保存成功"); +} +``` + +**步骤 2: 提交代码** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiModelParamController.java +git commit -m "feat: 在Controller中添加批量保存接口" +``` + +--- + +### Task 16: 使用Swagger测试后端接口 + +**步骤 1: 启动后端应用** + +提示用户手动启动后端应用: +```bash +# 在项目根目录执行 +mvn spring-boot:run +``` + +**步骤 2: 访问Swagger UI** + +打开浏览器访问:`http://localhost:8080/swagger-ui/index.html` + +**步骤 3: 测试批量查询接口** + +1. 找到"模型参数配置"分组 +2. 找到 `GET /ccdi/modelParam/listAll` 接口 +3. 点击 "Try it out" +4. 输入参数: + - `projectId`: 0 (测试全局配置) +5. 点击 "Execute" +6. 验证响应: + - 状态码:200 + - 返回数据包含 `models` 数组 + - 每个模型包含 `modelCode`, `modelName`, `params` + +**预期结果:** +```json +{ + "code": 200, + "msg": "操作成功", + "data": { + "models": [ + { + "modelCode": "LARGE_TRANSACTION", + "modelName": "大额交易模型", + "params": [...] + }, + ... + ] + } +} +``` + +**步骤 4: 测试批量保存接口** + +1. 找到 `POST /ccdi/modelParam/saveAll` 接口 +2. 点击 "Try it out" +3. 输入请求体: +```json +{ + "projectId": 0, + "models": [ + { + "modelCode": "LARGE_TRANSACTION", + "params": [ + { + "paramCode": "THRESHOLD_AMOUNT", + "paramValue": "60000" + } + ] + } + ] +} +``` +4. 点击 "Execute" +5. 验证响应:状态码 200,msg 为 "保存成功" + +**步骤 5: 提交测试记录** + +记录测试结果并提交(如果需要): +```bash +git add docs/test-records/ +git commit -m "test: 记录后端接口测试结果" +``` + +--- + +## 前端开发任务 + +### Task 17: 在API层添加批量查询方法 + +**文件:** +- Modify: `ruoyi-ui/src/api/ccdi/modelParam.js` + +**步骤 1: 添加 listAllParams 方法** + +打开 `modelParam.js` 文件,添加: + +```javascript +/** + * 查询所有模型及其参数(按模型分组) + * @param {Object} query - 查询参数 + * @param {Number} query.projectId - 项目ID(0表示全局配置) + */ +export function listAllParams(query) { + return request({ + url: '/ccdi/modelParam/listAll', + method: 'get', + params: query + }) +} +``` + +**步骤 2: 提交代码** + +```bash +git add ruoyi-ui/src/api/ccdi/modelParam.js +git commit -m "feat: 在API层添加批量查询方法" +``` + +--- + +### Task 18: 在API层添加批量保存方法 + +**文件:** +- Modify: `ruoyi-ui/src/api/ccdi/modelParam.js` + +**步骤 1: 添加 saveAllParams 方法** + +打开 `modelParam.js` 文件,添加: + +```javascript +/** + * 批量保存所有模型的参数修改 + * @param {Object} data - 保存数据 + * @param {Number} data.projectId - 项目ID + * @param {Array} data.models - 模型参数列表 + */ +export function saveAllParams(data) { + return request({ + url: '/ccdi/modelParam/saveAll', + method: 'post', + data: data + }) +} +``` + +**步骤 2: 提交代码** + +```bash +git add ruoyi-ui/src/api/ccdi/modelParam.js +git commit -m "feat: 在API层添加批量保存方法" +``` + +--- + +### Task 19: 重构全局配置页面(第一部分 - 模板) + +**文件:** +- Modify: `ruoyi-ui/src/views/ccdi/modelParam/index.vue` + +**步骤 1: 替换整个 template 部分** + +删除原有的 `