# 模型参数配置功能 - 后端业务逻辑开发 ## 任务概述 **任务编号:** 02 **任务名称:** 后端业务逻辑开发 **前置任务:** 01-后端实体类创建 **预计工时:** 2小时 ## 任务目标 开发模型参数配置功能的 Mapper 层、Service 层和 Controller 层,实现查询模型列表、查询参数列表、保存参数配置三个核心接口。 --- ## 开发步骤 ### 1. 创建 Mapper 接口 #### 1.1 创建 Mapper 接口 **文件路径:** `ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiModelParamMapper.java` ```java package com.ruoyi.ccdi.project.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.ccdi.project.domain.CcdiModelParam; import org.apache.ibatis.annotations.Param; import java.util.List; /** * 模型参数Mapper */ public interface CcdiModelParamMapper extends BaseMapper { /** * 查询指定项目和模型的参数列表 * * @param projectId 项目ID * @param modelCode 模型编码 * @return 参数列表 */ List selectByProjectAndModel( @Param("projectId") Long projectId, @Param("modelCode") String modelCode ); /** * 查询所有模型列表(去重) * * @param projectId 项目ID * @return 模型列表 */ List selectDistinctModels(@Param("projectId") Long projectId); /** * 批量更新参数值(只更新param_value字段) * * @param list 参数列表 * @return 更新数量 */ int batchUpdateParamValues(@Param("list") List list); } ``` --- ### 2. 创建 Mapper XML #### 2.1 创建资源目录 ``` ccdi-project/src/main/resources/ └── mapper/ └── ccdi/ └── project/ ``` #### 2.2 编写 Mapper XML **文件路径:** `ccdi-project/src/main/resources/mapper/ccdi/project/CcdiModelParamMapper.xml` ```xml select id, project_id, model_code, model_name, param_code, param_name, param_desc, param_value, param_unit, sort_order, create_by, create_time, update_by, update_time, remark from ccdi_model_param update ccdi_model_param set param_value = #{item.paramValue}, update_by = #{item.updateBy}, update_time = sysdate() where id = #{item.id} ``` --- ### 3. 创建 Service 接口 **文件路径:** `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiModelParamService.java` ```java package com.ruoyi.ccdi.project.service; import com.ruoyi.ccdi.project.domain.dto.ModelParamQueryDTO; import com.ruoyi.ccdi.project.domain.dto.ModelParamSaveDTO; import com.ruoyi.ccdi.project.domain.vo.ModelListVO; import com.ruoyi.ccdi.project.domain.vo.ModelParamVO; import java.util.List; /** * 模型参数Service */ public interface ICcdiModelParamService { /** * 查询模型列表 * * @param projectId 项目ID * @return 模型列表 */ List selectModelList(Long projectId); /** * 查询模型参数列表 * * @param queryDTO 查询条件 * @return 参数列表 */ List selectParamList(ModelParamQueryDTO queryDTO); /** * 保存模型参数(只更新阈值) * * @param saveDTO 保存参数 */ void saveParams(ModelParamSaveDTO saveDTO); } ``` --- ### 4. 创建 Service 实现 #### 4.1 创建实现类目录 ``` ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ └── impl/ ``` #### 4.2 编写 Service 实现 **文件路径:** `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiModelParamServiceImpl.java` ```java package com.ruoyi.ccdi.project.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.ccdi.project.domain.CcdiModelParam; import com.ruoyi.ccdi.project.domain.dto.ModelParamQueryDTO; import com.ruoyi.ccdi.project.domain.dto.ModelParamSaveDTO; import com.ruoyi.ccdi.project.domain.vo.ModelListVO; import com.ruoyi.ccdi.project.domain.vo.ModelParamVO; import com.ruoyi.ccdi.project.mapper.CcdiModelParamMapper; import com.ruoyi.ccdi.project.service.ICcdiModelParamService; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import jakarta.annotation.Resource; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 模型参数Service实现 */ @Service public class CcdiModelParamServiceImpl implements ICcdiModelParamService { @Resource private CcdiModelParamMapper modelParamMapper; @Override public List selectModelList(Long projectId) { if (projectId == null) { projectId = 0L; // 默认查询系统级参数 } List result = new ArrayList<>(); List params = modelParamMapper.selectDistinctModels(projectId); params.forEach(param -> { ModelListVO vo = new ModelListVO(); vo.setModelCode(param.getModelCode()); vo.setModelName(param.getModelName()); result.add(vo); }); return result; } @Override public List selectParamList(ModelParamQueryDTO queryDTO) { Long projectId = queryDTO.getProjectId(); if (projectId == null) { projectId = 0L; } List params = modelParamMapper.selectByProjectAndModel( projectId, queryDTO.getModelCode() ); List result = new ArrayList<>(); params.forEach(param -> { ModelParamVO vo = new ModelParamVO(); BeanUtils.copyProperties(param, vo); result.add(vo); }); return result; } @Override @Transactional(rollbackFor = Exception.class) public void saveParams(ModelParamSaveDTO saveDTO) { Long projectId = saveDTO.getProjectId(); if (projectId == null) { projectId = 0L; } String username = SecurityUtils.getUsername(); Date now = new Date(); // 查询现有参数 List existingParams = modelParamMapper.selectByProjectAndModel( projectId, saveDTO.getModelCode() ); if (existingParams.isEmpty()) { throw new ServiceException("未找到模型参数配置"); } // 准备更新列表 - 只更新 param_value 字段 List updateList = new ArrayList<>(); for (ModelParamSaveDTO.ParamItem item : saveDTO.getParams()) { CcdiModelParam existing = existingParams.stream() .filter(p -> p.getParamCode().equals(item.getParamCode())) .findFirst() .orElse(null); if (existing != null) { // ⚠️ 关键:只修改 param_value 字段 CcdiModelParam updateParam = new CcdiModelParam(); updateParam.setId(existing.getId()); updateParam.setParamValue(item.getParamValue()); // 只更新阈值 updateParam.setUpdateBy(username); updateParam.setUpdateTime(now); updateList.add(updateParam); } } if (!updateList.isEmpty()) { modelParamMapper.batchUpdateParamValues(updateList); } } } ``` --- ### 5. 创建 Controller **文件路径:** `ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiModelParamController.java` ```java package com.ruoyi.ccdi.project.controller; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.ccdi.project.domain.dto.ModelParamQueryDTO; import com.ruoyi.ccdi.project.domain.dto.ModelParamSaveDTO; import com.ruoyi.ccdi.project.domain.vo.ModelListVO; import com.ruoyi.ccdi.project.domain.vo.ModelParamVO; import com.ruoyi.ccdi.project.service.ICcdiModelParamService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; import java.util.List; /** * 模型参数配置Controller */ @Tag(name = "模型参数配置") @RestController @RequestMapping("/ccdi/modelParam") public class CcdiModelParamController extends BaseController { @Resource private ICcdiModelParamService modelParamService; /** * 查询模型列表 */ @Operation(summary = "查询模型列表") @GetMapping("/modelList") public AjaxResult listModels(@RequestParam(required = false) Long projectId) { List list = modelParamService.selectModelList(projectId); return success(list); } /** * 查询模型参数列表 */ @Operation(summary = "查询模型参数列表") @GetMapping("/list") public AjaxResult list(@Validated ModelParamQueryDTO queryDTO) { List list = modelParamService.selectParamList(queryDTO); return success(list); } /** * 保存模型参数(只更新阈值) */ @Operation(summary = "保存模型参数") @Log(title = "模型参数配置", businessType = BusinessType.UPDATE) @PostMapping("/save") public AjaxResult save(@Validated @RequestBody ModelParamSaveDTO saveDTO) { modelParamService.saveParams(saveDTO); return success("保存成功"); } } ``` --- ## 验证清单 完成以下验证后,本任务才算完成: - [ ] CcdiModelParamMapper 接口创建完成 - [ ] CcdiModelParamMapper.xml 创建完成 - [ ] ICcdiModelParamService 接口创建完成 - [ ] CcdiModelParamServiceImpl 实现类创建完成 - [ ] CcdiModelParamController 创建完成 - [ ] 所有类使用 import 导入,无全限定类名 - [ ] Service 使用 @Resource 注入 - [ ] Controller 添加了 Swagger 注解 - [ ] 项目编译无错误: `mvn clean compile` --- ## 注意事项 1. **Mapper XML 位置**: 必须放在 `resources/mapper/ccdi/project/` 目录下 2. **批量更新**: 使用 `separator=";"` 实现批量更新 3. **只更新阈值**: UPDATE 语句只更新 `param_value` 字段 4. **事务管理**: Service 实现类必须添加 `@Transactional` 注解 5. **异常处理**: 使用 `ServiceException` 抛出业务异常 6. **Swagger 文档**: Controller 必须添加 `@Tag` 和 `@Operation` 注解 --- ## 下一步 完成本任务后,进入下一个任务: **03-后端功能测试.md**