diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/textClassfication/TextClassificationController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/textClassfication/TextClassificationController.java deleted file mode 100644 index 628e7855..00000000 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/textClassfication/TextClassificationController.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.ruoyi.platform.controller.textClassfication; - -import com.ruoyi.common.core.web.controller.BaseController; -import com.ruoyi.common.core.web.domain.GenericsAjaxResult; -import com.ruoyi.platform.domain.TextClassification; -import com.ruoyi.platform.service.TextClassificationService; -import com.ruoyi.platform.vo.TextClassificationVo; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.*; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; - -import javax.annotation.Resource; -import java.io.IOException; - -@RestController -@RequestMapping("textClassification") -@Api("文本分类") -public class TextClassificationController extends BaseController { - @Resource - private TextClassificationService textClassificationService; - - @GetMapping - @ApiOperation("分页查询") - public GenericsAjaxResult> queryByPage(@RequestParam("page") int page, - @RequestParam("size") int size, - @RequestParam(value = "name", required = false) String name) { - PageRequest pageRequest = PageRequest.of(page, size); - return genericsSuccess(this.textClassificationService.queryByPage(name, pageRequest)); - } - - @PostMapping - @ApiOperation("新增文本分类") - public GenericsAjaxResult add(@RequestBody TextClassificationVo textClassificationVo) throws Exception { - return genericsSuccess(this.textClassificationService.save(textClassificationVo)); - } - - @PutMapping - @ApiOperation("编辑文本分类") - public GenericsAjaxResult edit(@RequestBody TextClassificationVo textClassificationVo) throws Exception { - return genericsSuccess(this.textClassificationService.edit(textClassificationVo)); - } - - @GetMapping("/getTextClassificationDetail") - @ApiOperation("获取文本分类详细信息") - public GenericsAjaxResult getTextClassificationDetail(@RequestParam("id") Long id) throws IOException { - return genericsSuccess(this.textClassificationService.getTextClassificationDetail(id)); - } - - @DeleteMapping("{id}") - @ApiOperation("删除文本分类") - public GenericsAjaxResult deleteTextClassification(@PathVariable("id") Long id) { - return genericsSuccess(this.textClassificationService.delete(id)); - } - - @PostMapping("/run/{id}") - @ApiOperation("运行文本分类") - public GenericsAjaxResult runTextClassification(@PathVariable("id") Long id) throws Exception { - return genericsSuccess(this.textClassificationService.runTextClassificationIns(id)); - } -} diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/textClassfication/TextClassificationInsController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/textClassfication/TextClassificationInsController.java deleted file mode 100644 index 9c6c7692..00000000 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/textClassfication/TextClassificationInsController.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.ruoyi.platform.controller.textClassfication; - -import com.ruoyi.common.core.web.controller.BaseController; -import com.ruoyi.common.core.web.domain.GenericsAjaxResult; -import com.ruoyi.platform.domain.TextClassificationIns; -import com.ruoyi.platform.service.TextClassificationInsService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.*; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; - -import javax.annotation.Resource; -import java.util.List; - -@RestController -@RequestMapping("textClassificationIns") -@Api("文本分类实验实例") -public class TextClassificationInsController extends BaseController { - @Resource - private TextClassificationInsService textClassificationInsService; - - @GetMapping - @ApiOperation("分页查询") - public GenericsAjaxResult> queryByPage(TextClassificationIns textClassificationIns, int page, int size){ - PageRequest pageRequest = PageRequest.of(page, size); - return genericsSuccess(this.textClassificationInsService.queryByPage(textClassificationIns, pageRequest)); - } - - @PostMapping - @ApiOperation("新增实验实例") - public GenericsAjaxResult add(@RequestBody TextClassificationIns textClassificationIns) { - return genericsSuccess(this.textClassificationInsService.insert(textClassificationIns)); - } - - @DeleteMapping("{id}") - @ApiOperation("删除实验实例") - public GenericsAjaxResult deleteById(@PathVariable("id") Long id) { - return genericsSuccess(this.textClassificationInsService.removeById(id)); - } - - @DeleteMapping("batchDelete") - @ApiOperation("批量删除实验实例") - public GenericsAjaxResult batchDelete(@RequestBody List ids) { - return genericsSuccess(this.textClassificationInsService.batchDelete(ids)); - } - - @PutMapping("{id}") - @ApiOperation("终止实验实例") - public GenericsAjaxResult terminateTextClassificationIns(@PathVariable("id") Long id) throws Exception { - return genericsSuccess(this.textClassificationInsService.terminateTextClassificationIns(id)); - } - - @GetMapping("{id}") - @ApiOperation("查看实验实例详情") - public GenericsAjaxResult getDetailById(@PathVariable("id") Long id) { - return genericsSuccess(this.textClassificationInsService.getDetailById(id)); - } -} diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/TextClassification.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/TextClassification.java deleted file mode 100644 index 199928b5..00000000 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/TextClassification.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.ruoyi.platform.domain; - -import com.fasterxml.jackson.databind.PropertyNamingStrategy; -import com.fasterxml.jackson.databind.annotation.JsonNaming; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; - -@Data -@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) -@ApiModel(description = "文本分类") -public class TextClassification { - private Long id; - - @ApiModelProperty(value = "实验名称") - private String name; - - @ApiModelProperty(value = "实验描述") - private String description; - - @ApiModelProperty(value = "模型类型:TextCNN, TextRNN, FastText, TextRCNN, TextRNN_Att, DPCNN, Transformer") - private String modelType; - - @ApiModelProperty(value = "数据集") - private String dataset; - - private Integer computingResourceId; - - @ApiModelProperty(value = "epochs") - private Integer epochs; - - @ApiModelProperty(value = "batch_size") - private Integer batchSize; - - @ApiModelProperty(value = "学习率") - private Float lr; - - private String createBy; - - private String updateBy; - - private Date createTime; - - private Date updateTime; - - private Integer state; - - @ApiModelProperty(value = "状态列表") - private String statusList; -} diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/TextClassificationIns.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/TextClassificationIns.java deleted file mode 100644 index 09c43f25..00000000 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/TextClassificationIns.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ruoyi.platform.domain; - -import com.fasterxml.jackson.databind.PropertyNamingStrategy; -import com.fasterxml.jackson.databind.annotation.JsonNaming; -import io.swagger.annotations.ApiModel; -import lombok.Data; - -import java.util.Date; - -@Data -@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) -@ApiModel(description = "文本分类实验实例") -public class TextClassificationIns { - private Long id; - - private Long textClassificationId; - - private Integer state; - - private String status; - - private String param; - - private Date createTime; - - private Date updateTime; - - private Date finishTime; - - private String argoInsName; - - private String argoInsNs; - - private String resultPath; - - private String ModelPath; - - private String nodeStatus; - - private String nodeResult; -} diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/TextClassificationDao.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/TextClassificationDao.java deleted file mode 100644 index f69f248b..00000000 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/TextClassificationDao.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.ruoyi.platform.mapper; - -import com.ruoyi.platform.domain.TextClassification; -import org.apache.ibatis.annotations.Param; -import org.springframework.data.domain.Pageable; - -import java.util.List; - -public interface TextClassificationDao { - long count(@Param("name") String name); - - List queryByPage(@Param("name") String name, @Param("pageable") Pageable pageable); - - TextClassification getByName(@Param("name") String name); - - TextClassification getById(@Param("id") Long id); - - int save(@Param("textClassification") TextClassification textClassification); - - int edit(@Param("textClassification") TextClassification textClassification); - - List queryByDatasetId(@Param("datasetId") String datasetId); -} diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/TextClassificationInsDao.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/TextClassificationInsDao.java deleted file mode 100644 index 3bc16cd2..00000000 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/TextClassificationInsDao.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.ruoyi.platform.mapper; - -import com.ruoyi.platform.domain.TextClassificationIns; -import org.apache.ibatis.annotations.Param; -import org.springframework.data.domain.Pageable; - -import java.util.List; - -public interface TextClassificationInsDao { - long count(@Param("textClassificationIns") TextClassificationIns textClassificationIns); - - List queryAllByLimit(@Param("textClassificationIns") TextClassificationIns textClassificationIns, @Param("pageable") Pageable pageable); - - List getByTextClassificationId(@Param("textClassificationId") Long textClassificationId); - - TextClassificationIns queryById(@Param("id") Long id); - - int insert(@Param("textClassificationIns") TextClassificationIns textClassificationIns); - - int update(@Param("textClassificationIns") TextClassificationIns textClassificationIns); - - List queryByNotTerminated(); -} diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/TextClassificationInsTask.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/TextClassificationInsTask.java deleted file mode 100644 index 5499c868..00000000 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/TextClassificationInsTask.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.ruoyi.platform.scheduling; - -import com.ruoyi.platform.domain.TextClassification; -import com.ruoyi.platform.domain.TextClassificationIns; -import com.ruoyi.platform.mapper.ResourceOccupyDao; -import com.ruoyi.platform.mapper.TextClassificationDao; -import com.ruoyi.platform.mapper.TextClassificationInsDao; -import com.ruoyi.platform.service.ResourceOccupyService; -import com.ruoyi.platform.service.TextClassificationInsService; -import com.ruoyi.system.api.constant.Constant; -import org.apache.commons.lang3.StringUtils; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -@Component() -public class TextClassificationInsTask { - @Resource - private TextClassificationInsService textClassificationInsService; - @Resource - private TextClassificationInsDao textClassificationInsDao; - @Resource - private TextClassificationDao textClassificationDao; - @Resource - private ResourceOccupyDao resourceOccupyDao; - @Resource - private ResourceOccupyService resourceOccupyService; - - private List textClassificationIds = new ArrayList<>(); - - @Scheduled(cron = "0/30 * * * * ?") // 每30S执行一次 - public void executeTextClassificationInsStatus() { - // 首先查到所有非终止态的实验实例 - List insList = textClassificationInsService.queryByNotTerminated(); - - // 去argo查询状态 - List updateList = new ArrayList<>(); - if (insList != null && insList.size() > 0) { - for (TextClassificationIns ins : insList) { - //当原本状态为null或非终止态时才调用argo接口 - try { - Long userId = resourceOccupyDao.getResourceOccupyByTask(Constant.TaskType_TextClassification, ins.getTextClassificationId(), ins.getId(), null).get(0).getUserId(); - if (resourceOccupyDao.getUserCredit(userId) <= 0) { - ins.setStatus(Constant.Failed); - textClassificationInsService.terminateTextClassificationIns(ins.getId()); - } else { - ins = textClassificationInsService.queryStatusFromArgo(ins); - // 扣除积分 - if (Constant.Running.equals(ins.getStatus())) { - resourceOccupyService.deducing(Constant.TaskType_TextClassification, null, ins.getId(), null, null); - } else if (Constant.Failed.equals(ins.getStatus()) || Constant.Terminated.equals(ins.getStatus()) - || Constant.Succeeded.equals(ins.getStatus())) { - resourceOccupyService.endDeduce(Constant.TaskType_TextClassification, null, ins.getId(), null, null); - } - } - } catch (Exception e) { - ins.setStatus(Constant.Failed); - // 结束扣除积分 - resourceOccupyService.endDeduce(Constant.TaskType_TextClassification, null, ins.getId(), null, null); - } - // 线程安全的添加操作 - synchronized (textClassificationIds) { - textClassificationIds.add(ins.getTextClassificationId()); - } - updateList.add(ins); - } - if (updateList.size() > 0) { - for (TextClassificationIns ins : updateList) { - textClassificationInsDao.update(ins); - } - } - } - } - - @Scheduled(cron = "0/30 * * * * ?") // / 每30S执行一次 - public void executeTextClassificationStatus() { - if (textClassificationIds.size() == 0) { - return; - } - // 存储需要更新的实验对象列表 - List updateTextClassifications = new ArrayList<>(); - for (Long textClassificationId : textClassificationIds) { - // 获取当前实验的所有实例列表 - List insList = textClassificationInsDao.getByTextClassificationId(textClassificationId); - List statusList = new ArrayList<>(); - // 更新实验状态列表 - for (int i = 0; i < insList.size(); i++) { - statusList.add(insList.get(i).getStatus()); - } - String subStatus = statusList.toString().substring(1, statusList.toString().length() - 1); - TextClassification textClassification = textClassificationDao.getById(textClassificationId); - if (!StringUtils.equals(textClassification.getStatusList(), subStatus)) { - textClassification.setStatusList(subStatus); - updateTextClassifications.add(textClassification); - textClassificationDao.edit(textClassification); - } - } - - if (!updateTextClassifications.isEmpty()) { - // 使用Iterator进行安全的删除操作 - Iterator iterator = textClassificationIds.iterator(); - while (iterator.hasNext()) { - Long textClassificationId = iterator.next(); - for (TextClassification textClassification : updateTextClassifications) { - if (textClassification.getId().equals(textClassificationId)) { - iterator.remove(); - } - } - } - } - } -} diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/TextClassificationInsService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/TextClassificationInsService.java deleted file mode 100644 index d8ffdae8..00000000 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/TextClassificationInsService.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.ruoyi.platform.service; - -import com.ruoyi.platform.domain.TextClassificationIns; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; - -import java.util.List; - -public interface TextClassificationInsService { - Page queryByPage(TextClassificationIns textClassificationIns, PageRequest pageRequest); - - TextClassificationIns insert(TextClassificationIns textClassificationIns); - - String removeById(Long id); - - String batchDelete(List ids); - - boolean terminateTextClassificationIns(Long id) throws Exception; - - TextClassificationIns getDetailById(Long id); - - List queryByNotTerminated(); - - TextClassificationIns queryStatusFromArgo(TextClassificationIns textClassificationIns); - - void updateTextClassificationStatus(Long textClassificationId); -} diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/TextClassificationService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/TextClassificationService.java deleted file mode 100644 index 1bf95f34..00000000 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/TextClassificationService.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.ruoyi.platform.service; - -import com.ruoyi.platform.domain.TextClassification; -import com.ruoyi.platform.vo.TextClassificationVo; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; - -import java.io.IOException; - -public interface TextClassificationService { - Page queryByPage(String name, PageRequest pageRequest); - - TextClassification save(TextClassificationVo textClassificationVo) throws Exception; - - String edit(TextClassificationVo textClassificationVo) throws Exception; - - String delete(Long id); - - TextClassificationVo getTextClassificationDetail(Long id) throws IOException; - - String runTextClassificationIns(Long id) throws Exception; -} diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/TextClassificationInsServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/TextClassificationInsServiceImpl.java deleted file mode 100644 index 72f0fea1..00000000 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/TextClassificationInsServiceImpl.java +++ /dev/null @@ -1,259 +0,0 @@ -package com.ruoyi.platform.service.impl; - -import com.ruoyi.platform.domain.TextClassification; -import com.ruoyi.platform.domain.TextClassificationIns; -import com.ruoyi.platform.mapper.TextClassificationDao; -import com.ruoyi.platform.mapper.TextClassificationInsDao; -import com.ruoyi.platform.service.ResourceOccupyService; -import com.ruoyi.platform.service.TextClassificationInsService; -import com.ruoyi.platform.utils.DateUtils; -import com.ruoyi.platform.utils.HttpUtils; -import com.ruoyi.platform.utils.JsonUtils; -import com.ruoyi.system.api.constant.Constant; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.util.*; - -@Service -public class TextClassificationInsServiceImpl implements TextClassificationInsService { - @Value("${argo.url}") - private String argoUrl; - @Value("${argo.workflowStatus}") - private String argoWorkflowStatus; - @Value("${argo.workflowTermination}") - private String argoWorkflowTermination; - - @Resource - private TextClassificationDao textClassificationDao; - @Resource - private TextClassificationInsDao textClassificationInsDao; - @Resource - private ResourceOccupyService resourceOccupyService; - - @Override - public Page queryByPage(TextClassificationIns textClassificationIns, PageRequest pageRequest) { - long total = this.textClassificationInsDao.count(textClassificationIns); - List textClassificationInsList = this.textClassificationInsDao.queryAllByLimit(textClassificationIns, pageRequest); - return new PageImpl<>(textClassificationInsList, pageRequest, total); - } - - @Override - public TextClassificationIns insert(TextClassificationIns textClassificationIns) { - this.textClassificationInsDao.insert(textClassificationIns); - return textClassificationIns; - } - - @Override - @Transactional - public String removeById(Long id) { - TextClassificationIns textClassificationIns = textClassificationInsDao.queryById(id); - if (textClassificationIns == null) { - return "实验实例不存在"; - } - if (StringUtils.isEmpty(textClassificationIns.getStatus())) { - textClassificationIns = queryStatusFromArgo(textClassificationIns); - } - if (StringUtils.equals(textClassificationIns.getStatus(), Constant.Running)) { - return "实验实例正在运行,不可删除"; - } - textClassificationIns.setState(Constant.State_invalid); - int update = textClassificationInsDao.update(textClassificationIns); - if (update > 0) { - resourceOccupyService.deleteTaskState(Constant.TaskType_TextClassification, textClassificationIns.getTextClassificationId(), id); - updateTextClassificationStatus(textClassificationIns.getTextClassificationId()); - return "删除成功"; - } else { - return "删除失败"; - } - } - - @Override - public String batchDelete(List ids) { - for (Long id : ids) { - String result = removeById(id); - if (!"删除成功".equals(result)) { - return result; - } - } - return "删除成功"; - } - - @Override - public boolean terminateTextClassificationIns(Long id) throws Exception { - TextClassificationIns textClassificationIns = textClassificationInsDao.queryById(id); - if (textClassificationIns == null) { - throw new IllegalStateException("实验实例未查询到,id: " + id); - } - String currentStatus = textClassificationIns.getStatus(); - String name = textClassificationIns.getArgoInsName(); - String namespace = textClassificationIns.getArgoInsNs(); - - // 获取当前状态,如果为空,则从Argo查询 - if (StringUtils.isEmpty(currentStatus)) { - currentStatus = queryStatusFromArgo(textClassificationIns).getStatus(); - } - // 只有状态是"Running"时才能终止实例 - if (!currentStatus.equalsIgnoreCase(Constant.Running)) { - throw new Exception("终止错误,只有运行状态的实例才能终止"); // 如果不是"Running"状态,则不执行终止操作 - } - - // 创建请求数据map - Map requestData = new HashMap<>(); - requestData.put("namespace", namespace); - requestData.put("name", name); - // 创建发送数据map,将请求数据作为"data"键的值 - Map res = new HashMap<>(); - res.put("data", requestData); - - try { - // 发送POST请求到Argo工作流状态查询接口,并将请求数据转换为JSON - String req = HttpUtils.sendPost(argoUrl + argoWorkflowTermination, null, JsonUtils.mapToJson(res)); - // 检查响应是否为空或无内容 - if (StringUtils.isEmpty(req)) { - throw new RuntimeException("终止响应内容为空"); - - } - // 将响应的JSON字符串转换为Map对象 - Map runResMap = JsonUtils.jsonToMap(req); - // 从响应Map中直接获取"errCode"的值 - Integer errCode = (Integer) runResMap.get("errCode"); - if (errCode != null && errCode == 0) { - //更新autoMlIns,确保状态更新被保存到数据库 - TextClassificationIns ins = queryStatusFromArgo(textClassificationIns); - String nodeStatus = ins.getNodeStatus(); - Map nodeMap = JsonUtils.jsonToMap(nodeStatus); - - // 遍历 map - for (Map.Entry entry : nodeMap.entrySet()) { - // 获取每个 Map 中的值并强制转换为 Map - Map innerMap = (Map) entry.getValue(); - // 检查 phase 的值 - if (innerMap.containsKey("phase")) { - String phaseValue = (String) innerMap.get("phase"); - // 如果值不等于 Succeeded,则赋值为 Failed - if (!StringUtils.equals(Constant.Succeeded, phaseValue)) { - innerMap.put("phase", Constant.Failed); - } - } - } - ins.setNodeStatus(JsonUtils.mapToJson(nodeMap)); - ins.setStatus(Constant.Terminated); - ins.setUpdateTime(new Date()); - ins.setFinishTime(new Date()); - this.textClassificationInsDao.update(ins); - updateTextClassificationStatus(textClassificationIns.getTextClassificationId()); - // 结束扣积分 - resourceOccupyService.endDeduce(Constant.TaskType_TextClassification, null, id, null, null); - return true; - } else { - return false; - } - } catch (Exception e) { - throw new RuntimeException("终止实例错误: " + e.getMessage(), e); - } - } - - @Override - public TextClassificationIns getDetailById(Long id) { - TextClassificationIns textClassificationIns = textClassificationInsDao.queryById(id); - if (Constant.Running.equals(textClassificationIns.getStatus()) || Constant.Pending.equals(textClassificationIns.getStatus())) { - textClassificationIns = queryStatusFromArgo(textClassificationIns); - } - return textClassificationIns; - } - - @Override - public List queryByNotTerminated() { - return textClassificationInsDao.queryByNotTerminated(); - } - - @Override - public TextClassificationIns queryStatusFromArgo(TextClassificationIns ins) { - String namespace = ins.getArgoInsNs(); - String name = ins.getArgoInsName(); - - // 创建请求数据map - Map requestData = new HashMap<>(); - requestData.put("namespace", namespace); - requestData.put("name", name); - - // 创建发送数据map,将请求数据作为"data"键的值 - Map res = new HashMap<>(); - res.put("data", requestData); - - try { - // 发送POST请求到Argo工作流状态查询接口,并将请求数据转换为JSON - String req = HttpUtils.sendPost(argoUrl + argoWorkflowStatus, null, JsonUtils.mapToJson(res)); - // 检查响应是否为空或无内容 - if (req == null || StringUtils.isEmpty(req)) { - throw new RuntimeException("工作流状态响应为空"); - } - // 将响应的JSON字符串转换为Map对象 - Map runResMap = JsonUtils.jsonToMap(req); - // 从响应Map中获取"data"部分 - Map data = (Map) runResMap.get("data"); - if (data == null || data.isEmpty()) { - throw new RuntimeException("工作流数据为空"); - } - // 从"data"中获取"status"部分,并返回"phase"的值 - Map status = (Map) data.get("status"); - if (status == null || status.isEmpty()) { - throw new RuntimeException("工作流状态为空"); - } - //解析流水线结束时间 - String finishedAtString = (String) status.get("finishedAt"); - if (finishedAtString != null && !finishedAtString.isEmpty()) { - Date finishTime = DateUtils.convertUTCtoShanghaiDate(finishedAtString); - ins.setFinishTime(finishTime); - } - // 解析nodes字段,提取节点状态并转换为JSON字符串 - Map nodes = (Map) status.get("nodes"); - Map modifiedNodes = new LinkedHashMap<>(); - if (nodes != null) { - for (Map.Entry nodeEntry : nodes.entrySet()) { - Map nodeDetails = (Map) nodeEntry.getValue(); - String templateName = (String) nodeDetails.get("displayName"); - modifiedNodes.put(templateName, nodeDetails); - } - } - - String nodeStatusJson = JsonUtils.mapToJson(modifiedNodes); - ins.setNodeStatus(nodeStatusJson); - - //终止态为终止不改 - if (!StringUtils.equals(ins.getStatus(), Constant.Terminated)) { - ins.setStatus(StringUtils.isNotEmpty((String) status.get("phase")) ? (String) status.get("phase") : Constant.Pending); - } - if (StringUtils.equals(ins.getStatus(), Constant.Error)) { - ins.setStatus(Constant.Failed); - } - return ins; - } catch (Exception e) { - throw new RuntimeException("查询状态失败: " + e.getMessage(), e); - } - } - - @Override - public void updateTextClassificationStatus(Long textClassificationId) { - List insList = textClassificationInsDao.getByTextClassificationId(textClassificationId); - List statusList = new ArrayList<>(); - // 更新实验状态列表 - for (int i = 0; i < insList.size(); i++) { - statusList.add(insList.get(i).getStatus()); - } - String subStatus = statusList.toString().substring(1, statusList.toString().length() - 1); - TextClassification textClassification = textClassificationDao.getById(textClassificationId); - - if (!StringUtils.equals(textClassification.getStatusList(), subStatus)) { - textClassification.setStatusList(subStatus); - textClassificationDao.edit(textClassification); - } - } -} diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/TextClassificationServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/TextClassificationServiceImpl.java deleted file mode 100644 index 30fa6e10..00000000 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/TextClassificationServiceImpl.java +++ /dev/null @@ -1,191 +0,0 @@ -package com.ruoyi.platform.service.impl; - -import com.ruoyi.common.security.utils.SecurityUtils; -import com.ruoyi.platform.domain.TextClassification; -import com.ruoyi.platform.domain.TextClassificationIns; -import com.ruoyi.platform.mapper.TextClassificationDao; -import com.ruoyi.platform.mapper.TextClassificationInsDao; -import com.ruoyi.platform.service.ResourceOccupyService; -import com.ruoyi.platform.service.TextClassificationInsService; -import com.ruoyi.platform.service.TextClassificationService; -import com.ruoyi.platform.utils.HttpUtils; -import com.ruoyi.platform.utils.JacksonUtil; -import com.ruoyi.platform.utils.JsonUtils; -import com.ruoyi.platform.vo.TextClassificationParamVo; -import com.ruoyi.platform.vo.TextClassificationVo; -import com.ruoyi.system.api.constant.Constant; -import org.apache.commons.collections4.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -public class TextClassificationServiceImpl implements TextClassificationService { - @Value("${git.localPath}") - String localPath; - @Value("${argo.url}") - private String argoUrl; - @Value("${argo.convertTextClassification}") - String convertTextClassification; - @Value("${argo.workflowRun}") - private String argoWorkflowRun; - @Value("${minio.endpointIp}") - private String minioEndpoint; - - @Resource - private TextClassificationDao textClassificationDao; - @Resource - private TextClassificationInsDao textClassificationInsDao; - @Resource - private TextClassificationInsService textClassificationInsService; - @Resource - private ResourceOccupyService resourceOccupyService; - - @Override - public Page queryByPage(String name, PageRequest pageRequest) { - long total = textClassificationDao.count(name); - List textClassifications = textClassificationDao.queryByPage(name, pageRequest); - return new PageImpl<>(textClassifications, pageRequest, total); - } - - @Override - public TextClassification save(TextClassificationVo textClassificationVo) throws Exception { - if (textClassificationVo.getName().length() >= 64) { - throw new RuntimeException("实验名称大于最大长度"); - } - TextClassification textClassificationByName = textClassificationDao.getByName(textClassificationVo.getName()); - if (textClassificationByName != null) { - throw new RuntimeException("实验名称已存在"); - } - TextClassification textClassification = new TextClassification(); - BeanUtils.copyProperties(textClassificationVo, textClassification); - String username = SecurityUtils.getLoginUser().getUsername(); - textClassification.setCreateBy(username); - textClassification.setUpdateBy(username); - String datasetJson = JacksonUtil.toJSONString(textClassificationVo.getDataset()); - textClassification.setDataset(datasetJson); - textClassificationDao.save(textClassification); - return textClassification; - } - - @Override - public String edit(TextClassificationVo textClassificationVo) throws Exception { - TextClassification oldTextClassification = textClassificationDao.getByName(textClassificationVo.getName()); - if (oldTextClassification != null && !oldTextClassification.getId().equals(textClassificationVo.getId())) { - throw new RuntimeException("实验名称已存在"); - } - TextClassification textClassification = new TextClassification(); - BeanUtils.copyProperties(textClassificationVo, textClassification); - String username = SecurityUtils.getLoginUser().getUsername(); - textClassification.setUpdateBy(username); - String datasetJson = JacksonUtil.toJSONString(textClassificationVo.getDataset()); - textClassification.setDataset(datasetJson); - - textClassificationDao.edit(textClassification); - return "修改成功"; - } - - @Override - @Transactional - public String delete(Long id) { - TextClassification textClassification = textClassificationDao.getById(id); - if (textClassification == null) { - throw new RuntimeException("实验不存在"); - } - String username = SecurityUtils.getLoginUser().getUsername(); - String createBy = textClassification.getCreateBy(); - if (!(StringUtils.equals(username, "admin") || StringUtils.equals(username, createBy))) { - throw new RuntimeException("无权限删除该实验"); - } - textClassification.setState(Constant.State_invalid); - resourceOccupyService.deleteTaskState(Constant.TaskType_TextClassification, id, null); - return textClassificationDao.edit(textClassification) > 0 ? "删除成功" : "删除失败"; - } - - @Override - public TextClassificationVo getTextClassificationDetail(Long id) throws IOException { - TextClassification textClassification = textClassificationDao.getById(id); - TextClassificationVo textClassificationVo = new TextClassificationVo(); - BeanUtils.copyProperties(textClassification, textClassificationVo); - if (StringUtils.isNotEmpty(textClassification.getDataset())) { - textClassificationVo.setDataset(JsonUtils.jsonToMap(textClassification.getDataset())); - } - return textClassificationVo; - } - - @Override - public String runTextClassificationIns(Long id) throws Exception { - TextClassification textClassification = textClassificationDao.getById(id); - if (textClassification == null) { - throw new Exception("文本分类配置不存在"); - } - - // 记录开始扣积分 - if (resourceOccupyService.haveResource(textClassification.getComputingResourceId(), 1)) { - TextClassificationParamVo paramVo = new TextClassificationParamVo(); - BeanUtils.copyProperties(textClassification, paramVo); - paramVo.setDataset(JsonUtils.jsonToMap(textClassification.getDataset())); - String param = JsonUtils.objectToJson(paramVo); - // 调argo转换接口 - try { - String convertRes = HttpUtils.sendPost(argoUrl + convertTextClassification, param); - if (convertRes == null || StringUtils.isEmpty(convertRes)) { - throw new RuntimeException("转换流水线失败"); - } - Map converMap = JsonUtils.jsonToMap(convertRes); - // 组装运行接口json - Map output = (Map) converMap.get("output"); - Map runReqMap = new HashMap<>(); - runReqMap.put("data", converMap.get("data")); - // 调argo运行接口 - String runRes = HttpUtils.sendPost(argoUrl + argoWorkflowRun, JsonUtils.mapToJson(runReqMap)); - - if (runRes == null || StringUtils.isEmpty(runRes)) { - throw new RuntimeException("运行流水线失败"); - } - Map runResMap = JsonUtils.jsonToMap(runRes); - Map data = (Map) runResMap.get("data"); - //判断data为空 - if (data == null || MapUtils.isEmpty(data)) { - throw new RuntimeException("运行流水线失败"); - } - Map metadata = (Map) data.get("metadata"); - // 插入记录到实验实例表 - TextClassificationIns textClassificationIns = new TextClassificationIns(); - textClassificationIns.setTextClassificationId(id); - textClassificationIns.setArgoInsNs((String) metadata.get("namespace")); - textClassificationIns.setArgoInsName((String) metadata.get("name")); - textClassificationIns.setParam(param); - textClassificationIns.setStatus(Constant.Pending); - //替换argoInsName - String outputString = JsonUtils.mapToJson(output); - textClassificationIns.setNodeResult(outputString.replace("{{workflow.name}}", (String) metadata.get("name"))); - - Map param_output = (Map) output.get("param_output"); - List output1 = (ArrayList) param_output.values().toArray()[0]; - Map output2 = (Map) output1.get(0); - String outputPath = minioEndpoint + "/" + output2.get("path").replace("{{workflow.name}}", (String) metadata.get("name")) + "/"; - textClassificationIns.setModelPath(outputPath + "/saved_dict/" + textClassification.getModelType() + ".ckpt"); - textClassificationInsDao.insert(textClassificationIns); - textClassificationInsService.updateTextClassificationStatus(id); - // 记录开始扣除积分 - resourceOccupyService.startDeduce(textClassification.getComputingResourceId(), 1, Constant.TaskType_TextClassification, id, textClassificationIns.getId(), null, textClassification.getName(), null, null); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - return "执行成功"; - } -} diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/TextClassificationVo.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/TextClassificationVo.java deleted file mode 100644 index 517375bb..00000000 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/TextClassificationVo.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.ruoyi.platform.vo; - -import com.fasterxml.jackson.databind.PropertyNamingStrategy; -import com.fasterxml.jackson.databind.annotation.JsonNaming; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; -import java.util.Map; - -@Data -@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) -@ApiModel(description = "文本分类") -public class TextClassificationVo { - private Long id; - - @ApiModelProperty(value = "实验名称") - private String name; - - @ApiModelProperty(value = "实验描述") - private String description; - - @ApiModelProperty(value = "模型") - private String modelType; - - @ApiModelProperty(value = "数据集") - private Map dataset; - - @ApiModelProperty(value = "epochs") - private Integer epochs; - - @ApiModelProperty(value = "batch_size") - private Integer batchSize; - - @ApiModelProperty(value = "学习率") - private Float lr; - - private String createBy; - - private String updateBy; - - private Date createTime; - - private Date updateTime; - - private Integer state; - - @ApiModelProperty(value = "状态列表") - private String statusList; -} diff --git a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/TextClassificationDaoMapper.xml b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/TextClassificationDaoMapper.xml deleted file mode 100644 index faaec8aa..00000000 --- a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/TextClassificationDaoMapper.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - insert into text_classification(name, description, model_type, dataset, epochs, batch_size, lr, create_by, update_by, computing_resource_id) - values (#{textClassification.name}, #{textClassification.description}, #{textClassification.modelType}, - #{textClassification.dataset}, #{textClassification.epochs}, #{textClassification.batchSize}, - #{textClassification.lr}, #{textClassification.createBy}, #{textClassification.updateBy}, #{textClassification.computingResourceId}) - - - - update text_classification - - - name = #{textClassification.name}, - - - description = #{textClassification.description}, - - - model_type = #{textClassification.modelType}, - - - dataset = #{textClassification.dataset}, - - - computing_resource_id = #{textClassification.computingResourceId}, - - - epochs = #{textClassification.epochs}, - - - batch_size = #{textClassification.batchSize}, - - - lr = #{textClassification.lr}, - - - update_by = #{textClassification.updateBy}, - - - status_list = #{textClassification.statusList}, - - - state = #{textClassification.state}, - - - where id = #{textClassification.id} - - - - - - - state = 1 - - and name like concat('%', #{name}, '%') - - - - \ No newline at end of file diff --git a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/TextClassificationInsDaoMapper.xml b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/TextClassificationInsDaoMapper.xml deleted file mode 100644 index 79254f76..00000000 --- a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/TextClassificationInsDaoMapper.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - insert into text_classification_ins(text_classification_id, status, param, argo_ins_name, argo_ins_ns, - node_status, node_result) - values (#{textClassificationIns.textClassificationId}, #{textClassificationIns.status}, - #{textClassificationIns.param}, #{textClassificationIns.argoInsName}, - #{textClassificationIns.argoInsNs}, #{textClassificationIns.nodeStatus}, - #{textClassificationIns.nodeResult}) - - - - update text_classification_ins - - - model_path = #{autoMlIns.modelPath}, - - - result_path = #{autoMlIns.resultPath}, - - - status = #{autoMlIns.status}, - - - node_status = #{autoMlIns.nodeStatus}, - - - node_result = #{autoMlIns.nodeResult}, - - - state = #{autoMlIns.state}, - - - update_time = #{autoMlIns.updateTime}, - - - finish_time = #{autoMlIns.finishTime}, - - - where id = #{textClassificationIns.id} - - - - \ No newline at end of file