feat: 完成模型参数配置功能开发

- 添加 Controller、Mapper、Service 层代码
- 添加前端 API 和页面组件
- 添加后端功能测试报告
This commit is contained in:
wkc
2026-02-26 10:31:51 +08:00
parent 367a3da5cb
commit 872bc3260c
9 changed files with 932 additions and 0 deletions

View File

@@ -0,0 +1,61 @@
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<ModelListVO> list = modelParamService.selectModelList(projectId);
return success(list);
}
/**
* 查询模型参数列表
*/
@Operation(summary = "查询模型参数列表")
@GetMapping("/list")
public AjaxResult list(@Validated ModelParamQueryDTO queryDTO) {
List<ModelParamVO> 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("保存成功");
}
}

View File

@@ -0,0 +1,40 @@
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<CcdiModelParam> {
/**
* 查询指定项目和模型的参数列表
*
* @param projectId 项目ID
* @param modelCode 模型编码
* @return 参数列表
*/
List<CcdiModelParam> selectByProjectAndModel(
@Param("projectId") Long projectId,
@Param("modelCode") String modelCode
);
/**
* 查询所有模型列表(去重)
*
* @param projectId 项目ID
* @return 模型列表
*/
List<CcdiModelParam> selectDistinctModels(@Param("projectId") Long projectId);
/**
* 批量更新参数值(只更新param_value字段)
*
* @param list 参数列表
* @return 更新数量
*/
int batchUpdateParamValues(@Param("list") List<CcdiModelParam> list);
}

View File

@@ -0,0 +1,36 @@
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<ModelListVO> selectModelList(Long projectId);
/**
* 查询模型参数列表
*
* @param queryDTO 查询条件
* @return 参数列表
*/
List<ModelParamVO> selectParamList(ModelParamQueryDTO queryDTO);
/**
* 保存模型参数(只更新阈值)
*
* @param saveDTO 保存参数
*/
void saveParams(ModelParamSaveDTO saveDTO);
}

View File

@@ -0,0 +1,123 @@
package com.ruoyi.ccdi.project.service.impl;
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;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 模型参数Service实现
*/
@Service
public class CcdiModelParamServiceImpl implements ICcdiModelParamService {
@Resource
private CcdiModelParamMapper modelParamMapper;
@Override
public List<ModelListVO> selectModelList(Long projectId) {
if (projectId == null) {
projectId = 0L; // 默认查询系统级参数
}
List<ModelListVO> result = new ArrayList<>();
List<CcdiModelParam> 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<ModelParamVO> selectParamList(ModelParamQueryDTO queryDTO) {
Long projectId = queryDTO.getProjectId();
if (projectId == null) {
projectId = 0L;
}
List<CcdiModelParam> params = modelParamMapper.selectByProjectAndModel(
projectId,
queryDTO.getModelCode()
);
List<ModelParamVO> 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;
}
// 空列表校验
if (saveDTO.getParams() == null || saveDTO.getParams().isEmpty()) {
throw new ServiceException("参数列表不能为空");
}
String username = SecurityUtils.getUsername();
Date now = new Date();
// 查询现有参数
List<CcdiModelParam> existingParams = modelParamMapper.selectByProjectAndModel(
projectId,
saveDTO.getModelCode()
);
if (existingParams.isEmpty()) {
throw new ServiceException("未找到模型参数配置");
}
// 构建Map提升性能
Map<String, CcdiModelParam> existingMap = existingParams.stream()
.collect(Collectors.toMap(CcdiModelParam::getParamCode, p -> p));
// 准备更新列表 - 只更新 param_value 字段
List<CcdiModelParam> updateList = new ArrayList<>();
for (ModelParamSaveDTO.ParamItem item : saveDTO.getParams()) {
CcdiModelParam existing = existingMap.get(item.getParamCode());
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);
}
}
}

View File

@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.ccdi.project.mapper.CcdiModelParamMapper">
<resultMap id="ModelParamResult" type="com.ruoyi.ccdi.project.domain.CcdiModelParam">
<id property="id" column="id"/>
<result property="projectId" column="project_id"/>
<result property="modelCode" column="model_code"/>
<result property="modelName" column="model_name"/>
<result property="paramCode" column="param_code"/>
<result property="paramName" column="param_name"/>
<result property="paramDesc" column="param_desc"/>
<result property="paramValue" column="param_value"/>
<result property="paramUnit" column="param_unit"/>
<result property="sortOrder" column="sort_order"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="remark" column="remark"/>
</resultMap>
<sql id="selectModelParamVo">
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
</sql>
<select id="selectByProjectAndModel" resultMap="ModelParamResult">
<include refid="selectModelParamVo"/>
where project_id = #{projectId} and model_code = #{modelCode}
order by sort_order asc
</select>
<select id="selectDistinctModels" resultMap="ModelParamResult">
select distinct model_code, model_name
from ccdi_model_param
where project_id = #{projectId}
order by model_code
</select>
<!-- 关键:只更新 param_value 字段,使用 CASE WHEN 批量更新 -->
<update id="batchUpdateParamValues">
update ccdi_model_param
<set>
<trim prefix="param_value = case" suffix="end,">
<foreach collection="list" item="item">
when id = #{item.id} then #{item.paramValue}
</foreach>
</trim>
<trim prefix="update_by = case" suffix="end,">
<foreach collection="list" item="item">
when id = #{item.id} then #{item.updateBy}
</foreach>
</trim>
update_time = sysdate()
</set>
where id in
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item.id}
</foreach>
</update>
</mapper>