Kaynağa Gözat

feat: 数据管理优化 + 图片预览接口

WANGKANG 8 ay önce
ebeveyn
işleme
223eff60ee

+ 5 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/controller/DataSeqController.java

@@ -106,4 +106,9 @@ public class DataSeqController extends BaseController {
         }
         return CommonResult.success();
     }
+
+    @GetMapping("/getAllImages/{inputOdssId}")
+    public CommonResult<List<String>> getAllImages(@PathVariable Long inputOdssId) {
+        return CommonResult.success(dataSeqService.getAllImages(inputOdssId));
+    }
 }

+ 65 - 19
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/DataSeq.java

@@ -1,6 +1,7 @@
 package com.taais.biz.domain;
 
 import java.util.Date;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.mybatisflex.annotation.Column;
 import com.mybatisflex.annotation.Id;
@@ -9,6 +10,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
+
 import com.taais.common.orm.core.domain.BaseEntity;
 
 /**
@@ -20,57 +22,101 @@ import com.taais.common.orm.core.domain.BaseEntity;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @Table(value = "data_seq")
-public class DataSeq extends BaseEntity
-    {
-@Serial
-private static final long serialVersionUID = 1L;
+public class DataSeq extends BaseEntity {
+    @Serial
+    private static final long serialVersionUID = 1L;
 
-    /** id */
+    /**
+     * id
+     */
     @Id
     private Long id;
 
-    /** 名称 */
+    /**
+     * 名称
+     */
     private String name;
 
-    /** 数据类型 */
+    private String subsystem;
+
+    /**
+     * 数据类型
+     */
     private String dataType;
 
-    /** 文件类型 */
+    /**
+     * 文件类型
+     */
     private String fileType;
 
-    /** 目标类型 */
+    /**
+     * 目标类型
+     */
     private String objectType;
 
-    /** 目标子类型 */
+    /**
+     * 目标子类型
+     */
     private String objectSubtype;
 
-    /** 批次号 */
+    /**
+     * 批次号
+     */
     private String batchNum;
 
-    /** 场景 */
+    /**
+     * 场景
+     */
     private String scene;
 
-    /** 数据源 */
+    /**
+     * 数据源
+     */
     private String dataSource;
 
-    /** 采集时间 */
+    /**
+     * 采集时间
+     */
     private Date gatherTime;
 
-    /** 采集地点 */
+    /**
+     * 采集地点
+     */
     private String gatherSpot;
 
-    /** 图片url */
+    /**
+     * 图片url
+     */
     private String url;
 
-    /** 日志 */
+    /**
+     * 日志
+     */
     private String log;
 
-    /** 备注 */
+    /**
+     * 备注
+     */
     private String remarks;
 
-    /** 逻辑删除标志(0代表存在 1代表删除) */
+    /**
+     * 逻辑删除标志(0代表存在 1代表删除)
+     */
     @Column(isLogicDelete = true)
     private Integer delFlag;
 
+    /**
+     * 图片压缩包路径
+     */
+    private String filePath;
+
+    /**
+     * 压缩包解压的路径
+     */
+    private String unzipPath;
 
+    /**
+     * 输入oss_ID
+     */
+    private Long inputOssId;
 }

+ 13 - 13
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/DataSeqBo.java

@@ -5,7 +5,9 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
+
 import java.util.Date;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.taais.common.orm.core.domain.BaseEntity;
 
@@ -18,11 +20,10 @@ import com.taais.common.orm.core.domain.BaseEntity;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @AutoMapper(target = DataSeq.class, reverseConvertGenerate = false)
-public class DataSeqBo extends BaseEntity{
+public class DataSeqBo extends BaseEntity {
     /**
      * id
      */
-    @NotNull(message = "id不能为空")
     private Long id;
 
     /**
@@ -34,25 +35,27 @@ public class DataSeqBo extends BaseEntity{
     /**
      * 数据类型
      */
-    @NotBlank(message = "数据类型不能为空")
+    @NotBlank(message = "分系统不能为空")
+    private String subsystem;
+
+    /**
+     * 数据类型
+     */
     private String dataType;
 
     /**
      * 文件类型
      */
-    @NotBlank(message = "文件类型不能为空")
     private String fileType;
 
     /**
      * 目标类型
      */
-    @NotBlank(message = "目标类型不能为空")
     private String objectType;
 
     /**
      * 目标子类型
      */
-    @NotBlank(message = "目标子类型不能为空")
     private String objectSubtype;
 
     /**
@@ -64,45 +67,42 @@ public class DataSeqBo extends BaseEntity{
     /**
      * 场景
      */
-    @NotBlank(message = "场景不能为空")
     private String scene;
 
     /**
      * 数据源
      */
-    @NotBlank(message = "数据源不能为空")
     private String dataSource;
 
     /**
      * 采集时间
      */
-    @NotNull(message = "采集时间不能为空")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date gatherTime;
 
     /**
      * 采集地点
      */
-    @NotBlank(message = "采集地点不能为空")
     private String gatherSpot;
 
     /**
      * 图片url
      */
-    @NotBlank(message = "图片url不能为空")
     private String url;
 
     /**
      * 日志
      */
-    @NotBlank(message = "日志不能为空")
     private String log;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空")
     private String remarks;
 
+    private String filePath;
+    private String unzipPath;
 
+    @NotNull(message = "请上传数据集文件")
+    private Long inputOssId;
 }

+ 60 - 17
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/DataSeqVo.java

@@ -1,6 +1,7 @@
 package com.taais.biz.domain.vo;
 
 import java.util.Date;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.taais.biz.domain.DataSeq;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
@@ -8,10 +9,13 @@ import com.alibaba.excel.annotation.ExcelProperty;
 import com.taais.common.excel.annotation.ExcelDictFormat;
 import com.taais.common.excel.convert.ExcelDictConvert;
 import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+
 import java.io.Serial;
 import java.io.Serializable;
+
 import com.taais.common.orm.core.domain.BaseEntity;
 
 /**
@@ -26,69 +30,108 @@ import com.taais.common.orm.core.domain.BaseEntity;
 @AutoMapper(target = DataSeq.class)
 public class DataSeqVo extends BaseEntity implements Serializable {
 
-@Serial
-private static final long serialVersionUID = 1L;
+    @Serial
+    private static final long serialVersionUID = 1L;
 
-    /** id */
+    /**
+     * id
+     */
     @ExcelProperty(value = "id")
     private Long id;
 
-    /** 名称 */
+    /**
+     * 名称
+     */
     @ExcelProperty(value = "名称")
     private String name;
 
-    /** 数据类型 */
+    /**
+     * 数据类型
+     */
     @ExcelProperty(value = "数据类型")
     private String dataType;
 
-    /** 文件类型 */
+    /**
+     * 文件类型
+     */
     @ExcelProperty(value = "文件类型")
     private String fileType;
 
-    /** 目标类型 */
+    /**
+     * 目标类型
+     */
     @ExcelProperty(value = "目标类型")
     private String objectType;
 
-    /** 目标子类型 */
+    /**
+     * 目标子类型
+     */
     @ExcelProperty(value = "目标子类型")
     private String objectSubtype;
 
-    /** 批次号 */
+    /**
+     * 批次号
+     */
     @ExcelProperty(value = "批次号")
     private String batchNum;
 
-    /** 场景 */
+    /**
+     * 场景
+     */
     @ExcelProperty(value = "场景")
     private String scene;
 
-    /** 数据源 */
+    /**
+     * 数据源
+     */
     @ExcelProperty(value = "数据源")
     private String dataSource;
 
-    /** 采集时间 */
+    /**
+     * 采集时间
+     */
     @ExcelProperty(value = "采集时间")
     private Date gatherTime;
 
-    /** 采集地点 */
+    /**
+     * 采集地点
+     */
     @ExcelProperty(value = "采集地点")
     private String gatherSpot;
 
-    /** 图片url */
+    /**
+     * 图片url
+     */
     @ExcelProperty(value = "图片url")
     private String url;
 
-    /** 日志 */
+    /**
+     * 日志
+     */
     @ExcelProperty(value = "日志")
     private String log;
 
-    /** 备注 */
+    /**
+     * 备注
+     */
     @ExcelProperty(value = "备注")
     private String remarks;
 
-    /** 逻辑删除标志(0代表存在 1代表删除) */
+    /**
+     * 逻辑删除标志(0代表存在 1代表删除)
+     */
     @ExcelProperty(value = "逻辑删除标志(0代表存在 1代表删除)")
     private Integer delFlag;
 
+    @ExcelProperty(value = "文件路径")
+    private String filePath;
+
+    @ExcelProperty(value = "解压路径")
+    private String unzipPath;
 
+    @NotBlank(message = "inputOssId")
+    private Long inputOssId;
 
+    @NotBlank(message = "分系统")
+    private String subsystem;
 }

+ 1 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/service/IDataSeqService.java

@@ -63,4 +63,5 @@ public interface IDataSeqService extends IBaseService<DataSeq> {
      */
     boolean deleteByIds(Long[] ids);
 
+    List<String> getAllImages(Long inputOdssId);
 }

+ 92 - 21
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/DataSeqServiceImpl.java

@@ -1,17 +1,23 @@
 package com.taais.biz.service.impl;
 
+import java.io.File;
 import java.util.Arrays;
 import java.util.List;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.mybatisflex.core.paginate.Page;
 import com.mybatisflex.core.query.QueryWrapper;
+import com.taais.common.core.config.TaaisConfig;
+import com.taais.common.core.constant.Constants;
 import com.taais.common.core.utils.MapstructUtils;
 import com.taais.common.core.utils.StringUtils;
 import com.taais.common.orm.core.page.PageQuery;
 import com.taais.common.core.core.page.PageResult;
 import com.taais.common.orm.core.service.impl.BaseServiceImpl;
+import com.taais.system.domain.vo.SysOssVo;
+import com.taais.system.service.ISysOssService;
 import jakarta.annotation.Resource;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import com.taais.biz.mapper.DataSeqMapper;
@@ -19,7 +25,9 @@ import com.taais.biz.domain.DataSeq;
 import com.taais.biz.domain.bo.DataSeqBo;
 import com.taais.biz.domain.vo.DataSeqVo;
 import com.taais.biz.service.IDataSeqService;
+
 import static com.taais.biz.domain.table.DataSeqTableDef.DATA_SEQ;
+import static com.taais.biz.utils.ZipUtils.unzip;
 
 /**
  * 数据管理Service业务层处理
@@ -29,6 +37,8 @@ import static com.taais.biz.domain.table.DataSeqTableDef.DATA_SEQ;
  */
 @Service
 public class DataSeqServiceImpl extends BaseServiceImpl<DataSeqMapper, DataSeq> implements IDataSeqService {
+    @Autowired
+    private ISysOssService ossService;
     @Resource
     private DataSeqMapper dataSeqMapper;
 
@@ -40,31 +50,33 @@ public class DataSeqServiceImpl extends BaseServiceImpl<DataSeqMapper, DataSeq>
     private QueryWrapper buildQueryWrapper(DataSeqBo dataSeqBo) {
         QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
         queryWrapper.and(DATA_SEQ.NAME.like
-        (dataSeqBo.getName()));
+            (dataSeqBo.getName()));
         queryWrapper.and(DATA_SEQ.DATA_TYPE.eq
-        (dataSeqBo.getDataType()));
+            (dataSeqBo.getDataType()));
         queryWrapper.and(DATA_SEQ.FILE_TYPE.eq
-        (dataSeqBo.getFileType()));
+            (dataSeqBo.getFileType()));
         queryWrapper.and(DATA_SEQ.OBJECT_TYPE.eq
-        (dataSeqBo.getObjectType()));
+            (dataSeqBo.getObjectType()));
         queryWrapper.and(DATA_SEQ.OBJECT_SUBTYPE.eq
-        (dataSeqBo.getObjectSubtype()));
+            (dataSeqBo.getObjectSubtype()));
         queryWrapper.and(DATA_SEQ.BATCH_NUM.eq
-        (dataSeqBo.getBatchNum()));
+            (dataSeqBo.getBatchNum()));
         queryWrapper.and(DATA_SEQ.SCENE.eq
-        (dataSeqBo.getScene()));
+            (dataSeqBo.getScene()));
         queryWrapper.and(DATA_SEQ.DATA_SOURCE.eq
-        (dataSeqBo.getDataSource()));
+            (dataSeqBo.getDataSource()));
         queryWrapper.and(DATA_SEQ.GATHER_TIME.eq
-        (dataSeqBo.getGatherTime()));
+            (dataSeqBo.getGatherTime()));
         queryWrapper.and(DATA_SEQ.GATHER_SPOT.eq
-        (dataSeqBo.getGatherSpot()));
+            (dataSeqBo.getGatherSpot()));
         queryWrapper.and(DATA_SEQ.URL.eq
-        (dataSeqBo.getUrl()));
+            (dataSeqBo.getUrl()));
         queryWrapper.and(DATA_SEQ.LOG.eq
-        (dataSeqBo.getLog()));
+            (dataSeqBo.getLog()));
         queryWrapper.and(DATA_SEQ.REMARKS.eq
-        (dataSeqBo.getRemarks()));
+            (dataSeqBo.getRemarks()));
+        queryWrapper.and(DATA_SEQ.SUBSYSTEM.eq
+            (dataSeqBo.getSubsystem()));
 
         return queryWrapper;
     }
@@ -77,7 +89,7 @@ public class DataSeqServiceImpl extends BaseServiceImpl<DataSeqMapper, DataSeq>
      */
     @Override
     public DataSeqVo selectById(Long id) {
-            return this.getOneAs(query().where(DATA_SEQ.ID.eq(id)), DataSeqVo.class);
+        return this.getOneAs(query().where(DATA_SEQ.ID.eq(id)), DataSeqVo.class);
 
     }
 
@@ -90,7 +102,7 @@ public class DataSeqServiceImpl extends BaseServiceImpl<DataSeqMapper, DataSeq>
     @Override
     public List<DataSeqVo> selectList(DataSeqBo dataSeqBo) {
         QueryWrapper queryWrapper = buildQueryWrapper(dataSeqBo);
-            return this.listAs(queryWrapper, DataSeqVo.class);
+        return this.listAs(queryWrapper, DataSeqVo.class);
     }
 
     /**
@@ -102,7 +114,7 @@ public class DataSeqServiceImpl extends BaseServiceImpl<DataSeqMapper, DataSeq>
     @Override
     public PageResult<DataSeqVo> selectPage(DataSeqBo dataSeqBo) {
         QueryWrapper queryWrapper = buildQueryWrapper(dataSeqBo);
-            Page<DataSeqVo> page = this.pageAs(PageQuery.build(), queryWrapper, DataSeqVo.class);
+        Page<DataSeqVo> page = this.pageAs(PageQuery.build(), queryWrapper, DataSeqVo.class);
         return PageResult.build(page);
     }
 
@@ -114,9 +126,28 @@ public class DataSeqServiceImpl extends BaseServiceImpl<DataSeqMapper, DataSeq>
      */
     @Override
     public boolean insert(DataSeqBo dataSeqBo) {
-    DataSeq dataSeq =MapstructUtils.convert(dataSeqBo, DataSeq. class);
+        // 检查input_oss_id是否存在
+        if (ObjectUtil.isNull(dataSeqBo.getInputOssId())) {
+            return false;
+        }
+
+        SysOssVo ossEntity = ossService.getById(dataSeqBo.getInputOssId());
+        if (ObjectUtil.isNull(ossEntity)) {
+            return false;
+        }
+        DataSeq dataSeq = MapstructUtils.convert(dataSeqBo, DataSeq.class);
+
+        String filePath = ossEntity.getFileName();
+        String localPath = TaaisConfig.getProfile();
+        String resourcePath = localPath + StringUtils.substringAfter(filePath, Constants.RESOURCE_PREFIX);
+        dataSeq.setFilePath(resourcePath);
 
-        return this.save(dataSeq);//使用全局配置的雪花算法主键生成器生成ID值
+        String unzipPath = resourcePath.substring(0, resourcePath.lastIndexOf(".")) + "_unzip";
+        unzip(dataSeq.getFilePath(), unzipPath);
+        dataSeq.setUnzipPath(unzipPath);
+
+        dataSeq.setUrl(ossEntity.getUrl());
+        return this.save(dataSeq);// 使用全局配置的雪花算法主键生成器生成ID值
     }
 
     /**
@@ -127,10 +158,10 @@ public class DataSeqServiceImpl extends BaseServiceImpl<DataSeqMapper, DataSeq>
      */
     @Override
     public boolean update(DataSeqBo dataSeqBo) {
-        DataSeq dataSeq =MapstructUtils.convert(dataSeqBo, DataSeq. class);
-        if (ObjectUtil.isNotNull(dataSeq) && ObjectUtil.isNotNull(dataSeq.getId())){
+        DataSeq dataSeq = MapstructUtils.convert(dataSeqBo, DataSeq.class);
+        if (ObjectUtil.isNotNull(dataSeq) && ObjectUtil.isNotNull(dataSeq.getId())) {
             boolean updated = this.updateById(dataSeq);
-                return updated;
+            return updated;
         }
         return false;
     }
@@ -147,4 +178,44 @@ public class DataSeqServiceImpl extends BaseServiceImpl<DataSeqMapper, DataSeq>
         return this.removeByIds(Arrays.asList(ids));
     }
 
+    @Override
+    public List<String> getAllImages(Long inputOdssId) {
+        // 检查input_oss_id是否存在
+        if (ObjectUtil.isNull(inputOdssId)) {
+            return null;
+        }
+        SysOssVo ossEntity = ossService.getById(inputOdssId);
+        if (ObjectUtil.isNull(ossEntity)) {
+            return null;
+        }
+
+        String filePath = ossEntity.getFileName();
+        String localPath = TaaisConfig.getProfile();
+        String resourcePath = localPath + StringUtils.substringAfter(filePath, Constants.RESOURCE_PREFIX);
+        String unzipPath = resourcePath.substring(0, resourcePath.lastIndexOf(".")) + "_unzip";
+
+        String urlPrefix = ossEntity.getUrl().substring(0,  ossEntity.getUrl().lastIndexOf(".")) + "_unzip";
+
+        // 列出unzipPath下所有图片文件
+        File directory = new File(unzipPath);
+        File[] files = directory.listFiles();
+        List<String> imageList = Arrays.asList(files).stream().filter(file -> file.isFile() && isImageFile(file)).map(file -> urlPrefix + "/" + file.getName()).toList();
+        return imageList;
+    }
+
+    // 常见图片格式的后缀
+    private static final String[] IMAGE_EXTENSIONS = {
+        ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".tif", ".webp"
+    };
+
+    // 判断文件是否为常见图片格式
+    private static boolean isImageFile(File file) {
+        String fileName = file.getName().toLowerCase();
+        for (String extension : IMAGE_EXTENSIONS) {
+            if (fileName.endsWith(extension)) {
+                return true;
+            }
+        }
+        return false;
+    }
 }