Browse Source

预测任务获取数据

刘桐 2 weeks ago
parent
commit
97f7e3f637

+ 43 - 21
xvji-admin/src/main/java/com/xvji/domain/Component.java

@@ -1,52 +1,52 @@
 package com.xvji.domain;
 
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.TypeReference;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.Data;
-import java.util.Map;
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 
+import java.util.Map;
 
 /**
  * 组件表实体类(对应component表)
+ * 统一使用Jackson处理JSON
  */
 @TableName("component")
 @Data
 public class Component {
     /**
-     * 组件ID
+     * 组件ID(自增主键)
      */
     @TableId(type = IdType.AUTO)
     private Long componentId;
 
     /**
-     * 任务ID:关联训练/预测任务表
+     * 任务ID:关联训练任务表(t_task_id)或预测任务表(p_task_id)
      */
     private Long taskId;
 
     /**
-     * 任务类型:0-训练任务,1-预测任务
+     * 任务类型:0-训练任务,1-预测任务(区分组件归属)
      */
     private Integer taskType;
 
     /**
-     * 组件类型(如数据获取)
+     * 组件类型
      */
     private String componentType;
 
     /**
-     * 参数:包含多对键值对的JSON对象
+     * 组件参数
+     * @JsonIgnore:序列化时忽略该字段,避免返回字符串格式的params
      */
-    @TableField(value = "PARAMS", typeHandler = JacksonTypeHandler.class)
     @JsonIgnore
-    private String params;  // 用String存储JSON字符串,兼容所有JSON格式
+    @TableField("PARAMS") // 明确对应数据库的PARAMS字段(避免字段名映射错误)
+    private String params;
 
     /**
      * 接口地址
@@ -54,31 +54,53 @@ public class Component {
     private String interfaceUrl;
 
     /**
-     * 是否启用:true-启用,false-禁用
-     * 对应数据库TINYINT(1)类型
+     * 是否启用:true启用,false禁用
      */
-    @TableField("IS_ENABLE")  // 指定数据库字段名,与表结构保持一致
+    @TableField("IS_ENABLE")
     private Boolean isEnable;
 
     /**
-     * 给前端返回的参数Map(JSON对象格式)
+     * Jackson对象映射器 全局单例模式 避免重复创建实例
+     */
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+    /**
+     * 将数据库的JSON字符串转为Map,序列化时字段名为"params"
+     * @return Map<String, Object> 组件参数键值对(JSON对象格式)
      */
-    @JsonProperty("params")  // 序列化时使用"params"作为字段名
+    @JsonProperty("params")
     public Map<String, Object> getParamsMap() {
+        // 处理空值:params为null或空字符串时返回null
         if (params == null || params.trim().isEmpty()) {
             return null;
         }
-        return JSON.parseObject(params, new TypeReference<Map<String, Object>>() {});
+        try {
+            // 用Jackson解析JSON字符串为Map
+            return OBJECT_MAPPER.readValue(params, new TypeReference<Map<String, Object>>() {});
+        } catch (Exception e) {
+            // 解析失败时打印日志
+            e.printStackTrace();
+            return null;
+        }
     }
 
     /**
-     * 设置参数Map(自动转换为JSON字符串存储)
+     * 将Map转为JSON字符串,存入数据库的PARAMS字段
+     * @param paramsMap 组件参数键值对
      */
     public void setParamsMap(Map<String, Object> paramsMap) {
+        // 当paramsMap为空时,数据库存储null
         if (paramsMap == null || paramsMap.isEmpty()) {
             this.params = null;
             return;
         }
-        this.params = JSON.toJSONString(paramsMap);
+        try {
+            // 用Jackson将Map转为JSON字符串
+            this.params = OBJECT_MAPPER.writeValueAsString(paramsMap);
+        } catch (Exception e) {
+            // 序列化失败时打印日志,数据库存储null
+            e.printStackTrace();
+            this.params = null;
+        }
     }
-}
+}

+ 1 - 1
xvji-admin/src/main/java/com/xvji/domain/vo/PredictTaskVO.java

@@ -6,7 +6,7 @@ import lombok.Data;
 import java.util.List;
 
 /**
- * 预测任务VO,用于前端展示(包含关联的组件信息)
+ * 预测任务VO,用于前端展示
  */
 @Data
 public class PredictTaskVO extends PredictTask {

+ 62 - 0
xvji-admin/src/main/java/com/xvji/web/controller/PredictTaskController.java

@@ -1,8 +1,11 @@
 package com.xvji.web.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.xvji.common.core.domain.AjaxResult;
 import com.xvji.domain.Component;
 import com.xvji.domain.PredictTask;
+import com.xvji.domain.vo.PageResult;
+import com.xvji.domain.vo.PredictTaskVO;
 import com.xvji.mapper.PredictTaskMapper;
 import com.xvji.service.ComponentService;
 import com.xvji.service.PredictTaskService;
@@ -10,11 +13,16 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.BeanUtils;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/task/predict")
@@ -163,6 +171,60 @@ public class PredictTaskController {
         }
     }
 
+    /**
+     * 分页查询预测任务及关联组件信息
+     * @param pageNum 页码(默认1)
+     * @param pageSize 每页条数(默认10)
+     * @param taskName 任务名称(可选,用于模糊查询)
+     */
+    @GetMapping("/queryTasks")
+    public AjaxResult queryPredictTasks(
+            @RequestParam(defaultValue = "1") int pageNum,
+            @RequestParam(defaultValue = "10") int pageSize,
+            @RequestParam(required = false) String taskName) {
+
+        try {
+            Page<PredictTask> page = new Page<>(pageNum, pageSize);
+            QueryWrapper<PredictTask> queryWrapper = new QueryWrapper<>();
+            if (StringUtils.hasText(taskName)) {
+                queryWrapper.like("P_TASK_NAME", taskName); // 预测任务名称字段
+            }
+            //按创建时间降序排序
+            queryWrapper.orderByDesc("P_CREATE_TIME");
+
+            //执行分页查询
+            Page<PredictTask> taskPage = predictTaskService.page(page, queryWrapper);
+
+            List<PredictTaskVO> taskVOList = taskPage.getRecords().stream().map(task -> {
+                PredictTaskVO vo = new PredictTaskVO();
+                BeanUtils.copyProperties(task, vo); // 复制基本属性
+
+                String componentIds = task.getPComponentIds(); // 预测任务的组件ID字段
+                if (StringUtils.hasText(componentIds)) {
+                    List<Long> ids = Arrays.stream(componentIds.split(","))
+                            .map(Long::parseLong)
+                            .collect(Collectors.toList());
+                    List<Component> components = componentService.listByIds(ids);
+                    vo.setComponents(components); // 设置关联的组件列表
+                }
+                return vo;
+            }).collect(Collectors.toList());
+
+            // 5. 封装分页结果
+            PageResult<PredictTaskVO> result = new PageResult<>(
+                    taskPage.getTotal(),    // 总记录数
+                    pageNum,                // 当前页码
+                    pageSize,               // 每页条数
+                    taskVOList              // 分页数据列表
+            );
+
+            return AjaxResult.success(result);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return AjaxResult.error("查询预测任务失败:" + e.getMessage());
+        }
+    }
+
     ////////////////////////////////////////// 辅助方法 //////////////////////////////////////////////////////////////////////
 
     /**

+ 0 - 1
xvji-admin/src/main/java/com/xvji/web/controller/TrainTaskController.java

@@ -206,7 +206,6 @@ public class TrainTaskController {
 
         try {
             Page<TrainTask> page = new Page<>(pageNum, pageSize);
-
             QueryWrapper<TrainTask> queryWrapper = new QueryWrapper<>();
             if (StringUtils.hasText(taskName)) {
                 queryWrapper.like("T_TASK_NAME", taskName);