Browse Source

模型数据集上传下载接口修改预备

pull/7/head
西大锐 1 year ago
parent
commit
9038ef8e63
8 changed files with 74 additions and 56 deletions
  1. +14
    -1
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsController.java
  2. +2
    -2
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentDao.java
  3. +4
    -0
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsService.java
  4. +2
    -2
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java
  5. +29
    -45
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java
  6. +2
    -0
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java
  7. +20
    -6
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java
  8. +1
    -0
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsVersionServiceImpl.java

+ 14
- 1
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsController.java View File

@@ -120,7 +120,7 @@ public class ModelsController {
}

/**
* 模型下载
* 模型单个文件下载
*
*@param models_version_id 模型版本表主键
* @return 单条数据
@@ -131,5 +131,18 @@ public class ModelsController {
return AjaxResult.success(modelsService.downloadModels(models_version_id));
}

/**
* 模型打包下载
*
*@param models_version_id 模型版本表主键
* @return 单条数据
*/
@GetMapping("/downloadAllFiles/{models_version_id}")
@ApiOperation(value = "下载模型", notes = "根据模型版本表id下载模型文件。")
public AjaxResult downloadAllModelFiles(@PathVariable("models_version_id") Integer models_version_id) {
return AjaxResult.success(modelsService.downloadAllModelFiles(models_version_id));
}


}


+ 2
- 2
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentDao.java View File

@@ -45,7 +45,7 @@ public interface ExperimentDao {
* @param experiment 实例对象
* @return 影响行数
*/
int insert(Experiment experiment);
int insert(@Param("experiment") Experiment experiment);

/**
* 批量新增数据(MyBatis原生foreach方法)
@@ -70,7 +70,7 @@ public interface ExperimentDao {
* @param experiment 实例对象
* @return 影响行数
*/
int update(Experiment experiment);
int update(@Param("experiment") Experiment experiment);

/**
* 通过主键删除数据


+ 4
- 0
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsService.java View File

@@ -66,7 +66,11 @@ public interface ModelsService {

ResponseEntity<InputStreamResource> downloadModels(Integer id);



Map uploadModels(MultipartFile file, Integer id) throws Exception;

Map uploadModelsPipeline(ModelsVersion modelsVersion) throws Exception;

ResponseEntity<InputStreamResource> downloadAllModelFiles(Integer modelsVersionId);
}

+ 2
- 2
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java View File

@@ -255,8 +255,8 @@ public class DatasetServiceImpl implements DatasetService {
String version = datasetVersionToUse.getVersion();
Date createTime = datasetVersionToUse.getCreateTime();
String fileName = file.getOriginalFilename();
String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime);
String objectName = "datasets/" + username + "/" + dataset.getName() + "-" + timestamp + "/" + version + "/" + fileName;
// String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime);
String objectName = "datasets/" + username + "/" + dataset.getName() + "/" + version + "/" + fileName;

// 上传文件到MinIO
try (InputStream inputStream = file.getInputStream()) {


+ 29
- 45
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java View File

@@ -56,12 +56,12 @@ public class ExperimentInsServiceImpl implements ExperimentInsService {
* @return 实例对象
*/
@Override
public ExperimentIns queryById(Integer id) throws IOException {
public ExperimentIns queryById(Integer id) {
ExperimentIns experimentIns = this.experimentInsDao.queryById(id);
if (experimentIns != null && (StringUtils.isEmpty(experimentIns.getStatus())) || !isTerminatedState(experimentIns)) {
if (experimentIns != null && (StringUtils.isEmpty(experimentIns.getStatus())) || !isTerminatedState(experimentIns.getStatus())) {
experimentIns = this.queryStatusFromArgo(experimentIns);
//只有当新状态是终止态时才更新数据库
if (isTerminatedState(experimentIns)) {
if (isTerminatedState(experimentIns.getStatus())) {
//同时更新各个节点
this.update(experimentIns);
}
@@ -78,17 +78,17 @@ public class ExperimentInsServiceImpl implements ExperimentInsService {
* @return 实验列表
*/
@Override
public List<ExperimentIns> getByExperimentId(Integer experimentId) throws IOException {
public List<ExperimentIns> getByExperimentId(Integer experimentId) {
List<ExperimentIns> experimentInsList = experimentInsDao.getByExperimentId(experimentId);

List<ExperimentIns> result = new ArrayList<ExperimentIns>();
if (experimentInsList!=null&&experimentInsList.size()>0) {
for (ExperimentIns experimentIns : experimentInsList) {
//当原本状态为null或非终止态时才调用argo接口
if (experimentIns != null && (StringUtils.isEmpty(experimentIns.getStatus())) || !isTerminatedState(experimentIns)) {
if (experimentIns != null && (StringUtils.isEmpty(experimentIns.getStatus())) || !isTerminatedState(experimentIns.getStatus())) {
experimentIns = this.queryStatusFromArgo(experimentIns);
//只有当新状态是终止态时才更新数据库
if (isTerminatedState(experimentIns)) {
if (isTerminatedState(experimentIns.getStatus())) {
//同时更新各个节点
this.update(experimentIns);
}
@@ -109,7 +109,7 @@ public class ExperimentInsServiceImpl implements ExperimentInsService {
* @return 查询结果
*/
@Override
public Page<ExperimentIns> queryByPage(ExperimentIns experimentIns, PageRequest pageRequest) throws IOException {
public Page<ExperimentIns> queryByPage(ExperimentIns experimentIns, PageRequest pageRequest) {
long total = this.experimentInsDao.count(experimentIns);
List<ExperimentIns> experimentInsList = this.experimentInsDao.queryAllByLimit(experimentIns, pageRequest);
if (experimentInsList!=null && experimentInsList.size()>0) {
@@ -152,7 +152,7 @@ public class ExperimentInsServiceImpl implements ExperimentInsService {
* @return 实例对象
*/
@Override
public ExperimentIns update(ExperimentIns experimentIns) throws IOException {
public ExperimentIns update(ExperimentIns experimentIns) {
LoginUser loginUser = SecurityUtils.getLoginUser();
experimentIns.setUpdateBy(loginUser.getUsername());
experimentIns.setUpdateTime(new Date());
@@ -212,8 +212,8 @@ public class ExperimentInsServiceImpl implements ExperimentInsService {
String namespace = ins.getArgoInsNs();
String name = ins.getArgoInsName();
Integer id = ins.getId();
// 创建请求数据map
ExperimentIns experimentIns = this.experimentInsDao.queryById(id);
// 创建请求数据map
Map<String,Object> requestData = new HashMap<>();
requestData.put("namespace", namespace);
requestData.put("name", name);
@@ -241,6 +241,10 @@ public class ExperimentInsServiceImpl implements ExperimentInsService {
if (status == null || status.isEmpty()) {
throw new RuntimeException("工作流状态为空。");
}
//解析流水线开始时间,开始时间一定存在,所以不需要判断
Date startTime = DateUtils.convertUTCtoShanghaiDate((String) status.get("startedAt"));
experimentIns.setStartTime(startTime);


//解析流水线结束时间
String finishedAtString = (String) status.get("finishedAt");
@@ -251,23 +255,21 @@ public class ExperimentInsServiceImpl implements ExperimentInsService {

// 解析nodes字段,提取节点状态并转换为JSON字符串
Map<String, Object> nodes = (Map<String, Object>) status.get("nodes");
Map<String, Object> modifiedNodes = new LinkedHashMap<>();
if (nodes != null ) {
for (Map.Entry<String, Object> nodeEntry : nodes.entrySet()) {
Map<String,Object> nodeDetails = (Map<String, Object>) nodeEntry.getValue();
String templateName = (String) nodeDetails.get("displayName");
modifiedNodes.put(templateName, nodeDetails);
}
if (nodes == null || nodes.isEmpty()) {
throw new RuntimeException("工作流的节点数据为空。");
}

String nodeStatusJson = JsonUtils.mapToJson(modifiedNodes);
experimentIns.setNodesStatus(nodeStatusJson);
Map<String, Object> modifiedNodes = new LinkedHashMap<>();

//终止态为终止不改
if (!StringUtils.equals(experimentIns.getStatus(),"Terminated")) {
experimentIns.setStatus(StringUtils.isNotEmpty((String) status.get("phase"))?(String) status.get("phase"):"Pending");
for (Map.Entry<String, Object> nodeEntry : nodes.entrySet()) {
Map<String,Object> nodeDetails = (Map<String, Object>) nodeEntry.getValue();
String templateName = (String) nodeDetails.get("displayName");
modifiedNodes.put(templateName, nodeDetails);
}

String nodeStatusJson = JsonUtils.mapToJson(modifiedNodes);
experimentIns.setNodesStatus(nodeStatusJson);
experimentIns.setStatus((String) status.get("phase"));

return experimentIns;

@@ -276,6 +278,7 @@ public class ExperimentInsServiceImpl implements ExperimentInsService {

}


}

/**
@@ -326,11 +329,9 @@ public class ExperimentInsServiceImpl implements ExperimentInsService {
// 从响应Map中直接获取"errCode"的值
Integer errCode = (Integer) runResMap.get("errCode");
if (errCode != null && errCode == 0) {
experimentIns.setStatus("Terminated");
//更新experimentIns,确保状态更新被保存到数据库
ExperimentIns ins = queryStatusFromArgo(experimentIns);
ins.setStatus("Terminated");
ins.setFinishTime(new Date());
this.experimentInsDao.update(ins);
this.experimentInsDao.update(experimentIns);
return true;
} else {
return false;
@@ -394,27 +395,10 @@ public class ExperimentInsServiceImpl implements ExperimentInsService {
}
}

private boolean isTerminatedState(ExperimentIns ins) throws IOException {
private boolean isTerminatedState(String state) {
// 定义终止态的列表,例如 "Succeeded", "Failed" 等
String status = ins.getStatus();
boolean flag = true;
List<String> terminatedStates = Arrays.asList("Succeeded", "Failed");
flag = terminatedStates.contains(status);
if (StringUtils.equals(status, "Terminated")){
//如果跟node_status里面不一样,就要去更新node_status的信息
String nodesStatus = ins.getNodesStatus();
Map<String, Object> nodeMap = JsonUtils.jsonToMap(nodesStatus);
String keyStartsWithWorkflow = nodeMap.keySet().stream()
.filter(key -> key.startsWith("workflow-"))
.findFirst()
.orElse(null);
Map workflowMap = (Map) nodeMap.get(keyStartsWithWorkflow);
if (workflowMap != null){
flag = StringUtils.equals("Terminated", (String) workflowMap.get("phase"));
}
}

return flag;
List<String> terminatedStates = Arrays.asList("Succeeded", "Failed", "Terminated");
return terminatedStates.contains(state);
}

}

+ 2
- 0
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java View File

@@ -103,6 +103,8 @@ public class ExperimentServiceImpl implements ExperimentService {
/**
* 分页查询实验状态
*
*
*
* @param experiment 筛选条件
* @param pageRequest 分页对象
* @return 查询结果


+ 20
- 6
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java View File

@@ -153,6 +153,8 @@ public class ModelsServiceImpl implements ModelsService {
//判断权限,只有admin和创建者本身可以删除该数据集
LoginUser loginUser = SecurityUtils.getLoginUser();
String username = loginUser.getUsername();


String createdBy = models.getCreateBy();
if (!(StringUtils.equals(username,"admin") || StringUtils.equals(username,createdBy))){
return "无权限删除该模型";
@@ -246,8 +248,8 @@ public class ModelsServiceImpl implements ModelsService {
String version = modelsVersionToUse.getVersion();
Date createTime = modelsVersionToUse.getCreateTime();
String fileName = file.getOriginalFilename();
String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime);
String objectName = "models/" + username + "/" + models.getName() + "-" + timestamp + "/" + version + "/" + fileName;
// String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime);
String objectName = "models/" + username + "/" + models.getName() + "/" + version + "/" + fileName;

// 上传文件到MinIO
try (InputStream inputStream = file.getInputStream()) {
@@ -270,6 +272,7 @@ public class ModelsServiceImpl implements ModelsService {
String username = SecurityUtils.getLoginUser().getUsername();
// 检查是否存在
Models models = this.queryById(modelsVersion.getModelsId());

if (models == null) {
throw new Exception("模型不存在,请检查模型id");
}
@@ -279,8 +282,8 @@ public class ModelsServiceImpl implements ModelsService {
if (version == null) {
//插表,因为这里是一次直接插表所以这里定掉date,然后用DAO插入
Date date = new Date();
String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(date);
url = "models/" + username + "/" + models.getName() + "-" + timestamp + "/" + modelsVersion.getVersion() + "/" + modelsVersion.getFileName();
//String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(date);
url = "models/" + username + "/" + models.getName() + "-" + "/" + modelsVersion.getVersion() + "/" + modelsVersion.getFileName();
modelsVersion.setUrl(url);
modelsVersion.setCreateBy(username);
modelsVersion.setUpdateBy(username);
@@ -292,8 +295,8 @@ public class ModelsServiceImpl implements ModelsService {
//改表
BeansUtils.copyPropertiesIgnoreNull(modelsVersion, version);
Date createTime = version.getCreateTime();
String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime);
url = "models/" + username + "/" + models.getName() + "-" + timestamp + "/" + modelsVersion.getVersion() + "/" + modelsVersion.getFileName();
// String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime);
url = "models/" + username + "/" + models.getName() + "-" + "/" + modelsVersion.getVersion() + "/" + modelsVersion.getFileName();
version.setUrl(url);
modelsVersionService.update(version);
}
@@ -302,6 +305,17 @@ public class ModelsServiceImpl implements ModelsService {
return result;
}

/**
* 下载所有模型文件,用压缩包的方式返回
*
* @param modelsVersionId models_version表的主键
* @return 文件内容
*/
@Override
public ResponseEntity<InputStreamResource> downloadAllModelFiles(Integer modelsVersionId) {
return null;
}

private String extractFileName(String urlStr) {
return urlStr.substring(urlStr.lastIndexOf('/') + 1);
}


+ 1
- 0
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsVersionServiceImpl.java View File

@@ -146,6 +146,7 @@ public class ModelsVersionServiceImpl implements ModelsVersionService {
}

public ModelsVersion queryByModelsVersion(ModelsVersion modelsVersion){

return this.modelsVersionDao.queryByModelsVersion(modelsVersion);
}



Loading…
Cancel
Save