Преглед на файлове

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

yangyj преди 2 години
родител
ревизия
1305c06a15
променени са 15 файла, в които са добавени 795 реда и са изтрити 1083 реда
  1. 2 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java
  2. 2 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveOfflineVersionInfoController.java
  3. 147 141
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveOfflineVersionInfoServiceImpl.java
  4. 39 7
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  5. 124 96
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  6. 12 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java
  7. 128 122
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java
  8. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
  9. 17 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  10. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java
  11. 4 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  12. 32 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  13. 234 501
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  14. 47 16
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java
  15. 0 191
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ThreadPoolMonitor.java

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

@@ -289,8 +289,8 @@ public class ArchiveFileController extends BladeController {
         //统计案卷文件大小
         Long fileSize = archiveFileClient.getAllArchiveFileSize(projectId);
         //统计表单数据大小
-        Long tableSize = wbsTreeContractClient.getAllTableFileSize(projectId);
-        String size = org.springblade.common.utils.FileUtils.formatSize(fileSize + tableSize);
+//        Long tableSize = wbsTreeContractClient.getAllTableFileSize(projectId);
+        String size = org.springblade.common.utils.FileUtils.formatSize(fileSize );
         return R.data(size);
     }
 }

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

@@ -38,7 +38,7 @@ public class ArchiveOfflineVersionInfoController {
     @GetMapping("/packData")
     public R<String> packData(Long projectId) throws Exception {
         //异步调用自动打包上传,完成后修改数据库信息
-        offlineVersionInfoService.packData(1578599210897772545L);
+        offlineVersionInfoService.packData(projectId);
         return R.data("最新数据后台自动打包中,打包完成后会更新打包日期");
     }
     /**
@@ -47,7 +47,7 @@ public class ArchiveOfflineVersionInfoController {
     @ApiOperation(value = "脱机载体工具")
     @GetMapping("/getVersionInfo")
     public R<ArchiveOfflineVersionInfo> getVersionInfo(Long projectId){
-        ArchiveOfflineVersionInfo versionInfo = mapper.selectVersionInfo(1578599210897772545L);
+        ArchiveOfflineVersionInfo versionInfo = mapper.selectVersionInfo(projectId);
         String size = this.formatSize(Long.parseLong(versionInfo.getFileSize()));
         versionInfo.setFileSize(size);
         return R.data(versionInfo);

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

@@ -81,168 +81,174 @@ public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<Archiv
     }
     public void fileToSqlite(Long projectId) throws Exception {
         List<ArchiveFile> list = fileClient.getListByProjectId(projectId);
-        String localUrl = "/www/wwwroot/localClient/local_archives/alilib/";
-        for (ArchiveFile file : list) {
-            if (StringUtil.isNotBlank(file.getFileUrl())) {
-                String fileUrl = file.getFileUrl();
-                String fileName = fileUrl.substring(fileUrl.lastIndexOf('/') + 1);
-                InputStream file_out = CommonUtil.getOSSInputStream(fileUrl);
-                CommonUtil.inputStreamToFile(file_out,new File(localUrl+fileName));
-                file.setFileUrl(fileName);
-            }
-            if (StringUtil.isNotBlank(file.getPdfFileUrl())){
-                String pdfFileUrl = file.getPdfFileUrl();
-                String fileName = pdfFileUrl.substring(pdfFileUrl.lastIndexOf('/') + 1);
-                InputStream file_out = CommonUtil.getOSSInputStream(pdfFileUrl);
-                CommonUtil.inputStreamToFile(file_out,new File(localUrl+fileName));
-                file.setPdfFileUrl(fileName);
-            }
-        }
-        try  {
-            Connection conn = data.dataSource().getConnection();
-            //清空原有数据
-            Statement statement = conn.createStatement();
-            statement.execute("DELETE FROM u_archive_file");
-            statement.close();
-            //导入最新数据
-            String sql = "INSERT INTO u_archive_file (id, project_id, node_id, file_number, file_name, file_time, file_url, pdf_file_url, status, is_deleted, archive_id,create_time)" +
-                    " VALUES(?,?,?,?,?,?,?,?,?,?,?,?)";
-            PreparedStatement pstm = conn.prepareStatement(sql);
-            //pstm 绑定数据
-            int i=0;
+        if (list != null && list.size() > 0) {
+            String localUrl = "/www/wwwroot/localClient/local_archives/alilib/";
             for (ArchiveFile file : list) {
-                i++;
-                pstm.setLong(1,file.getId());
-                pstm.setLong(2, Long.parseLong(file.getProjectId()));
-                pstm.setString(3,file.getNodeId()==null?"":file.getNodeId());
-                pstm.setString(4,file.getFileNumber()==null?"":file.getFileNumber());
-                pstm.setString(5,file.getFileName());
-                pstm.setString(6,file.getFileTime());
-                pstm.setString(7,file.getFileUrl()==null?"":file.getFileUrl());
-                pstm.setString(8,file.getPdfFileUrl()==null?"":file.getPdfFileUrl());
-                pstm.setInt(9,file.getStatus());
-                pstm.setInt(10,file.getIsDeleted());
-                pstm.setLong(11,file.getArchiveId()==null?-1:file.getArchiveId());
-                pstm.setString(12,new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(file.getCreateTime()));
-                //添加批处理
-                pstm.addBatch();
-                if (i % 1000 == 0) {
-                    pstm.executeBatch();
-                    pstm.clearBatch();
+                if (StringUtil.isNotBlank(file.getFileUrl())) {
+                    String fileUrl = file.getFileUrl();
+                    String fileName = fileUrl.substring(fileUrl.lastIndexOf('/') + 1);
+                    InputStream file_out = CommonUtil.getOSSInputStream(fileUrl);
+                    CommonUtil.inputStreamToFile(file_out, new File(localUrl + fileName));
+                    file.setFileUrl(fileName);
+                }
+                if (StringUtil.isNotBlank(file.getPdfFileUrl())) {
+                    String pdfFileUrl = file.getPdfFileUrl();
+                    String fileName = pdfFileUrl.substring(pdfFileUrl.lastIndexOf('/') + 1);
+                    InputStream file_out = CommonUtil.getOSSInputStream(pdfFileUrl);
+                    CommonUtil.inputStreamToFile(file_out, new File(localUrl + fileName));
+                    file.setPdfFileUrl(fileName);
+                }
+            }
+            try {
+                Connection conn = data.dataSource().getConnection();
+                //清空原有数据
+                Statement statement = conn.createStatement();
+                statement.execute("DELETE FROM u_archive_file");
+                statement.close();
+                //导入最新数据
+                String sql = "INSERT INTO u_archive_file (id, project_id, node_id, file_number, file_name, file_time, file_url, pdf_file_url, status, is_deleted, archive_id,create_time)" +
+                        " VALUES(?,?,?,?,?,?,?,?,?,?,?,?)";
+                PreparedStatement pstm = conn.prepareStatement(sql);
+                //pstm 绑定数据
+                int i = 0;
+                for (ArchiveFile file : list) {
+                    i++;
+                    pstm.setLong(1, file.getId());
+                    pstm.setLong(2, Long.parseLong(file.getProjectId()));
+                    pstm.setString(3, file.getNodeId() == null ? "" : file.getNodeId());
+                    pstm.setString(4, file.getFileNumber() == null ? "" : file.getFileNumber());
+                    pstm.setString(5, file.getFileName());
+                    pstm.setString(6, file.getFileTime());
+                    pstm.setString(7, file.getFileUrl() == null ? "" : file.getFileUrl());
+                    pstm.setString(8, file.getPdfFileUrl() == null ? "" : file.getPdfFileUrl());
+                    pstm.setInt(9, file.getStatus());
+                    pstm.setInt(10, file.getIsDeleted());
+                    pstm.setLong(11, file.getArchiveId() == null ? -1 : file.getArchiveId());
+                    pstm.setString(12, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(file.getCreateTime()));
+                    //添加批处理
+                    pstm.addBatch();
+                    if (i % 1000 == 0) {
+                        pstm.executeBatch();
+                        pstm.clearBatch();
+                    }
                 }
+                //将批处理余下的语句执行完毕
+                pstm.executeBatch();
+                //释放资源
+                pstm.close();
+                conn.close();
+            } catch (Exception e) {
+                e.printStackTrace();
             }
-            //将批处理余下的语句执行完毕
-            pstm.executeBatch();
-            //释放资源
-            pstm.close();
-            conn.close();
-        }catch (Exception e){
-            e.printStackTrace();
         }
     }
 
     public void contractToSqlite(Long projectId){
         List<ArchiveTreeContract> list = contractClient.getListByProjectId(projectId);
-        try  {
-            Connection conn = data.dataSource().getConnection();
-            Statement statement = conn.createStatement();
-            statement.execute("DELETE FROM m_archive_tree_contract");
-            statement.close();
-            //获取执行对象
-            String sql = "INSERT INTO m_archive_tree_contract(id, project_id, parent_id, ancestors, node_name,status,is_deleted,create_time)" +
-                    "VALUES(?, ?, ?, ?, ?,?,?,?)";
-            PreparedStatement pstm = conn.prepareStatement(sql);
-            //pstm 绑定数据
-            int i=0;
-            for (ArchiveTreeContract contract : list) {
-                i++;
-                pstm.setLong(1,contract.getId());
-                pstm.setLong(2,contract.getProjectId());
-                pstm.setLong(3,contract.getParentId());
-                pstm.setString(4,contract.getAncestors());
-                pstm.setString(5,contract.getNodeName());
-                pstm.setInt(6,contract.getStatus());
-                pstm.setInt(7,contract.getIsDeleted());
-                pstm.setString(8,  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(contract.getCreateTime()));
-                //添加批处理
-                pstm.addBatch();
-                if (i % 1000 == 0) {
-                    pstm.executeBatch();
-                    pstm.clearBatch();
+        if (list != null && list.size() > 0) {
+            try {
+                Connection conn = data.dataSource().getConnection();
+                Statement statement = conn.createStatement();
+                statement.execute("DELETE FROM m_archive_tree_contract");
+                statement.close();
+                //获取执行对象
+                String sql = "INSERT INTO m_archive_tree_contract(id, project_id, parent_id, ancestors, node_name,status,is_deleted,create_time)" +
+                        "VALUES(?, ?, ?, ?, ?,?,?,?)";
+                PreparedStatement pstm = conn.prepareStatement(sql);
+                //pstm 绑定数据
+                int i = 0;
+                for (ArchiveTreeContract contract : list) {
+                    i++;
+                    pstm.setLong(1, contract.getId());
+                    pstm.setLong(2, contract.getProjectId());
+                    pstm.setLong(3, contract.getParentId());
+                    pstm.setString(4, contract.getAncestors());
+                    pstm.setString(5, contract.getNodeName());
+                    pstm.setInt(6, contract.getStatus());
+                    pstm.setInt(7, contract.getIsDeleted());
+                    pstm.setString(8, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(contract.getCreateTime()));
+                    //添加批处理
+                    pstm.addBatch();
+                    if (i % 1000 == 0) {
+                        pstm.executeBatch();
+                        pstm.clearBatch();
+                    }
                 }
+                //将批处理余下的语句执行完毕
+                pstm.executeBatch();
+                //释放资源
+                pstm.close();
+                conn.close();
+            } catch (Exception e) {
+                e.printStackTrace();
             }
-            //将批处理余下的语句执行完毕
-            pstm.executeBatch();
-            //释放资源
-            pstm.close();
-            conn.close();
-        }catch (Exception e){
-            e.printStackTrace();
         }
     }
 
     public void autoToSqlite(Long projectId){
         List<ArchivesAutoDTO> list = autoMapper.getListByProjectId(projectId);
-        String localUrl = "/www/wwwroot/localClient/local_archives/alilib/";
-        //拼接档案里文件的pdf设置allPdf
-        for (ArchivesAutoDTO dto : list) {
-            List<ArchiveFile> files = fileClient.getArchiveFileByArchivesId(dto.getId()+"","");
-            if (files != null && files.size() >0){
-                List<String> urlList = new ArrayList<>();
-                for (ArchiveFile file : files) {
-                    if (StringUtil.isNotBlank(file.getPdfFileUrl())){
-                        urlList.add(file.getPdfFileUrl());
+        if (list != null && list.size() > 0) {
+            String localUrl = "/www/wwwroot/localClient/local_archives/alilib/";
+            //拼接档案里文件的pdf设置allPdf
+            for (ArchivesAutoDTO dto : list) {
+                List<ArchiveFile> files = fileClient.getArchiveFileByArchivesId(dto.getId() + "", "");
+                if (files != null && files.size() > 0) {
+                    List<String> urlList = new ArrayList<>();
+                    for (ArchiveFile file : files) {
+                        if (StringUtil.isNotBlank(file.getPdfFileUrl())) {
+                            urlList.add(file.getPdfFileUrl());
+                        }
+                    }
+                    if (urlList.size() > 0) {
+                        Long id = SnowFlakeUtil.getId();
+                        FileUtils.mergePdfPublicMethods(urlList, localUrl + id + ".pdf");
+                        dto.setAllFilePdf(id + ".pdf");
                     }
                 }
-                if (urlList.size() > 0){
-                    Long id = SnowFlakeUtil.getId();
-                    FileUtils.mergePdfPublicMethods(urlList,localUrl+id+".pdf");
-                    dto.setAllFilePdf(id+".pdf");
-                }
-            }
 
-        }
-        try  {
-            Connection conn = data.dataSource().getConnection();
-            //清空数据
-            Statement statement = conn.createStatement();
-            statement.execute("DELETE FROM u_archives_auto");
-            statement.close();
-            //导入数据
-            String sql = "INSERT INTO u_archives_auto (id, project_id, name, file_number, unit,storage_time, is_archive,node_id, status, is_deleted,create_time,all_file_pdf)" +
-                    "VALUES(?,?,?,?,?,?,?,?,?,?,?,?)";
-            PreparedStatement pstm = conn.prepareStatement(sql);
-            //pstm 绑定数据
-            int i=0;
-            for (ArchivesAutoDTO auto : list) {
-                i++;
-                pstm.setLong(1,auto.getId());
-                pstm.setLong(2,auto.getProjectId());
-                pstm.setString(3,auto.getName());
-                pstm.setString(4,auto.getFileNumber());
-                pstm.setString(5,auto.getUnit());
-                pstm.setString(6,auto.getStorageTime());
-                pstm.setInt(7,auto.getIsArchive()==null?0:1);
-                pstm.setLong(8,auto.getNodeId());
-                pstm.setInt(9,auto.getStatus());
-                pstm.setInt(10,auto.getIsDeleted());
-                pstm.setString(11,  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(auto.getCreateTime()));
-                pstm.setString(12,auto.getAllFilePdf()==null?"":auto.getAllFilePdf());
+            }
+            try {
+                Connection conn = data.dataSource().getConnection();
+                //清空数据
+                Statement statement = conn.createStatement();
+                statement.execute("DELETE FROM u_archives_auto");
+                statement.close();
+                //导入数据
+                String sql = "INSERT INTO u_archives_auto (id, project_id, name, file_number, unit,storage_time, is_archive,node_id, status, is_deleted,create_time,all_file_pdf)" +
+                        "VALUES(?,?,?,?,?,?,?,?,?,?,?,?)";
+                PreparedStatement pstm = conn.prepareStatement(sql);
+                //pstm 绑定数据
+                int i = 0;
+                for (ArchivesAutoDTO auto : list) {
+                    i++;
+                    pstm.setLong(1, auto.getId());
+                    pstm.setLong(2, auto.getProjectId());
+                    pstm.setString(3, auto.getName());
+                    pstm.setString(4, auto.getFileNumber());
+                    pstm.setString(5, auto.getUnit());
+                    pstm.setString(6, auto.getStorageTime());
+                    pstm.setInt(7, auto.getIsArchive() == null ? 0 : 1);
+                    pstm.setLong(8, auto.getNodeId());
+                    pstm.setInt(9, auto.getStatus());
+                    pstm.setInt(10, auto.getIsDeleted());
+                    pstm.setString(11, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(auto.getCreateTime()));
+                    pstm.setString(12, auto.getAllFilePdf() == null ? "" : auto.getAllFilePdf());
 
-                //添加批处理
-                pstm.addBatch();
-                if (i % 1000 == 0) {
-                    pstm.executeBatch();
-                    pstm.clearBatch();
+                    //添加批处理
+                    pstm.addBatch();
+                    if (i % 1000 == 0) {
+                        pstm.executeBatch();
+                        pstm.clearBatch();
+                    }
                 }
+                //将批处理余下的语句执行完毕
+                pstm.executeBatch();
+                //释放资源
+                pstm.close();
+                conn.close();
+            } catch (Exception e) {
+                e.printStackTrace();
             }
-            //将批处理余下的语句执行完毕
-            pstm.executeBatch();
-            //释放资源
-            pstm.close();
-            conn.close();
-        }catch (Exception e){
-            e.printStackTrace();
         }
     }
 

+ 39 - 7
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -19,11 +19,13 @@ package org.springblade.archive.service.impl;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.ArchivesAuto;
+import org.springblade.archive.service.IArchiveAutoPdfService;
 import org.springblade.archive.vo.ArchivesAutoVO;
 import org.springblade.archive.mapper.ArchivesAutoMapper;
 import org.springblade.archive.service.IArchivesAutoService;
@@ -64,6 +66,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	private ArchiveTreeContractClient archiveTreeContractClient;
 	private ContractClient contractClient;
 	private Map<String,Integer> indexMap; //按立卷位区分和生成流水号
+	private IArchiveAutoPdfService archiveAutoPdfService;
 
 
 
@@ -74,7 +77,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 	@Override
 	public IPage<ArchivesAutoVO> pageByArchivesAuto(ArchivesAutoVO vo) {
-		IPage<ArchivesAutoVO> page = new Page<>();
+		IPage<ArchivesAutoVO> page = new Page<>(vo.getCurrent(),vo.getSize());
 		if (StringUtils.isNotBlank(vo.getStorageTime())) {
 			vo.setStorageTimes(Arrays.asList(vo.getStorageTime().split(",")));
 		}
@@ -303,7 +306,10 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		archivesAuto.setEndDate(LocalDateTime.parse(endDate));//文件结束时间
 		archivesAuto.setStorageTime(node.getStorageTime());//保管期限  从节点规格获取
 		archivesAuto.setSecretLevel("");//保密级别 没地方设置 暂留
-		//archivesAuto.setCarrierType();//载体类型
+		//载体类型
+		if (node.getStorageType()!= null){
+			archivesAuto.setCarrierType(node.getStorageType().toString());
+		}
 		//archivesAuto.setKeywords();//主题词
 		//archivesAuto.setStorageLocation();//存放位置
 		archivesAuto.setIsArchive(1);//已归档
@@ -343,8 +349,13 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//TODO 获取案卷题名
 		return "";
 	}
-	private String builtFilePageNo(List<ArchiveFile> waitArchiveFiles){
+	private String builtFilePageNo(ArchivesAuto archivesAuto,List<ArchiveFile> waitArchiveFiles){
 		//TODO 生成文件对应的页码,返回url
+
+		archiveAutoPdfService.builtFilePageNo(archivesAuto,waitArchiveFiles);
+
+		this.updateById(archivesAuto);
+
 		return "";
 	}
 
@@ -369,7 +380,10 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//2.设置文件所属案卷,组卷状态
 		Long archivesAutoId = archivesAuto.getId();
 
-		builtFilePageNo(waitArchiveFiles);//生成文件页码
+		//封面和生成文件页码
+		archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
+
+		builtFilePageNo(archivesAuto,waitArchiveFiles);//生成文件页码
 
 		for(ArchiveFile file:waitArchiveFiles){
 			file.setArchiveId(archivesAutoId);//设置文件所属案卷
@@ -411,7 +425,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		ArchivesAuto archivesAuto = builtArchives(node,pageN,fileN,startDate,endDate,archiveName);
 
 		//2.生成文件页码
-		builtFilePageNo(waitArchiveFiles);
+		archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
+
+		builtFilePageNo(archivesAuto,waitArchiveFiles);
 
 		//3.设置文件所属案卷,组卷状态
 		Long archivesAutoId = archivesAuto.getId();
@@ -449,8 +465,10 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//1.创建新案卷
 		ArchivesAuto archivesAuto = builtArchives(node,pageN,fileN,startDate,endDate,archiveName);
 
-		//2.生成文件页码
-		builtFilePageNo(waitArchiveFiles);
+		//2.封面和生成文件页码
+		archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
+
+		builtFilePageNo(archivesAuto,waitArchiveFiles);
 
 		//3.设置文件所属案卷,组卷状态
 		Long archivesAutoId = archivesAuto.getId();
@@ -743,5 +761,19 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 	}
 
+	/**
+	 * 查询案卷,排序
+	 * @param ids
+	 * @return
+	 */
+	public List<ArchivesAuto> findArchivesAutosByIds(List<Long> ids) {
+		QueryWrapper<ArchivesAuto> queryWrapper = new QueryWrapper<>();
+		queryWrapper.in("node_id", ids)
+				.orderByDesc("tree_sort")
+				.orderByAsc("auto_file_sort");
+
+		return this.list(queryWrapper);
+	}
+
 
 }

+ 124 - 96
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -58,6 +58,8 @@ import org.springblade.core.boot.ctrl.BladeController;
 
 import java.io.IOException;
 import java.util.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -1455,11 +1457,29 @@ public class InformationWriteQueryController extends BladeController {
                     }
                 }
 
-                //结果集
+                //缓存需要的节点信息、表信息
+                WbsTreeContract needCopyNodeRoot = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getNeedCopyPrimaryKeyId());
+                Map<String, List<WbsTreeContract>> needCopyNodeAndTabMap = new HashMap<>();
+                List<WbsTreeContract> needCopyChildNodes = this.getChildNodes(needCopyNodeRoot);
+                if (ObjectUtil.isEmpty(needCopyChildNodes) || needCopyChildNodes.size() == 0) {
+                    //最下层级节点复制
+                    needCopyChildNodes = new ArrayList<>();
+                    needCopyChildNodes.add(needCopyNodeRoot);
+                }
+                needCopyNodeAndTabMap.put("node:" + needCopyNodeRoot.getPKeyId(), needCopyChildNodes);
+                List<WbsTreeContract> addChildNodesTables = this.getChildNodesTables(needCopyChildNodes, needCopyNodeRoot.getContractId());
+                needCopyNodeAndTabMap.put("tab:" + needCopyNodeRoot.getPKeyId(), addChildNodesTables);
+
+                //TODO 结果集
+                //节点
                 List<WbsTreeContract> addNodeList = new ArrayList<>();
+                //表单
                 List<WbsTreeContract> addTabList = new ArrayList<>();
+                //redis同步信息
                 List<WbsTreeContract> asyncWbsTreeNodes = new ArrayList<>();
-                Set<WbsTreeContract> addChildNodesTablesOldAll = new HashSet<>();
+                //表单附件数据源
+                Set<WbsTreeContract> addChildNodesTablesOldAll = new HashSet<>(addChildNodesTables);
+                //表单数据
                 List<String> resultTablesData = new ArrayList<>();
 
                 //表单所属方
@@ -1475,116 +1495,135 @@ public class InformationWriteQueryController extends BladeController {
                     tabOwner = "1,2,3,4,5,6";
                 }
 
-                //解析位置信息,进行复制数据构造
-                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);
-                        asyncWbsTreeNodes.add(toCopyNode);
-                        CopyContractTreeNodeVO.CopyBatch toCopyVO = copyBatches.get(i);
-
-                        if (toCopyNode != null && toCopyVO != null && needCopyNode != null) {
-                            //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> addChildNodes = this.getChildNodes(needCopyNode);
-
-                                    if (ObjectUtil.isEmpty(addChildNodes) || addChildNodes.size() == 0) {
-                                        //最下层级节点复制
-                                        addChildNodes = new ArrayList<>();
-                                        addChildNodes.add(needCopyNode);
-                                    }
-
-                                    //获取所有复制的表
-                                    List<WbsTreeContract> addChildNodesTables = this.getChildNodesTables(addChildNodes, toCopyNode.getContractId());
-
-                                    //复制数据源表,文件附件用
-                                    List<WbsTreeContract> oldTab = BeanUtil.copyProperties(addChildNodesTables, WbsTreeContract.class);
-                                    addChildNodesTablesOldAll.addAll(oldTab);
-
-                                    //构造新的节点、表、数据
-                                    this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, addChildNodes, addChildNodesTables, needCopyNode, toCopyNode, resultTablesData, 1, tabOwner, vo.getIsCopyData());
+                //创建线程池,默认设置8个线程
+                ExecutorService executor = Executors.newFixedThreadPool(8);
+                try {
+                    //解析位置信息,进行复制数据构造
+                    if (toCopyNodes.size() == copyBatches.size()) {
+                        for (int i = 0; i < toCopyNodes.size(); i++) {
+                            //首先查询需要复制的节点的信息
+                            WbsTreeContract toCopyNode = toCopyNodes.get(i);
+                            CopyContractTreeNodeVO.CopyBatch toCopyVO = copyBatches.get(i);
+
+                            String finalTabOwner = tabOwner;
+                            //使用线程池提交任务
+                            executor.submit(() -> {
+                                //redis缓存node
+                                asyncWbsTreeNodes.add(toCopyNode);
+
+                                if (toCopyNode != null && toCopyVO != null && needCopyNodeAndTabMap.size() > 0) {
+                                    //TODO 同节点复制
+                                    if (new Integer(1).equals(toCopyVO.getIsSameNode())) {
+                                        //1.1 选择当前节点的父级节点,新增
+                                        if (needCopyNodeRoot.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, needCopyNodeRoot, toCopyNode, resultTablesData, 1, finalTabOwner, vo.getIsCopyData());
+
+                                            //1.2 选择同父级的同级节点,只复制数据
+                                        } else if (needCopyNodeRoot.getParentId().equals(toCopyNode.getParentId())) {
+                                            //构造数据
+                                            this.addCopyTabData(needCopyNodeRoot, toCopyNode, finalTabOwner, resultTablesData, addTabList, vo.getIsCopyData());
+                                        }
 
-                                    //1.2 选择同父级的同级节点,只复制数据
-                                } else if (needCopyNode.getParentId().equals(toCopyNode.getParentId())) {
-                                    //构造数据
-                                    this.addCopyTabData(needCopyNode, toCopyNode, tabOwner, resultTablesData, addChildNodesTablesOldAll, addTabList, vo.getIsCopyData());
-                                }
+                                        //TODO 跨节点复制
+                                    } else if (new Integer(0).equals(toCopyVO.getIsSameNode())) {
+                                        //获取需要复制节点的上级
+                                        WbsTreeContract parentNodeNeed = wbsTreeContractClient.getContractWbsTreeByContractIdAndId(needCopyNodeRoot.getParentId(), Long.parseLong(needCopyNodeRoot.getContractId()));
 
-                                //TODO 跨节点复制
-                            } else if (new Integer(0).equals(toCopyVO.getIsSameNode())) {
-                                //获取需要复制节点的上级
-                                WbsTreeContract parentNodeNeed = wbsTreeContractClient.getContractWbsTreeByContractIdAndId(needCopyNode.getParentId(), Long.parseLong(needCopyNode.getContractId()));
+                                        //2.1 选择的父级的同级的父级节点,新增(当复制节点父级与选择复制到的位置节点的父级id相同时,表示跨节点)
+                                        if (parentNodeNeed != null && parentNodeNeed.getParentId().equals(toCopyNode.getParentId())) {
+                                            toCopyNode.setNodeName(toCopyVO.getNodeName());
+                                            toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
 
-                                //2.1 选择的父级的同级的父级节点,新增(当复制节点父级与选择复制到的位置节点的父级id相同时,表示跨节点)
-                                if (parentNodeNeed != null && parentNodeNeed.getParentId().equals(toCopyNode.getParentId())) {
-                                    toCopyNode.setNodeName(toCopyVO.getNodeName());
-                                    toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
+                                            //获取缓存节点、表信息
+                                            List<WbsTreeContract> needCopyNodes = needCopyNodeAndTabMap.get("node:" + needCopyNodeRoot.getPKeyId());
+                                            List<WbsTreeContract> needCopyTab = needCopyNodeAndTabMap.get("tab:" + needCopyNodeRoot.getPKeyId());
 
-                                    //获取需要复制的所有子节点
-                                    List<WbsTreeContract> addChildNodes = this.getChildNodes(needCopyNode);
+                                            //构造新的节点、表、数据
+                                            this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, needCopyNodes, needCopyTab, needCopyNodeRoot, toCopyNode, resultTablesData, 0, finalTabOwner, vo.getIsCopyData());
 
-                                    //最下层级节点复制
-                                    if (ObjectUtil.isEmpty(addChildNodes) || addChildNodes.size() == 0) {
-                                        addChildNodes = new ArrayList<>();
-                                        addChildNodes.add(needCopyNode);
+                                            //2.2 如果点击选择的是当前复制节点本身的同等级节点,那么就只复制数据。(如果是跨节点,类型相同的情况下,只复制数据)
+                                        } else if (needCopyNodeRoot.getNodeType().equals(toCopyNode.getNodeType()) && !needCopyNodeRoot.getParentId().equals(toCopyNode.getParentId())) {
+                                            //构造数据
+                                            this.addCopyTabData(needCopyNodeRoot, toCopyNode, finalTabOwner, resultTablesData, addTabList, vo.getIsCopyData());
+                                        }
                                     }
-
-                                    //获取所有复制的表
-                                    List<WbsTreeContract> addChildNodesTables = this.getChildNodesTables(addChildNodes, toCopyNode.getContractId());
-
-                                    //复制数据源表,文件附件用
-                                    List<WbsTreeContract> oldTab = BeanUtil.copyProperties(addChildNodesTables, WbsTreeContract.class);
-                                    addChildNodesTablesOldAll.addAll(oldTab);
-
-                                    //构造新的节点、表、数据
-                                    this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, addChildNodes, addChildNodesTables, needCopyNode, toCopyNode, resultTablesData, 0, tabOwner, vo.getIsCopyData());
-
-                                    //2.2 如果点击选择的是当前复制节点本身的同等级节点,那么就只复制数据。(如果是跨节点,类型相同的情况下,只复制数据)
-                                } else if (needCopyNode.getNodeType().equals(toCopyNode.getNodeType()) && !needCopyNode.getParentId().equals(toCopyNode.getParentId())) {
-                                    //构造数据
-                                    this.addCopyTabData(needCopyNode, toCopyNode, tabOwner, resultTablesData, addChildNodesTablesOldAll, addTabList, vo.getIsCopyData());
                                 }
-                            }
+                            });
                         }
                     }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                } finally {
+                    //关闭线程池
+                    executor.shutdown();
+                    //等待所有线程执行完毕
+                    while (!executor.isTerminated()) {
+                    }
                 }
 
                 //节点
+                Boolean aBoolean = false;
                 if (addNodeList.size() > 0) {
-                    wbsTreeContractClient.saveBatch(addNodeList);
-                    //更新redis缓存
-                    if (asyncWbsTreeNodes.size() > 0) {
-                        for (WbsTreeContract asyncWbsTreeNode : asyncWbsTreeNodes) {
-                            informationQueryService.AsyncWbsTree("", asyncWbsTreeNode.getParentId() + "", contractId, "", "1");
-                        }
-                    }
+                    //重构祖级id
+                    this.reBuildAncestors(addNodeList, needCopyNodeRoot);
+                    aBoolean = wbsTreeContractClient.saveBatch(addNodeList);
                 }
+
                 //元素表
                 if (addTabList.size() > 0) {
-                    wbsTreeContractClient.saveBatch(addTabList);
-
+                    this.reBuildAncestors(addTabList, null);
+                    aBoolean = wbsTreeContractClient.saveBatch(addTabList);
                     //表单文件附件
                     if (addChildNodesTablesOldAll.size() > 0 && vo.getIsCopyData() == 1) {
                         this.addCopyTabFile(addTabList, addChildNodesTablesOldAll);
                     }
                 }
+
                 //实体表数据
                 if (resultTablesData.size() > 0) {
                     jdbcTemplate.execute(StringUtils.join(resultTablesData, ""));
                 }
+
+                //更新redis缓存
+                if (aBoolean && asyncWbsTreeNodes.size() > 0) {
+                    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("操作成功");
             }
         }
         return R.fail("操作失败");
     }
 
+    /**
+     * 重构祖级id
+     */
+    private void reBuildAncestors(List<WbsTreeContract> result, WbsTreeContract needCopyNodeRoot) {
+        for (WbsTreeContract wbsTreeContract : result) {
+            //根节点
+            if (ObjectUtil.isNotEmpty(needCopyNodeRoot) && wbsTreeContract.getOldId().equals(needCopyNodeRoot.getId().toString())) {
+                wbsTreeContract.setAncestors(needCopyNodeRoot.getAncestors());
+            }//非根节点
+            if (ObjectUtil.isNotEmpty(wbsTreeContract.getParentId()) && ObjectUtil.isNotEmpty(wbsTreeContract.getAncestors()) && !wbsTreeContract.getAncestors().contains(wbsTreeContract.getParentId() + "")) {
+                String[] split = wbsTreeContract.getAncestors().split(",");
+                String s = split[split.length - 1];
+                wbsTreeContract.setAncestors(wbsTreeContract.getAncestors().replace(s, wbsTreeContract.getParentId() + ""));
+            }
+        }
+    }
+
     /**
      * 新增复制的表单文件
      */
@@ -1620,11 +1659,11 @@ public class InformationWriteQueryController extends BladeController {
     /**
      * 新增复制的数据
      */
-    private void addCopyTabData(WbsTreeContract needCopyNode, WbsTreeContract toCopyNode, String tabOwner, List<String> resultTablesData, Set<WbsTreeContract> addChildNodesTablesOldAll, List<WbsTreeContract> addChildNodesTablesAll, Integer isCopyData) {
+    private void addCopyTabData(WbsTreeContract needCopyNode, WbsTreeContract toCopyNode, String tabOwner, List<String> resultTablesData, List<WbsTreeContract> addChildNodesTablesAll, Integer isCopyData) {
         List<WbsTreeContract> wbsTreeContractsNeed = Collections.singletonList(needCopyNode);
         List<WbsTreeContract> wbsTreeContractsTo = Collections.singletonList(toCopyNode);
-        List<WbsTreeContract> needCopyNodeTabs = getChildNodesTables(wbsTreeContractsNeed, needCopyNode.getContractId());
-        List<WbsTreeContract> toCopyNodeTabs = getChildNodesTables(wbsTreeContractsTo, needCopyNode.getContractId());
+        List<WbsTreeContract> needCopyNodeTabs = this.getChildNodesTables(wbsTreeContractsNeed, needCopyNode.getContractId());
+        List<WbsTreeContract> toCopyNodeTabs = this.getChildNodesTables(wbsTreeContractsTo, needCopyNode.getContractId());
         if (needCopyNodeTabs.size() > 0) {
             for (WbsTreeContract needTab : needCopyNodeTabs) {
                 for (WbsTreeContract toCopyNodeTab : toCopyNodeTabs) {
@@ -1640,7 +1679,6 @@ public class InformationWriteQueryController extends BladeController {
                         if (tabOwner.contains(needTab.getTableOwner()) && isCopyData == 1) {
 
                             //源表obj对象,文件附件使用
-                            addChildNodesTablesOldAll.add(needTab);
                             if (!needTab.getTabFileType().equals(toCopyNodeTab.getTabFileType())) {
                                 toCopyNodeTab.setTabFileType(needTab.getTabFileType()); //已上传
                             }
@@ -1694,10 +1732,6 @@ public class InformationWriteQueryController extends BladeController {
                     if (isSameNode == 0) {
                         //跨节点复制,更改父级id
                         obj.setParentId(toCopyNode.getId());
-                        //设置祖级id
-                        String[] split = obj.getAncestors().split(",");
-                        String lastId = split[split.length - 1];
-                        obj.setAncestors(obj.getAncestors().replace(lastId, toCopyNode.getId().toString()));
                     }
                     obj.setOldId(needNode.getId() + "");
                     obj.setPKeyId(SnowFlakeUtil.getId());
@@ -1718,7 +1752,6 @@ public class InformationWriteQueryController extends BladeController {
                 WbsTreeContract obj = BeanUtil.copyProperties(needTab, WbsTreeContract.class);
                 if (obj != null) {
                     Long oldPKeyId = needTab.getPKeyId();
-                    obj.setAncestors(needTab.getAncestors().replace(needTab.getParentId().toString(), id.toString()));
                     obj.setId(SnowFlakeUtil.getId());
                     obj.setParentId(id);
                     obj.setPKeyId(SnowFlakeUtil.getId());
@@ -1787,8 +1820,7 @@ public class InformationWriteQueryController extends BladeController {
                     Long id = SnowFlakeUtil.getId();
                     //数据源节点的老id与新的id的Map,作为下一级的节点的父级id的替换
                     parentIdToId.put(node.getId(), id);
-                    //重设祖级id
-                    this.restoreParent(obj, parentIdToId);
+
                     //重设Id
                     obj.setId(id);
                     obj.setParentId(newParentId);
@@ -1808,7 +1840,6 @@ public class InformationWriteQueryController extends BladeController {
                                 Long oldPKeyId = needTab.getPKeyId();
                                 String tableName = needTab.getInitTableName();
                                 Long tabId = SnowFlakeUtil.getId();
-                                objTab.setAncestors(needTab.getAncestors().replace(needTab.getParentId().toString(), id.toString()));
                                 objTab.setId(tabId);
                                 objTab.setParentId(id);
                                 objTab.setPKeyId(SnowFlakeUtil.getId());
@@ -1850,14 +1881,11 @@ public class InformationWriteQueryController extends BladeController {
             } else {
                 //跨节点
                 toCopyNode.setParentId(toCopyNodeOldId);
-                //重设祖级id
-                toCopyNode.setAncestors(needCopyNode.getAncestors().replace(needCopyNode.getParentId().toString(), toCopyNode.getId().toString()));
             }
             toCopyNode.setPKeyId(SnowFlakeUtil.getId());
             toCopyNode.setNodeName(toCopyNode.getNodeName());
             toCopyNode.setFullName(toCopyNode.getNodeName());
             toCopyNode.setPartitionCode(toCopyNode.getPartitionCode());
-            needNodes.add(toCopyNode);
             addNodeList.add(toCopyNode);
         }
     }

+ 12 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java

@@ -64,7 +64,7 @@ import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
 @RestController
 @AllArgsConstructor
 @RequestMapping("/archiveTreeContract")
-@Api(value = "", tags = "接口")
+@Api(value = "档案归档树", tags = "档案归档树接口")
 public class ArchiveTreeContractController extends BladeController {
 
 	private final IArchiveTreeContractService archiveTreeContractService;
@@ -295,6 +295,17 @@ public class ArchiveTreeContractController extends BladeController {
 		return R.data(archiveTreeContractService.getSameGradeNode(id));
 	}
 
+	/**
+	 * 档案统计-归档树及其档案总数
+	 */
+	@GetMapping("/getArchiveTreeAndArchiveCount")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "获取归档树及其档案总数", notes = "传入节点id")
+	public R getArchiveTreeAndArchiveCount(Long projectId,Long nodeId) {
+		List<Map<String,Object>> list = archiveTreeContractService.getArchiveTreeAndArchiveCount(projectId,nodeId);
+		return R.data(list);
+	}
+
 	/**
 	 * 提交归档树手动排序
 	 */

+ 128 - 122
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java

@@ -51,21 +51,22 @@ public class WbsParamController {
 
     /**
      * 保存或修改
+     *
      * @param wp
      */
     @PostMapping("/saveOrUpdate")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "保存或修改参数", notes = "保存或修改参数")
     public R saveOrUpdate(@RequestBody WbsParamBean wp) {
-        if(wp.getId()==null){
-            WbsParam e= new WbsParam();
-            BeanUtils.copyProperties(wp,e);
+        if (wp.getId() == null) {
+            WbsParam e = new WbsParam();
+            BeanUtils.copyProperties(wp, e);
             e.setIsDeleted(0);
             return R.status(this.service.save(e));
-        }else{
+        } else {
             WbsParam old = this.service.getById(wp.getId());
-            if(old!=null){
-                BeanUtils.copyProperties(wp,old);
+            if (old != null) {
+                BeanUtils.copyProperties(wp, old);
                 old.setIsDeleted(0);
                 return R.status(service.updateById(old));
             }
@@ -78,66 +79,66 @@ public class WbsParamController {
     @ApiOperation(value = "批量保存或修改参数", notes = "批量保存或修改参数")
     public R saveOrUpdateBatch(@RequestBody ParamBean pb) {
         try {
-            List<WbsParamBean> wps =pb.getWps();
+            List<WbsParamBean> wps = pb.getWps();
             /*执行顺序,删>增>改*/
-            if(Func.isNotEmpty(pb.getDelIds())){
+            if (Func.isNotEmpty(pb.getDelIds())) {
                 List<Long> delIds = pb.getDelIds().stream().filter(Func::isNotEmpty).collect(Collectors.toList());
-                if(Func.isNotEmpty(delIds)){
+                if (Func.isNotEmpty(delIds)) {
                     this.service.deleteLogic(pb.getDelIds());
-                    if(!pb.isCommon()){
-                        this.elementFormulaMappingService.update(Wrappers.<ElementFormulaMapping>lambdaUpdate().set(ElementFormulaMapping::getIsDeleted,1).in(ElementFormulaMapping::getParamId,pb.getDelIds()));
+                    if (!pb.isCommon()) {
+                        this.elementFormulaMappingService.update(Wrappers.<ElementFormulaMapping>lambdaUpdate().set(ElementFormulaMapping::getIsDeleted, 1).in(ElementFormulaMapping::getParamId, pb.getDelIds()));
                     }
                 }
                 /*应该检查接触关联的参数公式还是否存在引用,不存在的情况也要删去*/
             }
-            if(CollectionUtil.isNotEmpty(wps)){
-                Map<Boolean,List<WbsParamBean>> map = wps.stream().collect(Collectors.partitioningBy(e->e.getId()!=null));
+            if (CollectionUtil.isNotEmpty(wps)) {
+                Map<Boolean, List<WbsParamBean>> map = wps.stream().collect(Collectors.partitioningBy(e -> e.getId() != null));
                 List<WbsParamBean> saveList = map.get(false);
                 List<WbsParamBean> updateList = map.get(true);
-                if(CollectionUtil.isNotEmpty(saveList)){
-                    List<WbsParam>entityList=BeanUtil.copy(saveList,WbsParam.class);
+                if (CollectionUtil.isNotEmpty(saveList)) {
+                    List<WbsParam> entityList = BeanUtil.copy(saveList, WbsParam.class);
                     this.service.saveBatch(entityList);
-                    if(!pb.isCommon()){
+                    if (!pb.isCommon()) {
                         /*新建的时候需要初始化绑定表单元素*/
-                        List<Map<String,Object>> elementMap=new ArrayList<>();
-                        if(pb.isWbs()){
-                            elementMap= this.jdbcTemplate.queryForList(
+                        List<Map<String, Object>> elementMap = new ArrayList<>();
+                        if (pb.isWbs()) {
+                            elementMap = this.jdbcTemplate.queryForList(
                                     "select a.e_name as name ,a.id " +
                                             "from m_wbs_form_element a " +
                                             "inner join m_wbs_tree b on a.f_id=b.init_table_id " +
                                             "inner join m_wbs_tree c on b.parent_id=c.id " +
-                                            "where a.is_deleted=0 and c.id="+pb.getNodeId()
+                                            "where a.is_deleted=0 and c.id=" + pb.getNodeId()
                             );
-                        }else if(pb.isPrivate()){
-                            elementMap= this.jdbcTemplate.queryForList(
+                        } else if (pb.isPrivate()) {
+                            elementMap = this.jdbcTemplate.queryForList(
                                     "select c.e_name as name ,c.id from m_wbs_tree_private a " +
                                             "inner join m_wbs_tree_private b on (a.id=b.parent_id and a.wbs_id=b.wbs_id) " +
                                             "inner join m_wbs_form_element c on  b.init_table_id=c.f_id " +
-                                            "where  b.project_id="+pb.getProjectId()+" and a.p_key_id="+pb.getNodeId()+"  and b.is_deleted=0 and c.is_deleted=0 ");
+                                            "where  b.project_id=" + pb.getProjectId() + " and a.p_key_id=" + pb.getNodeId() + "  and b.is_deleted=0 and c.is_deleted=0 ");
                         }
-                        if(!elementMap.isEmpty()){
-                            Map<String,Object> tmpMap=new HashMap<>();
+                        if (!elementMap.isEmpty()) {
+                            Map<String, Object> tmpMap = new HashMap<>();
                             List<Map<String, Object>> finalElementMap = elementMap;
-                            entityList.forEach(e->{
+                            entityList.forEach(e -> {
                                 Formula formula = new Formula();
                                 formula.setOutm(Formula.FULL);
                                 formula.setParamId(e.getId());
-                                Map<String,String> keyMap= new HashMap<>();
-                                keyMap.put("name",e.getName());
-                                keyMap.put("id",e.getId().toString());
-                                tmpMap.put(e.getK(),keyMap);
-                                if(RegexUtil.match(ParamElements.LEVEL_REG,e.getV().trim())){
+                                Map<String, String> keyMap = new HashMap<>();
+                                keyMap.put("name", e.getName());
+                                keyMap.put("id", e.getId().toString());
+                                tmpMap.put(e.getK(), keyMap);
+                                if (RegexUtil.match(ParamElements.LEVEL_REG, e.getV().trim())) {
                                     /*取层级*/
-                                    formula.setFormula("FC.tree(trees,WP["+e.getK()+"])");
-                                }else{
+                                    formula.setFormula("FC.tree(trees,WP[" + e.getK() + "])");
+                                } else {
                                     /*直接取数*/
-                                    formula.setFormula("WP["+e.getK()+"]");
+                                    formula.setFormula("WP[" + e.getK() + "]");
                                 }
                                 formula.setMap(JSON.toJSONString(tmpMap));
                                 this.formulaService.save(formula);
                                 tmpMap.clear();
-                                finalElementMap.forEach(m->{
-                                    if(StringUtils.handleNull(m.get("name")).contains(e.getName())){
+                                finalElementMap.forEach(m -> {
+                                    if (StringUtils.handleNull(m.get("name")).contains(e.getName())) {
                                         ElementFormulaMapping efm = new ElementFormulaMapping();
                                         efm.setScope(FormulaBean.PARAM);
                                         efm.setParamId(e.getId());
@@ -150,34 +151,34 @@ public class WbsParamController {
                         }
                     }
                 }
-                if(CollectionUtil.isNotEmpty(updateList)){
+                if (CollectionUtil.isNotEmpty(updateList)) {
                     List<WbsParam> ul = new ArrayList<>();
-                    for(WbsParamBean b:updateList){
+                    for (WbsParamBean b : updateList) {
                         WbsParam old = this.service.getById(b.getId());
-                        if(pb.isCommon()){
-                            if(old!=null&&!old.getK().equals(b.getK())){
+                        if (pb.isCommon()) {
+                            if (old != null && !old.getK().equals(b.getK())) {
                                 /*只有公式内容变化的时候才需要更新*/
                                 old.setIsDeleted(0);
-                                BeanUtils.copyProperties(b,old);
+                                BeanUtils.copyProperties(b, old);
                                 ul.add(old);
                             }
-                        }else{
-                            if(old!=null&&!old.getV().equals(b.getV())){
+                        } else {
+                            if (old != null && !old.getV().equals(b.getV())) {
                                 /*只有公式内容变化的时候才需要更新*/
                                 old.setIsDeleted(0);
-                                BeanUtils.copyProperties(b,old);
+                                BeanUtils.copyProperties(b, old);
                                 ul.add(old);
                             }
                         }
 
                     }
-                    if(Func.isNotEmpty(ul)){
+                    if (Func.isNotEmpty(ul)) {
                         this.service.saveOrUpdateBatch(ul);
                     }
                 }
             }
             return R.success("操作成功");
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             return R.fail("操作失败");
         }
@@ -185,25 +186,27 @@ public class WbsParamController {
     }
 
     /**
+     * /**
      * 删除
      */
     @PostMapping("/remove")
     @ApiOperationSupport(order = 2)
     @ApiOperation(value = "删除", notes = "传入id集合")
-    public R remove(@ApiParam(value="需要删除的Id,多个用逗号逗号分开",required = true)@RequestParam String ids) {
+    public R remove(@ApiParam(value = "需要删除的Id,多个用逗号逗号分开", required = true) @RequestParam String ids) {
         return R.status(this.service.deleteLogic(Func.toLongList(ids)));
     }
+
     /**
      * 查询单条
      */
-    @ApiOperationSupport(order =3)
+    @ApiOperationSupport(order = 3)
     @ApiOperation(value = "查看详情", notes = "传入id")
     @GetMapping("/detail")
     @ApiIgnore
     public R<WbsParamBean> detail(WbsParam wp) {
         WbsParam detail = service.getOne(Condition.getQueryWrapper(wp));
-        if(detail!=null){
-            return R.data(BeanUtil.copy(detail,WbsParamBean.class));
+        if (detail != null) {
+            return R.data(BeanUtil.copy(detail, WbsParamBean.class));
         }
         return R.success("无数据");
     }
@@ -211,9 +214,9 @@ public class WbsParamController {
     @ApiOperationSupport(order = 4)
     @ApiOperation(value = "节点参数列表(翻页)", notes = "节点参数列表(翻页)")
     @GetMapping("/page")
-    public IPage<WbsParamBean> list( WbsParamBean param,  Query query) {
+    public IPage<WbsParamBean> list(WbsParamBean param, Query query) {
         LambdaQueryWrapper<WbsParam> queryWrapper = Wrappers.<WbsParam>query().lambda();
-        IPage<WbsParam> pages  = this.service.page(Condition.getPage(query),queryWrapper);
+        IPage<WbsParam> pages = this.service.page(Condition.getPage(query), queryWrapper);
         return WbsParamWrapper.build().pageVO(pages);
     }
 
@@ -221,10 +224,10 @@ public class WbsParamController {
     @ApiOperation(value = "获取名称字典", notes = "获取名称字典")
     @GetMapping("/keymap")
     public R<List<WbsParamBean>> list2() {
-        LambdaQueryWrapper<WbsParam> queryWrapper = Wrappers.<WbsParam>query().lambda().eq(WbsParam::getType,0);
+        LambdaQueryWrapper<WbsParam> queryWrapper = Wrappers.<WbsParam>query().lambda().eq(WbsParam::getType, 0);
         List<WbsParamBean> list = new ArrayList<>();
-        List<WbsParam> data =  this.service.list(queryWrapper);
-        if(CollectionUtil.isNotEmpty(data)){
+        List<WbsParam> data = this.service.list(queryWrapper);
+        if (CollectionUtil.isNotEmpty(data)) {
             list = WbsParamWrapper.build().listVO(this.service.list(queryWrapper));
         }
         return R.data(list);
@@ -234,77 +237,80 @@ public class WbsParamController {
     @ApiOperation(value = "节点参数列表", notes = "节点参数列表")
     @GetMapping("/list")
     public R<List<WbsParamBean>> list3(@ApiParam(value = "wbs节点id", required = true) Long wbsId) {
-        LambdaQueryWrapper<WbsParam> queryWrapper = Wrappers.<WbsParam>query().lambda().eq(WbsParam::getNodeId,wbsId).eq(WbsParam::getType,1);
-        List<WbsParam> data =  this.service.list(queryWrapper);
-        if(CollectionUtil.isNotEmpty(data)){
-          return   R.data(WbsParamWrapper.build().listVO(this.service.list(queryWrapper)));
+        List<WbsParam> data = this.service.list(Wrappers.<WbsParam>lambdaQuery()
+                .select(WbsParam::getId, WbsParam::getName, WbsParam::getK, WbsParam::getV, WbsParam::getRemark, WbsParam::getNodeId, WbsParam::getProjectId)
+                .eq(WbsParam::getNodeId, wbsId)
+                .eq(WbsParam::getType, 1));
+        if (data.size() > 0) {
+            return R.data(BeanUtil.copyProperties(data, WbsParamBean.class));
         }
-        return R.data(Collections.emptyList());
+        return R.data(null);
     }
 
     @ApiOperationSupport(order = 7)
     @ApiOperation(value = "参数关联元素", notes = "参数关联元素")
     @GetMapping("/get-param-elements")
-    public R<List<Map<String,Object>>> associated(ParamSearch ps) {
+    public R<List<Map<String, Object>>> associated(ParamSearch ps) {
         /*R.data(listMap.stream().map(m->BeanUtil.toBean(m, TableElementParam.class)).collect(Collectors.toList()));*/
-        if(ParamSearch.WBS.equals(ps.getScopeType())){
-            return  R.data(this.jdbcTemplate.queryForList(
+        if (ParamSearch.WBS.equals(ps.getScopeType())) {
+            return R.data(this.jdbcTemplate.queryForList(
                     "select AA.id,AA.tableName,BB.elementName,BB.mappingId from " +
-                            "(select id ,node_name AS tableName from m_wbs_tree where  parent_id="+ps.getNodeId()+" and is_deleted=0) as AA" +
+                            "(select id ,node_name AS tableName from m_wbs_tree where  parent_id=" + ps.getNodeId() + " and is_deleted=0) as AA" +
                             " left join " +
                             "(select a.id as id, b.e_name as elementName ,c.id as mappingId,c.is_deleted " +
                             "from m_wbs_tree a " +
                             "inner join m_wbs_form_element b on b.f_id=a.init_table_id " +
                             "inner join  m_element_formula_mapping  c on c.element_id=b.id " +
-                            "where c.is_deleted=0 and a.is_deleted=0 and a.parent_id="+ps.getNodeId()+" and c.param_id ="+ps.getParamId()+")as BB " +
+                            "where c.is_deleted=0 and a.is_deleted=0 and a.parent_id=" + ps.getNodeId() + " and c.param_id =" + ps.getParamId() + ")as BB " +
                             "on AA.id=BB.id"));
-        }else if(ParamSearch.PRI.equals(ps.getScopeType())){
-           List<Map<String,Object>> listMaps=  this.jdbcTemplate.queryForList("select b.wbs_id wbsId from m_wbs_param a join m_wbs_tree_private b on a.node_id=b.p_key_id where a.id= "+ps.getParamId());
+        } else if (ParamSearch.PRI.equals(ps.getScopeType())) {
+            List<Map<String, Object>> listMaps = this.jdbcTemplate.queryForList("select b.wbs_id wbsId from m_wbs_param a join m_wbs_tree_private b on a.node_id=b.p_key_id where a.id= " + ps.getParamId());
             String wbsId = StringUtils.handleNull(listMaps.get(0).get("wbsId"));
             return R.data(this.jdbcTemplate.queryForList(
                     "select AA.id,AA.tableName,BB.elementName,BB.mappingId from (" +
-                    "        select id ,node_name AS tableName,init_table_id" +
-                    "        FROM m_wbs_tree_private AS wt" +
-                    "        WHERE type = 2" +
-                    "          AND is_deleted = 0" +
-                    "          AND parent_id = " +ps.getNodeId()+
-                    "          AND project_id = " +ps.getProjectId()+
-                    "          AND wbs_id= "+wbsId+
-                    "        ORDER BY wt.sort, wt.node_name, wt.create_time) as AA left join (select a.id as id, b.e_name as elementName ,c.id as mappingId,c.is_deleted from m_wbs_tree_private a inner join m_wbs_form_element b on b.f_id=a.init_table_id inner join  m_element_formula_mapping  c on c.element_id=b.id " +
-                            "where  a.project_id="+ps.getProjectId()+" and c.is_deleted=0 and a.is_deleted=0 and a.parent_id="+ps.getNodeId()+" and c.scope=35 and c.param_id ="+ps.getParamId()+" and a.wbs_id="+wbsId+" )as BB on AA.id=BB.id"));
+                            "        select id ,node_name AS tableName,init_table_id" +
+                            "        FROM m_wbs_tree_private AS wt" +
+                            "        WHERE type = 2" +
+                            "          AND is_deleted = 0" +
+                            "          AND parent_id = " + ps.getNodeId() +
+                            "          AND project_id = " + ps.getProjectId() +
+                            "          AND wbs_id= " + wbsId +
+                            "        ORDER BY wt.sort, wt.node_name, wt.create_time) as AA left join (select a.id as id, b.e_name as elementName ,c.id as mappingId,c.is_deleted from m_wbs_tree_private a inner join m_wbs_form_element b on b.f_id=a.init_table_id inner join  m_element_formula_mapping  c on c.element_id=b.id " +
+                            "where  a.project_id=" + ps.getProjectId() + " and c.is_deleted=0 and a.is_deleted=0 and a.parent_id=" + ps.getNodeId() + " and c.scope=35 and c.param_id =" + ps.getParamId() + " and a.wbs_id=" + wbsId + " )as BB on AA.id=BB.id"));
         }
         return R.fail("暂无数据");
     }
+
     @ApiOperationSupport(order = 8)
     @ApiOperation(value = "解除参数关联元素", notes = "解除参数关联元素")
     @GetMapping("/del-param-elements")
     public R<Boolean> disassociate(@ApiParam(value = "关联id", required = true) Long mappingId) {
-         return R.status(this.elementFormulaMappingService.deleteLogic(Collections.singletonList(mappingId)));
+        return R.status(this.elementFormulaMappingService.deleteLogic(Collections.singletonList(mappingId)));
     }
 
     @ApiOperationSupport(order = 8)
     @ApiOperation(value = "指定关联元素", notes = "指定关联元素")
     @PostMapping("/specified-param-elements")
-    public R<Boolean> specified(@ApiParam(value = "关联id", required = true) Long paramId,Long elementId) {
+    public R<Boolean> specified(@ApiParam(value = "关联id", required = true) Long paramId, Long elementId) {
         /*先删旧关联,检查是否存在公式,没有就新增 再增新关联*/
-        this.jdbcTemplate.execute("update m_element_formula_mapping set is_deleted=1 where element_id="+elementId+" and param_id="+paramId);
-        Formula formula= this.formulaService.getOne(Wrappers.<Formula>lambdaQuery().eq(Formula::getParamId,paramId));
-        if(formula==null){
-            Map<String,Object> tmpMap=new HashMap<>();
-            formula=new Formula();
+        this.jdbcTemplate.execute("update m_element_formula_mapping set is_deleted=1 where element_id=" + elementId + " and param_id=" + paramId);
+        Formula formula = this.formulaService.getOne(Wrappers.<Formula>lambdaQuery().eq(Formula::getParamId, paramId));
+        if (formula == null) {
+            Map<String, Object> tmpMap = new HashMap<>();
+            formula = new Formula();
             WbsParam param = this.service.getById(paramId);
             formula.setOutm(Formula.FULL);
             formula.setParamId(param.getId());
-            Map<String,String> keyMap= new HashMap<>();
-            keyMap.put("name",param.getName());
-            keyMap.put("id",param.getId().toString());
-            tmpMap.put(param.getK(),keyMap);
-            if(RegexUtil.match(ParamElements.LEVEL_REG,param.getV().trim())){
+            Map<String, String> keyMap = new HashMap<>();
+            keyMap.put("name", param.getName());
+            keyMap.put("id", param.getId().toString());
+            tmpMap.put(param.getK(), keyMap);
+            if (RegexUtil.match(ParamElements.LEVEL_REG, param.getV().trim())) {
                 /*取层级*/
-                formula.setFormula("FC.tree(trees,WP["+param.getK()+"])");
-            }else{
+                formula.setFormula("FC.tree(trees,WP[" + param.getK() + "])");
+            } else {
                 /*直接取数*/
-                formula.setFormula("WP["+param.getK()+"]");
+                formula.setFormula("WP[" + param.getK() + "]");
             }
             formula.setMap(JSON.toJSONString(tmpMap));
             this.formulaService.save(formula);
@@ -314,68 +320,68 @@ public class WbsParamController {
         efm.setParamId(paramId);
         efm.setElementId(elementId);
         efm.setFormulaId(formula.getId());
-       return   R.status(this.elementFormulaMappingService.save(efm));
+        return R.status(this.elementFormulaMappingService.save(efm));
     }
 
     @GetMapping("/refresh")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "刷新当前节点的节点参数", notes = "刷新当前节点的节点参数")
-    public R refresh(Long nodeId,Integer type,Long projectId) {
+    public R refresh(Long nodeId, Integer type, Long projectId) {
         try {
             /*先查出所有的节点参数*/
-            List<WbsParam> paramList=  this.service.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId,nodeId));
-            if(Func.isNotEmpty(paramList)){
-                List<Map<String,Object>> elementMap=new ArrayList<>();
+            List<WbsParam> paramList = this.service.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId, nodeId));
+            if (Func.isNotEmpty(paramList)) {
+                List<Map<String, Object>> elementMap = new ArrayList<>();
                 /*当前节点所包含的所有元素*/
-                if(StringUtils.isEquals(0,type)){
+                if (StringUtils.isEquals(0, type)) {
                     /*wbs*/
-                    elementMap= this.jdbcTemplate.queryForList(
+                    elementMap = this.jdbcTemplate.queryForList(
                             "select a.e_name as name ,a.id " +
                                     "from m_wbs_form_element a " +
                                     "inner join m_wbs_tree b on a.f_id=b.init_table_id " +
                                     "inner join m_wbs_tree c on b.parent_id=c.id " +
-                                    "where a.is_deleted=0 and c.id="+nodeId
+                                    "where a.is_deleted=0 and c.id=" + nodeId
                     );
-                }else{
+                } else {
                     /*project*/
-                    elementMap= this.jdbcTemplate.queryForList(
+                    elementMap = this.jdbcTemplate.queryForList(
                             "select c.e_name as name ,c.id from m_wbs_tree_private a " +
                                     "inner join m_wbs_tree_private b on (a.id=b.parent_id and a.wbs_id=b.wbs_id) " +
                                     "inner join m_wbs_form_element c on  b.init_table_id=c.f_id " +
-                                    "where  b.project_id="+projectId+" and a.p_key_id="+nodeId+"  and b.is_deleted=0 and c.is_deleted=0 ");
+                                    "where  b.project_id=" + projectId + " and a.p_key_id=" + nodeId + "  and b.is_deleted=0 and c.is_deleted=0 ");
                 }
 
-                List<Long> longList=this.jdbcTemplate.queryForList("select element_id from m_element_formula_mapping where is_deleted=0 and scope=35 and param_id in("+paramList.stream().map(WbsParam::getId).map(String::valueOf).collect(Collectors.joining(","))+")",Long.class);
-                if(Func.isNotEmpty(elementMap)){
-                    Map<String,Object> tmpMap=new HashMap<>();
+                List<Long> longList = this.jdbcTemplate.queryForList("select element_id from m_element_formula_mapping where is_deleted=0 and scope=35 and param_id in(" + paramList.stream().map(WbsParam::getId).map(String::valueOf).collect(Collectors.joining(",")) + ")", Long.class);
+                if (Func.isNotEmpty(elementMap)) {
+                    Map<String, Object> tmpMap = new HashMap<>();
                     List<Map<String, Object>> finalElementMap = elementMap;
-                    paramList.forEach(e->{
-                        Formula formula = this.formulaService.getOne(Wrappers.<Formula>lambdaQuery().eq(Formula::getParamId,e.getId()));
-                        if(formula==null){
-                            formula=new Formula();
+                    paramList.forEach(e -> {
+                        Formula formula = this.formulaService.getOne(Wrappers.<Formula>lambdaQuery().eq(Formula::getParamId, e.getId()));
+                        if (formula == null) {
+                            formula = new Formula();
                             formula.setOutm(Formula.FULL);
                             formula.setParamId(e.getId());
-                            Map<String,String> keyMap= new HashMap<>();
-                            keyMap.put("name",e.getName());
-                            keyMap.put("id",e.getId().toString());
-                            tmpMap.put(e.getK(),keyMap);
-                            if(RegexUtil.match(ParamElements.LEVEL_REG,e.getV().trim())){
+                            Map<String, String> keyMap = new HashMap<>();
+                            keyMap.put("name", e.getName());
+                            keyMap.put("id", e.getId().toString());
+                            tmpMap.put(e.getK(), keyMap);
+                            if (RegexUtil.match(ParamElements.LEVEL_REG, e.getV().trim())) {
                                 /*取层级*/
-                                formula.setFormula("FC.tree(trees,WP["+e.getK()+"])");
-                            }else{
+                                formula.setFormula("FC.tree(trees,WP[" + e.getK() + "])");
+                            } else {
                                 /*直接取数*/
-                                formula.setFormula("WP["+e.getK()+"]");
+                                formula.setFormula("WP[" + e.getK() + "]");
                             }
                             formula.setMap(JSON.toJSONString(tmpMap));
                             this.formulaService.save(formula);
                             tmpMap.clear();
                         }
                         Formula finalFormula = formula;
-                        String name=e.getName().replace("【水】","").trim();
-                        finalElementMap.forEach(m->{
-                            if(StringUtils.handleNull(m.get("name")).contains(name)){
+                        String name = e.getName().replace("【水】", "").trim();
+                        finalElementMap.forEach(m -> {
+                            if (StringUtils.handleNull(m.get("name")).contains(name)) {
                                 /*匹配名称,且该元素没有绑定任何节点参数公式*/
-                                if(longList.stream().noneMatch(k->StringUtils.isEquals(k,m.get("id")))){
+                                if (longList.stream().noneMatch(k -> StringUtils.isEquals(k, m.get("id")))) {
                                     ElementFormulaMapping efm = new ElementFormulaMapping();
                                     efm.setScope(FormulaBean.PARAM);
                                     efm.setParamId(e.getId());
@@ -390,7 +396,7 @@ public class WbsParamController {
             }
 
             return R.success("操作成功");
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             return R.fail("操作失败");
         }

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

@@ -17,6 +17,7 @@
 package org.springblade.manager.mapper;
 
 
+import org.apache.ibatis.annotations.MapKey;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.vo.ArchiveTreeContractVO;
@@ -26,6 +27,7 @@ import org.springblade.manager.vo.ArchiveTreeContractVO2;
 import org.springblade.manager.vo.ArchiveTreeVO;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  *  Mapper 接口
@@ -72,4 +74,7 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
 	List<ArchiveTreeContract> getListByProjectId(@Param("projectId")Long projectId);
 
 	List<ArchiveTreeContract> getSelectNodeByGroupId(@Param("projectId") Long projectId,@Param("archiveAutoGroupId") Long archiveAutoGroupId);
+
+	@MapKey("id")
+	List<Map<String, Object>> getArchiveTreeAndArchiveCount(@Param("projectId") Long projectId,@Param("nodeId") Long nodeId);
 }

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

@@ -351,5 +351,22 @@
           AND archive_auto_group_id =#{archiveAutoGroupId}
         order by tree_sort asc
     </select>
+    <select id="getArchiveTreeAndArchiveCount" resultType="java.util.Map">
+        SELECT
+            matc1.id as id,
+            matc1.node_name as name,
+            (SELECT COUNT(*)
+             FROM u_archives_auto uaa1
+             WHERE  uaa1.is_deleted =0 and (uaa1.node_id in
+                 (select id from m_archive_tree_contract matc2 WHERE matc2.project_id = #{projectId} and matc2.ancestors like CONCAT('%',matc1.id,'%')) or uaa1.node_id = matc1.id)
+            ) as 'auto',
+            (SELECT COUNT(*)
+             FROM u_archives_auto uaa1
+             WHERE  uaa1.is_deleted =1 and (uaa1.node_id in
+                (select id from m_archive_tree_contract matc2 WHERE matc2.project_id = #{projectId} and matc2.ancestors like CONCAT('%',matc1.id,'%')) or uaa1.node_id = matc1.id)
+            ) as 'deleted',
+            if((SELECT COUNT(*) from m_archive_tree_contract matc WHERE parent_id = matc1.id)=0,false,true) as hasChildren
+        FROM m_archive_tree_contract matc1 WHERE matc1.project_id =#{projectId} and matc1.parent_id = #{nodeId}
+    </select>
 
 </mapper>

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

@@ -92,4 +92,6 @@ public interface IArchiveTreeContractService extends BaseService<ArchiveTreeCont
 
 	void  fillDefaultArchiveAutoInfo(List<ArchiveTreeContract> archiveTreeContracts);
 
+	List<Map<String,Object>> getArchiveTreeAndArchiveCount(Long projectId,Long nodeId);
+
 }

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

@@ -849,10 +849,10 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		}
 	}
 
-
-
-
-
+	@Override
+	public List<Map<String, Object>> getArchiveTreeAndArchiveCount(Long projectId,Long nodeId) {
+		return baseMapper.getArchiveTreeAndArchiveCount(projectId,nodeId);
+	}
 
 
 }

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

@@ -111,6 +111,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         //TODO ---------节点未变只同步元素表---------
         if (saveIds.size() == 0 && delIds.size() == 0) {
             List<WbsTreePrivate> wbsTreePrivateListResult = new ArrayList<>();
+            //当前合同段所有表
             List<WbsTreePrivate> wbsTreePrivateList = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
                     .eq(WbsTreePrivate::getProjectId, Long.parseLong(pawDTO.getProjectId()))
                     .eq(WbsTreePrivate::getWbsId, Long.parseLong(pawDTO.getWbsId()))
@@ -152,7 +153,38 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                     }
                 }
             });
+
+            //获取当前合同段的复制节点或者新增节点
+            List<WbsTreeContract> copyAndAddNodeList = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                    .select(WbsTreeContract::getId, WbsTreeContract::getOldId)
+                    .eq(WbsTreeContract::getContractId, pawDTO.getContractId())
+                    .eq(WbsTreeContract::getWbsId, pawDTO.getWbsId())
+                    .eq(WbsTreeContract::getStatus, 1)
+                    .isNotNull(WbsTreeContract::getOldId));
+
+            List<WbsTreeContract> copyAddNodeTabs = new ArrayList<>();
+            if (copyAndAddNodeList.size() > 0) {
+                for (WbsTreeContract synTab : wbsTreeContractResultData) {
+                    for (WbsTreeContract copyAddNode : copyAndAddNodeList) {
+                        if (synTab.getParentId().toString().equals(copyAddNode.getOldId())) {
+                            WbsTreeContract copyAddNodeTab = BeanUtil.copyProperties(synTab, WbsTreeContract.class);
+                            if (copyAddNodeTab != null) {
+                                copyAddNodeTab.setParentId(copyAddNode.getId());
+                                copyAddNodeTab.setAncestors(synTab.getAncestors().replace(synTab.getParentId() + "", copyAddNodeTab.getParentId() + ""));
+                                copyAddNodeTab.setPKeyId(SnowFlakeUtil.getId());
+                                copyAddNodeTab.setCreateTime(new Date());
+                                copyAddNodeTabs.add(copyAddNodeTab);
+                            }
+                        }
+                    }
+                }
+            }
+
             if (wbsTreeContractResultData.size() > 0) {
+                if (copyAddNodeTabs.size() > 0) {
+                    //新增复制节点的表
+                    wbsTreeContractResultData.addAll(copyAddNodeTabs);
+                }
                 this.insertBatch(wbsTreeContractResultData, 1000);
             }
 

+ 234 - 501
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -45,8 +45,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -68,8 +67,8 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     private final TextdictInfoServiceImpl textDictInfoService;
     private final InformationQueryClient informationQueryClient;
 
-    @Resource(name = "taskExecutor1")
-    private final ThreadPoolExecutor executor;
+    //创建线程池任务
+    private final ExecutorService executor = Executors.newFixedThreadPool(4);
 
     @Override
     public List<WbsTreePrivateVO> tree(String wbsId, String projectId) {
@@ -598,218 +597,245 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     @Override
     public boolean syncNodeParam(String projectId) {
         if (StringUtils.isNotEmpty(projectId)) {
-            //获取项目节点树
+            //结果集
+            List<WbsParam> updateList = new ArrayList<>();
+            List<WbsParam> insertList = new ArrayList<>();
+
+            //获取项目节点树、包括试验、资料填报
             List<WbsTreePrivate> wbsTreePrivateAllNow = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
                     .select(WbsTreePrivate::getPKeyId, WbsTreePrivate::getId, WbsTreePrivate::getWbsId)
-                    .eq(WbsTreePrivate::getProjectId, projectId).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1));
-            String wbsId = wbsTreePrivateAllNow.stream().map(WbsTreePrivate::getWbsId).findAny().orElse(null);
-            if (StringUtils.isNotEmpty(wbsId)) {
-                List<WbsParamVO> paramListData = new ArrayList<>();
-                //获取公有树
-                Map<Long, WbsTree> treePublicNodeAll = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
-                        .select(WbsTree::getId)
-                        .eq(WbsTree::getWbsId, wbsId).eq(WbsTree::getStatus, 1)
-                        .eq(WbsTree::getType, 1))
-                        .stream().collect(Collectors.toMap(WbsTree::getId, Function.identity()));
-
-                if (treePublicNodeAll.size() > 0) {
-                    //TODO ---------公有引用同步---------
-                    Map<String, Long> map = new HashMap<>();
-                    for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateAllNow) {
-                        WbsTree wbsTree = treePublicNodeAll.get(wbsTreePrivate.getId());
-                        if (wbsTree != null) {
-                            map.put(wbsTreePrivate.getPKeyId() + "," + wbsTree.getId(), wbsTree.getId());
+                    .eq(WbsTreePrivate::getProjectId, projectId)
+                    .eq(WbsTreePrivate::getStatus, 1)
+                    .eq(WbsTreePrivate::getType, 1)
+                    .in(WbsTreePrivate::getWbsType, Arrays.asList(1, 2)));
+
+            Map<String, List<String>> collect = wbsTreePrivateAllNow.stream().map(WbsTreePrivate::getWbsId).collect(Collectors.groupingBy(Object::toString));
+            for (Map.Entry<String, List<String>> wbsIds : collect.entrySet()) {
+                String wbsId = wbsIds.getKey();
+                if (StringUtils.isNotEmpty(wbsId)) {
+                    List<WbsParamVO> paramListData = new ArrayList<>();
+                    //获取公有树
+                    Map<Long, WbsTree> treePublicNodeAll = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+                            .select(WbsTree::getId)
+                            .eq(WbsTree::getWbsId, wbsId)
+                            .eq(WbsTree::getStatus, 1)
+                            .eq(WbsTree::getType, 1))
+                            .stream().collect(Collectors.toMap(WbsTree::getId, Function.identity()));
+
+                    if (treePublicNodeAll.size() > 0) {
+                        //TODO ---------公有引用同步---------
+                        Map<String, Long> map = new HashMap<>();
+                        for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateAllNow) {
+                            WbsTree wbsTree = treePublicNodeAll.get(wbsTreePrivate.getId());
+                            if (wbsTree != null) {
+                                map.put(wbsTreePrivate.getPKeyId() + "," + wbsTree.getId(), wbsTree.getId());
+                            }
                         }
-                    }
 
-                    Set<String> keyIds = map.keySet();
-                    List<Long> wbsTreeIds = new ArrayList<>(map.values());
-                    List<WbsParam> wbsParamList = new ArrayList<>();
-                    //分组查询
-                    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, ",") + ")";
-                        List<WbsParam> wbsParams = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsParam.class));
-                        wbsParamList.addAll(wbsParams);
-                    }
+                        Set<String> keyIds = map.keySet();
+                        List<Long> wbsTreeIds = new ArrayList<>(map.values());
+                        List<WbsParam> wbsParamList = new ArrayList<>();
+                        //分组查询
+                        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, ",") + ")";
+                            List<WbsParam> wbsParams = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsParam.class));
+                            wbsParamList.addAll(wbsParams);
+                        }
 
-                    for (String ids : keyIds) {
-                        String nodePKeyIdNow = ids.split(",")[0];
-                        String nodeIdOld = ids.split(",")[1];
-                        List<WbsParam> wbsParams = wbsParamList.stream().filter(f -> ObjectUtils.isNotEmpty(f.getNodeId()) && f.getNodeId().toString().equals(nodeIdOld)).collect(Collectors.toList());
-                        //获取引用的节点参数
-                        if (wbsParams.size() > 0) {
-                            for (WbsParam wbsParam : wbsParams) {
-                                WbsParamVO param = BeanUtil.copyProperties(wbsParam, WbsParamVO.class);
-                                if (param != null) {
-                                    param.setProjectId(Long.parseLong(projectId));
-                                    param.setId(SnowFlakeUtil.getId());
-                                    param.setNodeId(Long.parseLong(nodePKeyIdNow));
-                                    param.setOldId(wbsParam.getId());
-                                    param.setType(1);
-                                    param.setStatus(1);
-                                    param.setIsDeleted(0);
-                                    paramListData.add(param);
+                        for (String ids : keyIds) {
+                            String nodePKeyIdNow = ids.split(",")[0];
+                            String nodeIdOld = ids.split(",")[1];
+                            List<WbsParam> wbsParams = wbsParamList.stream().filter(f -> ObjectUtils.isNotEmpty(f.getNodeId()) && f.getNodeId().toString().equals(nodeIdOld)).collect(Collectors.toList());
+                            //获取引用的节点参数
+                            if (wbsParams.size() > 0) {
+                                for (WbsParam wbsParam : wbsParams) {
+                                    WbsParamVO param = BeanUtil.copyProperties(wbsParam, WbsParamVO.class);
+                                    if (param != null) {
+                                        param.setProjectId(Long.parseLong(projectId));
+                                        param.setId(SnowFlakeUtil.getId());
+                                        param.setNodeId(Long.parseLong(nodePKeyIdNow));
+                                        param.setOldId(wbsParam.getId());
+                                        param.setType(1);
+                                        param.setStatus(1);
+                                        param.setIsDeleted(0);
+                                        paramListData.add(param);
+                                    }
                                 }
                             }
                         }
-                    }
 
 
-                } else {
-                    //TODO ---------私有引用同步---------
-                    Map<String, Long> map = new HashMap<>();
-                    WbsTreePrivate treePrivateRootNode = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
-                            .select(WbsTreePrivate::getWbsId, WbsTreePrivate::getProjectId)
-                            .eq(WbsTreePrivate::getPKeyId, wbsId).eq(WbsTreePrivate::getParentId, 0L).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1));
-
-                    Map<Long, WbsTreePrivate> treePrivateNodeAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                            .select(WbsTreePrivate::getPKeyId, WbsTreePrivate::getId)
-                            .eq(WbsTreePrivate::getWbsId, treePrivateRootNode.getWbsId()).eq(WbsTreePrivate::getProjectId, treePrivateRootNode.getProjectId())
-                            .eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1)).stream().collect(Collectors.toMap(WbsTreePrivate::getId, Function.identity()));
-
-                    for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateAllNow) {
-                        WbsTreePrivate wbsTreePrivateYS = treePrivateNodeAll.get(wbsTreePrivate.getId());
-                        if (wbsTreePrivateYS != null) {
-                            map.put(wbsTreePrivate.getPKeyId() + "," + wbsTreePrivateYS.getPKeyId(), wbsTreePrivateYS.getPKeyId());
+                    } else {
+                        //TODO ---------私有引用同步---------
+                        Map<String, Long> map = new HashMap<>();
+                        WbsTreePrivate treePrivateRootNode = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
+                                .select(WbsTreePrivate::getWbsId, WbsTreePrivate::getProjectId)
+                                .eq(WbsTreePrivate::getPKeyId, wbsId).eq(WbsTreePrivate::getParentId, 0L).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1));
+
+                        Map<Long, WbsTreePrivate> treePrivateNodeAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                                .select(WbsTreePrivate::getPKeyId, WbsTreePrivate::getId)
+                                .eq(WbsTreePrivate::getWbsId, treePrivateRootNode.getWbsId()).eq(WbsTreePrivate::getProjectId, treePrivateRootNode.getProjectId())
+                                .eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1)).stream().collect(Collectors.toMap(WbsTreePrivate::getId, Function.identity()));
+
+                        for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateAllNow) {
+                            WbsTreePrivate wbsTreePrivateYS = treePrivateNodeAll.get(wbsTreePrivate.getId());
+                            if (wbsTreePrivateYS != null) {
+                                map.put(wbsTreePrivate.getPKeyId() + "," + wbsTreePrivateYS.getPKeyId(), wbsTreePrivateYS.getPKeyId());
+                            }
                         }
-                    }
 
-                    Set<String> keyIds = map.keySet();
-                    List<Long> wbsTreeIds = new ArrayList<>(map.values());
-                    List<WbsParam> wbsParamList = new ArrayList<>();
-                    //分组查询
-                    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, ",") + ")";
-                        List<WbsParam> wbsParams = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsParam.class));
-                        wbsParamList.addAll(wbsParams);
-                    }
+                        Set<String> keyIds = map.keySet();
+                        List<Long> wbsTreeIds = new ArrayList<>(map.values());
+                        List<WbsParam> wbsParamList = new ArrayList<>();
+                        //分组查询
+                        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, ",") + ")";
+                            List<WbsParam> wbsParams = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsParam.class));
+                            wbsParamList.addAll(wbsParams);
+                        }
 
-                    for (String ids : keyIds) {
-                        String nodePKeyIdNow = ids.split(",")[0];
-                        String nodePKeyIdYs = ids.split(",")[1];
-                        List<WbsParam> wbsParams = wbsParamList.stream().filter(f -> ObjectUtils.isNotEmpty(f.getNodeId()) && f.getNodeId().toString().equals(nodePKeyIdYs)).collect(Collectors.toList());
-                        //获取引用的节点参数
-                        if (wbsParams.size() > 0) {
-                            for (WbsParam wbsParam : wbsParams) {
-                                WbsParamVO param = BeanUtil.copyProperties(wbsParam, WbsParamVO.class);
-                                if (param != null) {
-                                    param.setProjectId(Long.parseLong(projectId));
-                                    param.setId(SnowFlakeUtil.getId());
-                                    param.setNodeId(Long.parseLong(nodePKeyIdNow));
-                                    param.setOldId(wbsParam.getId());
-                                    param.setType(1);
-                                    param.setStatus(1);
-                                    param.setIsDeleted(0);
-                                    paramListData.add(param);
+                        for (String ids : keyIds) {
+                            String nodePKeyIdNow = ids.split(",")[0];
+                            String nodePKeyIdYs = ids.split(",")[1];
+                            List<WbsParam> wbsParams = wbsParamList.stream().filter(f -> ObjectUtils.isNotEmpty(f.getNodeId()) && f.getNodeId().toString().equals(nodePKeyIdYs)).collect(Collectors.toList());
+                            //获取引用的节点参数
+                            if (wbsParams.size() > 0) {
+                                for (WbsParam wbsParam : wbsParams) {
+                                    WbsParamVO param = BeanUtil.copyProperties(wbsParam, WbsParamVO.class);
+                                    if (param != null) {
+                                        param.setProjectId(Long.parseLong(projectId));
+                                        param.setId(SnowFlakeUtil.getId());
+                                        param.setNodeId(Long.parseLong(nodePKeyIdNow));
+                                        param.setOldId(wbsParam.getId());
+                                        param.setType(1);
+                                        param.setStatus(1);
+                                        param.setIsDeleted(0);
+                                        paramListData.add(param);
+                                    }
                                 }
                             }
                         }
                     }
-                }
 
-                List<WbsParam> updateList = new ArrayList<>();
-                List<WbsParam> insertList = new ArrayList<>();
-                List<WbsParam> paramListOldAll = new ArrayList<>();
+                    List<WbsParam> paramListOldAll = new ArrayList<>();
 
-                List<Long> oldIds = paramListData.stream().map(WbsParamVO::getOldId).distinct().collect(Collectors.toList());
-                //分组查询
-                List<List<Long>> partition = Lists.partition(oldIds, 1000);
-                for (List<Long> ids : partition) {
-                    String sql1 = "select id,name,k,v,node_id,remark from m_wbs_param where id in( " + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
-                    List<WbsParam> query = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(WbsParam.class));
-                    paramListOldAll.addAll(query);
-                }
-
-                //转换为map
-                Map<Long, WbsParam> mapOld = paramListOldAll.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)));
-
-                //判断是否存在
-                Iterator<WbsParamVO> iterator = paramListData.iterator();
-                while (iterator.hasNext()) {
-                    WbsParamVO next = iterator.next();
-
-                    //获取引用的节点上的源参数信息
-                    WbsParam oldObj = mapOld.get(next.getOldId());
-                    //获取被引用的节点上的现参数信息
-                    WbsParam newObj = paramListNow.stream().filter(f -> f.getK().equals(next.getK())
-                            && f.getV().equals(next.getV())
-                            && f.getName().equals(next.getName())
-                            && f.getRemark().equals(next.getRemark())
-                            && f.getNodeId().equals(next.getNodeId())
-                    ).findAny().orElse(null);
-
-                    if (oldObj != null && newObj != null) {
-                        //如果源节点参数与现节点参数名称、K、V、备注一致,那么就跳过
-                        if (oldObj.getName().equals(newObj.getName()) && oldObj.getK().equals(newObj.getK()) && oldObj.getV().equals(newObj.getV()) && oldObj.getRemark().equals(newObj.getRemark())) {
-                            iterator.remove();
-
-                            //如果源节点参数与现节点参数名称、K一致,V、备注不一致,那么就修改当前名称下的节点参数
-                        } else if (oldObj.getName().equals(newObj.getName()) && oldObj.getK().equals(newObj.getK()) && (!oldObj.getV().equals(newObj.getV()) || !oldObj.getRemark().equals(newObj.getRemark()))) {
-                            newObj.setProjectId(Long.parseLong(projectId));
-                            newObj.setName(oldObj.getName());
-                            newObj.setK(oldObj.getK());
-                            newObj.setV(oldObj.getV());
-                            newObj.setRemark(oldObj.getRemark());
-                            newObj.setType(1);
-                            newObj.setStatus(1);
-                            newObj.setIsDeleted(0);
-                            updateList.add(newObj);
-
-                            //如果源节点参数与现节点参数名称不一致,那么新增
-                        } else if (!oldObj.getName().equals(newObj.getName())) {
-                            insertList.add(next);
-                        }
+                    List<Long> oldIds = paramListData.stream().map(WbsParamVO::getOldId).distinct().collect(Collectors.toList());
+                    //分组查询
+                    List<List<Long>> partition = Lists.partition(oldIds, 1000);
+                    for (List<Long> ids : partition) {
+                        String sql1 = "select id,name,k,v,node_id,remark from m_wbs_param where id in( " + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
+                        List<WbsParam> query = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(WbsParam.class));
+                        paramListOldAll.addAll(query);
+                    }
 
-                    } else if (oldObj != null) {
-                        //二次过滤,节点名称、节点id相同,修改
-                        List<WbsParam> query = paramListNow.stream().filter(f -> f.getName().equals(next.getName())
+                    //转换为map
+                    Map<Long, WbsParam> mapOld = paramListOldAll.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)));
+
+                    //判断是否存在
+                    Iterator<WbsParamVO> iterator = paramListData.iterator();
+                    while (iterator.hasNext()) {
+                        WbsParamVO next = iterator.next();
+
+                        //获取引用的节点上的源参数信息
+                        WbsParam oldObj = mapOld.get(next.getOldId());
+                        //获取被引用的节点上的现参数信息
+                        WbsParam newObj = paramListNow.stream().filter(f -> f.getK().equals(next.getK())
+                                && f.getV().equals(next.getV())
+                                && f.getName().equals(next.getName())
+                                && f.getRemark().equals(next.getRemark())
                                 && f.getNodeId().equals(next.getNodeId())
-                        ).collect(Collectors.toList());
-
-                        if (query.size() > 0) {
-                            for (WbsParam wbsParam : query) {
-                                if (oldObj.getName().equals(wbsParam.getName())) {
-                                    //修改
-                                    wbsParam.setProjectId(Long.parseLong(projectId));
-                                    wbsParam.setName(next.getName());
-                                    wbsParam.setK(next.getK());
-                                    wbsParam.setV(next.getV());
-                                    wbsParam.setRemark(next.getRemark());
-                                    wbsParam.setType(1);
-                                    wbsParam.setStatus(1);
-                                    wbsParam.setIsDeleted(0);
-                                    updateList.add(wbsParam);
+                        ).findAny().orElse(null);
+
+                        if (oldObj != null && newObj != null) {
+                            //如果源节点参数与现节点参数名称、K、V、备注一致,那么就跳过
+                            if (oldObj.getName().equals(newObj.getName()) && oldObj.getK().equals(newObj.getK()) && oldObj.getV().equals(newObj.getV()) && oldObj.getRemark().equals(newObj.getRemark())) {
+                                iterator.remove();
+
+                                //如果源节点参数与现节点参数名称、K一致,V、备注不一致,那么就修改当前名称下的节点参数
+                            } else if (oldObj.getName().equals(newObj.getName()) && oldObj.getK().equals(newObj.getK()) && (!oldObj.getV().equals(newObj.getV()) || !oldObj.getRemark().equals(newObj.getRemark()))) {
+                                newObj.setProjectId(Long.parseLong(projectId));
+                                newObj.setName(oldObj.getName());
+                                newObj.setK(oldObj.getK());
+                                newObj.setV(oldObj.getV());
+                                newObj.setRemark(oldObj.getRemark());
+                                newObj.setType(1);
+                                newObj.setStatus(1);
+                                newObj.setIsDeleted(0);
+                                updateList.add(newObj);
+
+                                //如果源节点参数与现节点参数名称不一致,那么新增
+                            } else if (!oldObj.getName().equals(newObj.getName())) {
+                                insertList.add(next);
+                            }
+
+                        } else if (oldObj != null) {
+                            //二次过滤,节点名称、节点id相同,修改
+                            List<WbsParam> query = paramListNow.stream().filter(f -> f.getName().equals(next.getName())
+                                    && f.getNodeId().equals(next.getNodeId())
+                            ).collect(Collectors.toList());
+
+                            if (query.size() > 0) {
+                                for (WbsParam wbsParam : query) {
+                                    if (oldObj.getName().equals(wbsParam.getName())) {
+                                        //修改
+                                        wbsParam.setProjectId(Long.parseLong(projectId));
+                                        wbsParam.setName(next.getName());
+                                        wbsParam.setK(next.getK());
+                                        wbsParam.setV(next.getV());
+                                        wbsParam.setRemark(next.getRemark());
+                                        wbsParam.setType(1);
+                                        wbsParam.setStatus(1);
+                                        wbsParam.setIsDeleted(0);
+                                        updateList.add(wbsParam);
+                                    }
                                 }
+                            } else {
+                                //新增
+                                insertList.add(next);
                             }
-                        } else {
-                            //新增
-                            insertList.add(next);
                         }
-                    }
-
-                }
 
-                if (updateList.size() > 0) {
-                    this.wbsParamServiceImpl.updateBatchById(updateList, 1000);
+                    }
                 }
-                if (insertList.size() > 0) {
+            }
 
+            if (updateList.size() > 0) {
+                this.wbsParamServiceImpl.updateBatchById(updateList, 1000);
+            }
+            if (insertList.size() > 0) {
+                try {
                     List<List<WbsParam>> partition1 = Lists.partition(insertList, 1000);
-                    CompletableFuture<Void> handle = CompletableFuture.allOf(partition1.stream().map(addList ->
-                            CompletableFuture.runAsync(() -> {
-                                wbsParamServiceImpl.insertBatch(addList, 1000);
-                            }, executor)).toArray(CompletableFuture[]::new));
-                    handle.join();
+                    CompletionService<Void> completionService = new ExecutorCompletionService<>(executor);
+                    for (List<WbsParam> addList : partition1) {
+                        completionService.submit(() -> {
+                            wbsParamServiceImpl.insertBatch(addList, 1000);
+                            return null;
+                        });
+                    }
+                    for (int i = 0; i < partition1.size(); i++) {
+                        try {
+                            completionService.take().get();
+                        } catch (ExecutionException e) {
+                            // 异常处理
+                            e.printStackTrace();
+                        }
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                } finally {
+                    //释放线程
+                    executor.shutdown();
                 }
-                return true;
+
             }
+            return true;
         }
         return false;
     }
@@ -825,7 +851,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     .eq(ProjectInfo::getId, wbsTreePrivate.getProjectId()));
 
             List<WbsTreePrivate> insertDataPrivateList = new ArrayList<>();
-            //List<WbsTreeContract> insertDataContractList = new ArrayList<>();
 
             if (("1").equals(wbsTreePrivate.getWbsType())) {
                 if (("public").equals(projectInfo.getReferenceWbsTemplateType())) {
@@ -863,16 +888,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
-                    //获取当前项目下所有施工合同段id
-                    /*List<ContractInfo> contractInfos = contractInfoMapper.selectList(Wrappers.<ContractInfo>lambdaQuery()
-                            .select(ContractInfo::getId, ContractInfo::getContractType)
-                            .eq(ContractInfo::getPId, wbsTreePrivate.getProjectId()));
-
-                    //获取当前项目下所有合同段树
-                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreeContract::getStatus, 1));
-                    List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
-                    List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());*/
-
                     //构造
                     for (WbsTree tree : addPublicTables) {
                         WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
@@ -885,75 +900,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             dataPrivate.setInitTableId(tree.getInitTableId().toString());
                             //新增
                             insertDataPrivateList.add(dataPrivate);
-
-                            /*同步到该项目下所有合同段*/
-                            //找到当前新增成功的元素表
-                            /*for (ContractInfo contractInfo : contractInfos) {
-                                WbsTreeContract dataContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
-                                if (dataContract != null) {
-                                    Long idContract = SnowFlakeUtil.getId();
-                                    dataContract.setPKeyId(idContract);
-                                    dataContract.setContractType(contractInfo.getContractType());
-                                    dataContract.setWbsType(Integer.valueOf(dataPrivate.getWbsType()));
-                                    dataContract.setWbsId(dataPrivate.getWbsId());
-                                    dataContract.setContractId(String.valueOf(contractInfo.getId()));
-                                    dataContract.setFullName(dataContract.getNodeName());
-                                    dataContract.setIsBussShow(1);
-                                    if (dataPrivate.getType() == 2) {
-                                        dataContract.setIsTypePrivatePid(dataPrivate.getPKeyId());
-                                    }
-
-                                    //判断元素表是否存在合同段,存在则不新增;不存在则表示没被引用,新增
-                                    WbsTreeContract resultTreeContract = treeContractListAllTables.stream().filter(f ->
-                                            f.getId().equals(dataContract.getId())
-                                                    && f.getNodeName().equals(dataContract.getNodeName())
-                                                    && f.getWbsId().equals(dataContract.getWbsId())
-                                                    && f.getProjectId().equals(wbsTreePrivate.getProjectId())
-                                                    && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                    && f.getStatus().equals(1)
-                                    ).findAny().orElse(null);
-                                    if (resultTreeContract != null) {
-                                        continue;
-                                    }
-
-                                    //判断元素表在合同段wbs树中是否存在上级节点,存在则新增;不存在则不新增
-                                    WbsTreeContract dataContractParent = treeContractListAllNodes.stream().filter(f ->
-                                            f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                    && f.getProjectId().equals(dataContract.getProjectId())
-                                                    && f.getStatus().equals(1)
-                                                    && f.getType().equals(1)
-                                                    && f.getId().equals(dataContract.getParentId())
-                                    ).findAny().orElse(null);
-
-                                    if (dataContractParent != null) {
-                                        //新增
-                                        insertDataContractList.add(dataContract);
-
-                                        //获取上级父级节点同级别的复制或新增节点
-                                        List<WbsTreeContract> dataContractEquallyNodes = treeContractListAllNodes.stream().filter(f ->
-                                                (ObjectUtils.isNotEmpty(f.getOldId()) && f.getOldId().equals(String.valueOf(dataContractParent.getId())))
-                                                        && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                        && f.getWbsId().equals(dataContractParent.getWbsId())
-                                                        && f.getProjectId().equals(dataContractParent.getProjectId())
-                                                        && f.getStatus().equals(1)
-                                                        && f.getType().equals(1)
-                                        ).collect(Collectors.toList());
-
-                                        if (dataContractEquallyNodes.size() > 0) {
-                                            //将表单同步到复制或新增的节点下
-                                            for (WbsTreeContract treeContractCopy : dataContractEquallyNodes) {
-                                                WbsTreeContract dataContractCopyOrAdd = BeanUtil.copyProperties(dataContract, WbsTreeContract.class);
-                                                if (dataContractCopyOrAdd != null) {
-                                                    dataContractCopyOrAdd.setPKeyId(SnowFlakeUtil.getId());
-                                                    dataContractCopyOrAdd.setParentId(treeContractCopy.getId());
-
-                                                    insertDataContractList.add(dataContractCopyOrAdd);
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }*/
                         }
                     }
 
@@ -992,14 +938,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     List<WbsTreePrivate> addPrivateTables = addPrivateTable.stream().filter(node ->
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
-                    //获取当前项目下所有施工合同段id
-                    /*List<ContractInfo> contractInfos = contractInfoMapper.selectContractIdByProjectId(wbsTreePrivate.getProjectId());
-
-                    //获取当前项目下所有合同段树
-                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreeContract::getStatus, 1));
-                    List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
-                    List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());*/
-
                     //构造
                     for (WbsTreePrivate tree : addPrivateTables) {
                         WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
@@ -1010,73 +948,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
                             dataPrivate.setInitTableId(tree.getInitTableId());
                             insertDataPrivateList.add(dataPrivate);
-
-                            //同步到该项目下的所有合同段
-                            /*for (ContractInfo contractInfo : contractInfos) {
-                                WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
-                                if (wbsTreeContract != null) {
-                                    wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
-                                    wbsTreeContract.setWbsId(dataPrivate.getWbsId());
-                                    wbsTreeContract.setWbsType(Integer.valueOf(dataPrivate.getWbsType()));
-                                    wbsTreeContract.setProjectId(wbsTreePrivate.getProjectId());
-                                    wbsTreeContract.setContractType(contractInfo.getContractType());
-                                    wbsTreeContract.setContractId(String.valueOf(contractInfo.getId()));
-                                    wbsTreeContract.setIsBussShow(1);
-                                    if (dataPrivate.getType() == 2) {
-                                        wbsTreeContract.setIsTypePrivatePid(dataPrivate.getPKeyId());
-                                    }
-
-                                    //判断元素表是否存在合同段,存在则不新增;不存在则新增
-                                    WbsTreeContract resultTreeContract = treeContractListAllTables.stream().filter(f ->
-                                            f.getId().equals(wbsTreeContract.getId())
-                                                    && f.getNodeName().equals(wbsTreeContract.getNodeName())
-                                                    && f.getWbsId().equals(wbsTreeContract.getWbsId())
-                                                    && f.getProjectId().equals(wbsTreePrivate.getProjectId())
-                                                    && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                    && f.getStatus().equals(1)
-                                    ).findAny().orElse(null);
-                                    if (resultTreeContract != null) {
-                                        continue;
-                                    }
-
-                                    //判断元素表是否存在上级节点,存在则新增;不存在则表示没被引用,不新增
-                                    WbsTreeContract wbsTreeContract1 = treeContractListAllNodes.stream().filter(f ->
-                                            f.getContractId().equals(wbsTreeContract.getContractId())
-                                                    && f.getProjectId().equals(wbsTreeContract.getProjectId())
-                                                    && f.getWbsId().equals(wbsTreeContract.getWbsId())
-                                                    && f.getStatus().equals(1)
-                                                    && f.getType().equals(1)
-                                                    && f.getId().equals(wbsTreeContract.getParentId())
-                                    ).findAny().orElse(null);
-
-                                    if (wbsTreeContract1 != null) {
-                                        insertDataContractList.add(wbsTreeContract);
-
-                                        //获取上级父级节点同级别的复制或新增节点
-                                        List<WbsTreeContract> wbsTreeContracts2 = treeContractListAllNodes.stream().filter(f ->
-                                                (ObjectUtils.isNotEmpty(f.getOldId()) && f.getOldId().equals(String.valueOf(wbsTreeContract1.getId())))
-                                                        && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                        && f.getWbsId().equals(wbsTreePrivate.getWbsId())
-                                                        && f.getProjectId().equals(wbsTreePrivate.getProjectId())
-                                                        && f.getStatus().equals(1)
-                                                        && f.getType().equals(1)
-                                        ).collect(Collectors.toList());
-
-                                        if (wbsTreeContracts2.size() > 0) {
-                                            //将表单同步到复制或新增的节点下
-                                            for (WbsTreeContract treeContract : wbsTreeContracts2) {
-                                                WbsTreeContract wbsTreeContract2 = BeanUtil.copyProperties(wbsTreeContract, WbsTreeContract.class);
-                                                if (wbsTreeContract2 != null) {
-                                                    wbsTreeContract2.setPKeyId(SnowFlakeUtil.getId());
-                                                    wbsTreeContract2.setParentId(treeContract.getId());
-
-                                                    insertDataContractList.add(wbsTreeContract2);
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }*/
                         }
                     }
                 }
@@ -1114,14 +985,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
-                    //获取当前项目下所有施工合同段id
-                    /*List<ContractInfo> contractInfos = contractInfoMapper.selectList(Wrappers.<ContractInfo>query().lambda().eq(ContractInfo::getPId, wbsTreePrivate.getProjectId()));
-
-                    //获取当前项目下所有合同段树
-                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreeContract::getStatus, 1));
-                    List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
-                    List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());*/
-
                     //构造
                     for (WbsTree tree : addPublicTables) {
                         WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
@@ -1134,75 +997,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             dataPrivate.setInitTableId(ObjectUtils.isNotEmpty(tree.getInitTableId()) ? tree.getInitTableId().toString() : null);
                             //新增
                             insertDataPrivateList.add(dataPrivate);
-
-                            /*同步到该项目下所有合同段*/
-                            //找到当前新增成功的元素表
-                            /*for (ContractInfo contractInfo : contractInfos) {
-                                WbsTreeContract dataContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
-                                if (dataContract != null) {
-                                    Long idContract = SnowFlakeUtil.getId();
-                                    dataContract.setPKeyId(idContract);
-                                    dataContract.setContractType(contractInfo.getContractType());
-                                    dataContract.setWbsType(Integer.valueOf(dataPrivate.getWbsType()));
-                                    dataContract.setWbsId(dataPrivate.getWbsId());
-                                    dataContract.setContractId(String.valueOf(contractInfo.getId()));
-                                    dataContract.setFullName(dataContract.getNodeName());
-                                    dataContract.setIsBussShow(1);
-                                    if (dataPrivate.getType() == 2) {
-                                        dataContract.setIsTypePrivatePid(dataPrivate.getPKeyId());
-                                    }
-
-                                    //判断元素表是否存在合同段,存在则不新增;不存在则表示没被引用,新增
-                                    WbsTreeContract resultTreeContract = treeContractListAllTables.stream().filter(f ->
-                                            f.getId().equals(dataContract.getId())
-                                                    && f.getNodeName().equals(dataContract.getNodeName())
-                                                    && f.getWbsId().equals(dataContract.getWbsId())
-                                                    && f.getProjectId().equals(wbsTreePrivate.getProjectId())
-                                                    && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                    && f.getStatus().equals(1)
-                                    ).findAny().orElse(null);
-                                    if (resultTreeContract != null) {
-                                        continue;
-                                    }
-
-                                    //判断元素表在合同段wbs树中是否存在上级节点,存在则新增;不存在则不新增
-                                    WbsTreeContract dataContractParent = treeContractListAllNodes.stream().filter(f ->
-                                            f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                    && f.getProjectId().equals(dataContract.getProjectId())
-                                                    && f.getStatus().equals(1)
-                                                    && f.getType().equals(1)
-                                                    && f.getId().equals(dataContract.getParentId())
-                                    ).findAny().orElse(null);
-
-                                    if (dataContractParent != null) {
-                                        //新增
-                                        insertDataContractList.add(dataContract);
-
-                                        //获取上级父级节点同级别的复制或新增节点
-                                        List<WbsTreeContract> dataContractEquallyNodes = treeContractListAllNodes.stream().filter(f ->
-                                                (ObjectUtils.isNotEmpty(f.getOldId()) && f.getOldId().equals(String.valueOf(dataContractParent.getId())))
-                                                        && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                        && f.getWbsId().equals(dataContractParent.getWbsId())
-                                                        && f.getProjectId().equals(dataContractParent.getProjectId())
-                                                        && f.getStatus().equals(1)
-                                                        && f.getType().equals(1)
-                                        ).collect(Collectors.toList());
-
-                                        if (dataContractEquallyNodes.size() > 0) {
-                                            //将表单同步到复制或新增的节点下
-                                            for (WbsTreeContract treeContractCopy : dataContractEquallyNodes) {
-                                                WbsTreeContract dataContractCopyOrAdd = BeanUtil.copyProperties(dataContract, WbsTreeContract.class);
-                                                if (dataContractCopyOrAdd != null) {
-                                                    dataContractCopyOrAdd.setPKeyId(SnowFlakeUtil.getId());
-                                                    dataContractCopyOrAdd.setParentId(treeContractCopy.getId());
-
-                                                    insertDataContractList.add(dataContractCopyOrAdd);
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }*/
                         }
                     }
 
@@ -1239,14 +1033,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     List<WbsTreePrivate> addPrivateTables = addPrivateTable.stream().filter(node ->
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
-                    //获取当前项目下所有施工合同段id
-                    /*List<ContractInfo> contractInfos = contractInfoMapper.selectContractIdByProjectId(wbsTreePrivate.getProjectId());
-
-                    //获取当前项目下所有合同段树
-                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreeContract::getStatus, 1));
-                    List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
-                    List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());*/
-
                     //构造
                     for (WbsTreePrivate tree : addPrivateTables) {
                         WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
@@ -1258,73 +1044,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             dataPrivate.setInitTableId(ObjectUtils.isNotEmpty(tree.getInitTableId()) ? tree.getInitTableId() : null);
 
                             insertDataPrivateList.add(dataPrivate);
-
-                            //同步到该项目下的所有合同段
-                            /*for (ContractInfo contractInfo : contractInfos) {
-                                WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
-                                if (wbsTreeContract != null) {
-                                    wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
-                                    wbsTreeContract.setWbsId(dataPrivate.getWbsId());
-                                    wbsTreeContract.setWbsType(Integer.valueOf(dataPrivate.getWbsType()));
-                                    wbsTreeContract.setProjectId(wbsTreePrivate.getProjectId());
-                                    wbsTreeContract.setContractType(contractInfo.getContractType());
-                                    wbsTreeContract.setContractId(String.valueOf(contractInfo.getId()));
-                                    wbsTreeContract.setIsBussShow(1);
-                                    if (dataPrivate.getType() == 2) {
-                                        wbsTreeContract.setIsTypePrivatePid(dataPrivate.getPKeyId());
-                                    }
-
-                                    //判断元素表是否存在合同段,存在则不新增;不存在则新增
-                                    WbsTreeContract resultTreeContract = treeContractListAllTables.stream().filter(f ->
-                                            f.getId().equals(wbsTreeContract.getId())
-                                                    && f.getNodeName().equals(wbsTreeContract.getNodeName())
-                                                    && f.getWbsId().equals(wbsTreeContract.getWbsId())
-                                                    && f.getProjectId().equals(wbsTreePrivate.getProjectId())
-                                                    && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                    && f.getStatus().equals(1)
-                                    ).findAny().orElse(null);
-                                    if (resultTreeContract != null) {
-                                        continue;
-                                    }
-
-                                    //判断元素表是否存在上级节点,存在则新增;不存在则表示没被引用,不新增
-                                    WbsTreeContract wbsTreeContract1 = treeContractListAllNodes.stream().filter(f ->
-                                            f.getContractId().equals(wbsTreeContract.getContractId())
-                                                    && f.getProjectId().equals(wbsTreeContract.getProjectId())
-                                                    && f.getWbsId().equals(wbsTreeContract.getWbsId())
-                                                    && f.getStatus().equals(1)
-                                                    && f.getType().equals(1)
-                                                    && f.getId().equals(wbsTreeContract.getParentId())
-                                    ).findAny().orElse(null);
-
-                                    if (wbsTreeContract1 != null) {
-                                        insertDataContractList.add(wbsTreeContract);
-
-                                        //获取上级父级节点同级别的复制或新增节点
-                                        List<WbsTreeContract> wbsTreeContracts2 = treeContractListAllNodes.stream().filter(f ->
-                                                (ObjectUtils.isNotEmpty(f.getOldId()) && f.getOldId().equals(String.valueOf(wbsTreeContract1.getId())))
-                                                        && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                        && f.getWbsId().equals(wbsTreePrivate.getWbsId())
-                                                        && f.getProjectId().equals(wbsTreePrivate.getProjectId())
-                                                        && f.getStatus().equals(1)
-                                                        && f.getType().equals(1)
-                                        ).collect(Collectors.toList());
-
-                                        if (wbsTreeContracts2.size() > 0) {
-                                            //将表单同步到复制或新增的节点下
-                                            for (WbsTreeContract treeContract : wbsTreeContracts2) {
-                                                WbsTreeContract wbsTreeContract2 = BeanUtil.copyProperties(wbsTreeContract, WbsTreeContract.class);
-                                                if (wbsTreeContract2 != null) {
-                                                    wbsTreeContract2.setPKeyId(SnowFlakeUtil.getId());
-                                                    wbsTreeContract2.setParentId(treeContract.getId());
-
-                                                    insertDataContractList.add(wbsTreeContract2);
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }*/
                         }
                     }
                 }
@@ -1333,9 +1052,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             if (insertDataPrivateList.size() > 0) {
                 this.insertBatch(insertDataPrivateList, 1000);
             }
-            /*if (insertDataContractList.size() > 0) {
-                wbsTreeContractService.insertBatch(insertDataContractList, 1000);
-            }*/
             return true;
         }
         return false;
@@ -1432,12 +1148,29 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     jdbcTemplate.execute(delSql);
                 }
 
-                List<List<TextdictInfo>> partition1 = Lists.partition(insertData, 1000);
-                CompletableFuture<Void> handle = CompletableFuture.allOf(partition1.stream().map(addList ->
-                        CompletableFuture.runAsync(() -> {
+                try {
+                    List<List<TextdictInfo>> partition1 = Lists.partition(insertData, 1000);
+                    CompletionService<Void> completionService = new ExecutorCompletionService<>(executor);
+                    for (List<TextdictInfo> addList : partition1) {
+                        completionService.submit(() -> {
                             textDictInfoService.insertBatch(addList, 1000);
-                        }, executor)).toArray(CompletableFuture[]::new));
-                handle.join();
+                            return null;
+                        });
+                    }
+                    for (int i = 0; i < partition1.size(); i++) {
+                        try {
+                            completionService.take().get();
+                        } catch (ExecutionException e) {
+                            // 异常处理
+                            e.printStackTrace();
+                        }
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                } finally {
+                    //释放线程
+                    executor.shutdown();
+                }
 
                 return true;
             } else {

+ 47 - 16
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -37,8 +37,7 @@ import javax.annotation.Resource;
 import java.io.File;
 import java.io.IOException;
 import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -62,8 +61,8 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     private final JdbcTemplate jdbcTemplate;
     private final ITableInfoService tableInfoService;
 
-    @Resource(name = "taskExecutor1")
-    private final ThreadPoolExecutor executor;
+    //创建线程池任务
+    private final ExecutorService executor = Executors.newFixedThreadPool(4);
 
     @Override
     public IPage<WbsTreeVO> selectWbsTreePage(IPage<WbsTreeVO> page, WbsTreeVO wbsTree) {
@@ -802,13 +801,29 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     }
 
                     if (pawDTO.getReferenceType().equals("public")) {
-
-                        List<List<WbsTreePrivate>> partition1 = Lists.partition(insertData1, 1000);
-                        CompletableFuture<Void> handle = CompletableFuture.allOf(partition1.stream().map(addList ->
-                                CompletableFuture.runAsync(() -> {
+                        try {
+                            List<List<WbsTreePrivate>> partition1 = Lists.partition(insertData1, 1000);
+                            CompletionService<Void> completionService = new ExecutorCompletionService<>(executor);
+                            for (List<WbsTreePrivate> addList : partition1) {
+                                completionService.submit(() -> {
                                     wbsTreePrivateService.insertBatch(addList, 1000);
-                                }, executor)).toArray(CompletableFuture[]::new));
-                        handle.join();
+                                    return null;
+                                });
+                            }
+                            for (int i = 0; i < partition1.size(); i++) {
+                                try {
+                                    completionService.take().get();
+                                } catch (ExecutionException e) {
+                                    // 异常处理
+                                    e.printStackTrace();
+                                }
+                            }
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        } finally {
+                            //释放线程
+                            executor.shutdown();
+                        }
 
                         //修改状态
                         if (pawDTO.getWbsType() == 1) {
@@ -819,13 +834,29 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         }
 
                     } else if (pawDTO.getReferenceType().equals("private")) {
-
-                        List<List<WbsTreePrivate>> partition1 = Lists.partition(insertData2, 1000);
-                        CompletableFuture<Void> handle = CompletableFuture.allOf(partition1.stream().map(addList ->
-                                CompletableFuture.runAsync(() -> {
+                        try {
+                            List<List<WbsTreePrivate>> partition1 = Lists.partition(insertData2, 1000);
+                            CompletionService<Void> completionService = new ExecutorCompletionService<>(executor);
+                            for (List<WbsTreePrivate> addList : partition1) {
+                                completionService.submit(() -> {
                                     wbsTreePrivateService.insertBatch(addList, 1000);
-                                }, executor)).toArray(CompletableFuture[]::new));
-                        handle.join();
+                                    return null;
+                                });
+                            }
+                            for (int i = 0; i < partition1.size(); i++) {
+                                try {
+                                    completionService.take().get();
+                                } catch (ExecutionException e) {
+                                    // 异常处理
+                                    e.printStackTrace();
+                                }
+                            }
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        } finally {
+                            //释放线程
+                            executor.shutdown();
+                        }
 
                         //异步修改htmlUrl ,数据都在insertData2里
                         wbsTreePrivateService.batchResetHtmlUrl(insertData2);

+ 0 - 191
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ThreadPoolMonitor.java

@@ -1,191 +0,0 @@
-package org.springblade.manager.utils;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.*;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-
-public class ThreadPoolMonitor extends ThreadPoolExecutor {
-    private final Logger logger = LoggerFactory.getLogger(getClass());
-
-    /**
-     * ActiveCount
-     */
-    int ac = 0;
-
-    /**
-     * 当前所有线程消耗的时间
-     */
-    private AtomicLong totalCostTime = new AtomicLong();
-
-    /**
-     * 当前执行的线程总数
-     */
-    private AtomicLong totalTasks = new AtomicLong();
-
-    /**
-     * 线程池名称
-     */
-    private String poolName;
-
-    /**
-     * 最短 执行时间
-     */
-    private long minCostTime;
-
-    /**
-     * 最长执行时间
-     */
-    private long maxCostTime;
-
-
-    /**
-     * 保存任务开始执行的时间
-     */
-    private ThreadLocal<Long> startTime = new ThreadLocal<>();
-
-    public ThreadPoolMonitor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
-                             TimeUnit unit, BlockingQueue<Runnable> workQueue, String poolName) {
-        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
-                Executors.defaultThreadFactory(), poolName);
-    }
-
-    public ThreadPoolMonitor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
-                             TimeUnit unit, BlockingQueue<Runnable> workQueue,
-                             ThreadFactory threadFactory, String poolName) {
-        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
-        this.poolName = poolName;
-    }
-
-    public ThreadPoolMonitor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler, String poolName) {
-        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
-        this.poolName = poolName;
-    }
-
-    /**
-     * 线程池延迟关闭时(等待线程池里的任务都执行完毕),统计线程池情况
-     */
-    @Override
-    public void shutdown() {
-        // 统计已执行任务、正在执行任务、未执行任务数量
-        logger.info("{} Going to shutdown. Executed tasks: {}, Running tasks: {}, Pending tasks: {}",
-                this.poolName, this.getCompletedTaskCount(), this.getActiveCount(), this.getQueue().size());
-        super.shutdown();
-    }
-
-    @Override
-    public List<Runnable> shutdownNow() {
-        // 统计已执行任务、正在执行任务、未执行任务数量
-        logger.info("{} Going to immediately shutdown. Executed tasks: {}, Running tasks: {}, Pending tasks: {}",
-                this.poolName, this.getCompletedTaskCount(), this.getActiveCount(), this.getQueue().size());
-        return super.shutdownNow();
-    }
-
-    /**
-     * 任务执行之前,记录任务开始时间
-     */
-    @Override
-    protected void beforeExecute(Thread t, Runnable r) {
-        logger.info("{}-before: " +
-                        " PoolSize: {}, CorePoolSize: {}, ActiveCount: {}, " +
-                        "Completed: {}, Task: {}, Queue: {}, LargestPoolSize: {}, " +
-                        "MaximumPoolSize: {},  KeepAliveTime: {}, isShutdown: {}, isTerminated: {}",
-                this.poolName,
-                this.getPoolSize(), this.getCorePoolSize(), super.getActiveCount(),
-                this.getCompletedTaskCount(), this.getTaskCount(), this.getQueue().size(), this.getLargestPoolSize(),
-                this.getMaximumPoolSize(), this.getKeepAliveTime(TimeUnit.MILLISECONDS), this.isShutdown(), this.isTerminated());
-        startTime.set(System.currentTimeMillis());
-    }
-
-    /**
-     * 任务执行之后,计算任务结束时间
-     */
-    @Override
-    protected void afterExecute(Runnable r, Throwable t) {
-        long costTime = System.currentTimeMillis() - startTime.get();
-        startTime.remove();  //删除,避免占用太多内存
-        //设置最大最小执行时间
-        maxCostTime = maxCostTime > costTime ? maxCostTime : costTime;
-        if (totalTasks.get() == 0) {
-            minCostTime = costTime;
-        }
-        minCostTime = minCostTime < costTime ? minCostTime : costTime;
-        totalCostTime.addAndGet(costTime);
-        totalTasks.incrementAndGet();
-        ac = this.getActiveCount();  //获取ActiveCount的值
-
-        logger.info("{}-after: " +
-                        "Duration: {} ms, PoolSize: {}, CorePoolSize: {}, ActiveCount: {}, " +
-                        "Completed: {}, Task: {}, Queue: {}, LargestPoolSize: {}, " +
-                        "MaximumPoolSize: {},  KeepAliveTime: {}, isShutdown: {}, isTerminated: {}",
-                this.poolName,
-                costTime, this.getPoolSize(), this.getCorePoolSize(), super.getActiveCount(),
-                this.getCompletedTaskCount(), this.getTaskCount(), this.getQueue().size(), this.getLargestPoolSize(),
-                this.getMaximumPoolSize(), this.getKeepAliveTime(TimeUnit.MILLISECONDS), this.isShutdown(), this.isTerminated());
-    }
-
-    public int getAc() {
-        return ac;
-    }
-
-    /**
-     * 线程平均耗时
-     *
-     * @return
-     */
-    public float getAverageCostTime() {
-        return totalCostTime.get() / totalTasks.get();
-    }
-
-    /**
-     * 线程最大耗时
-     */
-    public long getMaxCostTime() {
-        return maxCostTime;
-    }
-
-    /**
-     * 线程最小耗时
-     */
-    public long getMinCostTime() {
-        return minCostTime;
-    }
-
-    /**
-     * 生成线程池所用的线程,改写了线程池默认的线程工厂
-     */
-    static class EventThreadFactory implements ThreadFactory {
-        private static final AtomicInteger poolNumber = new AtomicInteger(1);
-        private final ThreadGroup group;
-        private final AtomicInteger threadNumber = new AtomicInteger(1);
-        private final String namePrefix;
-
-        /**
-         * 初始化线程工厂
-         *
-         * @param poolName 线程池名称
-         */
-        EventThreadFactory(String poolName) {
-            SecurityManager s = System.getSecurityManager();
-            group = Objects.nonNull(s) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
-            namePrefix = poolName + "-pool-" + poolNumber.getAndIncrement() + "-thread-";
-        }
-
-        @Override
-        public Thread newThread(Runnable r) {
-            Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);
-
-            if (t.isDaemon()) {
-                t.setDaemon(false);
-            }
-            if (t.getPriority() != Thread.NORM_PRIORITY) {
-                t.setPriority(Thread.NORM_PRIORITY);
-            }
-            return t;
-        }
-    }
-}