JavaProjectRepo/增加材料类型的支持.md

73 lines
4.0 KiB
Markdown
Raw Permalink Normal View History

2026-03-20 19:00:16 +08:00
# 增加材料类型(material_type)支持的详细实施方案
根据现有的系统架构和需求为算法模型增加“材料类型material_type”维度的支持需要从数据库、实体类、核心业务逻辑特别是路径解析与模型发布以及状态控制等方面进行细化和落地。以下是详细的分析与实施细则
## 1. 数据库层面修改 (Database)
- **目标表**: `algorithm_model`
- **操作**: 增加 `material_type` 字段,用于区分该模型适用的材料(如 `Pu` 等)。
- **SQL 参考**:
```sql
ALTER TABLE algorithm_model
ADD COLUMN material_type VARCHAR(50) DEFAULT NULL COMMENT '材料类型' AFTER device_type;
```
## 2. 实体类及映射修改 (Domain)
- **目标文件**: `AlgorithmModel.java`
- **操作**: 增加对应的 Java 属性,并使用 MyBatis-Plus 的 `@TableField` 进行映射。
- **代码参考**:
```java
/**
* 材料类型 (例如: Pu)
*/
@TableField("material_type")
private String materialType;
```
## 3. 核心业务逻辑修改 (Service)
### 3.1 提取材料类型 (Path Parsing)
- **目标文件**: `ModelTrainServiceImpl.java` -> `publishModel` 方法。
- **逻辑细化**: `ModelTrainTask` 中保存的相对路径(如 `runs/GPR/AnnularTank/Pu/edb0e340-51e6-46bb-9c08-5ba38762089e/pipeline.pkl`)包含了材料信息。
- **解析规则**:
需要对 `task.getModelOutputPath()``task.getModelRelativePath()` 进行字符串分割(兼容 `/``\`)。
标准的目录层级为:`runs` / `{算法类型}` / `{设备类型}` / `{材料类型}` / `{TaskID}` / `{文件名}`
- 第 0 层: `runs`
- 第 1 层: `algorithm_type` (如 `GPR`)
- 第 2 层: `device_type` (如 `AnnularTank`)
- **第 3 层**: `material_type` (如 `Pu`) <- **需要提取的字段**
- 第 4 层: `task_id`
### 3.2 更新模型发布路径 (Publish Path Assembly)
- **目标文件**: `ModelTrainServiceImpl.java` -> `publishModel` 方法。
- **旧路径结构**: `{modelRoot}/{algorithmType}/{deviceType}/{versionTag}/`
- **新路径结构**: 将提取出的 `materialType` 拼接到发布路径中,使发布目录也具备材料维度。
**新结构**: `{modelRoot}/{algorithmType}/{deviceType}/{materialType}/{versionTag}/`
- **持久化**:
在构建要插入到 `algorithm_model` 表的记录时,不仅要保存新拼接出的模型绝对/相对路径,还要将解析出的 `materialType` 赋值给 `AlgorithmModel` 对象。
### 3.3 激活模型的唯一性约束控制 (Active Model Logic)
- **业务规则**: “每种设备 + 每种算法类型 + 每种材料类型” 只能由一个激活(`is_active = 1` 或者对应状态码)的算法。
- **目标文件**: 处理模型发布或激活的 Service 方法(如 `AlgorithmModelServiceImpl` 中如果存在独立激活方法,或直接在 `publishModel` 之后的操作)。
- **逻辑细化**: 在将某模型记录标记为激活前,需要执行排他更新:
```java
UpdateWrapper<AlgorithmModel> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("device_type", model.getDeviceType())
.eq("algorithm_type", model.getAlgorithmType())
.eq("material_type", model.getMaterialType()) // 新增材料类型维度限制
.set("is_active", 0); // 假设 0 为未激活1 为激活
algorithmModelMapper.update(null, updateWrapper);
```
## 4. API 接口层面 (Controller)
- **目标文件**: `ModelTrainController.java`
- **接口定义**:
```java
@PostMapping("/publish")
public ResponseResult publish(@RequestBody Map<String, String> body) {
String taskId = body.get("taskId");
String versionTag = body.get("versionTag");
boolean success = modelTrainService.publishModel(taskId, versionTag);
return success ? ResponseResult.success() : ResponseResult.error("发布失败");
}
```
- **结论**: 接口的入参定义**无需修改**。材料类型信息属于内部推导数据,完全可以由 Service 层通过 `taskId` 找到对应的 Task 数据,再解析路径得到 `material_type`,对前端调用保持透明。