吉安感知网项目-后端
linwei
6 days ago 59adc3dbb396facc71b1fcc03eec24d059726f68
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/wrapper/GdTaskResultWrapper.java
@@ -16,14 +16,18 @@
 */
package org.sxkj.gd.workorder.wrapper;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.StringUtil;
import org.sxkj.gd.workorder.dto.GdTaskResultDTO;
import org.sxkj.gd.workorder.entity.GdTaskResultEntity;
import org.sxkj.gd.workorder.vo.GdTaskResultVO;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
 * 成果表 包装类,返回视图层所需的字段
@@ -31,6 +35,7 @@
 * @author lw
 * @since 2026-01-14
 */
@Slf4j
public class GdTaskResultWrapper extends BaseEntityWrapper<GdTaskResultEntity, GdTaskResultVO>  {
   public static GdTaskResultWrapper build() {
@@ -39,12 +44,152 @@
   @Override
   public GdTaskResultVO entityVO(GdTaskResultEntity gdTaskResult) {
      return Objects.requireNonNull(BeanUtil.copy(gdTaskResult, GdTaskResultVO.class));
   }
   /**
    * 将DTO列表转换为Entity列表
    *
    * @param gdTaskResultDTOList DTO列表
    * @return Entity列表
    */
   public List<GdTaskResultEntity> listEntity(List<GdTaskResultDTO> gdTaskResultDTOList) {
      return BeanUtil.copyWithConvert(gdTaskResultDTOList, GdTaskResultEntity.class);
      return gdTaskResultDTOList.stream()
            .map(this::convertDtoToEntity)
            .collect(Collectors.toList());
   }
   /**
    * 将单个DTO转换为Entity
    * 处理geojson字段:将字符串数组格式转换为正确的JSON对象数组格式
    *
    * @param dto DTO对象,不能为null
    * @return Entity对象
    * @throws IllegalArgumentException 当dto为null时抛出
    */
   private GdTaskResultEntity convertDtoToEntity(GdTaskResultDTO dto) {
      // 步骤1:参数校验
      if (dto == null) {
         throw new IllegalArgumentException("dto不能为null");
      }
      // 步骤2:基础属性拷贝
      GdTaskResultEntity entity = BeanUtil.copy(dto, GdTaskResultEntity.class);
      // 步骤3:设置附件类型
      Integer attachmentType = determineAttachmentType(dto);
      entity.setAttachmentType(attachmentType);
      // 步骤4:处理geojson字段,将字符串数组转换为正确的JSON格式
      String processedGeojson = processGeojson(dto.getGeojson());
      entity.setGeojson(processedGeojson);
      return entity;
   }
   /**
    * 根据DTO信息确定附件类型
    * 优先使用dateType判断,其次通过文件URL后缀判断
    *
    * @param dto DTO对象
    * @return 附件类型:1-图片,3-视频
    */
   private Integer determineAttachmentType(GdTaskResultDTO dto) {
      // 步骤1:优先使用dateType判断
      if (dto.getDateType() != null) {
         // 录像的视频特殊处理
         if ("视频".equals(dto.getFileType())) {
            return 3;
         }
         return dto.getDateType();
      }
      // 步骤2:通过URL后缀判断
      String resultUrl = dto.getResultUrl();
      if (StringUtil.isEmpty(resultUrl)) {
         return 1; // 默认返回图片类型
      }
      // 步骤3:根据文件扩展名判断类型
      String lowerUrl = resultUrl.toLowerCase();
      if (lowerUrl.endsWith(".mp4") || lowerUrl.endsWith(".m3u8")) {
         return 3; // 视频
      }
      return 1; // 图片(包含jpg、png及其他格式)
   }
   /**
    * 处理geojson字段,将字符串数组格式转换为正确的JSON对象数组格式
    * 解决问题:["{\"score\":0.88}"] -> [{"score":0.88}]
    *
    * @param geojson 原始geojson字符串
    * @return 处理后的geojson字符串,如果处理失败则返回原值
    */
   private String processGeojson(String geojson) {
      // 步骤1:空值检查
      if (StringUtil.isEmpty(geojson)) {
         return geojson;
      }
      try {
         // 步骤2:尝试解析为JSONArray
         com.alibaba.fastjson.JSONArray jsonArray = JSON.parseArray(geojson);
         if (jsonArray == null || jsonArray.isEmpty()) {
            return geojson;
         }
         // 步骤3:检查第一个元素是否为字符串(说明是字符串数组格式)
         Object firstElement = jsonArray.get(0);
         if (firstElement instanceof String) {
            // 步骤4:这是一个字符串数组,需要解析每个字符串元素
            com.alibaba.fastjson.JSONArray resultArray = new com.alibaba.fastjson.JSONArray();
            for (int i = 0; i < jsonArray.size(); i++) {
               String elementStr = jsonArray.getString(i);
               if (StringUtil.hasText(elementStr)) {
                  try {
                     // 步骤5:解析字符串为JSON对象
                     com.alibaba.fastjson.JSONObject jsonObj = JSON.parseObject(elementStr);
                     if (jsonObj != null) {
                        resultArray.add(jsonObj);
                     }
                  } catch (Exception e) {
                     // 单个元素解析失败,记录日志但继续处理其他元素
                     log.warn("解析geojson数组元素失败: {}", elementStr);
                  }
               }
            }
            // 步骤6:返回正确的JSON数组格式
            return resultArray.toJSONString();
         }
         // 如果不是字符串数组,直接返回原值
         return geojson;
      } catch (Exception e) {
         // 解析失败,返回原值
         log.warn("处理geojson失败,返回原值: {}", geojson, e);
         return geojson;
      }
   }
   /**
    * 将文件类型字符串转换为附件类型编码
    *
    * @param fileType 文件类型字符串(图片/视频/照片)
    * @return 附件类型编码:0-图片,1-视频,2-其他
    */
   private Integer convertFileTypeToAttachmentType(String fileType) {
      if (fileType == null) {
         return 2;
      }
      switch (fileType.trim()) {
         case "图片":
         case "照片":
            return 0;
         case "视频":
            return 1;
         default:
            return 2;
      }
   }
}