Jelajahi Sumber

Merge remote-tracking branch 'origin/master'

liuyc 2 tahun lalu
induk
melakukan
e6d780a025
14 mengubah file dengan 663 tambahan dan 214 penghapusan
  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. 70 13
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/WeatherInfoServiceImpl.java
  9. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  10. 97 22
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java
  11. 23 11
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveAutoRuleSyncImpl.java
  12. 243 116
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  13. 54 28
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java
  14. 32 13
      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>

+ 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;
+    }
+
 }

+ 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;
     }

+ 32 - 13
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/test.java

@@ -1,5 +1,9 @@
 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;
@@ -8,29 +12,44 @@ 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 {
 
-    private static String URL = "http://www.tianqihoubao.com/lishi/";
-
-    public static void main111(String[] args) {
-        getWeather("重庆市");
+    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,Object> getWeather(String city){
-
-        Map<String,Object> map = new HashMap<>();
-        String pinYin = "chongqing";//Pinyin4jUtils.getPinYin(city);
-        pinYin = pinYin.replace("shi","");
-        String yyMMdd = "202303";//DateUtils.getFormat("yyyyMMdd");
+    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("http://www.tianqihoubao.com/lishi/chongqing/month/202303.html").get();
+            document = Jsoup.connect(html).get();
             Element body = document.body();
             Elements table = body.getElementsByTag("table");
-            System.out.println("ddd");
+            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();
         }