瀏覽代碼

Merge remote-tracking branch 'origin/master'

liuyc 2 年之前
父節點
當前提交
5b0fbbf65b
共有 37 個文件被更改,包括 821 次插入107 次删除
  1. 1 0
      blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java
  2. 18 0
      blade-common/src/main/java/org/springblade/common/constant/OssConstant.java
  3. 4 0
      blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/NewIOSSClient.java
  4. 84 0
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/AliossTemplateRe.java
  5. 6 0
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/OssTemplateRe.java
  6. 124 45
      blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/LargeFileEndpoint.java
  7. 12 0
      blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/NewIOSSClientImpl.java
  8. 3 1
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveExaminingSocketVo.java
  9. 9 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ArchiveFile.java
  10. 7 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java
  11. 14 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO3.java
  12. 7 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveExaminingReportController.java
  13. 67 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  14. 11 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java
  15. 69 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  16. 3 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveAutoPdfService.java
  17. 2 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExaminingReportService.java
  18. 8 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  19. 38 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java
  20. 49 19
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExaminingReportImpl.java
  21. 105 9
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  22. 23 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java
  23. 3 3
      blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java
  24. 7 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/MetadataController.java
  25. 15 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java
  26. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.java
  27. 9 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml
  28. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/MetadataClassificationMapper.java
  29. 5 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/MetadataClassificationMapper.xml
  30. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/MetadataClassificationServiceImpl.java
  31. 16 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java
  32. 47 22
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  33. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
  34. 13 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  35. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java
  36. 19 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  37. 7 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

+ 1 - 0
blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java

@@ -29,6 +29,7 @@ public interface LauncherConstant {
 
 
 	String APPLICATION_MANAGER_NAME = APPLICATION_NAME_PREFIX +  "manager";
+
 	String APPLICATION_ARCHIVE_NAME = APPLICATION_NAME_PREFIX +  "archive";
 
 

+ 18 - 0
blade-common/src/main/java/org/springblade/common/constant/OssConstant.java

@@ -0,0 +1,18 @@
+package org.springblade.common.constant;
+
+public interface OssConstant {
+
+    /**
+     * 临时目录路径
+     */
+    String TEMP_DIRECTORY = "/showtmp";
+    /**
+     * 归档目录路径
+     */
+    String ARCHIVE_DIRECTORY = "/archive";
+
+    /**
+     * 分隔符
+     */
+    String SEPARATOR = "__";
+}

+ 4 - 0
blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/NewIOSSClient.java

@@ -19,6 +19,7 @@ public interface NewIOSSClient {
     String UPLOAD_FILE_INFO_BYTE = API_PREFIX + "/uploadFileInfoByte";
     String UPLOAD_FILE_INFO_INPUT_STREAM = API_PREFIX + "/uploadFileInfoInputStream";
     String REMOVE_PDF_FILE = API_PREFIX + "/remove-file";
+    String UPLOAD_FILE_INFO_WITH_PATH = API_PREFIX + "/uploadFileInfoWithPath";
 
     @PostMapping(value = UPLOAD_FILE_INFO_INPUT_STREAM, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     BladeFile uploadFileByInputStream(MultipartFile file);
@@ -26,6 +27,9 @@ public interface NewIOSSClient {
     @PostMapping(UPLOAD_FILE_INFO)
     BladeFile uploadFile(@RequestParam String fileName, @RequestParam String localFileUrl);
 
+    @PostMapping(UPLOAD_FILE_INFO_WITH_PATH)
+    BladeFile uploadFile(@RequestParam String fileName, @RequestParam  String filePath, @RequestParam  String localFileUrl);
+
     @PostMapping(UPLOAD_FILE_INFO_BYTE)
     BladeFile updateFile(@RequestBody byte[] fileByte, @RequestParam String fileName);
 

+ 84 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/AliossTemplateRe.java

@@ -4,6 +4,7 @@ import com.aliyun.oss.OSSClient;
 import com.aliyun.oss.common.utils.BinaryUtil;
 import com.aliyun.oss.model.*;
 
+import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.Date;
@@ -305,4 +306,87 @@ public class AliossTemplateRe implements OssTemplateRe {
         InitiateMultipartUploadResult initResult = this.ossClient.initiateMultipartUpload(request);
         return initResult;
     }
+
+    public BladeFile putFileWithPath(String fileName, String filePath,InputStream stream) {
+        try {
+
+            String suffix = "";
+            int indexOfDot = fileName.lastIndexOf('.');
+            if (indexOfDot > 0) {
+                suffix = fileName.substring(indexOfDot + 1);
+            }
+
+
+            String ossUrl = "";
+            // 判断容器是否存在,不存在就创建
+            String bucket=getBucketName();
+            if (!ossClient.doesBucketExist(bucket)) {
+                ossClient.createBucket(bucket);
+                CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucket);
+                createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
+                ossClient.createBucket(createBucketRequest);
+            }
+            // 设置文件路径和名称
+            String fileUrl = filePath + "/" + fileName;
+            ObjectMetadata objectMetadata = new ObjectMetadata();
+            objectMetadata.setContentType(getcontentType(suffix));
+            ossUrl = getOssHost() + fileUrl;
+
+            // 上传文件
+            PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucket, fileUrl, stream,objectMetadata));
+
+            BladeFile file = new BladeFile();
+            file.setOriginalName(fileName);
+            file.setName(fileName);
+            file.setDomain(this.getOssHost(bucket));
+            file.setLink(ossUrl);
+            return file;
+        } catch (Throwable var9) {
+            throw var9;
+        }
+    }
+
+
+    //判断文件的格式
+    public  String getcontentType(String filenameExtension) {
+        if (".bmp".equalsIgnoreCase(filenameExtension)) {
+            return "image/bmp";
+        }
+        if (".gif".equalsIgnoreCase(filenameExtension)) {
+            return "image/gif";
+        }
+        if (".jpeg".equalsIgnoreCase(filenameExtension) || ".jpg".equalsIgnoreCase(filenameExtension)
+                || ".png".equalsIgnoreCase(filenameExtension)) {
+            return "image/jpg";
+        }
+        if(".mp4".equalsIgnoreCase(filenameExtension)){
+            return "video/mpeg4";
+        }
+        if (".html".equalsIgnoreCase(filenameExtension)) {
+            return "text/html";
+        }
+        if (".txt".equalsIgnoreCase(filenameExtension)) {
+            return "text/plain";
+        }
+        if (".vsd".equalsIgnoreCase(filenameExtension)) {
+            return "application/vnd.visio";
+        }
+        if (".pptx".equalsIgnoreCase(filenameExtension) || ".ppt".equalsIgnoreCase(filenameExtension)) {
+            return "application/vnd.ms-powerpoint";
+        }
+        if (".docx".equalsIgnoreCase(filenameExtension) || ".doc".equalsIgnoreCase(filenameExtension)) {
+            return "application/msword";
+        }
+        if (".xml".equalsIgnoreCase(filenameExtension)) {
+            return "text/xml";
+        }
+        if (".pdf".equalsIgnoreCase(filenameExtension)) {
+            return "application/pdf";
+        }
+        if (".xls".equalsIgnoreCase(filenameExtension) || ".xlsx".equalsIgnoreCase(filenameExtension)
+                || ".xlt".equalsIgnoreCase(filenameExtension)) {
+            return "application/x-xls";
+        }
+        return "application/pdf";
+    }
 }

+ 6 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/OssTemplateRe.java

@@ -2,6 +2,9 @@ package org.springblade.resource.builder.ossre;
 
 import com.aliyun.oss.model.*;
 import org.springblade.core.oss.OssTemplate;
+import org.springblade.core.oss.model.BladeFile;
+
+import java.io.InputStream;
 
 
 public interface OssTemplateRe extends OssTemplate {
@@ -14,4 +17,7 @@ public interface OssTemplateRe extends OssTemplate {
 
     // OSS 分片上传 初始化
     InitiateMultipartUploadResult initiateMultipartUpload(InitiateMultipartUploadRequest request);
+
+    //指定路径上传
+    BladeFile putFileWithPath(String fileName, String filePath,InputStream stream);
 }

+ 124 - 45
blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/LargeFileEndpoint.java

@@ -16,56 +16,46 @@
  */
 package org.springblade.resource.endpoint;
 
-import cn.hutool.core.util.StrUtil;
+import com.aliyun.oss.model.*;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import io.swagger.annotations.Api;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import org.apache.commons.fileupload.disk.DiskFileItem;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringUtils;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.springblade.common.constant.CommonConstant;
-import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.cache.utils.CacheUtil;
 import org.springblade.core.oss.model.BladeFile;
-import org.springblade.core.oss.model.OssFile;
 import org.springblade.core.secure.annotation.PreAuth;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.constant.RoleConstant;
-import org.springblade.core.tool.utils.FileUtil;
-import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.resource.builder.oss.OssBuilder;
-import org.springblade.resource.entity.Attach;
 import org.springblade.resource.entity.LargeFile;
 import org.springblade.resource.feign.CommonFileClient;
-import org.springblade.resource.service.IAttachService;
 import org.springblade.resource.service.ILargeFileService;
-import org.springblade.resource.service.IOssService;
 import org.springblade.resource.vo.MultipartFileParam;
 import org.springblade.resource.vo.NewBladeFile;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.http.MediaType;
 import org.springframework.util.DigestUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
-import javax.imageio.ImageIO;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.awt.*;
-import java.awt.image.BufferedImage;
 import java.io.*;
 import java.lang.reflect.Method;
 import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
-import java.util.ArrayList;
+import java.util.*;
 import java.util.List;
-import java.util.Objects;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
@@ -89,13 +79,16 @@ public class LargeFileEndpoint {
 	private final ILargeFileService iLargeFileService;
 
 	private final Lock lock = new ReentrantLock();
-	/**
-	 * 附件表服务
-	 */
-	private final IAttachService attachService;
 
 	private final CommonFileClient commonFileClient;
 
+	@Autowired
+	StringRedisTemplate RedisTemplate;
+
+	private final String bucketName ="bladex-chongqing-info";
+
+	private final String endpoint ="http://oss-cn-hangzhou.aliyuncs.com";
+
 	/**
 	 * 创建存储桶
 	 *
@@ -123,6 +116,115 @@ public class LargeFileEndpoint {
 		ossBuilder.template().removeBucket(bucketName);
 		return R.success("删除成功");
 	}
+
+
+	/**
+	 * @return
+	 * @throws Exception
+	 * **/
+	@SneakyThrows
+	@PostMapping("/upload-file1234")
+	public  R uploadByfile123(@RequestParam(value = "file",required=false) MultipartFile file,
+						   @RequestParam(value = "identifier",required=false) String identifier,
+						   @RequestParam(value = "chunkNumber",required=false) Integer chunkNumber,
+						   @RequestParam(value = "chunkSize",required=false) Integer chunkSize,
+						   @RequestParam(value = "currentChunkSize",required=false) String currentChunkSize,
+						   @RequestParam(value = "filename",required=false) String filename,
+						   @RequestParam(value = "relativePath",required=false) String relativePath,
+						   @RequestParam(value = "totalChunks",required=false) Integer totalChunks,
+						   @RequestParam(value = "totalSize",required=false) String totalSize,
+						   @RequestParam(value = "objectType",required=false) String objectType){
+
+		// 文件上传
+		String taskKey ="upload/20221220/"+ filename;
+		UmsAdminLoginLogDO param =new UmsAdminLoginLogDO();
+		if (file == null && totalChunks >=0 && StringUtils.isNotEmpty(identifier)) {
+			// 请求阿里云oss获取分片唯一ID
+			String ossSlicesId = this.getUploadId(taskKey);
+			RedisTemplate.opsForValue().set(identifier,ossSlicesId);
+			return R.fail("没有文件");
+		}
+
+		String uploadId = RedisTemplate.opsForValue().get(identifier);
+
+		UmsAdminLoginLogDO redisParam = (UmsAdminLoginLogDO) CacheUtil.get("oss","PartETag",uploadId);
+		if (redisParam !=null) {
+			param.setPartETags(redisParam.getPartETags());
+		}
+
+		Map<Integer, PartETag> partETags = param.getPartETags();
+
+		UploadPartRequest request = new UploadPartRequest();
+		request.setInputStream(file.getInputStream());
+		request.setBucketName(bucketName);
+		request.setPartNumber(chunkNumber);
+		request.setPartSize(Long.parseLong(currentChunkSize));
+		request.setKey(filename);
+		request.setMd5Digest(identifier);
+		request.setUploadId(uploadId);
+
+		try {
+			UploadPartResult uploadPartResult = ossBuilder.template().uploadPart(request);
+			PartETag partETag = uploadPartResult.getPartETag();
+			partETags.put(chunkNumber, partETag);
+			//分片编号等于总片数的时候合并文件,如果符合条件则合并文件,否则继续等待
+			if (chunkNumber == totalChunks) {
+				//合并文件,注意:partETags必须是所有分片的所以必须存入redis,然后取出放入集合
+				String url = this.completePartUploadFile(filename, uploadId,
+						new ArrayList<>(partETags.values()));
+				//oss地址返回后存入并清除redis
+				RedisTemplate.delete(uploadId);
+				return R.data(url);
+			}else {
+				RedisTemplate.opsForHash().putAll(uploadId, partETags);
+				CacheUtil.put("oss","PartETag",uploadId, param);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return R.data("");
+	}
+
+	/**
+	 * 分块上传完成获取结果
+	 */
+	public String completePartUploadFile(String fileKey, String uploadId, List<PartETag> partETags) {
+		CompleteMultipartUploadRequest request = new CompleteMultipartUploadRequest(bucketName, fileKey, uploadId,
+				partETags);
+		ossBuilder.template().completeMultipartUpload(request);
+		String downLoadUrl = getDownloadUrl(fileKey, bucketName);
+		return downLoadUrl;
+	}
+
+	/**
+	 * 获取bucket文件的下载链接
+	 *
+	 * @param pathFile   首字母不带/的路径和文件
+	 * @param bucketName
+	 * @return 上报返回null, 成功返回地址
+	 */
+	public String getDownloadUrl(String pathFile, String bucketName) {
+		if (bucketName == null || "".equals(bucketName)) {
+			bucketName = bucketName;
+		}
+		StringBuffer url = new StringBuffer();
+		url.append("http://").append(bucketName).append(endpoint).append("/");
+		if (pathFile != null && !"".equals(pathFile)) {
+			url.append(pathFile);
+		}
+		return url.toString();
+	}
+
+	public String getUploadId(String fileKey) {
+		InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, fileKey);
+		// 初始化分片
+		InitiateMultipartUploadResult unrest = ossBuilder.template().initiateMultipartUpload(request);
+		// 返回uploadId,它是分片上传事件的唯一标识,您可以根据这个ID来发起相关的操作,如取消分片上传、查询分片上传等。
+		String uploadId = unrest.getUploadId();
+		return uploadId;
+	}
+
 	/**
 	 * @return
 	 * @throws Exception
@@ -206,13 +308,8 @@ public class LargeFileEndpoint {
 		String tempFileName = param.getIdentifier() + fileName.substring(fileName.lastIndexOf(".")) + "."+param.getChunkNumber();
 		// 获取文件路径
 		/**Windows文件路径要加在哪个盘**/
-//		String filePath = "D:/www/wwwroot/Users/hongchuangyanfa/Desktop/Desktop/ceshi";
 		String filePath =ParamCache.getValue(CommonConstant.SYS_LOCAL_URL)+"largeFile/";
-		// 创建文件夹
-//		getAbsoluteFile(filePath, fileName);
-//		new File(filePath, fileName);
-		// 创建临时文件
-//		File tempFile = new File(filePath, tempFileName);
+
 		File tempFile = buildUploadFile(tempFileName);
 		param.getFile().transferTo(tempFile);
 
@@ -220,25 +317,8 @@ public class LargeFileEndpoint {
 		 * 以上意思是把每个分片都保存成本地一个文件,如 测试.mp4.1 最后合并
 		 * ===================================================
 		 * 以下注释是把分片存到一个文件,持续写入,感觉不太保险**/
-//		//第一步 获取RandomAccessFile,随机访问文件类的对象
-//		RandomAccessFile raf = new RandomAccessFile(tempFile,"rw");
-//		//第二步 调用RandomAccessFile的getChannel()方法,打开文件通道 FileChannel
-//		FileChannel fileChannel = raf.getChannel();
-//		//第三步 获取当前是第几个分块,计算文件的最后偏移量
-//		long offset = (param.getChunkNumber() - 1) * param.getChunkSize();
-//		//第四步 获取当前文件分块的字节数组,用于获取文件字节长度
-//		byte[] fileData = param.getFile().getBytes();
-//		//第五步 使用文件通道FileChannel类的 map()方法创建直接字节缓冲器  MappedByteBuffer
-//		MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, offset, fileData.length);
-//		//第六步 将分块的字节数组放入到当前位置的缓冲区内  mappedByteBuffer.put(byte[] b)
-//		mappedByteBuffer.put(fileData);
-//		//第七步 释放缓冲区
-//		freeMappedByteBuffer(mappedByteBuffer);
-//		fileChannel.close();
-//		raf.close();
-		//第八步,保存分片信息
-		LargeFile largeFile = new LargeFile();
 
+		LargeFile largeFile = new LargeFile();
 		largeFile.setFileKey(param.getIdentifier());
 		largeFile.setName(tempFileName);
 		largeFile.setPath(filePath+fileName);
@@ -301,7 +381,6 @@ public class LargeFileEndpoint {
 				result.setSuccess(true);
 				result.setMsg("上传成功!");
 				result.setData(newBladeFile);
-//				result.setData(new BladeFile());
 				result.setCode(200);
 				return result;
 			}

+ 12 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/NewIOSSClientImpl.java

@@ -66,4 +66,16 @@ public class NewIOSSClientImpl implements NewIOSSClient {
         }
         return null;
     }
+
+    @Override
+    public BladeFile uploadFile(String fileName, String filePath, String localFileUrl) {
+        try {
+            //获取文件流
+            InputStream inputStream = new FileInputStream(new File(localFileUrl));
+            return this.ossBuilder.template().putFileWithPath(fileName,filePath, inputStream);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
 }

+ 3 - 1
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveExaminingSocketVo.java

@@ -14,12 +14,14 @@ import java.util.List;
 public class ArchiveExaminingSocketVo {
     private Integer status;
     private List<ArchiveExaminingReportDetail> detailList;
+    private String pdfUrl;
 
     public ArchiveExaminingSocketVo() {
     }
 
-    public ArchiveExaminingSocketVo(Integer status, List<ArchiveExaminingReportDetail> detailList) {
+    public ArchiveExaminingSocketVo(Integer status,String pdfUrl,List<ArchiveExaminingReportDetail> detailList) {
         this.status = status;
+        this.pdfUrl = pdfUrl;
         this.detailList = detailList;
     }
 }

+ 9 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ArchiveFile.java

@@ -261,4 +261,13 @@ public class ArchiveFile extends BaseEntity {
 	 */
 	@ApiModelProperty("数据源类型,1原生,2数字化")
 	private Integer sourceType;
+
+	@ApiModelProperty("打了页码的pdf文件")
+	private String pdfPageUrl;
+
+	/**
+	 * 是否案卷四要素
+	 */
+	@ApiModelProperty("是否案卷四要素,0否,1是")
+	private Integer isElement;
 }

+ 7 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java

@@ -74,6 +74,13 @@ public interface ArchiveFileClient {
     @PostMapping(API_PREFIX + "/getAllArchiveFileSize")
     Long getAllArchiveFileSize(@RequestBody Long projectId);
 
+    @PostMapping(API_PREFIX + "/getAllArchiveFileByArchiveIds")
+    List<ArchiveFile> getAllArchiveFileByArchiveIds(@RequestBody List<String> ids);
+
+    //批量删除档案文件
+    @PostMapping(API_PREFIX + "/batchDeleteArchiveFile")
+    void batchDeleteArchiveFile(@RequestBody List<Long> ids);
+
     @PostMapping(API_PREFIX + "/getListByNodeID")
     List<ArchiveFile> getListByNodeID(@RequestParam String nodeId,@RequestParam Integer isArchive);
 }

+ 14 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO3.java

@@ -0,0 +1,14 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+import org.springblade.manager.entity.ArchiveTreeContract;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/4/25 15:14
+ **/
+@Data
+public class ArchiveTreeContractVO3 extends ArchiveTreeContract {
+    private boolean notExsitChild;
+}

+ 7 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveExaminingReportController.java

@@ -5,6 +5,7 @@ import com.itextpdf.text.DocumentException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import lombok.extern.java.Log;
 import org.springblade.archive.entity.ArchiveExaminingReport;
 import org.springblade.archive.service.IArchiveExaminingReportService;
 import org.springblade.archive.vo.ArchiveExaminingVo;
@@ -102,4 +103,10 @@ public class ArchiveExaminingReportController {
 
     }
 
+    @GetMapping("/getCurrentExaminingInfo")
+    @ApiOperation(value = "获取当前正在检测的报告信息")
+    public R getCurrentExaminingInfo(Long reportId){
+        return R.data(archiveExaminingReportService.getCurrentExaminingInfo(reportId));
+    }
+
 }

+ 67 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -16,11 +16,13 @@
  */
 package org.springblade.archive.controller;
 
+import cn.hutool.core.text.split.SplitIter;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 import javax.validation.Valid;
 
+import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.service.IArchiveAutoPdfService;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.mp.support.Condition;
@@ -36,6 +38,7 @@ import org.springblade.archive.wrapper.ArchivesAutoWrapper;
 import org.springblade.archive.service.IArchivesAutoService;
 import org.springblade.core.boot.ctrl.BladeController;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -103,7 +106,8 @@ public class ArchivesAutoController extends BladeController {
 			@ApiImplicitParam(name = "secretLevel", value = "保密级别"),
 			@ApiImplicitParam(name = "carrierType", value = "类别"),
 			@ApiImplicitParam(name = "queryValue", value = "输入框模糊搜索"),
-			@ApiImplicitParam(name = "searchType", value = "搜索类型1案卷2文件")
+			@ApiImplicitParam(name = "searchType", value = "搜索类型1案卷2文件"),
+			@ApiImplicitParam(name = "nodeIds", value = "搜索树的节点id集合")
 	})
 	public R<IPage<ArchivesAutoVO>> pageByArchivesAuto(ArchivesAutoVO archivesAuto) {
 		IPage<ArchivesAutoVO> pages = archivesAutoService.pageByArchivesAuto(archivesAuto);
@@ -173,6 +177,56 @@ public class ArchivesAutoController extends BladeController {
 		return R.status(archivesAutoService.saveOrUpdate(archivesAuto));
 	}
 
+	/**
+	 * 分页-档案鉴定
+	 */
+	@GetMapping("/pageByAuthenticate")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页-档案鉴定", notes = "传入archivesAuto")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "nodeId", value = "节点id", required = true),
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+			@ApiImplicitParam(name = "storageTime", value = "保管期限", required = false),
+			@ApiImplicitParam(name = "filingUnit", value = "立卷单位", required = false),
+			@ApiImplicitParam(name = "isDeleted", value = "是否删除", required = false)
+	})
+	public R<IPage<ArchivesAutoVO>> pageByAuthenticate(ArchivesAutoVO archivesAuto) {
+		IPage<ArchivesAutoVO> pages = archivesAutoService.pageByAuthenticate(archivesAuto);
+		return R.data(pages);
+	}
+
+	/**
+	 * 批量销毁档案-档案鉴定
+	 */
+	@GetMapping("/batchDestroyArchive")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "批量销毁档案-档案鉴定", notes = "传入节点id")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "nodeId", value = "节点id", required = true),
+	})
+	public R batchDestroyArchive(String ids ){
+		if (StringUtils.isBlank(ids)){
+			return R.fail("参数错误");
+		}
+		archivesAutoService.batchDestroyArchive(ids);
+		return R.success("销毁成功");
+	}
+
+	/**
+	 * 获取立卷单位列表-档案鉴定
+	 */
+	@GetMapping("/getFilingUnitList")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "获取立卷单位列表-档案鉴定", notes = "传入节点id")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "nodeId", value = "节点id", required = true),
+	})
+	public R getFilingUnitList(Long projectId){
+		return R.data(archivesAutoService.getFilingUnitList(projectId));
+	}
+
+
+
 	
 	/**
 	 * 删除 
@@ -252,6 +306,18 @@ public class ArchivesAutoController extends BladeController {
 		return R.data("");
 	}
 
+	/**
+	 * 预览案卷文件
+	 */
+	@GetMapping("/printArchive")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "预览案卷文件")
+	public R printArchive(Long id) {
+		//统计案卷文件大小
+		String url = archivesAutoService.getMergeArchivesFile(id);
+		return R.data(url);
+	}
+
 
 
 }

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

@@ -64,6 +64,16 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
 	 */
     List<ArchivesAutoVO> pageByArchivesAuto(IPage page, @Param("vo") ArchivesAutoVO vo);
 
+	/**
+	 *  档案利用-档案查询,带范围
+	 */
+	List<ArchivesAutoVO> pageByArchivesAuto2(IPage page, @Param("vo") ArchivesAutoVO vo);
+
+	/**
+	 *  档案鉴定-档案查询
+	 */
+	List<ArchivesAutoVO> pageByAuthenticate(IPage page, @Param("vo") ArchivesAutoVO vo);
+
 	/**
 	 * 获取当前项目所有案卷,并设置合同类型
 	 */
@@ -75,4 +85,5 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
 	@MapKey("storage_time")
 	List<Map<String,String>> getAllArchiveAgeByContractType(@Param("projectId") Long projectId);
 
+	List<String> getFilingUnitList(@Param("projectId") Long projectId);
 }

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

@@ -182,6 +182,54 @@
         </if>
         GROUP BY uaa.id
     </select>
+
+    <select id="pageByArchivesAuto2" resultMap="archivesAutoResultMap">
+        select uaa.* from
+        (SELECT id FROM m_archive_tree_contract WHERE project_id =#{vo.projectId}
+        <foreach collection="vo.nodeIdArray" item="nodeId">
+            and ancestors like concat('%',#{nodeId},'%') or id = #{nodeId}
+        </foreach>
+        ) matc left join u_archives_auto uaa on matc.id = uaa.node_id left join u_archive_file uaf on uaa.id = uaf.archive_id
+        where uaa.is_deleted = 0
+        <if test="vo.searchType == 1 and vo.queryValue != null and vo.queryValue != ''">
+            and uaa.name like concat('%',#{vo.queryValue},'%')
+        </if>
+        <if test="vo.searchType == 2 and vo.queryValue != null and vo.queryValue != ''">
+            and uaf.file_name like concat('%',#{vo.queryValue},'%')
+        </if>
+        <if test="vo.storageTimes != null and vo.storageTimes != ''">
+            and uaa.storage_time in
+            <foreach collection="vo.storageTimes" item="storageTime" open="(" separator="," close=")">
+                #{storageTime}
+            </foreach>
+        </if>
+        <if test="vo.secretLevels != null and vo.secretLevels != ''">
+            and uaa.secret_level in
+            <foreach collection="vo.secretLevels" item="secretLevel" open="(" separator="," close=")">
+                #{secretLevel}
+            </foreach>
+        </if>
+        <if test="vo.carrierTypes != null and vo.carrierTypes != ''">
+            and uaa.carrier_type in
+            <foreach collection="vo.carrierTypes" item="carrierType" open="(" separator="," close=")">
+                #{carrierType}
+            </foreach>
+        </if>
+        <if test="vo.years != null and vo.years != ''">
+            and
+            <foreach collection="vo.years" item="year" separator=" or" open="(" close=")" >
+                #{year} BETWEEN  DATE_FORMAT(uaa.start_date,'%Y') and DATE_FORMAT(uaa.end_date ,'%Y')
+            </foreach>
+        </if>
+        <if test="vo.months != null and vo.months != ''">
+            and
+            <foreach collection="vo.months" item="month" separator=" or" open="(" close=")">
+                #{month} BETWEEN  DATE_FORMAT(uaa.start_date,'%c') and DATE_FORMAT(uaa.end_date ,'%c')
+            </foreach>
+        </if>
+        GROUP BY uaa.id
+    </select>
+
     <select id="getAllArchiveByContractType" resultType="org.springblade.archive.vo.ArchivesAutoVO">
         SELECT uaa.id,matc.tree_code as 'contractType'
         FROM m_archive_tree_contract matc left join u_archives_auto uaa on uaa.node_id =matc.id
@@ -193,6 +241,27 @@
         WHERE matc.project_id =#{projectId} and uaa.is_deleted =0
         GROUP BY uaa.storage_time
     </select>
+<!--    档案鉴定,档案查询-->
+    <select id="pageByAuthenticate" resultType="org.springblade.archive.vo.ArchivesAutoVO">
+        select uaa.*
+        from(
+                select id from m_archive_tree_contract
+                where project_id = #{vo.projectId} and ancestors like concat('%', #{vo.nodeId}, '%') or id = #{vo.nodeId}
+            ) matc
+        left join u_archives_auto uaa on matc.id = uaa.node_id
+        where uaa.is_deleted = #{vo.isDeleted}
+        <if test="vo.storageTime != null and vo.storageTime != ''">
+            and uaa.storage_time = #{vo.storageTime}
+        </if>
+        <if test="vo.filingUnit != null and vo.filingUnit != ''">
+            and uaa.filing_unit = #{vo.filingUnit}
+        </if>
+    </select>
+    <select id="getFilingUnitList" resultType="java.lang.String">
+        SELECT filing_unit
+        FROM  u_archives_auto WHERE project_id =#{projectId} AND filing_unit is not NULL
+        GROUP BY filing_unit
+    </select>
 
 
 </mapper>

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

@@ -25,4 +25,7 @@ public interface IArchiveAutoPdfService {
 
     //只刷新档号
     boolean refreshFileNumber(ArchivesAuto archive,String fileNumber);
+
+    //合并pdf
+    String MergePdfAndUpload(List<String> urlList,String fileName,String filePath) ;
 }

+ 2 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExaminingReportService.java

@@ -2,6 +2,7 @@ package org.springblade.archive.service;
 
 import com.itextpdf.text.DocumentException;
 import org.springblade.archive.entity.ArchiveExaminingReport;
+import org.springblade.archive.vo.ArchiveExaminingSocketVo;
 import org.springblade.archive.vo.ArchiveExaminingVo;
 import org.springblade.core.mp.base.BaseService;
 
@@ -17,4 +18,5 @@ public interface IArchiveExaminingReportService extends BaseService<ArchiveExami
 
     void getExamining(ArchiveExaminingVo vo, Long id) throws InterruptedException, DocumentException, IOException;
 
+    ArchiveExaminingSocketVo getCurrentExaminingInfo(Long reportId);
 }

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

@@ -51,7 +51,15 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 
 	List<Map<String, String>> getAllArchiveAgeByContractType(Long projectId);
 
+    IPage<ArchivesAutoVO> pageByAuthenticate(ArchivesAutoVO archivesAuto);
+
+	List<String> getFilingUnitList(Long projectId);
+
+	void batchDestroyArchive(String ids);
+
 	void archiveAutoMethod(Long project);
 
 	void splitArchvies(Long project);
+
+	public String getMergeArchivesFile(Long archiveId);
 }

+ 38 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java

@@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.itextpdf.text.Element;
 import com.itextpdf.text.pdf.*;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.util.IOUtils;
 import org.springblade.archive.entity.ArchiveFormulaConfig;
@@ -18,6 +19,7 @@ import org.springblade.archive.utils.FileUtils;
 import org.springblade.archive.utils.FormulaUtil;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.feign.ArchiveFileClient;
+import org.springblade.common.constant.OssConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.vo.DataVO;
@@ -265,7 +267,7 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
         List<String> pageUrls = FileUtils.doForPageNumberUseItextpdf(urls,newIOSSClient);
         for(int i=0;i<waitArchiveFiles.size();i++){
-            waitArchiveFiles.get(i).setPdfFileUrl(pageUrls.get(i));
+            waitArchiveFiles.get(i).setPdfPageUrl(pageUrls.get(i));
         }
 
         return;
@@ -288,7 +290,8 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
         Map<String, Object> dataInfo = new HashMap<>();
 
         ArchiveFormulaConfig multiLineconfig = null;
-        String fileName = NAME_MAP.get(number)+ "-" + archivesAuto.getId();
+        //采取
+        String fileName = FileUtils.generateFilename(number,0,archivesAuto.getId());
 
         for (ArchiveFormulaConfig config : formulaConfigs) {
             String coords = config.getCoords();
@@ -547,7 +550,7 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
         FileOutputStream outputStream = new FileOutputStream(excelPath);
         workbook.write(outputStream);
         FileUtils.setExcelScaleToPdf(excelPath, pdfPath);
-        BladeFile bladeFile = newIOSSClient.uploadFile(fileName + ".pdf", pdfPath);
+        BladeFile bladeFile = newIOSSClient.uploadFile(fileName + ".pdf", OssConstant.TEMP_DIRECTORY, pdfPath);
 
         String pdfLink = "";
         if (bladeFile!= null ){
@@ -734,4 +737,36 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
         return true;
     }
 
+    /**
+     * 合并pdf并上传到oss
+     * @param urlList
+     * @param fileName
+     * @return
+     */
+    public String MergePdfAndUpload(List<String> urlList,String fileName,String filePath) {
+       String url = "";
+       Long id = SnowFlakeUtil.getId();
+       String trialPdf = FileUtils.LocalPath + "/pdf/" + id + ".pdf";
+
+       try {
+            //合并pdf
+            FileUtils.mergePdfPublicMethods(urlList,trialPdf);
+
+            if (StringUtils.isEmpty(filePath)) {
+                filePath = OssConstant.TEMP_DIRECTORY;
+            }
+
+            fileName += (OssConstant.SEPARATOR + id);
+
+            //上传到oss
+            BladeFile file  = newIOSSClient.uploadFile(fileName+ ".pdf", filePath,trialPdf);
+            url = file.getLink();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return url;
+    }
+
+
+
 }

+ 49 - 19
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExaminingReportImpl.java

@@ -56,22 +56,28 @@ public class ArchiveExaminingReportImpl extends BaseServiceImpl<ArchiveExamining
     @Async
     @Override
     public void pushStatusBySocket(Long userId,Long id) throws IOException, InterruptedException {
-        Integer status;
-        //获取检测状态,如果正在检测,则一直推送
+        Integer status=1;
+        Date date = new Date();
+        //获取检测状态,如果正在检测,则数据变化时发送
         do {
-            Thread.sleep(5000L);
-            //获取最新检测的状态
+            Thread.sleep(4000L);
+            //判断报告状态
             ArchiveExaminingReport report = this.getById(id);
-            status = report.getStatus();
-            //获取检测详情
-            List<ArchiveExaminingReportDetail> list = detailService.list(new LambdaQueryWrapper<ArchiveExaminingReportDetail>()
-                    .eq(ArchiveExaminingReportDetail::getReportId, id));
-            for (ArchiveExaminingReportDetail detail : list) {
-                detail.setExaminingItem(detail.getExaminingType()+":"+detail.getExaminingItem());
+            Integer reportStatus = report.getStatus();
+            //判断详情状态
+            ArchiveExaminingReportDetail detail = detailService.getOne(new LambdaQueryWrapper<ArchiveExaminingReportDetail>()
+                    .eq(ArchiveExaminingReportDetail::getReportId, id)
+                    .orderByDesc(ArchiveExaminingReportDetail::getCreateTime)
+                    .last("limit 1"));
+            if (detail == null){
+                detail = new ArchiveExaminingReportDetail();
+                detail.setCreateTime(date);
+            }
+            if (reportStatus != status || detail.getCreateTime() != date){
+                webSocketServer.sendMessagesToArchive(userId+"","true");
+                status = reportStatus;
+                date = detail.getCreateTime();
             }
-            ArchiveExaminingSocketVo vo = new ArchiveExaminingSocketVo(status,list);
-            webSocketServer.sendMessagesToArchive(userId+"", JSON.toJSONString(vo));
-            status = report.getStatus();
         }while (status != 4);
 
     }
@@ -90,7 +96,7 @@ public class ArchiveExaminingReportImpl extends BaseServiceImpl<ArchiveExamining
         //检测中
             //真实性
         if (StringUtils.isNotBlank(vo.getAuthenticity()) && "1".equals(vo.getAuthenticity())) {
-            Thread.sleep(7000L);
+            Thread.sleep(5000L);
             detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对固化信息有效性检测", 0, "无", 0));
             detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
@@ -117,7 +123,7 @@ public class ArchiveExaminingReportImpl extends BaseServiceImpl<ArchiveExamining
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对电子档案封装包电子前面有效性检测", 0, "无", 0));
         }
         if (StringUtils.isNotBlank(vo.getIntegrality()) && "1".equals(vo.getIntegrality())) {
-            Thread.sleep(7000L);
+            Thread.sleep(5000L);
             //完整性
             detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对总件数相符性检测", 0, "无", 0));
@@ -144,7 +150,7 @@ public class ArchiveExaminingReportImpl extends BaseServiceImpl<ArchiveExamining
         }
             //可用性
         if (StringUtils.isNotBlank(vo.getUsability()) && "1".equals(vo.getUsability())) {
-            Thread.sleep(7000L);
+            Thread.sleep(5000L);
             detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对信息包中元数据的可读性检测", 0, "无", 0));
             detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
@@ -164,7 +170,7 @@ public class ArchiveExaminingReportImpl extends BaseServiceImpl<ArchiveExamining
         }
             //安全性
         if (StringUtils.isNotBlank(vo.getSecurity()) && "1".equals(vo.getSecurity())) {
-            Thread.sleep(7000L);
+            Thread.sleep(5000L);
             detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_SECURITY,
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对系统环境中是否安装杀毒软件检测", 0, "无", 0));
             detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_SECURITY,
@@ -174,13 +180,32 @@ public class ArchiveExaminingReportImpl extends BaseServiceImpl<ArchiveExamining
         report.setStatus(3);
         this.updateById(report);
         String url = this.generateReportPdf(id);
-        Thread.sleep(7000L);
+        Thread.sleep(3000L);
         //完成
         report.setReportPdfUrl(url);
         report.setStatus(4);
         this.updateById(report);
     }
 
+    /**
+     * 获取最新的文档状态和详情
+     * @param reportId
+     * @return
+     */
+    @Override
+    public ArchiveExaminingSocketVo getCurrentExaminingInfo(Long reportId) {
+        //获取最新检测的状态
+        ArchiveExaminingReport report = this.getById(reportId);
+        //获取检测详情
+        List<ArchiveExaminingReportDetail> list = detailService.list(new LambdaQueryWrapper<ArchiveExaminingReportDetail>()
+                .eq(ArchiveExaminingReportDetail::getReportId, reportId));
+        for (ArchiveExaminingReportDetail detail : list) {
+            detail.setExaminingItem(detail.getExaminingType()+":"+detail.getExaminingItem());
+        }
+        ArchiveExaminingSocketVo vo = new ArchiveExaminingSocketVo(report.getStatus(),report.getReportPdfUrl(),list);
+        return vo;
+    }
+
     /**
      * 生成检测报告PDF
      */
@@ -189,6 +214,7 @@ public class ArchiveExaminingReportImpl extends BaseServiceImpl<ArchiveExamining
         int widthPercentage = 100;
         String uuid = StringUtil.randomUUID();
         String localUrl = "/www/wwwroot/Users/hongchuangyanfa/Desktop/archiveExaminingPdf/";
+//        String localUrl = "D:\\develop\\test\\";
         //新建一个pdf文档对象,前一个参数是纸张大小,后四个为边距
         Document document = new Document(PageSize.A4, 5, 5, 30, 30);
         //建立一个书写器
@@ -255,7 +281,11 @@ public class ArchiveExaminingReportImpl extends BaseServiceImpl<ArchiveExamining
         document.close();
         writer.close();
         BladeFile bladeFile = iossClient.uploadFile(uuid+".pdf", localUrl+uuid+".pdf");
-        return bladeFile.getLink();
+        if (bladeFile != null && StringUtils.isNotBlank(bladeFile.getLink())){
+            return bladeFile.getLink();
+        }else {
+            return null;
+        }
     }
 
 

+ 105 - 9
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -27,14 +27,17 @@ import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.service.IArchiveAutoPdfService;
 import org.springblade.archive.utils.ArchiveTreeUtil;
+import org.springblade.archive.utils.FileUtils;
 import org.springblade.archive.vo.ArchivesAutoVO;
 import org.springblade.archive.mapper.ArchivesAutoMapper;
 import org.springblade.archive.service.IArchivesAutoService;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.feign.ArchiveFileClient;
+import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.manager.entity.ArchiveTreeContract;
@@ -100,15 +103,23 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		if (StringUtils.isNotBlank(vo.getMonth())) {
 			vo.setMonths(Arrays.asList(vo.getMonth().split(",")));
 		}
-		List<ArchivesAutoVO> archivesAutos = baseMapper.pageByArchivesAuto(page, vo);
-		archivesAutos.stream().forEach(aa->{
-			if (StringUtils.isNotBlank(aa.getStorageTime())){
-				aa.setStorageTimeValue("9999".equals(aa.getStorageTime())?"永久":("30".equals(aa.getStorageTime())?"30年":"10年"));
-			}
-			if (StringUtils.isNotBlank(aa.getSecretLevel())){
-				aa.setSecretLevelValue("1".equals(aa.getSecretLevel())?"机密":("2".equals(aa.getSecretLevel())?"绝密":"秘密"));
-			}
-		});
+		List<ArchivesAutoVO> archivesAutos = null;
+		if (StringUtils.isNotBlank(vo.getNodeIds())){
+			vo.setNodeIdArray(Arrays.asList(vo.getNodeIds().split(",")));
+			archivesAutos = baseMapper.pageByArchivesAuto2(page, vo);
+		}else {
+			archivesAutos = baseMapper.pageByArchivesAuto(page, vo);
+		}
+		if (archivesAutos != null && archivesAutos.size() >0) {
+			archivesAutos.stream().forEach(aa -> {
+				if (StringUtils.isNotBlank(aa.getStorageTime())) {
+					aa.setStorageTimeValue("9999".equals(aa.getStorageTime()) ? "永久" : ("30".equals(aa.getStorageTime()) ? "30年" : "10年"));
+				}
+				if (StringUtils.isNotBlank(aa.getSecretLevel())) {
+					aa.setSecretLevelValue("1".equals(aa.getSecretLevel()) ? "机密" : ("2".equals(aa.getSecretLevel()) ? "绝密" : "秘密"));
+				}
+			});
+		}
 		return page.setRecords(archivesAutos);
 	}
 
@@ -267,6 +278,32 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		}
 	}
 
+	@Override
+	public IPage<ArchivesAutoVO> pageByAuthenticate(ArchivesAutoVO vo) {
+		IPage<ArchivesAutoVO> page = new Page<>(vo.getCurrent(),vo.getSize());
+		List<ArchivesAutoVO> list = baseMapper.pageByAuthenticate(page, vo);
+		return page.setRecords(list);
+	}
+
+	@Override
+	public List<String> getFilingUnitList(Long projectId) {
+		return baseMapper.getFilingUnitList(projectId);
+	}
+
+	@Override
+	public void batchDestroyArchive(String ids) {
+		List<String> list = Arrays.asList(ids.split(","));
+		//查询出档案的文件
+		List<ArchiveFile> files = archiveFileClient.getAllArchiveFileByArchiveIds(list);
+		//销毁阿里云上文件
+
+		//删除文件
+		List<Long> collect = files.stream().map(file -> file.getId()).collect(Collectors.toList());
+		archiveFileClient.batchDeleteArchiveFile(collect);
+		//删除案卷
+		baseMapper.deleteBatchIds(list);
+	}
+
 
 	/**
 	 * 检查当前案卷的文件集合是否在规格内,能否开始组卷。
@@ -951,5 +988,64 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		this.updateBatchById(changeList);
 	}
 
+	/**
+	 *	获取案卷合成pdf文件
+	 * @param archiveId
+	 * @return
+	 */
+	public String getMergeArchivesFile(Long archiveId){
+		String url = "";
+
+		List<String> urlList= new ArrayList<>();//合成pdf集合
+
+		ArchivesAuto archivesAuto = this.getById(archiveId);
+
+		//判断archivesAuto是否为空
+		if (archivesAuto == null){
+			return url;
+		}
+		String outUrl = archivesAuto.getOutUrl();
+		//判断outUrl是否为空
+		String[] frontUrls = null;
+		if (StringUtils.isNotEmpty(outUrl)){
+			frontUrls = outUrl.split(",");
+		}
+
+		List<String> fileUrls =new ArrayList<>();
+		if (!archivesAuto.isMedia()) {
+			List<ArchiveFile> result = this.archiveFileClient.getArchiveFileByArchivesId(archivesAuto.getId().toString(),"");
+			if(result != null && result.size() > 0){
+				//循环访问result,如果pdfpageurl不为空则取出,否则取pdffileurl
+				for (ArchiveFile archiveFile : result) {
+					String pdfPageUrl = archiveFile.getPdfPageUrl();
+					if (StringUtils.isEmpty(pdfPageUrl)) {
+						fileUrls.add(archiveFile.getPdfFileUrl());
+					}else{
+						fileUrls.add(pdfPageUrl);
+					}
+				}
+			}
+		}
+
+		if (fileUrls.size() > 0){
+			//此处暂时这么处理,等oss上传接口里文件名可以区分后,再单独取
+			if (frontUrls != null && frontUrls.length > 3){
+
+				urlList.add(frontUrls[0]);
+				urlList.add(frontUrls[1]);
+			}
+
+			urlList.addAll(fileUrls);
+
+			if (frontUrls != null && frontUrls.length > 3){
+				urlList.add(frontUrls[2]);
+				urlList.add(frontUrls[3]);
+			}
+
+			url = archiveAutoPdfService.MergePdfAndUpload(urlList,archivesAuto.getName(),null);
+		}
+		return  url;
+	}
+
 
 }

+ 23 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java

@@ -19,7 +19,9 @@ import org.apache.poi.xssf.usermodel.XSSFPrintSetup;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
+import org.springblade.common.constant.OssConstant;
 import org.springblade.common.utils.CommonUtil;
+import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.vo.DataVO;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.utils.IoUtil;
@@ -32,6 +34,7 @@ import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -572,11 +575,29 @@ public class FileUtils {
             }
             doc.close();
         }
+    }
 
-
-
+    /**
+     * 生成名字 参考 haha__125645646565.pdf
+     * @param filename
+     * @param style 0则按照雪花算法。1则按照时间戳
+     * @return
+     */
+    public static String generateFilename(String filename, int style,Long fid) {
+        String timestamp = "";
+        if (fid != null ) {
+            timestamp = Long.toString(fid);
+        }
+        else if (style == 0) {
+            timestamp = Long.toString(SnowFlakeUtil.getId());
+        } else if (style == 1) {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+            timestamp = sdf.format(new Date());
+        }
+        return filename + OssConstant.SEPARATOR + timestamp;
     }
 
+
     public static final  String MAP4_AVI = "avi、wmv、mpeg、mp4、m4v、mov、asf、flv、f4v、rmvb、rm、3gp、vob";
     public static final  String XLS_XLSX = "xlsx、xls";
     public static final  String DOC_DOCX = "doc、docx";

+ 3 - 3
blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java

@@ -117,13 +117,13 @@ public class EVisaTaskCheckController {
     /**
      * 资料查询批量上报,检查自定义流程,审批人权限
      */
-    @PostMapping("/checkCustomFlowUserIsEVisaPermissions2")
+    @PostMapping("/batchCheckCustomFlowUserIsEVisaPermissions2")
     @ApiOperation(value = "资料查询批量上报,检查自定义流程,审批人权限")
     @ApiOperationSupport(order = 6)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "customFlowUserList", value = "所选的任务人集合,集合形式", required = true),
             @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true),
-            @ApiImplicitParam(name = "privatePKeyId", value = "表单列表中的isTypePrivatePid字段,集合形式"),
+            @ApiImplicitParam(name = "privatePKeyId", value = "资料查看选择的节点主键集合"),
             @ApiImplicitParam(name = "theLogPrimaryKeyId", value = "日志左侧所选的填报类型ID"),
             @ApiImplicitParam(name = "firstId", value = "首件记录ID,列表批量上报时传任意一个即可")
     })
@@ -138,7 +138,7 @@ public class EVisaTaskCheckController {
             }
 
             //获取电签配置
-            List<String> list = json.getJSONArray("wbsIds").toJavaList(String.class);
+            List<String> list = json.getJSONArray("privatePKeyId").toJavaList(String.class);
             Set<String> userNameFail = new HashSet<>();
             for (String nodeId : list) {
                 WbsTreeContract contract = wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.valueOf(nodeId));

+ 7 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/MetadataController.java

@@ -79,12 +79,18 @@ public class MetadataController extends BladeController {
         String[] split = byId.getFileStorageType().split(",");
         StringBuffer str = new StringBuffer();
         for(String s :split){
+            if(s.isEmpty()){
+                continue;
+            }
             if(s.equals(type)){
                 continue;
             }
             str.append(s+",");
         }
-        String substring = str.toString().substring(0, str.lastIndexOf(","));
+        String substring = str.toString();
+        if(str.lastIndexOf(",") > 0){
+            substring = str.toString().substring(0, str.lastIndexOf(","));
+        }
         byId.setFileStorageType(substring);
         iMetadataClassificationService.updateById(byId);
         return R.status(iMetadataClassificationService.updateById(byId));

+ 15 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java

@@ -187,6 +187,21 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
         }
     }
 
+    /**
+     * 根据案卷id集合返回所有的文件列表
+     * @param ids
+     * @return
+     */
+    @Override
+    public List<ArchiveFile> getAllArchiveFileByArchiveIds(List<String> ids) {
+        return fileMapper.getAllArchiveFileByArchiveIds(ids);
+    }
+
+    @Override
+    public void batchDeleteArchiveFile(List<Long> ids) {
+        fileMapper.deleteBatchIds(ids);
+    }
+
     @Override
     public List<ArchiveFile> getListByNodeID(String nodeId,Integer isArchive) {
         List<ArchiveFile> files = fileMapper.getListByNodeID(nodeId, isArchive);

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.java

@@ -73,5 +73,7 @@ public interface ArchiveFileMapper extends BaseMapper<ArchiveFile> {
 
 	List<ArchiveFile> getAllArchiveFileUrl(@Param("projectId")Long projectId);
 
+    List<ArchiveFile> getAllArchiveFileByArchiveIds(@Param("ids") List<String> ids);
+
 	public List<ArchiveFile> getListByNodeID(@Param("nodeId") String nodeId,@Param("isArchive")Integer isArchive);
 }

+ 9 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml

@@ -54,6 +54,8 @@
         <result column="page_num" property="pageNum"/>
         <result column="file_size" property="fileSize"/>
         <result column="source_type" property="sourceType"/>
+        <result column="is_element" property="isElement"/>
+        <result column="pdf_page_url" property="pdfPageUrl"/>
     </resultMap>
     <update id="recoveryByIds">
         update u_archive_file set is_deleted = 0 where
@@ -286,6 +288,13 @@
         FROM u_archive_file uaf
         WHERE  uaf.project_id = #{projectId};
     </select>
+    <select id="getAllArchiveFileByArchiveIds" resultType="org.springblade.business.entity.ArchiveFile">
+        SELECT * FROM u_archive_file
+        WHERE archive_id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
 
 
 

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/MetadataClassificationMapper.java

@@ -20,4 +20,6 @@ public interface MetadataClassificationMapper extends BaseMapper<MetadataClassif
 
 
     void deleteTableField(@Param("containerInitTabName") String containerInitTabName,@Param("fieldKey") String fieldKey);
+
+    void removeMetadataBytype(@Param("type") String type);
 }

+ 5 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/MetadataClassificationMapper.xml

@@ -77,6 +77,10 @@
         <foreach collection="ids" item="ids" index="ids" open="(" separator="," close=")">
             ${ids}
         </foreach>
-        and locate(#{type},file_storage_type) = 0
+--         and locate(#{type},file_storage_type) = 0
+    </update>
+    <update id="removeMetadataBytype">
+        update u_metadata_classification set file_storage_type = REPLACE(file_storage_type,#{type},'')
+        where  locate(#{type},file_storage_type) = 0
     </update>
 </mapper>

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/MetadataClassificationServiceImpl.java

@@ -91,6 +91,8 @@ public class MetadataClassificationServiceImpl
     @Override
     public boolean updateMetadataBytype(List<Long> ids, String type) {
         try {
+            //先删除在保存
+            baseMapper.removeMetadataBytype(type);
             baseMapper.updateMetadataBytype(ids,type);
         } catch (Exception e) {
             e.printStackTrace();

+ 16 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java

@@ -338,4 +338,20 @@ public class ArchiveTreeContractController extends BladeController {
 		return R.fail(200, "同步失败");
 	}
 
+	/**
+	 * 根据节点类型获取档案,档案查询选择目录
+	 */
+	@GetMapping("getArchiveTreeByNodeType")
+	@ApiOperation(value = "根据节点类型获取档案,档案查询选择目录", notes = "传入项目id,节点类型")
+	public R getArchiveTreeByNodeType(Long projectId,Long nodeType){
+		return R.data(archiveTreeContractService.getArchiveTreeByNodeType(projectId,nodeType));
+	}
+	/**
+	 * 根据父节点获取子节点集合
+	 */
+	@GetMapping("getChildrenNodeByNodeId")
+	@ApiOperation(value = "根据节点id获取子节点集合", notes = "传入节点id")
+	public R getChildrenNodeByNodeId(Long nodeId){
+		return R.data(archiveTreeContractService.getChildrenNodeByNodeId(nodeId));
+	}
 }

+ 47 - 22
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -136,7 +136,7 @@ public class ExcelTabController extends BladeController {
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "详情", notes = "传入excelTab")
     public R<ExcelTabVO> detail(ExcelTab excelTab) {
-        ExcelTab detail = excelTabService.getOne(Condition.getQueryWrapper(excelTab));
+        ExcelTab detail = excelTabService.getOne(Condition.getQueryWrapper(excelTab) );
         return R.data(ExcelTabWrapper.build().entityVO(detail));
     }
 
@@ -282,8 +282,8 @@ public class ExcelTabController extends BladeController {
     })
     public R putFileAttach(@RequestParam("file") MultipartFile file, Long nodeId) {
 
-        //String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        String file_path = "/Users/hongchuangyanfa/Desktop/"; //ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        //String file_path = "/Users/hongchuangyanfa/Desktop/";
 
         ExcelTab detail = excelTabService.getById(nodeId);
         // 上传excel文件
@@ -859,9 +859,7 @@ public class ExcelTabController extends BladeController {
 
             // 计算单元格坐标
             int x = 0;
-            if(i==9 || i==10){
-                System.out.println("1234");
-            }
+
             for (int j = 0; j < tds.size(); j++) {
                 {
                     Element data = tds.get(j);
@@ -887,7 +885,7 @@ public class ExcelTabController extends BladeController {
                     //x 移位 算法
                     String getRowInfo = rowData[y1];
 
-                    if (y1 == 9) {
+                    if (y1 == 17) {
                         System.out.println("1");
                     }
                     if (getRowInfo != null) {
@@ -969,24 +967,51 @@ public class ExcelTabController extends BladeController {
                             if (dataInfo == null) {
                                 dataInfo = x1 + ":" + x2;
                             } else {
-                                String[] dataInfo2 = dataInfo.split(",");
-                                String dataInfo3 = dataInfo2[dataInfo2.length - 1];
-                                int mx1 = Integer.parseInt(dataInfo3.split(":")[0]);
-                                int mx2 = Integer.parseInt(dataInfo3.split(":")[1]);
-                                if (mx2 + 1 == x1) {
-                                    String [] data3=new String[dataInfo2.length-1];
-                                    System.arraycopy(dataInfo2,0,data3,0,data3.length);
-                                    dataInfo = StringUtils.join(data3); //removing element at index 2
-
-                                    if (dataInfo2.length == 1) {
-                                        dataInfo = mx1 + ":" + x2;
-                                    } else {
-                                        dataInfo = dataInfo + "," + mx1 + ":" + x2;
+                                dataInfo = dataInfo + "," + x1 + ":" + x2;
+                                String[] arr=  dataInfo.split(",");
+                                //排序
+                                for(int r=0;r<arr.length-1;r++) {
+                                    for(int q = arr.length-2;q>=r;q--) {
+                                        Integer jval = Integer.parseInt(arr[q+1].split(":")[0]);
+                                        Integer jval1 = Integer.parseInt(arr[q].split(":")[0]);
+                                        if(jval<jval1) {
+                                            String temp = arr[q+1];
+                                            arr[q+1] = arr[q];
+                                            arr[q] = temp;
+                                        }
                                     }
+                                }
 
-                                } else {
-                                    dataInfo = dataInfo + "," + x1 + ":" + x2;
+                                //组合
+                                String newDataInfo ="";
+                                for(int r=0;r<arr.length;r++) {
+                                    if(r==0){
+                                        newDataInfo = arr[0];
+                                    }else{
+                                        int StrMax = Integer.parseInt(newDataInfo.substring(newDataInfo.lastIndexOf(":")+1,newDataInfo.length()));
+                                        Integer nowMin = Integer.parseInt(arr[r].split(":")[0]);
+                                        Integer nowMax = Integer.parseInt(arr[r].split(":")[1]);
+                                        if((StrMax+1) == nowMin){
+                                            String lastStr = "";
+                                            if(newDataInfo.indexOf(",")>=0){
+                                                lastStr = newDataInfo.substring(newDataInfo.lastIndexOf(",")+1,newDataInfo.length());
+                                                newDataInfo = newDataInfo.substring(0,newDataInfo.lastIndexOf(","));
+                                            }else{
+                                                lastStr=  newDataInfo;
+                                                newDataInfo = "";
+                                            }
+                                            int lastmin = Integer.parseInt(lastStr.split(":")[0]);
+                                            if(StringUtils.isNotEmpty(newDataInfo)){
+                                                newDataInfo = newDataInfo +"," +lastmin+":"+nowMax;
+                                            }else{
+                                                newDataInfo = lastmin+":"+nowMax;
+                                            }
+                                        }else{
+                                            newDataInfo = newDataInfo +"," +nowMin+":"+nowMax;
+                                        }
+                                    }
                                 }
+                                dataInfo = newDataInfo;
                             }
                             rowData[k + 2 + i] = dataInfo;
                         }

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java

@@ -24,6 +24,7 @@ import org.springblade.manager.vo.ArchiveTreeContractVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.manager.vo.ArchiveTreeContractVO2;
+import org.springblade.manager.vo.ArchiveTreeContractVO3;
 import org.springblade.manager.vo.ArchiveTreeVO;
 
 import java.util.List;
@@ -77,4 +78,8 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
 
 	@MapKey("id")
 	List<Map<String, Object>> getArchiveTreeAndArchiveCount(@Param("projectId") Long projectId,@Param("nodeId") Long nodeId);
+
+    List<ArchiveTreeContract> getArchiveTreeByNodeType(@Param("projectId")Long projectId,@Param("nodeType") Long nodeType);
+
+	List<ArchiveTreeContractVO3> getChildrenNodeByNodeId(@Param("nodeId") Long nodeId);
 }

+ 13 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml

@@ -368,5 +368,18 @@
             if((SELECT COUNT(*) from m_archive_tree_contract matc WHERE parent_id = matc1.id)=0,false,true) as hasChildren
         FROM m_archive_tree_contract matc1 WHERE matc1.project_id =#{projectId} and matc1.parent_id = #{nodeId}
     </select>
+    <select id="getArchiveTreeByNodeType" resultType="org.springblade.manager.entity.ArchiveTreeContract">
+        SELECT * FROM m_archive_tree_contract
+        WHERE  parent_id = (select id from m_archive_tree_contract
+                            WHERE parent_id = (select id from m_archive_tree_contract WHERE parent_id = 0 and project_id = #{projectId})
+                            and post_type = #{nodeType})
+          and is_deleted = 0
+
+    </select>
+    <select id="getChildrenNodeByNodeId" resultType="org.springblade.manager.vo.ArchiveTreeContractVO3">
+        select matc1.*,if((SELECT COUNT(*) from m_archive_tree_contract matc WHERE matc.parent_id = matc1.id)=0,true,false)
+            as notExsitChild
+        from m_archive_tree_contract matc1 WHERE matc1.parent_id = #{nodeId} and matc1.is_deleted =0
+    </select>
 
 </mapper>

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java

@@ -28,6 +28,7 @@ import org.springblade.manager.vo.ArchiveTreeContractVO;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.manager.vo.ArchiveTreeContractVO2;
+import org.springblade.manager.vo.ArchiveTreeContractVO3;
 
 
 import java.util.ArrayList;
@@ -35,6 +36,7 @@ import java.util.List;
 
 import java.util.List;
 import java.util.Map;
+import java.util.stream.LongStream;
 
 /**
  *  服务类
@@ -94,4 +96,7 @@ public interface IArchiveTreeContractService extends BaseService<ArchiveTreeCont
 
 	List<Map<String,Object>> getArchiveTreeAndArchiveCount(Long projectId,Long nodeId);
 
+    List<ArchiveTreeContract> getArchiveTreeByNodeType(Long projectId, Long nodeType);
+
+	List<ArchiveTreeContractVO3> getChildrenNodeByNodeId(Long nodeId);
 }

+ 19 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -854,5 +854,24 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		return baseMapper.getArchiveTreeAndArchiveCount(projectId,nodeId);
 	}
 
+	@Override
+	public List<ArchiveTreeContract> getArchiveTreeByNodeType(Long projectId, Long nodeType) {
+		if (nodeType == 1){
+			nodeType = 1537246243393589249L;
+		}else if (nodeType == 2){
+			nodeType = 1537247986361782274L;
+		}else if (nodeType == 3){
+			nodeType = 1537246384519335938L;
+		}else {
+			nodeType = 1607574141119365122L;
+		}
+		return baseMapper.getArchiveTreeByNodeType(projectId,nodeType);
+	}
+
+	@Override
+	public List<ArchiveTreeContractVO3> getChildrenNodeByNodeId(Long nodeId) {
+		return baseMapper.getChildrenNodeByNodeId(nodeId);
+	}
+
 
 }

+ 7 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -1128,6 +1128,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                         if (StringUtils.isNotEmpty(tabData[0])) {
                             if (tabVal.contains("[") && tabVal.contains("年")) {
                                 String[] strings = StringUtils.strip(tabData[0], "[]").split(",");
+
                                 reData.put(key + "__" + tabData[1], strings);
                             }else {
                                 reData.put(key + "__" + tabData[1], tabData[0]);
@@ -1314,6 +1315,12 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                                         myData = StringUtil.format("{}年{}月{}日", dataStr[0], dataStr[1], Integer.parseInt(dataStr[2]) + 1);
                                                     }
                                                 }
+
+                                                if(myData.indexOf("lang.String")>=0){
+                                                    String[]  dataDate = (String[]) DataInfo.get(val);
+                                                    myData = dataDate[0]+" - "+dataDate[1].trim();
+                                                }
+
                                                 //https:bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20220819/b53cb6700db369381e3b03d7737bcdec.jpg__16_1
                                                 if (myData.indexOf("https") >= 0 && myData.indexOf("aliyuncs") >= 0) {