Răsfoiți Sursa

feat: 执行预处理逻辑

wanggaokun 10 luni în urmă
părinte
comite
10977c91cd

+ 2 - 1
als-common/common-core/src/main/java/org/eco/common/core/utils/HttpUtils.java

@@ -200,8 +200,9 @@ public class HttpUtils {
      * @return java.lang.String
      */
     public static String postJson(String url, Object jsonBody) {
+        log.info("请求参数:{}", jsonBody.toString());
         Mono<String> resp = createWebClientWithConnectAndReadTimeOuts().post().uri(url)
-            .contentType(MediaType.APPLICATION_JSON).body(Mono.just(jsonBody), Object.class).retrieve()
+            .contentType(MediaType.APPLICATION_JSON_UTF8).body(Mono.just(jsonBody), Object.class).retrieve()
             .bodyToMono(String.class).timeout(Duration.ofMillis(DEFAULT_REQUEST_TIMEOUT));
         return resp.block();
     }

+ 15 - 10
als-common/common-core/src/main/java/org/eco/common/core/utils/file/FileUploadUtils.java

@@ -1,5 +1,7 @@
 package org.eco.common.core.utils.file;
 
+import lombok.Getter;
+import org.apache.commons.io.FilenameUtils;
 import org.eco.common.core.config.EcoConfig;
 import org.eco.common.core.constant.Constants;
 import org.eco.common.core.exception.file.FileNameLengthLimitExceededException;
@@ -8,7 +10,6 @@ import org.eco.common.core.exception.file.InvalidExtensionException;
 import org.eco.common.core.utils.DateUtils;
 import org.eco.common.core.utils.StringUtils;
 import org.eco.common.core.utils.uuid.Seq;
-import org.apache.commons.io.FilenameUtils;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.File;
@@ -35,12 +36,9 @@ public class FileUploadUtils {
     /**
      * 默认上传的地址
      */
+    @Getter
     private static String defaultBaseDir = EcoConfig.getProfile();
 
-    public static String getDefaultBaseDir() {
-        return defaultBaseDir;
-    }
-
     public static void setDefaultBaseDir(String defaultBaseDir) {
         FileUploadUtils.defaultBaseDir = defaultBaseDir;
     }
@@ -50,7 +48,7 @@ public class FileUploadUtils {
      *
      * @param file 上传的文件
      * @return 文件名称
-     * @throws Exception
+     * @throws IOException 异常
      */
     public static final String upload(MultipartFile file) throws IOException {
         try {
@@ -113,6 +111,14 @@ public class FileUploadUtils {
             FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file));
     }
 
+    /**
+     * 编码文件名
+     */
+    public static final String extractFilename(String fileName, String extension) {
+        return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(),
+            FilenameUtils.getBaseName(fileName), Seq.getId(Seq.uploadSeqType), extension);
+    }
+
     public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException {
         File desc = new File(uploadDir + File.separator + fileName);
 
@@ -124,7 +130,7 @@ public class FileUploadUtils {
         return desc;
     }
 
-    public static final String getPathFileName(String uploadDir, String fileName) throws IOException {
+    public static final String getPathFileName(String uploadDir, String fileName) {
         int dirLastIndex = EcoConfig.getProfile().length() + 1;
         String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
         return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName;
@@ -134,9 +140,8 @@ public class FileUploadUtils {
      * 文件大小校验
      *
      * @param file 上传的文件
-     * @return
      * @throws FileSizeLimitExceededException 如果超出最大大小
-     * @throws InvalidExtensionException
+     * @throws InvalidExtensionException 异常
      */
     public static final void assertAllowed(MultipartFile file, String[] allowedExtension)
         throws FileSizeLimitExceededException, InvalidExtensionException {
@@ -169,7 +174,7 @@ public class FileUploadUtils {
     /**
      * 判断MIME类型是否是允许的MIME类型
      *
-     * @param extension extension
+     * @param extension        extension
      * @param allowedExtension allowedExtension
      * @return res
      */

+ 6 - 7
als-common/common-core/src/main/java/org/eco/common/core/utils/file/FileUtils.java

@@ -37,7 +37,6 @@ public class FileUtils extends FileUtil {
      *
      * @param filePath 文件路径
      * @param os       输出流
-     * @return
      */
     public static void writeBytes(String filePath, OutputStream os) throws IOException {
         FileInputStream fis = null;
@@ -81,7 +80,7 @@ public class FileUtils extends FileUtil {
      */
     public static String writeByte(byte[] data, String uploadDir) throws IOException {
         FileOutputStream fos = null;
-        String pathName = "";
+        String pathName;
         try {
             String extension = getFileExtendName(data);
             pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension;
@@ -98,7 +97,7 @@ public class FileUtils extends FileUtil {
      * 删除文件
      *
      * @param filePath 文件
-     * @return
+     * @return 删除结果
      */
     public static boolean deleteFile(String filePath) {
         boolean flag = false;
@@ -153,17 +152,17 @@ public class FileUtils extends FileUtil {
         String filename = fileName;
         if (agent.contains("MSIE")) {
             // IE浏览器
-            filename = URLEncoder.encode(filename, "utf-8");
+            filename = URLEncoder.encode(filename, StandardCharsets.UTF_8);
             filename = filename.replace("+", " ");
         } else if (agent.contains("Firefox")) {
             // 火狐浏览器
             filename = new String(fileName.getBytes(), "ISO8859-1");
         } else if (agent.contains("Chrome")) {
             // google浏览器
-            filename = URLEncoder.encode(filename, "utf-8");
+            filename = URLEncoder.encode(filename, StandardCharsets.UTF_8);
         } else {
             // 其它浏览器
-            filename = URLEncoder.encode(filename, "utf-8");
+            filename = URLEncoder.encode(filename, StandardCharsets.UTF_8);
         }
         return filename;
     }
@@ -196,7 +195,7 @@ public class FileUtils extends FileUtil {
      * @return 百分号编码后的字符串
      */
     public static String percentEncode(String s) throws UnsupportedEncodingException {
-        String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString());
+        String encode = URLEncoder.encode(s, StandardCharsets.UTF_8);
         return encode.replaceAll("\\+", "%20");
     }
 

+ 5 - 0
als-modules/agile-assurance/pom.xml

@@ -17,5 +17,10 @@
             <groupId>org.eco</groupId>
             <artifactId>system</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 2 - 8
als-modules/agile-assurance/src/main/java/org/eco/als/domain/bo/AlgorithmBo.java

@@ -27,12 +27,6 @@ public class AlgorithmBo extends BaseEntity {
     @NotNull(message = "模型Id不能为空")
     private Long dataId;
 
-    /**
-     * 模型链接
-     */
-    @NotBlank(message = "模型链接不能为空")
-    private String url;
-
     /**
      * 参数
      */
@@ -42,8 +36,8 @@ public class AlgorithmBo extends BaseEntity {
     /**
      * 数据列
      */
-    @NotBlank(message = "数据列不能为空")
-    private String columnData;
+    @NotNull(message = "数据列不能为空")
+    private String[] columnData;
 
 
 }

+ 2 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/bo/PreProcessingBo.java

@@ -5,6 +5,7 @@ import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
 import org.eco.als.domain.PreProcessing;
 import org.eco.common.orm.core.domain.BaseEntity;
 
@@ -16,6 +17,7 @@ import org.eco.common.orm.core.domain.BaseEntity;
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
 @AutoMapper(target = PreProcessing.class, reverseConvertGenerate = false)
 public class PreProcessingBo extends BaseEntity {
     /**

+ 3 - 1
als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/ModelHttpVo.java

@@ -1,5 +1,6 @@
 package org.eco.als.domain.vo;
 
+import lombok.Builder;
 import lombok.Data;
 
 /**
@@ -7,9 +8,10 @@ import lombok.Data;
  * @Author: GaoKun Wang
  * @Date: 2024/7/30
  */
+@Builder
 @Data
 public class ModelHttpVo {
-    private String status;
+    private Integer status;
     private String data;
     private String msg;
 }

+ 38 - 16
als-modules/agile-assurance/src/main/java/org/eco/als/service/impl/AlgorithmService.java

@@ -1,21 +1,29 @@
 package org.eco.als.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.eco.als.domain.bo.AlgorithmBo;
+import org.eco.als.domain.bo.PreProcessingBo;
 import org.eco.als.domain.vo.DataImportVo;
 import org.eco.als.domain.vo.ModelHttpVo;
 import org.eco.als.domain.vo.ModelVo;
 import org.eco.als.service.IAlgorithmService;
 import org.eco.als.service.IDataImportService;
 import org.eco.als.service.IModelService;
+import org.eco.als.service.IPreProcessingService;
+import org.eco.als.utils.CsvUtils;
+import org.eco.common.core.config.EcoConfig;
 import org.eco.common.core.exception.BusinessException;
 import org.eco.common.core.utils.HttpUtils;
+import org.eco.system.domain.vo.SysOssVo;
 import org.eco.system.service.ISysOssService;
 import org.springframework.stereotype.Service;
 
+import java.io.File;
+import java.io.InputStream;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -36,6 +44,9 @@ public class AlgorithmService implements IAlgorithmService {
     @Resource
     private ISysOssService ossService;
 
+    @Resource
+    private IPreProcessingService processingService;
+
     /**
      * executePro 预处理
      *
@@ -44,37 +55,48 @@ public class AlgorithmService implements IAlgorithmService {
      **/
     @Override
     public String executePro(AlgorithmBo algorithmBo) {
+
         // 模型相关信息
         ModelVo modelVo = modelService.selectById(algorithmBo.getModelId());
         if (ObjectUtil.isNull(modelVo)) {
             throw new BusinessException("模型信息为空,请检查!");
         }
+
         // 数据相关信息
         DataImportVo dataVo = dataImportService.selectById(algorithmBo.getDataId());
         if (ObjectUtil.isNull(dataVo)) {
             throw new BusinessException("数据为空,请检查!");
         }
+
         // 参数
         String param = algorithmBo.getParam();
         Map<String, Object> map = new HashMap<>(JSONUtil.parseObj(param));
-        map.put("url", modelVo.getUrl());
-
-        // 数据url
-
-
-        // 请求
-        ModelHttpVo result = HttpUtils.postJson(modelVo.getUrl(), map, ModelHttpVo.class);
-
-
-        String url = modelVo.getUrl();
-
+        try (InputStream inputStream = ossService.getFileStream(dataVo.getOssId())) {
+            File file = CsvUtils.excelToFileCsvByColumns(inputStream, algorithmBo.getColumnData());
+            SysOssVo sysOssVo = ossService.upload(file);
+            // 请求
+            map.put("url", sysOssVo.getUrl());
+            ModelHttpVo httpVo = sendHttp(modelVo, map);
+            String csvFilePath = "resultData" + CsvUtils.extractFilename("model_result");
+            // 将csv文件持久化到磁盘
+            CsvUtils.jsonToFileCsv(httpVo.getData(), EcoConfig.getUploadPath() + csvFilePath);
+            File resultFile = CsvUtils.jsonToFileCsv(httpVo.getData(), "model_result.csv");
+            sysOssVo = ossService.upload(resultFile);
+            PreProcessingBo bo = new PreProcessingBo();
+            bo.setAircraftNo(dataVo.getAircraftNo()).setSortieNo(dataVo.getSortieNo()).setOssId(sysOssVo.getOssId());
+            processingService.insert(bo);
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
         return null;
     }
 
-    public static void main(String[] args) {
-        String jsonStr = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";
-        Map<String, Object> map = new HashMap<>(JSONUtil.parseObj(jsonStr));
-        System.out.println(map);
-
+    private static ModelHttpVo sendHttp(ModelVo modelVo, Map<String, Object> map) {
+        String result = HttpUtils.postJson(modelVo.getUrl(), map);
+        JSONObject jsonObject = JSONUtil.parseObj(result);
+        String data = jsonObject.getStr("data");
+        String status = jsonObject.getStr("status");
+        String msg = jsonObject.getStr("msg");
+        return ModelHttpVo.builder().data(data).status(Integer.valueOf(status)).msg(msg).build();
     }
 }

+ 339 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/utils/CsvUtils.java

@@ -0,0 +1,339 @@
+package org.eco.als.utils;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.text.csv.CsvData;
+import cn.hutool.core.text.csv.CsvReader;
+import cn.hutool.core.text.csv.CsvRow;
+import cn.hutool.core.text.csv.CsvUtil;
+import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import cn.hutool.poi.excel.ExcelReader;
+import cn.hutool.poi.excel.ExcelUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.eco.common.core.config.EcoConfig;
+import org.eco.common.core.utils.DateUtils;
+import org.eco.common.core.utils.StringUtils;
+import org.eco.common.core.utils.uuid.Seq;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: CsvUtils
+ * @Author: GaoKun Wang
+ * @Date: 2024/8/1
+ */
+@Slf4j
+public class CsvUtils {
+    public static final String CSV_TYPE = "csv";
+
+    /**
+     * 编码文件名
+     */
+    public static final String extractFilename(String fileName) {
+        return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), fileName, Seq.getId(Seq.uploadSeqType),
+            CSV_TYPE);
+    }
+
+    public static final String getFilename(String fileName) {
+        return StringUtils.format("{}/{}.{}", DateUtils.datePath(), fileName, CSV_TYPE);
+    }
+
+    /**
+     * json 转 csv数据
+     *
+     * @param jsonArray 数组
+     * @return csv 结果
+     */
+    public static List<String> jsonArrayToCsv(JSONArray jsonArray) {
+        // 获取CSV的表头
+        List<String> headers = new ArrayList<>(jsonArray.getJSONObject(0).keySet());
+        // 构造CSV行列表
+        List<String> csvLines = jsonArray.stream().map(jsonObject -> {
+            StringBuilder line = new StringBuilder();
+            for (String header : headers) {
+                // 根据表头获取对应的值,并追加到CSV行中
+                line.append(((JSONObject) jsonObject).get(header)).append(",");
+            }
+            // 移除末尾的逗号
+            return line.substring(0, line.length() - 1);
+        }).collect(Collectors.toList());
+        // 在CSV行列表开头添加表头
+        csvLines.add(0, String.join(",", headers));
+        return csvLines;
+    }
+
+    /**
+     * json转csv文件
+     *
+     * @param jsonString  data
+     * @param csvFilePath path
+     */
+    public static File jsonToFileCsv(String jsonString, String csvFilePath) {
+        try {
+            // 将JSON字符串转换为JSON数组
+            JSONArray jsonArray = JSONUtil.parseArray(jsonString);
+            // 将JSON数组写入CSV文件
+            return jsonToFileCsvByJsonArray(jsonArray, csvFilePath);
+        } catch (Exception e) {
+            log.error("json转csv文件错误:{}", e.getMessage());
+        }
+        return null;
+    }
+
+    /**
+     * json转csv文件
+     *
+     * @param jsonArray   data
+     * @param csvFilePath path
+     */
+    public static File jsonToFileCsvByJsonArray(JSONArray jsonArray, String csvFilePath) {
+        try {
+            // 将JSON数组写入CSV文件
+            return FileUtil.writeLines(jsonArrayToCsv(jsonArray), csvFilePath, CharsetUtil.CHARSET_UTF_8);
+        } catch (Exception e) {
+            log.error("json转csv文件错误:{}", e.getMessage());
+        }
+        return null;
+    }
+
+    /**
+     * csv文件转Json
+     *
+     * @param path path
+     */
+    public static JSONArray fileCsvToJson(String path) {
+        String csvFilePath = EcoConfig.getUploadPath() + path;
+        List<CsvRow> rows = getCsvRowList(csvFilePath);
+        // 获取CSV表头,即第一行数据
+        assert rows != null;
+        List<String> headers = rows.get(0).getRawList();
+        // 去除第一行,保留后续数据
+        List<CsvRow> dataLines = rows.subList(1, rows.size());
+        JSONArray jsonArray = new JSONArray();
+        for (CsvRow line : dataLines) {
+            JSONObject jsonObject = new JSONObject();
+            for (int i = 0; i < headers.size(); i++) {
+                jsonObject.putOnce(headers.get(i), line.getRawList().get(i));
+            }
+            jsonArray.add(jsonObject);
+        }
+        return jsonArray;
+    }
+
+    /**
+     * 处理异常值
+     *
+     * @param path path
+     */
+    public static JSONArray abnormal(String path) {
+        JSONArray jsonArray = fileCsvToJson(path);
+        for (int i = 0; i < jsonArray.size(); i++) {
+            // 获取JSONArray中的JSONObject
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            // 用于存储要删除的 key
+            List<String> keysToRemove = new ArrayList<>();
+            // 获取JSONObject的所有key
+            for (String key : jsonObject.keySet()) {
+                if (StrUtil.contains(key, "_是否异常") && StrUtil.equals("1", jsonObject.get(key).toString())) {
+                    jsonObject.set(StrUtil.subBefore(key, "_是否异常", true), "");
+                }
+                if (StrUtil.contains(key, "_是否异常")) {
+                    // 添加要删除的 key 到列表
+                    keysToRemove.add(key);
+                }
+            }
+            // 移除要删除的 key
+            for (String keyToRemove : keysToRemove) {
+                jsonObject.remove(keyToRemove);
+            }
+        }
+        return jsonArray;
+    }
+
+    /**
+     * 获取csv文件中 参数名称
+     *
+     * @param csvFilePath csv文件地址
+     * @return 参数名称列表
+     */
+    public static List<String> getCsvHeaders(String csvFilePath) {
+        List<CsvRow> rows = getCsvRowList(EcoConfig.getUploadPath() + csvFilePath);
+        assert rows != null;
+        return rows.get(0).getRawList();
+    }
+
+    /**
+     * 根据头名称(参数名称)获取csv文件中参数数据
+     *
+     * @param csvFilePath csv文件地址
+     * @param headerNames 参数名称
+     * @return 参数名称列表
+     */
+    public static JSONArray getCsvDataByHeaders(String csvFilePath, List<String> headerNames, Integer step) {
+        List<CsvRow> rows = getCsvRowList(EcoConfig.getUploadPath() + csvFilePath);
+        // 获取CSV表头,即第一行数据
+        List<String> headers = rows.get(0).getRawList();
+        List<Integer> indexList = new ArrayList<>();
+        headerNames.forEach(name -> {
+            int index = headers.indexOf(name);
+            if (index != -1) {
+                indexList.add(index);
+            }
+        });
+        if (CollectionUtil.isEmpty(indexList)) {
+            return null;
+        }
+        // 去除第一行,保留后续数据
+        List<CsvRow> dataLines = rows.subList(1, rows.size());
+        JSONArray jsonArray = new JSONArray();
+        for (CsvRow line : dataLines) {
+            JSONObject jsonObject = new JSONObject();
+            for (int i = 0; i < headers.size(); i++) {
+                // 参数索引位置
+                if (indexList.contains(i)) {
+                    jsonObject.putOnce(headers.get(i), line.getRawList().get(i));
+                }
+            }
+            jsonArray.add(jsonObject);
+        }
+        if (step != null) {
+            jsonArray = reduceFrameRate(jsonArray, 10, step);
+        }
+        return jsonArray;
+    }
+
+    public static JSONObject getPlaybackByHeaders(String csvFilePath, List<String> headerNames, Integer step) {
+        List<CsvRow> rows = getCsvRowList(EcoConfig.getUploadPath() + csvFilePath);
+        // 获取CSV表头,即第一行数据
+        List<String> headers = rows.get(0).getRawList();
+        List<Integer> indexList = new ArrayList<>();
+        headerNames.forEach(name -> {
+            int index = headers.indexOf(name);
+            if (index != -1) {
+                indexList.add(index);
+            }
+        });
+        if (CollectionUtil.isEmpty(indexList)) {
+            return null;
+        }
+        // 去除第一行,保留后续数据
+        List<CsvRow> dataLines = rows.subList(1, rows.size());
+        JSONObject jsonObject = new JSONObject();
+        for (int i = 0; i < headers.size(); i++) {
+            JSONArray jsonArray = new JSONArray();
+            for (CsvRow line : dataLines) {
+                jsonArray.add(line.getRawList().get(i));
+            }
+            if (step != null) {
+                jsonArray = reduceFrameRate(jsonArray, 10, step);
+            }
+            // 参数索引位置
+            if (indexList.contains(i)) {
+                jsonObject.putOnce(headers.get(i), jsonArray);
+            }
+        }
+        return jsonObject;
+    }
+
+    /**
+     * 处理数据帧
+     *
+     * @param originalData      原始数据
+     * @param originalFrameRate 原始帧率
+     * @param targetFrameRate   目标帧率
+     * @return 降采样后的数据
+     */
+    public static JSONArray reduceFrameRate(JSONArray originalData, int originalFrameRate, int targetFrameRate) {
+        int originalFrameCount = originalData.size();
+        int targetFrameCount = (int) Math.floor((double) originalFrameCount / originalFrameRate * targetFrameRate);
+        JSONArray result = new JSONArray();
+        double ratio = (double) originalFrameCount / targetFrameCount;
+        for (int i = 0; i < targetFrameCount; i++) {
+            int index = (int) Math.floor(i * ratio);
+            result.add(originalData.get(index));
+        }
+        return result;
+    }
+
+    private static List<CsvRow> getCsvRowList(String csvFilePath) {
+        try {
+            CsvReader reader = CsvUtil.getReader();
+            // 从文件中读取CSV数据
+            CsvData data = reader.read(FileUtil.file(csvFilePath), CharsetUtil.CHARSET_UTF_8);
+            return data.getRows();
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+        return null;
+    }
+
+    /**
+     * json转csv文件
+     *
+     * @param excelFilePath path
+     * @param csvFilePath   path
+     */
+    public static void excelToFileCsv(String excelFilePath, String csvFilePath) {
+        // 读取Excel文件,获取ExcelReader
+        ExcelReader reader = ExcelUtil.getReader(excelFilePath);
+        // 通过ExcelReader将Excel文件读取为List<Map>
+        List<Map<String, Object>> readAll = reader.readAll();
+        String json = JSONUtil.toJsonStr(readAll);
+        jsonToFileCsv(json, csvFilePath);
+    }
+
+    /**
+     * json转csv文件
+     *
+     * @param excelFilePath path
+     * @param columnNames   names
+     */
+    public static File excelToFileCsvByColumns(String excelFilePath, String[] columnNames) {
+        return getFile(ExcelUtil.getReader(excelFilePath), columnNames, excelFilePath);
+    }
+
+    public static File excelToFileCsvByColumns(InputStream stream, String[] columnNames) {
+        String tempPath = "模型参数.csv";
+        return getFile(ExcelUtil.getReader(stream), columnNames, tempPath);
+    }
+
+    private static File getFile(ExcelReader reader, String[] columnNames, String tempPath) {
+        // 通过ExcelReader将Excel文件读取为List<Map>
+        List<Map<String, Object>> readAll = filterColumns(reader.readAll(), columnNames);
+        String json = JSONUtil.toJsonStr(readAll);
+        return jsonToFileCsv(json, tempPath);
+    }
+
+    /**
+     * filterColumns 根据列名称过滤数据
+     *
+     * @param originalData 原数据
+     * @param columnNames  列表名
+     * @return java.util.List<java.util.Map < java.lang.String, java.lang.Object>>
+     **/
+    private static List<Map<String, Object>> filterColumns(List<Map<String, Object>> originalData, String[] columnNames) {
+        List<Map<String, Object>> filteredData = new ArrayList<>();
+        for (Map<String, Object> originalRow : originalData) {
+            // 使用列名构建新映射
+            Map<String, Object> filteredRow = MapUtil.newHashMap();
+            for (String columnName : columnNames) {
+                Object value = originalRow.get(columnName.trim());
+                if (value != null) {
+                    filteredRow.put(columnName.trim(), value);
+                }
+            }
+            filteredData.add(filteredRow);
+        }
+        return filteredData;
+    }
+}

+ 9 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/utils/FileUtil.java

@@ -0,0 +1,9 @@
+package org.eco.als.utils;
+
+/**
+ * @Description: FileUtiil
+ * @Author: GaoKun Wang
+ * @Date: 2024/8/1
+ */
+public class FileUtil {
+}

+ 0 - 2
als-modules/system/src/main/java/org/eco/system/controller/system/SysOssConfigController.java

@@ -30,8 +30,6 @@ import java.util.List;
  * 对象存储配置
  *
  * @author wgk
- * @author 孤舟烟雨
- * @author wgk
  * @date 2023-11-30
  */
 @Validated

+ 3 - 0
als-modules/system/src/main/java/org/eco/system/service/ISysOssService.java

@@ -10,6 +10,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.Collection;
 import java.util.List;
 
@@ -32,6 +33,8 @@ public interface ISysOssService extends IBaseService<SysOss> {
 
     void download(Long ossId, HttpServletResponse response) throws IOException;
 
+    InputStream getFileStream(Long ossId);
+
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
     SysOssVo saveResultEntity(String originalFileName, String suffix, String url, String fileName);
 }

+ 17 - 1
als-modules/system/src/main/java/org/eco/system/service/impl/SysOssServiceImpl.java

@@ -45,6 +45,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import static org.eco.common.core.utils.file.FileUtils.percentEncode;
 import static org.eco.system.domain.table.SysOssTableDef.SYS_OSS;
 
 /**
@@ -74,7 +75,7 @@ public class SysOssServiceImpl extends BaseServiceImpl<SysOssMapper, SysOss> imp
             .and(SYS_OSS.URL.eq(bo.getUrl()))
             .and(SYS_OSS.CREATE_TIME.between(bo.getParams().get("beginCreateTime"), bo.getParams().get("endCreateTime")))
             .and(SYS_OSS.SERVICE.eq(bo.getService()))
-            .orderBy(SYS_OSS.OSS_ID.asc());
+            .orderBy(SYS_OSS.UPDATE_TIME.desc());
     }
 
     @Override
@@ -145,6 +146,21 @@ public class SysOssServiceImpl extends BaseServiceImpl<SysOssMapper, SysOss> imp
         }
     }
 
+    @Override
+    public InputStream getFileStream(Long ossId) {
+        SysOssVo sysOss = SpringUtils.getAopProxy(this).getById(ossId);
+        if (ObjectUtil.isNull(sysOss)) {
+            throw new BusinessException("文件数据不存在!");
+        }
+        OssClient storage = OssFactory.instance(sysOss.getService());
+        try {
+            String percentEncodedFileName = percentEncode(sysOss.getOriginalName());
+            return storage.getObjectContent(sysOss.getUrl());
+        } catch (Exception e) {
+            throw new BusinessException(e.getMessage());
+        }
+    }
+
     @Override
     public SysOssVo upload(MultipartFile file) {
         String originalFilename = file.getOriginalFilename();

+ 7 - 14
als-start/src/main/java/org/eco/web/controller/common/CommonController.java

@@ -1,5 +1,6 @@
 package org.eco.web.controller.common;
 
+import jakarta.servlet.http.HttpServletResponse;
 import org.eco.common.core.config.EcoConfig;
 import org.eco.common.core.constant.Constants;
 import org.eco.common.core.core.domain.CommonResult;
@@ -10,8 +11,6 @@ import org.eco.system.config.ServerConfig;
 import org.eco.system.domain.vo.SysOssUploadVo;
 import org.eco.system.domain.vo.SysOssVo;
 import org.eco.system.service.ISysOssService;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -53,7 +52,7 @@ public class CommonController {
      * @param delete   是否删除
      */
     @GetMapping("/download")
-    public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) {
+    public void fileDownload(String fileName, Boolean delete, HttpServletResponse response) {
         try {
             if (!FileUtils.checkAllowDownload(fileName)) {
                 throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
@@ -76,7 +75,7 @@ public class CommonController {
      * 通用上传请求(单个)
      */
     @PostMapping("/upload")
-    public CommonResult<SysOssUploadVo> uploadFile(MultipartFile file) throws Exception {
+    public CommonResult<SysOssUploadVo> uploadFile(MultipartFile file) {
         try {
 
             // 上传文件路径
@@ -84,16 +83,11 @@ public class CommonController {
             // 上传并返回新文件名称
             String fileName = FileUploadUtils.upload(filePath, file);
             String url = serverConfig.getUrl() + fileName;
-            String  originalFilename = file.getOriginalFilename();
-            Map<String, Object> map = new HashMap<>();
-            map.put("url", url);
-            map.put("fileName", fileName);
-            map.put("newFileName", FileUtils.getName(fileName));
-            map.put("originalFilename", originalFilename);
+            String originalFilename = file.getOriginalFilename();
             assert originalFilename != null;
             String suffix = StringUtils.substring(originalFilename, originalFilename.lastIndexOf("."), originalFilename.length());
             // 信息保存在文件管理
-            SysOssVo oss = sysOssService.saveResultEntity(file.getOriginalFilename(),suffix, url,fileName);
+            SysOssVo oss = sysOssService.saveResultEntity(file.getOriginalFilename(), suffix, url, fileName);
             SysOssUploadVo uploadVo = new SysOssUploadVo();
             uploadVo.setUrl(oss.getUrl());
             uploadVo.setFileName(oss.getOriginalName());
@@ -108,7 +102,7 @@ public class CommonController {
      * 通用上传请求(多个)
      */
     @PostMapping("/uploads")
-    public CommonResult<Map<String, Object>> uploadFiles(List<MultipartFile> files) throws Exception {
+    public CommonResult<Map<String, Object>> uploadFiles(List<MultipartFile> files) {
         try {
             // 上传文件路径
             String filePath = EcoConfig.getUploadPath();
@@ -140,8 +134,7 @@ public class CommonController {
      * 本地资源通用下载
      */
     @GetMapping("/download/resource")
-    public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
-        throws Exception {
+    public void resourceDownload(String resource, HttpServletResponse response) {
         try {
             if (!FileUtils.checkAllowDownload(resource)) {
                 throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));

+ 6 - 0
pom.xml

@@ -115,6 +115,12 @@
                 <scope>import</scope>
             </dependency>
 
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>${hutool.version}</version>
+            </dependency>
+
             <!-- common 的依赖配置-->
             <dependency>
                 <groupId>org.eco</groupId>