更新java版本
This commit is contained in:
304
doc/参数配置功能/02-后端业务逻辑开发-修复报告.md
Normal file
304
doc/参数配置功能/02-后端业务逻辑开发-修复报告.md
Normal file
@@ -0,0 +1,304 @@
|
|||||||
|
# 任务2: 后端业务逻辑开发 - 代码质量修复报告
|
||||||
|
|
||||||
|
## 修复日期
|
||||||
|
|
||||||
|
2026-02-26
|
||||||
|
|
||||||
|
## 修复概述
|
||||||
|
|
||||||
|
针对任务2(后端业务逻辑开发)中发现的严重代码质量问题进行了全面修复,确保代码的健壮性和可执行性。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 已修复问题清单
|
||||||
|
|
||||||
|
### ✅ 问题1: 批量更新SQL语法错误 (严重)
|
||||||
|
|
||||||
|
**问题描述:**
|
||||||
|
MySQL 默认不支持在单个 PreparedStatement 中执行分号分隔的多条SQL语句。使用 `<foreach separator=";">` 会导致运行时错误。
|
||||||
|
|
||||||
|
**修复文件:**
|
||||||
|
`ccdi-project/src/main/resources/mapper/ccdi/project/CcdiModelParamMapper.xml`
|
||||||
|
|
||||||
|
**修复前:**
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<update id="batchUpdateParamValues">
|
||||||
|
<foreach collection="list" item="item" separator=";">
|
||||||
|
update ccdi_model_param
|
||||||
|
set param_value = #{item.paramValue},
|
||||||
|
update_by = #{item.updateBy},
|
||||||
|
update_time = sysdate()
|
||||||
|
where id = #{item.id}
|
||||||
|
</foreach>
|
||||||
|
</update>
|
||||||
|
```
|
||||||
|
|
||||||
|
**修复后:**
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<!-- 关键:只更新 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>
|
||||||
|
```
|
||||||
|
|
||||||
|
**修复效果:**
|
||||||
|
|
||||||
|
- ✅ 使用 CASE WHEN 批量更新语法,单条SQL完成批量更新
|
||||||
|
- ✅ 兼容 MySQL 默认配置,无需开启多语句支持
|
||||||
|
- ✅ 性能更优,减少数据库交互次数
|
||||||
|
- ✅ 保证事务完整性
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### ✅ 问题2: saveParams 方法缺少空列表校验 (建议)
|
||||||
|
|
||||||
|
**问题描述:**
|
||||||
|
Service 层未对传入的参数列表进行空值校验,可能导致空指针异常或无效的数据库操作。
|
||||||
|
|
||||||
|
**修复文件:**
|
||||||
|
`ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiModelParamServiceImpl.java`
|
||||||
|
|
||||||
|
**修复前:**
|
||||||
|
|
||||||
|
```java
|
||||||
|
@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();
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**修复后:**
|
||||||
|
|
||||||
|
```java
|
||||||
|
@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();
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**修复效果:**
|
||||||
|
|
||||||
|
- ✅ 提前拦截无效请求,避免不必要的数据库查询
|
||||||
|
- ✅ 明确的错误提示,便于前端调试
|
||||||
|
- ✅ 提升代码健壮性
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### ✅ 问题3: Stream 操作性能优化 (可选)
|
||||||
|
|
||||||
|
**问题描述:**
|
||||||
|
在循环中使用 Stream 的 filter/findFirst 查找元素,时间复杂度为 O(n²),性能较差。
|
||||||
|
|
||||||
|
**修复文件:**
|
||||||
|
`ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiModelParamServiceImpl.java`
|
||||||
|
|
||||||
|
**修复前:**
|
||||||
|
|
||||||
|
```java
|
||||||
|
// 准备更新列表 - 只更新 param_value 字段
|
||||||
|
List<CcdiModelParam> 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) {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**修复后:**
|
||||||
|
|
||||||
|
```java
|
||||||
|
// 构建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) {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**额外添加的导入:**
|
||||||
|
|
||||||
|
```java
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
```
|
||||||
|
|
||||||
|
**修复效果:**
|
||||||
|
|
||||||
|
- ✅ 时间复杂度从 O(n²) 降低到 O(n)
|
||||||
|
- ✅ 性能提升显著,尤其参数较多时
|
||||||
|
- ✅ 代码可读性更好
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 验证结果
|
||||||
|
|
||||||
|
### 编译验证
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn clean compile -pl ccdi-project -am
|
||||||
|
```
|
||||||
|
|
||||||
|
**结果:** ✅ BUILD SUCCESS
|
||||||
|
|
||||||
|
```
|
||||||
|
[INFO] Reactor Summary for ruoyi 3.9.1:
|
||||||
|
[INFO]
|
||||||
|
[INFO] ruoyi .............................................. SUCCESS [ 0.127 s]
|
||||||
|
[INFO] ruoyi-common ....................................... SUCCESS [ 4.148 s]
|
||||||
|
[INFO] ccdi-project ....................................... SUCCESS [ 1.558 s]
|
||||||
|
[INFO] ------------------------------------------------------------------------
|
||||||
|
[INFO] BUILD SUCCESS
|
||||||
|
[INFO] ------------------------------------------------------------------------
|
||||||
|
[INFO] Total time: 6.184 s
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 代码质量检查
|
||||||
|
|
||||||
|
### ✅ 规范检查
|
||||||
|
|
||||||
|
- ✅ 所有类使用 `import` 导入,无全限定类名
|
||||||
|
- ✅ Service 使用 `@Resource` 注入
|
||||||
|
- ✅ Service 实现类添加 `@Transactional` 注解
|
||||||
|
- ✅ 异常处理使用 `ServiceException`
|
||||||
|
|
||||||
|
### ✅ 性能检查
|
||||||
|
|
||||||
|
- ✅ 批量更新使用 CASE WHEN 语法
|
||||||
|
- ✅ Stream 操作优化为 Map 查找
|
||||||
|
- ✅ 空值校验提前拦截
|
||||||
|
|
||||||
|
### ✅ 业务检查
|
||||||
|
|
||||||
|
- ✅ UPDATE 只更新 `param_value` 字段
|
||||||
|
- ✅ 审计字段正确设置
|
||||||
|
- ✅ 事务管理完整
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 修复影响范围
|
||||||
|
|
||||||
|
### 修改文件
|
||||||
|
|
||||||
|
1. `CcdiModelParamMapper.xml` - 批量更新SQL语法
|
||||||
|
2. `CcdiModelParamServiceImpl.java` - 空列表校验 + 性能优化
|
||||||
|
|
||||||
|
### 影响接口
|
||||||
|
|
||||||
|
- `POST /ccdi/modelParam/save` - 保存模型参数接口
|
||||||
|
|
||||||
|
### 兼容性
|
||||||
|
|
||||||
|
- ✅ 向后兼容,不影响现有功能
|
||||||
|
- ✅ 接口签名不变
|
||||||
|
- ✅ 数据库表结构不变
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 测试建议
|
||||||
|
|
||||||
|
### 功能测试
|
||||||
|
|
||||||
|
1. **正常场景**: 批量更新参数值
|
||||||
|
2. **边界场景**: 空参数列表
|
||||||
|
3. **异常场景**: 无效的模型编码
|
||||||
|
4. **性能测试**: 大量参数更新
|
||||||
|
|
||||||
|
### SQL验证
|
||||||
|
|
||||||
|
生成的SQL示例:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
UPDATE ccdi_model_param
|
||||||
|
SET
|
||||||
|
param_value = CASE
|
||||||
|
WHEN id = 1 THEN '0.5'
|
||||||
|
WHEN id = 2 THEN '0.3'
|
||||||
|
WHEN id = 3 THEN '100'
|
||||||
|
END,
|
||||||
|
update_by = CASE
|
||||||
|
WHEN id = 1 THEN 'admin'
|
||||||
|
WHEN id = 2 THEN 'admin'
|
||||||
|
WHEN id = 3 THEN 'admin'
|
||||||
|
END,
|
||||||
|
update_time = sysdate()
|
||||||
|
WHERE id IN (1, 2, 3)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 总结
|
||||||
|
|
||||||
|
所有发现的代码质量问题均已修复完成:
|
||||||
|
|
||||||
|
- ✅ **问题1 (严重)**: SQL语法错误 - 已修复
|
||||||
|
- ✅ **问题2 (建议)**: 空列表校验 - 已修复
|
||||||
|
- ✅ **问题3 (可选)**: 性能优化 - 已修复
|
||||||
|
|
||||||
|
修复后的代码具有:
|
||||||
|
|
||||||
|
- ✅ 更好的健壮性
|
||||||
|
- ✅ 更高的性能
|
||||||
|
- ✅ 更清晰的代码结构
|
||||||
|
- ✅ 完整的错误处理
|
||||||
|
|
||||||
|
**状态:** 已完成,可以进入下一阶段测试。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 下一步
|
||||||
|
|
||||||
|
进入 **任务3: 后端功能测试**
|
||||||
162
doc/参数配置功能/02-后端业务逻辑开发-验证报告.md
Normal file
162
doc/参数配置功能/02-后端业务逻辑开发-验证报告.md
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
# 任务2: 后端业务逻辑开发 - 验证报告
|
||||||
|
|
||||||
|
## 任务完成情况
|
||||||
|
|
||||||
|
### ✅ 已完成项目
|
||||||
|
|
||||||
|
#### 1. Mapper 层
|
||||||
|
|
||||||
|
- ✅ **CcdiModelParamMapper.java** - 已创建
|
||||||
|
- 位置: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/`
|
||||||
|
- 方法:
|
||||||
|
- `selectByProjectAndModel` - 查询指定项目和模型的参数列表
|
||||||
|
- `selectDistinctModels` - 查询所有模型列表(去重)
|
||||||
|
- `batchUpdateParamValues` - 批量更新参数值
|
||||||
|
|
||||||
|
- ✅ **CcdiModelParamMapper.xml** - 已创建
|
||||||
|
- 位置: `ccdi-project/src/main/resources/mapper/ccdi/project/`
|
||||||
|
- 特点:
|
||||||
|
- 使用 `separator=";"` 实现批量更新
|
||||||
|
- UPDATE 语句只更新 `param_value`, `update_by`, `update_time` 三个字段
|
||||||
|
- 符合只更新阈值的业务要求
|
||||||
|
|
||||||
|
#### 2. Service 层
|
||||||
|
|
||||||
|
- ✅ **ICcdiModelParamService.java** - 已创建
|
||||||
|
- 位置: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/`
|
||||||
|
- 方法:
|
||||||
|
- `selectModelList` - 查询模型列表
|
||||||
|
- `selectParamList` - 查询模型参数列表
|
||||||
|
- `saveParams` - 保存模型参数
|
||||||
|
|
||||||
|
- ✅ **CcdiModelParamServiceImpl.java** - 已创建
|
||||||
|
- 位置: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/`
|
||||||
|
- 特点:
|
||||||
|
- 使用 `@Resource` 注入 Mapper
|
||||||
|
- `saveParams` 方法添加 `@Transactional` 注解
|
||||||
|
- 使用 `SecurityUtils.getUsername()` 获取当前用户
|
||||||
|
- 只更新 `param_value` 字段,符合业务要求
|
||||||
|
- 使用 `BeanUtils.copyProperties` 进行对象转换
|
||||||
|
|
||||||
|
#### 3. Controller 层
|
||||||
|
|
||||||
|
- ✅ **CcdiModelParamController.java** - 已创建
|
||||||
|
- 位置: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/`
|
||||||
|
- 接口:
|
||||||
|
- `GET /ccdi/modelParam/modelList` - 查询模型列表
|
||||||
|
- `GET /ccdi/modelParam/list` - 查询模型参数列表
|
||||||
|
- `POST /ccdi/modelParam/save` - 保存模型参数
|
||||||
|
- 特点:
|
||||||
|
- 继承 `BaseController`
|
||||||
|
- 使用 `@Tag` 和 `@Operation` 添加 Swagger 注解
|
||||||
|
- 使用 `@Validated` 进行参数校验
|
||||||
|
- 添加 `@Log` 注解记录操作日志
|
||||||
|
|
||||||
|
#### 4. 配置文件
|
||||||
|
|
||||||
|
- ✅ **pom.xml** - 已更新
|
||||||
|
- 添加 `springdoc-openapi-starter-webmvc-ui` 依赖
|
||||||
|
- 配置 Lombok 注解处理器
|
||||||
|
|
||||||
|
### ✅ 编译验证
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn clean compile -pl ccdi-project -am
|
||||||
|
```
|
||||||
|
|
||||||
|
**结果:** BUILD SUCCESS
|
||||||
|
|
||||||
|
### ✅ 代码规范检查
|
||||||
|
|
||||||
|
#### 导入规范
|
||||||
|
|
||||||
|
- ✅ 所有类使用 `import` 语句导入,无全限定类名
|
||||||
|
- ✅ 无未使用的导入
|
||||||
|
|
||||||
|
#### 注解规范
|
||||||
|
|
||||||
|
- ✅ Service 层使用 `@Resource` 注入,未使用 `@Autowired`
|
||||||
|
- ✅ Service 实现类添加 `@Transactional` 注解
|
||||||
|
- ✅ Controller 添加 Swagger 注解 (`@Tag`, `@Operation`)
|
||||||
|
- ✅ Controller 添加日志注解 (`@Log`)
|
||||||
|
|
||||||
|
#### 分层规范
|
||||||
|
|
||||||
|
- ✅ DTO/VO 与 Entity 分离
|
||||||
|
- ✅ Mapper 接口继承 `BaseMapper<CcdiModelParam>`
|
||||||
|
- ✅ Service 接口和实现类分离定义
|
||||||
|
|
||||||
|
#### 业务规范
|
||||||
|
|
||||||
|
- ✅ UPDATE 语句只更新 `param_value` 字段
|
||||||
|
- ✅ 批量更新使用 `separator=";"`
|
||||||
|
- ✅ 使用 `ServiceException` 抛出业务异常
|
||||||
|
- ✅ 审计字段自动设置
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 文件清单
|
||||||
|
|
||||||
|
### Java 文件 (9个)
|
||||||
|
|
||||||
|
```
|
||||||
|
ccdi-project/src/main/java/com/ruoyi/ccdi/project/
|
||||||
|
├── domain/
|
||||||
|
│ ├── CcdiModelParam.java # 实体类
|
||||||
|
│ ├── dto/
|
||||||
|
│ │ ├── ModelParamQueryDTO.java # 查询DTO
|
||||||
|
│ │ └── ModelParamSaveDTO.java # 保存DTO
|
||||||
|
│ └── vo/
|
||||||
|
│ ├── ModelListVO.java # 模型列表VO
|
||||||
|
│ └── ModelParamVO.java # 参数VO
|
||||||
|
├── mapper/
|
||||||
|
│ └── CcdiModelParamMapper.java # Mapper接口
|
||||||
|
├── service/
|
||||||
|
│ ├── ICcdiModelParamService.java # Service接口
|
||||||
|
│ └── impl/
|
||||||
|
│ └── CcdiModelParamServiceImpl.java # Service实现
|
||||||
|
└── controller/
|
||||||
|
└── CcdiModelParamController.java # Controller
|
||||||
|
```
|
||||||
|
|
||||||
|
### XML 文件 (1个)
|
||||||
|
|
||||||
|
```
|
||||||
|
ccdi-project/src/main/resources/mapper/ccdi/project/
|
||||||
|
└── CcdiModelParamMapper.xml # MyBatis映射文件
|
||||||
|
```
|
||||||
|
|
||||||
|
### 配置文件 (1个)
|
||||||
|
|
||||||
|
```
|
||||||
|
ccdi-project/
|
||||||
|
└── pom.xml # Maven配置(已更新)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 接口定义
|
||||||
|
|
||||||
|
### 1. 查询模型列表
|
||||||
|
|
||||||
|
- **URL:** `GET /ccdi/modelParam/modelList`
|
||||||
|
- **参数:** `projectId` (可选)
|
||||||
|
- **响应:** 模型列表 (modelCode, modelName)
|
||||||
|
|
||||||
|
### 2. 查询模型参数列表
|
||||||
|
|
||||||
|
- **URL:** `GET /ccdi/modelParam/list`
|
||||||
|
- **参数:** `ModelParamQueryDTO` (projectId, modelCode)
|
||||||
|
- **响应:** 参数列表
|
||||||
|
|
||||||
|
### 3. 保存模型参数
|
||||||
|
|
||||||
|
- **URL:** `POST /ccdi/modelParam/save`
|
||||||
|
- **参数:** `ModelParamSaveDTO` (projectId, modelCode, params)
|
||||||
|
- **响应:** 操作结果
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 下一步
|
||||||
|
|
||||||
|
进入 **任务3: 后端功能测试**
|
||||||
2
pom.xml
2
pom.xml
@@ -16,7 +16,7 @@
|
|||||||
<ruoyi.version>3.9.1</ruoyi.version>
|
<ruoyi.version>3.9.1</ruoyi.version>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
<java.version>17</java.version>
|
<java.version>21</java.version>
|
||||||
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
|
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
|
||||||
<mybatis-spring-boot.version>3.0.5</mybatis-spring-boot.version>
|
<mybatis-spring-boot.version>3.0.5</mybatis-spring-boot.version>
|
||||||
<druid.version>1.2.27</druid.version>
|
<druid.version>1.2.27</druid.version>
|
||||||
|
|||||||
Reference in New Issue
Block a user