吉安感知网项目-后端
linwei
2026-05-21 1159c4ef3606f50fecdacb8933efe24efac01e88
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdTaskResultServiceImpl.java
@@ -21,11 +21,22 @@
import org.sxkj.gd.workorder.excel.GdTaskResultExcel;
import org.sxkj.gd.workorder.mapper.GdTaskResultMapper;
import org.sxkj.gd.workorder.service.IGdTaskResultService;
import org.sxkj.common.utils.HeaderUtils;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.utils.Func;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
 * 成果表 服务实现类
@@ -60,6 +71,39 @@
      return gdTaskResultList;
   }
   @Override
   public boolean saveBatchTaskResult(List<GdTaskResultEntity> gdTaskResultEntities) {
      if (gdTaskResultEntities == null || gdTaskResultEntities.isEmpty()) {
         log.error("saveBatchTaskResult-批量新增-对外接口数据为空");
         return false;
      }
      gdTaskResultEntities.forEach(gdTaskResult -> {
         String resultUrl = gdTaskResult.getResultUrl();
         // 使用HeaderUtils处理区域代码
         // resultUrl =  http://220.177.172.27:8100/S3/xcy010.eoshlw.internal.jazwy.cn/2026/04/23/DJI_20260128135433_0005_V_20260423111422A015.jpeg
         // resultUrl = http://220.177.172.27:8100/S3/xcy010.eoshlw.internal.jazwy.cn/2026/04/23/2026-04-23-09-50-29-0_20260423190046A001.mp4
         gdTaskResult.setAttachmentType(HeaderUtils.getAttachmentType(resultUrl));
         String processedAreaCode = HeaderUtils.processAreaCode(gdTaskResult.getAreaCode());
         gdTaskResult.setAreaCode(processedAreaCode);
         gdTaskResult.setStatus(0);
         gdTaskResult.setUpdateTime(new Date());
         gdTaskResult.setCreateTime(new Date());
         gdTaskResult.setIsDeleted(0);
         gdTaskResult.setCreateDept(1L);
         gdTaskResult.setUpdateUser(1L);
         gdTaskResult.setDistributeStatus(0);
      });
      // 执行批量保存并返回结果
      int result = baseMapper.insertBatch(gdTaskResultEntities);
      return result > 0;
   }
   @Override
   public boolean updateTaskResultById(GdTaskResultEntity taskResult) {
      int result = baseMapper.updateTaskResultById(taskResult);
      return result > 0;
   }
   /**
    * 将URL中的HTML/XML转义字符还原为原始字符
    * 主要处理 &amp; 转换为 &
@@ -86,4 +130,84 @@
      return result;
   }
   @Override
   public void downloadResultFiles(String ids, HttpServletResponse response) {
      // 根据ID列表查询成果记录
      List<Long> idList = Func.toLongList(ids);
      List<GdTaskResultEntity> resultList = listByIds(idList);
      if (resultList == null || resultList.isEmpty()) {
         throw new RuntimeException("未找到成果数据");
      }
      // 设置响应头
      response.setContentType("application/zip");
      response.setHeader("Content-Disposition", "attachment; filename=result_files.zip");
      try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {
         for (GdTaskResultEntity result : resultList) {
            String resultUrl = result.getResultUrl();
            if (resultUrl == null || resultUrl.isEmpty()) {
               continue;
            }
            // 处理转义字符
            resultUrl = unescapeUrl(resultUrl);
            try {
               // 从URL下载文件
               URL url = new URL(resultUrl);
               URLConnection connection = url.openConnection();
               connection.setConnectTimeout(5000);
               connection.setReadTimeout(10000);
               // 从URL中提取文件名
               String fileName = extractFileName(resultUrl, result.getId());
               // 添加到ZIP
               ZipEntry zipEntry = new ZipEntry(fileName);
               zos.putNextEntry(zipEntry);
               try (InputStream is = connection.getInputStream()) {
                  byte[] buffer = new byte[4096];
                  int len;
                  while ((len = is.read(buffer)) > 0) {
                     zos.write(buffer, 0, len);
                  }
               }
               zos.closeEntry();
            } catch (Exception e) {
               // 单个文件下载失败,继续处理其他文件
               // 可以记录日志
            }
         }
      } catch (IOException e) {
         throw new RuntimeException("下载文件失败", e);
      }
   }
   /**
    * 从URL中提取文件名
    */
   private String extractFileName(String url, Long resultId) {
      if (url == null || url.isEmpty()) {
         return resultId + "_unknown";
      }
      // 从URL中提取最后一部分作为文件名
      int lastSlash = url.lastIndexOf('/');
      if (lastSlash != -1 && lastSlash < url.length() - 1) {
         String fileName = url.substring(lastSlash + 1);
         // 处理可能的查询参数
         int questionMark = fileName.indexOf('?');
         if (questionMark != -1) {
            fileName = fileName.substring(0, questionMark);
         }
         return resultId + "_" + fileName;
      }
      return resultId + "_file";
   }
}