qianxb il y a 1 an
Parent
commit
4605f7d27a

+ 1 - 1
blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java

@@ -112,7 +112,7 @@ public class CommonUtil {
      */
     public static InputStream getOSSInputStream(String urlStr) throws Exception {
         //获取OSS文件流
-        urlStr = replaceOssUrl(urlStr);
+//        urlStr = replaceOssUrl(urlStr);
         URL imageUrl = new URL(urlStr);
         try {
             HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();

+ 16 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -19,10 +19,12 @@ package org.springblade.archive.controller;
 import cn.hutool.core.text.split.SplitIter;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 
 import lombok.SneakyThrows;
@@ -34,6 +36,7 @@ import org.springblade.archive.utils.CallBgrsjk;
 import org.springblade.archive.utils.FileUtils;
 import org.springblade.archive.vo.CheckoutVO;
 import org.springblade.business.entity.ArchiveFile;
+import org.springblade.business.entity.InformationQuery;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.mp.support.Condition;
@@ -49,6 +52,7 @@ import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.ProjectClient;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -59,6 +63,7 @@ import org.springblade.archive.service.IArchivesAutoService;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -644,4 +649,15 @@ public class ArchivesAutoController extends BladeController {
 		List<CheckoutVO> list = archivesAutoService.getArchivesAutoViewByUnit(unitType,projectId);
 		return R.data(list);
 	}
+
+	/**
+	 * 批量下载档案
+	 */
+	@PostMapping(value = "/batchDownloadFileToZip", produces = {
+		MediaType.APPLICATION_OCTET_STREAM_VALUE, MediaType.APPLICATION_JSON_VALUE})
+	@ApiOperationSupport(order = 19)
+	@ApiOperation(value = "批量下载档案")
+	public void batchDownloadFileToZip(String ids, HttpServletResponse response) {
+		archivesAutoService.batchDownloadFileToZip(ids,response);
+	}
 }

+ 6 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java

@@ -17,6 +17,7 @@
 package org.springblade.archive.mapper;
 
 import org.apache.ibatis.annotations.MapKey;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.archive.dto.ArchivesAutoDTO;
 import org.springblade.archive.entity.ArchivesAuto;
@@ -24,6 +25,7 @@ import org.springblade.archive.vo.ArchivesAutoVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.archive.vo.ArchivesAutoVO2;
+import org.springblade.business.entity.ArchiveFile;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.user.entity.User;
@@ -157,4 +159,8 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
     List<ArchiveTreeContract> getUnitNodeByProjectId(@Param("projectId") Long projectId);
 
 	List<ArchivesAutoVO2> getUnitAllArchive(@Param("node") String node);
+
+    List<ArchiveFile> batchSearchArchiveFile(@Param("ids") List<Long> longs);
+
+	List<ArchivesAuto> getArchives(@Param("ids") List<Long> longs);
 }

+ 15 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -942,6 +942,21 @@
         from (select * from m_archive_tree_contract WHERE is_deleted = 0 and ancestors like concat('%',#{node},'%')) atc
                  join u_archives_auto uaa on atc.id = uaa.node_id  and uaa.is_deleted = 0
     </select>
+    <select id="batchSearchArchiveFile" resultType="org.springblade.business.entity.ArchiveFile">
+        select id,file_name,pdf_file_url,archive_id,project_id FROM u_archive_file
+        WHERE is_element = 0 and is_deleted = 0 and archive_id in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
+    <select id="getArchives" resultType="org.springblade.archive.entity.ArchivesAuto">
+        select id,name
+        from u_archives_auto
+        where   id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
 
 
     <update id="splitFiles">

+ 3 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveOfflineVersionInfoService.java

@@ -14,4 +14,7 @@ public interface IArchiveOfflineVersionInfoService extends BaseService<ArchiveOf
     public void metadataToSqlite(Long projectId) ;
 
     int getPackStatus();
+
+    void packageZip2(String zipUrl,String packUrl) throws Exception ;
+
 }

+ 3 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java

@@ -28,6 +28,7 @@ import org.springblade.system.entity.DictBiz;
 import org.springblade.system.user.entity.User;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
@@ -104,4 +105,6 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	R searchInfo(MultipartFile file) throws IOException;
 
     List<CheckoutVO> getArchivesAutoViewByUnit(Integer unitType, Long projectId);
+
+    void batchDownloadFileToZip(String ids, HttpServletResponse response);
 }

+ 1 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveOfflineVersionInfoServiceImpl.java

@@ -109,7 +109,7 @@ public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<Archiv
      * @param
      * @throws Exception
      */
-    public static void packageZip2(String zipUrl,String packUrl) throws Exception {
+    public void packageZip2(String zipUrl,String packUrl) throws Exception {
         // 要被压缩的文件夹
         File folder = new File(zipUrl);
         if (!folder.exists() && !folder.isDirectory()) {

+ 107 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -32,6 +32,7 @@ import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.entity.ArchiveProjectConfig;
 import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.service.IArchiveAutoPdfService;
+import org.springblade.archive.service.IArchiveOfflineVersionInfoService;
 import org.springblade.archive.service.IArchiveProjectConfigService;
 import org.springblade.archive.utils.ArchiveTreeUtil;
 import org.springblade.archive.utils.FileTransJavaDemo;
@@ -82,9 +83,14 @@ import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.ExecutorService;
@@ -120,6 +126,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 	private final MetadataClassificationClient metadataClassificationClient;
 
+	private final IArchiveOfflineVersionInfoService versionInfoService;
+
 
 	@Override
 	public IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto) {
@@ -2322,4 +2330,103 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		}
 		return null;
 	}
+
+	@Override
+	public void batchDownloadFileToZip(String ids, HttpServletResponse response) {
+		List<Long> longs = Func.toLongList(ids);
+		//获取档案下的文件
+		List<ArchiveFile> result = baseMapper.batchSearchArchiveFile(longs);
+		//判断是否存在文件
+		if (result != null && result.size() > 0) {
+			//获取选择的案卷,只要id和文件提名字段
+			Map<Long, String> nameMap = baseMapper.getArchives(longs).stream().filter(l -> StringUtils.isNotBlank(l.getName())).collect(Collectors.toMap(l -> l.getId(), l -> l.getName()));
+			//默认下载地址
+			String defaultDir = "/www/wwwroot/Users/hongchuangyanfa/Desktop/archiveDownload";
+			//项目下地址
+			String projectDir = defaultDir+"/" + result.get(0).getProjectId();
+			File file = new File(projectDir);
+			//获取项目名称
+			ProjectInfo projectInfo = projectClient.getById(result.get(0).getProjectId());
+			//判断文件夹是否存在,存在则该项目正在下载打包,不存在则生成
+			if (file.exists()) {
+				throw new ServiceException("当前项目正在下载档案,请稍后再试");
+			} else {
+				file.mkdir();
+			}
+			//删除掉pdfUrl为空的数据
+			result.removeIf(query -> StringUtils.isEmpty(query.getPdfFileUrl()));
+			//按照档案id分组
+			Map<Long, List<ArchiveFile>> map = result.stream().collect(Collectors.groupingBy(ArchiveFile::getArchiveId));
+			try {
+				//为每个档案分别设置
+				for (Long archiveId : map.keySet()) {
+					String initName = nameMap.get(archiveId);
+					String[] split = initName.split(")");
+					String name = split[split.length-1];
+					String archiveDir = projectDir + "/" + name;
+					//创建档案文件夹
+					File file2 = new File(archiveDir);
+					file2.mkdir();
+					//组卷,下载PDF
+					String mergeArchivesFile = this.getMergeArchivesFile(archiveId);
+					InputStream file_out2 = CommonUtil.getOSSInputStream(mergeArchivesFile);
+					if (file_out2 != null) {
+						CommonUtil.inputStreamToFile(file_out2, new File(archiveDir+"/" + name+".pdf"));
+						file_out2.close();
+					}
+
+					//下载卷内文件
+					String archiveFileDir = archiveDir + "/" + "卷内文件";
+					File file3 = new File(archiveFileDir);
+					file3.mkdir();
+					List<ArchiveFile> files = map.get(archiveId);
+					for (ArchiveFile archiveFile : files) {
+						String fileUrl = archiveFile.getPdfFileUrl();
+						String initFileName = archiveFile.getFileName();
+						if (initFileName.length() > 100){
+							initFileName = initFileName.substring(0,100);
+						}
+						String fileName = "/" + initFileName+".pdf";
+						InputStream file_out = CommonUtil.getOSSInputStream(fileUrl);
+						if (file_out != null) {
+							CommonUtil.inputStreamToFile(file_out, new File(archiveFileDir + fileName));
+							file_out.close();
+						}
+					}
+				}
+				//下载完成,打包文件
+				this.packageZip2(defaultDir,projectDir,projectInfo.getId());
+				String zipFile = defaultDir + "/"+projectInfo.getId()+".zip";
+				Path path = Paths.get(zipFile);
+				response.setContentType("application/octet-stream");
+				response.setHeader("Content-Disposition", "attachment;filename="+projectInfo.getProjectName());
+				// 获取文件内容流并写入响应
+				Files.copy(path, response.getOutputStream());
+
+			}catch (Exception e){
+				throw new ServiceException(e.getMessage());
+			}
+		}
+	}
+
+	/**
+	 * 压缩指定路径下的文件夹-直接执行linux命令,多线程,速度快几十倍
+	 *
+	 * @param
+	 * @throws Exception
+	 */
+	public void packageZip2(String defaultDir,String projectDir,Long id) throws Exception {
+		// 要被压缩的文件夹
+		File folder = new File(defaultDir);
+		if (!folder.exists() && !folder.isDirectory()) {
+			folder.mkdirs();
+		}
+		// 执行脚本文件
+		// 多条命令执行
+		String[] cmds = {"/bin/sh", "-c", "cd "+defaultDir+" && zip -q -r "+projectDir+".zip "+id};
+		System.out.println("开始执行命令:" + Arrays.toString(cmds));
+		//主要在这步写入后调用命令
+		Process process = Runtime.getRuntime().exec(cmds);
+		process.waitFor();
+	}
 }