浏览代码

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

yangyj 2 年之前
父节点
当前提交
77694d2ada
共有 21 个文件被更改,包括 968 次插入413 次删除
  1. 44 10
      blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/LargeFileEndpoint.java
  2. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTree.java
  3. 31 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java
  4. 55 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java
  5. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeVO2.java
  6. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveOfflineVersionInfoServiceImpl.java
  7. 6 0
      blade-service/blade-business/pom.xml
  8. 3 3
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml
  9. 9 9
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  10. 70 13
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/WeatherInfoServiceImpl.java
  11. 2 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  12. 10 10
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java
  13. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  14. 97 22
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java
  15. 23 11
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveAutoRuleSyncImpl.java
  16. 243 116
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  17. 54 28
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java
  18. 202 146
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  19. 3 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  20. 49 35
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  21. 59 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/test.java

+ 44 - 10
blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/LargeFileEndpoint.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import io.swagger.annotations.Api;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
+import org.apache.commons.fileupload.disk.DiskFileItem;
 import org.apache.commons.io.FileUtils;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.springblade.common.constant.CommonConstant;
@@ -45,9 +46,11 @@ import org.springblade.resource.vo.MultipartFileParam;
 import org.springblade.resource.vo.NewBladeFile;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.beans.BeanUtils;
+import org.springframework.http.MediaType;
 import org.springframework.util.DigestUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
 import javax.imageio.ImageIO;
 import javax.servlet.http.HttpServletRequest;
@@ -204,7 +207,7 @@ public class LargeFileEndpoint {
 		// 获取文件路径
 		/**Windows文件路径要加在哪个盘**/
 //		String filePath = "D:/www/wwwroot/Users/hongchuangyanfa/Desktop/Desktop/ceshi";
-		String filePath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL)+"largeFile/";
+		String filePath ="D:" +ParamCache.getValue(CommonConstant.SYS_LOCAL_URL)+"largeFile/";
 		// 创建文件夹
 //		getAbsoluteFile(filePath, fileName);
 //		new File(filePath, fileName);
@@ -266,19 +269,34 @@ public class LargeFileEndpoint {
 				renameFile(file,param.getFilename());
 				FileInputStream inputStream = new FileInputStream(filePath + param.getFilename());
 //				上传oss
+				long l = System.currentTimeMillis();
+				System.out.println("kaishi===================================="+l);
 				BladeFile bladeFile = ossBuilder.template().putFile(param.getFilename(),inputStream);
+				long l1 = System.currentTimeMillis();
+				System.out.println("jieshu===================================="+(l1-l));
 
+				File file1 = new File(filePath + param.getFilename());
 
 				NewBladeFile newBladeFile = new NewBladeFile();
-//				if(param.getFilename().contains("pdf")){
-//					PDDocument document = PDDocument.load(inputStream);
-//					//获取文件页数
-//					newBladeFile.setPage(document.getPages().getCount());
-//					//pdf的路径就是文件上传的路径
-//					newBladeFile.setPdfUrl(bladeFile.getLink());
-//				}
+				if(param.getFilename().contains("pdf")){
+					FileInputStream inputStream1 = new FileInputStream(filePath + param.getFilename());
+					PDDocument document = PDDocument.load(inputStream1);
+					//获取文件页数
+					newBladeFile.setPage(document.getPages().getCount());
+					//pdf的路径就是文件上传的路径
+					newBladeFile.setPdfUrl(bladeFile.getLink());
+				}else if(param.getFilename().contains("xlsx") || param.getFilename().contains("xls")){
+					MultipartFile multipartFile = getMultipartFile(file1);
+					newBladeFile = this.commonFileClient.excelToPdf(multipartFile);
+				}else if(param.getFilename().contains("docx")){
+					MultipartFile multipartFile = getMultipartFile(file1);
+					newBladeFile = this.commonFileClient.wordToPdf(multipartFile);
+				}else if(param.getFilename().contains("png") || param.getFilename().contains("jpg")){
+					MultipartFile multipartFile = getMultipartFile(file1);
+					newBladeFile = this.commonFileClient.pngOrJpgToPdf(multipartFile);
+				}
 				BeanUtils.copyProperties(bladeFile, newBladeFile);
-				File file1 = new File(filePath + param.getFilename());
+
 				//删除本地文件
 				file1.delete();
 				iLargeFileService.updateLargeFileDeleted(param.getIdentifier());
@@ -303,6 +321,22 @@ public class LargeFileEndpoint {
 		return result;
 	}
 
+	/**
+	 *file 转 MultipartFile
+	 * **/
+	public static MultipartFile getMultipartFile(File file){
+		DiskFileItem item = new DiskFileItem("file",
+				MediaType.MULTIPART_FORM_DATA_VALUE,
+				true,
+				file.getName(),(int) file.length(),file.getParentFile());
+		try {
+			OutputStream os = item.getOutputStream();
+			os.write(FileUtils.readFileToByteArray(file));
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return new CommonsMultipartFile(item);
+	}
 	/**
 	 * 构建上传目录和文件
 	 */
@@ -316,7 +350,7 @@ public class LargeFileEndpoint {
 	 * 构建上传完整目录
 	 */
 	private String buildUploadDir() {
-		String fullDir =ParamCache.getValue(CommonConstant.SYS_LOCAL_URL)+"largeFile/";
+		String fullDir ="D:" +ParamCache.getValue(CommonConstant.SYS_LOCAL_URL)+"largeFile/";
 		File dir = new File(fullDir);
 		if (!dir.exists()) {
 			dir.mkdirs();

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

@@ -218,5 +218,8 @@ public class ArchiveTree extends BaseEntity {
         this.storageType = archiveTree.getStorageType();
         this.expDataType = archiveTree.getExpDataType();
         this.archiveAutoType = archiveTree.getArchiveAutoType();
+        this.archiveAutoNodeId = archiveTree.getArchiveAutoNodeId();
+        this.archiveAutoGroupId = archiveTree.getArchiveAutoGroupId();
+        this.isUploadFileDisplayConfigurationTree = archiveTree.getIsDisplayTree();
     }
 }

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

@@ -262,6 +262,10 @@ public class ArchiveTreeContract extends BaseEntity {
 		this.storageType = archiveTree.getStorageType();
 		this.expDataType = archiveTree.getExpDataType();
 		this.archiveAutoType = archiveTree.getArchiveAutoType();
+		this.archiveAutoNodeId = archiveTree.getArchiveAutoNodeId();
+		this.archiveAutoGroupId = archiveTree.getArchiveAutoGroupId();
+		this.archiveAutoGroupSelect = archiveTree.getArchiveAutoGroupSelect();
+		this.isUploadFileDisplayConfigurationTree = archiveTree.getIsUploadFileDisplayConfigurationTree();
 	}
 
 	public void sync(ArchiveTreeVO2 archiveTree) {
@@ -280,6 +284,33 @@ public class ArchiveTreeContract extends BaseEntity {
 		this.storageType = archiveTree.getStorageType();
 		this.expDataType = archiveTree.getExpDataType();
 		this.archiveAutoType = archiveTree.getArchiveAutoType();
+		this.archiveAutoNodeId = archiveTree.getArchiveAutoNodeId();
+		this.archiveAutoGroupId = archiveTree.getArchiveAutoGroupId();
+		this.archiveAutoGroupSelect = archiveTree.getArchiveAutoGroupSelect();
+		this.isUploadFileDisplayConfigurationTree = archiveTree.getIsDisplayTree();
+	}
+
+	public void sync(ArchiveTreeContractVO2 archiveTree) {
+		if (archiveTree == null) {
+			return;
+		}
+
+		this.nodeType = archiveTree.getNodeType();
+		this.postType = archiveTree.getPostType();
+		this.associationType = archiveTree.getAssociationType();
+		this.majorDataType = archiveTree.getMajorDataType();
+		this.displayHierarchy = archiveTree.getDisplayHierarchy();
+		this.isStorageNode = archiveTree.getIsStorageNode();
+		this.isBuiltDrawing = archiveTree.getIsBuiltDrawing();
+		this.isInterfaceNode = archiveTree.getIsInterfaceNode();
+		this.projectType = archiveTree.getProjectType();
+		this.storageType = archiveTree.getStorageType();
+		this.expDataType = archiveTree.getExpDataType();
+		this.archiveAutoType = archiveTree.getArchiveAutoType();
+		this.archiveAutoNodeId = archiveTree.getArchiveAutoNodeId();
+		this.archiveAutoGroupId = archiveTree.getArchiveAutoGroupId();
+		this.archiveAutoGroupSelect = archiveTree.getArchiveAutoGroupSelect();
+		this.isUploadFileDisplayConfigurationTree = archiveTree.getIsDisplayTree();
 	}
 
 

+ 55 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java

@@ -31,6 +31,7 @@ import org.springframework.beans.BeansException;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 视图实体类
@@ -146,6 +147,11 @@ public class ArchiveTreeContractVO2 implements INodeEx<ArchiveTreeContractVO2> {
 
 	private String postType;
 
+	/**
+	 * 节点类型
+	 */
+	private Integer nodeType;
+
 	/**
 	 * 工程类型
 	 */
@@ -199,6 +205,12 @@ public class ArchiveTreeContractVO2 implements INodeEx<ArchiveTreeContractVO2> {
 
 	private Long fromId;
 
+	@ApiModelProperty(value = "是否为接口节点 '0'否 '1'是")
+	private Integer isInterfaceNode;
+
+	//flag 为1 则为修改。
+	private Integer flag = 0;
+
 	public String toString() {
 		return "TreeNode(parentId=" + this.getParentId()
 				+ ",ancestors" + this.getAncestors()
@@ -245,4 +257,47 @@ public class ArchiveTreeContractVO2 implements INodeEx<ArchiveTreeContractVO2> {
 		return false;
 	}
 
+	public boolean isMatch(ArchiveTreeVO2 b){
+		return Objects.equals(this.nodeType, b.getNodeType()) &&
+				Objects.equals(this.postType, b.getPostType()) &&
+				Objects.equals(this.associationType, b.getAssociationType()) &&
+				Objects.equals(this.majorDataType, b.getMajorDataType()) &&
+				Objects.equals(this.displayHierarchy, b.getDisplayHierarchy()) &&
+				this.isStorageNode == b.getIsStorageNode() &&
+				this.isBuiltDrawing == b.getIsBuiltDrawing() &&
+				Objects.equals(this.projectType, b.getProjectType()) &&
+				Objects.equals(this.storageType, b.getStorageType()) &&
+				Objects.equals(this.expDataType, b.getExpDataType()) &&
+				Objects.equals(this.archiveAutoType, b.getArchiveAutoType()) &&
+				Objects.equals(this.archiveAutoNodeId, b.getArchiveAutoNodeId()) &&
+				Objects.equals(this.archiveAutoGroupId, b.getArchiveAutoGroupId()) &&
+				Objects.equals(this.archiveAutoGroupSelect, b.getArchiveAutoGroupSelect()) &&
+				this.isDisplayTree == b.getIsDisplayTree();
+	}
+
+	public void sync(ArchiveTreeVO2 archiveTree) {
+		if (isMatch(archiveTree)) {
+			return;
+		}
+
+		this.nodeType = archiveTree.getNodeType();
+		this.postType = archiveTree.getPostType();
+		this.associationType = archiveTree.getAssociationType();
+		this.majorDataType = archiveTree.getMajorDataType();
+		this.displayHierarchy = archiveTree.getDisplayHierarchy();
+		this.isStorageNode = archiveTree.getIsStorageNode();
+		this.isBuiltDrawing = archiveTree.getIsBuiltDrawing();
+		this.isInterfaceNode = archiveTree.getIsInterfaceNode();
+		this.projectType = archiveTree.getProjectType();
+		this.storageType = archiveTree.getStorageType();
+		this.expDataType = archiveTree.getExpDataType();
+		this.archiveAutoType = archiveTree.getArchiveAutoType();
+		this.archiveAutoNodeId = archiveTree.getArchiveAutoNodeId();
+		this.archiveAutoGroupId = archiveTree.getArchiveAutoGroupId();
+		this.archiveAutoGroupSelect = archiveTree.getArchiveAutoGroupSelect();
+		this.isUploadFileDisplayConfigurationTree = archiveTree.getIsDisplayTree();
+		this.isDisplayTree = archiveTree.getIsDisplayTree();
+		this.flag = 1;
+	}
+
 }

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeVO2.java

@@ -195,4 +195,7 @@ public class ArchiveTreeVO2 implements INodeEx<ArchiveTreeVO2> {
 
     private Long wbsNode2ArchiveTreeNodeId;  //wbs节点关联归档树节点ID
 
+    //修改标识 1为修改
+    private Integer flag = 0;
+
 }

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

@@ -197,7 +197,7 @@ public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<Archiv
                 if (urlList.size() > 0){
                     Long id = SnowFlakeUtil.getId();
                     FileUtils.mergePdfPublicMethods(urlList,localUrl+id+".pdf");
-                    dto.setAllFilePdf(localUrl+id+".pdf");
+                    dto.setAllFilePdf(id+".pdf");
                 }
             }
 

+ 6 - 0
blade-service/blade-business/pom.xml

@@ -21,6 +21,12 @@
     <packaging>jar</packaging>
 
     <dependencies>
+        <!--        拼音-->
+        <dependency>
+            <groupId>com.hankcs</groupId>
+            <artifactId>hanlp</artifactId>
+            <version>portable-1.8.3</version>
+        </dependency>
         <dependency>
             <groupId>org.springblade</groupId>
             <artifactId>blade-core-boot</artifactId>

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

@@ -171,9 +171,9 @@
         CASE (select count(tcf.id) from u_tree_contract_first AS tcf where tcf.is_deleted = 0 and tcf.wbs_node_id = wtc.p_key_id) WHEN 0 THEN 'false' ELSE 'true' END AS isFirst,
 			 ( SELECT count(1) from m_wbs_tree_contract where id in(SELECT parent_id from m_wbs_tree_contract a where a.is_deleted=0 and a.type=2 and table_owner in(1,2,3)) and contract_id=wtc.contract_id and type =1 and is_deleted=0 and (FIND_IN_SET(wtc.id,ancestors) or wtc.p_key_id=p_key_id)
 				) as allCount,
-			 (SELECT count(1) from u_information_query b where b.wbs_id in(SELECT p_key_id from m_wbs_tree_contract a where (FIND_IN_SET(wtc.id,a.ancestors) or wtc.p_key_id=a.p_key_id) and a.is_deleted=0 and a.`status`='0' ) and b.is_deleted=0 and b.classify=1) as savaCont,
-			 (SELECT count(1) from u_information_query b where b.wbs_id in(SELECT p_key_id from m_wbs_tree_contract a where (FIND_IN_SET(wtc.id,a.ancestors) or wtc.p_key_id=a.p_key_id) and a.is_deleted=0 and a.`status`='1' ) and b.is_deleted=0 and b.classify=1) as submitCounts,
-			 (SELECT count(1) from u_information_query b where b.wbs_id in(SELECT p_key_id from m_wbs_tree_contract a where (FIND_IN_SET(wtc.id,a.ancestors) or wtc.p_key_id=a.p_key_id) and a.is_deleted=0 and a.`status`='2' ) and b.is_deleted=0 and b.classify=1) as appCount
+			 (SELECT count(1) from u_information_query b where b.wbs_id in(SELECT p_key_id from m_wbs_tree_contract a where (FIND_IN_SET(wtc.id,a.ancestors) or wtc.p_key_id=a.p_key_id) and a.is_deleted=0 ) and b.`status`='0' and b.is_deleted=0 and b.classify=1 and b.contract_id=wtc.contract_id ) as savaCont,
+			 (SELECT count(1) from u_information_query b where b.wbs_id in(SELECT p_key_id from m_wbs_tree_contract a where (FIND_IN_SET(wtc.id,a.ancestors) or wtc.p_key_id=a.p_key_id) and a.is_deleted=0 ) and b.`status`='1' and b.is_deleted=0 and b.classify=1 and b.contract_id=wtc.contract_id) as submitCounts,
+			 (SELECT count(1) from u_information_query b where b.wbs_id in(SELECT p_key_id from m_wbs_tree_contract a where (FIND_IN_SET(wtc.id,a.ancestors) or wtc.p_key_id=a.p_key_id) and a.is_deleted=0 ) and b.`status`='2' and b.is_deleted=0 and b.classify=1 and b.contract_id=wtc.contract_id) as appCount
 				FROM
         m_wbs_tree_contract AS wtc
         LEFT JOIN u_contract_tree_drawings AS ctd ON ctd.is_deleted = 0 and ctd.process_id = wtc.p_key_id

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

@@ -853,7 +853,11 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
             this.reBuildNumber(obj, dto);
 
             //------保存实体表数据、试验记录信息、生成PDF------
-            this.submitTrialData(obj, dto);
+            try {
+                this.submitTrialData(obj, dto);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
 
             //------关联原材料检测报告------
             this.rawMaterialSubmitRelation(dto, obj);
@@ -898,14 +902,10 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
     }
 
     @Async
-    public void submitTrialData(TrialSelfInspectionRecord obj, TrialSelfInspectionRecordDTO dto) {
-        try {
-            String pdfURL = excelTabClient.saveTabData(dto, dto.getIsBatchSave(), dto.getType(), dto.getTableType(), dto.getId(), obj.getTableIds());
-            if (StringUtils.isNotEmpty(pdfURL)) {
-                this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate().set(TrialSelfInspectionRecord::getPdfUrl, pdfURL).eq(TrialSelfInspectionRecord::getId, dto.getId()));
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
+    public void submitTrialData(TrialSelfInspectionRecord obj, TrialSelfInspectionRecordDTO dto) throws Exception {
+        String pdfURL = excelTabClient.saveTabData(dto, dto.getIsBatchSave(), dto.getType(), dto.getTableType(), dto.getId(), obj.getTableIds());
+        if (StringUtils.isNotEmpty(pdfURL)) {
+            this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate().set(TrialSelfInspectionRecord::getPdfUrl, pdfURL).eq(TrialSelfInspectionRecord::getId, dto.getId()));
         }
     }
 

+ 70 - 13
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/WeatherInfoServiceImpl.java

@@ -2,9 +2,16 @@ package org.springblade.business.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.hankcs.hanlp.dictionary.py.Pinyin;
+import com.hankcs.hanlp.dictionary.py.PinyinDictionary;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
 import org.springblade.common.utils.BaiduApiUtil;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.business.entity.WeatherInfo;
@@ -20,11 +27,13 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springblade.core.mp.support.Condition;
 
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.time.Duration;
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 
 @Slf4j
@@ -179,7 +188,7 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
                     weatherInfo = new WeatherInfo();
                     GregorianCalendar calendar = new GregorianCalendar();
                     calendar.setTime(new Date());
-                    calendar.add(Calendar.DATE,1);
+//                    calendar.add(Calendar.DATE,1);
                     weatherInfo.setRecordTime(calendar.getTime());
                 }
                 Date recordTime = weatherInfo.getRecordTime();
@@ -199,20 +208,36 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
                 Duration duration = Duration.between(plainTime, ContractTime);
                 if (duration.toDays() > 0){
                     List<WeatherInfo> list = new ArrayList<>();
+                    Map<String, Map<String, String>> weatherMap = null;
+                    List<Pinyin> py = PinyinDictionary.convertToPinyin(projectContractArea.getCounty().substring(0, projectContractArea.getCounty().length() - 1));
+                    StringBuilder county = new StringBuilder();
+                    for (int i = 0; i < py.size(); i++) {
+                        county.append(py.get(i).getPinyinWithoutTone());
+                    }
+                    List<Pinyin> py2 = PinyinDictionary.convertToPinyin(projectContractArea.getCity().substring(0, projectContractArea.getCity().length() - 1));
+                    StringBuilder city = new StringBuilder();
+                    for (int i = 0; i < py2.size(); i++) {
+                        city.append(py2.get(i).getPinyinWithoutTone());
+                    }
                     while (Duration.between(plainTime,ContractTime).toDays() != 0){
-                        //获取天气信息(百度天气)
-                        Map<String,String> weatherMap = BaiduApiUtil.getTodayWeather(projectContractArea.getCity_code());
-                        if(weatherMap != null){
-                            //计算平均气温
-                            BigDecimal aver = (new BigDecimal(weatherMap.get("high")).add(new BigDecimal(weatherMap.get("low")))).divide(new BigDecimal("2"), 1, BigDecimal.ROUND_HALF_UP);
-                            WeatherInfo newWeather = new WeatherInfo(String.valueOf(projectContractArea.getId()), weatherMap.get("weather"), aver.toString(), weatherMap.get("high"), weatherMap.get("low"), weatherMap.get("windLevel"));
-                            newWeather.setRecordTime(Date.from( plainTime.atZone( ZoneId.systemDefault()).toInstant()));
-//                            this.save(newWeather);
-                            list.add(newWeather);
-                            log.info("历史天气已经同步完成!contractAreaId:" + projectContractArea.getId() + ",syncTime:" + plainTime);
-                        } else {
-                            log.info("获取历史天气失败!contractAreaId:" + projectContractArea.getId() + ",syncTime:" + plainTime);
+                        //判断集合中是否存在当前天气,如果不存在则获取
+                        if (weatherMap == null || weatherMap.get(plainTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"))) == null){
+                            weatherMap = this.getWeather(county.toString(), plainTime.format(DateTimeFormatter.ofPattern("yyyyMM")));
+                            if (weatherMap == null || weatherMap.get(plainTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"))) == null){
+                                weatherMap = this.getWeather(city.toString(), plainTime.format(DateTimeFormatter.ofPattern("yyyyMM")));
+                                if (weatherMap == null || weatherMap.get(plainTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"))) == null){
+                                    log.info("获取历史天气失败!contractAreaId:" + projectContractArea.getId() + ",syncTime:" + plainTime);
+                                    break;
+                                }
+                            }
                         }
+                        Map<String, String> day = weatherMap.get(plainTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")));
+                        //计算平均气温
+                        BigDecimal aver = (new BigDecimal(day.get("high")).add(new BigDecimal(day.get("low")))).divide(new BigDecimal("2"), 1, BigDecimal.ROUND_HALF_UP);
+                        WeatherInfo newWeather = new WeatherInfo(String.valueOf(projectContractArea.getId()), day.get("weather"), aver.toString(), day.get("high"), day.get("low"), day.get("windLevel"));
+                        newWeather.setRecordTime(Date.from( plainTime.atZone( ZoneId.systemDefault()).toInstant()));
+                        list.add(newWeather);
+                        log.info("历史天气已经同步完成!contractAreaId:" + projectContractArea.getId() + ",syncTime:" + plainTime);
                         plainTime = plainTime.plusDays(1);
                     }
                     this.saveBatch(list);
@@ -222,4 +247,36 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
 
     }
 
+    public  Map<String,Map<String,String>> getWeather(String city,String month){
+        String html = "http://www.tianqihoubao.com/lishi/"+city+"/month/"+month+".html";
+        Map<String,Map<String,String>> map = new HashMap<>();
+        Document document = null;
+        try {
+            document = Jsoup.connect(html).get();
+            Element body = document.body();
+            Elements table = body.getElementsByTag("table");
+            Elements trs = table.select("tr");
+            //判断网页是否存在
+            if (trs.get(0).select("td").text().contains("本站目前")){
+                System.out.println("网页错误");
+                return null;
+            }
+            for (int i = 1; i < trs.size(); i++) {
+                Element tr = trs.get(i);
+                Elements tds = tr.select("td");
+
+                Map<String,String> m = new HashMap<>();
+                m.put("weather",tds.get(1).text().split("/")[0].trim());
+                String[] split = tds.get(2).text().split("/");
+                m.put("low",split[0].substring(0,split[0].length()-2));
+                m.put("high",split[1].substring(0,split[1].length()-1).trim());
+                m.put("windLevel",tds.get(3).text().substring(tds.get(3).text().length()-2));
+                map.put(tds.get(0).text(),m);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
 }

+ 2 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -1075,7 +1075,7 @@ public class ExcelTabController extends BladeController {
                         ExctabCell exctabCell = new ExctabCell();
                         if ((textInfo.indexOf("年") >= 0 && textInfo.indexOf("月") >= 0 && textInfo.indexOf("日") >= 0) || inputText.indexOf("日期") >= 0) {
                             if (inputText.indexOf("日期") >= 0) {
-                                data.empty().append("<el-date-picker type='date' @keyDowns='dateKeydown' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder='" + inputText + "'> </el-date-picker>");
+                                data.empty().append("<el-date-picker type='date' @keyDowns='dateKeydown()' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder='" + inputText + "'> </el-date-picker>");
                             } else if (textInfo.indexOf("年") >= 0 && textInfo.indexOf("月") >= 0 && textInfo.indexOf("日") >= 0) {
                                 if (inputText.indexOf("专业监理工程师") >= 0) {
                                     inputText = "专业监理工程师_年月日";
@@ -1085,7 +1085,7 @@ public class ExcelTabController extends BladeController {
                                     inputText = "年月日";
                                 }
                             }
-                            data.empty().append("<el-date-picker @keyDowns='dateKeydown'  type='date' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder='年月日'> </el-date-picker>");
+                            data.empty().append("<el-date-picker @keyDowns='dateKeydown()'  type='date' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder='年月日'> </el-date-picker>");
                             exctabCell.setTextInfo(inputText);
                             exctabCell.setExctabId(excelId);
                             exctabCell.setIsDeleted(0);
@@ -2957,8 +2957,6 @@ public class ExcelTabController extends BladeController {
     })
     public R getHtmlBussCols(String contractId){
         excelTabService.updateContractById(contractId);
-
-
         return R.data("成功");
     }
 

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

@@ -277,7 +277,7 @@ public class TextdictInfoController extends BladeController {
 
         } else if (textdictInfo.getTextId().equals("radio")) { // 单选按钮
 
-            String radioText = "<el-radio-group id=" + keyname + " @keyDowns='dateKeydown' v-model=" + vmode + " keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">";
+            String radioText = "<el-radio-group id=" + keyname + " @keyDowns='dateKeydown()' v-model=" + vmode + " keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">";
             List<TextdictInfo_vo> optionList = textdictInfo.getTextInfo();
             if (optionList != null && optionList.size() >= 1) {
                 for (int i = 0; i < optionList.size(); i++)
@@ -295,26 +295,26 @@ public class TextdictInfoController extends BladeController {
                     jsonObject.put("name", optionList.get(i).getDictValue());
                     objs.add(jsonObject);
                 }
-                String checkbox = "<hc-form-checkbox-group   @keyDowns='dateKeydown' :objs='" + objs + "'  @change='checkboxGroupChange' :val=" + vmode + " v-model=" + vmode + " keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + "> </hc-form-checkbox-group>";
+                String checkbox = "<hc-form-checkbox-group   @keyDowns='dateKeydown()' :objs='" + objs + "'  @change='checkboxGroupChange' :val=" + vmode + " v-model=" + vmode + " keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + "> </hc-form-checkbox-group>";
                 element.empty().append(checkbox);
             }
         } else if (textdictInfo.getTextId().equals("date")) { // 日期--年月日时分秒
-            element.empty().append("<el-date-picker @keyDowns='dateKeydown' v-model=" + vmode + " type='datetime' format='YYYY年MM月DD日 HH:mm:ss' value-format='YYYY年MM月DD日 hh:mm:ss' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
+            element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='datetime' format='YYYY年MM月DD日 HH:mm:ss' value-format='YYYY年MM月DD日 hh:mm:ss' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
         } else if (textdictInfo.getTextId().equals("dateYMD")) { // 日期--年月日
-            element.empty().append("<el-date-picker @keyDowns='dateKeydown' v-model=" + vmode + " type='date' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
+            element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='date' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
         } else if (textdictInfo.getTextId().equals("dateHMS")) { // 日期--时分秒
-            element.empty().append("<el-time-picker @keyDowns='dateKeydown' v-model=" + vmode + " type='date' format='HH:mm:ss' value-format='HH:mm:ss' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
+            element.empty().append("<el-time-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='date' format='HH:mm:ss' value-format='HH:mm:ss' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
         } else if (textdictInfo.getTextId().equals("dateSM")) { // 日期--时分
-            element.empty().append("<el-time-picker @keyDowns='dateKeydown' v-model=" + vmode + " type='date' format='HH:mm' value-format='HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
+            element.empty().append("<el-time-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='date' format='HH:mm' value-format='HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
         } else if (textdictInfo.getTextId().equals("dateMDHM")) { // 日期--月日时分
-            element.empty().append("<el-date-picker @keyDowns='dateKeydown' v-model=" + vmode + " type='datetime' format='MM月DD日 HH:mm' value-format='MM月DD日 HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
+            element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='datetime' format='MM月DD日 HH:mm' value-format='MM月DD日 HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
         } else if (textdictInfo.getTextId().equals("dateDHM")) { // 日期--日时分
-            element.empty().append("<el-date-picker @keyDowns='dateKeydown' v-model=" + vmode + " type='datetime' format='DD日 HH:mm' value-format='DD日 HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
+            element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='datetime' format='DD日 HH:mm' value-format='DD日 HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
         } else if (textdictInfo.getTextId().equals("daterange")) { // 时间段
-            element.empty().append("<el-date-picker @keyDowns='dateKeydown' v-model=" + vmode + " type='datetimerange' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='YYYY年MM月DD日' trIndex=" + trindex + " keyname=" + keyname + " weighing=" + weighing + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">");
+            element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='datetimerange' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='YYYY年MM月DD日' trIndex=" + trindex + " keyname=" + keyname + " weighing=" + weighing + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">");
             element.children().get(0).attr("@change", "datePickerChange($event,'" + keyname + "')");
         } else if (textdictInfo.getTextId().equals("daterangeYMD")) { // 时间段 /
-            element.empty().append("<el-date-picker @keyDowns='dateKeydown' v-model=" + vmode + " type='datetimerange' range-separator='/' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='YYYY年MM月DD日' trIndex=" + trindex + " keyname=" + keyname + " weighing=" + weighing + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">");
+            element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='datetimerange' range-separator='/' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='YYYY年MM月DD日' trIndex=" + trindex + " keyname=" + keyname + " weighing=" + weighing + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">");
             element.children().get(0).attr("@change", "datePickerChange($event,'" + keyname + "')");
 
         } else if (textdictInfo.getTextId().equals("img")) {

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

@@ -88,6 +88,7 @@
         <result column="isStorageNode" property="isStorageNode"/>
         <result column="isBuiltDrawing" property="isBuiltDrawing"/>
         <result column="association_type" property="associationType"/>
+        <result column="nodeType" property="nodeType"/>
         <result column="postType" property="postType"/>
         <result column="project_type" property="projectType"/>
         <result column="storage_type" property="storageType"/>

+ 97 - 22
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java

@@ -1,6 +1,7 @@
 package org.springblade.manager.service.impl;
 
 import com.alibaba.druid.sql.dialect.blink.parser.BlinkCreateTableParser;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.mixsmart.utils.StringUtils;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -11,6 +12,7 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.feign.ProjectClient;
+import org.springblade.manager.mapper.ArchiveTreeContractMapper;
 import org.springblade.manager.service.IContractInfoService;
 import org.springblade.manager.service.IProjectInfoService;
 import org.springblade.manager.service.IWbsTreeService;
@@ -35,6 +37,10 @@ public class ArTreeContractInitServiceImpl {
 
     private final IProjectInfoService projectInfoService;
 
+    private final ArchiveTreeContractMapper archiveTreeContractMapper;
+
+    private final ArchiveAutoRuleSyncImpl archiveAutoRuleSync;
+
     /**
      *
      * @param tenantId
@@ -227,23 +233,11 @@ public class ArTreeContractInitServiceImpl {
      *
      * @param archiveTreeContracts
      */
-    public void InitAncestorsAndTreeSort(List<ArchiveTreeContract> archiveTreeContracts) {
+    public void InitTreeSort(List<ArchiveTreeContract> archiveTreeContracts) {
         List<ArchiveTreeContractVO2> archiveTreeContractVO2List = new ArrayList<>();
-        Map<Long,ArchiveTreeContractVO2> vo2Map = new LinkedHashMap<>();
-        for (ArchiveTreeContract archiveTreeContract:archiveTreeContracts) {
-            ArchiveTreeContractVO2 treeContractVO2 = new ArchiveTreeContractVO2();
-            treeContractVO2.setId(archiveTreeContract.getId());
-            treeContractVO2.setParentId(archiveTreeContract.getParentId());
-            treeContractVO2.setTitle(archiveTreeContract.getNodeName());
-            treeContractVO2.setSort(archiveTreeContract.getSort());
 
-            treeContractVO2.setArchiveAutoNodeId(archiveTreeContract.getArchiveAutoNodeId());
-            treeContractVO2.setArchiveAutoType(archiveTreeContract.getArchiveAutoType());
-            treeContractVO2.setArchiveAutoGroupId(archiveTreeContract.getArchiveAutoGroupId());
-
-            archiveTreeContractVO2List.add(treeContractVO2);
-            vo2Map.put(treeContractVO2.getId(),treeContractVO2);
-        }
+        Map<Long,ArchiveTreeContractVO2> vo2Map = new LinkedHashMap<>();
+        getMap(archiveTreeContractVO2List,archiveTreeContracts,vo2Map);
 
         List<ArchiveTreeContractVO2> trees = ForestNodeMergerEx.merge(archiveTreeContractVO2List);
 
@@ -251,14 +245,11 @@ public class ArTreeContractInitServiceImpl {
 
         InitTreeSort(trees.get(0), "");
 
-        for (ArchiveTreeContract archiveTreeContract:archiveTreeContracts) {
-            ArchiveTreeContractVO2 tmp = vo2Map.get(archiveTreeContract.getId());
-            if (tmp != null ) {
-                archiveTreeContract.setAncestors(tmp.getAncestors());
-                archiveTreeContract.setTreeSort(tmp.getTreeSort());
+        archiveAutoRuleSync.syncArchiveTreeContractList(vo2Map);
 
-            }
-        }
+        List<ArchiveTreeContract> upList = new ArrayList<>();
+
+        handleAddAndUpList(vo2Map,archiveTreeContracts,upList);
     }
 
     /**
@@ -489,6 +480,11 @@ public class ArTreeContractInitServiceImpl {
         return archiveTreeContracts;
     }
 
+    /**
+     * 同步wbs节点默认案卷
+     * @param archiveTreeContracts
+     * @param contracts
+     */
     void syncArchiveAutoList(List<ArchiveTreeContract> archiveTreeContracts,List<ContractInfo> contracts) {
         List<ArchivesAuto> archivesAutos = new ArrayList<>();
 
@@ -574,4 +570,83 @@ public class ArTreeContractInitServiceImpl {
         return unit;
     }
 
+    /**
+     *  根据vo的排序和自动组卷信息,刷新新增节点,根据修改标识生成更新节点
+     * @param vo2Map
+     * @param addList
+     * @param upList
+     */
+    void handleAddAndUpList(Map<Long,ArchiveTreeContractVO2> vo2Map,List<ArchiveTreeContract> addList,List<ArchiveTreeContract> upList) {
+
+        //刷新新增节点
+        for (ArchiveTreeContract archiveTreeContract:addList) {
+            ArchiveTreeContractVO2 tmp = vo2Map.get(archiveTreeContract.getId());
+            if (tmp != null ) {
+
+                archiveTreeContract.setAncestors(tmp.getAncestors());
+                archiveTreeContract.setTreeSort(tmp.getTreeSort());
+                archiveTreeContract.setArchiveAutoNodeId(archiveTreeContract.getArchiveAutoNodeId());
+                archiveTreeContract.setArchiveAutoType(archiveTreeContract.getArchiveAutoType());
+                archiveTreeContract.setArchiveAutoGroupId(archiveTreeContract.getArchiveAutoGroupId());
+                archiveTreeContract.setArchiveAutoGroupSelect(archiveTreeContract.getArchiveAutoGroupSelect());
+                //新增里有,就去update了,避免重复
+                tmp.setFlag(0);
+
+            }
+        }
+
+        //获取本次所有的修改节点
+        List<Long> ids = new ArrayList<>();
+        for (Map.Entry<Long, ArchiveTreeContractVO2> entry : vo2Map.entrySet()) {
+
+            ArchiveTreeContractVO2 archiveTreeContractVO2 = entry.getValue();
+            if (archiveTreeContractVO2.getFlag() == 1) {
+                ids.add(archiveTreeContractVO2.getId());
+            }
+        }
+
+        if (ids.size() == 0) {
+            return;
+        }
+        List<ArchiveTreeContract> archiveTreeContracts =  archiveTreeContractMapper.selectBatchIds(ids);
+
+        //刷新属性
+        for (ArchiveTreeContract archiveTreeContract : archiveTreeContracts) {
+            ArchiveTreeContractVO2 archiveTreeVO2 = vo2Map.get(archiveTreeContract.getId());
+            if (archiveTreeVO2!= null) {
+                archiveTreeContract.sync(archiveTreeVO2);
+                upList.add(archiveTreeContract);
+            }
+
+        }
+    }
+
+    /**
+     * 已有vo的链表和新增链表,获取映射整个映射
+     * @param vos
+     * @param addList
+     * @return
+     */
+    public void getMap(List<ArchiveTreeContractVO2> vos,List<ArchiveTreeContract> addList,Map<Long,ArchiveTreeContractVO2> vo2Map){
+
+        for (ArchiveTreeContractVO2 ar:vos) {
+            vo2Map.put(ar.getId(),ar);
+        }
+
+        for (ArchiveTreeContract archiveTreeContract:addList) {
+            ArchiveTreeContractVO2 treeContractVO2 = new ArchiveTreeContractVO2();
+            treeContractVO2.setId(archiveTreeContract.getId());
+            treeContractVO2.setParentId(archiveTreeContract.getParentId());
+            treeContractVO2.setTitle(archiveTreeContract.getNodeName());
+            treeContractVO2.setSort(archiveTreeContract.getSort());
+
+            treeContractVO2.setArchiveAutoNodeId(archiveTreeContract.getArchiveAutoNodeId());
+            treeContractVO2.setArchiveAutoType(archiveTreeContract.getArchiveAutoType());
+            treeContractVO2.setArchiveAutoGroupId(archiveTreeContract.getArchiveAutoGroupId());
+            treeContractVO2.setArchiveAutoGroupSelect(archiveTreeContract.getArchiveAutoGroupSelect());
+            vos.add(treeContractVO2);
+            vo2Map.put(treeContractVO2.getId(),treeContractVO2);
+        }
+    }
+
 }

+ 23 - 11
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveAutoRuleSyncImpl.java

@@ -22,24 +22,36 @@ public class ArchiveAutoRuleSyncImpl {
 
     }
 
-    public void syncArchiveTreeList(List<ArchiveTreeVO2> archiveTreeVO2s){
+    public void syncArchiveTreeList(Map<Long,ArchiveTreeVO2> vo2Map){
 
         List<ArchiveTreeVO2> normalList = new ArrayList<>();
         List<ArchiveTreeVO2> wbsList = new ArrayList<>();
 
-        ForestNodeMergerEx.setPropertyfromId(archiveTreeVO2s,syncPropertyMap);
-        //todo group
+        for (ArchiveTreeVO2 archiveTreeVO2: vo2Map.values()) {
+            normalList.add(archiveTreeVO2);
+        }
+
+
+        ForestNodeMergerEx.setPropertyfromId(normalList,syncPropertyMap);
+
+
+        for (ArchiveTreeVO2 archiveTreeVO2 : vo2Map.values()) {
+            if (archiveTreeVO2.getArchiveAutoNodeId() != null) {
+                archiveTreeVO2.setFlag(1);
+            }
+        }
+        //todo group type
 
     }
 
-    public void syncArchiveTreeContractList(List<ArchiveTreeContractVO2> archiveTreeContractVO2s){
+    public void syncArchiveTreeContractList(Map<Long,ArchiveTreeContractVO2> vo2Map){
 
         List<ArchiveTreeContractVO2> normalList = new ArrayList<>();
         List<ArchiveTreeContractVO2> wbsList = new ArrayList<>();
         List<ArchiveTreeContractVO2> allWbsList = new ArrayList<>();
         Map<Long,Long> wbsIdMap = new HashMap<>();
 
-        for (ArchiveTreeContractVO2 archiveTreeContractVO2: archiveTreeContractVO2s) {
+        for (ArchiveTreeContractVO2 archiveTreeContractVO2: vo2Map.values()) {
             if (archiveTreeContractVO2.getExtType()!= null && archiveTreeContractVO2.getExtType() == 1) {
                 wbsList.add(archiveTreeContractVO2);
             }else {
@@ -82,13 +94,13 @@ public class ArchiveAutoRuleSyncImpl {
             }
         }
 
-
-
-        //todo group
-        for (ArchiveTreeContractVO2 archiveTreeContractVO2 : archiveTreeContractVO2s) {
-            if (archiveTreeContractVO2.getArchiveAutoGroupId() != null) {
-
+        //设置修改标识
+        for (ArchiveTreeContractVO2 archiveTreeContractVO2 : vo2Map.values()) {
+            if (archiveTreeContractVO2.getArchiveAutoNodeId() != null) {
+                archiveTreeContractVO2.setFlag(1);
             }
         }
+        //todo group type
+
     }
 }

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

@@ -147,7 +147,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		archiveTreeContracts.addAll(addNodes);
 
 		//初始化祖先节点和排序
-		arTreeContractInitService.InitAncestorsAndTreeSort(archiveTreeContracts);
+		arTreeContractInitService.InitTreeSort(archiveTreeContracts);
 		//todo 同步质检资料动态节点,处理文件提名
 
 		//todo 同步立卷规则
@@ -384,6 +384,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 			return false;
 		}
 
+		//如果在合同段节点上点同步,它的fromId是没有的,需要取它的上级节点施工或者监理总节点来同步
 		ArchiveTree srcNode = null;
 		if (dstNode.isContractRoot() && dstNode.getFromId() == null ) {
 			ArchiveTreeContract parentNode = this.getById(dstNode.getParentId());
@@ -398,165 +399,223 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 			return false;
 		}
 
+		//取出
 		List<ArchiveTreeVO2> srcTrees = archiveTreeService.tree2(AuthUtil.getTenantId(), dstNode.getProjectId(),
 				null, null,null,false);
+		ArchiveTreeVO2 srcTree = srcTrees.get(0);
+		if (srcTree == null) {
+			return false;
+		}
+		//先更新所有节点属性
+//		ArchiveTreeVO2 subTree = ForestNodeMergerEx.getSubTree(srcTree,srcNode.getId());
+//		UpdateByArchiveTree(dstNode.getProjectId(),subTree);
+
+
 		List<ArchiveTreeContractVO2> dstTrees = this.tree2Root(AuthUtil.getTenantId(),null,null,dstNode.getProjectId(),null);
 		List<ArchiveTreeContract> saveList = new ArrayList<>();
+		List<ArchiveTreeContract> upList = new ArrayList<>();
+		List<ArchiveTreeContract> saveContractList = new ArrayList<>();
 		ArchiveTreeContractVO2 dstTree = dstTrees.get(0);
-		ArchiveTreeVO2 srcTree = srcTrees.get(0);
-		if (dstTree == null || srcTree == null) {
+		if (dstTree == null ) {
 			return false;
 		}
 
 		List<ContractInfo> contractInfos = contractInfoService.selectContractInfoPageByPid(dstNode.getProjectId().toString());
-		Map<Long,ContractInfo> contractMap = new LinkedHashMap<>();
-
-		ProjectInfo projectInfo = projectInfoService.getOne(dstNode.getProjectId());
-		Long wbsId = projectInfo.getReferenceWbsTemplateId();
-
 
 		boolean bHasContract = true;
 		if (contractInfos == null || contractInfos.size() == 0) {
 			bHasContract = false;
 		}
 
-		//预处理
+		//看看有没有合同段要复制
 		if (bHasContract) {
+			AddNewContract(contractInfos,srcTree,dstTree,dstNode,saveList);
+		}
 
-			for (ContractInfo contractInfo: contractInfos) {
-				contractInfo.setStatus(0);
-				contractMap.put(contractInfo.getId(),contractInfo);
-			}
+		//如果有新的合同段,合并新增代码到
+		if (saveList.size() > 0) {
+			archiveTreeContractSync.mergerToTree(dstTree,saveList,null);
+		}
 
-			dstTree.setValue(1L);
-			for (ArchiveTreeContractVO2 ar: dstTree.getChildren()) {
-				//施工和监理
-				ar.setValue(1L);
-				if (ar.getTreeCode()!= null && (
-						ar.getTreeCode().equals("C") || ar.getTreeCode().equals("S"))) {
+		//没有合同段直接同步
+		if (!bHasContract) {
+			saveList = getNormalSaveList(srcNode.getId(),
+					srcTrees.get(0),dstNode.getId(),dstTrees.get(0));
+		}else {
 
-					if (ar.getChildren() == null ) {
-						continue;
-					}
+			//同步业主,监理各个合同段,施工各个合同段
+			syncAllContracts(srcTree,dstTree,srcNode,dstNode,saveContractList);
+		}
 
-					//处理合同节点
-					int contractNum = 0;
-					for (ArchiveTreeContractVO2 contractNode : ar.getChildren()) {
-						if (contractNode.isContractRoot()){
-							//需要删除
-							contractNum++;
+		//更新排序,把排序,自动组卷这种变化,刷新到新增节点和修改节点上
+		archiveTreeContractSync.InitTreeSort(dstTree,saveContractList,upList);
 
-							contractNode.setValue(1L);
+		saveList.addAll(saveContractList);
+		//同步生成案卷
+		arTreeContractInitService.syncArchiveAutoList(saveList,contractInfos);
 
-							//设置哪个合同已经设置了。
-							ContractInfo c = contractMap.get(Long.parseLong(contractNode.getTreeCode()));
-							if (c!= null) {
-								c.setStatus(1);
-							}
-						}
-					}
+		this.saveBatch(saveList);
+		this.updateBatchById(upList);
+		return true;
+	}
 
-					if (contractNum == 0) {
-						//删除树的子节点
-						deleteTreeChildren(ar);
-					}
+	/**
+	 *
+	 * @param srcNodeId
+	 * @param srcTree
+	 * @param dstNodeId
+	 * @param dstTree
+	 * @return
+	 */
+	public List<ArchiveTreeContract> getNormalSaveList(Long srcNodeId,ArchiveTreeVO2 srcTree,Long dstNodeId,ArchiveTreeContractVO2 dstTree){
 
-					for(Map.Entry<Long,ContractInfo> entry : contractMap.entrySet()){
-						ContractInfo contractInfo = entry.getValue();
-
-						if (contractInfo.getStatus() == 0) {
-							if (ar.getTreeCode().equals("C") && contractInfo.getContractType() == 1) {
-								//复制施工
-								List<ArchiveTreeContract> tmpSaveList =
-										archiveTreeContractSync.getContractSaveList(srcTree,ar,contractInfo,dstNode);
-								saveList.addAll(tmpSaveList);
-							}
-							if (ar.getTreeCode().equals("S") && contractInfo.getContractType() == 2) {
-								//复制监理
-								List<ArchiveTreeContract> tmpSaveList =
-										archiveTreeContractSync.getContractSaveList(srcTree,ar,contractInfo,dstNode);
-								saveList.addAll(tmpSaveList);
-							}
-						}
-					}
+		List<ArchiveTreeContract> saveList = archiveTreeContractSync.getNormalSaveList(srcNodeId,srcTree,dstNodeId,dstTree);
 
-				}
-			}
+		//设置修改标识
+		ModifyBySrcTree(srcNodeId,srcTree,dstNodeId,dstTree);
+
+		return saveList;
+	}
+
+	/**
+	 * 新增合同段时,要复制一份合同段的分支出来
+	 * @param contractInfos
+	 * @param srcTree
+	 * @param dstTree
+	 * @param dstNode
+	 * @param saveList
+	 */
+	void AddNewContract(List<ContractInfo> contractInfos,ArchiveTreeVO2 srcTree,ArchiveTreeContractVO2 dstTree,
+						   ArchiveTreeContract dstNode,List<ArchiveTreeContract> saveList){
+		Map<Long,ContractInfo> contractMap = new LinkedHashMap<>();
+
+		for (ContractInfo contractInfo: contractInfos) {
+			contractInfo.setStatus(0);
+			contractMap.put(contractInfo.getId(),contractInfo);
 		}
 
+		dstTree.setValue(1L);
+		for (ArchiveTreeContractVO2 ar: dstTree.getChildren()) {
+			//施工和监理
+			ar.setValue(1L);
+			if (ar.getTreeCode()!= null && (
+					ar.getTreeCode().equals("C") || ar.getTreeCode().equals("S"))) {
 
-		if (!bHasContract) {
-			saveList = archiveTreeContractSync.getNormalSaveList(srcNode.getId(),
-					srcTrees.get(0),dstNode.getId(),dstTrees.get(0));
-		}else {
+				if (ar.getChildren() == null ) {
+					continue;
+				}
 
-			ArchiveTreeContractVO2 dstScopeTree = ForestNodeMergerEx.getSubTreeByValue(dstTree,dstNode.getId(),1L);
-			for (ArchiveTreeContractVO2 ar: dstTree.getChildren()) {
-				if (StringUtils.isEmpty(ar.getTreeCode())) {
-					//同步
-					if (dstNode.getParentId() == 0 || dstScopeTree.getId().equals(ar.getId()) ) {
-						//同步
-						List<ArchiveTreeContract> tmpSaveList = null;
-						if (dstNode.getParentId() == 0) {
-							ArchiveTreeVO2 tmpSubTree = ForestNodeMergerEx.getSubTree(srcTree,ar.getFromId());
-							if (tmpSubTree == null) {
-								continue;
-							}
-							tmpSaveList = archiveTreeContractSync.getNormalSaveList(tmpSubTree.getId(),
-									tmpSubTree,ar.getId(),ar);
-						}else {
-							tmpSaveList = archiveTreeContractSync.getNormalSaveList(srcNode.getId(),
-									srcTree,dstNode.getId(),ar);
-						}
+				//处理合同节点
+				int contractNum = 0;
+				for (ArchiveTreeContractVO2 contractNode : ar.getChildren()) {
+					if (contractNode.isContractRoot()){
+						//需要删除
+						contractNum++;
 
+						contractNode.setValue(1L);
 
-						saveList.addAll(tmpSaveList);
+						//设置哪个合同已经设置了。
+						ContractInfo c = contractMap.get(Long.parseLong(contractNode.getTreeCode()));
+						if (c!= null) {
+							c.setStatus(1);
+						}
 					}
-				}else {
-					for (ArchiveTreeContractVO2 contractNode : ar.getChildren()){
-
-						List<ArchiveTreeContract> tmpSaveList = null;
-						if (dstNode.getParentId() == 0 || dstScopeTree.getId().equals(contractNode.getId())
-								|| dstScopeTree.getId().equals(contractNode.getParentId())) {
-
-							ArchiveTreeVO2 tmpSubTree = srcTree;
-							Long dstNodeId = dstNode.getId();
-							if (dstNode.getParentId() == 0 ||  dstScopeTree.getId().equals(contractNode.getParentId()) ) {
-								tmpSubTree = ForestNodeMergerEx.getSubTree(srcTree,ar.getFromId());
-								dstNodeId = contractNode.getId();
-							}
-							if (tmpSubTree == null) {
-								continue;
-							}
-							tmpSaveList = archiveTreeContractSync.getNormalSaveList(srcNode.getId(),
-									tmpSubTree,dstNodeId,contractNode);
-							saveList.addAll(tmpSaveList);
-
-							//todo 同步wbs等扩展节点
+				}
 
-							List<ArchiveTreeContract> extSaveList = archiveTreeContractSync.getExtSaveList(dstNodeId,
-									contractNode,dstNode.getProjectId());
-							saveList.addAll(extSaveList);
+				if (contractNum == 0) {
+					//删除树的子节点
+					deleteTreeChildren(ar);
+				}
 
+				for(Map.Entry<Long,ContractInfo> entry : contractMap.entrySet()){
+					ContractInfo contractInfo = entry.getValue();
 
+					if (contractInfo.getStatus() == 0) {
+						if (ar.getTreeCode().equals("C") && contractInfo.getContractType() == 1) {
+							//复制施工
+							List<ArchiveTreeContract> tmpSaveList =
+									archiveTreeContractSync.getContractSaveList(srcTree,ar,contractInfo,dstNode);
+							saveList.addAll(tmpSaveList);
+						}
+						if (ar.getTreeCode().equals("S") && contractInfo.getContractType() == 2) {
+							//复制监理
+							List<ArchiveTreeContract> tmpSaveList =
+									archiveTreeContractSync.getContractSaveList(srcTree,ar,contractInfo,dstNode);
+							saveList.addAll(tmpSaveList);
 						}
 					}
 				}
+
 			}
 		}
+	}
 
-		//不是新增的,更新属性
-		ArchiveTreeVO2 subTree = ForestNodeMergerEx.getSubTree(srcTree,srcNode.getId());
-		UpdateByArchiveTree(dstNode.getProjectId(),subTree);
+	/**
+	 * 同步业主,监理各合同段,施工合同段,新增的普通节点,同步wbs节点
+	 * @param srcTree
+	 * @param dstTree
+	 * @param srcNode
+	 * @param dstNode
+	 * @param saveList
+	 */
+	void syncAllContracts(ArchiveTreeVO2 srcTree,ArchiveTreeContractVO2 dstTree,ArchiveTree srcNode,
+						  ArchiveTreeContract dstNode,List<ArchiveTreeContract> saveList){
+
+		//获取范围看是在业主,监理各合同段,施工合同段,
+		ArchiveTreeContractVO2 dstScopeTree = ForestNodeMergerEx.getSubTreeByValue(dstTree,dstNode.getId(),1L);
+		for (ArchiveTreeContractVO2 ar: dstTree.getChildren()) {
+			if (StringUtils.isEmpty(ar.getTreeCode())) {
+				//同步
+				if (dstNode.getParentId() == 0 || dstScopeTree.getId().equals(ar.getId()) ) {
+					//同步
+					List<ArchiveTreeContract> tmpSaveList = null;
+					if (dstNode.getParentId() == 0) {
+						ArchiveTreeVO2 tmpSubTree = ForestNodeMergerEx.getSubTree(srcTree,ar.getFromId());
+						if (tmpSubTree == null) {
+							continue;
+						}
+						tmpSaveList = getNormalSaveList(tmpSubTree.getId(),
+								tmpSubTree,ar.getId(),ar);
+					}else {
+						tmpSaveList = getNormalSaveList(srcNode.getId(),
+								srcTree,dstNode.getId(),ar);
+					}
+
+					saveList.addAll(tmpSaveList);
+				}
+			}else {
+				for (ArchiveTreeContractVO2 contractNode : ar.getChildren()){
+
+					List<ArchiveTreeContract> tmpSaveList = null;
+					if (dstNode.getParentId() == 0 || dstScopeTree.getId().equals(contractNode.getId())
+							|| dstScopeTree.getId().equals(contractNode.getParentId())) {
+
+						ArchiveTreeVO2 tmpSubTree = srcTree;
+						Long dstNodeId = dstNode.getId();
+						if (dstNode.getParentId() == 0 ||  dstScopeTree.getId().equals(contractNode.getParentId()) ) {
+							tmpSubTree = ForestNodeMergerEx.getSubTree(srcTree,ar.getFromId());
+							dstNodeId = contractNode.getId();
+						}
+						if (tmpSubTree == null) {
+							continue;
+						}
 
-		//更新排序
-		archiveTreeContractSync.InitTreeSort(dstTree,saveList);
+						//getNormalSaveList 接口除了同步新增节点,还会同步已有节点的属性。
+						//因为关联工序的位置是固定的,先不考虑新增一个关联工序节点,且一次同步完成情况
+						tmpSaveList = getNormalSaveList(srcNode.getId(),
+								tmpSubTree,dstNodeId,contractNode);
+						saveList.addAll(tmpSaveList);
 
-		//同步生成案卷
-		arTreeContractInitService.syncArchiveAutoList(saveList,contractInfos);
+						//获取工序节点
+						List<ArchiveTreeContract> extSaveList = archiveTreeContractSync.getExtSaveList(dstNodeId,
+								contractNode,dstNode.getProjectId());
+						saveList.addAll(extSaveList);
 
-		this.saveBatch(saveList);
-		return true;
+
+					}
+				}
+			}
+		}
 	}
 
 	/**
@@ -657,6 +716,74 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		return true;
 	}
 
+	/**
+	 *
+	 * @param srcTree
+	 * @param dstTree
+	 * @return
+	 */
+	public boolean ModifyBySrcTree(Long srcNodeId,ArchiveTreeVO2 srcTrees,Long dstNodeId,ArchiveTreeContractVO2 dstTrees){
+
+		List<ArchiveTreeVO2> archiveTreeVO2List = new ArrayList<>();
+		List<ArchiveTreeContractVO2> archiveTreeContractVO2s = new ArrayList<>();
+		//取出指定范围
+		ArchiveTreeVO2 srcTree = ForestNodeMergerEx.getSubTree(srcTrees,srcNodeId);
+		ArchiveTreeContractVO2 dstTree = ForestNodeMergerEx.getSubTree(dstTrees,dstNodeId);
+
+		//取出链表
+		ForestNodeMergerEx.getTreeList(srcTree,archiveTreeVO2List);
+		ForestNodeMergerEx.getTreeList(dstTree,archiveTreeContractVO2s);
+
+		Map<Long, ArchiveTreeVO2> map = new LinkedHashMap<>();
+		for (ArchiveTreeVO2 ar : archiveTreeVO2List) {
+			map.put(ar.getId(),ar);
+		}
+
+		for (ArchiveTreeContractVO2 ar : archiveTreeContractVO2s) {
+			ArchiveTreeVO2 archiveTreeVO2 = map.get(ar.getFromId());
+			if (archiveTreeVO2!= null) {
+				ar.sync(archiveTreeVO2);
+			}
+		}
+		return true;
+	}
+
+	/**
+	 *
+	 * @param dstTree
+	 * @return
+	 */
+	public boolean UpdateByArchiveTreeContractVO2(ArchiveTreeContractVO2 dstTree){
+
+		List<Long> ids = new ArrayList<>();
+		List<ArchiveTreeContractVO2> archiveTreeContractVO2s = new ArrayList<>();
+
+		ForestNodeMergerEx.getTreeList(dstTree,archiveTreeContractVO2s);
+		Map<Long, ArchiveTreeContractVO2> map = new LinkedHashMap<>();
+
+
+		for (ArchiveTreeContractVO2 ar : archiveTreeContractVO2s) {
+			if (ar.getFlag() == 1) {
+				ids.add(ar.getId());
+				map.put(ar.getId(),ar);
+			}
+		}
+
+		List<ArchiveTreeContract> archiveTreeContracts =  baseMapper.selectBatchIds(ids);
+
+		List<ArchiveTreeContract> upList = new ArrayList<>();
+		for (ArchiveTreeContract archiveTreeContract : archiveTreeContracts) {
+			ArchiveTreeContractVO2 treeContractVO2 = map.get(archiveTreeContract.getId());
+			if (treeContractVO2!= null) {
+				archiveTreeContract.sync(treeContractVO2);
+				upList.add(archiveTreeContract);
+			}
+
+		}
+		this.saveOrUpdateBatch(upList);
+		return true;
+	}
+
 	/**
 	 * 递归设置
 	 * @param archiveTreeContracts

+ 54 - 28
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java

@@ -5,6 +5,7 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.manager.entity.ArchiveTree;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.mapper.ArchiveTreeContractMapper;
 import org.springblade.manager.service.IProjectInfoService;
 import org.springblade.manager.utils.ForestNodeMergerEx;
 import org.springblade.manager.vo.ArchiveTreeContractVO2;
@@ -24,6 +25,10 @@ public class ArchiveTreeContractSyncImpl {
 
     private final IProjectInfoService projectInfoService;
 
+    private final ArchiveTreeContractMapper archiveTreeContractMapper;
+
+    private final ArchiveAutoRuleSyncImpl archiveAutoRuleSync;
+
     /**
      * 普通同步
      * @param srcNodeId
@@ -72,47 +77,68 @@ public class ArchiveTreeContractSyncImpl {
         return saveList;
     }
 
+    /**
+     * 往 dstTree 里合并入新增节点
+     * @param dstTree 目标节点
+     * @param addList 新的世数
+     * @param vo2Map
+     * @return
+     */
+    public ArchiveTreeContractVO2  mergerToTree(ArchiveTreeContractVO2  dstTree,List<ArchiveTreeContract> addList,Map<Long,ArchiveTreeContractVO2> vo2Map) {
+        List<ArchiveTreeContractVO2> contractVO2List = new ArrayList<>();
+
+        ForestNodeMergerEx.getTreeList(dstTree, contractVO2List);
+
+        //获取所有节点的id -> ArchiveTreeContractVO2 的map
+        arTreeContractInitService.getMap(contractVO2List,addList,vo2Map);
+
+//        for (ArchiveTreeContract archiveTreeContract : addList) {
+//            ArchiveTreeContractVO2 treeContractVO2 = new ArchiveTreeContractVO2();
+//            treeContractVO2.setId(archiveTreeContract.getId());
+//            treeContractVO2.setParentId(archiveTreeContract.getParentId());
+//            treeContractVO2.setTitle(archiveTreeContract.getNodeName());
+//            treeContractVO2.setSort(archiveTreeContract.getSort());
+//            treeContractVO2.setArchiveAutoNodeId(archiveTreeContract.getArchiveAutoNodeId());
+//            treeContractVO2.setArchiveAutoType(archiveTreeContract.getArchiveAutoType());
+//            treeContractVO2.setArchiveAutoGroupId(archiveTreeContract.getArchiveAutoGroupId());
+//            treeContractVO2.setArchiveAutoGroupSelect(archiveTreeContract.getArchiveAutoGroupSelect());
+//            contractVO2List.add(treeContractVO2);
+//            if (vo2Map!= null) {
+//                vo2Map.put(treeContractVO2.getId(),treeContractVO2);
+//            }
+//        }
+
+        List<ArchiveTreeContractVO2> trees = ForestNodeMergerEx.merge(contractVO2List);
+        return trees.get(0);
+    }
+
+
     /**
      * 刷新祖先节点和排序
      * @param dstTree
      * @param addList
      */
-    public void InitTreeSort(ArchiveTreeContractVO2  dstTree,List<ArchiveTreeContract> addList)
+    public void InitTreeSort(ArchiveTreeContractVO2  dstTree,List<ArchiveTreeContract> addList,List<ArchiveTreeContract> upList)
     {
-        List<ArchiveTreeContractVO2> contractVO2List = new ArrayList<>();
-        ForestNodeMergerEx.getTreeList(dstTree,contractVO2List);
-
         Map<Long,ArchiveTreeContractVO2> vo2Map = new LinkedHashMap<>();
-        for (ArchiveTreeContract archiveTreeContract:addList) {
-            ArchiveTreeContractVO2 treeContractVO2 = new ArchiveTreeContractVO2();
-            treeContractVO2.setId(archiveTreeContract.getId());
-            treeContractVO2.setParentId(archiveTreeContract.getParentId());
-            treeContractVO2.setTitle(archiveTreeContract.getNodeName());
-            treeContractVO2.setSort(archiveTreeContract.getSort());
-            contractVO2List.add(treeContractVO2);
-            vo2Map.put(treeContractVO2.getId(),treeContractVO2);
-        }
 
-        List<ArchiveTreeContractVO2> trees = ForestNodeMergerEx.merge(contractVO2List);
+        //将新增节点合并到树里
+        ArchiveTreeContractVO2 tree = mergerToTree(dstTree,addList,vo2Map);
 
-        ForestNodeMergerEx.InitAncestors(trees.get(0),"0");
+        //排序
+        ForestNodeMergerEx.InitAncestors(tree,"0");
 
-        ForestNodeMergerEx.InitTreeSort(trees.get(0), "");
+        ForestNodeMergerEx.InitTreeSort(tree, "");
 
-        for (ArchiveTreeContract archiveTreeContract:addList) {
-            ArchiveTreeContractVO2 tmp = vo2Map.get(archiveTreeContract.getId());
-            if (tmp != null ) {
-                archiveTreeContract.setAncestors(tmp.getAncestors());
-                archiveTreeContract.setTreeSort(tmp.getTreeSort());
-                archiveTreeContract.setAncestors(tmp.getAncestors());
-                archiveTreeContract.setArchiveAutoNodeId(tmp.getArchiveAutoNodeId());
-                archiveTreeContract.setArchiveAutoGroupId(tmp.getArchiveAutoGroupId());
-                archiveTreeContract.setArchiveAutoType(tmp.getArchiveAutoType());
+        //更新自动组卷节点
+        archiveAutoRuleSync.syncArchiveTreeContractList(vo2Map);
+
+        //根据vo的排序和自动组卷信息,刷新新增节点,根据修改标识生成更新节点
+        arTreeContractInitService.handleAddAndUpList(vo2Map,addList,upList);
 
-            }
-        }
     }
 
+
     /**
      * 普通同步
      * @param dstNodeId
@@ -125,7 +151,7 @@ public class ArchiveTreeContractSyncImpl {
 
         List<ArchiveTreeContract> saveList = new ArrayList<>();
         //todo 等测试OK再打开
-        saveList =arTreeContractInitService.getContractExtNodes(AuthUtil.getTenantId(),projectId,dstTree);
+        //saveList =arTreeContractInitService.getContractExtNodes(AuthUtil.getTenantId(),projectId,dstTree);
 
         return saveList;
     }

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

@@ -82,9 +82,6 @@ import org.springframework.transaction.TransactionDefinition;
 import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.support.DefaultTransactionDefinition;
 
-import javax.imageio.ImageIO;
-import java.awt.Color;
-import java.awt.image.BufferedImage;
 import java.io.*;
 import java.net.URL;
 import java.text.SimpleDateFormat;
@@ -593,44 +590,29 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         }
 
         //
-        List<WbsTreeContract> lastList = new ArrayList<>();
+        Map<Long,String> lastList = new HashMap<>();
         List<WbsTreeContract> collect = wbsTreeContractList.stream().filter(wbsTreeContract -> "0".equals(wbsTreeContract.getParentId().toString())).collect(Collectors.toList());
 
         this.dataInfo(collect,lastList,Data);
 
         if(lastList!=null && lastList.size()>=1){
-            for(WbsTreeContract data : lastList){
-                UpdateWrapper<WbsTreeContract> updateWrapper = new UpdateWrapper<>();
-                updateWrapper.eq("p_key_id", data.getPKeyId() + "");
-                updateWrapper.set("ancestors", data.getAncestors());
-                wbsTreeContractService.getBaseMapper().update(data,updateWrapper);
+            int index = 0;
+            StringBuffer sb =new StringBuffer();
+            for(Long data : lastList.keySet()){
+                sb.append(" update m_wbs_tree_contract set ancestors='"+lastList.get(data)+"' where p_key_id="+data+";");
+                index = index+1;
+                System.out.println(index);
+                if(index>=1000){
+                    jdbcTemplate.execute(sb.toString());
+                    sb = new StringBuffer();
+                }
             }
         }
         return R.data("成功");
     }
 
 
-    public void dataInfo(List<WbsTreeContract> collect,List<WbsTreeContract> lastList,Map<String , List<WbsTreeContract> > Data){
-
-        /*List<WbsTreeContract> redata = new ArrayList<>();
-        if (collect!=null && collect.size()==1){
-            // 主节点
-            for(WbsTreeContract fu:collect){
-                String dataId = fu.getId()+"";
-                List<WbsTreeContract> er = Data.get(dataId);
-                redata.add(fu);
-                if(er!=null && er.size()>=1){
-                    for(WbsTreeContract erData : er){
-                        erData.setAncestors(fu.getAncestors()+","+erData.getParentId());
-                        lastList.add(erData);
-                    }
-                }
-            }
-        }
-        if(redata!=null && redata.size()>=1){
-            this.dataInfo(redata,lastList,Data);
-        }*/
-
+    public void dataInfo(List<WbsTreeContract> collect,Map<Long ,String > lastList,Map<String , List<WbsTreeContract> > Data){
 
         Queue<WbsTreeContract> queue = new LinkedList<>();
         //将第一层级的目录全部入列
@@ -642,8 +624,13 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             List<WbsTreeContract> er = Data.get(dataId);
             if(er!=null && er.size()>=1){
                 for(WbsTreeContract erData : er){
-                    erData.setAncestors(tree.getAncestors()+","+erData.getParentId());
-                    lastList.add(erData);
+                    String Ancestors="";
+                    if(lastList.containsKey(tree.getPKeyId())){
+                        Ancestors = lastList.get(tree.getPKeyId());
+                    }else{
+                        Ancestors = tree.getAncestors();
+                    }
+                    lastList.put(erData.getPKeyId(),Ancestors+","+erData.getParentId());
                 }
             }
 
@@ -885,7 +872,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 //保存操作记录
                 this.operationLogClient.saveUserOperationLog(1, "资料填报", "工序填报页面", json);
                 // 更新redis
-                informationQueryClient.AsyncWbsTree(wbsTreeContractByP.getParentId()+"",wbsTreeContractByP.getParentId()+"",wbsTreeContractByP.getContractId(),"","1");
+                informationQueryClient.AsyncWbsTree(wbsTreeContractByP.getParentId() + "", wbsTreeContractByP.getParentId() + "", wbsTreeContractByP.getContractId(), "", "1");
             } catch (Exception e) {
                 e.printStackTrace();
                 return R.fail("操作失败");
@@ -904,12 +891,12 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         for (String p : part) {
             Matcher m = RegexUtils.matcher("(m_\\d{14}_\\d{19})\\((.+)\\)VALUES\\(([^)]+)\\).+column'(key_\\d{0,2})'", p.replaceAll("[\\n\\s]*", ""));
             if (m.find()) {
-                if(p.contains("Data too long for column")){
+                if (p.contains("Data too long for column")) {
                     List<Map<String, Object>> result = this.jdbcTemplate.queryForList("select CONCAT(a.tab_ch_name,'&',b.e_name) tf from m_table_info a join m_wbs_form_element b on b.f_id=a.id where a.tab_en_name='" + m.group(1) + "' and  b.e_key='" + m.group(4) + "'");
                     if (result.size() > 0) {
                         sb.append("【").append(result.get(0).values().stream().map(String::valueOf).collect(Collectors.joining(","))).append("数据库字段太短】");
                     }
-                }else if(p.contains("Unknown column")){
+                } else if (p.contains("Unknown column")) {
                     sb.append("【").append(m.group(1)).append(":").append(m.group(4)).append("关联错误】");
                 }
 
@@ -2000,16 +1987,47 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         List<Map<String, Object>> bussDataInfoTrial = this.getBussDataInfoTrial(id, pkeyId, Long.parseLong(contractId));
         Map<String, Object> DataInfo = bussDataInfoTrial.stream().findAny().orElse(null);
 
-        //获取excel流 和 html流
-        Workbook wb = new Workbook();
-        wb.loadFromMHtml(CommonUtil.getOSSInputStream(excelTab.getFileUrl()));
-        //获取工作表
-        Worksheet sheet = wb.getWorksheets().get(0);
-
-        //页码
-        PageSetup pageSetup = sheet.getPageSetup();
+        org.apache.poi.ss.usermodel.Workbook workbook = WorkbookFactory.create(CommonUtil.getOSSInputStream(excelTab.getFileUrl()));
+        Sheet sheet = workbook.getSheetAt(0);
+        sheet.setForceFormulaRecalculation(true);
+        Header header = sheet.getHeader();
+        //页眉
         if (pageNumber != 0 && pageNumberCount != 0) {
-            pageSetup.setRightHeader("第" + pageNumber + "页,共" + pageNumberCount + "页");
+            header.setRight("第" + pageNumber + "页,共" + pageNumberCount + "页");
+        }
+
+        //标题Title
+        ProjectInfo projectInfo = projectInfoService.getById(wbsTreePrivate.getProjectId());
+        int all = sheet.getRow(0).getLastCellNum();
+        int mergedCellCnt = sheet.getNumMergedRegions();
+        for (int i = 0; i < mergedCellCnt - 1; i++) {
+            CellRangeAddress mergedCell = sheet.getMergedRegion(i);
+            int xx = mergedCell.getNumberOfCells();
+            if (xx <= all) {
+                int fisRow = mergedCell.getFirstRow();
+                int firstCol = mergedCell.getFirstColumn();
+                Cell cell = sheet.getRow(fisRow).getCell(firstCol);
+                short fontIndex = cell.getCellStyle().getFontIndex();
+                Font oldFontAt = workbook.getFontAt(fontIndex);
+                Font redFont = workbook.createFont();
+                redFont.setFontHeightInPoints(oldFontAt.getFontHeightInPoints());//设置字体大小
+                redFont.setFontName(oldFontAt.getFontName());//设置字体
+                CellStyle newStyle = workbook.createCellStyle();//创建单元格样式
+                newStyle.cloneStyleFrom(cell.getCellStyle());
+                short fontHeightInPoints = redFont.getFontHeightInPoints();
+                if (fontHeightInPoints >= 14 && StringUtils.isEmpty(cell.getStringCellValue()) && fisRow <= 8) {
+                    String title = projectInfo.getProjectName();
+                    if (title.length() >= 30) {
+                        sheet.getRow(fisRow).setHeight((short) 900);
+                        newStyle.setWrapText(true);
+                    }
+                    redFont.setBold(true);
+                    newStyle.setFont(redFont);
+                    cell.setCellStyle(newStyle);
+                    cell.setCellValue(title);
+                    break;
+                }
+            }
         }
 
         //数据不为空
@@ -2020,134 +2038,173 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 Document doc = Jsoup.parse(htmlString);
                 Element table = doc.select("table").first();
                 Elements trs = table.select("tr");
-                Elements cols = table.select("col");
                 if (ObjectUtil.isNotEmpty(DataInfo)) {
-                    for (String val : DataInfo.keySet()) {
+                    for (String val : Objects.requireNonNull(DataInfo).keySet()) {
                         if (val.contains("__")) {
                             String[] DataVal = val.split("__");
                             String[] xy = DataVal[1].split("_");
+                            if (Integer.parseInt(xy[0]) < trs.size()) {
+                                Element ytzData = trs.get(Integer.parseInt(xy[0]));
+                                if (ytzData != null) {
+                                    Elements tdsx = ytzData.select("td");
+                                    if (Integer.parseInt(xy[1]) < tdsx.size()) {
+                                        Element data = ytzData.select("td").get(Integer.parseInt(xy[1]));
+                                        if (data != null) {
+                                            if (data.html().contains("x1") && data.html().contains("y1")) {
+                                                int x1 = 0;
+                                                int x2 = 0;
+                                                int y1 = 0;
+                                                int y2 = 0;
+                                                if (data.html().contains("el-tooltip")) {
+                                                    x1 = Integer.parseInt(data.children().get(0).children().get(0).attr("x1"));
+                                                    x2 = Integer.parseInt(data.children().get(0).children().get(0).attr("x2"));
+                                                    y1 = Integer.parseInt(data.children().get(0).children().get(0).attr("y1"));
+                                                } else {
+                                                    x1 = Integer.parseInt(data.children().get(0).attr("x1"));
+                                                    y1 = Integer.parseInt(data.children().get(0).attr("y1"));
+                                                }
+                                                if (x1 == 0) {
+                                                    x1 = 1;
+                                                }
+                                                String myData = DataInfo.get(val) + "";
+                                                if (myData.contains("T") && myData.contains("-") && myData.contains(":")) {
+                                                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+                                                    sdf.setTimeZone(TimeZone.getTimeZone("GTM+8"));
+                                                    SimpleDateFormat formatStr = new SimpleDateFormat("yyyy年MM月dd日");
+                                                    if (myData.contains(",") && myData.contains("]")) {
 
-                            Element data = trs.get(Integer.parseInt(xy[0])).select("td").get(Integer.parseInt(xy[1]));
+                                                        myData = myData.replace("[", "").replace("]", "").replaceAll("'", "");
+                                                        String[] dataVal = myData.split(",");
 
-                            if (data.html().contains("x1") && data.html().contains("y1")) {
-                                int x1 = 0;
-                                int y1 = 0;
-                                if (data.html().contains("el-tooltip")) {
-                                    x1 = Integer.parseInt(data.children().get(0).children().get(0).attr("x1"));
-                                    y1 = Integer.parseInt(data.children().get(0).children().get(0).attr("y1"));
+                                                        Date Start_dataStr = sdf.parse(dataVal[0]);
+                                                        Date end_dataStr = sdf.parse(dataVal[1]);
+                                                        String StartDate = formatStr.format(Start_dataStr);
+                                                        String endDate = formatStr.format(end_dataStr);
+                                                        if (StartDate.equals(endDate)) {
+                                                            myData = StartDate;
+                                                        } else {
+                                                            myData = StartDate + "-" + endDate;
+                                                        }
+                                                    } else {
+                                                        String[] dataStr = myData.split("T")[0].split("-");
+                                                        myData = StringUtil.format("{}年{}月{}日", dataStr[0], dataStr[1], Integer.parseInt(dataStr[2]) + 1);
+                                                    }
+                                                }
+                                                //https:bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20220819/b53cb6700db369381e3b03d7737bcdec.jpg__16_1
+                                                if (myData.contains("https") && myData.contains("aliyuncs")) {
+                                                    InputStream imageIn = CommonUtil.getOSSInputStream(myData);
+                                                    byte[] bytes = IOUtils.toByteArray(imageIn);
+                                                    // 这里根据实际需求选择图片类型
+                                                    int pictureIdx = workbook.addPicture(bytes, 6);
 
-                                } else {
-                                    x1 = Integer.parseInt(data.children().get(0).attr("x1"));
-                                    y1 = Integer.parseInt(data.children().get(0).attr("y1"));
-                                }
-                                if (x1 == 0) {
-                                    x1 = 1;
-                                }
-                                String myData = DataInfo.get(val) + "";
-
-                                if (myData.contains("T") && myData.contains("-") && myData.contains(":")) {
-                                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
-                                    sdf.setTimeZone(TimeZone.getTimeZone("GTM+8"));
-                                    SimpleDateFormat formatStr = new SimpleDateFormat("yyyy年MM月dd日");
-                                    if (myData.contains(",") && myData.contains("]")) {
-                                        myData = myData.replace("[", "").replace("]", "").replaceAll("'", "");
-                                        String[] dataVal = myData.split(",");
-
-                                        Date Start_dataStr = sdf.parse(dataVal[0]);
-                                        Date end_dataStr = sdf.parse(dataVal[1]);
-                                        String StartDate = formatStr.format(Start_dataStr);
-                                        String endDate = formatStr.format(end_dataStr);
-                                        if (StartDate.equals(endDate)) {
-                                            myData = StartDate;
-                                        } else {
-                                            myData = StartDate + "-" + endDate;
-                                        }
-                                    } else {
-                                        String[] dataStr = myData.split("T")[0].split("-");
-                                        myData = StringUtil.format("{}年{}月{}日", dataStr[0], dataStr[1], Integer.parseInt(dataStr[2]) + 1);
-                                    }
-                                }
+                                                    CreationHelper helper = workbook.getCreationHelper();
+                                                    ClientAnchor anchor = helper.createClientAnchor();
+                                                    anchor.setCol1(x1); // param1是列号
+                                                    anchor.setCol2(x2);
+                                                    anchor.setRow1(y1); // param2是行号
+                                                    anchor.setRow2(y2); // param2是行号
+                                                    //
+                                                    Drawing<?> drawing = sheet.createDrawingPatriarch();
+                                                    anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
+                                                    // 插入图片
+                                                    Picture pict = drawing.createPicture(anchor, pictureIdx); // 调整图片占单元格百分比的大小,1.0就是100%
+                                                    pict.resize(1, 1);
+                                                    FileUtils.imageOrientation(sheet, anchor, new DataVO(x1 - 1, y1 - 1));
 
-                                if (myData.contains("https") && myData.contains("aliyuncs")) {
-                                    BufferedImage image = ImageIO.read(CommonUtil.getOSSInputStream(myData));
-                                    int colspan = data.attr("COLSPAN").equals("") ? 0 : Integer.parseInt(data.attr("COLSPAN"));
-                                    int rowspan = data.attr("ROWSPAN").equals("") ? 0 : Integer.parseInt(data.attr("ROWSPAN"));
-                                    int picHeight = 0;
-                                    int picWidth = 0;
-
-                                    if (rowspan == 0) {
-                                        String dataInfo = trs.get(y1).attr("height");
-                                        if (StringUtils.isEmpty(dataInfo)) {
-                                            Element firstTd = trs.get(y1 - 1).children().get(0);
-                                            String[] heg = firstTd.attr("style").split(";");
-                                            for (String str : heg) {
-                                                if (str.contains("height:")) {
-                                                    picHeight = Integer.parseInt(str.split(":")[1].replaceAll("px", ""));
+                                                } else if (myData.equals("1") && data.html().contains("hc-form-checkbox-group")) {
+                                                    Row row = sheet.getRow(y1 - 1);
+                                                    if (row != null) {
+                                                        Cell cell = row.getCell(x1 - 1);
+                                                        if (cell != null) {
+                                                            String exceVal = cell.getStringCellValue().replaceAll(" ", "");
+                                                            short fontIndex = cell.getCellStyle().getFontIndex();
+                                                            Font fontAt = workbook.getFontAt(fontIndex);
+                                                            fontAt.setFontName("EUDC");
+                                                            cell.setCellValue(exceVal.replace("□", "\u2611"));
+                                                        } else {
+                                                            ObjectUtils.isNotEmpty(cell);
+                                                        }
+                                                    }
+                                                } else {
+                                                    Row row = sheet.getRow(y1 - 1);
+                                                    if (row != null) {
+                                                        Cell cell = row.getCell(x1 - 1);
+                                                        if (cell != null) {
+                                                            cell.setCellValue(myData);
+                                                        } else {
+                                                            ObjectUtils.isNotEmpty(cell);
+                                                        }
+                                                    }
                                                 }
                                             }
-                                        } else {
-                                            picHeight = Integer.parseInt(dataInfo);
-                                        }
-                                    } else {
-                                        for (int i = y1; i <= (y1 + rowspan); i++) { // 跨列处理
-                                            String dataInfo = trs.get(i).attr("height");
-                                            if (StringUtils.isNotEmpty(dataInfo)) {
-                                                picHeight += Integer.parseInt(dataInfo);
-                                            }
-                                        }
-                                    }
-
-                                    if (colspan >= 1) {
-                                        for (int i = x1 - 1; i < x1 + colspan - 1; i++) {
-                                            String dataInfo = cols.get(i).attr("width").replaceAll("px", "");
-                                            if (StringUtils.isNotEmpty(dataInfo)) {
-                                                picWidth += Integer.parseInt(dataInfo);
-                                            }
                                         }
                                     }
-
-                                    ExcelPicture pic = sheet.getPictures().add(y1, x1, image);
-                                    pic.setAutoSize(true);
-                                    pic.setWidth(picWidth - 10);
-                                    pic.setHeight(picHeight);
-                                    pic.setLeft(5);
-                                } else {
-                                    CellRange cellRange = sheet.getCellRange(y1, x1);
-                                    cellRange.getCellStyle().getExcelFont().setFontName("EUDC");
-                                    cellRange.setText(myData);
                                 }
                             }
                         }
                     }
                 }
+
                 // 组装电签设置
                 QueryWrapper<TextdictInfo> queryWrapper = new QueryWrapper<>();
                 queryWrapper.select("col_key", "id");
-                queryWrapper.eq("type", 2);
+                queryWrapper.in("type", 2);
                 queryWrapper.eq("tab_id", wbsTreePrivate.getPKeyId());
-                List<TextdictInfo> textDictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
-                if (textDictInfos != null && !textDictInfos.isEmpty()) {
-                    for (TextdictInfo e : textDictInfos) {
+
+                List<TextdictInfo> textdictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
+                if (textdictInfos != null && !textdictInfos.isEmpty()) {
+                    for (TextdictInfo e : textdictInfos) {
                         String key = e.getColKey();
                         String[] keys = key.split("__");
-                        String[] trTd = keys[1].split("_");
-                        Element data = trs.get(Integer.parseInt(trTd[0])).select("td").get(Integer.parseInt(trTd[1]));
-                        int x1 = Integer.parseInt(data.children().get(0).attr("x1"));
-                        if (x1 == 0) {
-                            x1 = 1;
-                        }
-                        int y1 = Integer.parseInt(data.children().get(0).attr("y1"));
+                        String[] trtd = keys[1].split("_");
+                        if (Integer.parseInt(trtd[0]) < trs.size()) {
+                            Element ytzData = trs.get(Integer.parseInt(trtd[0]));
+                            if (ytzData != null) {
+                                Elements tdsx = ytzData.select("td");
+                                if (Integer.parseInt(trtd[1]) < tdsx.size()) {
+                                    Element data = ytzData.select("td").get(Integer.parseInt(trtd[1]));
+                                    if (data.html().indexOf("el-tooltip") >= 0) {
+                                        data = data.children().get(0);
+                                    }
 
-                        final CellRange cellRange = sheet.getCellRange(y1, x1);
-                        cellRange.setText(e.getId() + "");
-                        cellRange.getCellStyle().getFont().setColor(Color.white);
+                                    int x1 = Integer.parseInt(data.children().get(0).attr("x1"));
+                                    if (x1 == 0) {
+                                        x1 = 1;
+                                    }
+                                    int y1 = Integer.parseInt(data.children().get(0).attr("y1"));
+
+                                    Row row = sheet.getRow(y1 - 1);
+                                    if (row != null) {
+                                        Cell cell = sheet.getRow(y1 - 1).getCell(x1 - 1);
+                                        if (cell != null || ObjectUtils.isNotEmpty(cell)) {
+                                            short fontIndex = cell.getCellStyle().getFontIndex();
+                                            Font oldfontAt = workbook.getFontAt(fontIndex);
+
+                                            Font redFont = workbook.createFont();
+                                            redFont.setColor(IndexedColors.WHITE.getIndex()); //设置字体颜色
+                                            redFont.setFontHeightInPoints(oldfontAt.getFontHeightInPoints());//设置字体大小
+                                            redFont.setFontName(oldfontAt.getFontName());//设置字体
+
+                                            CellStyle newStyle = workbook.createCellStyle(); //创建单元格样式
+                                            newStyle.cloneStyleFrom(cell.getCellStyle());
+                                            newStyle.setFont(redFont);
+                                            cell.setCellStyle(newStyle);
+                                            cell.setCellValue(e.getId() + "");
+                                        }
+                                    }
+                                }
+                            }
+                        }
                     }
                 }
             }
         }
 
-        wb.saveToFile(excelPath, ExcelVersion.Version2010);
-        FileUtils.excelToPdf(excelPath, pdfPath);
+        //输出流
+        FileOutputStream outputStream = new FileOutputStream(excelPath);
+        workbook.write(outputStream);
+        FileUtils.setExcelScaleToPdf(excelPath, pdfPath);
+
         BladeFile bladeFile = newIOSSClient.uploadFile(pkeyId + ".pdf", pdfPath);
         TableFile tableFile1 = tableFileService.getBaseMapper().selectOne(Wrappers.<TableFile>query().lambda().eq(TableFile::getTabId, pkeyId + "").eq(TableFile::getType, 1).eq(TableFile::getTrialRecordId, id));
         if (tableFile1 != null) {
@@ -2201,7 +2258,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             }
             jdbcTemplate.execute(sql);
 
-            wb.dispose();
             return bladeFile2.getLink();
         }
 
@@ -2271,10 +2327,10 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         String querySql = "select id from u_information_query where classify ='" + classify + "' and wbs_id ='" + id + "' and contract_id ='" + contractId + "'";
         List<InformationQuery> query = jdbcTemplate.query(querySql, new BeanPropertyRowMapper<>(InformationQuery.class));
         if (query.size() > 0) {
-            String updateSql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "', name ='" + trialProjectName + "'  where classify='" + classify + "' and  wbs_id='" + id + "' and contract_id ='" + contractId + "'";
+            String updateSql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "', name ='" + (StringUtils.isNotEmpty(trialProjectName) ? trialProjectName : "") + "'  where classify='" + classify + "' and  wbs_id='" + id + "' and contract_id ='" + contractId + "'";
             jdbcTemplate.execute(updateSql);
         } else {
-            informationQueryClient.saveData(id.toString(), projectId, contractId, classify, bladeFile.getLink(), trialProjectName);
+            informationQueryClient.saveData(id.toString(), projectId, contractId, classify, bladeFile.getLink(), StringUtils.isNotEmpty(trialProjectName) ? trialProjectName : "");
         }
 
         return bladeFile.getLink();

+ 3 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -50,7 +50,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     private final ConstructionLedgerFeignClient constructionLedgerFeign;
     private final WbsTreePrivateMapper wbsTreePrivateMapper;
     private final ContractInfoMapper contractInfoMapper;
-
     private final JdbcTemplate jdbcTemplate;
 
     @Override
@@ -79,7 +78,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public boolean submitWbsTreeInContract(WbsTreeContractDTO pawDTO) {
         String wbsTreeIds = pawDTO.getWbsTreeIds();
         String[] ids = wbsTreeIds.split(",");
@@ -99,8 +97,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         //当前合同段所有节点ids
         List<String> collect2 = new ArrayList<>();
         if (list.size() > 0) {
-            collect1 = list.stream().filter(f -> f.getType() == 2).collect(Collectors.toList()).stream().map(WbsTreeContract::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
-            collect2 = list.stream().filter(f -> f.getType() == 1).collect(Collectors.toList()).stream().map(WbsTreeContract::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
+            collect1 = list.stream().filter(f -> f.getType() == 2).collect(Collectors.toList()).stream().map(WbsTreeContract::getId).map(String::valueOf).collect(Collectors.toList());
+            collect2 = list.stream().filter(f -> f.getType() == 1).collect(Collectors.toList()).stream().map(WbsTreeContract::getId).map(String::valueOf).collect(Collectors.toList());
         }
 
         List<String> collect3 = collect2;
@@ -124,7 +122,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 });
             });
 
-            List<String> collect = wbsTreePrivateList2.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
+            List<String> collect = wbsTreePrivateList2.stream().map(WbsTreePrivate::getId).map(String::valueOf).collect(Collectors.toList());
 
             List<String> diffRent1 = DiffListUtil.getDiffRent(collect, collect1);
 

+ 49 - 35
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -264,7 +264,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                 informationQueryClient.AsyncWbsTree("", parentId, contractInfo.getId() + "", "", "1");
             }
         }
-
         return true;
     }
 
@@ -810,18 +809,20 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     public boolean syncNodeTable(String primaryKeyId) {
         if (StringUtils.isNotEmpty(primaryKeyId)) {
             //获取当前节点对应节点信息
-            WbsTreePrivate wbsTreePrivate = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, primaryKeyId));
+            WbsTreePrivate wbsTreePrivate = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, primaryKeyId));
             //获取项目信息
-            ProjectInfo projectInfo = projectInfoMapper.selectOne(Wrappers.<ProjectInfo>query().lambda().eq(ProjectInfo::getId, wbsTreePrivate.getProjectId()));
+            ProjectInfo projectInfo = projectInfoMapper.selectOne(Wrappers.<ProjectInfo>lambdaQuery()
+                    .select(ProjectInfo::getReferenceWbsTemplateType, ProjectInfo::getReferenceWbsTemplateTypeTrial)
+                    .eq(ProjectInfo::getId, wbsTreePrivate.getProjectId()));
 
             List<WbsTreePrivate> insertDataPrivateList = new ArrayList<>();
-            List<WbsTreeContract> insertDataContractList = new ArrayList<>();
+            //List<WbsTreeContract> insertDataContractList = new ArrayList<>();
 
             if (("1").equals(wbsTreePrivate.getWbsType())) {
                 if (("public").equals(projectInfo.getReferenceWbsTemplateType())) {
                     /*TODO-------------------------------------质检公有引用同步--------------------------------------------*/
                     //获取当前节点对应的公有引用树下的元素表
-                    WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>query().lambda().eq(WbsTree::getId, wbsTreePrivate.getId()));
+                    WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>lambdaQuery().select(WbsTree::getAncestors, WbsTree::getWbsId, WbsTree::getId).eq(WbsTree::getId, wbsTreePrivate.getId()));
                     List<WbsTree> wbsTreesPublicTables;
                     if (wbsTree.getAncestors().equals("0")) {
                         //根节点
@@ -831,7 +832,10 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     }
 
                     //获取当前项目树下的元素表 节点
-                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId()).eq(WbsTreePrivate::getStatus, 1));
+                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                            .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                            .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+                            .eq(WbsTreePrivate::getStatus, 1));
                     List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
 
                     List<WbsTreePrivate> wbsTreePrivatesProjectTables;
@@ -851,12 +855,14 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             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<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());
+                    List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());*/
 
                     //构造
                     for (WbsTree tree : addPublicTables) {
@@ -873,7 +879,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
                             /*同步到该项目下所有合同段*/
                             //找到当前新增成功的元素表
-                            for (ContractInfo contractInfo : contractInfos) {
+                            /*for (ContractInfo contractInfo : contractInfos) {
                                 WbsTreeContract dataContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
                                 if (dataContract != null) {
                                     Long idContract = SnowFlakeUtil.getId();
@@ -938,14 +944,16 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                         }
                                     }
                                 }
-                            }
+                            }*/
                         }
                     }
 
                 } else if (("private").equals(projectInfo.getReferenceWbsTemplateType())) {
                     /*TODO-------------------------------------质检私有引用同步--------------------------------------------*/
                     //根据wbsTreePrivate的wbsId=私有引用的pKeyId来获取引用树根节点
-                    WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
+                    WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery()
+                            .select(WbsTreePrivate::getWbsId, WbsTreePrivate::getProjectId)
+                            .eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
                     //获取当前私有引用树的元素表信息
                     List<WbsTreePrivate> wbsTreePrivateRootTables;
                     if (wbsTreePrivate.getAncestors().equals("0")) {
@@ -971,17 +979,17 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     List<WbsTreePrivate> addPrivateTable = wbsTreePrivateRootTables.stream().filter(f ->
                             !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
 
-                    //获取当前项目下所有施工合同段id
-                    List<ContractInfo> contractInfos = contractInfoMapper.selectContractIdByProjectId(wbsTreePrivate.getProjectId());
-
                     //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
                     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());
+                    List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());*/
 
                     //构造
                     for (WbsTreePrivate tree : addPrivateTables) {
@@ -995,7 +1003,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             insertDataPrivateList.add(dataPrivate);
 
                             //同步到该项目下的所有合同段
-                            for (ContractInfo contractInfo : contractInfos) {
+                            /*for (ContractInfo contractInfo : contractInfos) {
                                 WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
                                 if (wbsTreeContract != null) {
                                     wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
@@ -1059,7 +1067,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                         }
                                     }
                                 }
-                            }
+                            }*/
                         }
                     }
                 }
@@ -1098,12 +1106,12 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             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<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());
+                    List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());*/
 
                     //构造
                     for (WbsTree tree : addPublicTables) {
@@ -1120,7 +1128,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
                             /*同步到该项目下所有合同段*/
                             //找到当前新增成功的元素表
-                            for (ContractInfo contractInfo : contractInfos) {
+                            /*for (ContractInfo contractInfo : contractInfos) {
                                 WbsTreeContract dataContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
                                 if (dataContract != null) {
                                     Long idContract = SnowFlakeUtil.getId();
@@ -1185,7 +1193,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                         }
                                     }
                                 }
-                            }
+                            }*/
                         }
                     }
 
@@ -1218,17 +1226,17 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     List<WbsTreePrivate> addPrivateTable = wbsTreePrivateRootTables.stream().filter(f ->
                             !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
 
-                    //获取当前项目下所有施工合同段id
-                    List<ContractInfo> contractInfos = contractInfoMapper.selectContractIdByProjectId(wbsTreePrivate.getProjectId());
-
                     //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
                     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());
+                    List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());*/
 
                     //构造
                     for (WbsTreePrivate tree : addPrivateTables) {
@@ -1243,7 +1251,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             insertDataPrivateList.add(dataPrivate);
 
                             //同步到该项目下的所有合同段
-                            for (ContractInfo contractInfo : contractInfos) {
+                            /*for (ContractInfo contractInfo : contractInfos) {
                                 WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
                                 if (wbsTreeContract != null) {
                                     wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
@@ -1307,7 +1315,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                         }
                                     }
                                 }
-                            }
+                            }*/
                         }
                     }
                 }
@@ -1316,9 +1324,9 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             if (insertDataPrivateList.size() > 0) {
                 this.insertBatch(insertDataPrivateList, 1000);
             }
-            if (insertDataContractList.size() > 0) {
+            /*if (insertDataContractList.size() > 0) {
                 wbsTreeContractService.insertBatch(insertDataContractList, 1000);
-            }
+            }*/
             return true;
         }
         return false;
@@ -1479,22 +1487,28 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     @Async
     @Override
     public void batchResetHtmlUrl(List<WbsTreePrivate> wbsTreePrivateList) throws IOException, InterruptedException {
+        Thread.sleep(10000L);
         if (wbsTreePrivateList != null) {
             //存在htmlUrl才重新保存
             wbsTreePrivateList = wbsTreePrivateList.stream().filter(wtp -> StringUtils.isNotBlank(wtp.getHtmlUrl())).collect(Collectors.toList());
             String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
             //批量复制保存html
             for (WbsTreePrivate tree : wbsTreePrivateList) {
+                String[] split = tree.getHtmlUrl().split("/");
                 File file_in = ResourceUtil.getFile(tree.getHtmlUrl());
-                String fileCode = SnowFlakeUtil.getId() + "";
-                String htmlUrl = file_path + "/privateUrlCopy/" + fileCode + ".html";
+//                File file_in = ResourceUtil.getFile("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\"+split[split.length-1]);
+                if (!file_in.exists() || file_in==null || file_in.length()==0){
+                    continue;
+                }
+                String htmlUrl = file_path + "/privateUrlCopy/" + split[split.length-1];
+//                String htmlUrl = "C:\\Users\\泓创研发01\\Desktop\\privateUrlCopy\\" + split[split.length-1];
                 File file_out = ResourceUtil.getFile(htmlUrl);
                 FileUtil.copy(file_in, file_out);
                 tree.setHtmlUrl(htmlUrl);
             }
             //批量修改
             if (wbsTreePrivateList.size() > 1000) {
-                List<List<WbsTreePrivate>> splitList = CommonUtil.splitList(wbsTreePrivateList, 1000);
+                List<List<WbsTreePrivate>> splitList = CommonUtil.splitList(wbsTreePrivateList, 800);
                 for (List<WbsTreePrivate> list : splitList) {
                     baseMapper.updateBatchByPKeyId(list);
                 }
@@ -1849,10 +1863,10 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         }*/
 
         //标题解决
-        /*ProjectInfo projectInfo = projectInfoMapper.selectById(wbsTreePrivate.getProjectId());
+        ProjectInfo projectInfo = projectInfoMapper.selectById(wbsTreePrivate.getProjectId());
         //添加标题显示
         Elements trs = table.select("tr");
-        for (int i = 0; i < 6; i++) {
+        for (int i = 1; i < 6; i++) {
             Element tr = trs.get(i);
             Elements tds = tr.select("td");
             for (int j = 0; j < tds.size(); j++) {
@@ -1866,7 +1880,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     }
                 }
             }
-        }*/
+        }
 
         //获取公式颜色
         String tabName = wbsTreePrivate.getInitTableName();

+ 59 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/test.java

@@ -0,0 +1,59 @@
+package org.springblade.manager.utils;
+
+import cn.hutool.core.comparator.PinyinComparator;
+import cn.hutool.extra.pinyin.PinyinUtil;
+import cn.hutool.extra.pinyin.engine.pinyin4j.Pinyin4jEngine;
+import com.alibaba.druid.sql.repository.SchemaObjectType;
+import com.alibaba.excel.util.DateUtils;
+import org.jsoup.Connection;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.Map;
+
+public class test {
+
+    public static void main(String[] args) {
+        Map<String, Map<String, String>> map = getWeather("chongqing", "202304");
+//        String str = LocalDateTime.now().minusDays(1L).format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
+//        System.out.println(map.get(str));
+    }
+    public static  Map<String,Map<String,String>> getWeather(String city,String month){
+        String html = "http://www.tianqihoubao.com/lishi/"+city+"/month/"+month+".html";
+        System.out.println(html);
+        Map<String,Map<String,String>> map = new HashMap<>();
+        Document document = null;
+        try {
+            document = Jsoup.connect(html).get();
+            Element body = document.body();
+            Elements table = body.getElementsByTag("table");
+            Elements trs = table.select("tr");
+            if (trs.get(0).select("td").text().contains("本站目前")){
+                System.out.println("网页错误");
+                return null;
+            }
+            for (int i = 1; i < trs.size(); i++) {
+                Element tr = trs.get(i);
+                Elements tds = tr.select("td");
+
+                Map<String,String> m = new HashMap<>();
+                m.put("weather",tds.get(1).text().split("/")[0].trim());
+                String[] split = tds.get(2).text().split("/");
+                m.put("tempLow",split[0].substring(0,split[0].length()-2));
+                m.put("tempHigh",split[1].substring(0,split[1].length()-1));
+                m.put("windLevel",tds.get(3).text().substring(tds.get(3).text().length()-2));
+                map.put(tds.get(0).text(),m);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+}