Browse Source

Merge remote-tracking branch 'origin/master' into master

yangyj 2 năm trước cách đây
mục cha
commit
b2716b11d8
39 tập tin đã thay đổi với 977 bổ sung553 xóa
  1. 2 0
      blade-common/src/main/java/org/springblade/common/constant/OssConstant.java
  2. 4 14
      blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/NewIOSSClient.java
  3. 55 53
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/AliossTemplateRe.java
  4. 1 1
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/OssTemplateRe.java
  5. 11 11
      blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/NewIOSSClientImpl.java
  6. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java
  7. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTree.java
  8. 8 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java
  9. 17 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java
  10. 33 8
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  11. 3 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  12. 41 31
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java
  13. 103 18
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  14. 52 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java
  15. 116 194
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  16. 13 1
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java
  17. 0 6
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml
  18. 80 72
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.java
  19. 2 3
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml
  20. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/IInformationQueryService.java
  21. 141 14
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  22. 48 11
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  23. 11 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  24. 26 21
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FirstController.java
  25. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java
  26. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  27. 0 10
      blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsExcelBatchUtil.java
  28. 9 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsExcelUtil.java
  29. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeMapper.java
  30. 18 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeMapper.xml
  31. 37 36
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  32. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java
  33. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveAutoRuleSyncImpl.java
  34. 6 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  35. 10 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java
  36. 6 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  37. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  38. 59 22
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  39. 44 9
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

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

@@ -20,4 +20,6 @@ public interface OssConstant {
      * 分隔符
      */
     String SEPARATOR = "__";
+
+    String SYS_DIRECTORY = "sys";
 }

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

@@ -28,20 +28,10 @@ public interface NewIOSSClient {
     @PostMapping(UPLOAD_FILE_INFO)
     BladeFile uploadFile(@RequestParam String fileName, @RequestParam String localFileUrl);
 
-    /**
-     *  规则  projectId/filePath/fileName,
-     *  如果projectId为空则为filePath/fileName
-     *  如果filePath为空,则为 upload/20230202/fileName
-     *  如果filePath为OssConstant.TEMP_DIRECTORY,一律放进临时目录 OssConstant.TEMP_DIRECTORY/fileName
-     * @param fileName
-     * @param localFileUrl
-     * @param filePath
-     * @param projectId
-     * @return
-     */
-    @PostMapping(UPLOAD_FILE_INFO_WITH_PATH)
-    BladeFile uploadFile(@RequestParam String fileName, @RequestParam  String localFileUrl,
-                         @RequestParam(required=false)  String filePath,@RequestParam(required=false) Long projectId);
+
+//    @PostMapping(UPLOAD_FILE_INFO_WITH_PATH)
+//    BladeFile uploadFile(@RequestParam String fileName, @RequestParam  String localFileUrl,
+//                         @RequestParam(required=false)  String filePath,@RequestParam(required=false) Long projectId);
 
     @PostMapping(UPLOAD_FILE_INFO_BYTE)
     BladeFile updateFile(@RequestBody byte[] fileByte, @RequestParam String fileName);

+ 55 - 53
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/AliossTemplateRe.java

@@ -173,7 +173,7 @@ public class AliossTemplateRe implements OssTemplateRe {
         try {
             this.makeBucket(bucketName);
             String originalName = key;
-            key = this.getFileName(key);
+            //key = this.getFileName(key);
             if(key.indexOf("/")>=0){
                 originalName = key.substring(key.lastIndexOf("/")+1 , key.length());
             }else{
@@ -318,58 +318,60 @@ public class AliossTemplateRe implements OssTemplateRe {
         return initResult;
     }
 
-    public BladeFile putFileWithPath(String fileName, String filePath,Long projectId, 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);
-            }
-            // 设置文件路径和名称
-            //判断是否为存储成   upload/20230322/xxxx.pdf 还是指定目录 aaaa/bbbb.pdf
-            if (StringUtils.isEmpty(filePath)) {
-                Date now = new Date();
-                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
-                String formattedDate = sdf.format(now);
-                filePath = OssConstant.NORMAL_DIRECTORY + "/" + formattedDate;
-            }
-
-            //如果有项目ID,则存为 项目id/....  ,否则直接在最外层, 临时目录除外
-            if (!filePath.equals(OssConstant.TEMP_DIRECTORY)) {
-                if (projectId != null  ) {
-                    filePath = projectId + "/" + filePath;
-                }
-            }
-
-            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 BladeFile putFileWithPath(String fileName, String filePath,Long projectId, 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);
+//            }
+//            // 设置文件路径和名称
+//            //判断是否为存储成   upload/20230322/xxxx.pdf 还是指定目录 aaaa/bbbb.pdf
+//            if (StringUtils.isEmpty(filePath)) {
+//                Date now = new Date();
+//                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+//                String formattedDate = sdf.format(now);
+//                filePath = OssConstant.NORMAL_DIRECTORY + "/" + formattedDate;
+//            }
+//
+//            //如果有项目ID,则存为 项目id/....  ,否则直接在最外层, 临时目录除外
+//            if (!filePath.equals(OssConstant.TEMP_DIRECTORY)) {
+//                if (projectId != null  ) {
+//                    filePath = projectId + "/" + filePath;
+//                }
+//            }
+//
+//            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;
+//        }
+//    }
 
 
     //判断文件的格式

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

@@ -19,5 +19,5 @@ public interface OssTemplateRe extends OssTemplate {
     InitiateMultipartUploadResult initiateMultipartUpload(InitiateMultipartUploadRequest request);
 
     //指定路径上传
-    BladeFile putFileWithPath(String fileName, String filePath,Long projectId, InputStream stream);
+//    BladeFile putFileWithPath(String fileName, String filePath,Long projectId, InputStream stream);
 }

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

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

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

@@ -53,6 +53,9 @@ public interface ArchiveFileClient {
     @PostMapping(API_PREFIX + "/listWrappers")
     List<ArchiveFile> listWrappers(@RequestBody LambdaQueryWrapper<ArchiveFile> in);
 
+    @PostMapping(API_PREFIX + "/listbyIds")
+    List<ArchiveFile> listbyIds(@RequestBody List<Long> toLongList);
+
     @PostMapping(API_PREFIX + "/updateWrappers")
     boolean updateWrappers(@RequestBody LambdaUpdateWrapper<ArchiveFile> eq);
 

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTree.java

@@ -1,5 +1,7 @@
 package org.springblade.manager.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -144,22 +146,26 @@ public class ArchiveTree extends BaseEntity {
 	* 自动立卷类型 1最高 2分类并卷 3单独并卷
 	*/
     @ApiModelProperty(value = "自动立卷类型")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Integer archiveAutoType;
 	/**
 	* 自动立卷设置的节点ID
 	*/
     @ApiModelProperty(value = "自动立卷设置的节点ID")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Long archiveAutoNodeId;
 
     /**
      * 分类并卷的分类ID,当archiveAutoType=2时,用来确定同一类型。新增时随机生成,一同提交设置的节点都是同一类。 编辑时 采用已有的
      */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Long archiveAutoGroupId;
 
     /**
      * 是否自动立卷规则选择设置的节点 选中的节点设为1 方便页面显示列表,方便同步判断
      */
     @ApiModelProperty(value = "是否为设置的节点")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Integer archiveAutoGroupSelect;
 
     private Long fromId;

+ 8 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java

@@ -16,9 +16,13 @@
  */
 package org.springblade.manager.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.core.mp.base.BaseEntity;
@@ -142,20 +146,24 @@ public class ArchiveTreeContract extends BaseEntity {
 	/**
 	* 自动立卷类型 1最高 2分类并卷 3单独组卷   说明:1规则下可以有2或3;2和3两种规则互斥,2下不能有3,3下不能有2;
 	*/
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Integer archiveAutoType;
 	/**
 	* 默认组卷设置的最高并卷节点Id  当archiveAutoType不为2,和3时用来限制范围
 	*/
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Long archiveAutoNodeId;
 
 	/**
 	 * 分类并卷的分类ID,当archiveAutoType=2时,用来确定同一类型。新增时随机生成,一同提交设置的节点都是同一类。 编辑时 采用已有的
 	 */
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Long archiveAutoGroupId;
 
 	/**
 	 * 设置分类并卷选择的节点设为1,其下范围内节点设为0
 	 */
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Integer archiveAutoGroupSelect;
 
 

+ 17 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java

@@ -272,7 +272,7 @@ public class ArchiveFileController extends BladeController {
      * 档案统计-原生数字化文件数量
      */
     @GetMapping("/allArchiveFileByContractType")
-    @ApiOperationSupport(order = 3)
+    @ApiOperationSupport(order = 11)
     @ApiOperation(value = "档案统计-原生数字化文件数量")
     public R allArchiveFileByContractType(Long projectId) {
         List<Map<String, Object>> mapList = archiveFileClient.getAllArchiveFileByContractType(projectId);
@@ -283,7 +283,7 @@ public class ArchiveFileController extends BladeController {
      * 档案统计-档案总存储
      */
     @GetMapping("/allArchiveFileSize")
-    @ApiOperationSupport(order = 3)
+    @ApiOperationSupport(order = 12)
     @ApiOperation(value = "档案统计-档案总存储")
     public R allArchiveFileSize(Long projectId) {
         //统计案卷文件大小
@@ -296,4 +296,19 @@ public class ArchiveFileController extends BladeController {
         String size = org.springblade.common.utils.FileUtils.formatSize(fileSize );
         return R.data(size);
     }
+    /**
+     * 批量编辑
+     */
+    @PostMapping("/batchUpdate")
+    @ApiOperationSupport(order = 13)
+    @ApiOperation(value = "批量编辑")
+    public R<Boolean> batchUpdate(@RequestBody ArchiveFileVO vo){
+        try {
+            this.archiveFileClient.updateArchiveFileSort(vo);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.data(false);
+        }
+        return R.data(true);
+    }
 }

+ 33 - 8
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -26,6 +26,7 @@ import javax.validation.Valid;
 
 import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.service.IArchiveAutoPdfService;
+import org.springblade.business.entity.ArchiveFile;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
@@ -265,7 +266,7 @@ public class ArchivesAutoController extends BladeController {
 	@ApiOperation(value = "获取归档树同级节点", notes = "传入节点id")
 	public R test() {
 
-		archiveAutoPdfService.test();
+		archivesAutoService.test();
 		return R.data("");
 	}
 
@@ -277,9 +278,9 @@ public class ArchivesAutoController extends BladeController {
 	@ApiOperation(value = "获取归档树同级节点", notes = "传入节点id")
 	public R test1() {
 
-		//archiveAutoPdfService.test1();
-		Long projectId = 1645263362890129410L;
-		List<ArchiveTreeContract> list = archiveTreeContractClient.getListByProjectId(projectId);
+		archiveAutoPdfService.test1();
+//		Long projectId = 1645263362890129410L;
+//		List<ArchiveTreeContract> list = archiveTreeContractClient.getListByProjectId(projectId);
 		//archivesAutoService.refreshFileNumberNoSlipt(list,null);
 		return R.data("");
 	}
@@ -376,11 +377,20 @@ public class ArchivesAutoController extends BladeController {
 	@ApiOperation(value = "案卷迁移", notes = "传入ids,nodeId")
 	public R move(@ApiParam(value = "主键集合", required = true) @RequestParam String ids, @RequestParam Long nodeId) {
 
+		ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
+		if (node == null) {
+			return R.fail("找不到迁移的节点id");
+		}
+
 		List<ArchivesAuto> archivesAutos = archivesAutoService.listByIds(Func.toLongList(ids));
 		for (ArchivesAuto ar  :archivesAutos) {
 			ar.setNodeId(nodeId);
+			ar.setTreeSort(node.getTreeSort());
+			ar.setContractId(node.getContractId());
+//			if (node.getStorageType()!= null){
+//				ar.setCarrierType(node.getStorageType().toString());
+//			}
 		}
-
 		return R.status(archivesAutoService.updateBatchById(archivesAutos));
 	}
 
@@ -389,10 +399,15 @@ public class ArchivesAutoController extends BladeController {
 	 */
 	@PostMapping("/removeFiles")
 	@ApiOperationSupport(order = 15)
-	@ApiOperation(value = "删除案卷的卷内文件", notes = "传入ids")
-	public R removeFiles(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+	@ApiOperation(value = "删除案卷的卷内文件", notes = "传入文件ids,归档archiveId")
+	public R removeFiles(@ApiParam(value = "主键集合", required = true) @RequestParam String ids, @RequestParam Long archiveId) {
+
+		ArchivesAuto archivesAuto = archivesAutoService.getById(archiveId);
+		if (archivesAuto != null && archivesAuto.getIsLock() == 1) {
+			return R.fail("案卷锁定中,能不能删除卷内文件");
+		}
 
-		return R.status(archivesAutoService.removeFiles(ids));
+		return R.status(archivesAutoService.removeFiles(ids,archiveId));
 	}
 
 	/**
@@ -408,5 +423,15 @@ public class ArchivesAutoController extends BladeController {
 		return R.data("刷新成功");
 	}
 
+	/**
+	 * 批量编辑
+	 */
+	@PostMapping("/batchUpdate")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "批量编辑", notes = "传入archivesAutoVo")
+	public R batchUpdate(@Valid @RequestBody ArchivesAutoVO archivesAutoVo) {
+		return R.status(archivesAutoService.updateBatchById(JSONArray.parseArray(JSONObject.toJSONString(archivesAutoVo.getList()), ArchivesAuto.class)));
+	}
+
 
 }

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

@@ -68,9 +68,11 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	boolean slipt(String ids);
 
 	//从案卷里删除文件
-	boolean removeFiles(String ids);
+	boolean removeFiles(String ids,Long archiveId);
 
 
 	//刷新某个项目的档号
 	void refreshFileNumberNoSlipt(Long projectId,Long contractId,Long nodeId);
+
+	void test();
 }

+ 41 - 31
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java

@@ -82,36 +82,36 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 //        List<String> files = new ArrayList<>();
 //        files.add(file2);
 //        BladeFile bladeFile = newIOSSClient.uploadFile1(file2,"123");
-        String urls1 = "https://bladex-chongqing-info.oss-cn-hangzhou.aliyuncs.com/upload/20230427/ed4305eb971b062046c1ffd4e2da3c32.pdf";
-        String urls2 = "https://bladex-chongqing-info.oss-cn-hangzhou.aliyuncs.com/upload/20230427/f1ddb3bd25c076824ef366a9e242ff23.pdf";
-        List<String> urls = new ArrayList<>();
-        String localPath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        urls.add(urls1);
-        urls.add(urls2);
-        List<String> pageUrls = FileUtils.doForPageNumberUseItextpdf(urls,localPath,newIOSSClient,1578599210897772545L);
-        System.out.println();
+//        String urls1 = "https://bladex-chongqing-info.oss-cn-hangzhou.aliyuncs.com/upload/20230427/ed4305eb971b062046c1ffd4e2da3c32.pdf";
+//        String urls2 = "https://bladex-chongqing-info.oss-cn-hangzhou.aliyuncs.com/upload/20230427/f1ddb3bd25c076824ef366a9e242ff23.pdf";
+//        List<String> urls = new ArrayList<>();
+//        String localPath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+//        urls.add(urls1);
+//        urls.add(urls2);
+//        List<String> pageUrls = FileUtils.doForPageNumberUseItextpdf(urls,localPath,newIOSSClient,1578599210897772545L);
+//        System.out.println();
 
 
-//        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-//        boolean flag = FileUtils.LocalPath.equals(file_path);
-//        String excelUrl = file_path +  "\\备考表.xlsx";
-//
-//        Map<String, Object> DataInfo = new HashMap<>();
-//
-//        DataVO dataVO = FormulaUtil.convertCellToIndex("C2");
-//        String key =  "1__"+ dataVO.getY() + "_" + dataVO.getX();
-//        DataInfo.put(key,"档号123456");
-//
-//        DataVO dataVO1 = FormulaUtil.convertCellToIndex("A9");
-//        String key1 =  "2__"+ dataVO1.getY() + "_" + dataVO1.getX();
-//        DataInfo.put(key1,"hahahahaa");
-//        try {
-//            String url = getBussPdfInfo(pkeyId.toString(),DataInfo,excelUrl,file_path,null,null);
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-//
-//        System.out.println();
+        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        boolean flag = FileUtils.LocalPath.equals(file_path);
+        String excelUrl = file_path +  "\\备考表.xlsx";
+
+        Map<String, Object> DataInfo = new HashMap<>();
+
+        DataVO dataVO = FormulaUtil.convertCellToIndex("C2");
+        String key =  "1__"+ dataVO.getY() + "_" + dataVO.getX();
+        DataInfo.put(key,"档号123456");
+
+        DataVO dataVO1 = FormulaUtil.convertCellToIndex("A9");
+        String key1 =  "2__"+ dataVO1.getY() + "_" + dataVO1.getX();
+        DataInfo.put(key1,"hahahahaa");
+        try {
+            String url = getBussPdfInfo(pkeyId.toString(),DataInfo,excelUrl,file_path,null,null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        System.out.println();
 
 
     }
@@ -420,8 +420,10 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
             //合并当前所有选择的试验pdf
             FileUtils.mergePdfPublicMethods(localUrls, localPdf);
-            BladeFile bladeFile = this.newIOSSClient.uploadFile(fileName + ".pdf", localPdf, OssConstant.ARCHIVE_DIRECTORY,projectId);
+//            BladeFile bladeFile = this.newIOSSClient.uploadFile(fileName + ".pdf", localPdf, OssConstant.ARCHIVE_DIRECTORY,projectId);
 
+            String absoluteFileName = FileUtils.getOssPath(OssConstant.ARCHIVE_DIRECTORY,fileName,projectId);
+            BladeFile bladeFile = newIOSSClient.uploadFile(absoluteFileName + ".pdf", localPdf);
 
 //            ByteArrayOutputStream bos = new ByteArrayOutputStream();
 //            FileUtils.PdfCopyPublicMethods(bos, localUrls);
@@ -429,6 +431,8 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
             if (bladeFile!= null ) {
                 urls.add(bladeFile.getLink());
             }
+        }else if (localUrls.size() == 1) {
+            urls.add(localUrls.get(0));
         }
     }
 
@@ -572,8 +576,10 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
         FileOutputStream outputStream = new FileOutputStream(excelPath);
         workbook.write(outputStream);
         FileUtils.setExcelScaleToPdf(excelPath, localPdfPath);
-        BladeFile bladeFile = newIOSSClient.uploadFile(fileName + ".pdf", localPdfPath,ossPath, projectId);
+        String absoluteFileName = FileUtils.getOssPath(OssConstant.ARCHIVE_DIRECTORY,fileName,projectId);
+        BladeFile bladeFile = newIOSSClient.uploadFile(absoluteFileName + ".pdf", localPdfPath);
 
+        ///BladeFile bladeFile = newIOSSClient.uploadFile(fileName + ".pdf", localPdfPath,ossPath, projectId);
         String pdfLink = "";
         if (bladeFile!= null ){
             pdfLink = bladeFile.getLink();
@@ -778,7 +784,11 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
             fileName += (OssConstant.SEPARATOR + id);
 
             //上传到oss
-            BladeFile file  = newIOSSClient.uploadFile(fileName+ ".pdf", localPdf,filePath,pojectId);
+           String absoluteFileName = FileUtils.getOssPath(OssConstant.TEMP_DIRECTORY,fileName,null);
+           BladeFile file = newIOSSClient.uploadFile(absoluteFileName + ".pdf", localPdf);
+
+
+//            BladeFile file  = newIOSSClient.uploadFile(fileName+ ".pdf", localPdf,filePath,pojectId);
             url = file.getLink();
         } catch (Exception e) {
             e.printStackTrace();

+ 103 - 18
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -25,8 +25,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.AllArgsConstructor;
 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.IArchiveProjectConfigService;
 import org.springblade.archive.utils.ArchiveTreeUtil;
 import org.springblade.archive.utils.FileUtils;
 import org.springblade.archive.vo.ArchivesAutoVO;
@@ -83,6 +85,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	private IArchiveAutoPdfService archiveAutoPdfService;
 	private final NewIOSSClient iossClient;
 
+	private final IArchiveProjectConfigService archiveProjectConfigService;
+
 
 	@Override
 	public IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto) {
@@ -232,6 +236,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	@Override
 	public void splitArchvies(Long projectId){
 		baseMapper.splitArchvies(projectId);
+		//TODO 清除案卷封面等pdf
+		//TODO 清除文件页面pdf
 	}
 
 	@Override
@@ -393,7 +399,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		if(StringUtils.isEmpty(treeCode)){
 			treeCode="owner";
 		}
-		String fileNumberPrefix=node.getFileNumberPrefix(); //档号前缀在节点设置
+		//String fileNumberPrefix=node.getFileNumberPrefix(); //档号前缀在节点设置
 		Integer fileNumberSuffix = null;//档号后缀按立卷单位生成流水号
 		if(indexMap.containsKey(treeCode)){
 			fileNumberSuffix = indexMap.get(treeCode);
@@ -403,7 +409,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			indexMap.put(treeCode,fileNumberSuffix+1);
 		}
 
-		archivesAuto.setFileNumber(fileNumberPrefix+fileNumberSuffix);//档号
+		archivesAuto.setFileNumber(fileNumberSuffix.toString());//档号
 		//archivesAuto.setMicron();//微缩号
 		archivesAuto.setUnit(unit);//立卷单位
 		//archivesAuto.setQuantity();//数量/单位
@@ -483,7 +489,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//TODO wbs节点
 		//不存在跨节点 项目名称+案卷题名规则(在后台归档目录树设置的)+后缀
 		//存在跨节点  获取当前所有节点的父级节点题名规则+所有同层级跨节点并卷的节点名称拼接+后缀
-		return archiveName;
+		return archiveName+node.getArchiveNameSuffix();
 	}
 	private String builtFilePageNo(ArchivesAuto archivesAuto,List<ArchiveFile> waitArchiveFiles){
 		//生成文件对应的页码,返回url
@@ -1065,6 +1071,29 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			frontUrls = outUrl.split(",");
 		}
 
+		ArchiveProjectConfig config = archiveProjectConfigService.getByProjectIdOrNew(archivesAuto.getProjectId());
+
+		// 根据 factorType 字符串生成档案号码字符串链表
+		String front = "";
+		String cataLog = "";
+		String spare = "";
+		String back = "";
+
+
+		for (String frontUrl : frontUrls) {
+			if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[0]) && config.getFactorType().contains("1")) {
+				front = frontUrl;
+			}else if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[1]) && config.getFactorType().contains("2")) {
+				cataLog = frontUrl;
+			}
+			else if  (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[2]) && config.getFactorType().contains("3")) {
+				spare = frontUrl;
+			}
+			else if  (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[3]) && config.getFactorType().contains("4")) {
+				back = frontUrl;
+			}
+		}
+
 		List<String> fileUrls =new ArrayList<>();
 		if (!archivesAuto.isMedia()) {
 			List<ArchiveFile> result = this.archiveFileClient.getArchiveFileByArchivesId(archivesAuto.getId().toString(),"");
@@ -1083,17 +1112,31 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 		if (fileUrls.size() > 0){
 			//此处暂时这么处理,等oss上传接口里文件名可以区分后,再单独取
-			if (frontUrls != null && frontUrls.length > 3){
+//			if (frontUrls != null && frontUrls.length > 3){
+//
+//				urlList.add(frontUrls[0]);
+//				urlList.add(frontUrls[1]);
+//			}
+			if (StringUtils.isNotEmpty(front)) {
+				urlList.add(front);
+			}
 
-				urlList.add(frontUrls[0]);
-				urlList.add(frontUrls[1]);
+			if (StringUtils.isNotEmpty(cataLog)) {
+				urlList.add(cataLog);
 			}
 
 			urlList.addAll(fileUrls);
 
-			if (frontUrls != null && frontUrls.length > 3){
-				urlList.add(frontUrls[2]);
-				urlList.add(frontUrls[3]);
+//			if (frontUrls != null && frontUrls.length > 3){
+//				urlList.add(frontUrls[2]);
+//				urlList.add(frontUrls[3]);
+//			}
+			if (StringUtils.isNotEmpty(spare)) {
+				urlList.add(spare);
+			}
+
+			if (StringUtils.isNotEmpty(back)) {
+				urlList.add(back);
 			}
 			String fileName = SnowFlakeUtil.getId().toString();
 			url = archiveAutoPdfService.MergePdfAndUpload(urlList,fileName,null,archivesAuto.getProjectId());
@@ -1151,29 +1194,56 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	}
 
 	/**
-	 * 从案卷删除文件
+	 * 从案卷删除文件,兵重新生成封面和打码文件
 	 * @param ids
 	 * @return
 	 */
-	public  boolean removeFiles(String ids) {
+	public  boolean removeFiles(String ids,Long archiveId) {
 		List<Long> fids = Func.toLongList(ids);
-		baseMapper.splitFiles(fids);
 
-		LambdaQueryWrapper<ArchiveFile> wrapper = Wrappers.lambdaQuery();
-		wrapper.in(ArchiveFile::getId, fids);
 
-		// 调用 listWrappers() 方法来获取符合条件的 ArchiveFile 对象列表
-		List<ArchiveFile> files = archiveFileClient.listWrappers(wrapper);
+		ArchivesAuto archivesAuto = this.getById(archiveId);
+
+		List<String> strIds = new ArrayList<>();
+		strIds.add(archiveId.toString());
+		List<ArchiveFile> files = archiveFileClient.getAllArchiveFileByArchiveIds(strIds);
+		List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
 		if (files != null && files.size() > 0) {
 			List<String> removeFiles = new ArrayList<>();
-			//删除打码文件
 			for (ArchiveFile file : files) {
-				//打码的也要删除
+
 				if (StringUtils.isNotBlank(file.getPdfPageUrl())){
 					removeFiles.add(FileUtils.getAliYunSubUrl(file.getPdfPageUrl()));
 				}
+
+				if (!fids.contains(file.getId())) {
+					waitArchiveFiles.add(file);
+				}
 			}
+			//删除文件
 			iossClient.removeFiles(removeFiles);
+
+			//删除不用的案卷
+			if (fids.size() > 0) {
+				baseMapper.splitFiles(fids);
+			}
+
+			Long archivesAutoId = archivesAuto.getId();
+
+			//封面和生成文件页码
+			archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
+
+			builtFilePageNo(archivesAuto,waitArchiveFiles);//生成文件页码
+
+			for(ArchiveFile file:waitArchiveFiles){
+				file.setArchiveId(archivesAutoId);//设置文件所属案卷
+				file.setIsArchive(1);
+
+			}
+
+			//保存
+			this.updateById(archivesAuto);
+			archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
 		}
 
 		return true;
@@ -1262,6 +1332,21 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		return result;
 	}
 
+	public void test(){
+		String ids = "1654406079229165569";
+
+		List<Long> fids = Func.toLongList(ids);
+
+
+
+		LambdaQueryWrapper<ArchiveFile> wrapper = Wrappers.lambdaQuery();
+		wrapper.in(ArchiveFile::getId, fids);
+
+		// 调用 listWrappers() 方法来获取符合条件的 ArchiveFile 对象列表
+		List<ArchiveFile> files = archiveFileClient.listbyIds(fids);
+		System.out.println();
+	}
+
 
 
 }

+ 52 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java

@@ -493,7 +493,10 @@ public class FileUtils {
                     fos.close();
                     if (newIOSSClient!= null ) {
                         //BladeFile bladeFile  = newIOSSClient.updateFile(out.toByteArray(),fileName);
-                        BladeFile bladeFile  = newIOSSClient.uploadFile(fileName,filePath,OssConstant.ARCHIVE_DIRECTORY,projectId);
+
+                        String absoluteFileName = FileUtils.getOssPath(OssConstant.ARCHIVE_DIRECTORY,fileName,projectId);
+                        BladeFile bladeFile = newIOSSClient.uploadFile(absoluteFileName, filePath);
+                        //BladeFile bladeFile  = newIOSSClient.uploadFile(fileName,filePath,OssConstant.ARCHIVE_DIRECTORY,projectId);
                         result.add(bladeFile.getLink());
 //                        File f = new File(filePath);
 //                        f.deleteOnExit();
@@ -642,7 +645,55 @@ public class FileUtils {
         }
     }
 
+    /**
+     * 预览文件  getOssPath(OssConstant.TEMP_DIRECTORY,文件名,随便填)
+     *          /upload/showtmp/xxxx
+     * 归档文件  getOssPath(OssConstant.ARCHIVE_DIRECTORY,文件名,projectId)
+     *         /upload/projectId/archive/20200304/xxxx
+     *  系统级或者不填projectId  getOssPath("","12344555",null)
+     *         upload/sys/20230505/xxxxx
+     * 拼接oss绝对路径
+     * @param filePath
+     * @param fileName
+     * @param projectId
+     * @return
+     */
+    public static String getOssPath(String filePath, String fileName, Long projectId){
+
+        String ossPath = OssConstant.NORMAL_DIRECTORY;
+
+        //如果是临时预览目录,则在 /upload/showtmp/xxxx.pdf
+        if (filePath!=null && filePath.equals(OssConstant.TEMP_DIRECTORY)) {
+            ossPath = ossPath + "/" + filePath + "/" + fileName;
+            return ossPath;
+        }
+
+        //项目的在 /upload/项目id/下   系统的在 /upload/sys下
+        String projectDir = OssConstant.SYS_DIRECTORY;
+        if (projectId != null)
+        {
+            projectDir = projectId.toString();
+        }
+        Date now = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        String formattedDate = sdf.format(now);
+        if (org.springframework.util.StringUtils.isEmpty(filePath)) {
+            filePath = formattedDate;
+        }else {
+            filePath = filePath +  "/" + formattedDate;
+        }
+
+        ossPath = ossPath +  "/" + projectDir +  "/" +  filePath + "/" + fileName;
+
+        return ossPath;
+    }
+
 //    public static void main(String[] args) {
+//
+//        System.out.println(getOssPath(null,"12344555",12424445L));
+//        System.out.println(getOssPath(OssConstant.TEMP_DIRECTORY,"12344555",12424445L));
+//        System.out.println(getOssPath(OssConstant.ARCHIVE_DIRECTORY,"12344555",12424445L));
+//        System.out.println(getOssPath("","12344555",null));
 //        String url = "https://bladex-chongqing-info.oss-cn-hangzhou.aliyuncs.com/1578599210897772545/archive/ed4305eb971b062046c1ffd4e2da3c32-page1-1.pdf";
 //        String url1 = "https://bladex-chongqing-info.oss-cn-hangzhou.aliyuncs.com/upload/ed4305eb971b062046c1ffd4e2da3c32-page1-1.pdf";
 //

+ 116 - 194
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -8,6 +8,9 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
 import com.google.common.collect.Lists;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -61,6 +64,7 @@ import java.io.IOException;
 import java.util.*;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -575,7 +579,7 @@ public class InformationWriteQueryController extends BladeController {
     @ApiOperation(value = "单个废除")
     public R<Boolean> abolishOne(@RequestParam String primaryKeyId, @RequestParam String classify) {
         //查询填报状态
-        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify).eq(InformationQuery::getType,1));
+        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify).eq(InformationQuery::getType, 1));
         if (businessData != null) {
             //使用批量废除接口
             return this.batchAbolish(businessData.getId().toString(), primaryKeyId);
@@ -859,7 +863,7 @@ public class InformationWriteQueryController extends BladeController {
     @ApiOperation(value = "填报页单个上报")
     public R<Boolean> taskOne(@RequestBody StartTaskVO startTaskVO) throws IOException {
         //此时的ids是当前节点的primaryKeyId但并不是业务数据ID,需要根据ids和classify去查询具体的业务ID
-        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, startTaskVO.getIds().replaceAll(",", "")).eq(InformationQuery::getClassify, startTaskVO.getClassify().toString()).eq(InformationQuery::getType,1));
+        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, startTaskVO.getIds().replaceAll(",", "")).eq(InformationQuery::getClassify, startTaskVO.getClassify().toString()).eq(InformationQuery::getType, 1));
 
         //处理上报信息
         if (businessData != null) {
@@ -1445,7 +1449,7 @@ public class InformationWriteQueryController extends BladeController {
             //复制元素表附件信息
             List<WbsTreeContract> newTabs = saveList.stream().filter(f -> (new Integer(2).equals(f.getType()))).collect(Collectors.toList());
             if (newTabs.size() > 0 && oldTabs.size() > 0 && vo.getIsCopyData() == 1) {
-                this.addCopyTabFile(newTabs, oldTabs);
+                this.addCopyTabFile(new HashSet<>(newTabs), oldTabs);
             }
 
             //复制表单数据
@@ -1504,99 +1508,94 @@ public class InformationWriteQueryController extends BladeController {
                     //结果集
                     List<WbsTreeContract> addNodeList = new ArrayList<>();//新增节点
                     List<WbsTreeContract> addTabList = new ArrayList<>(); //新增表单
-                    //List<WbsTreeContract> asyncWbsTreeNodes = new ArrayList<>(); //redis同步节点
                     Set<WbsTreeContract> addChildNodesTablesOldAll = new HashSet<>(addChildNodesTables);//数据源表附件
-                    Set<WbsTreeContract> addNewFileTabs = new HashSet<>(addChildNodesTables);//新增到目标表附件
+                    Set<WbsTreeContract> addNewFileTabs = new HashSet<>();//新增到目标表附件
                     List<String> resultTablesData = new ArrayList<>();//表单数据
 
-                    //创建线程池,默认设置4个线程
-                    ExecutorService executor = Executors.newFixedThreadPool(4);
-                    try {
-                        //解析位置信息,进行复制数据构造
-                        if (toCopyNodes.size() == copyBatches.size()) {
-                            for (int i = 0; i < toCopyNodes.size(); i++) {
-                                WbsTreeContract needCopyNode = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getNeedCopyPrimaryKeyId());
-                                //首先查询需要复制的节点的信息
-                                WbsTreeContract toCopyNode = toCopyNodes.get(i);
-                                CopyContractTreeNodeVO.CopyBatch toCopyVO = copyBatches.get(i);
-                                //asyncWbsTreeNodes.add(toCopyNode);
-                                String finalTabOwner = tabOwner;
-                                executor.submit(() -> {
-                                    if (toCopyNode != null && toCopyVO != null && needCopyNodeAndTabMap.size() > 0) {
-                                        //TODO 同节点复制
-                                        if (new Integer(1).equals(toCopyVO.getIsSameNode())) {
-                                            //1.1 选择当前节点的父级节点,新增
-                                            if (needCopyNode.getParentId().equals(toCopyNode.getId())) {
-                                                toCopyNode.setNodeName(toCopyVO.getNodeName());
-                                                toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
-
-                                                //获取缓存节点、表信息
-                                                List<WbsTreeContract> needCopyNodes = needCopyNodeAndTabMap.get("node:" + needCopyNodeRoot.getPKeyId());
-                                                List<WbsTreeContract> needCopyTab = needCopyNodeAndTabMap.get("tab:" + needCopyNodeRoot.getPKeyId());
-
-                                                //构造新的节点、表、数据
-                                                this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, needCopyNodes, needCopyTab, needCopyNode, toCopyNode, resultTablesData, 1, finalTabOwner, vo.getIsCopyData());
-
-                                                //1.2 选择同父级的同级节点,只复制数据
-                                            } else if (needCopyNode.getParentId().equals(toCopyNode.getParentId())) {
-                                                //构造数据
-                                                this.addCopyTabData(needCopyNode, toCopyNode, finalTabOwner, resultTablesData, addTabList, vo.getIsCopyData(), addNewFileTabs);
-                                            }
+                    //解析位置信息,进行复制数据构造
+                    if (toCopyNodes.size() == copyBatches.size()) {
+                        for (int i = 0; i < toCopyNodes.size(); i++) {
+                            WbsTreeContract needCopyNode = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getNeedCopyPrimaryKeyId());
+                            //首先查询需要复制的节点的信息
+                            WbsTreeContract toCopyNode = toCopyNodes.get(i);
+                            CopyContractTreeNodeVO.CopyBatch toCopyVO = copyBatches.get(i);
+
+                            if (toCopyNode != null && toCopyVO != null && needCopyNodeAndTabMap.size() > 0) {
+                                //TODO 同节点复制
+                                if (new Integer(1).equals(toCopyVO.getIsSameNode())) {
+                                    //1.1 选择当前节点的父级节点,新增
+                                    if (needCopyNode.getParentId().equals(toCopyNode.getId())) {
+                                        toCopyNode.setNodeName(toCopyVO.getNodeName());
+                                        toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
+
+                                        //获取缓存节点、表信息
+                                        List<WbsTreeContract> needCopyNodes = needCopyNodeAndTabMap.get("node:" + needCopyNodeRoot.getPKeyId());
+                                        List<WbsTreeContract> needCopyTab = needCopyNodeAndTabMap.get("tab:" + needCopyNodeRoot.getPKeyId());
+
+                                        //构造新的节点、表、数据
+                                        this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, needCopyNodes, needCopyTab, needCopyNode, toCopyNode, resultTablesData, 1, tabOwner, vo.getIsCopyData());
+
+                                        //附件
+                                        addNewFileTabs.addAll(addTabList);
+
+                                        //1.2 选择同父级的同级节点,只复制数据
+                                    } else if (needCopyNode.getParentId().equals(toCopyNode.getParentId())) {
+                                        //构造数据
+                                        this.addCopyTabData(needCopyNode, toCopyNode, tabOwner, resultTablesData, addTabList, vo.getIsCopyData(), addNewFileTabs);
+                                    }
 
-                                            //TODO 跨节点复制
-                                        } else if (new Integer(0).equals(toCopyVO.getIsSameNode())) {
-                                            //获取需要复制节点的上级
-                                            WbsTreeContract parentNodeNeed = wbsTreeContractClient.getContractWbsTreeByContractIdAndId(needCopyNode.getParentId(), Long.parseLong(needCopyNode.getContractId()));
-
-                                            boolean var = false;
-                                            //2.1 选择的父级的同级的父级节点,新增(当复制节点父级与选择复制到的位置节点的父级id相同时,表示跨节点新增)
-                                            if (parentNodeNeed != null) {
-                                                //2.1.1 如果是跨一级的情况下:parentNodeNeed.getParentId() == toCopyNode.getParentId() ,且 parentNodeNeed.getAncestors() == toCopyNode.getAncestors() ,且节点类型必须一样
-                                                if (parentNodeNeed.getParentId().equals(toCopyNode.getParentId()) && parentNodeNeed.getAncestors().equals(toCopyNode.getAncestors()) && parentNodeNeed.getNodeType().equals(toCopyNode.getNodeType())) {
-                                                    toCopyNode.setNodeName(toCopyVO.getNodeName());
-                                                    toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
-
-                                                    //获取缓存节点、表信息
-                                                    List<WbsTreeContract> needCopyNodes = needCopyNodeAndTabMap.get("node:" + needCopyNodeRoot.getPKeyId());
-                                                    List<WbsTreeContract> needCopyTab = needCopyNodeAndTabMap.get("tab:" + needCopyNodeRoot.getPKeyId());
-
-                                                    //构造新的节点、表、数据
-                                                    this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, needCopyNodes, needCopyTab, needCopyNode, toCopyNode, resultTablesData, 0, finalTabOwner, vo.getIsCopyData());
-                                                    var = true;
-
-                                                } else if (!parentNodeNeed.getParentId().equals(toCopyNode.getParentId()) && !parentNodeNeed.getAncestors().equals(toCopyNode.getAncestors()) && parentNodeNeed.getNodeType().equals(toCopyNode.getNodeType())) {
-                                                    //2.1.2 如果跨多级的情况下父级id不相同 parentNodeNeed.getParentId() != toCopyNode.getParentId() ,且 parentNodeNeed.getAncestors() != toCopyNode.getAncestors() ,且节点类型必须一样
-                                                    toCopyNode.setNodeName(toCopyVO.getNodeName());
-                                                    toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
-
-                                                    //获取缓存节点、表信息
-                                                    List<WbsTreeContract> needCopyNodes = needCopyNodeAndTabMap.get("node:" + needCopyNodeRoot.getPKeyId());
-                                                    List<WbsTreeContract> needCopyTab = needCopyNodeAndTabMap.get("tab:" + needCopyNodeRoot.getPKeyId());
-
-                                                    //构造新的节点、表、数据
-                                                    this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, needCopyNodes, needCopyTab, needCopyNode, toCopyNode, resultTablesData, 0, finalTabOwner, vo.getIsCopyData());
-                                                    var = true;
-                                                }
-                                            }
+                                    //TODO 跨节点复制
+                                } else if (new Integer(0).equals(toCopyVO.getIsSameNode())) {
+                                    //获取需要复制节点的上级
+                                    WbsTreeContract parentNodeNeed = wbsTreeContractClient.getContractWbsTreeByContractIdAndId(needCopyNode.getParentId(), Long.parseLong(needCopyNode.getContractId()));
 
-                                            //2.2 如果点击选择的是当前复制节点本身的同等级节点,那么就只复制数据。(如果是跨节点,类型相同的情况下,只复制数据),且var=false,表示没有进行到跨节点新增的逻辑,只是跨节点复制数据
-                                            if (needCopyNode.getNodeType().equals(toCopyNode.getNodeType()) && !needCopyNode.getParentId().equals(toCopyNode.getParentId()) && !var) {
-                                                //构造数据
-                                                this.addCopyTabData(needCopyNode, toCopyNode, finalTabOwner, resultTablesData, addTabList, vo.getIsCopyData(), addNewFileTabs);
-                                            }
+                                    boolean var = false;
+                                    //2.1 选择的父级的同级的父级节点,新增(当复制节点父级与选择复制到的位置节点的父级id相同时,表示跨节点新增)
+                                    if (parentNodeNeed != null) {
+                                        //2.1.1 如果是跨一级的情况下:parentNodeNeed.getParentId() == toCopyNode.getParentId() ,且 parentNodeNeed.getAncestors() == toCopyNode.getAncestors() ,且节点类型必须一样
+                                        if (parentNodeNeed.getParentId().equals(toCopyNode.getParentId()) && parentNodeNeed.getAncestors().equals(toCopyNode.getAncestors()) && parentNodeNeed.getNodeType().equals(toCopyNode.getNodeType())) {
+                                            toCopyNode.setNodeName(toCopyVO.getNodeName());
+                                            toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
+
+                                            //获取缓存节点、表信息
+                                            List<WbsTreeContract> needCopyNodes = needCopyNodeAndTabMap.get("node:" + needCopyNodeRoot.getPKeyId());
+                                            List<WbsTreeContract> needCopyTab = needCopyNodeAndTabMap.get("tab:" + needCopyNodeRoot.getPKeyId());
+
+                                            //构造新的节点、表、数据
+                                            this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, needCopyNodes, needCopyTab, needCopyNode, toCopyNode, resultTablesData, 0, tabOwner, vo.getIsCopyData());
+
+                                            //附件
+                                            addNewFileTabs.addAll(addTabList);
+
+                                            var = true;
+
+                                        } else if (!parentNodeNeed.getParentId().equals(toCopyNode.getParentId()) && !parentNodeNeed.getAncestors().equals(toCopyNode.getAncestors()) && parentNodeNeed.getNodeType().equals(toCopyNode.getNodeType())) {
+                                            //2.1.2 如果跨多级的情况下父级id不相同 parentNodeNeed.getParentId() != toCopyNode.getParentId() ,且 parentNodeNeed.getAncestors() != toCopyNode.getAncestors() ,且节点类型必须一样
+                                            toCopyNode.setNodeName(toCopyVO.getNodeName());
+                                            toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
+
+                                            //获取缓存节点、表信息
+                                            List<WbsTreeContract> needCopyNodes = needCopyNodeAndTabMap.get("node:" + needCopyNodeRoot.getPKeyId());
+                                            List<WbsTreeContract> needCopyTab = needCopyNodeAndTabMap.get("tab:" + needCopyNodeRoot.getPKeyId());
+
+                                            //构造新的节点、表、数据
+                                            this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, needCopyNodes, needCopyTab, needCopyNode, toCopyNode, resultTablesData, 0, tabOwner, vo.getIsCopyData());
+
+                                            //附件
+                                            addNewFileTabs.addAll(addTabList);
+
+                                            var = true;
                                         }
                                     }
-                                });
+
+                                    //2.2 如果点击选择的是当前复制节点本身的同等级节点,那么就只复制数据。(如果是跨节点,类型相同的情况下,只复制数据),且var=false,表示没有进行到跨节点新增的逻辑,只是跨节点复制数据
+                                    if (needCopyNode.getNodeType().equals(toCopyNode.getNodeType()) && !needCopyNode.getParentId().equals(toCopyNode.getParentId()) && !var) {
+                                        //构造数据
+                                        this.addCopyTabData(needCopyNode, toCopyNode, tabOwner, resultTablesData, addTabList, vo.getIsCopyData(), addNewFileTabs);
+                                    }
+                                }
                             }
                         }
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    } finally {
-                        //关闭线程池
-                        executor.shutdown();
-                        //等待所有线程执行完毕
-                        while (!executor.isTerminated()) {
-                        }
                     }
 
                     //重构祖级id
@@ -1621,7 +1620,7 @@ public class InformationWriteQueryController extends BladeController {
 
                     if (addNewFileTabs.size() > 0 && addChildNodesTablesOldAll.size() > 0 && vo.getIsCopyData() == 1) {
                         //复制新增表附件
-                        this.addCopyTabFile(tabs, addChildNodesTablesOldAll);
+                        this.addCopyTabFile(addNewFileTabs, addChildNodesTablesOldAll);
                     }
 
                     if (resultTablesData.size() > 0 && vo.getIsCopyData() == 1) {
@@ -1631,15 +1630,12 @@ public class InformationWriteQueryController extends BladeController {
                             jdbcTemplate.execute(StringUtils.join(strings, ""));
                         }
                     }
+
                     if (row) {
                         //更新redis缓存
                         informationQueryService.delAsyncWbsTree(contractId);
-                        /*List<WbsTreeContract> collect = asyncWbsTreeNodes.stream().distinct().collect(Collectors.toList());
-                        for (WbsTreeContract asyncWbsTreeNode : collect) {
-                            informationQueryService.AsyncWbsTree("", asyncWbsTreeNode.getId() + "", contractId, "", "1");
-                            informationQueryService.AsyncWbsTree("", asyncWbsTreeNode.getParentId() + "", contractId, "", "1");
-                        }*/
                     }
+
                     return R.success("操作成功");
                 } else {
                     throw new ServiceException("没有找到需要复制的节点信息,请联系管理员");
@@ -1681,25 +1677,37 @@ public class InformationWriteQueryController extends BladeController {
      * 新增复制的表单文件
      */
     @Async
-    public void addCopyTabFile(List<WbsTreeContract> addChildNodesTables, Set<WbsTreeContract> addChildNodesTablesOld) {
+    public void addCopyTabFile(Set<WbsTreeContract> addChildNodesTables, Set<WbsTreeContract> addChildNodesTablesOld) {
         //获取所有数据源附件文件
         List<Long> tabFileIds = addChildNodesTablesOld.stream().distinct().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
         Map<String, List<TableFile>> tableFileOldMap = tableFileClient.getTabFilesByTabIds(StringUtils.join(tabFileIds, ",")).stream().collect(Collectors.groupingBy(TableFile::getTabId));
         if (tableFileOldMap != null && tableFileOldMap.size() > 0) {
             List<TableFile> resultFileData = new ArrayList<>();
-            List<Long> updatePKeyIds = new ArrayList<>();
-            for (WbsTreeContract tabOld : addChildNodesTablesOld) {
-                for (WbsTreeContract tabNew : addChildNodesTables) {
-                    //获取对应表
-                    if (tabOld.getNodeName().equals(tabNew.getNodeName()) && (ObjectUtil.isNotEmpty(tabOld.getHtmlUrl()) && ObjectUtil.isNotEmpty(tabNew.getHtmlUrl()) && tabOld.getHtmlUrl().equals(tabNew.getHtmlUrl()))) {
-                        //构建文件数据
+            Set<Long> updatePKeyIds = new HashSet<>();
+
+            Map<String, WbsTreeContract> addChildNodesTablesOldMap = new HashMap<>();
+            for (WbsTreeContract node : addChildNodesTablesOld) {
+                if (StringUtils.isNotBlank(node.getHtmlUrl())) {
+                    String key = node.getNodeName() + node.getHtmlUrl();
+                    addChildNodesTablesOldMap.put(key, node);
+                }
+            }
+
+            for (WbsTreeContract tabNew : addChildNodesTables) {
+                if (StringUtils.isNotBlank(tabNew.getHtmlUrl())) {
+                    String key = tabNew.getNodeName() + tabNew.getHtmlUrl();
+                    WbsTreeContract tabOld = addChildNodesTablesOldMap.get(key);
+                    if (tabOld != null) {
                         List<TableFile> tab = tableFileOldMap.get(tabOld.getPKeyId() + "");
                         if (tab != null && tab.size() > 0) {
-                            tab.forEach(file -> {
-                                file.setTabId(tabNew.getPKeyId() + "");
-                                file.setId(SnowFlakeUtil.getId());
-                            });
-                            resultFileData.addAll(tab);
+                            for (TableFile tableFile : tab) {
+                                TableFile obj = BeanUtil.copyProperties(tableFile, TableFile.class);
+                                if (obj != null) {
+                                    obj.setTabId(tabNew.getPKeyId() + "");
+                                    obj.setId(SnowFlakeUtil.getId());
+                                    resultFileData.add(obj);
+                                }
+                            }
                             if (ObjectUtil.isNotEmpty(tabOld) && tabOld.getTabFileType() == 2) {
                                 updatePKeyIds.add(tabNew.getPKeyId());
                             }
@@ -1707,11 +1715,12 @@ public class InformationWriteQueryController extends BladeController {
                     }
                 }
             }
+
             if (resultFileData.size() > 0) {
                 //入库
                 if (tableFileClient.saveBatch(resultFileData) && updatePKeyIds.size() > 0) {
                     //修改表的文件按钮状态
-                    wbsTreeContractClient.updateTabFileTypeByPkeyIds(updatePKeyIds);
+                    wbsTreeContractClient.updateTabFileTypeByPkeyIds(new ArrayList<>(updatePKeyIds));
                 }
             }
         }
@@ -2038,35 +2047,6 @@ public class InformationWriteQueryController extends BladeController {
         }
     }
 
-    /**
-     * 获取所有子级节点-资料查询
-     */
-    private List<WbsTreeContract> getChildNodesZL(WbsTreeContract obj) {
-        if (obj != null) {
-            List<WbsTreeContract> wbsTreeContracts = Collections.singletonList(obj);
-            List<WbsTreeContract> result = new ArrayList<>();
-            this.recursionGetChildNodesZL(wbsTreeContracts, result, obj.getContractId());
-            if (result.size() > 0) {
-                return result;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * 递归获取所有子级节点-资料查询
-     */
-    private void recursionGetChildNodesZL(List<WbsTreeContract> list, List<WbsTreeContract> result, String contractId) {
-        List<Long> ids = list.stream().map(WbsTreeContract::getId).collect(Collectors.toList());
-        if (ids.size() > 0) {
-            List<WbsTreeContract> query = jdbcTemplate.query("select full_name,id,p_key_id,parent_id,sort from m_wbs_tree_contract where type = 1 and parent_id in(" + StringUtils.join(ids, ",") + ") and status = 1 and is_deleted = 0 and contract_id = " + contractId, new BeanPropertyRowMapper<>(WbsTreeContract.class));
-            if (query.size() > 0) {
-                result.addAll(query);
-                recursionGetChildNodesZL(query, result, contractId);
-            }
-        }
-    }
-
     /**
      * 获取所有子级下的表
      */
@@ -3124,65 +3104,7 @@ public class InformationWriteQueryController extends BladeController {
             vo.setContractId(Long.valueOf(vo.getContractIdRelation()));
         }
 
-        IPage<InformationQueryVO> resultPageData = this.informationQueryService.selectInformationQueryPage(Condition.getPage(query), vo);
-
-        //TODO 处理资料查询,page数据与节点顺序同步问题
-        //获取选择的节点下的所有子节点信息
-        /*WbsTreeContract oldSelectedNode = BeanUtil.copyProperties(node, WbsTreeContract.class);
-        List<WbsTreeContract> treeAll = this.getChildNodesZL(oldSelectedNode);
-        if (treeAll == null) {
-            treeAll = new ArrayList<>();
-        }
-        treeAll.add(oldSelectedNode);
-
-        if (treeAll.size() == 1) { //最底层节点,直接返回
-            return R.data(resultPageData);
-        } else {
-            List<InformationQueryVO> resultData = new ArrayList<>();
-            if (oldSelectedNode != null) {
-                List<WbsTreeContract> resultNodes = this.reOrderNode(treeAll, oldSelectedNode);
-                Map<Long, InformationQueryVO> dataMaps = resultPageData.getRecords().stream().collect(Collectors.toMap(InformationQueryVO::getWbsId, Function.identity()));
-                for (WbsTreeContract resultNode : resultNodes) {
-                    InformationQueryVO queryVO = dataMaps.get(resultNode.getPKeyId());
-                    if (queryVO != null) {
-                        resultData.add(queryVO);
-                    }
-                }
-            }
-            if (resultData.size() > 0) {
-                return R.data(resultPageData.setRecords(resultData));
-            } else {*/
-        return R.data(resultPageData);
-        //}
-        //}
-    }
-
-    /**
-     * 节点重新排序
-     */
-    private List<WbsTreeContract> reOrderNode(List<WbsTreeContract> inList, WbsTreeContract oldSelectedNode) {
-        Map<Long, List<WbsTreeContract>> parentGroup = inList.stream().collect(Collectors.groupingBy(WbsTreeContract::getParentId));
-        Long parentId = oldSelectedNode.getId();
-        return getSubNodes(parentId, parentGroup);
-    }
-
-    private List<WbsTreeContract> getSubNodes(Long parentId, Map<Long, List<WbsTreeContract>> parentGroup) {
-        List<WbsTreeContract> subNodes = new ArrayList<>();
-        if (parentGroup.containsKey(parentId)) {
-            List<WbsTreeContract> children = parentGroup.get(parentId);
-            for (WbsTreeContract child : children) {
-                List<WbsTreeContract> grandChildren = this.getSubNodes(child.getId(), parentGroup);
-                subNodes.addAll(grandChildren);
-            }
-            subNodes.addAll(children);
-        }
-        subNodes.sort(
-                Comparator.comparingInt((WbsTreeContract node) -> node.getSort() == null ? Integer.MAX_VALUE : node.getSort())
-                        .thenComparing(Comparator.nullsLast(Comparator.comparing(WbsTreeContract::getFullName)))
-                        .thenComparingLong(node -> node.getPKeyId() == null ? Long.MAX_VALUE : node.getPKeyId())
-                        .thenComparing(Comparator.nullsLast(Comparator.comparing(WbsTreeContract::getUpdateTime)))
-        );
-        return subNodes;
+        return R.data(this.informationQueryService.selectInformationQueryPage(Condition.getPage(query), vo, node));
     }
 
     /**

+ 13 - 1
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.business.entity.ArchiveFile;
@@ -16,6 +17,8 @@ import org.springblade.common.utils.FileUtils;
 import org.springblade.common.vo.FileSize;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.feign.ContractClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.*;
@@ -77,9 +80,18 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
 
     @Override
     public List<ArchiveFile> listWrappers(LambdaQueryWrapper<ArchiveFile> in) {
-        return this.iArchiveFileService.list(in);
+        List<ArchiveFile> list =  this.iArchiveFileService.list(in);
+        return list;
     }
 
+    @Override
+    public List<ArchiveFile> listbyIds(@RequestBody List<Long> ids){
+        LambdaQueryWrapper<ArchiveFile> wrapper = Wrappers.lambdaQuery();
+        wrapper.in(ArchiveFile::getId, ids);
+        return  this.iArchiveFileService.list(wrapper);
+    }
+
+
     @Override
     public boolean updateWrappers(LambdaUpdateWrapper<ArchiveFile> eq) {
         return this.iArchiveFileService.update(eq);

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

@@ -77,9 +77,6 @@
         <if test="vo.projectId != null and vo.projectId != ''">
             and project_id = #{vo.projectId}
         </if>
-        <if test="vo.contractId != null and vo.contractId != ''">
-            and contract_id = #{vo.contractId}
-        </if>
         <if test="vo.archiveId != null and vo.archiveId != ''">
             and archive_id = #{vo.archiveId}
         </if>
@@ -120,9 +117,6 @@
         <if test="vo.projectId != null and vo.projectId != ''">
             and project_id = #{vo.projectId}
         </if>
-        <if test="vo.contractId != null and vo.contractId != ''">
-            and contract_id = #{vo.contractId}
-        </if>
         <if test="vo.archiveId != null and vo.archiveId != ''">
             and archive_id = #{vo.archiveId}
         </if>

+ 80 - 72
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.java

@@ -20,6 +20,7 @@ import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.vo.InformationQueryVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+
 import java.util.List;
 import java.util.Map;
 
@@ -29,90 +30,97 @@ import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 
 /**
- *  Mapper 接口
+ * Mapper 接口
  *
  * @author BladeX
  * @since 2022-06-08
  */
 public interface InformationQueryMapper extends BaseMapper<InformationQuery> {
 
-	List<WbsTreeContractTreeVOS> queryContractTreeSupervision(@Param("contractIds") List<String> contractIds, @Param("parentId") String parentId, @Param("classify") Integer classify);
-
-	List<WbsTreeContractTreeVOS> queryContractTree(@Param("contractId") String contractId, @Param("parentId") String parentId, @Param("classify") Integer classify);
-
-	List<QueryProcessDataVO> queryProcessDataByPrimaryKeyIdAndClassify(@Param("primaryKeyId") String primaryKeyId, @Param("classify") Integer classify);
-
-	/**
-	 * 查询工序节点的填报记录
-	 */
-	List<QueryProcessDataVO> queryProcessDataByParentIdAndContractId(@Param("parentId") String parentId, @Param("classify") Integer classify, @Param("contractId") String contractId);
-	/**
-	 * 查询工序节点的填报记录
-	 */
-	List<QueryProcessDataVO> queryProcessDataByParentIdAndContractIdTwo(@Param("parentId") String parentId, @Param("classify") Integer classify, @Param("contractId") String contractId);
-	/**
-	 * 查询工序节点的填报记录,资料进度使用
-	 */
-	List<QueryProcessDataVO> queryProcessDataByParentIdAndContractIdThree(@Param("parentId") String parentId, @Param("classify") Integer classify, @Param("contractId") String contractId);
-
-	/**
-	 * 根据节点ID及其填报的类型获取填报记录
-	 * @param wbsId 节点ID
-	 * @param classify 1施工2质检
-	 * @return 结果对象
-	 */
-	InformationQuery getInformationQueryByWbsId(@Param("wbsId") Long wbsId, @Param("classify") Integer classify);
-
-	/**
-	 * 获取当前合同段下所有的上报批次
-	 * @param classify 合同段类型
-	 * @param contractId 合同段ID
-	 * @return 填报人集合
-	 */
-	List<Integer> getReportNumberByContractId(@Param("classify") Integer classify, @Param("contractId") String contractId);
-
-	/**
-	 * 查询填报人集合
-	 * @param classify 合同段类型
-	 * @param contractId 合同段ID
-	 * @return 填报人集合
-	 */
-	List<InformationQuery> queryFileUserByContractId(@Param("classify") Integer classify, @Param("contractId") String contractId);
-
-	/**
-	 * 统计
-	 */
-	Integer countInformationQuery(@Param("query") InformationQueryVO informationQuery);
-	/**
-	 * 统计
-	 */
-	Integer countInformationQueryTwo(@Param("query") InformationQueryVO informationQuery);
-
-	/**
-	 * 自定义分页
-	 */
-	List<InformationQuery> selectInformationQueryPage(@Param("current") Long current, @Param("size") Long size, @Param("query") InformationQueryVO informationQuery);
-	/**
-	 * 自定义分页,因为information的批次字段数据不全
-	 */
-	List<InformationQuery> selectInformationQueryPageTwo(@Param("current") Long current, @Param("size") Long size, @Param("query") InformationQueryVO informationQuery);
-
-	List<WbsTreeContract> getContractNodeByPrimaryKeyIds(String ids);
+    List<WbsTreeContractTreeVOS> queryContractTreeSupervision(@Param("contractIds") List<String> contractIds, @Param("parentId") String parentId, @Param("classify") Integer classify);
+
+    List<WbsTreeContractTreeVOS> queryContractTree(@Param("contractId") String contractId, @Param("parentId") String parentId, @Param("classify") Integer classify);
+
+    List<QueryProcessDataVO> queryProcessDataByPrimaryKeyIdAndClassify(@Param("primaryKeyId") String primaryKeyId, @Param("classify") Integer classify);
+
+    /**
+     * 查询工序节点的填报记录
+     */
+    List<QueryProcessDataVO> queryProcessDataByParentIdAndContractId(@Param("parentId") String parentId, @Param("classify") Integer classify, @Param("contractId") String contractId);
+
+    /**
+     * 查询工序节点的填报记录
+     */
+    List<QueryProcessDataVO> queryProcessDataByParentIdAndContractIdTwo(@Param("parentId") String parentId, @Param("classify") Integer classify, @Param("contractId") String contractId);
+
+    /**
+     * 查询工序节点的填报记录,资料进度使用
+     */
+    List<QueryProcessDataVO> queryProcessDataByParentIdAndContractIdThree(@Param("parentId") String parentId, @Param("classify") Integer classify, @Param("contractId") String contractId);
+
+    /**
+     * 根据节点ID及其填报的类型获取填报记录
+     *
+     * @param wbsId    节点ID
+     * @param classify 1施工2质检
+     * @return 结果对象
+     */
+    InformationQuery getInformationQueryByWbsId(@Param("wbsId") Long wbsId, @Param("classify") Integer classify);
+
+    /**
+     * 获取当前合同段下所有的上报批次
+     *
+     * @param classify   合同段类型
+     * @param contractId 合同段ID
+     * @return 填报人集合
+     */
+    List<Integer> getReportNumberByContractId(@Param("classify") Integer classify, @Param("contractId") String contractId);
+
+    /**
+     * 查询填报人集合
+     *
+     * @param classify   合同段类型
+     * @param contractId 合同段ID
+     * @return 填报人集合
+     */
+    List<InformationQuery> queryFileUserByContractId(@Param("classify") Integer classify, @Param("contractId") String contractId);
+
+    /**
+     * 统计
+     */
+    Integer countInformationQuery(@Param("query") InformationQueryVO informationQuery);
+
+    /**
+     * 统计
+     */
+    Integer countInformationQueryTwo(@Param("query") InformationQueryVO informationQuery);
+
+    /**
+     * 自定义分页
+     */
+    List<InformationQuery> selectInformationQueryPage(@Param("current") Long current, @Param("size") Long size, @Param("query") InformationQueryVO informationQuery);
+
+    /**
+     * 自定义分页,因为information的批次字段数据不全
+     */
+    List<InformationQuery> selectInformationQueryPageTwo(@Param("query") InformationQueryVO informationQuery);
+
+    List<WbsTreeContract> getContractNodeByPrimaryKeyIds(String ids);
 
     List<WbsTreeContract> getContractWbsTreeAll(@Param("obj") WbsTreeContract wbsTreeContract);
 
-    void updateBatchByPKeyId(@Param("list")List<WbsTreeContract> result);
+    void updateBatchByPKeyId(@Param("list") List<WbsTreeContract> result);
 
-	// 节点复制数据
-	boolean copeNodeData(String nodeId, String vocationalId);
+    // 节点复制数据
+    boolean copeNodeData(String nodeId, String vocationalId);
 
-	// 获取当前节点的子节点及自己
-	List<WbsTreeContract> getNodeChildAllByNodeId(String nodeId,String contractId,String pKeyId);
+    // 获取当前节点的子节点及自己
+    List<WbsTreeContract> getNodeChildAllByNodeId(String nodeId, String contractId, String pKeyId);
 
-	// 获取当前节点下,所有表单的字段数据
-	List<QueryProcessDataVO> getNodeChildTabColsAllByNodeId(String nodeId, String contractId);
+    // 获取当前节点下,所有表单的字段数据
+    List<QueryProcessDataVO> getNodeChildTabColsAllByNodeId(String nodeId, String contractId);
 
-	// 获取当前节点下,所有表单的字段数据,根据表名
-	List<QueryProcessDataVO> getNodeChildTabColsAllByTabName(String tabName);
+    // 获取当前节点下,所有表单的字段数据,根据表名
+    List<QueryProcessDataVO> getNodeChildTabColsAllByTabName(String tabName);
 
 }

+ 2 - 3
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml

@@ -731,7 +731,6 @@
             and query.createTimes between #{query.startTime} and #{query.endTime}
         </if>
         order by create_time desc
-        limit #{current}, #{size}
     </select>
 
     <select id="getContractNodeByPrimaryKeyIds" resultType="org.springblade.manager.entity.WbsTreeContract">
@@ -768,12 +767,12 @@
                    ELSE 'true' end                                                                      AS isExperiment
         FROM m_wbs_tree_contract AS wtc
                  LEFT JOIN u_information_query AS uiq
-                           ON wtc.p_key_id = uiq.wbs_id AND uiq.classify = #{classify} and uiq.is_deleted = 0
+                           ON wtc.p_key_id = uiq.wbs_id AND uiq.classify = #{classify} and uiq.is_deleted = 0 and wtc.is_deleted = 0 and wtc.status = 1
         WHERE wtc.type = 1
           AND wtc.major_data_type in (0, 1, 2, 3, 4)
           AND wtc.ancestors like concat('%', #{parentId}, '%')
           AND wtc.contract_id = #{contractId}
-          AND wtc.is_deleted = 0
+          AND wtc.is_deleted = 0 AND wtc.status = 1
     </select>
 
     <select id="queryProcessDataByParentIdAndContractIdThree" resultMap="queryProcessDataMap">

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/IInformationQueryService.java

@@ -107,7 +107,7 @@ public interface IInformationQueryService extends BaseService<InformationQuery>
     /**
      * 自定义分页
      */
-    IPage<InformationQueryVO> selectInformationQueryPage(IPage<InformationQueryVO> page, InformationQueryVO vo);
+    IPage<InformationQueryVO> selectInformationQueryPage(IPage<InformationQueryVO> page, InformationQueryVO vo,WbsTreeContract node);
 
 
     List<WbsTreeContract> getContractWbsTreeAll(WbsTreeContract wbsTreeContract);

+ 141 - 14
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java

@@ -23,13 +23,12 @@ import org.springblade.common.constant.LauncherConstant;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.cache.utils.CacheUtil;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.mp.support.Condition;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
-import org.springblade.core.tool.utils.DateUtil;
-import org.springblade.core.tool.utils.Func;
-import org.springblade.core.tool.utils.ResourceUtil;
+import org.springblade.core.tool.utils.*;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.feign.ContractClient;
@@ -50,6 +49,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -286,7 +286,7 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
             }
 
             //修改数据
-            oldData.setPdfUrl("");
+//            oldData.setPdfUrl("");
             this.baseMapper.updateById(oldData);
 
         } else {
@@ -479,9 +479,7 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
     }
 
     @Override
-    public IPage<InformationQueryVO> selectInformationQueryPage(IPage<InformationQueryVO> page, InformationQueryVO vo) {
-        long current = (page.getCurrent() - 1L) * page.getSize();
-
+    public IPage<InformationQueryVO> selectInformationQueryPage(IPage<InformationQueryVO> page, InformationQueryVO vo, WbsTreeContract node) {
         if (StringUtils.isNotEmpty(vo.getBetweenTime())) {
             String[] betweenTime;
             if (vo.getBetweenTime().contains("~")) {
@@ -503,10 +501,10 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
         }
 
         //获取总量
-        Integer count = this.baseMapper.countInformationQueryTwo(vo);
+        //Integer count = this.baseMapper.countInformationQueryTwo(vo);
 
-        //获取数据
-        List<InformationQuery> result = this.baseMapper.selectInformationQueryPageTwo(current, page.getSize(), vo);
+        //获取全部数据(后面单独分页)
+        List<InformationQuery> result = this.baseMapper.selectInformationQueryPageTwo(vo);
 
         //转换VO
         if (result != null && result.size() != 0) {
@@ -566,15 +564,144 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
                 }
 
             });
-            page.setRecords(voResult);
-            page.setTotal(count);
 
-            return page;
-        }
+            if (ObjectUtil.isEmpty(voResult)) {
+                return page.setRecords(null);
+
+            } else if (voResult.size() == 1) {
+                //最底层节点,直接返回
+                page.setRecords(voResult);
+                page.setTotal(voResult.size());
+                return page;
+
+            } else if (voResult.size() > 1) {
+                if (StringUtils.isNotEmpty(vo.getIsFirst())) {
+                    long current = (page.getCurrent() - 1) * page.getSize();
+                    if (current < 0) {
+                        throw new IllegalArgumentException("当前页码不能小于0");
+                    }
+                    //分页
+                    int currentNow = (int) (current / page.getSize() + 1); //当前页码
+                    int pageSize = (int) page.getSize(); //每页大小
+                    //计算起始位置和结束位置
+                    int fromIndex = (currentNow - 1) * pageSize;
+                    int toIndex = Math.min(currentNow * pageSize, voResult.size());
+                    List<InformationQueryVO> subList = voResult.subList(fromIndex, toIndex);
+                    page.setRecords(subList);
+                    page.setTotal(voResult.size());
+                    return page;
+                } else {
 
+                    /**
+                     * @Author liuYC
+                     * @Date 2023年5月5日11:53:57
+                     * @Description
+                     *   处理资料查询,page资料填报数据与节点顺序同步展示问题,查询出当前选择节点下所有资料填报信息,
+                     *   然后匹配节点位置信息,不分页查询page数据,分页查询会导致数据匹配异常,处理完匹配后,再分页返回。
+                     */
+                    //获取选择的节点下的所有子节点信息
+                    WbsTreeContract oldSelectedNode = BeanUtil.copyProperties(node, WbsTreeContract.class);
+                    List<WbsTreeContract> treeAll = this.getChildNodesZL(oldSelectedNode);
+                    if (treeAll == null) {
+                        treeAll = new ArrayList<>();
+                    }
+                    treeAll.add(0, oldSelectedNode); //添加当前选择的节点为根节点
+
+                    if (treeAll.size() > 1) {
+                        LinkedList<InformationQueryVO> resultData = new LinkedList<>();
+                        //将当前页数据中符合条件的记录都添加到结果列表中
+                        LinkedHashMap<Long, InformationQueryVO> dataMaps = voResult.stream()
+                                .collect(Collectors.toMap(InformationQueryVO::getWbsId, Function.identity(),
+                                        (oldValue, newValue) -> oldValue, LinkedHashMap::new));
+                        for (WbsTreeContract resultNode : treeAll) {
+                            InformationQueryVO queryVO = dataMaps.get(resultNode.getPKeyId());
+                            if (queryVO != null) {
+                                //按节点顺序插入
+                                resultData.add(queryVO);
+                            }
+                        }
+                        if (resultData.size() > 0) {
+                            long current = (page.getCurrent() - 1) * page.getSize();
+                            if (current < 0) {
+                                throw new IllegalArgumentException("当前页码不能小于0");
+                            }
+                            //分页
+                            int currentNow = (int) (current / page.getSize() + 1); //当前页码
+                            int pageSize = (int) page.getSize(); //每页大小
+                            //计算起始位置和结束位置
+                            int fromIndex = (currentNow - 1) * pageSize;
+                            int toIndex = Math.min(currentNow * pageSize, resultData.size());
+                            List<InformationQueryVO> subList = resultData.subList(fromIndex, toIndex);
+                            page.setRecords(subList);
+                            page.setTotal(resultData.size());
+                            return page;
+
+                        } else {
+                            return page.setRecords(null);
+                        }
+                    }
+                }
+            }
+        }
         return page.setRecords(null);
     }
 
+    /**
+     * 获取所有子级节点-资料查询
+     */
+    private List<WbsTreeContract> getChildNodesZL(WbsTreeContract obj) {
+        if (obj != null) {
+            List<WbsTreeContract> wbsTreeContracts = Collections.singletonList(obj);
+            List<WbsTreeContract> result = new ArrayList<>();
+            this.recursionGetChildNodesZL(wbsTreeContracts, result, obj.getContractId());
+            if (result.size() > 0) {
+                return result;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 递归获取所有子级节点-资料查询
+     */
+    private void recursionGetChildNodesZL(List<WbsTreeContract> list, List<WbsTreeContract> result, String contractId) {
+        List<Long> ids = list.stream().map(WbsTreeContract::getId).collect(Collectors.toList());
+        if (ids.size() > 0) {
+            //构建以parent_id为key的Map
+            Map<Long, List<WbsTreeContract>> queryMap = jdbcTemplate.query("select id,p_key_id,parent_id,sort," +
+                            "IFNULL(if(length(trim(full_name)) > 0, full_name, node_name), node_name) AS fullName," +
+                            "create_time from m_wbs_tree_contract where type = 1 and parent_id " +
+                            "in(" + StringUtils.join(ids, ",") + ") and status = 1 and is_deleted = 0 " +
+                            "and contract_id = " + contractId + " order by sort,fullName,create_time",
+                    rs -> {
+                        Map<Long, List<WbsTreeContract>> map = new LinkedHashMap<>();
+                        while (rs.next()) {
+                            WbsTreeContract item = new WbsTreeContract();
+                            item.setId(rs.getLong("id"));
+                            item.setPKeyId(rs.getLong("p_key_id"));
+                            item.setParentId(rs.getLong("parent_id"));
+                            item.setSort(rs.getInt("sort"));
+                            item.setFullName(rs.getString("fullName"));
+                            item.setCreateTime(rs.getTime("create_time"));
+                            Long parentId = item.getParentId();
+                            if (!map.containsKey(parentId)) {
+                                map.put(parentId, new ArrayList<>());
+                            }
+                            map.get(parentId).add(item);
+                        }
+                        return map;
+                    });
+            //遍历ids,将查询结果按照ids的顺序加入result
+            for (Long id : ids) {
+                if (queryMap != null && queryMap.containsKey(id)) {
+                    List<WbsTreeContract> nodes = queryMap.get(id);
+                    result.addAll(nodes);
+                    recursionGetChildNodesZL(nodes, result, contractId);
+                }
+            }
+        }
+    }
+
     private void getMergePdf(InformationQueryVO vor) throws FileNotFoundException {
         String pdfUrl = vor.getPdfUrl();
         if (StringUtils.isNotEmpty(vor.getEVisaPdfUrl())) {

+ 48 - 11
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java

@@ -424,7 +424,8 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
 
         List<TrialSelfInspectionRecord> bg = recordList.stream().filter(f -> ObjectUtils.isNotEmpty(f.getReportNo()) && f.getReportNo().contains("BG-")).collect(Collectors.toList());
         List<TrialSelfInspectionRecord> jl = recordList.stream().filter(f -> ObjectUtils.isNotEmpty(f.getRecordNo()) && f.getRecordNo().contains("JL-")).collect(Collectors.toList());
-
+        String maxRecordNo = "";
+        String maxReportNo = "";
         if (jl.size() > 0) {
             List<String> numberRecordNos = new ArrayList<>();
             for (String recordNo : jl.stream().map(TrialSelfInspectionRecord::getRecordNo).collect(Collectors.toList())) {
@@ -433,11 +434,15 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
             }
             int maxRecordNo1 = Integer.parseInt(Collections.max(numberRecordNos)) + 1;
             if (maxRecordNo1 < 9999 && maxRecordNo1 > 0) {
-                String recordNo = dto.getRecordNo();
-                String substring = recordNo.substring(recordNo.length() - 4);
-                String s = spUtils.buildSerial(maxRecordNo1, 4);
-                String replace = recordNo.replace(substring, s);
-                dto.setRecordNo(replace);
+                if (ObjectUtil.isEmpty(dto.getRecordNo())) {
+                    maxRecordNo = "0001";
+                } else {
+                    String recordNo = dto.getRecordNo();
+                    String substring = recordNo.substring(recordNo.length() - 4);
+                    String s = spUtils.buildSerial(maxRecordNo1, 4);
+                    String replace = recordNo.replace(substring, s);
+                    dto.setRecordNo(replace);
+                }
             } else {
                 throw new ServiceException("当前编号已达到最大值9999,操作失败");
             }
@@ -450,15 +455,47 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
             }
             int maxReportNo1 = Integer.parseInt(Collections.max(numberReportNos)) + 1;
             if (maxReportNo1 < 9999 && maxReportNo1 > 0) {
-                String reportNo = dto.getReportNo();
-                String substring = reportNo.substring(reportNo.length() - 4);
-                String s = spUtils.buildSerial(maxReportNo1, 4);
-                String replace = reportNo.replace(substring, s);
-                dto.setReportNo(replace);
+                if (ObjectUtil.isEmpty(dto.getReportNo())) {
+                    maxReportNo = "0001";
+                } else {
+                    String reportNo = dto.getReportNo();
+                    String substring = reportNo.substring(reportNo.length() - 4);
+                    String s = spUtils.buildSerial(maxReportNo1, 4);
+                    String replace = reportNo.replace(substring, s);
+                    dto.setReportNo(replace);
+                }
             } else {
                 throw new ServiceException("当前编号已达到最大值9999,操作失败");
             }
         }
+
+        List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateClient.queryByPKeyIds(Func.toStrList(String.valueOf(dto.getNodeId())));
+        WbsTreePrivate wbsTreePrivate = wbsTreePrivates.stream().findAny().orElse(null);
+        ContractInfo contract = contractClient.getContractById(dto.getContractId());
+        int year = LocalDateTimeUtil.now().getYear();
+        if (wbsTreePrivate == null) {
+            throw new ServiceException("未找到当前节点信息,操作失败!");
+        } else {
+            //记录表
+            if (StringUtils.isNotEmpty(maxRecordNo)) {
+                String str1 = "JL" +
+                        "-" + contract.getContractNumber() +
+                        "-" + year +
+                        "-" + spUtils.getStringSP(wbsTreePrivate.getNodeName().trim()) +
+                        "-" + maxRecordNo;
+                dto.setRecordNo(str1);
+            }
+
+            //报告单
+            if (StringUtils.isNotEmpty(maxReportNo)) {
+                String str2 = "BG" +
+                        "-" + contract.getContractNumber() +
+                        "-" + year +
+                        "-" + spUtils.getStringSP(wbsTreePrivate.getNodeName().trim()) +
+                        "-" + maxReportNo;
+                dto.setReportNo(str2);
+            }
+        }
     }
 
     @Override

+ 11 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -21,6 +21,7 @@ import org.apache.commons.codec.Charsets;
 import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.poi.ss.usermodel.CellStyle;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
@@ -302,7 +303,8 @@ public class ExcelTabController extends BladeController {
         Worksheet sheet = wb.getWorksheets().get(0);
         sheet.saveToHtml(thmlUrl, options);
 
-        detail.setExtension(bladeFile1.getOriginalName());
+//        detail.setExtension(bladeFile1.getOriginalName());
+        detail.setExtension(file.getOriginalFilename());
         detail.setFileUrl(bladeFile1.getLink());
         detail.setFileType(3); // 表示为清表信息  1 表示祖节点  2 表示为节点信息 3 表示清表
         detail.setHtmlUrl(thmlUrl);
@@ -1734,7 +1736,8 @@ public class ExcelTabController extends BladeController {
         // 上传excel文件
         R<BladeFile> bladeFile = iossClient.addFileInfo(file);
         BladeFile bladeFile1 = bladeFile.getData();
-        detail.setTemplateExtension(bladeFile1.getOriginalName());
+//        detail.setTemplateExtension(bladeFile1.getOriginalName());
+        detail.setTemplateExtension(file.getOriginalFilename());
         detail.setTemplateFileUrl(bladeFile1.getLink());
         excelTabService.saveOrUpdate(detail);
         return R.success("上传成功");
@@ -1855,8 +1858,13 @@ public class ExcelTabController extends BladeController {
                             CellRange cellRange = columns[i];
                             System.out.println(cellRange.getStyle().getFont().getSize());
                             if (cellRange.getStyle().getFont().getSize() >= 12) {
+                                String title = projectInfo.getProjectName();
+                                if (title.length() >= 30) {
+                                    cellRange.setRowHeight(40);
+                                    cellRange.getStyle().setWrapText(true);
+                                }
+                                cellRange.getStyle().getFont().setSize(18);
                                 cellRange.setText(projectInfo.getProjectName());
-                                cellRange.getStyle().getFont().setSize(20);
                                 break;
                             }
                         }

+ 26 - 21
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FirstController.java

@@ -251,8 +251,13 @@ public class FirstController extends BladeController {
                                         CellRange cellRange = columns[i];
                                         System.out.println(cellRange.getStyle().getFont().getSize());
                                         if (cellRange.getStyle().getFont().getSize() > 12 && StringUtils.isBlank(cellRange.getText())) {
+                                            String title = projectInfo.getProjectName();
+                                            if (title.length() >= 30) {
+                                                cellRange.setRowHeight(40);
+                                                cellRange.getStyle().setWrapText(true);
+                                            }
+                                            cellRange.getStyle().getFont().setSize(18);
                                             cellRange.setText(projectInfo.getProjectName());
-                                            cellRange.getStyle().getFont().setSize(14);
                                             break;
                                         }
                                     }
@@ -278,26 +283,26 @@ public class FirstController extends BladeController {
                                                         x1 = 1;
                                                     }
                                                     String myData = dataMap.get(val) + "";
-                                                    if (myData.indexOf("T") >= 0 && myData.indexOf("-") >= 0) {
-                                                        if (myData.indexOf(",") >= 0 && myData.indexOf("]") >= 0) {
-                                                            myData = myData.replace("[", "").replace("]", "");
-                                                            String[] dataVal = myData.split(",");
-                                                            String[] Start_dataStr = dataVal[0].split("T")[0].split("-");
-                                                            String StartDate = StringUtil.format("{}年{}月{}日", Start_dataStr[0], Start_dataStr[1], Integer.parseInt(Start_dataStr[2]) + 1);
-
-                                                            String[] end_dataStr = dataVal[1].split("T")[0].split("-");
-                                                            String endDate = StringUtil.format("{}年{}月{}日", end_dataStr[0], end_dataStr[1], Integer.parseInt(end_dataStr[2]) + 1);
-
-                                                            if (StartDate.equals(endDate)) {
-                                                                myData = StartDate;
-                                                            } else {
-                                                                myData = StartDate + "-" + endDate;
-                                                            }
-                                                        } else {
-                                                            String[] dataStr = myData.split("T")[0].split("-");
-                                                            myData = StringUtil.format("{}年{}月{}日", dataStr[0], dataStr[1], Integer.parseInt(dataStr[2]) + 1);
-                                                        }
-                                                    }
+//                                                    if (myData.indexOf("T") >= 0 && myData.indexOf("-") >= 0) {
+//                                                        if (myData.indexOf(",") >= 0 && myData.indexOf("]") >= 0) {
+//                                                            myData = myData.replace("[", "").replace("]", "");
+//                                                            String[] dataVal = myData.split(",");
+//                                                            String[] Start_dataStr = dataVal[0].split("T")[0].split("-");
+//                                                            String StartDate = StringUtil.format("{}年{}月{}日", Start_dataStr[0], Start_dataStr[1], Integer.parseInt(Start_dataStr[2]) + 1);
+//
+//                                                            String[] end_dataStr = dataVal[1].split("T")[0].split("-");
+//                                                            String endDate = StringUtil.format("{}年{}月{}日", end_dataStr[0], end_dataStr[1], Integer.parseInt(end_dataStr[2]) + 1);
+//
+//                                                            if (StartDate.equals(endDate)) {
+//                                                                myData = StartDate;
+//                                                            } else {
+//                                                                myData = StartDate + "-" + endDate;
+//                                                            }
+//                                                        } else {
+//                                                            String[] dataStr = myData.split("T")[0].split("-");
+//                                                            myData = StringUtil.format("{}年{}月{}日", dataStr[0], dataStr[1], Integer.parseInt(dataStr[2]) + 1);
+//                                                        }
+//                                                    }
 
                                                     if (myData.indexOf("https") >= 0 && myData.indexOf("aliyuncs") >= 0) {
                                                         Element element = trs.get(y1).select("td").get(x1);

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java

@@ -575,6 +575,7 @@ public class TextdictInfoController extends BladeController {
         List<Long> cIdsList = wbsTreePrivatesEqual.stream().map(WbsTreePrivate::getId).distinct().collect(Collectors.toList());
         if(cIdsList!=null && cIdsList.size()>=1){
             List<Long> cPkeyIds = wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                    .select(WbsTreeContract::getPKeyId)
                     .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
                     .eq(WbsTreeContract::getExcelId, wbsTreePrivate.getExcelId())
                     .eq(WbsTreeContract::getStatus, 1)

+ 2 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -35,6 +35,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
 
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.*;
 import java.util.function.Function;
@@ -507,7 +508,7 @@ public class WbsTreePrivateController extends BladeController {
     @ApiOperationSupport(order = 14)
     @ApiOperation(value = "同步项目下所有节点的电签默认信息", notes = "传入项目projectId、节点pKeyId")
     @RequestMapping(value = "/sync-project-eVisa", method = RequestMethod.POST)
-    public R syncProjectEVisa(@RequestParam String projectId, @RequestParam String pKeyId) {
+    public R syncProjectEVisa(@RequestParam String projectId, @RequestParam String pKeyId) throws FileNotFoundException {
         return R.status(wbsTreePrivateService.syncProjectEVisa(projectId, pKeyId));
     }
 

+ 0 - 10
blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsExcelBatchUtil.java

@@ -10,20 +10,10 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springblade.core.log.exception.ServiceException;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.sql.rowset.serial.SerialException;
 import java.io.*;
 import java.util.*;
 
 public class WbsExcelBatchUtil {
-    /*public static void main(String[] args) throws IOException, ClassNotFoundException {
-        WbsExcelBatchUtil excelUtil = new WbsExcelBatchUtil();
-        //读取excel数据
-        ArrayList<Map<String, String>> result = excelUtil.readExcelToObj("C:\\Users\\泓创开发\\Desktop\\隧道总体.xls");
-        List<Map<String, String>> list1 = deepCopy(result);
-        System.out.println(list1);
-        List<Map<String, String>> list = removeRepeatMapByKey(result, "表名");
-    }*/
-
 
     /**
      * 深拷贝

+ 9 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsExcelUtil.java

@@ -13,6 +13,15 @@ import java.util.*;
 
 public class WbsExcelUtil {
 
+    /*public static void main(String[] args) throws IOException {
+        WbsExcelUtil excelUtil = new WbsExcelUtil();
+        //读取excel数据
+        ArrayList<Map<String, String>> dataList = excelUtil.readExcelToObj("C:\\Users\\泓创开发\\Desktop\\excel节点模板\\隧道工程2.xlsx");
+        for (Map<String, String> stringStringMap : dataList) {
+            System.out.println(stringStringMap);
+        }
+    }*/
+
     /**
      * 读取excel数据
      *

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeMapper.java

@@ -47,6 +47,8 @@ public interface ArchiveTreeMapper extends BaseMapper<ArchiveTree> {
     int removeAllSonNodeIdsForArchiveAutoRule_3(@Param("archiveAutoType") Integer archiveAutoType,
                                                 @Param("ancestors") String ancestors,
                                                 @Param("nodeId") Long nodeId);
+
+    int removeAllSonNodeforTypeIsNUll(@Param("ancestors") String ancestors,@Param("nodeId") Long nodeId);
     int removeNodeForArchiveAutoRule_Group(@Param("archiveAutoGroupId") Long archiveAutoGroupId);
     /**
      * 查看分类并卷规则-获取大类所有节点

+ 18 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeMapper.xml

@@ -310,6 +310,20 @@
         </if>
     </update>
 
+
+    <update id="removeAllSonNodeforTypeIsNUll">
+        update m_archive_tree
+        set
+            archive_auto_type = null,
+            archive_auto_group_select =NULL
+        where
+           is_deleted = 0
+           and ancestors like concat('', #{ancestors}, '%')
+           and archive_auto_type = 1
+           and archive_auto_node_id is NULL
+           or id=#{nodeId} ;
+    </update>
+
     <update id="removeAllSonNodeIdsForArchiveAutoRule_1">
         update m_archive_tree
         set
@@ -322,7 +336,8 @@
 
         update m_archive_tree
         set
-            archive_auto_type = NULL
+            archive_auto_type = NULL,
+            archive_auto_group_select =NULL
         where
             is_deleted = 0
           and ancestors like concat('', #{ancestors}, '%')
@@ -335,7 +350,8 @@
         update m_archive_tree
         set
             /*取消规则 恢复默认规则 不需要设置为null,如果最高并卷节点取消规则,archive_auto_node_id会为空,相当于无规则不会进到自动组卷流程*/
-            archive_auto_type = 1
+            archive_auto_type = 1,
+            archive_auto_group_select =NULL
         where
             is_deleted = 0
           and ancestors like concat('', #{ancestors}, '%')

+ 37 - 36
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -702,51 +702,52 @@
 
     <select id="selectWbsTreeTrialTabList" resultType="org.springblade.manager.vo.WbsTreePrivateVO4">
         SELECT
-        p_key_id,
-        node_name,
-        node_type,
-        is_link_table,
-        is_tab_pdf,
-        is_buss_show,
-        tab_file_type,
-        wbs_id,
-        wbs_type,
-        html_url,
-        excel_id,
-        project_id,
-        type,
-        case when table_type = 9 then 1
-        when table_type = 10 then 2
-        end as tableType,
-        table_owner,
-        init_table_name,
-        init_table_id,
-        fill_rate,
-        pdf_url,
-        sort,
-        create_time,
-        (CASE WHEN locate('__',node_name) > 0 THEN 1 ELSE 0 END) AS isCopyTab
+            p_key_id,
+            node_name,
+            node_type,
+            case when table_type in(1,9) then 1
+                 when table_type in(2,10) then 2
+                 else table_type
+                 end as tableType,
+            table_owner,
+            is_link_table,
+            is_tab_pdf,
+            is_buss_show,
+            tab_file_type,
+            wbs_id,
+            wbs_type,
+            html_url,
+            excel_id,
+            project_id,
+            type,
+            init_table_name,
+            init_table_id,
+            fill_rate,
+            pdf_url,
+            sort,
+            create_time,
+            (CASE WHEN locate('__',node_name) > 0 THEN 1 ELSE 0 END) AS isCopyTab
         FROM
-        m_wbs_tree_private
+            m_wbs_tree_private
         WHERE project_id = #{projectId}
-        AND wbs_id = #{wbsId}
-        AND parent_id = #{parentId}
-        AND table_type = #{tableType}
-        AND type = 2
-        AND status = 1
-        AND is_deleted = 0
-        /*试验所属方=7*/
-        AND table_owner = 7
+            AND wbs_id = #{wbsId}
+            AND parent_id = #{parentId}
+            AND table_type in (${tableType})
+            AND type = 2
+            AND status = 1
+            AND is_deleted = 0
+            /*试验所属方=7*/
+            AND table_owner = 7
         /*解决不同合同段中复制表问题*/
         <if test="contractId == null">
             -- 后管加载原始表
-            and trial_tab_contract_id is null
+            AND trial_tab_contract_id is null
         </if>
         <if test="contractId != null and contractId != ''">
             -- 客户端加载当前合同段表+原始表
-            and (trial_tab_contract_id is null OR (trial_tab_contract_id = #{contractId}))
+            AND (trial_tab_contract_id is null OR (trial_tab_contract_id = #{contractId}))
         </if>
-        ORDER BY sort,node_name,create_time
+            ORDER BY sort,node_name,create_time
     </select>
 
     <select id="selectTabInfoAll" resultType="org.springblade.manager.entity.TableInfo">

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java

@@ -58,7 +58,7 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
 
     boolean syncNodeParam(String projectId, String pKeyId);
 
-    boolean syncProjectEVisa(String projectId, String pKeyId);
+    boolean syncProjectEVisa(String projectId, String pKeyId) throws FileNotFoundException;
 
     void eVisInfoRepeatDel(String pid);
 

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveAutoRuleSyncImpl.java

@@ -353,6 +353,9 @@ public class ArchiveAutoRuleSyncImpl {
                             //已经是客户级了不用理
                         }
                     }
+                }else{
+                    //type为null的,也要更新 防止在项目级取消规则了
+                    contractVO2.setFlag(1);
                 }
             }
             //archiveAutoType  与项目级一致  不用处理

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

@@ -214,6 +214,11 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 			archiveTreeContractDTO.setTreeSort(parent.getTreeSort());
 			archiveTreeContractDTO.setContractId(parent.getContractId());
 			archiveTreeContractDTO.setTreeCode(parent.getTreeCode());
+
+			archiveTreeContractDTO.setArchiveAutoNodeId(parent.getArchiveAutoNodeId());
+			archiveTreeContractDTO.setArchiveAutoType(parent.getArchiveAutoType());
+			archiveTreeContractDTO.setArchiveAutoGroupId(parent.getArchiveAutoGroupId());
+			archiveTreeContractDTO.setArchiveAutoGroupSelect(0);
 		}
 
 		archiveTreeContractDTO.setIsDeleted(BladeConstant.DB_NOT_DELETED);
@@ -456,6 +461,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 
 		this.saveBatch(saveList);
 		this.updateBatchById(upList);
+
 		return true;
 	}
 

+ 10 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java

@@ -317,6 +317,11 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
             archiveTreeDTO.setTenantId(parent.getTenantId());
             String ancestors = parent.getAncestors() + StringPool.COMMA + archiveTreeDTO.getParentId();
             archiveTreeDTO.setAncestors(ancestors);
+
+            archiveTreeDTO.setArchiveAutoType(parent.getArchiveAutoType());
+            archiveTreeDTO.setArchiveAutoNodeId(parent.getArchiveAutoNodeId());
+            archiveTreeDTO.setArchiveAutoGroupId(parent.getArchiveAutoGroupId());
+            archiveTreeDTO.setArchiveAutoGroupSelect(0);
         }
 
         archiveTreeDTO.setIsDeleted(BladeConstant.DB_NOT_DELETED);
@@ -670,6 +675,11 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
                         String ancestors = node.getAncestors()+","+nodeId;
                         baseMapper.removeAllSonNodeIdsForArchiveAutoRule_3(node.getArchiveAutoType(),ancestors,nodeId);
                     }
+                }else{
+                    //为null的话 主要是出现脏数据。当做维护处理
+                    //可以把当前节点下的archive_auto_type=1,archive_auto_node_id为null的 数据archive_auto_type改为null
+                    String ancestors = node.getAncestors()+","+nodeId;
+                    baseMapper.removeAllSonNodeforTypeIsNUll(ancestors,nodeId);
                 }
             }
         }catch (Exception e){

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

@@ -702,12 +702,12 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     org.springblade.manager.entity.TableInfo table = tableInfoService.getBaseMapper().selectById(wbsTreePrivate.getInitTableId());
                     if (ObjectUtil.isNotEmpty(table)) {
                         //获取首件记录ID
-//                        String firstId = tableInfoList.get(0).getFirstId();
-                        String firstId = "";
-                        InformationQuery firstInfoByWbsId = informationQueryClient.getFirstInfoByWbsId(firstNodeId);
-                        if (firstInfoByWbsId != null){
-                            firstId = firstInfoByWbsId.getId() + "";
-                        }
+                        String firstId = tableInfoList.get(0).getFirstId();
+//                        String firstId = "";
+//                        InformationQuery firstInfoByWbsId = informationQueryClient.getFirstInfoByWbsId(firstNodeId);
+//                        if (firstInfoByWbsId != null){
+//                            firstId = firstInfoByWbsId.getId() + "";
+//                        }
                         if (StringUtils.isNotEmpty(firstId)) {
                             //删除掉旧数据
                             this.jdbcTemplate.execute("DELETE FROM " + table.getTabEnName() + " WHERE group_id = " + firstId);

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -147,6 +147,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         wbsTreeContract.setWbsId(pawDTO.getWbsId());
                         wbsTreeContract.setProjectId(pawDTO.getProjectId());
                         wbsTreeContract.setContractId(pawDTO.getContractId());
+                        wbsTreeContract.setIsTypePrivatePid(wbsTreePrivate.getPKeyId());
                         if (wbsTreePrivate.getType() == 2) {
                             wbsTreeContract.setIsTypePrivatePid(wbsTreePrivate.getPKeyId());
                         }
@@ -247,6 +248,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         wbsTreeContract.setProjectId(pawDTO.getProjectId());
                         wbsTreeContract.setContractId(pawDTO.getContractId());
                         wbsTreeContract.setIsConcealedWorksNode(0);
+                        wbsTreeContract.setIsTypePrivatePid(wbsTreePrivate.getPKeyId());
                         if (wbsTreePrivate.getType() == 2) {
                             wbsTreeContract.setIsTypePrivatePid(wbsTreePrivate.getPKeyId());
                         }

+ 59 - 22
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -40,14 +40,14 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.annotation.Resource;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.*;
-import java.util.concurrent.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 @Service
 @AllArgsConstructor
@@ -802,7 +802,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                 List<Long> wbsTreeIds = new ArrayList<>(map.values());
                 List<List<Long>> partition = Lists.partition(wbsTreeIds, 1000);
                 for (List<Long> ids : partition) {
-                    String sql = "select id,name,k,v,node_id,remark from m_wbs_param where node_id in (" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
+                    String sql = "select id,name,k,v,node_id,remark from m_wbs_param where is_deleted = 0 and status = 1 and node_id in (" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
                     List<WbsParam> wbsParams = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsParam.class));
                     wbsParamOldList.addAll(wbsParams);
                 }
@@ -835,7 +835,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             //当前引用模板的节点参数,数据源Map
             Map<Long, WbsParam> paramOldDataMap = wbsParamOldList.stream().collect(Collectors.toMap(WbsParam::getId, Function.identity()));
             //获取当前项目的选择的该节点的节点、以及子节点下的参数信息
-            List<WbsParam> paramListNow = wbsParamMapper.selectList(Wrappers.<WbsParam>lambdaQuery().select(WbsParam::getK, WbsParam::getV, WbsParam::getName, WbsParam::getId, WbsParam::getRemark, WbsParam::getNodeId).eq(WbsParam::getProjectId, Long.parseLong(projectId)).in(WbsParam::getNodeId, privateNodePKeyIds));
+            List<WbsParam> paramListNow = wbsParamMapper.selectList(Wrappers.<WbsParam>lambdaQuery().select(WbsParam::getK, WbsParam::getV, WbsParam::getName, WbsParam::getId, WbsParam::getRemark, WbsParam::getNodeId).eq(WbsParam::getStatus, 1).eq(WbsParam::getProjectId, Long.parseLong(projectId)).in(WbsParam::getNodeId, privateNodePKeyIds));
             //将参数名称、K和nodeId作为唯一标识存储到一个Map中
             Map<String, WbsParam> paramMap = new HashMap<>();
             for (WbsParam nowObj : paramListNow) {
@@ -911,7 +911,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     private void recursionGetChildNodesAndTabs(List<WbsTreePrivate> list, List<WbsTreePrivate> result, WbsTreePrivate obj) {
         List<Long> ids = list.stream().map(WbsTreePrivate::getId).collect(Collectors.toList());
         if (ids.size() > 0) {
-            List<WbsTreePrivate> query = jdbcTemplate.query("select p_key_id,id,type,parent_id,html_url from m_wbs_tree_private where parent_id in(" + org.apache.commons.lang.StringUtils.join(ids, ",") + ") and status = 1 and is_deleted = 0 and project_id = " + obj.getProjectId(), new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+            List<WbsTreePrivate> query = jdbcTemplate.query("select p_key_id,id,type,parent_id,html_url,project_id,excel_id from m_wbs_tree_private where parent_id in(" + org.apache.commons.lang.StringUtils.join(ids, ",") + ") and status = 1 and is_deleted = 0 and project_id = " + obj.getProjectId(), new BeanPropertyRowMapper<>(WbsTreePrivate.class));
             if (query.size() > 0) {
                 result.addAll(query);
                 recursionGetChildNodesAndTabs(query, result, obj);
@@ -920,12 +920,13 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     }
 
     @Override
-    public boolean syncProjectEVisa(String projectId, String pKeyId) {
+    public boolean syncProjectEVisa(String projectId, String pKeyId) throws FileNotFoundException {
         if (StringUtils.isNotEmpty(projectId) && StringUtils.isNotEmpty(pKeyId)) {
             ProjectInfo projectInfo = projectInfoMapper.selectById(projectId);
             if (projectInfo != null && ("private").equals(projectInfo.getReferenceWbsTemplateType()) && ObjectUtils.isNotEmpty(projectInfo.getReferenceWbsTemplateId())) {
                 //构造参数集合
                 List<TextdictInfo> insertData = new ArrayList<>();
+                List<WbsTreePrivate> privateList = new ArrayList<>();
                 Map<Long, List<TextdictInfo>> textDictInfoData = new HashMap<>();
 
                 //获取当前选择的节点下的所有节点、表、独立表
@@ -1006,6 +1007,8 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                 insertData.add(obj);
                             }
                         }
+                        //表信息
+                        privateList.add(tree);
                     }
                 });
 
@@ -1026,6 +1029,12 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                         textDictInfoService.insertBatch(addList, 1000);
                     }
                 }
+
+                //修改合同段html样式
+                if (privateList.size() > 0) {
+                    this.syncEVisaDefaultInfo(privateList, projectId);
+                }
+
             }
             return true;
         } else {
@@ -1033,6 +1042,35 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         }
     }
 
+    @Async
+    public void syncEVisaDefaultInfo(List<WbsTreePrivate> list, String projectId) {
+        List<Long> ids = list.stream().map(WbsTreePrivate::getId).collect(Collectors.toList());
+        List<WbsTreeContract> contractList = wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                .select(WbsTreeContract::getPKeyId, WbsTreeContract::getExcelId)
+                .eq(WbsTreeContract::getProjectId, projectId)
+                .eq(WbsTreeContract::getStatus, 1)
+                .isNotNull(WbsTreeContract::getExcelId)
+                .in(WbsTreeContract::getId, ids));
+
+        Map<Long, List<WbsTreeContract>> contractMap = contractList.stream().collect(Collectors.groupingBy(WbsTreeContract::getExcelId));
+
+        List<String> updateSQLList = new ArrayList<>();
+        for (WbsTreePrivate wbsTreePrivate : list) {
+            List<WbsTreeContract> wbsTreeContractList = contractMap.get(wbsTreePrivate.getExcelId());
+            if (wbsTreeContractList != null) {
+                String cPkeyIdsStr = org.apache.commons.lang.StringUtils.join(wbsTreeContractList.stream().map(WbsTreeContract::getPKeyId).collect(Collectors.toList()), ",");
+                String updateSql = "update m_wbs_tree_contract set html_url = '" + wbsTreePrivate.getHtmlUrl() + "' where p_key_id in (" + cPkeyIdsStr + ")";
+                updateSQLList.add(updateSql);
+            }
+        }
+        if (updateSQLList.size() > 0) {
+            List<List<String>> partition = Lists.partition(updateSQLList, 100);
+            for (List<String> sqlList : partition) {
+                jdbcTemplate.execute(org.apache.commons.lang.StringUtils.join(sqlList, "; "));
+            }
+        }
+    }
+
     @Override
     public boolean syncNodeTable(String primaryKeyId) {
         if (StringUtils.isNotEmpty(primaryKeyId)) {
@@ -1584,23 +1622,22 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             textDictInfoService.saveBatch(list);
                         }
                     }
-
-                    wbsPrivate.setTableOwner(tableInfo.getTableOwner());
-                    wbsPrivate.setInitTableId(tableInfo.getId() + "");
-                    wbsPrivate.setTableType(tableInfo.getTabType());
-                    wbsPrivate.setInitTableName(tableInfo.getTabEnName());
-                    wbsPrivate.setNodeName(tableInfo.getTabChName());
-                    wbsPrivate.setFullName(tableInfo.getTabChName());
-                    wbsPrivate.setFillRate(tableInfo.getFillRate());
-                    wbsPrivate.setProjectId(projectId);
-                    wbsPrivate.setType(10);//带过来的元素信息
-                    wbsPrivate.setParentId(-10L);
-                    wbsPrivate.setStatus(1);
-                    wbsTreePrivateMapper.insert(wbsPrivate);
+                }
+                wbsPrivate.setTableOwner(tableInfo.getTableOwner());
+                wbsPrivate.setInitTableId(tableInfo.getId() + "");
+                wbsPrivate.setTableType(tableInfo.getTabType());
+                wbsPrivate.setInitTableName(tableInfo.getTabEnName());
+                wbsPrivate.setNodeName(tableInfo.getTabChName());
+                wbsPrivate.setFullName(tableInfo.getTabChName());
+                wbsPrivate.setFillRate(tableInfo.getFillRate());
+                wbsPrivate.setProjectId(projectId);
+                wbsPrivate.setType(10);//带过来的元素信息
+                wbsPrivate.setParentId(-10L);
+                wbsPrivate.setStatus(1);
+                wbsTreePrivateMapper.insert(wbsPrivate);
            /* }else{
                 return R.success("没有查到主库信息");
             }*/
-                }
             }
             return R.success("添加成功");
         }
@@ -1756,9 +1793,9 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         if (StringUtils.isNotEmpty(roleAndTabOwner)) {
             //试验tabOwner=7,默认加载全部tabOwner=7的表
             if ("1".equals(tableType)) {
-                tableType = "9"; //记录表
+                tableType = "1,9"; //记录表
             } else if ("2".equals(tableType)) {
-                tableType = "10";  //报告单
+                tableType = "2,10";  //报告单
             }
             return baseMapper.selectWbsTreeTrialTabList(tableType, wbsTreePrivate.getProjectId(), wbsTreePrivate.getWbsId(), wbsTreePrivate.getId(), contractId);
         } else {

+ 44 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -1142,7 +1142,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     }
 
                     //构建参数
-                    WbsTree wbsTree = buildTreeNode(wbsTreeZi, allNodeData);
+                    WbsTree wbsTree = this.buildTreeNode(wbsTreeZi, allNodeData);
 
                     if (wbsTree == null) {
                         //构建成功,后置赋值
@@ -1171,22 +1171,30 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                 }
             }
         }
-
-        return this.saveBatch(allNodeData, 1000) && baseMapper.updateById(wbsTree1) > 0;
-
+        return this.insertBatchPublic(allNodeData, 1000) && baseMapper.updateById(wbsTree1) > 0;
     }
 
     private WbsTree buildTreeNode(WbsTree wbsTreeZi, List<WbsTree> allNodeData) {
         List<WbsTree> wbsTrees = new ArrayList<>();
+        Map<String, List<WbsTree>> collect = allNodeData.stream().collect(Collectors.groupingBy(WbsTree::getNodeName));
         //判重
         for (WbsTree tree : allNodeData) {
             if (tree.getNodeName().equals(wbsTreeZi.getNodeName())
                     && tree.getWbsId().equals(wbsTreeZi.getWbsId())
                     && tree.getNodeType().equals(wbsTreeZi.getNodeType())
                     && tree.getProjectNodeId().equals(wbsTreeZi.getProjectNodeId())) {
-                //判断上级节点不同,当前节点名相同的tree选择问题
-                //例如:第X跨的上级有上部构造现场浇筑、上部构造预制和安装,导致下方新增重复节点判断时找到的是前一个 TODO
+                //判断上级节点不同,当前节点名相同的选择问题
                 if (!tree.getAncestors().equals(wbsTreeZi.getAncestors())) {
+                    List<WbsTree> wbsTrees1 = collect.get(wbsTreeZi.getNodeName());
+                    //存在两个相同节点以上时,找到本身同级节点
+                    if (wbsTrees1.size() > 1) {
+                        WbsTree wbsTree = wbsTrees1.stream().filter(f -> f.getParentId().equals(wbsTreeZi.getParentId())).findAny().orElse(null);
+                        if (wbsTree != null) {
+                            wbsTrees.add(wbsTree);
+                            break;
+                        }
+                    }
+                    //存在一个相同节点,正常执行
                     wbsTrees.add(tree);
                     break;
                 }
@@ -1198,6 +1206,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         if (wbsTrees.size() <= 0) {
             wbsTreeZi.setStatus(1);
             wbsTreeZi.setType(1);
+            wbsTreeZi.setIsDeleted(0);
             if (wbsTreeZi.getNodeType() == 6) {
                 wbsTreeZi.setIsConcrete(0);
                 wbsTreeZi.setIsExpernode(0);
@@ -1205,11 +1214,12 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         } else {
             //重复 判断是否为同一父节点,相同父节点跳过,不同新增
             for (WbsTree tree : wbsTrees) {
-                if (wbsTreeZi.getNodeType() == 2 || wbsTreeZi.getNodeType() == 3
-                        || wbsTreeZi.getNodeType() == 4 || wbsTreeZi.getNodeType() == 5 || wbsTreeZi.getNodeType() == 6) {
-                    if (!wbsTreeZi.getParentId().equals(tree.getParentId()) && wbsTreeZi.getNodeName().equals(tree.getNodeName())) {
+                if (wbsTreeZi.getNodeType() == 2 || wbsTreeZi.getNodeType() == 3 || wbsTreeZi.getNodeType() == 4 || wbsTreeZi.getNodeType() == 5 || wbsTreeZi.getNodeType() == 6) {
+                    //不同父级相同节点
+                    if (ObjectUtil.isNotEmpty(wbsTreeZi.getParentId()) && ObjectUtil.isNotEmpty(tree.getParentId()) && !wbsTreeZi.getParentId().equals(tree.getParentId()) && wbsTreeZi.getNodeName().equals(tree.getNodeName())) {
                         wbsTreeZi.setStatus(1);
                         wbsTreeZi.setType(1);
+                        wbsTreeZi.setIsDeleted(0);
                         if (wbsTreeZi.getNodeType() == 6) {
                             wbsTreeZi.setIsConcrete(0);
                             wbsTreeZi.setIsExpernode(0);
@@ -1287,4 +1297,29 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         return true;
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertBatchPublic(Collection<WbsTree> entityList, int batchSize) {
+        try {
+            int size = entityList.size();
+            int idxLimit = Math.min(batchSize, size);
+            int i = 1;
+            //保存单批提交的数据集合
+            List<WbsTree> oneBatchList = new ArrayList<>();
+            for (Iterator<WbsTree> var1 = entityList.iterator(); var1.hasNext(); ++i) {
+                WbsTree element = var1.next();
+                oneBatchList.add(element);
+                if (i == idxLimit) {
+                    baseMapper.insertBatchSomeColumn(oneBatchList);
+                    //每次提交后清空集合数据
+                    oneBatchList.clear();
+                    idxLimit = Math.min(idxLimit + batchSize, size);
+                }
+            }
+        } catch (Exception e) {
+            log.error("保存失败", e);
+            return false;
+        }
+        return true;
+    }
+
 }