فهرست منبع

//数据生成,物理模型加噪声

wyj0522 1 ماه پیش
والد
کامیت
1da1b62fa1
30فایلهای تغییر یافته به همراه868 افزوده شده و 974 حذف شده
  1. 1 1
      fdapfe-admin/src/main/java/com/cn/fdapfe/biz/controller/FaultPhysicalModelController.java
  2. 1 1
      fdapfe-admin/src/main/java/com/cn/fdapfe/biz/controller/ModelDataGenController.java
  3. 6 6
      fdapfe-admin/src/main/java/com/cn/fdapfe/biz/domain/ModelDataGen.java
  4. 2 0
      fdapfe-admin/src/main/java/com/cn/fdapfe/biz/mapper/ModelDataGenMapper.java
  5. 1 1
      fdapfe-admin/src/main/java/com/cn/fdapfe/biz/service/IModelDataGenService.java
  6. 45 32
      fdapfe-admin/src/main/java/com/cn/fdapfe/biz/service/impl/ModelDataGenServiceImpl.java
  7. 463 52
      fdapfe-admin/src/main/java/com/cn/fdapfe/web/controller/monitor/CacheController.java
  8. 3 0
      fdapfe-ui/package.json
  9. 1 1
      fdapfe-ui/src/api/dataGen/phyModel.js
  10. BIN
      fdapfe-ui/src/assets/testImage/output1.png
  11. BIN
      fdapfe-ui/src/assets/testImage/output2.png
  12. 22 0
      fdapfe-ui/src/assets/testImage/output3.txt
  13. 12 12
      fdapfe-ui/src/layout/components/Navbar.vue
  14. 2 0
      fdapfe-ui/src/main.js
  15. 1 1
      fdapfe-ui/src/views/data/data/index.vue
  16. 27 0
      fdapfe-ui/src/views/dataConf.js
  17. 5 26
      fdapfe-ui/src/views/dataGen/form.vue
  18. 3 4
      fdapfe-ui/src/views/dataGen/index.vue
  19. 6 5
      fdapfe-ui/src/views/eval/formulas/form.vue
  20. 2 1
      fdapfe-ui/src/views/eval/formulas/index.vue
  21. 19 37
      fdapfe-ui/src/views/index.scss
  22. 34 432
      fdapfe-ui/src/views/index.vue
  23. 70 1
      fdapfe-ui/src/views/model/faultPhysical/configDataService.js
  24. 7 1
      fdapfe-ui/src/views/model/faultPhysical/form.vue
  25. 9 1
      fdapfe-ui/src/views/system/user/index.vue
  26. 35 48
      fdapfe-ui/src/views/test/ddAlgorithm/form.vue
  27. 64 47
      fdapfe-ui/src/views/test/ddAlgorithm/index.vue
  28. 2 85
      fdapfe-ui/src/views/test/perf/index.vue
  29. 19 179
      fdapfe-ui/src/views/workflow/workflow/form.vue
  30. 6 0
      fdapfe-ui/vue.config.js

+ 1 - 1
fdapfe-admin/src/main/java/com/cn/fdapfe/biz/controller/FaultPhysicalModelController.java

@@ -25,7 +25,7 @@ import com.cn.fdapfe.common.utils.poi.ExcelUtil;
 import com.cn.fdapfe.common.core.page.TableDataInfo;
 
 /**
- * 故障物理模型管理Controller
+ * 模型管理Controller
  * 
  * @author Allen
  * @date 2025-03-07

+ 1 - 1
fdapfe-admin/src/main/java/com/cn/fdapfe/biz/controller/ModelDataGenController.java

@@ -78,7 +78,7 @@ public class ModelDataGenController extends BaseController
     @PreAuthorize("@ss.hasPermi('dataGen:add')")
     @Log(title = "物理模型数据生成管理", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@RequestBody ModelDataGen modelDataGen) throws IOException {
+    public AjaxResult add(@RequestBody ModelDataGen modelDataGen) throws Exception {
         return toAjax(service.add(modelDataGen));
     }
 

+ 6 - 6
fdapfe-admin/src/main/java/com/cn/fdapfe/biz/domain/ModelDataGen.java

@@ -63,15 +63,15 @@ public class ModelDataGen extends BasePO
     private String status;
 
     /** 开始时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd")
-    @TableField(value ="start_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @TableField(value = "start_time")
     private Date startTime;
 
     /** 结束时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd")
-    @TableField(value ="end_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @TableField(value = "end_time")
     private Date endTime;
 
     @TableField(exist = false)

+ 2 - 0
fdapfe-admin/src/main/java/com/cn/fdapfe/biz/mapper/ModelDataGenMapper.java

@@ -3,6 +3,7 @@ package com.cn.fdapfe.biz.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cn.fdapfe.biz.domain.ModelDataGen;
+import org.apache.ibatis.annotations.Mapper;
 
 /**
  * 物理模型数据生成管理Mapper接口
@@ -10,6 +11,7 @@ import com.cn.fdapfe.biz.domain.ModelDataGen;
  * @author Allen
  * @date 2025-03-07
  */
+@Mapper
 public interface ModelDataGenMapper extends BaseMapper<ModelDataGen>
 {
 

+ 1 - 1
fdapfe-admin/src/main/java/com/cn/fdapfe/biz/service/IModelDataGenService.java

@@ -25,7 +25,7 @@ public interface IModelDataGenService
     /**
      * 新增物理模型数据生成管理
      */
-    int add(ModelDataGen modelDataGen) throws IOException;
+    int add(ModelDataGen modelDataGen) throws Exception;
     /**
      * 修改物理模型数据生成管理
      */

+ 45 - 32
fdapfe-admin/src/main/java/com/cn/fdapfe/biz/service/impl/ModelDataGenServiceImpl.java

@@ -1,7 +1,6 @@
 package com.cn.fdapfe.biz.service.impl;
 
 import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONArray;
 import com.cn.fdapfe.biz.domain.Data;
 import com.cn.fdapfe.biz.domain.FaultPhysicalModel;
 import com.cn.fdapfe.biz.domain.ModelDataGen;
@@ -10,13 +9,10 @@ import com.cn.fdapfe.biz.mapper.ModelDataGenMapper;
 import com.cn.fdapfe.biz.service.IDataService;
 import com.cn.fdapfe.biz.service.IModelDataGenService;
 import com.cn.fdapfe.common.core.domain.AjaxResult;
-import com.cn.fdapfe.common.exception.ServiceException;
 import com.cn.fdapfe.common.utils.DateUtils;
-import com.cn.fdapfe.common.utils.FileToJsonConverter;
 import com.cn.fdapfe.common.utils.SecurityUtils;
 import com.cn.fdapfe.common.utils.file.FileToMultipartFile;
 import com.cn.fdapfe.web.controller.common.CommonController;
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -24,7 +20,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
-import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import java.io.*;
@@ -51,7 +46,7 @@ public class ModelDataGenServiceImpl implements IModelDataGenService {
 
     // 文件路径验证正则表达式
     private static final Pattern FILE_PATH_PATTERN = Pattern.compile(
-            "^(?:[a-zA-Z]:(?:\\\\[^\\\\]*)*|/[^/]*)*(?:\\\\|/)?[^\\\\/:*?\"<>|]*$"
+            "^(?:[a-zA-Z]:[\\\\/](?:[^\\\\/:*?\"<>|]+[\\\\/])*[^\\\\/:*?\"<>|]*|/[^/:*?\"<>|]*(?:/[^/:*?\"<>|]*)*)$"
     );
 
     // 模型归属类型常量
@@ -64,14 +59,13 @@ public class ModelDataGenServiceImpl implements IModelDataGenService {
     private static final String DATA_TYPE_NOISE = "3";
 
     @Resource
-    private ModelDataGenMapper mapper;
+    private ModelDataGenMapper modelDataGenMapper;
     @Resource
     private IDataService dataService;
     @Resource
     private FaultPhysicalModelMapper faultPhysicalModelMapper;
     @Resource
     private CommonController commonController;
-
     @Value("${model.data.storage-path:D:/modelData}")
     private String storagePath;
 
@@ -79,14 +73,14 @@ public class ModelDataGenServiceImpl implements IModelDataGenService {
     public List<ModelDataGen> selectList(ModelDataGen po) {
         QueryWrapper<ModelDataGen> wrapper = buildQueryWrapper(po);
         wrapper.orderByDesc("create_time");
-        return mapper.selectList(wrapper);
+        return modelDataGenMapper.selectList(wrapper);
     }
 
     @Override
     public ModelDataGen selectOne(String id) {
         QueryWrapper<ModelDataGen> wrapper = new QueryWrapper<>();
         wrapper.lambda().eq(ModelDataGen::getDataGenId, id);
-        return mapper.selectOne(wrapper);
+        return modelDataGenMapper.selectOne(wrapper);
     }
 
     /**
@@ -118,11 +112,13 @@ public class ModelDataGenServiceImpl implements IModelDataGenService {
         }
         return targetPath.toString();
     }
-
+    /**
+     * 启动异步任务
+     */
     @Override
-    public int add(ModelDataGen po) throws IOException {
+    public int add(ModelDataGen po) throws Exception {
         FaultPhysicalModel model = faultPhysicalModelMapper.selectById(po.getModelId());
-
+//        po.setModelId(model.getModelName());
         ObjectMapper mapper = new ObjectMapper();
         LinkedHashMap[] array = mapper.readValue(po.getPostApiData(), LinkedHashMap[].class);
         for (LinkedHashMap item : array) {
@@ -132,21 +128,22 @@ public class ModelDataGenServiceImpl implements IModelDataGenService {
                     //写入配置文件信息
                     writeToTxt(item.get("inputPath").toString(),item.get("modelData").toString());
                     //启动模型开始生成
-                    startExe(item.get("exePath").toString());
+                    ExeProcessManager.startExe(item.get("exePath").toString(),true);
                     //判断是否进行加噪
                     if(item.get("isNoise").toString().equals("true")){
                         //如果加噪,根据模型id查询
                         FaultPhysicalModel noiseModel = faultPhysicalModelMapper.selectById(item.get("noiseModel").toString());
                         HashMap<String, Object> noiseMap = new HashMap<>();
                         noiseMap.put("noiseType",item.get("noiseType").toString());
-                        noiseMap.put("noiseFilePath",item.get("outputPath").toString());
+                        noiseMap.put("input_file",item.get("outputPath").toString().replace("\\", "/"));
                         //调用噪声算法进行加噪
                         sendPostRequest(noiseModel.getModelPath(),JSON.toJSONString(noiseMap));
                         //如果加噪声了数据类型就是噪声数据
                         data.setType("3");
+                    }else{
+                        data.setType("0");
                     }
                     //没有加噪声了数据类型就是物理模型数据数据
-                    data.setType("0");
                     //将文件进行备份存储
                     FileToMultipartFile file = new FileToMultipartFile(item.get("outputPath").toString(), "file");
                     AjaxResult ajaxResult = commonController.customUploadFile(file, "D:/modelData");
@@ -171,9 +168,9 @@ public class ModelDataGenServiceImpl implements IModelDataGenService {
                 //调用噪声算法进行加噪
                 sendPostRequest(noiseModel.getModelPath(),JSON.toJSONString(noiseMap));
                 //将文件进行备份存储
-                FileToMultipartFile file = new FileToMultipartFile(item.get("outputPath").toString(), "file");
+                FileToMultipartFile file = new FileToMultipartFile(item.get("input_file").toString(), "file");
+                AjaxResult ajaxResult = commonController.customUploadFile(file, "D:/modelData");
                 try {
-                    AjaxResult ajaxResult = commonController.customUploadFile(file, "D:/modelData");
                     data.setUrl(ajaxResult.get("url").toString());
                     data.setName(po.getDataGenName());
                     data.setFileName(ajaxResult.get("originalFilename").toString());
@@ -186,27 +183,36 @@ public class ModelDataGenServiceImpl implements IModelDataGenService {
                 }
             }
         }
-        return 1;
+        return modelDataGenMapper.insert(po);
     }
 
     /**
-     * 启动可执行程序
+     * 启动可执行程序,设置正确的工作目录
      */
     public static void startExe(String exePath) throws IOException, InterruptedException {
+        // 获取exe文件所在目录
+        File exeFile = new File(exePath);
+        File workingDir = exeFile.getParentFile();
+        // 打印调试信息
+        logger.info("设置工作目录为: {}", workingDir.getAbsolutePath());
         ProcessBuilder processBuilder = new ProcessBuilder(exePath);
+        // 设置工作目录为exe所在目录
+        processBuilder.directory(workingDir);
+        // 重定向错误输出到标准输出,便于调试
+        processBuilder.redirectErrorStream(true);
+        // 启动进程
         Process process = processBuilder.start();
+        // 读取进程输出
+        java.io.BufferedReader reader = new java.io.BufferedReader(
+                new java.io.InputStreamReader(process.getInputStream()));
+        String line;
+        while ((line = reader.readLine()) != null) {
+            logger.info("Exe输出: {}", line);
+        }
         int exitCode = process.waitFor();
         logger.info("程序退出码: {}", exitCode);
     }
 
-    /**
-     * 主方法,用于测试文件转JSON功能
-     */
-    public static void main(String[] args) throws IOException {
-        String filePath = "C:/Users/15138/Desktop/fea_all.mat"; // 替换为实际的文件路径
-        JSONArray jsonArray = FileToJsonConverter.convertFileToJsonArray(filePath);
-        System.out.println(jsonArray.toString());
-    }
 
     /**
      * 查找Map中的文件路径键
@@ -225,11 +231,10 @@ public class ModelDataGenServiceImpl implements IModelDataGenService {
         // 没有找到符合条件的路径参数
         throw new IllegalArgumentException("Map中未找到有效的文件路径参数");
     }
-
     /**
      * 判断字符串是否为有效的文件路径
      */
-    private boolean isValidFilePath(String path) {
+    private static boolean isValidFilePath(String path) {
         if (path != null || !path.trim().isEmpty()) {
             return FILE_PATH_PATTERN.matcher(path).matches();
         }
@@ -262,7 +267,7 @@ public class ModelDataGenServiceImpl implements IModelDataGenService {
     public int update(ModelDataGen po) {
         ModelDataGen one = selectOne(po.getDataGenId());
         setCreateInfo(po);
-        return one != null ? mapper.updateById(po) : mapper.insert(po);
+        return one != null ? modelDataGenMapper.updateById(po) : modelDataGenMapper.insert(po);
     }
 
     @Override
@@ -270,9 +275,17 @@ public class ModelDataGenServiceImpl implements IModelDataGenService {
         if (ids == null || ids.length == 0) {
             return 0;
         }
-        return ids.length == 1 ? mapper.deleteById(ids[0]) : mapper.deleteBatchIds(Arrays.asList(ids));
+        return ids.length == 1 ? modelDataGenMapper.deleteById(ids[0]) : modelDataGenMapper.deleteBatchIds(Arrays.asList(ids));
     }
 
+//    public static void main(String[] args) {
+//        http://127.0.0.1:10000/jrzs
+//        String apiUrl= "";
+//        String jsonBody = "{" +
+//               "input_file" : "D:/matlab_data/data_load/output/fea_all.mat," +
+//                "noiseType" : +
+//                "}"
+//    }
     /**
      * 发送POST请求
      */

+ 463 - 52
fdapfe-admin/src/main/java/com/cn/fdapfe/web/controller/monitor/CacheController.java

@@ -1,54 +1,58 @@
-//package com.cn.fdapfe.web.controller.monitor;
-//
-//import java.util.ArrayList;
-//import java.util.Collection;
-//import java.util.HashMap;
-//import java.util.List;
-//import java.util.Map;
-//import java.util.Properties;
-//import java.util.Set;
-//import java.util.TreeSet;
-//
-//import com.cn.fdapfe.common.core.redis.CaffeineCache;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.security.access.prepost.PreAuthorize;
-//import org.springframework.web.bind.annotation.DeleteMapping;
-//import org.springframework.web.bind.annotation.GetMapping;
-//import org.springframework.web.bind.annotation.PathVariable;
-//import org.springframework.web.bind.annotation.RequestMapping;
-//import org.springframework.web.bind.annotation.RestController;
-//import com.cn.fdapfe.common.constant.CacheConstants;
-//import com.cn.fdapfe.common.core.domain.AjaxResult;
-//import com.cn.fdapfe.common.utils.StringUtils;
-//import com.cn.fdapfe.system.domain.SysCache;
-//
-///**
-// * 缓存监控
-// *
-// * @author ruoyi
-// */
-//@RestController
-//@RequestMapping("/monitor/cache")
-//public class CacheController
-//{
+package com.cn.fdapfe.web.controller.monitor;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
+
+import com.alibaba.fastjson2.JSON;
+import com.cn.fdapfe.common.core.redis.CaffeineCache;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.cn.fdapfe.common.constant.CacheConstants;
+import com.cn.fdapfe.common.core.domain.AjaxResult;
+import com.cn.fdapfe.common.utils.StringUtils;
+import com.cn.fdapfe.system.domain.SysCache;
+
+/**
+ * 缓存监控
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/monitor/cache")
+public class CacheController
+{
 //    @Autowired
 //    private CaffeineCache caffeineCache;
-//
-//    private final static List<SysCache> caches = new ArrayList<SysCache>();
-//    {
-//        caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息"));
-//        caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息"));
-//        caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典"));
-//        caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码"));
-//        caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交"));
-//        caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理"));
-//        caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数"));
-//    }
-//
-//    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
-//    @GetMapping()
-//    public AjaxResult getInfo() throws Exception
-//    {
+//    @Autowired
+//    private RedisTemplate<String, String> redisTemplate;
+
+    private final static List<SysCache> caches = new ArrayList<SysCache>();
+    {
+        caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息"));
+        caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息"));
+        caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典"));
+        caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码"));
+        caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交"));
+        caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理"));
+        caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数"));
+    }
+
+    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
+    @GetMapping()
+    public AjaxResult getInfo() throws Exception
+    {
+
 //        Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info());
 //        Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats"));
 //        Object dbSize = redisTemplate.execute((RedisCallback<Object>) connection -> connection.dbSize());
@@ -66,8 +70,415 @@
 //            pieList.add(data);
 //        });
 //        result.put("commandStats", pieList);
-//        return AjaxResult.success(result);
-//    }
+        Object parse = JSON.parse("{\n" +
+                "  \"msg\": \"操作成功\",\n" +
+                "  \"code\": 200,\n" +
+                "  \"data\": {\n" +
+                "    \"commandStats\": [\n" +
+                "      {\n" +
+                "        \"name\": \"client|setname\",\n" +
+                "        \"value\": \"81\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"subscribe\",\n" +
+                "        \"value\": \"8\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"zadd\",\n" +
+                "        \"value\": \"2\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"module|load\",\n" +
+                "        \"value\": \"0\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"hset\",\n" +
+                "        \"value\": \"2\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"hello\",\n" +
+                "        \"value\": \"2314\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"module|loadex\",\n" +
+                "        \"value\": \"0\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"publish\",\n" +
+                "        \"value\": \"1\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"auth\",\n" +
+                "        \"value\": \"2246\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"quit\",\n" +
+                "        \"value\": \"421\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"select\",\n" +
+                "        \"value\": \"2\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"expire\",\n" +
+                "        \"value\": \"24\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"rpop\",\n" +
+                "        \"value\": \"0\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"client|list\",\n" +
+                "        \"value\": \"0\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"setex\",\n" +
+                "        \"value\": \"166\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"del\",\n" +
+                "        \"value\": \"59\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"setnx\",\n" +
+                "        \"value\": \"24\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"evalsha\",\n" +
+                "        \"value\": \"119\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"dbsize\",\n" +
+                "        \"value\": \"1\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"keys\",\n" +
+                "        \"value\": \"0\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"pttl\",\n" +
+                "        \"value\": \"85\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"exists\",\n" +
+                "        \"value\": \"42\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"hget\",\n" +
+                "        \"value\": \"16\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"waitaof\",\n" +
+                "        \"value\": \"0\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"set\",\n" +
+                "        \"value\": \"1569\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"memory|usage\",\n" +
+                "        \"value\": \"0\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"zrange\",\n" +
+                "        \"value\": \"0\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"client|setinfo\",\n" +
+                "        \"value\": \"0\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"xgroup|destroy\",\n" +
+                "        \"value\": \"0\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"zrem\",\n" +
+                "        \"value\": \"5\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"ping\",\n" +
+                "        \"value\": \"4431\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"evalsha_ro\",\n" +
+                "        \"value\": \"3\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"reset\",\n" +
+                "        \"value\": \"1\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"module|unload\",\n" +
+                "        \"value\": \"0\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"config|get\",\n" +
+                "        \"value\": \"0\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"info\",\n" +
+                "        \"value\": \"3\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"hmset\",\n" +
+                "        \"value\": \"1\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"lpop\",\n" +
+                "        \"value\": \"0\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"unlink\",\n" +
+                "        \"value\": \"0\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"pexpire\",\n" +
+                "        \"value\": \"91\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"xgroup|create\",\n" +
+                "        \"value\": \"0\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"hdel\",\n" +
+                "        \"value\": \"1\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"zpopmax\",\n" +
+                "        \"value\": \"0\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"script|load\",\n" +
+                "        \"value\": \"5\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"get\",\n" +
+                "        \"value\": \"3889\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"flushall\",\n" +
+                "        \"value\": \"0\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "        \"name\": \"zrangebyscore\",\n" +
+                "        \"value\": \"48\"\n" +
+                "      }\n" +
+                "    ],\n" +
+                "    \"info\": {\n" +
+                "      \"used_memory_dataset_perc\": \"96.35%\",\n" +
+                "      \"aof_current_rewrite_time_sec\": \"-1\",\n" +
+                "      \"used_memory_peak_perc\": \"88.35%\",\n" +
+                "      \"rss_overhead_ratio\": \"1.87\",\n" +
+                "      \"db1\": \"keys=18,expires=0,avg_ttl=0,subexpiry=0\",\n" +
+                "      \"db0\": \"keys=56,expires=1,avg_ttl=1792044,subexpiry=0\",\n" +
+                "      \"active_defrag_hits\": \"0\",\n" +
+                "      \"atomicvar_api\": \"c11-builtin\",\n" +
+                "      \"rss_overhead_bytes\": \"5558272\",\n" +
+                "      \"used_memory_vm_total\": \"89088\",\n" +
+                "      \"gcc_version\": \"12.2.0\",\n" +
+                "      \"keyspace_misses\": \"928\",\n" +
+                "      \"mem_overhead_db_hashtable_rehashing\": \"0\",\n" +
+                "      \"redis_git_dirty\": \"0\",\n" +
+                "      \"errorstat_NOAUTH\": \"count=1524\",\n" +
+                "      \"connected_clients\": \"1\",\n" +
+                "      \"master_repl_offset\": \"0\",\n" +
+                "      \"repl_backlog_active\": \"0\",\n" +
+                "      \"rdb_changes_since_last_save\": \"21\",\n" +
+                "      \"client_recent_max_output_buffer\": \"0\",\n" +
+                "      \"rejected_connections\": \"0\",\n" +
+                "      \"unexpected_error_replies\": \"0\",\n" +
+                "      \"io_threads_active\": \"0\",\n" +
+                "      \"async_loading\": \"0\",\n" +
+                "      \"mem_cluster_links\": \"0\",\n" +
+                "      \"total_blocking_keys_on_nokey\": \"0\",\n" +
+                "      \"run_id\": \"ae22af1068bfe4b5a8b304fcecd585075a4fbe6f\",\n" +
+                "      \"client_output_buffer_limit_disconnections\": \"0\",\n" +
+                "      \"maxmemory\": \"0\",\n" +
+                "      \"mem_allocator\": \"jemalloc-5.3.0\",\n" +
+                "      \"rdb_last_load_keys_loaded\": \"50\",\n" +
+                "      \"used_cpu_sys\": \"1190.874739\",\n" +
+                "      \"expired_stale_perc\": \"0.00\",\n" +
+                "      \"blocked_clients\": \"0\",\n" +
+                "      \"total_eviction_exceeded_time\": \"0\",\n" +
+                "      \"total_blocking_keys\": \"0\",\n" +
+                "      \"total_commands_processed\": \"15659\",\n" +
+                "      \"watching_clients\": \"0\",\n" +
+                "      \"current_active_defrag_time\": \"0\",\n" +
+                "      \"sync_partial_err\": \"0\",\n" +
+                "      \"current_save_keys_total\": \"0\",\n" +
+                "      \"acl_access_denied_key\": \"0\",\n" +
+                "      \"eventloop_duration_cmd_sum\": \"116208\",\n" +
+                "      \"total_connections_received\": \"4415\",\n" +
+                "      \"evicted_keys\": \"0\",\n" +
+                "      \"maxmemory_policy\": \"noeviction\",\n" +
+                "      \"used_cpu_sys_main_thread\": \"1190.867543\",\n" +
+                "      \"config_file\": \"\",\n" +
+                "      \"used_memory_human\": \"1.81M\",\n" +
+                "      \"allocator_rss_ratio\": \"1.86\",\n" +
+                "      \"connected_slaves\": \"0\",\n" +
+                "      \"role\": \"master\",\n" +
+                "      \"process_supervised\": \"no\",\n" +
+                "      \"aof_last_cow_size\": \"0\",\n" +
+                "      \"used_memory_rss_human\": \"11.38M\",\n" +
+                "      \"cluster_enabled\": \"0\",\n" +
+                "      \"total_net_repl_output_bytes\": \"0\",\n" +
+                "      \"allocator_rss_bytes\": \"2940928\",\n" +
+                "      \"mem_fragmentation_ratio\": \"6.28\",\n" +
+                "      \"used_memory_scripts\": \"6496\",\n" +
+                "      \"errorstat_NOSCRIPT\": \"count=3\",\n" +
+                "      \"repl_backlog_size\": \"1048576\",\n" +
+                "      \"current_eviction_exceeded_time\": \"0\",\n" +
+                "      \"pubsubshard_channels\": \"0\",\n" +
+                "      \"uptime_in_days\": \"21\",\n" +
+                "      \"used_memory_peak\": \"2151216\",\n" +
+                "      \"number_of_cached_scripts\": \"4\",\n" +
+                "      \"mem_fragmentation_bytes\": \"10028680\",\n" +
+                "      \"used_memory_startup\": \"946344\",\n" +
+                "      \"total_system_memory_human\": \"3.57G\",\n" +
+                "      \"number_of_functions\": \"0\",\n" +
+                "      \"hz\": \"10\",\n" +
+                "      \"used_memory_lua_human\": \"55.00K\",\n" +
+                "      \"instantaneous_input_kbps\": \"0.08\",\n" +
+                "      \"used_memory_scripts_human\": \"6.34K\",\n" +
+                "      \"rdb_bgsave_in_progress\": \"0\",\n" +
+                "      \"monotonic_clock\": \"POSIX clock_gettime\",\n" +
+                "      \"total_net_output_bytes\": \"3457554\",\n" +
+                "      \"uptime_in_seconds\": \"1832815\",\n" +
+                "      \"mem_clients_normal\": \"23424\",\n" +
+                "      \"total_forks\": \"75\",\n" +
+                "      \"eventloop_cycles\": \"18281805\",\n" +
+                "      \"evicted_clients\": \"0\",\n" +
+                "      \"slave_expires_tracked_keys\": \"0\",\n" +
+                "      \"current_fork_perc\": \"0.00\",\n" +
+                "      \"master_replid2\": \"0000000000000000000000000000000000000000\",\n" +
+                "      \"total_net_input_bytes\": \"1918463\",\n" +
+                "      \"total_net_repl_input_bytes\": \"0\",\n" +
+                "      \"current_cow_peak\": \"0\",\n" +
+                "      \"used_memory_scripts_eval\": \"6304\",\n" +
+                "      \"instantaneous_output_kbps\": \"1.40\",\n" +
+                "      \"expired_keys\": \"93\",\n" +
+                "      \"allocator_frag_ratio\": \"1.16\",\n" +
+                "      \"aof_last_write_status\": \"ok\",\n" +
+                "      \"used_memory_vm_functions\": \"32768\",\n" +
+                "      \"redis_version\": \"7.4.1\",\n" +
+                "      \"allocator_frag_bytes\": \"362232\",\n" +
+                "      \"mem_total_replication_buffers\": \"0\",\n" +
+                "      \"maxmemory_human\": \"0B\",\n" +
+                "      \"rdb_last_save_time\": \"1748342805\",\n" +
+                "      \"lazyfree_pending_objects\": \"0\",\n" +
+                "      \"aof_rewrite_scheduled\": \"0\",\n" +
+                "      \"migrate_cached_sockets\": \"0\",\n" +
+                "      \"keyspace_hits\": \"3152\",\n" +
+                "      \"instantaneous_eventloop_duration_usec\": \"269\",\n" +
+                "      \"allocator_allocated\": \"2971880\",\n" +
+                "      \"used_memory\": \"1900696\",\n" +
+                "      \"errorstat_WRONGPASS\": \"count=4075\",\n" +
+                "      \"mem_replication_backlog\": \"0\",\n" +
+                "      \"used_memory_dataset\": \"919496\",\n" +
+                "      \"rdb_saves\": \"75\",\n" +
+                "      \"pubsub_patterns\": \"0\",\n" +
+                "      \"eventloop_duration_sum\": \"4623290064\",\n" +
+                "      \"used_cpu_user_children\": \"0.048621\",\n" +
+                "      \"master_replid\": \"b1f921821ac908f6e2f1e10a83d500c1b75fa970\",\n" +
+                "      \"total_error_replies\": \"5791\",\n" +
+                "      \"mem_aof_buffer\": \"0\",\n" +
+                "      \"rdb_last_bgsave_status\": \"ok\",\n" +
+                "      \"redis_mode\": \"standalone\",\n" +
+                "      \"total_writes_processed\": \"16835\",\n" +
+                "      \"allocator_resident\": \"6369280\",\n" +
+                "      \"instantaneous_output_repl_kbps\": \"0.00\",\n" +
+                "      \"allocator_active\": \"3428352\",\n" +
+                "      \"total_active_defrag_time\": \"0\",\n" +
+                "      \"current_cow_size_age\": \"0\",\n" +
+                "      \"current_save_keys_processed\": \"0\",\n" +
+                "      \"expired_time_cap_reached_count\": \"0\",\n" +
+                "      \"sync_full\": \"0\",\n" +
+                "      \"instantaneous_input_repl_kbps\": \"0.00\",\n" +
+                "      \"rdb_current_bgsave_time_sec\": \"-1\",\n" +
+                "      \"aof_rewrite_in_progress\": \"0\",\n" +
+                "      \"multiplexing_api\": \"epoll\",\n" +
+                "      \"module_fork_in_progress\": \"0\",\n" +
+                "      \"tracking_clients\": \"0\",\n" +
+                "      \"rdb_last_cow_size\": \"995328\",\n" +
+                "      \"listener0\": \"name=tcp,bind=*,bind=-::*,port=6379\",\n" +
+                "      \"acl_access_denied_cmd\": \"0\",\n" +
+                "      \"mem_not_counted_for_evict\": \"0\",\n" +
+                "      \"total_watched_keys\": \"0\",\n" +
+                "      \"dump_payload_sanitizations\": \"0\",\n" +
+                "      \"redis_git_sha1\": \"00000000\",\n" +
+                "      \"tracking_total_keys\": \"0\",\n" +
+                "      \"maxclients\": \"10000\",\n" +
+                "      \"clients_in_timeout_table\": \"0\",\n" +
+                "      \"latest_fork_usec\": \"528\",\n" +
+                "      \"reply_buffer_expands\": \"804\",\n" +
+                "      \"instantaneous_eventloop_cycles_per_sec\": \"10\",\n" +
+                "      \"rdb_last_bgsave_time_sec\": \"0\",\n" +
+                "      \"os\": \"Linux 5.14.0-522.el9.x86_64 x86_64\",\n" +
+                "      \"allocator_muzzy\": \"0\",\n" +
+                "      \"used_cpu_sys_children\": \"0.150855\",\n" +
+                "      \"sync_partial_ok\": \"0\",\n" +
+                "      \"module_fork_last_cow_size\": \"0\",\n" +
+                "      \"arch_bits\": \"64\",\n" +
+                "      \"used_memory_vm_eval\": \"56320\",\n" +
+                "      \"used_memory_lua\": \"56320\",\n" +
+                "      \"mem_clients_slaves\": \"0\",\n" +
+                "      \"tracking_total_items\": \"0\",\n" +
+                "      \"used_cpu_user_main_thread\": \"3674.579244\",\n" +
+                "      \"lazyfreed_objects\": \"0\",\n" +
+                "      \"process_id\": \"1\",\n" +
+                "      \"errorstat_ERR\": \"count=189\",\n" +
+                "      \"tracking_total_prefixes\": \"0\",\n" +
+                "      \"total_system_memory\": \"3834646528\",\n" +
+                "      \"master_failover_state\": \"no-failover\",\n" +
+                "      \"aof_rewrites_consecutive_failures\": \"0\",\n" +
+                "      \"repl_backlog_histlen\": \"0\",\n" +
+                "      \"used_memory_vm_total_human\": \"87.00K\",\n" +
+                "      \"executable\": \"/data/redis-server\",\n" +
+                "      \"client_query_buffer_limit_disconnections\": \"0\",\n" +
+                "      \"used_memory_rss\": \"11927552\",\n" +
+                "      \"loading\": \"0\",\n" +
+                "      \"active_defrag_running\": \"0\",\n" +
+                "      \"used_memory_peak_human\": \"2.05M\",\n" +
+                "      \"reply_buffer_shrinks\": \"1748\",\n" +
+                "      \"aof_enabled\": \"0\",\n" +
+                "      \"io_threaded_reads_processed\": \"0\",\n" +
+                "      \"rdb_last_load_keys_expired\": \"0\",\n" +
+                "      \"second_repl_offset\": \"-1\",\n" +
+                "      \"total_reads_processed\": \"21141\",\n" +
+                "      \"active_defrag_misses\": \"0\",\n" +
+                "      \"configured_hz\": \"10\",\n" +
+                "      \"active_defrag_key_hits\": \"0\",\n" +
+                "      \"number_of_libraries\": \"0\",\n" +
+                "      \"used_cpu_user\": \"3674.584755\",\n" +
+                "      \"acl_access_denied_channel\": \"0\",\n" +
+                "      \"pubsub_clients\": \"0\",\n" +
+                "      \"expired_subkeys\": \"0\",\n" +
+                "      \"io_threaded_writes_processed\": \"0\",\n" +
+                "      \"aof_rewrites\": \"0\",\n" +
+                "      \"evicted_scripts\": \"0\",\n" +
+                "      \"redis_build_id\": \"cf1644279f83f09b\",\n" +
+                "      \"cluster_connections\": \"0\",\n" +
+                "      \"aof_last_bgrewrite_status\": \"ok\",\n" +
+                "      \"client_recent_max_input_buffer\": \"20480\",\n" +
+                "      \"active_defrag_key_misses\": \"0\",\n" +
+                "      \"used_memory_functions\": \"192\",\n" +
+                "      \"repl_backlog_first_byte_offset\": \"0\",\n" +
+                "      \"instantaneous_ops_per_sec\": \"1\",\n" +
+                "      \"expire_cycle_cpu_milliseconds\": \"43997\",\n" +
+                "      \"current_cow_size\": \"0\",\n" +
+                "      \"tcp_port\": \"6379\",\n" +
+                "      \"pubsub_channels\": \"0\",\n" +
+                "      \"server_time_usec\": \"1748342845260501\",\n" +
+                "      \"lru_clock\": \"3512381\",\n" +
+                "      \"acl_access_denied_auth\": \"4075\",\n" +
+                "      \"aof_last_rewrite_time_sec\": \"-1\",\n" +
+                "      \"used_memory_overhead\": \"981200\"\n" +
+                "    },\n" +
+                "    \"dbSize\": 56\n" +
+                "  }\n" +
+                "}");
+        return AjaxResult.success(parse);
+    }
 //
 //    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
 //    @GetMapping("/getNames")
@@ -118,4 +529,4 @@
 //        redisTemplate.delete(cacheKeys);
 //        return AjaxResult.success();
 //    }
-//}
+}

+ 3 - 0
fdapfe-ui/package.json

@@ -36,11 +36,13 @@
     "url": "https://gitee.com/y_project/RuoYi-Vue.git"
   },
   "dependencies": {
+    "@jiaminghi/data-view": "^2.10.0",
     "@riophae/vue-treeselect": "0.4.0",
     "ant-design-vue": "^1.7.8",
     "axios": "0.28.1",
     "clipboard": "2.0.8",
     "core-js": "3.37.1",
+    "dayjs": "^1.11.13",
     "echarts": "5.4.0",
     "element-ui": "2.15.14",
     "file-saver": "2.0.5",
@@ -76,6 +78,7 @@
     "eslint": "7.15.0",
     "eslint-plugin-vue": "7.2.0",
     "lint-staged": "10.5.3",
+    "raw-loader": "^4.0.2",
     "runjs": "4.4.2",
     "sass": "1.32.13",
     "sass-loader": "10.1.1",

+ 1 - 1
fdapfe-ui/src/api/dataGen/phyModel.js

@@ -19,7 +19,7 @@ export function getPhyModel(id) {
 
 // 新增物理模型数据生成管理
 export function addPhyModel(data) {
-  return request({
+  return  request({
     url: "/dataGen",
     method: "post",
     data: data,

BIN
fdapfe-ui/src/assets/testImage/output1.png


BIN
fdapfe-ui/src/assets/testImage/output2.png


+ 22 - 0
fdapfe-ui/src/assets/testImage/output3.txt

@@ -0,0 +1,22 @@
+类别|TP|FP|TN|FN
+ 1  2  2  54  2
+ 2  4  0  56  0
+ 3  4  0  56  0
+ 4  2  2  53  3
+ 5  3  1  56  0
+ 6  4  0  56  0
+ 7  4  0  56  0
+ 8  4  0  56  0
+ 9  4  0  56  0
+ 10  4  0  56  0
+ 11  4  0  56  0
+ 12  4  0  56  0
+ 13  4  0  56  0
+ 14  4  0  56  0
+ 15  4  0  56  0
+
+模型测试准确率(Precision):91.67%
+模型测试召回率(Recall):91.67%
+F1 分数:91.67%
+模型测试总体准确率:91.67%
+模型测试用时:3031.83 ms

+ 12 - 12
fdapfe-ui/src/layout/components/Navbar.vue

@@ -1,17 +1,17 @@
 <template>
   <div class="navbar">
-    <hamburger
-      id="hamburger-container"
-      :is-active="sidebar.opened"
-      class="hamburger-container"
-      @toggleClick="toggleSideBar"
-    />
-
-    <breadcrumb
-      id="breadcrumb-container"
-      class="breadcrumb-container"
-      v-if="!topNav"
-    />
+<!--    <hamburger-->
+<!--      id="hamburger-container"-->
+<!--      :is-active="sidebar.opened"-->
+<!--      class="hamburger-container"-->
+<!--      @toggleClick="toggleSideBar"-->
+<!--    />-->
+
+<!--    <breadcrumb-->
+<!--      id="breadcrumb-container"-->
+<!--      class="breadcrumb-container"-->
+<!--      v-if="!topNav"-->
+<!--    />-->
     <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav" />
     <div class="title">故障诊断专家知识系统验证与评估平台
     </div>

+ 2 - 0
fdapfe-ui/src/main.js

@@ -33,6 +33,7 @@ import ImageUpload from "@/components/ImageUpload"
 import ImagePreview from "@/components/ImagePreview"
 // 字典标签组件
 import DictTag from '@/components/DictTag'
+import dataV from '@jiaminghi/data-view'
 // 头部标签组件
 import VueMeta from 'vue-meta'
 // 字典数据组件
@@ -67,6 +68,7 @@ Vue.use(directive)
 Vue.use(plugins)
 Vue.use(VueMeta)
 Vue.use(Antd)
+Vue.use(dataV)
 DictData.install()
 
 /**

+ 1 - 1
fdapfe-ui/src/views/data/data/index.vue

@@ -111,7 +111,7 @@
           <dict-tag :options="dict.type.data_type" :value="scope.row.type" />
         </template>
       </el-table-column>
-      <el-table-column label="文件路径" align="center" prop="filePath" />
+      <el-table-column label="文件路径" align="center" prop="url" />
       <el-table-column label="文件大小" align="center" prop="fileSize" />
       <el-table-column label="上传时间" align="center" prop="createTime" />
       <el-table-column label="说明" align="center" prop="remark" />

+ 27 - 0
fdapfe-ui/src/views/dataConf.js

@@ -0,0 +1,27 @@
+export const dataConf ={
+  initData(){
+    return
+        [
+          {
+            name: '周口',
+            value: 55
+          },
+        {
+          name: '南阳',
+            value: 120
+        },
+        {
+          name: '西峡',
+            value: 78
+        },
+        {
+          name: '驻马店',
+            value: 66
+        },
+        {
+          name: '新乡',
+            value: 80
+        }
+    ]
+  }
+}

+ 5 - 26
fdapfe-ui/src/views/dataGen/form.vue

@@ -44,31 +44,6 @@
           <el-input v-model="formData.outputPath" placeholder="数据生成目录" />
         </el-form-item>
       </el-row>
-
-      <el-row>
-        <el-form-item label="开始时间" prop="startTime">
-          <el-date-picker
-            clearable
-            v-model="formData.startTime"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="请选择开始时间"
-          />
-        </el-form-item>
-      </el-row>
-
-      <el-row>
-        <el-form-item label="结束时间" prop="endTime">
-          <el-date-picker
-            clearable
-            v-model="formData.endTime"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="请选择结束时间"
-          />
-        </el-form-item>
-      </el-row>
-
       <el-row>
         <el-form-item label="说明" prop="remark">
           <el-input
@@ -94,6 +69,7 @@ import { getDataOptions } from "@/api/data/data";
 import { getFaultPhysicalOptions } from "@/api/model/faultPhysical";
 import {getFaultPhysical} from "@/api/model/faultPhysical";
 import DynamicParameterForm from '@/views/dataGen/DynamicParameterForm.vue'
+import dayjs from 'dayjs';
 export default {
   components:{
     DynamicParameterForm
@@ -122,6 +98,7 @@ export default {
         modelId: null,
         modelType: null,
         dataId: null,
+        bizParams:null,
         startTime: null,
         endTime: null,
         remark: null,
@@ -198,6 +175,7 @@ export default {
 
     handleSubmitDataList(data) {
       this.formData.postApiData = JSON.stringify(data);
+      this.formData.bizParams= JSON.stringify(data);
       console.log('submit', this.formData)
     },
 
@@ -212,10 +190,11 @@ export default {
       }
     },
 
-    handleSubmit() {
+     handleSubmit() {
       this.$refs.form.validate(valid => {
         if (!valid) return;
         const api = this.formData.id ? updatePhyModel : addPhyModel;
+        // this.formData.startTime= dayjs.format('YYYY-MM-DD HH:mm:ss');
         api(this.formData).then(() => {
           this.$message.success(this.formData.id ? "修改成功" : "新增成功");
           this.handleCancel();

+ 3 - 4
fdapfe-ui/src/views/dataGen/index.vue

@@ -106,9 +106,8 @@
     >
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="数据生成名称" align="center" prop="dataGenName" />
-      <el-table-column label="数据生成模型" align="center" prop="modelName" />
+      <el-table-column label="数据生成模型" align="center" prop="modelId" />
       <el-table-column label="参数" align="center" prop="bizParams" />
-      <el-table-column label="数据" align="center" prop="dataId" />
       <el-table-column label="状态" align="center" prop="status" />
       <el-table-column
         label="开始时间"
@@ -117,7 +116,7 @@
         width="180"
       >
         <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.startTime, "{y}-{m}-{d}") }}</span>
+          <span>{{ scope.row.startTime }}</span>
         </template>
       </el-table-column>
       <el-table-column
@@ -127,7 +126,7 @@
         width="180"
       >
         <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.endTime, "{y}-{m}-{d}") }}</span>
+          <span>scope.row.endTime</span>
         </template>
       </el-table-column>
       <el-table-column label="说明" align="center" prop="remark" />

+ 6 - 5
fdapfe-ui/src/views/eval/formulas/form.vue

@@ -18,11 +18,11 @@
         <el-form-item label="所属指标" prop="formulaIndicator">
           <el-select v-model="formData.formulaIndicator" placeholder="请选择所属指标">
             <el-option
-              v-for="item in formulaIndicator"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value">
-            </el-option>
+              v-for="dict in dict.type.biz_perf_eval_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
           </el-select>
         </el-form-item>
         <!-- 公式组装区域(支持手动输入+参数选择) -->
@@ -60,6 +60,7 @@
 import { findInfoList, addFormulas, updateFormulas } from "@/api/eval/formulas";
 
 export default {
+  dicts: ["biz_perf_eval_type"],
   props: {
     value: {
       type: Boolean,

+ 2 - 1
fdapfe-ui/src/views/eval/formulas/index.vue

@@ -77,7 +77,7 @@
       <el-table-column label="公式简称" align="center" prop="formulaShortName" />
       <el-table-column label="所属指标" align="center" prop="formulaIndicator" >
         <template slot-scope="scope">
-          {{scope.row.formulaIndicator==='0'? '一级指标':scope.row.formulaIndicator==='1'?'二级指标':'三级指标'}}
+          <dict-tag :options="dict.type.biz_perf_eval_type" :value="scope.row.formulaIndicator" />
         </template>
       </el-table-column>
       <el-table-column label="原始公式" align="center" prop="originalFormula" />
@@ -143,6 +143,7 @@ export default {
   components: {
     FormDialog
   },
+  dicts: ["biz_perf_eval_type"],
   data() {
     return {
       formulaIndicator:[

+ 19 - 37
fdapfe-ui/src/views/index.scss

@@ -21,7 +21,7 @@
 
 .second {
   width: 97%;
-  height: 440px;
+  height: 100%;
   margin: 50px 20px;
   // overflow: hidden;
   display: flex;
@@ -29,9 +29,10 @@
   background-color: #0b333f;
   .step {
     width: 100%;
-    height: 120px;
+    height: 300px;
     display: flex;
-    justify-content: space-around;
+    justify-content: center;
+    align-items: center;
 
     .yuan,
     .one,
@@ -58,44 +59,24 @@
       position: relative;
     }
 
-    .img::after {
-      content: "";
-      position: absolute;
-      top: 50%;
-      transform: translateX(26%);
-      width: 200%;
-      height: 1px;
-      // background-color: #546882;
-      background-color: #00aaff;
-      box-shadow: 0 5px 15px rgba(0, 170, 255, 0.5);
-    }
+    //.img::after {
+    //  content: "";
+    //  position: absolute;
+    //  top: 50%;
+    //  transform: translateX(26%);
+    //  width: 200%;
+    //  height: 1px;
+    //  // background-color: #546882;
+    //  background-color: #00aaff;
+    //  box-shadow: 0 5px 15px rgba(0, 170, 255, 0.5);
+    //}
 
     .noAfter::after {
       content: none;
     }
 
-    .odd::before {
-      content: "";
-      position: absolute;
-      transform: translateY(-50%);
-      width: 1px;
-      height: 50%;
-      // background-color: #546882;
-      background-color: #00aaff;
-      box-shadow: 0 5px 15px rgba(0, 170, 255, 0.5);
-    }
 
-    .even::before {
-      content: "";
-      position: absolute;
-      bottom: 0;
-      transform: translateY(50%);
-      width: 1px;
-      height: 50%;
-      // background-color: #546882;00aaff
-      background-color: #00aaff;
-      box-shadow: 0 5px 15px rgba(0, 170, 255, 0.5);
-    }
+
 
     .yuanBg {
       background: url("../assets/images/yuan.png") no-repeat center / contain;
@@ -163,11 +144,12 @@
 
   .bottomPanel {
     width: 100%;
-    height: 37%;
+    height: 300px;
     display: flex;
-    justify-content: space-around;
+    //justify-content: space-around;
     margin-left: 6%;
     margin-top: 1%;
+    justify-content: flex-start
   }
 
   .tPanel,

+ 34 - 432
fdapfe-ui/src/views/index.vue

@@ -1,394 +1,41 @@
 <template>
   <div class="home" v-loading="loading">
+    <dv-decoration-5 style="width:100%;height:40px;" />
     <div class="second">
-      <div class="topPanel">
-        <!-- 原始数据 -->
-        <div class="tPanel">
-          <el-table size="mini" :data="[initFileData]">
-            <el-table-column prop="fileName" label="数据" align="center">
-              <template slot-scope="scope">
-                <el-tooltip
-                  class="item"
-                  effect="dark"
-                  :content="scope.row"
-                  placement="top">
-                  <span class="file" @click="handleDialogOpen(scope.row)">{{ scope.row.fileName }}</span>
-                </el-tooltip>
-              </template>
-            </el-table-column>
-          </el-table>
-        </div>
-        <!-- 去噪 -->
-        <div class="tPanel">
-          <el-table size="mini">
-            <el-table-column
-              prop="processedDataName"
-              label="处理前数据"
-              align="center"
-            >
-              <template slot-scope="scope">
-                <el-tooltip
-                  class="item"
-                  effect="dark"
-                  :content="scope.row"
-                  placement="top"
-                >
-                  <span class="beforeFile">{{
-                      scope.row
-                    }}</span>
-                </el-tooltip>
-              </template>
-            </el-table-column>
-            <el-table-column
-              prop="resultDataName"
-              label="处理后数据"
-              align="center"
-            >
-              <template slot-scope="scope">
-                <el-tooltip
-                  class="item"
-                  effect="dark"
-                  :content="scope.row"
-                  placement="top"
-                >
-                  <span class="file" >{{
-                      scope.row
-                    }}</span>
-                </el-tooltip>
-              </template>
-            </el-table-column>
-            <el-table-column
-              prop="processStatus"
-              label="状态"
-              align="center"
-              width="60"
-            >
-              <template slot-scope="scope">
-                <dict-tag
-                  :options="dict.type.biz_process_status"
-                  :value="scope.row.processStatus"
-                />
-              </template>
-            </el-table-column>
-          </el-table>
-        </div>
-        <!-- 特征提取 -->
-        <div class="tPanel">
-          <el-table size="mini">
-            <el-table-column
-              prop="processedDataName"
-              label="处理前数据"
-              align="center"
-            >
-              <template slot-scope="scope">
-                <el-tooltip
-                  class="item"
-                  effect="dark"
-                  :content="scope.row"
-                  placement="top"
-                >
-                  <span class="beforeFile">{{
-                      scope.row
-                    }}</span>
-                </el-tooltip>
-              </template>
-            </el-table-column>
-            <el-table-column
-              prop="resultDataName"
-              label="处理后数据"
-              align="center"
-            >
-              <template slot-scope="scope">
-                <el-tooltip
-                  class="item"
-                  effect="dark"
-                  :content="scope.row"
-                  placement="top"
-                >
-                  <span class="file">{{
-                      scope.row
-                    }}</span>
-                </el-tooltip>
-              </template>
-            </el-table-column>
-            <el-table-column
-              prop="processStatus"
-              label="状态"
-              align="center"
-              width="60"
-            >
-              <template slot-scope="scope">
-                <dict-tag
-                  :options="dict.type.biz_process_status"
-                  :value="scope.row.processStatus"
-                />
-              </template>
-            </el-table-column>
-          </el-table>
-        </div>
-        <!-- 故障预测 -->
-        <div class="tPanel">
-          <el-table size="mini">
-            <el-table-column
-              prop="processedDataName"
-              label="处理前数据"
-              align="center"
-            >
-              <template slot-scope="scope">
-                <el-tooltip
-                  class="item"
-                  effect="dark"
-                  :content="scope.row"
-                  placement="top"
-                >
-                  <span class="beforeFile">{{
-                      scope.row
-                    }}</span>
-                </el-tooltip>
-              </template>
-            </el-table-column>
-            <el-table-column
-              prop="resultDataName"
-              label="处理后数据"
-              align="center"
-            >
-              <template slot-scope="scope">
-                <el-tooltip
-                  class="item"
-                  effect="dark"
-                  :content="scope.row"
-                  placement="top"
-                >
-                  <span class="file" >{{
-                      scope.row
-                    }}</span>
-                </el-tooltip>
-              </template>
-            </el-table-column>
-            <el-table-column
-              prop="processStatus"
-              label="状态"
-              align="center"
-              width="60"
-            >
-              <template slot-scope="scope">
-                <dict-tag
-                  :options="dict.type.biz_process_status"
-                  :value="scope.row.processStatus"
-                />
-              </template>
-            </el-table-column>
-          </el-table>
-        </div>
-      </div>
+      <div class="topPanel"></div>
       <div class="step">
-        <div class="yuan">
-          <div class="img yuanBg odd" @click="handleProcess(0)">
-            <div class="tag">原始数据</div>
-          </div>
-        </div>
         <div class="one">
-          <div class="img oneBg even" >
+          <div class="img oneBg even"  @click="handleDialogOpen">
             <div class="tag2">数据生成</div>
             <div class="tag">物理模型</div>
-
           </div>
         </div>
+        <dv-decoration-6 style="width:200px;height:20px;" />
         <div class="two">
           <div class="img twoBg odd">
-            <div class="tag">噪</div>
+            <div class="tag">加噪</div>
           </div>
         </div>
+        <dv-decoration-6 style="width:200px;height:20px;" />
         <div class="three">
-          <div class="img threeBg even">
-            <div class="tag">扩充</div>
-          </div>
-        </div>
-        <div class="four">
           <div class="img fourBg odd">
             <div class="tag">特征提取</div>
             <div class="tag2">故障诊断</div>
           </div>
         </div>
-        <div class="five">
-          <div class="img fiveBg even" >
-            <div class="tag">退化评估</div>
-          </div>
-        </div>
-        <div class="six">
-          <div
-            class="img sixBg odd noAfter"
-            style="content: none"
-            @click="handleProcess(5)"
-          >
-            <div class="tag">故障预测</div>
+        <dv-decoration-6 style="width:220px;height:20px;" />
+        <div class="four">
+          <div class="img fiveBg noAfter"
+               style="content: none">
+            <div class="tag">性能评估</div>
           </div>
         </div>
+
       </div>
       <div class="bottomPanel">
-        <!-- 补全 -->
-        <div class="bPanel">
-          <el-table size="mini">
-            <el-table-column
-              prop="processedDataName"
-              label="处理前数据"
-              align="center"
-            >
-              <template slot-scope="scope">
-                <el-tooltip
-                  class="item"
-                  effect="dark"
-                  :content="scope.row"
-                  placement="top"
-                >
-                  <span class="beforeFile">{{
-                      scope.row
-                    }}</span>
-                </el-tooltip>
-              </template>
-            </el-table-column>
-            <el-table-column
-              prop="resultDataName"
-              label="处理后数据"
-              align="center"
-            >
-              <template slot-scope="scope">
-                <el-tooltip
-                  class="item"
-                  effect="dark"
-                  :content="scope.row"
-                  placement="top"
-                >
-                  <span class="file" >{{
-                      scope.row
-                    }}</span>
-                </el-tooltip>
-              </template>
-            </el-table-column>
-            <el-table-column
-              prop="processStatus"
-              label="状态"
-              align="center"
-              width="60"
-            >
-              <template slot-scope="scope">
-                <dict-tag
-                  :options="dict.type.biz_process_status"
-                  :value="scope.row.processStatus"
-                />
-              </template>
-            </el-table-column>
-          </el-table>
-        </div>
-        <!-- 扩充 -->
-        <div class="bPanel">
-          <el-table size="mini">
-            <el-table-column
-              prop="processedDataName"
-              label="处理前数据"
-              align="center"
-            >
-              <template slot-scope="scope">
-                <el-tooltip
-                  class="item"
-                  effect="dark"
-                  :content="scope.row"
-                  placement="top"
-                >
-                  <span class="beforeFile">{{
-                      scope.row
-                    }}</span>
-                </el-tooltip>
-              </template>
-            </el-table-column>
-            <el-table-column
-              prop="resultDataName"
-              label="处理后数据"
-              align="center"
-            >
-              <template slot-scope="scope">
-                <el-tooltip
-                  class="item"
-                  effect="dark"
-                  :content="scope.row"
-                  placement="top"
-                >
-                  <span class="file">{{
-                      scope.row
-                    }}</span>
-                </el-tooltip>
-              </template>
-            </el-table-column>
-            <el-table-column
-              prop="processStatus"
-              label="状态"
-              align="center"
-              width="60"
-            >
-              <template slot-scope="scope">
-                <dict-tag
-                  :options="dict.type.biz_process_status"
-                  :value="scope.row.processStatus"
-                />
-              </template>
-            </el-table-column>
-          </el-table>
-        </div>
-        <!-- 退化评估 -->
-        <div class="bPanel">
-          <el-table size="mini">
-            <el-table-column
-              prop="processedDataName"
-              label="处理前数据"
-              align="center"
-            >
-              <template slot-scope="scope">
-                <el-tooltip
-                  class="item"
-                  effect="dark"
-                  :content="scope.row"
-                  placement="top"
-                >
-                  <span class="beforeFile">{{
-                      scope.row
-                    }}</span>
-                </el-tooltip>
-              </template>
-            </el-table-column>
-            <el-table-column
-              prop="resultDataName"
-              label="处理后数据"
-              align="center"
-            >
-              <template slot-scope="scope">
-                <el-tooltip
-                  class="item"
-                  effect="dark"
-                  :content="scope.row"
-                  placement="top"
-                >
-                  <span class="file">{{
-                      scope.row
-                    }}</span>
-                </el-tooltip>
-              </template>
-            </el-table-column>
-            <el-table-column
-              prop="processStatus"
-              label="状态"
-              align="center"
-              width="60"
-            >
-              <template slot-scope="scope">
-                <dict-tag
-                  :options="dict.type.biz_process_status"
-                  :value="scope.row.processStatus"
-                />
-              </template>
-            </el-table-column>
-          </el-table>
-        </div>
-        <div></div>
+            <dv-active-ring-chart :config="imagedata" style="width:200px;height:200px" />
+            <dv-capsule-chart :config="imagedata" style="width:300px;height:200px" />
+        <dv-conical-column-chart :config="imagedata" style="width:400px;height:200px;margin-left: 100px" />
       </div>
     </div>
     <form-model-view v-model="dialogVisible"  @callback="handleRowData"/>
@@ -401,8 +48,7 @@ import RingChart from "@/views/homePage/ringChart";
 import PreCharts from "@/views/homePage/preCharts";
 import CurveCharts from "@/views/homePage/curveCharts";
 import BarChart from "@/views/dashboard/BarChart";
-import { getDataOptions } from '@/api/data/data'
-import FormModelView from './form.vue'
+import FormModelView from '../views/workflow/workflow/form.vue'
 import FileTable from '@/views/fileTable.vue'
 
 export default {
@@ -419,6 +65,24 @@ export default {
   },
   data() {
     return {
+      imagedata:{
+        data:[{
+          name: 'Precision',
+          value: 91
+        },
+          {
+            name: 'Recall',
+            value: 91
+          },
+          {
+            name: 'F1 ',
+            value: 91
+          },
+          {
+            name: '准确率',
+            value: 91
+          },]
+      },
       dialogVisible: false,
       loading: false, // 补充可能存在的loading状态
       initFileData:{}
@@ -427,80 +91,18 @@ export default {
   },
   mounted() {},
   created() {
-    // 保留原有生命周期钩子...
   },
   watch: {
-    // 保留原有watchers...
   },
   methods: {
-    // 新增对话框打开方法
     handleDialogOpen(rowData) {
       this.dialogVisible = true;
-      // 可根据需求传递rowData到子组件,例如通过props或Vuex
-      // 假设FormModelView需要接收数据,可添加props: { dialogData: Object },并传递rowData
     },
     handleRowData(row){
       console.log('接收到文件管理的行数据:', row);
       this.initFileData= row;
     },
 
-    handleProcess(type) {
-      this.dialogVisible = true;
-      this.dialogType = type;
-      let match;
-      if (type === 3) {
-        const relation = [
-          [3, 2],
-          [3, 3],
-        ];
-        match = relation.find((item) => item[0] === type)[1];
-      } else if (type === 5) {
-        match = type - 1;
-      } else {
-        match = type;
-      }
-    },
-    switchHandle(content, head, dataType) {
-      switch (dataType) {
-        case "0":
-          this.fileShowVisible = true;
-          this.handleResultChartOption(content, head, true);
-          // this.loading = false;
-          break;
-        case "1":
-          this.fileShowVisible = true;
-          this.handleResultChartOption(content, head, false);
-          // this.loading = false;
-          break;
-        case "2":
-          this.fileShowVisible = true;
-          this.$nextTick(() => {
-            this.handleResultChartOption(content, head, false);
-            // this.loading = false;
-          });
-          break;
-        case "3":
-          this.fileShowVisible = true;
-          this.$nextTick(() => {
-            this.handleResultChartOption(content, head, false);
-            // this.loading = false;
-          });
-          break;
-        case "4":
-          this.fileShowVisible = true;
-          this.$nextTick(() => {
-            this.handleResultChartOption(content, head, false);
-            // this.loading = false;
-          });
-          break;
-        case "5":
-          break;
-        case "6":
-          break;
-        default:
-          break;
-      }
-    },
   }
 };
 </script>

+ 70 - 1
fdapfe-ui/src/views/model/faultPhysical/configDataService.js

@@ -1,6 +1,7 @@
 // configDataService.js
 export const ConfigDataService = {
   // 初始化配置数据
+
   initConfigData() {
     return [
       {
@@ -187,5 +188,73 @@ export const ConfigDataService = {
       paramDescription: '',
       isRequired: false
     };
-  }
+  },
+  initinfoData() {
+    return [
+      {
+        createBy: null,
+        createTime: new Date().toISOString().slice(0, 19).replace('T', ' '),
+        updateBy: null,
+        updateTime: new Date().toISOString().slice(0, 19).replace('T', ' '),
+        remark: null,
+        paramId: this.generateUniqueId(),
+        modelId: "",
+        paramName: "inputPath",
+        paramChineseName: "输入文件地址",
+        paramType: "String",
+        paramSort: "1",
+        paramDefaultValue: "",
+        paramDescription: "",
+        isRequired: true
+      },
+      {
+        createBy: null,
+        createTime: new Date().toISOString().slice(0, 19).replace('T', ' '),
+        updateBy: null,
+        updateTime: new Date().toISOString().slice(0, 19).replace('T', ' '),
+        remark: null,
+        paramId: this.generateUniqueId(),
+        modelId: "",
+        paramName: "outputPath",
+        paramChineseName: "输出文件地址",
+        paramType: "String",
+        paramSort: "2",
+        paramDefaultValue: "",
+        paramDescription: "",
+        isRequired: true
+      },
+      {
+        createBy: null,
+        createTime: new Date().toISOString().slice(0, 19).replace('T', ' '),
+        updateBy: null,
+        updateTime: new Date().toISOString().slice(0, 19).replace('T', ' '),
+        remark: null,
+        paramId: this.generateUniqueId(),
+        modelId: "",
+        paramName: "exePath",
+        paramChineseName: "模型地址",
+        paramType: "String",
+        paramSort: "3",
+        paramDefaultValue: "",
+        paramDescription: "",
+        isRequired: true
+      },
+      {
+        createBy: null,
+        createTime: new Date().toISOString().slice(0, 19).replace('T', ' '),
+        updateBy: null,
+        updateTime: new Date().toISOString().slice(0, 19).replace('T', ' '),
+        remark: null,
+        paramId: this.generateUniqueId(),
+        modelId: "",
+        paramName: "诊断数据",
+        paramChineseName: "输入参数",
+        paramType: "file",
+        paramSort: "4",
+        paramDefaultValue: "",
+        paramDescription: "",
+        isRequired: false
+      },
+    ];
+  },
 };

+ 7 - 1
fdapfe-ui/src/views/model/faultPhysical/form.vue

@@ -186,7 +186,7 @@ export default {
       return this.$route.query.modelAttribution;
     },
     disable(){
-     return this.$route.query.modelAttribution==='0'
+     return this.$route.query.modelAttribution!=='2'
     },
     title() {
       if (this.options === 'add'&& this.$route.query.modelAttribution==='0') {
@@ -225,6 +225,12 @@ export default {
       this.formData.configData = [...clonedData];
       console.log('克隆后的配置数据:', clonedData);
     }
+    if (this.options === 'add' && this.$route.query.modelAttribution === '1') {
+      // 克隆现有配置数据并添加到数组
+      const clonedData = ConfigDataService.initinfoData();
+      this.formData.configData = [...clonedData];
+      console.log('克隆后的配置数据:', clonedData);
+    }
   },
   methods: {
     openDialog() {

+ 9 - 1
fdapfe-ui/src/views/system/user/index.vue

@@ -550,4 +550,12 @@ export default {
     }
   }
 };
-</script>
+</script>
+<style scoped>
+ .app-container /deep/ .el-col{
+  background-color: #0b333f;
+}
+.plitpanes--vertical /deep/ .splitpanes__splitter{
+   background-color: #0b333f;
+ }
+</style>

+ 35 - 48
fdapfe-ui/src/views/test/ddAlgorithm/form.vue

@@ -2,7 +2,7 @@
   <el-dialog
     :title="title"
     :visible.sync="dialogOpen"
-    width="500px"
+    width="1000px"
     :close-on-click-modal="false"
     append-to-body
     @opened="initData"
@@ -23,35 +23,9 @@
           </el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="模型远程地址" prop="name">
-        <el-input v-model="formData.apiPath" placeholder="请输入远程地址" />
+      <el-form-item v-if="formData.modelId && modelType" label="模型参数">
+        <dynamic-parameter-form :model-typedisbale="modelType==='0'" :config-data="initialData" @submit="handleSubmitDataList" />
       </el-form-item>
-      <el-form-item  label="模型文件" prop="filePath">
-        <multi-file-upload   @upload-success="handleUploadSuccess"/>
-      </el-form-item>
-<!--      <el-row>-->
-<!--        <el-form-item label="开始时间" prop="startTime">-->
-<!--          <el-date-picker-->
-<!--            clearable-->
-<!--            v-model="formData.startTime"-->
-<!--            type="date"-->
-<!--            value-format="yyyy-MM-dd HH:mm:ss"-->
-<!--            placeholder="请选择开始时间"-->
-<!--          />-->
-<!--        </el-form-item>-->
-<!--      </el-row>-->
-
-<!--      <el-row>-->
-<!--        <el-form-item label="结束时间" prop="endTime">-->
-<!--          <el-date-picker-->
-<!--            clearable-->
-<!--            v-model="formData.endTime"-->
-<!--            type="date"-->
-<!--            value-format="yyyy-MM-dd HH:mm:ss"-->
-<!--            placeholder="请选择结束时间"-->
-<!--          />-->
-<!--        </el-form-item>-->
-<!--      </el-row>-->
       <el-form-item label="说明" prop="remark">
         <el-input
           v-model="formData.remark"
@@ -68,16 +42,31 @@
 </template>
 
 <script>
+import DynamicParameterForm from '@/views/dataGen/DynamicParameterForm.vue'
 import {
   addDdAlgorithm,
   updateDdAlgorithm,
   fileCopys
 } from "@/api/test/ddAlgorithm";
 import { getFaultPhysicalOptions } from '@/api/model/faultPhysical'
-
+import {getFaultPhysical} from "@/api/model/faultPhysical";
 import { addData } from '@/api/data/data'
 
 export default {
+  components:{
+    DynamicParameterForm
+  },
+  computed: {
+    title() {
+      if (this.options === 'add') {
+        return '添加功能验证';
+      }
+      if (this.options === 'edit') {
+        return '修改功能验证';
+      }
+      return '';
+    },
+  },
   props: {
     value: {
       type: Boolean,
@@ -117,8 +106,9 @@ export default {
         createTime: null,
         updateBy: null,
         updateTime: null,
-        outputPath:null
       },
+      initialData:[],
+      modelType:null,
       selectedModel:{},
       fileForm:{},
       rules: {},
@@ -134,24 +124,23 @@ export default {
       this.dialogOpen = newVal;
     }
   },
-  computed: {
-    title() {
-      if (this.options === 'add') {
-        return '添加功能验证';
-      }
-      if (this.options === 'edit') {
-        return '修改功能验证';
-      }
-      return '';
-    }
-  },
+
   methods: {
-    onModelChange(){
-       this.selectedModel = this.faultPhysicalOptions.find(
-        item => item.modelId === this.formData.modelId
-      );
+    onModelChange(modelId){
+      //获取模型参数详情
+      getFaultPhysical(modelId).then(rest => {
+        this.initialData  = rest.data.configData;
+        this.modelType=rest.data.modelAttribution;
+        this.formData.modelId = rest.data.modelId;
+        console.log('modelDataParams',rest.data.modelAttribution)
+      });
       console.log(this.selectedModel)
     },
+    handleSubmitDataList(data) {
+      this.formData.postApiData = JSON.stringify(data);
+      this.formData.bizParams= JSON.stringify(data);
+      console.log('submit', this.formData)
+    },
     handleUploadSuccess(datas){
       console.log('handleChildData',datas);
       const fileData= {
@@ -175,8 +164,6 @@ export default {
       this.formData.outputPath = this.selectedModel.modelPath
     },
     loadOptions() {
-
-
       // 加载模型选项
       getFaultPhysicalOptions(1).then(resp => {
         this.faultPhysicalOptions = resp.data || [];

+ 64 - 47
fdapfe-ui/src/views/test/ddAlgorithm/index.vue

@@ -16,42 +16,6 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-<!--      <el-form-item label="实际标签" prop="truthLabels">-->
-<!--        <el-input-->
-<!--          v-model="queryParams.truthLabels"-->
-<!--          placeholder="请输入实际标签"-->
-<!--          clearable-->
-<!--          @keyup.enter.native="handleQuery"-->
-<!--        />-->
-<!--      </el-form-item>-->
-<!--      <el-form-item label="测试标签" prop="testLabels">-->
-<!--        <el-input-->
-<!--          v-model="queryParams.testLabels"-->
-<!--          placeholder="请输入测试标签"-->
-<!--          clearable-->
-<!--          @keyup.enter.native="handleQuery"-->
-<!--        />-->
-<!--      </el-form-item>-->
-<!--      <el-form-item label="开始时间" prop="startTime">-->
-<!--        <el-date-picker-->
-<!--          clearable-->
-<!--          v-model="queryParams.startTime"-->
-<!--          type="date"-->
-<!--          value-format="yyyy-MM-dd"-->
-<!--          placeholder="请选择开始时间"-->
-<!--        >-->
-<!--        </el-date-picker>-->
-<!--      </el-form-item>-->
-<!--      <el-form-item label="结束时间" prop="endTime">-->
-<!--        <el-date-picker-->
-<!--          clearable-->
-<!--          v-model="queryParams.endTime"-->
-<!--          type="date"-->
-<!--          value-format="yyyy-MM-dd"-->
-<!--          placeholder="请选择结束时间"-->
-<!--        >-->
-<!--        </el-date-picker>-->
-<!--      </el-form-item>   -->
       <el-form-item>
         <el-button
           type="primary"
@@ -119,8 +83,21 @@
     >
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="任务名称" align="center" prop="name" />
-      <el-table-column label="模型" align="center" prop="modelId" />
-      <el-table-column label="基础指标" align="center" prop="returnData" />
+      <el-table-column label="文本结果" align="center" prop="resultText" >
+        <template slot-scope="scope">
+          {{content}}
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="开始时间"
+        align="center"
+        prop="startTime"
+        width="180"
+      >
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.startTime, "{y}-{m}-{d}") }}</span>
+        </template>
+      </el-table-column>
       <el-table-column label="说明" align="center" prop="remark" />
       <el-table-column
         label="开始时间"
@@ -154,7 +131,7 @@
             icon="el-icon-video-play"
             @click="handleVerify(scope.row)"
             v-hasPermi="['test:ddAlgorithm:edit']"
-          >验证</el-button>
+          >开始评估</el-button>
           <el-button
             size="mini"
             type="text"
@@ -184,7 +161,7 @@
     <el-dialog
       :title="!returnDataShow?'验证配置':'验证结果'"
       :visible.sync="verifyDialogVisible"
-      width="500px"
+      width="1000px"
       append-to-body
     >
       <el-form :model="verifyForm" label-width="80px">
@@ -197,15 +174,34 @@
             style="width: 100%"
           >
             <el-option
-              v-for="option in verifyOptions"
-              :key="option.formulaId"
-              :label="option.formulaName"
-              :value="option.formulaId"
-            ></el-option>
+              v-for="dict in dict.type.biz_perf_eval_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
 
           </el-select>
         </el-form-item>
-        <el-form-item  label="验证结果" v-if="returnDataShow">{{returnDataMap}}</el-form-item>
+        <el-form-item label="验证结果" v-if="returnDataShow">
+          <template>
+            <div class="demo-image__placeholder">
+              <div class="image-container">
+                <div >
+                  <span class="demonstration">默认</span>
+                  <el-image :src="src1"></el-image>
+                </div>
+                <div >
+                  <span class="demonstration">自定义</span>
+                  <el-image :src="src2">
+                    <div slot="placeholder" class="image-slot">
+                      加载中<span class="dot">...</span>
+                    </div>
+                  </el-image>
+                </div>
+              </div>
+            </div>
+          </template>
+        </el-form-item>
       </el-form>
 
       <div slot="footer" class="dialog-footer">
@@ -236,12 +232,21 @@ import { listFormulas} from "@/api/eval/formulas";
 import { getDataOptions } from "@/api/data/data";
 import { getFaultDiagnosisOptions } from "@/api/model/faultDiagnosis";
 import DdAlgorithmForm from './form.vue';
-
+import txtContent from '@/assets/testImage/output3.txt';
 export default {
   name: "DdAlgorithm",
   components: {
     DdAlgorithmForm
   },
+  dicts: ["biz_model_type","biz_perf_eval_type"],
+  computed: {
+    src1(){
+      return require('@/assets/testImage/output1.png');
+    },
+    src2(){
+      return  require('@/assets/testImage/output2.png')
+    }
+  },
   data() {
     return {
       verifyForm:null,
@@ -274,6 +279,7 @@ export default {
         startTime: null,
         endTime: null,
       },
+      content: txtContent,
       // 表单参数
       form: {},
       // 操作选项
@@ -292,6 +298,17 @@ export default {
     this.getList();
     this.getOption();
   },
+  mounted() {
+    // 假设文件在 src/assets/txt 目录下
+    import('@/assets/testImage/output3.txt')
+      .then((module) => {
+        this.txtContent = module.default;
+      })
+      .catch((error) => {
+        console.error('引入 TXT 文件时出错:', error);
+        this.txtContent = '无法加载文件内容';
+      });
+  },
   methods: {
     handleVerify(row){
       this.verifyDialogVisible = true;

+ 2 - 85
fdapfe-ui/src/views/test/perf/index.vue

@@ -146,11 +146,11 @@
           </el-image
         ></template>
       </el-table-column>
-      <el-table-column label="文件结果" align="center" prop="resultFilePath">
+      <el-table-column label="图片结果" align="center" prop="resultFilePath">
         <template slot-scope="scope">
           <el-image
             style="width: 100px; height: 100px"
-            :src="baseUrl + scope.row.resultFilePath"
+            src="@src/assets/testImage/output1.png"
             :preview-src-list="baseUrl + scope.row.resultFilePath"
           >
           </el-image
@@ -233,89 +233,6 @@
         @submitPerfDetail="submitPerfDetail"
         @cancelPerfDetail="cancelPerfDetail"
       ></perfDetail>
-      <!--<el-form ref="form" :model="form" :rules="rules" label-width="100px">
-         <el-form-item label="任务名称" prop="name">
-          <el-input v-model="form.name" placeholder="请输入任务名称" />
-        </el-form-item>
-        <el-form-item label="类型" prop="type">
-          <el-select v-model="form.type" placeholder="请选择类型">
-            <el-option
-              v-for="dict in dict.type.biz_perf_eval_type"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="循环次数" prop="loopCount">
-          <el-input v-model="form.loopCount" placeholder="请输入循环次数" />
-        </el-form-item>
-        <el-form-item label="故障诊断算法" prop="fdAlgorithmId">
-          <el-input v-model="form.fdAlgorithmId" placeholder="请输入故障诊断算法" />
-        </el-form-item>
-        <el-form-item label="实际标签" prop="truthLabels">
-          <el-input v-model="form.truthLabels" placeholder="请输入实际标签" />
-        </el-form-item>
-        <el-form-item label="物理生成模型" prop="phyModelId">
-          <el-input v-model="form.phyModelId" placeholder="请输入物理生成模型" />
-        </el-form-item>
-        <el-form-item label="物理模型参数" prop="phyParams">
-          <el-input v-model="form.phyParams" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
-        <el-form-item label="物理数据" prop="phyDataIds">
-          <el-input v-model="form.phyDataIds" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
-        <el-form-item label="噪声生成模型" prop="noseModelId">
-          <el-input v-model="form.noseModelId" placeholder="请输入噪声生成模型" />
-        </el-form-item>
-        <el-form-item label="噪声模型参数" prop="noseParams">
-          <el-input v-model="form.noseParams" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
-        <el-form-item label="噪声数据" prop="noseDataIds">
-          <el-input v-model="form.noseDataIds" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
-        <el-form-item label="测试生成模型" prop="testModelId">
-          <el-input v-model="form.testModelId" placeholder="请输入测试生成模型" />
-        </el-form-item>
-        <el-form-item label="测试模型参数" prop="testParams">
-          <el-input v-model="form.testParams" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
-        <el-form-item label="测试数据" prop="testDataIds">
-          <el-input v-model="form.testDataIds" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
-        <el-form-item label="图片结果" prop="resultImagePath">
-          <el-input v-model="form.resultImagePath" placeholder="请输入图片结果" />
-        </el-form-item>
-        <el-form-item label="文件结果" prop="resultFilePath">
-          <el-input v-model="form.resultFilePath" placeholder="请输入文件结果" />
-        </el-form-item>
-        <el-form-item label="文本结果" prop="resultText">
-          <el-input v-model="form.resultText" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
-        <el-form-item label="说明" prop="remark">
-          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
-        <el-form-item label="开始时间" prop="startTime">
-          <el-date-picker clearable
-            v-model="form.startTime"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="请选择开始时间">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="结束时间" prop="endTime">
-          <el-date-picker clearable
-            v-model="form.endTime"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="请选择结束时间">
-          </el-date-picker>
-        </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div> -->
     </el-dialog>
   </div>
 </template>

+ 19 - 179
fdapfe-ui/src/views/workflow/workflow/form.vue

@@ -8,18 +8,6 @@
     @opened="initData"
     @close="handleCancel"
   >
-    <div>
-      <!-- 步骤导航 -->
-      <el-steps align-center :active="activeStep">
-        <el-step title="步骤 1"></el-step>
-        <el-step title="步骤 2"></el-step>
-        <el-step
-          title="步骤 3"
-          description="这是一段很长很长很长的描述性文字"
-          class="step-description"
-        ></el-step>
-      </el-steps>
-
       <!-- 表单区域 -->
       <el-form
         ref="form"
@@ -51,112 +39,9 @@
               />
             </el-select>
           </el-form-item>
-
-          <!-- 模型参数区域(类型1) -->
-          <el-form-item
-            v-if="formData.modelType === '1'"
-            label="模型参数"
-          >
-            <el-input
-              v-model="formData.bizParams"
-              type="textarea"
-              placeholder="请输入模型参数(JSON格式)"
-            />
-          </el-form-item>
-
-          <!-- 参数组管理(类型1) -->
-          <el-form-item
-            v-if="formData.modelType === '1'"
-            label="模型参数"
-          >
-            <el-row :gutter="10">
-              <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="1" :offset="22">
-                <el-button
-                  icon="el-icon-plus"
-                  @click="addModelDataParams"
-                  size="mini"
-                  circle
-                  title="添加参数组"
-                />
-              </el-col>
-            </el-row>
-
-            <el-collapse
-              :gutter="20"
-              v-for="(paramGroup, groupIndex) in modelDataParams"
-              :key="groupIndex"
-            >
-              <el-collapse-item
-                :title="'参数组' + (groupIndex + 1)"
-                :name="groupIndex"
-              >
-                <el-row
-                  :xl="4"
-                  v-for="(value, key) in paramGroup"
-                  :key="key"
-                  :gutter="20"
-                >
-                  <el-col>
-                    <el-form-item
-                      :label="key"
-                      :prop="`modelDataParams.${groupIndex}.${key}`"
-                    >
-                      <el-input
-                        v-model="paramGroup[key]"
-                        :placeholder="'请输入' + key + '的值'"
-                        style="width: 200px;"
-                      />
-                    </el-form-item>
-                  </el-col>
-                </el-row>
-              </el-collapse-item>
-            </el-collapse>
-          </el-form-item>
-
-          <!-- 文件来源选择(类型2) -->
-          <el-form-item
-            v-if="formData.modelType === '2'"
-            label="文件来源"
-            prop="dataGenName"
-          >
-            <el-select
-              v-model="formData.dataSource"
-              placeholder="请选择文件来源"
-              @change="onDataSourceChange"
-            >
-              <el-option key="1" label="文件上传" value="1"></el-option>
-              <el-option key="2" label="文件管理" value="2"></el-option>
-            </el-select>
-          </el-form-item>
-
-          <!-- 文件显示(类型2) -->
-          <el-form-item
-            v-if="formData.modelType === '2'"
-            label="选择文件"
-            prop="dataGenName"
-          >
-            <span>{{ rowData.fileName }}</span>
-          </el-form-item>
-
-          <!-- 文件上传组件(数据源1) -->
-          <el-form-item
-            v-if="formData.dataSource === '1'"
-            label="文件上传"
-            prop="filePath"
-          >
-            <file-upload
-              :fileType="uploadFileType"
-              @child-event="handleChildData"
-            />
+          <el-form-item v-if="formData.modelId && modelType" label="模型参数">
+            <dynamic-parameter-form :model-typedisbale="modelType==='0'" :config-data="initialData" @submit="handleSubmitDataList" />
           </el-form-item>
-
-          <div class="text-right">
-            <el-button type="primary" @click="nextStep">下一步</el-button>
-          </div>
-        </div>
-
-        <!-- 步骤2内容 -->
-        <div v-if="activeStep === 2">
           <el-form-item label="诊断模型">
             <el-select
               v-model="formData.diagModelId"
@@ -171,44 +56,16 @@
               />
             </el-select>
           </el-form-item>
-
-          <div class="text-right">
-            <el-button @click="prevStep">上一步</el-button>
-            <el-button type="primary" @click="nextStep">下一步</el-button>
-          </div>
-        </div>
-
-        <!-- 步骤3内容 -->
-        <div v-if="activeStep === 3">
-          <el-form-item label="步骤 3 表单字段">
-            <el-input
-              v-model="formData.step3Field"
-              placeholder="请输入步骤 3 的内容"
-            />
-          </el-form-item>
-
-          <div class="text-right">
-            <el-button @click="prevStep">上一步</el-button>
-          </div>
         </div>
       </el-form>
-    </div>
-
     <!-- 对话框底部操作 -->
     <div slot="footer" class="dialog-footer">
       <el-button
         type="primary"
         @click="handleSubmit"
-        :disabled="activeStep!== 3"
       >确 定</el-button>
       <el-button @click="handleCancel">取 消</el-button>
     </div>
-
-    <!-- 文件管理子组件 -->
-    <file-table
-      v-model="fileManagementDialogVisible"
-      @callback="handleRowData"
-    />
   </el-dialog>
 </template>
 
@@ -220,9 +77,11 @@ import {
 import FileTable from './fileTable.vue';
 import { getDataOptions } from '@/api/data/data'
 import { getFaultPhysicalOptions } from '@/api/model/faultPhysical' // 修正组件命名
-
+import {getFaultPhysical} from "@/api/model/faultPhysical";
+import DynamicParameterForm from '@/views/dataGen/DynamicParameterForm.vue'
 export default {
-  components: { FileTable }, // 注册组件列表
+  components: { FileTable,DynamicParameterForm }, // 注册组件列表
+
   props: {
     value: {
       type: Boolean,
@@ -244,15 +103,13 @@ export default {
   dicts: ['sys_job_status', 'data_type'], // 字典数据标识
   data() {
     return {
-      uploadFileType: ["csv", "xls", "xlsx"], // 允许的上传文件类型
+      uploadFileType: ["csv", "xls", "xlsx",'mat'], // 允许的上传文件类型
       modelDataParams: [], // 参数组数据(类型1)
       dataOptions: [], // 数据选项(预留扩展)
       faultPhysicalOptions: [], // 物理模型选项
       faultOptions: [], // 诊断模型选项
+      postApiData:[],
       formData: {
-        // 基础信息
-        outputPath: null,
-        newFileName: null,
         name: null,
         modelId: null,
         modelType: null,
@@ -260,15 +117,12 @@ export default {
         startTime: null,
         endTime: null,
         remark: null,
-        diagModelId:null,
+        diagModelId:null, //诊断算法id
         // 扩展信息
         modelDataParams: [],
-        modelPath: null,
-        modelName: null,
-        step2Field: null,
-        step3Field: null,
-        dataSource: null // 文件来源(类型2)
       },
+      initialData:[],
+      modelType:null,
       rules: {
         name: [{ required: true, message: "请输入任务名称", trigger: "blur" }],
         modelId: [{ required: true, message: "请选择数据生成模型", trigger: "blur" }]
@@ -277,7 +131,6 @@ export default {
       workflowNodeList: [], // 工作流节点列表
       checkedWorkflowNode: [], // 选中的工作流节点
       activeStep: 1, // 当前步骤
-      fileManagementDialogVisible: false, // 文件管理对话框状态
       rowData: {} // 选中的文件行数据
     };
   },
@@ -325,27 +178,14 @@ export default {
     },
 
     // 物理模型选择变化处理
-    onModelChange() {
-      const selectedModel = this.faultPhysicalOptions.find(
-        item => item.modelId === this.formData.modelId
-
-      );
-      console.log('物理模型数据', selectedModel)
-      if (!selectedModel) return;
-
-      // 同步模型基础信息
-      this.formData.modelType = selectedModel.modelType;
-      this.formData.modelPath = selectedModel.modelPath;
-
-      // 根据模型类型初始化参数数据
-      if (selectedModel.modelType === "2") {
-        this.formData.bizParams = selectedModel.modelDataParams || "";
-        this.modelDataParams = []; // 类型2不使用参数组
-      } else {
-        // 解析并初始化参数组(类型1)
-        const exampleParams = this.parseParams(selectedModel.modelDataParams || "[]");
-        this.modelDataParams = exampleParams.length ? exampleParams : [{}];
-      }
+    onModelChange(modelId) {
+      //获取模型参数详情
+      getFaultPhysical(modelId).then(rest => {
+        this.initialData  = rest.data.configData;
+        this.modelType=rest.data.modelAttribution;
+        this.formData.modelId = rest.data.modelId;
+        console.log('modelDataParams',rest.data.modelAttribution)
+      });
     },
 
     // 加载基础数据选项

+ 6 - 0
fdapfe-ui/vue.config.js

@@ -77,6 +77,12 @@ module.exports = {
 
     // set svg-sprite-loader
     config.module.rule("svg").exclude.add(resolve("src/assets/icons")).end();
+    config.module
+      .rule('txt')
+      .test(/\.txt$/)
+      .use('raw-loader')
+      .loader('raw-loader')
+      .end();
     config.module
       .rule("icons")
       .test(/\.svg$/)