ソースを参照

Merge remote-tracking branch 'origin/master'

liuyc 2 年 前
コミット
b940008225
18 ファイル変更404 行追加55 行削除
  1. 3 0
      blade-ops/blade-swagger/src/main/resources/application-dev.yml
  2. 30 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveOfflineVersionInfo.java
  3. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java
  4. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ArchiveTreeContractClient.java
  5. 74 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveOfflineVersionInfoController.java
  6. 14 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveOfflineVersionInfoMapper.java
  7. 20 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveOfflineVersionInfoMapper.xml
  8. 12 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveOfflineVersionInfoService.java
  9. 0 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  10. 16 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveOfflineVersionInfoServiceImpl.java
  11. 83 49
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  12. 9 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java
  13. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java
  14. 16 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ArchiveTreeContractImpl.java
  15. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
  16. 25 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  17. 89 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  18. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java

+ 3 - 0
blade-ops/blade-swagger/src/main/resources/application-dev.yml

@@ -19,3 +19,6 @@ knife4j:
       - name: 业务接口
         uri: 127.0.0.1:8090
         location: /blade-business/v2/api-docs
+      - name: 档案接口
+        uri: 127.0.0.1:8090
+        location: /blade-archive/v2/api-docs

+ 30 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveOfflineVersionInfo.java

@@ -0,0 +1,30 @@
+package org.springblade.archive.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.time.LocalDateTime;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/3/30 18:26
+ **/
+@Data
+@TableName("u_archive_offline_version_info")
+public class ArchiveOfflineVersionInfo extends BaseEntity {
+    private Long id;
+    private Long projectId;
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "发布时间")
+    private LocalDateTime uploadDate;
+    @ApiModelProperty(value = "文件路径")
+    private String fileUrl;
+    @ApiModelProperty(value = "文件名称")
+    private String fileName;
+    @ApiModelProperty(value = "文件大小")
+    private String fileSize;
+}

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

@@ -61,4 +61,7 @@ public interface ArchiveFileClient {
 
     @PostMapping(API_PREFIX + "/getArchiveFileByArchivesId")
     List<ArchiveFile> getArchiveFileByArchivesId(@RequestParam String archivesIds,@RequestParam String fileIds);
+
+    @PostMapping(API_PREFIX + "/updateArchiveFileForCreateArchive")
+    void updateArchiveFileForCreateArchive(@RequestBody List<ArchiveFile> waitArchiveFiles);
 }

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ArchiveTreeContractClient.java

@@ -21,4 +21,7 @@ public interface ArchiveTreeContractClient {
     List<ArchiveTreeContract> queryAllChildByAncestors(@RequestParam String id);
 
 
+    @PostMapping(API_PREFIX + "/getHavedFileNodeByProjectID")
+    List<ArchiveTreeContract> getHavedFileNodeByProjectID(@RequestParam Long projectId);
+
 }

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

@@ -0,0 +1,74 @@
+package org.springblade.archive.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springblade.archive.entity.ArchiveOfflineVersionInfo;
+import org.springblade.archive.mapper.ArchiveOfflineVersionInfoMapper;
+import org.springblade.archive.service.IArchiveOfflineVersionInfoService;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.core.oss.model.BladeFile;
+import org.springblade.core.tool.api.R;
+import org.springblade.resource.vo.NewBladeFile;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.text.DecimalFormat;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/3/30 18:28
+ **/
+@RestController
+@AllArgsConstructor
+@RequestMapping("/archiveOfflineVersionInfo")
+@Api(value = "档案离线版本信息", tags = "档案离线版本信息")
+public class ArchiveOfflineVersionInfoController {
+
+    private final ArchiveOfflineVersionInfoMapper mapper;
+
+    /**
+     * 打包数据
+     */
+    @ApiOperation(value = "打包数据")
+    @GetMapping("/packData")
+    public R<String> packData(Long projectId){
+        //异步调用自动打包上传,完成后修改数据库信息
+        return R.data("最新数据后台自动打包中,打包完成后会更新打包日期");
+    }
+    /**
+     * 脱机载体工具
+     */
+    @ApiOperation(value = "脱机载体工具")
+    @GetMapping("/getVersionInfo")
+    public R<ArchiveOfflineVersionInfo> getVersionInfo(Long projectId){
+        ArchiveOfflineVersionInfo versionInfo = mapper.selectVersionInfo(111L);
+        String size = this.formatSize(Long.parseLong(versionInfo.getFileSize()));
+        versionInfo.setFileSize(size);
+        return R.data(versionInfo);
+    }
+    /**
+     * 根据字节返回文件大小
+     */
+    private String formatSize(long fileS) {
+        DecimalFormat df = new DecimalFormat("#.00");
+        String fileSizeString = "";
+        String wrongSize = "0B";
+        if (fileS == 0) {
+            return wrongSize;
+        }
+        if (fileS < 1024) {
+            fileSizeString = df.format((double) fileS) + "B";
+        } else if (fileS < 1048576) {
+            fileSizeString = df.format((double) fileS / 1024) + "KB";
+        } else if (fileS < 1073741824) {
+            fileSizeString = df.format((double) fileS / 1048576) + "MB";
+        } else {
+            fileSizeString = df.format((double) fileS / 1073741824) + "GB";
+        }
+        return fileSizeString;
+    }
+}

+ 14 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveOfflineVersionInfoMapper.java

@@ -0,0 +1,14 @@
+package org.springblade.archive.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.archive.entity.ArchiveOfflineVersionInfo;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/3/31 10:09
+ **/
+public interface ArchiveOfflineVersionInfoMapper extends BaseMapper<ArchiveOfflineVersionInfo> {
+    ArchiveOfflineVersionInfo selectVersionInfo(@Param("projectId") Long projectId);
+}

+ 20 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveOfflineVersionInfoMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.archive.mapper.ArchiveOfflineVersionInfoMapper">
+
+    <resultMap id="ResultMap" type="org.springblade.archive.entity.ArchiveOfflineVersionInfo">
+        <result column="id" property="id"/>
+        <result column="project_id" property="projectId"/>
+        <result column="upload_date" property="uploadDate"/>
+        <result column="file_url" property="fileUrl"/>
+        <result column="file_name" property="fileName"/>
+        <result column="file_size" property="fileSize"/>
+    </resultMap>
+    <select id="selectVersionInfo" resultMap="ResultMap">
+        SELECT id, project_id, upload_date, file_url, file_name, file_size
+        FROM bladex.u_archive_offline_version_info
+        where project_id = #{projectId}
+        order by upload_date desc
+        limit 1;
+    </select>
+</mapper>

+ 12 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveOfflineVersionInfoService.java

@@ -0,0 +1,12 @@
+package org.springblade.archive.service;
+
+import org.springblade.archive.entity.ArchiveOfflineVersionInfo;
+import org.springblade.core.mp.base.BaseService;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/3/31 10:09
+ **/
+public interface IArchiveOfflineVersionInfoService extends BaseService<ArchiveOfflineVersionInfo> {
+}

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

@@ -41,6 +41,4 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	IPage<ArchivesAutoVO> selectArchivesAutoFilePage(ArchivesAutoVO queryVo);
 
 	boolean updateArchivesAutoFileByNodeId(String ids, String nodeId,String nodeSort);
-
-	void splitArchvies(Long projectId);
 }

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

@@ -0,0 +1,16 @@
+package org.springblade.archive.service.impl;
+
+import org.springblade.archive.entity.ArchiveOfflineVersionInfo;
+import org.springblade.archive.mapper.ArchiveOfflineVersionInfoMapper;
+import org.springblade.archive.service.IArchiveOfflineVersionInfoService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/3/31 10:09
+ **/
+@Service
+public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<ArchiveOfflineVersionInfoMapper, ArchiveOfflineVersionInfo> implements IArchiveOfflineVersionInfoService {
+}

+ 83 - 49
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -32,11 +32,13 @@ import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.feign.ArchiveTreeContractClient;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import java.time.LocalDateTime;
 import java.util.*;
 
 /**
@@ -51,6 +53,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 	private final IDictBizClient iDictBizClient;
 	private ArchiveFileClient archiveFileClient;
+	private ArchiveTreeContractClient archiveTreeContractClient;
+
+
 	@Override
 	public IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto) {
 		return page.setRecords(baseMapper.selectArchivesAutoPage(page, archivesAuto));
@@ -112,26 +117,34 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	}
 
 
-	/**
-	 * 自动归档前 将未锁定的案卷拆卷
-	 * @param projectId
-	 */
-	@Override
-	public void splitArchvies(Long projectId){
-		try{
-			baseMapper.splitArchvies(projectId);
-		}catch (Exception e){
-			e.printStackTrace();
-		}
-	}
-
-
 
-	public void archiveAutoMethod(){
+	public void archiveAutoMethod(Long projectId){
 		//步骤一:把项目下未锁定的案卷拆卷。
+		baseMapper.splitArchvies(projectId);
 		//步骤二:查询归档树节点。存在未归档文件的节点。
+		List<ArchiveTreeContract> list = archiveTreeContractClient.getHavedFileNodeByProjectID(projectId);
 		//步骤三:遍历归档树节点整理出 默认规则节点,分类并卷节点,单独组卷节点 三个集合。
+		List<ArchiveTreeContract> list1= new ArrayList<>();
+		List<ArchiveTreeContract> list2= new ArrayList<>();
+		List<ArchiveTreeContract> list3= new ArrayList<>();
+		for(ArchiveTreeContract treeContract:list){
+			Integer archiveAutoType = treeContract.getArchiveAutoType();
+			switch (archiveAutoType){
+				case 1:
+					list1.add(treeContract);
+					break;
+				case 2:
+					list2.add(treeContract);
+					break;
+				case 3:
+					list3.add(treeContract);
+					break;
+			}
+		}
 		//步骤四:按照单独,分类,默认的顺序执行组卷流程。
+		archiveAutoMethod3(list3);//单独组卷
+		archiveAutoMethod2(list2);//分类组卷
+		archiveAutoMethod1(list1);//默认组卷
 	}
 
 
@@ -171,46 +184,60 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		return null;
 	}
 
-	/**
-	 * 单独组卷规则组卷
-	 * @param waitArchiveFiles
-	 * @param node
-	 */
-	private void createArchive3(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node){
-		//1.创建新案卷
+	private ArchivesAuto builtArchives(ArchiveTreeContract node,int pageN,int fileN){
 		ArchivesAuto archivesAuto = new ArchivesAuto();
-		//archivesAuto.setProjectId();
-		//archivesAuto.setContractId();
-		//archivesAuto.setName();//案卷题名
-		//archivesAuto.setFileNumber();//档号
+		archivesAuto.setProjectId(node.getProjectId());
+		archivesAuto.setContractId(node.getContractId());
+		archivesAuto.setName("");//TODO 案卷题名
+		archivesAuto.setFileNumber("");//TODO 档号
 		//archivesAuto.setMicron();//微缩号
-		//archivesAuto.setUnit();//单位
+		archivesAuto.setUnit("");//TODO 单位
 		//archivesAuto.setQuantity();//数量/单位
-		//archivesAuto.setSpecification();//规格
-		//archivesAuto.setStartDate();
-		//archivesAuto.setEndDate();
-		//archivesAuto.setStorageTime();//保管时间
-		//archivesAuto.setSecretLevel();//保密级别
+		archivesAuto.setSpecification("");//TODO 规格 从节点规格获取
+		archivesAuto.setStartDate(null);//TODO 文件开始时间
+		archivesAuto.setEndDate(null);//TODO 文件结束时间
+		archivesAuto.setStorageTime("");//TODO 保管时间  从节点规格获取
+		archivesAuto.setSecretLevel("");//TODO 保密级别 从节点规格获取
 		//archivesAuto.setCarrierType();//载体类型
 		//archivesAuto.setKeywords();//主题词
 		//archivesAuto.setStorageLocation();//存放位置
-		//archivesAuto.setIsArchive(1);//已归档
+		archivesAuto.setIsArchive(1);//已归档
 		//archivesAuto.setRemark();//备注
-		//archivesAuto.setRollDate();//立卷日期
-		//archivesAuto.setRollor();//立卷人
-		//archivesAuto.setNodeId();//归档树节点
-		//archivesAuto.setOutUrl();
-		//archivesAuto.setFileN();//文件数量
-		//archivesAuto.setPageN();//案卷页数
+		archivesAuto.setRollDate(null);// TODO 立卷日期
+		archivesAuto.setRollor("自动");//立卷人
+		archivesAuto.setNodeId(node.getId());//归档树节点
+		archivesAuto.setOutUrl("");//TODO 生成案卷的封面 目录 备考表,背级
+		archivesAuto.setFileN(fileN);//文件数量
+		archivesAuto.setPageN(pageN);//案卷页数
 		//archivesAuto.setMileage();
 		//archivesAuto.setFileType();
 		//archivesAuto.setSize();
-		//archivesAuto.setTreeSort();
+		archivesAuto.setTreeSort(node.getTreeSort());
 		//archivesAuto.setIsOpen();
-		//archivesAuto.setIscheck();
-		//archivesAuto.setIsAutoFile();
+		archivesAuto.setIscheck(0);
+		archivesAuto.setIsAutoFile(0);//是否案卷收集上传的案卷
+		archivesAuto.setIsLock(0);//案卷锁定状态
+		baseMapper.insert(archivesAuto);
+		return archivesAuto;
+	}
 
+	/**
+	 * 单独组卷规则组卷
+	 * @param waitArchiveFiles
+	 * @param node
+	 */
+	private void createArchive3(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node,int pageN){
+
+		//1.创建新案卷
+		ArchivesAuto archivesAuto = builtArchives(node, pageN, waitArchiveFiles.size());
 		//2.设置文件所属案卷,组卷状态
+		Long archivesAutoId = archivesAuto.getId();
+		for(ArchiveFile file:waitArchiveFiles){
+			file.setArchiveId(archivesAutoId);//设置文件所属案卷
+			file.setIsArchive(1);
+			//TODO 重新打页码文件
+		}
+		archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
 	}
 
 
@@ -240,8 +267,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 					//步骤5:判断文件是否存在分盒设置
 					if(file.getBoxNumber()!=null){
 						//TODO 走分盒组卷流程
-						if(archiveFilesSize==archiveFiles.size()){
-							//TODO 最后一个文件直接将waitArchiveFiles组卷
+						if(archiveFilesSize==archiveFiles.size() && waitArchiveFiles.size()>0){
+							//最后一个文件直接将waitArchiveFiles组卷
+							createArchive3(waitArchiveFiles,node,archivesSize);
 						}
 					}else{
 						//单独组卷流程
@@ -254,7 +282,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 							waitArchiveFiles.add(file);
 							//判断是否最后一个文件
 							if(archiveFilesSize==archiveFiles.size()){
-								//TODO 最后一个文件直接将waitArchiveFiles组卷
+								//最后一个文件直接将waitArchiveFiles组卷
+								createArchive3(waitArchiveFiles,node,archivesSize);
 							}else{
 								continue;
 							}
@@ -262,7 +291,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 						//步骤6.2达到规格 可以组一卷
 						if(checkStatus==1){
 							waitArchiveFiles.add(file);
-							//TODO 将waitArchiveFiles组卷
+							//将waitArchiveFiles组卷
+							createArchive3(waitArchiveFiles,node,archivesSize);
 							//将待组卷文件集合,总页数还原初始值,
 							waitArchiveFiles.clear();
 							archivesSize=0;
@@ -271,7 +301,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 						if(checkStatus==-1){
 							//如果waitArchiveFiles集合size>0,先将集合中文件组卷。再将当前文件放入集合
 							if(waitArchiveFiles.size()>0){
-								//TODO 将waitArchiveFiles组卷,然后将待组卷文件集合,总页数还原初始值,
+								//将waitArchiveFiles组卷,
+								createArchive3(waitArchiveFiles,node,archivesSize);
+								//然后将待组卷文件集合,总页数还原初始值,
 								waitArchiveFiles.clear();
 								//保存当前文件进入待组卷集合,待组卷页数=当前文件页数
 								waitArchiveFiles.add(file);
@@ -279,14 +311,16 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 								//判断是否最后一个文件
 								if(archiveFilesSize==archiveFiles.size()){
-									//TODO 如果当前文件最后一个文件直接将waitArchiveFiles组卷
+									//如果当前文件最后一个文件直接将waitArchiveFiles组卷
+									createArchive3(waitArchiveFiles,node,archivesSize);
 									waitArchiveFiles.clear();
 									archivesSize=0;
 								}
 							}else{
 								//步骤6.3.2如果waitArchiveFiles集合size=0,说明当前文件已经超过规格,直接将当前文件组卷
 								waitArchiveFiles.add(file);
-								//TODO 直接将waitArchiveFiles组卷
+								//直接将waitArchiveFiles组卷
+								createArchive3(waitArchiveFiles,node,archivesSize);
 								waitArchiveFiles.clear();
 								archivesSize=0;
 							}

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

@@ -85,4 +85,13 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
 
         return this.iArchiveFileService.getArchiveFileByArchivesId(archivesIds,fileIds);
     }
+
+    /**
+     * 组卷完成 设置文件对应案卷
+     * @param waitArchiveFiles
+     */
+    @Override
+    public void updateArchiveFileForCreateArchive(List<ArchiveFile> waitArchiveFiles) {
+        iArchiveFileService.updateBatchById(waitArchiveFiles);
+    }
 }

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

@@ -156,6 +156,7 @@ public class ArchiveFileServiceImpl extends BaseServiceImpl<ArchiveFileMapper, A
 		}
 	}
 
+
 	@Override
 	public IPage<ArchiveFileVO> selectArchiveFilePageByBoxName(ArchiveFileVO vo) {
 		Query query = new Query();
@@ -179,4 +180,5 @@ public class ArchiveFileServiceImpl extends BaseServiceImpl<ArchiveFileMapper, A
 
 		return iPage.setRecords(pageVoList);
 	}
+
 }

+ 16 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ArchiveTreeContractImpl.java

@@ -3,6 +3,7 @@ package org.springblade.manager.feign;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.mapper.ArchiveTreeContractMapper;
 import org.springblade.manager.service.IArchiveTreeContractService;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -15,6 +16,8 @@ public class ArchiveTreeContractImpl implements ArchiveTreeContractClient {
 
     private final IArchiveTreeContractService archiveTreeContractService;
 
+    private ArchiveTreeContractMapper archiveTreeContractMapper;
+
     @Override
     public List<ArchiveTreeContract> queryAllChildByAncestors(String id) {
         List<ArchiveTreeContract> archiveTreeList = this.archiveTreeContractService.list(Wrappers.<ArchiveTreeContract>lambdaQuery().like(ArchiveTreeContract::getAncestors, id));
@@ -29,4 +32,17 @@ public class ArchiveTreeContractImpl implements ArchiveTreeContractClient {
 
         return archiveTreeList;
     }
+
+    /**
+     * 获取项目下存在未组卷文件的归档树节点
+     * @param projectId
+     * @return
+     */
+    @Override
+    public List<ArchiveTreeContract> getHavedFileNodeByProjectID(Long projectId) {
+        List<ArchiveTreeContract> list = archiveTreeContractMapper.getHavedFileNodeByProjectID(projectId);
+        return list;
+    }
+
+
 }

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

@@ -65,4 +65,7 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
 	int updateBatch2(@Param("diffRent") List<String> diffRent);
 
 	int updateBatch3();
+
+
+	List<ArchiveTreeContract> getHavedFileNodeByProjectID(@Param("projectId") Long projectId);
 }

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

@@ -283,4 +283,29 @@
         AND status = 1
     </update>
 
+    <select id="getHavedFileNodeByProjectID" resultMap="archiveTreeContractResultMap">
+        SELECT
+            *
+        FROM
+            m_archive_tree_contract
+        WHERE
+            1 = 1
+          AND project_id = #{projectId}
+          AND is_deleted = 0
+          AND archive_auto_type IS NOT NULL
+          AND id IN (
+            SELECT
+                node_id
+            FROM
+                u_archive_file
+            WHERE
+                1 = 1
+              AND project_id = #{projectId}
+              AND is_deleted = 0
+              AND ( is_archive = 0 OR is_archive IS NULL )
+              AND node_id IS NOT NULL
+        )
+        order by tree_sort asc
+    </select>
+
 </mapper>

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

@@ -218,6 +218,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 			archiveTreeContractDTO.setTenantId(parent.getTenantId());
 			String ancestors = parent.getAncestors() + StringPool.COMMA + archiveTreeContractDTO.getParentId();
 			archiveTreeContractDTO.setAncestors(ancestors);
+			archiveTreeContractDTO.setTreeSort(parent.getTreeSort());
 		}
 
 		archiveTreeContractDTO.setIsDeleted(BladeConstant.DB_NOT_DELETED);
@@ -242,6 +243,11 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 				sort = max.get().getSort();
 			}
 			archiveTreeContractDTO.setSort(sort + 1);
+			String treeSort = archiveTreeContractDTO.getTreeSort();
+			if (StringUtils.isNotEmpty(treeSort)) {
+				treeSort = treeSort + 100 + archiveTreeContractDTO.getSort();
+				archiveTreeContractDTO.setTreeSort(treeSort);
+			}
 		}
 
 		return save(archiveTreeContractDTO);
@@ -259,11 +265,44 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 	@Override
 	public boolean submitArchiveTreeSort(List<ArchiveTreeContractDTO> listSort) {
 		int sortNumber = 1;
+		List<ArchiveTreeContract> changeList = new ArrayList<>();
+
+
+		ArchiveTreeContract parent = null;
 		for (ArchiveTreeContractDTO archiveTreeSortDTO : listSort) {
-			archiveTreeSortDTO.setSort(sortNumber);
+			if (archiveTreeSortDTO.getSort() != sortNumber) {
+				ArchiveTreeContract archiveTreeContract = getById(archiveTreeSortDTO.getId());
+				if (archiveTreeContract!= null ) {
+					archiveTreeContract.setSort(sortNumber);
+					if (parent == null ) {
+						parent = getById(archiveTreeSortDTO.getParentId());
+					}
+					if (parent != null  && StringUtils.isNotEmpty(parent.getTreeSort())){
+						Integer sort = archiveTreeContract.getSort() + 100;
+						archiveTreeContract.setTreeSort(parent.getTreeSort() + sort);
+					}
+					changeList.add(archiveTreeContract);
+				}
+			}
 			sortNumber++;
-			baseMapper.updateById(archiveTreeSortDTO);
 		}
+
+		this.saveOrUpdateBatch(changeList);
+
+		//有子节点,并且父节点排序号不为空,则排序子节点
+		List<Long> changeIds = changeList.stream().map(s->s.getId()).collect(Collectors.toList());
+
+		List<ArchiveTreeContract> childrens =  baseMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
+					.in(ArchiveTreeContract::getParentId, changeIds)
+					.eq(ArchiveTreeContract::getIsDeleted, 0)
+			);
+		if (StringUtils.isNotEmpty(parent.getTreeSort()) &&
+				(childrens == null || childrens.size() == 0)) {
+			return true;
+		}
+
+		this.sortChildren(changeList);
+
 		return true;
 	}
 
@@ -603,6 +642,54 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		return true;
 	}
 
+	/**
+	 * 递归设置
+	 * @param archiveTreeContracts
+	 */
+	void sortChildren(List<ArchiveTreeContract> archiveTreeContracts){
+
+		if (archiveTreeContracts == null || archiveTreeContracts.size() == 0) {
+			return;
+		}
+
+
+
+		List<ArchiveTreeContractVO2> trees = this.tree2Root(AuthUtil.getTenantId(),null,null,archiveTreeContracts.get(0).getProjectId(),null);
+		if (trees.size() == 0) {
+			return;
+		}
+		ArchiveTreeContractVO2  tree = trees.get(0);
+
+		ForestNodeMergerEx.InitTreeSort(tree,"");
+
+		List<ArchiveTreeContractVO2> changeList = new ArrayList<>();
+
+		for (ArchiveTreeContract ar:  archiveTreeContracts) {
+			ArchiveTreeContractVO2 subTree = ForestNodeMergerEx.getSubTree(tree,ar.getId());
+			List<ArchiveTreeContractVO2> tmpList = new ArrayList<>();
+			ForestNodeMergerEx.getTreeList(subTree,tmpList);
+			changeList.addAll(tmpList);
+		}
+
+		Map<Long,ArchiveTreeContractVO2>  map = new HashMap<>();
+		List<Long> ids = new ArrayList<>();
+		for (ArchiveTreeContractVO2 ar : changeList) {
+			ids.add(ar.getId());
+			map.put(ar.getId(),ar);
+		}
+
+		List<ArchiveTreeContract> changeArchiveList = baseMapper.selectBatchIds(ids);
+		for (ArchiveTreeContract changeNode: changeArchiveList) {
+			ArchiveTreeContractVO2 ar = map.get(changeNode.getId());
+			if (ar!= null ){
+				changeNode.setTreeSort(ar.getTreeSort());
+			}
+		}
+		this.saveOrUpdateBatch(changeArchiveList);
+	}
+
+
+
 
 
 

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

@@ -430,7 +430,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
     }
 
     /**
-     * 归档树节点规则设置保存(系统级)
+     * 归档树节点规则设置保存
      * @param archiveAutoType
      * @param nodeIds
      * @return
@@ -479,7 +479,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
     }
 
     /**
-     * 归档树wbs节点规则设置保存(系统级)
+     * 归档树wbs节点规则设置保存
      * @param archiveAutoType
      * @param nodeIds
      * @return