Pārlūkot izejas kodu

档案鉴定,相关

qianxb 2 gadi atpakaļ
vecāks
revīzija
51a72be12c

+ 163 - 148
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO.java

@@ -33,152 +33,167 @@ import java.util.List;
 @Data
 @EqualsAndHashCode(callSuper = true)
 public class ArchivesAutoVO extends ArchivesAuto {
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 当前页
-     */
-    @ApiModelProperty("当前页")
-    private Integer current;
-
-    /**
-     * 当前页
-     */
-    @ApiModelProperty("当前页显示条数")
-    private Integer size;
-
-    /**
-     * 搜索类型
-     */
-    @ApiModelProperty("搜索类型1案卷2文件")
-    private Integer searchType;
-
-    /**
-     * 年
-     */
-    @ApiModelProperty("年")
-    private String year;
-
-    private List<String> years;
-
-    /**
-     * 年
-     */
-    @ApiModelProperty("月")
-    private String month;
-
-    private List<String> months;
-
-    /**
-     * 输入框查询条件
-     */
-    @ApiModelProperty("输入框查询条件")
-    private String queryValue;
-
-    /**
-     * 节点查询条件
-     */
-    @ApiModelProperty("节点查询条件")
-    private String nodeIds;
-
-    private List<String> nodeIdArray;
-
-    /**
-     * 保密级别
-     */
-    private String secretLevelValue;
-
-    /**
-     * 搜索密级集合
-     */
-    private List<String> secretLevels;
-
-    /**
-     * 保管期限(单位/年)
-     */
-    private String storageTimeValue;
-
-    /**
-     * 搜索期限集合
-     */
-    private List<String> storageTimes;
-
-    /**
-     * 搜索类别集合
-     */
-    private List<String> carrierTypes;
-
-    /**
-     * 案卷合同类型,C施工、S监理、空业主
-     */
-    private String contractType;
-
-    @ApiModelProperty("批量保存")
-    private List<ArchivesAutoVO> list;
-    /**
-     * 案卷收集附件信息
-     */
-    @ApiModelProperty("附件信息")
-    private List<ApprovalFile> approvalFileList = new ArrayList<>();
-
-    public void setApprovalFileList(List<ApprovalFile> approvalFileList) {
-        this.approvalFileList = approvalFileList;
-    }
-
-    @Data
-    public static class ApprovalFile {
-
-        /**
-         * 文件绑定的节点ID
-         */
-        private String nodeId;
-
-        /**
-         * 文件编号
-         */
-        private String fileNumber;
-
-        /**
-         * 文件名称
-         */
-        private String fileName;
-
-        /**
-         * 文件时间
-         */
-        private String fileTime;
-
-        /**
-         * 文件路径
-         */
-        private String fileUrl;
-
-        /**
-         * PDF文件路径
-         */
-        private String pdfFileUrl;
-
-        /**
-         * 文件页数
-         */
-        private Integer filePage;
-
-        /**
-         * 是否需要审批,0不需要,1需要
-         */
-        private Integer isApproval;
-
-        /**
-         * 是否需要认证,0不需要,1需要
-         */
-        private Integer isNeedCertification;
-        /**
-         * 责任者
-         */
-        private String dutyUser;
-
-        private String archiveId;
-
-        private Long id;
-    }
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 当前页
+	 */
+	@ApiModelProperty("当前页")
+	private Integer current;
+
+	/**
+	 * 当前页
+	 */
+	@ApiModelProperty("当前页显示条数")
+	private Integer size;
+
+	/**
+	 * 搜索类型
+	 */
+	@ApiModelProperty("搜索类型1案卷2文件")
+	private Integer searchType;
+
+	/**
+	 * 年
+	 */
+	@ApiModelProperty("年")
+	private String year;
+
+	private List<String> years;
+
+	/**
+	 * 年
+	 */
+	@ApiModelProperty("月")
+	private String month;
+
+	private List<String> months;
+
+	/**
+	 * 输入框查询条件
+	 */
+	@ApiModelProperty("输入框查询条件")
+	private String queryValue;
+
+	/**
+	 * 节点查询条件
+	 */
+	@ApiModelProperty("节点查询条件")
+	private String nodeIds;
+
+	private List<String> nodeIdArray;
+
+	/**
+	 * 保密级别
+	 */
+	private String secretLevelValue;
+
+	/**
+	 * 搜索密级集合
+	 */
+	private List<String> secretLevels;
+
+	/**
+	 * 保管期限(单位/年)
+	 */
+	private String storageTimeValue;
+
+	/**
+	 * 搜索期限集合
+	 */
+	private List<String> storageTimes;
+
+	/**
+	 * 是否过期
+	 */
+	private Integer isOutOfDate;
+
+	/**
+	 * 	文件大小值
+	 */
+	private String fileSizeValue;
+
+	/**
+	 * 搜索类别集合
+	 */
+	private List<String> carrierTypes;
+
+	/**
+	 * 销毁人
+	 */
+	private Long destroyUser;
+
+	/**
+	 * 案卷合同类型,C施工、S监理、空业主
+	 */
+	private String contractType;
+
+	@ApiModelProperty("批量保存")
+	private List<ArchivesAutoVO> list;
+	/**
+	* 案卷收集附件信息
+	* */
+	@ApiModelProperty("附件信息")
+	private List<ApprovalFile> approvalFileList = new ArrayList<>();
+
+	public void setApprovalFileList(List<ApprovalFile> approvalFileList) {
+		this.approvalFileList = approvalFileList;
+	}
+
+	@Data
+	public static class ApprovalFile {
+
+		/**
+		 * 文件绑定的节点ID
+		 */
+		private String nodeId;
+
+		/**
+		 * 文件编号
+		 */
+		private String fileNumber;
+
+		/**
+		 * 文件名称
+		 */
+		private String fileName;
+
+		/**
+		 * 文件时间
+		 */
+		private String fileTime;
+
+		/**
+		 * 文件路径
+		 */
+		private String fileUrl;
+
+		/**
+		 * PDF文件路径
+		 */
+		private String pdfFileUrl;
+
+		/**
+		 * 文件页数
+		 */
+		private Integer filePage;
+
+		/**
+		 * 是否需要审批,0不需要,1需要
+		 */
+		private Integer isApproval;
+
+		/**
+		 * 是否需要认证,0不需要,1需要
+		 */
+		private Integer isNeedCertification;
+		/**
+		 * 责任者
+		 */
+		private String dutyUser;
+
+		private  String archiveId;
+
+		private Long id;
+	}
 }

+ 10 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -452,4 +452,14 @@ public class ArchivesAutoController extends BladeController {
         return R.data(archivesAutoService.getCarrierTypeByDict());
     }
 
+	/**
+	 * 获取档案销毁人列表
+	 */
+	@GetMapping("/getArchiveDestroyUser")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "获取档案销毁人列表", notes = "获取档案销毁人列表")
+	public R getArchiveDestroyUser(){
+		return R.data(archivesAutoService.getArchiveDestroyUser());
+	}
+
 }

+ 65 - 67
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java

@@ -24,107 +24,105 @@ import org.springblade.archive.vo.ArchivesAutoVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.system.entity.DictBiz;
+import org.springblade.system.user.entity.User;
 
 import java.util.List;
 import java.util.Map;
 
 /**
- * Mapper 接口
+ *  Mapper 接口
  *
  * @author BladeX
  * @since 2023-02-17
  */
 public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
 
-    /**
-     * 自定义分页
-     *
-     * @param page
-     * @param archivesAuto
-     * @return
-     */
-    List<ArchivesAutoVO> selectArchivesAutoPage(IPage page, ArchivesAutoVO archivesAuto);
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param archivesAuto
+	 * @return
+	 */
+	List<ArchivesAutoVO> selectArchivesAutoPage(IPage page, ArchivesAutoVO archivesAuto);
 
-    Integer selectArchivesAutoFileCount(@Param("vo") ArchivesAutoVO vo);
+	Integer selectArchivesAutoFileCount(@Param("vo") ArchivesAutoVO vo);
 
-    List<ArchivesAuto> selectArchivesAutoFilePage(@Param("current") Integer current, @Param("size") Integer size, @Param("vo") ArchivesAutoVO vo);
+	List<ArchivesAuto> selectArchivesAutoFilePage(@Param("current") Integer current, @Param("size") Integer size, @Param("vo")  ArchivesAutoVO vo);
 
-    Integer updateArchivesAutoFileByNodeId(@Param("ids") List<Long> ids, @Param("nodeId") String nodeId, @Param("nodeSort") String nodeSort);
+	Integer updateArchivesAutoFileByNodeId(@Param("ids") List<Long> ids,@Param("nodeId") String nodeId,@Param("nodeSort") String nodeSort);
 
-    /**
-     * 自动归档前 将未锁定的案卷拆卷
-     *
-     * @param projectId
-     */
+	/**
+	 * 自动归档前 将未锁定的案卷拆卷
+	 * @param projectId
+	 */
     Integer splitArchvies(@Param("projectId") Long projectId);
 
-    Integer splitArchviesByContract(@Param("projectId") Long projectId, @Param("contractId") Long contractId, @Param("treeCode") String treeCode);
+	Integer splitArchviesByContract(@Param("projectId") Long projectId,@Param("contractId") Long contractId,@Param("treeCode") String treeCode);
 
-    Integer splitArchviesByNode(@Param("projectId") Long projectId, @Param("ancestors") String ancestors, @Param("nodeId") String nodeId);
+	Integer splitArchviesByNode(@Param("projectId") Long projectId,@Param("ancestors") String ancestors,@Param("nodeId") String nodeId);
 
-    /**
-     * 获取案卷封面等pdfurl
-     *
-     * @param projectId
-     * @return
-     */
-    List<String> getArchivesOutUrlList(@Param("projectId") Long projectId);
+	/**
+	 * 获取案卷封面等pdfurl
+	 * @param projectId
+	 * @return
+	 */
+	List<String> getArchivesOutUrlList(@Param("projectId") Long projectId);
 
-    List<String> getArchivesOutUrlListByContract(@Param("projectId") Long projectId, @Param("contractId") Long contractId, @Param("treeCode") String treeCode);
+	List<String> getArchivesOutUrlListByContract(@Param("projectId") Long projectId,@Param("contractId") Long contractId,@Param("treeCode") String treeCode);
 
-    List<String> getArchivesOutUrlListByNode(@Param("projectId") Long projectId, @Param("ancestors") String ancestors, @Param("nodeId") String nodeId);
+	List<String> getArchivesOutUrlListByNode(@Param("projectId") Long projectId,@Param("ancestors") String ancestors,@Param("nodeId") String nodeId);
+	/**
+	 * 获取文件页面pdfurl
+	 * @param projectId
+	 * @return
+	 */
+	List<String> getFilePageUrlList(@Param("projectId") Long projectId);
 
-    /**
-     * 获取文件页面pdfurl
-     *
-     * @param projectId
-     * @return
-     */
-    List<String> getFilePageUrlList(@Param("projectId") Long projectId);
+	List<String> getFilePageUrlListByContract(@Param("projectId") Long projectId,@Param("contractId") Long contractId,@Param("treeCode") String treeCode);
 
-    List<String> getFilePageUrlListByContract(@Param("projectId") Long projectId, @Param("contractId") Long contractId, @Param("treeCode") String treeCode);
+	List<String> getFilePageUrlListByNode(@Param("projectId") Long projectId,@Param("ancestors") String ancestors,@Param("nodeId") String nodeId);
+	/**
+	 *  根据项目id获取所有档案
+	 */
+	List<ArchivesAutoDTO> getListByProjectId(@Param("projectId") Long projectId);
 
-    List<String> getFilePageUrlListByNode(@Param("projectId") Long projectId, @Param("ancestors") String ancestors, @Param("nodeId") String nodeId);
-
-    /**
-     * 根据项目id获取所有档案
-     */
-    List<ArchivesAutoDTO> getListByProjectId(@Param("projectId") Long projectId);
-
-    /**
-     * 档案利用-档案查询
-     */
+	/**
+	 *  档案利用-档案查询
+	 */
     List<ArchivesAutoVO> pageByArchivesAuto(IPage page, @Param("vo") ArchivesAutoVO vo);
 
-    /**
-     * 档案利用-档案查询,带范围
-     */
-    List<ArchivesAutoVO> pageByArchivesAuto2(IPage page, @Param("vo") ArchivesAutoVO vo);
+	/**
+	 *  档案利用-档案查询,带范围
+	 */
+	List<ArchivesAutoVO> pageByArchivesAuto2(IPage page, @Param("vo") ArchivesAutoVO vo);
+
+	/**
+	 *  档案鉴定-档案查询
+	 */
+	List<ArchivesAutoVO> pageByAuthenticate(IPage page, @Param("vo") ArchivesAutoVO vo);
 
-    /**
-     * 档案鉴定-档案查询
-     */
-    List<ArchivesAutoVO> pageByAuthenticate(IPage page, @Param("vo") ArchivesAutoVO vo);
+	/**
+	 * 获取当前项目所有案卷,并设置合同类型
+	 */
+	List<ArchivesAutoVO> getAllArchiveByContractType(@Param("projectId") Long projectId,@Param("type") String type);
 
-    /**
-     * 获取当前项目所有案卷,并设置合同类型
-     */
-    List<ArchivesAutoVO> getAllArchiveByContractType(@Param("projectId") Long projectId, @Param("type") String type);
+	/**
+	 * 获取所有案卷年限,并分组
+	 */
+	@MapKey("storage_time")
+	List<Map<String,String>> getAllArchiveAgeByContractType(@Param("projectId") Long projectId);
 
-    /**
-     * 获取所有案卷年限,并分组
-     */
-    @MapKey("storage_time")
-    List<Map<String, String>> getAllArchiveAgeByContractType(@Param("projectId") Long projectId);
+	List<String> getFilingUnitList(@Param("projectId") Long projectId);
 
-    List<String> getFilingUnitList(@Param("projectId") Long projectId);
 
+	Integer splitFiles(@Param("ids") List<Long> ids);
 
-    Integer splitFiles(@Param("ids") List<Long> ids);
+	List<DictBiz> getCarrierTypeByDict();
 
-    List<DictBiz> getCarrierTypeByDict();
+	void batchDestroyByIds(@Param("ids")List<String> ids);
 
-    void batchDestroyByIds(@Param("ids") List<String> ids);
+	List<User> getArchiveDestroyUser();
 
     String getUserRoleName(@Param("projectId") Long projectId, @Param("contractId") Long contractId, @Param("userId") Long userId);
 }

+ 27 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -499,7 +499,28 @@
             and uaa.storage_time = #{vo.storageTime}
         </if>
         <if test="vo.filingUnit != null and vo.filingUnit != ''">
-            and uaa.filing_unit = #{vo.filingUnit}
+            and uaa.unit = #{vo.filingUnit}
+        </if>
+        <if test="vo.destroyUser != null and vo.destroyUser != ''">
+            and uaa.update_user = #{vo.destroyUser}
+        </if>
+        <if test="vo.fileSizeValue != null and vo.fileSizeValue != ''">
+            <if test="vo.fileSizeValue == '小于80M'">
+                and uaa.file_size &lt; 81920
+            </if>
+            <if test="vo.fileSizeValue == '小于150M'">
+                and uaa.file_size &lt; 153600
+            </if>
+            <if test="vo.fileSizeValue == '小于200M'">
+                and uaa.file_size &lt; 204800
+            </if>
+            <if test="vo.fileSizeValue == '200M-500M'">
+                and uaa.file_size BETWEEN 204800 and 512000
+            </if>
+            <if test="vo.fileSizeValue == '大于500M'">
+                and uaa.file_size &gt; 512000
+            </if>
+
         </if>
         and uaa.is_archive = 1
     </select>
@@ -529,6 +550,11 @@
               AND user_id = #{userId}
         )
     </select>
+    <select id="getArchiveDestroyUser" resultType="org.springblade.system.user.entity.User">
+        SELECT id,real_name  FROM blade_user WHERE id IN (SELECT uaa.update_user  FROM u_archives_auto uaa
+                                                          WHERE uaa.is_deleted = 1 AND  uaa.is_destroy = 1
+                                                          GROUP BY uaa.update_user )
+    </select>
 
 
     <update id="splitFiles">

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

@@ -22,6 +22,7 @@ import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.system.entity.DictBiz;
+import org.springblade.system.user.entity.User;
 
 import java.util.List;
 import java.util.Map;
@@ -78,4 +79,6 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
     void test();
 
     List<DictBiz> getCarrierTypeByDict();
+
+    List<User> getArchiveDestroyUser();
 }

+ 1553 - 1546
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -58,6 +58,7 @@ import org.springblade.manager.feign.ProjectClient;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
+import org.springblade.system.user.entity.User;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.EnableAsync;
@@ -71,7 +72,7 @@ import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
 
 /**
- * 服务实现类
+ *  服务实现类
  *
  * @author BladeX
  * @since 2023-02-17
@@ -80,1563 +81,1569 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper, ArchivesAuto> implements IArchivesAutoService {
 
-    private final IDictBizClient iDictBizClient;
-    private ArchiveFileClient archiveFileClient;
-    private ArchiveTreeContractClient archiveTreeContractClient;
-    private ContractClient contractClient;
-    private ProjectClient projectClient;
-    private final ArchivesAutoMapper autoMapper;
-
-    @Autowired
-    private ExecutorService executorService;
-
-    private Map<String, Integer> indexMap = new HashMap<>(); //按立卷位区分和生成流水号
-    private IArchiveAutoPdfService archiveAutoPdfService;
-    private final NewIOSSClient iossClient;
-
-    private final IArchiveProjectConfigService archiveProjectConfigService;
-
-
-    @Override
-    public IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto) {
-        return page.setRecords(baseMapper.selectArchivesAutoPage(page, archivesAuto));
-    }
-
-    @Override
-    public IPage<ArchivesAutoVO> pageByArchivesAuto(ArchivesAutoVO vo) {
-        IPage<ArchivesAutoVO> page = new Page<>(vo.getCurrent(), vo.getSize());
-        if (StringUtils.isNotBlank(vo.getStorageTime())) {
-            vo.setStorageTimes(Arrays.asList(vo.getStorageTime().split(",")));
-        }
-        if (StringUtils.isNotBlank(vo.getSecretLevel())) {
-            vo.setSecretLevels(Arrays.asList(vo.getSecretLevel().split(",")));
-        }
-        if (StringUtils.isNotBlank(vo.getCarrierType())) {
-            vo.setCarrierTypes(Arrays.asList(vo.getCarrierType().split(",")));
-        }
-        if (StringUtils.isNotBlank(vo.getYear())) {
-            vo.setYears(Arrays.asList(vo.getYear().split(",")));
-        }
-        if (StringUtils.isNotBlank(vo.getMonth())) {
-            vo.setMonths(Arrays.asList(vo.getMonth().split(",")));
-        }
-        if (StringUtils.isNotBlank(vo.getCarrierType())) {
-            vo.setCarrierTypes(Arrays.asList(vo.getCarrierType().split(",")));
-        }
-        List<ArchivesAutoVO> archivesAutos = null;
-        //获取合同段类型
-        ContractInfo contractInfo = contractClient.getContractById(vo.getContractId());
-        Integer contractType = contractInfo.getContractType();
-        //根据用户在当前合同段的权限,判断返回
-        BladeUser user = AuthUtil.getUser();
-        String name = baseMapper.getUserRoleName(vo.getProjectId(), vo.getContractId(), user.getUserId());
-        if (name.contains("超级管理员") || contractType == 3) {
-            vo.setContractId(null);
-        }
-        if (StringUtils.isNotBlank(vo.getNodeIds())) {
-            vo.setNodeIdArray(Arrays.asList(vo.getNodeIds().split(",")));
-            archivesAutos = baseMapper.pageByArchivesAuto2(page, vo);
-        } else {
-            archivesAutos = baseMapper.pageByArchivesAuto(page, vo);
-        }
-        if (archivesAutos != null && archivesAutos.size() > 0) {
-            archivesAutos.stream().forEach(aa -> {
-                if (StringUtils.isNotBlank(aa.getStorageTime())) {
-                    aa.setStorageTimeValue("3".equals(aa.getStorageTime()) ? "永久" : ("2".equals(aa.getStorageTime()) ? "30年" : "10年"));
-                }
-                if (StringUtils.isNotBlank(aa.getSecretLevel())) {
-                    aa.setSecretLevelValue("1".equals(aa.getSecretLevel()) ? "机密" : ("2".equals(aa.getSecretLevel()) ? "绝密" : "秘密"));
-                }
-            });
-        }
-        return page.setRecords(archivesAutos);
-    }
-
-    @Override
-    public IPage<ArchivesAutoVO> selectArchivesAutoFilePage(ArchivesAutoVO vo) {
-        Query query = new Query();
-        query.setCurrent(vo.getCurrent());
-        query.setSize(vo.getSize());
-        //设置分页
-        IPage<ArchivesAutoVO> iPage = Condition.getPage(query);
-
-        //汇总
-        Integer total = this.baseMapper.selectArchivesAutoFileCount(vo);
-        if (total == null) {
-            total = 0;
-        }
-        //分页
-        int current = (vo.getCurrent() - 1) * vo.getSize();
-
-        List<ArchivesAuto> pageList = this.baseMapper.selectArchivesAutoFilePage(current, vo.getSize(), vo);
-        //设置分页信息
-        iPage.setTotal(total);
-        List<ArchivesAutoVO> pageVoList = JSONArray.parseArray(JSONObject.toJSONString(pageList), ArchivesAutoVO.class);
-        List<DictBiz> sheetSourceList = this.iDictBizClient.getList("security_level", "notRoot").getData();
-        List<DictBiz> sheetSourceList1 = this.iDictBizClient.getList("storage_period", "notRoot").getData();
-
-        pageVoList.forEach(vos -> {
-            if (StringUtils.isNotEmpty(vos.getSecretLevel())) {
-                sheetSourceList.forEach(source -> {
-                    if (source.getDictKey().equals(vos.getSecretLevel())) {
-                        vos.setSecretLevelValue(source.getDictValue());
-                    }
-                });
-            }
-            if (StringUtils.isNotEmpty(vos.getStorageTime())) {
-                sheetSourceList1.forEach(source -> {
-                    if (source.getDictKey().equals(vos.getStorageTime())) {
-                        vos.setStorageTimeValue(source.getDictValue());
-                    }
-                });
-            }
-        });
-
-        return iPage.setRecords(pageVoList);
-    }
-
-    @Override
-    public boolean updateArchivesAutoFileByNodeId(String ids, String nodeId, String nodeSort) {
-        try {
-            baseMapper.updateArchivesAutoFileByNodeId(Func.toLongList(ids), nodeId, nodeSort);
-
-        } catch (Exception e) {
-            e.printStackTrace();
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public Map<String, Integer> getAllArchiveByContractType(Long projectId, String typ) {
-        List<ArchivesAutoVO> list = baseMapper.getAllArchiveByContractType(projectId, typ);
-        List<ContractInfo> infos = contractClient.queryContractListByIds(Arrays.asList(projectId));
-        int key1 = 0, key2 = 0, key3 = 0;
-        //判断案卷属于1施工,2监理,还是3业主
-        for (ArchivesAutoVO l : list) {
-            String type = l.getContractType();
-            if (StringUtils.isBlank(type)) {
-                //业主
-                key3++;
-            } else if ("S".equals(type)) {
-                //监理
-                key2++;
-            } else if ("C".equals(type)) {
-                //施工
-                key1++;
-            } else if (type.length() > 10) {
-                for (ContractInfo info : infos) {
-                    if (type.equals(info.getId() + "")) {
-                        Integer t = info.getContractType();
-                        if (t == 1) {
-                            key1++;
-                        } else if (t == 2) {
-                            key2++;
-                        } else {
-                            key3++;
-                        }
-                        break;
-                    }
-                }
-            } else {
-                System.out.println(type);
-            }
-        }
-        Map<String, Integer> map = new HashMap<>();
-        map.put("key1", key1);
-        map.put("key2", key2);
-        map.put("key3", key3);
-        return map;
-    }
-
-    @Override
-    public List<Map<String, String>> getAllArchiveAgeByContractType(Long projectId) {
-        List<Map<String, String>> list = baseMapper.getAllArchiveAgeByContractType(projectId);
-        return list;
-    }
-
-    @Override
-    public void splitArchvies(Long projectId, Long contractId, Long nodeId) {
-        List<String> removeFiles = new ArrayList<>();
-        //没合同段的默认整个项目
-        if (contractId == null) {
-            //清除案卷封面等pdf
-            List<String> archivesOutUrlList = baseMapper.getArchivesOutUrlList(projectId);
-            if (archivesOutUrlList != null && archivesOutUrlList.size() > 0) {
-                for (String outUrl : archivesOutUrlList) {
-                    String[] splits = outUrl.split(",");
-                    for (String url : splits) {
-                        if (StringUtils.isNotEmpty(url.trim())) {
-                            removeFiles.add(FileUtils.getAliYunSubUrl(url));
-                        }
-                    }
-                }
-            }
-            //清除文件页面pdf
-            List<String> filePageUrlList = baseMapper.getFilePageUrlList(projectId);
-            if (filePageUrlList != null && filePageUrlList.size() > 0) {
-                for (String url : filePageUrlList) {
-                    if (StringUtils.isNotEmpty(url.trim())) {
-                        removeFiles.add(FileUtils.getAliYunSubUrl(url));
-                    }
-                }
-            }
-            executorService.execute(() -> {
-                iossClient.removeFiles(removeFiles);
-                log.debug("文件删完了");
-            });
-
-            //取消未锁定案卷文件关联
-            baseMapper.splitArchvies(projectId);
-
-        } else {
-            String treeCode = getAuthCode(contractId);
-            if (nodeId != null) {
-                //有节点的按节点
-                String strNodeId = nodeId.toString();
-                ArchiveTreeContract archiveTreeContract = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
-                String ancestors = archiveTreeContract.getAncestors() + "," + nodeId;
-
-                //清除案卷封面等pdf
-                List<String> archivesOutUrlList = baseMapper.getArchivesOutUrlListByNode(projectId, ancestors, strNodeId);
-                if (archivesOutUrlList != null && archivesOutUrlList.size() > 0) {
-                    for (String outUrl : archivesOutUrlList) {
-                        String[] splits = outUrl.split(",");
-                        for (String url : splits) {
-                            if (StringUtils.isNotEmpty(url.trim())) {
-                                removeFiles.add(FileUtils.getAliYunSubUrl(url));
-                            }
-                        }
-                    }
-                }
-                //清除文件页面pdf
-                List<String> filePageUrlList = baseMapper.getFilePageUrlListByNode(projectId, ancestors, strNodeId);
-                if (filePageUrlList != null && filePageUrlList.size() > 0) {
-                    for (String url : filePageUrlList) {
-                        if (StringUtils.isNotEmpty(url.trim())) {
-                            removeFiles.add(FileUtils.getAliYunSubUrl(url));
-                        }
-                    }
-                }
-                executorService.execute(() -> {
-                    iossClient.removeFiles(removeFiles);
-                    log.debug("文件删完了");
-                });
-
-                baseMapper.splitArchviesByNode(projectId, ancestors, strNodeId);
-            } else {
-                //没节点的按合同段
-                //清除案卷封面等pdf
-                List<String> archivesOutUrlList = baseMapper.getArchivesOutUrlListByContract(projectId, contractId, treeCode);
-                if (archivesOutUrlList != null && archivesOutUrlList.size() > 0) {
-                    for (String outUrl : archivesOutUrlList) {
-                        String[] splits = outUrl.split(",");
-                        for (String url : splits) {
-                            if (StringUtils.isNotEmpty(url.trim())) {
-                                removeFiles.add(FileUtils.getAliYunSubUrl(url));
-                            }
-                        }
-                    }
-                }
-                //清除文件页面pdf
-                List<String> filePageUrlList = baseMapper.getFilePageUrlListByContract(projectId, contractId, treeCode);
-                if (filePageUrlList != null && filePageUrlList.size() > 0) {
-                    for (String url : filePageUrlList) {
-                        if (StringUtils.isNotEmpty(url.trim())) {
-                            removeFiles.add(FileUtils.getAliYunSubUrl(url));
-                        }
-                    }
-                }
-                executorService.execute(() -> {
-                    iossClient.removeFiles(removeFiles);
-                    log.debug("文件删完了");
-                });
-
-                //没节点的按合同段
-                baseMapper.splitArchviesByContract(projectId, contractId, treeCode);
-            }
-
-        }
-
-
-    }
-
-    @Override
-    public void archiveAutoMethod(Long projectId, Long contractId, Long nodeId) {
-        //步骤一:把档号集合初始化
-        indexMap = new HashMap<>();
-        //步骤二:查询归档树节点。存在未归档文件的节点。
-        List<ArchiveTreeContract> list = archiveTreeContractClient.getHavedFileNodeByProjectID(projectId);
-
-        //按合同段过滤
-        List<ArchiveTreeContract> authlist = authFilter(list, contractId, nodeId);
-
-        //步骤三:遍历归档树节点整理出 默认规则节点,分类并卷节点,单独组卷节点 三个集合。
-        List<ArchiveTreeContract> list1 = new ArrayList<>();
-        List<ArchiveTreeContract> list2 = new ArrayList<>();
-        List<ArchiveTreeContract> list3 = new ArrayList<>();
-        for (ArchiveTreeContract treeContract : authlist) {
-            Integer archiveAutoType = treeContract.getArchiveAutoType();
-            switch (archiveAutoType) {
-                case 1:
-                    list1.add(treeContract);
-                    break;
-                case 2:
-                    list2.add(treeContract);
-                    break;
-                case 3:
-                    list3.add(treeContract);
-                    break;
-            }
-        }
-        //步骤四:按照单独,分类,默认,分盒的顺序执行组卷流程。
-
-        //分盒文件集合
-        Map<String, List<ArchiveFile>> boxMap = new LinkedHashMap<>();
-
-        archiveAutoMethod3(list3, boxMap);//单独组卷
-        archiveAutoMethod2(list2, projectId, boxMap);//分类组卷
-        archiveAutoMethod1(list1, boxMap);//默认组卷
-        archiveAutoMethodBox(boxMap);//分盒组卷
-    }
-
-    private void addBoxMap(ArchiveFile file, Map<String, List<ArchiveFile>> boxMap) {
-        String boxName = file.getBoxName();
-        if (boxMap.containsKey(boxName)) {
-            List<ArchiveFile> boxFiles = boxMap.get(boxName);
-            boxFiles.add(file);
-            boxMap.put(boxName, boxFiles);
-        } else {
-            List<ArchiveFile> boxFiles = new ArrayList<>();
-            boxFiles.add(file);
-            boxMap.put(boxName, boxFiles);
-        }
-    }
-
-    @Override
-    public IPage<ArchivesAutoVO> pageByAuthenticate(ArchivesAutoVO vo) {
-        IPage<ArchivesAutoVO> page = new Page<>(vo.getCurrent(), vo.getSize());
-        //根据权限返回结果
-        ContractInfo contractInfo = contractClient.getContractById(vo.getContractId());
-        Integer contractType = contractInfo.getContractType();
-        //根据用户在当前合同段的权限,判断返回
-        BladeUser user = AuthUtil.getUser();
-        String name = baseMapper.getUserRoleName(vo.getProjectId(), vo.getContractId(), user.getUserId());
-        List<ArchivesAutoVO> list = new ArrayList<>();
-        if (name.contains("超级管理员") || contractType == 3) {
-            list = baseMapper.pageByAuthenticate(page, vo);
-        } else {
-            ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(vo.getNodeId());
-            if (node.getAncestors().split(",").length <= 2) {
-                //查询当前合同
-                ArchiveTreeContract archiveTreeContract = archiveTreeContractClient.getArchiveTreeContractByNodeName(contractInfo.getContractName());
-                vo.setNodeId(archiveTreeContract.getId());
-            }
-            list = baseMapper.pageByAuthenticate(page, vo);
-        }
-        return page.setRecords(list);
-    }
-
-    @Override
-    public List<String> getFilingUnitList(Long projectId) {
-        return baseMapper.getFilingUnitList(projectId);
-    }
-
-    @Override
-    public void batchDestroyArchive(String ids) {
-        List<String> list = Arrays.asList(ids.split(","));
-        //查询出档案的文件
-        List<ArchiveFile> files = archiveFileClient.getAllArchiveFileByArchiveIds(list);
-        if (files != null && files.size() > 0) {
-            //销毁阿里云上文件
-            List<String> removeFiles = new ArrayList<>();
-            for (ArchiveFile file : files) {
-                if (StringUtils.isNotBlank(file.getFileUrl())) {
-                    removeFiles.add(FileUtils.getAliYunSubUrl(file.getFileUrl()));
-                }
-                if (StringUtils.isNotBlank(file.getPdfFileUrl())) {
-                    removeFiles.add(FileUtils.getAliYunSubUrl(file.getFileUrl()));
-                }
-
-                //打码的也要删除
-                if (StringUtils.isNotBlank(file.getPdfPageUrl())) {
-                    removeFiles.add(FileUtils.getAliYunSubUrl(file.getPdfPageUrl()));
-                }
-
-            }
-            iossClient.removeFiles(removeFiles);
-            //删除文件
-            List<Long> collect = files.stream().map(file -> file.getId()).collect(Collectors.toList());
-            archiveFileClient.batchDeleteArchiveFile(collect);
-        }
-        //销毁案卷
-        baseMapper.batchDestroyByIds(list);
-    }
-
-
-    /**
-     * 检查当前案卷的文件集合是否在规格内,能否开始组卷。
-     * return
-     * 0不能组卷,当前文件入待组卷集合,还能试加文件。
-     * 1可以组卷,当前文件加入待组卷集合后开始组卷。
-     * -1 不可组卷,当前文件不能加入待组卷集合, 待组卷集合要组卷了。
-     * null 程序出错了
-     */
-    private Integer checkSpecificationSize(int SpecificationSize, int archivesSize) {
-        //按照当前目录节点的参数(卷盒规格)进行页数组合,
-        // 30MM默认为300页组成一卷、400MM默认为400页组成一卷、50MM默认为500页组成一卷、60MM默认为600组成一卷。
-        //注意:允许组卷上浮区间为100页
-        //意思是如果A\B两个文件进行并卷组卷,总页数规格为300页,但是A+B的文件数为350页,已经超过固定规格,但是上浮区间在100以内,则允许这样组卷。
-        //超过300之后,则不在继续与其他文件进行并卷组卷了。
-        int SpecificationSizeMax = SpecificationSize + 100;
-
-        if (archivesSize < SpecificationSize) {
-            //小于规格的 返回true ,当前文件加入待组卷集合,还可以试加文件,未到组卷规格
-            return 0;
-        }
-        if (archivesSize == SpecificationSize) {
-            //等于规则的  当前文件加入待组卷集合,待组卷集合可以组卷了。
-            return 1;
-        }
-        if (archivesSize <= SpecificationSizeMax) {
-            //小于等于规格上浮区间,当前文件加入待组卷集合,当前文件集合可以组卷了
-            return 1;
-        }
-        if (archivesSize > SpecificationSizeMax) {
-            //大于规格上浮区间,当前文件不能加入当前待组卷集合,先把当前待组卷集合的文件先组卷完成,清空待组卷集合后再重新计算检查当前文件。
-            return -1;
-        }
-
-        return null;
-    }
-
-    private ArchivesAuto builtArchives(ArchiveTreeContract node, int pageN, int fileN, String startDate, String endDate, String archiveName) {
-        ArchivesAuto archivesAuto = new ArchivesAuto();
-        archivesAuto.setProjectId(node.getProjectId());
-        archivesAuto.setContractId(node.getContractId());
-        archivesAuto.setName(archiveName);//案卷题名
-        if (indexMap == null) {
-            indexMap = new HashMap<>(); //监理,施工的按合同段分类从0开始依次设置档号,建设单位的没有合同段 就先按一类依次设置
-        }
-
-        ContractInfo nodeContract = null;
-        List<ContractInfo> contracts = null;
-        //获取立卷单位
-        String unit = "";
-        String treeCode = node.getTreeCode();
-        if (StringUtils.isEmpty(treeCode)) {
-            //treeCode为null的是业主的节点
-            List<Long> pids = new ArrayList<>();
-            pids.add(node.getProjectId());
-            List<ContractInfo> contractInfos = contractClient.getContractByIds(pids);
-            for (ContractInfo contract : contractInfos) {
-                if (contract.getContractType() == 3) {
-                    unit = contract.archivesUnit();
-                }
-            }
-        } else {
-            //treeCode不为null则是对应合同段
-            ContractInfo contract = contractClient.getContractById(Long.parseLong(treeCode));
-            unit = contract.archivesUnit();
-        }
-        //获取档号
-        if (StringUtils.isEmpty(treeCode)) {
-            treeCode = "owner";
-        }
-        //String fileNumberPrefix=node.getFileNumberPrefix(); //档号前缀在节点设置
-        Integer fileNumberSuffix = null;//档号后缀按立卷单位生成流水号
-        if (indexMap.containsKey(treeCode)) {
-            fileNumberSuffix = indexMap.get(treeCode);
-            indexMap.put(treeCode, fileNumberSuffix + 1);
-        } else {
-            fileNumberSuffix = 1;
-            indexMap.put(treeCode, fileNumberSuffix + 1);
-        }
-
-        archivesAuto.setFileNumber(fileNumberSuffix.toString());//档号
-        //archivesAuto.setMicron();//微缩号
-        archivesAuto.setUnit(unit);//立卷单位
-        //archivesAuto.setQuantity();//数量/单位
-
-        archivesAuto.setSpecification(node.getSpecification());//案卷规格 从节点规格获取
-        //archivesAuto.setStartDate(LocalDateTime.parse(startDate));//文件开始时间
-        //archivesAuto.setEndDate(LocalDateTime.parse(endDate));//文件结束时间
-
-        //TODO 保管期限
-        String storageTime = node.getStorageTime();
-        if (StringUtils.isEmpty(storageTime)) {
-            //节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
-            Long nodeContractId = archivesAuto.getContractId();
-            if (nodeContractId != null && nodeContractId != -1) {
-                if (nodeContract == null) {
-                    nodeContract = contractClient.getContractById(nodeContractId);
-                }
-                storageTime = nodeContract.getStoragePeriod().toString();
-            } else {
-                List<Long> pids = new ArrayList<>();
-                pids.add(archivesAuto.getProjectId());
-                if (contracts == null) {
-                    contracts = contractClient.queryContractListByIds(pids);
-                }
-                for (ContractInfo c : contracts) {
-                    if (c.getContractType() == 3) {
-                        storageTime = c.getStoragePeriod().toString();
-                    }
-                }
-            }
-        }
-        archivesAuto.setStorageTime(storageTime);//保管期限  从节点规格获取
-
-        //保密级别 没地方设置 暂留
-        String secretLevel = "";
-        if (StringUtils.isEmpty(secretLevel)) {
-            //节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
-            Long nodeContractId = archivesAuto.getContractId();
-            if (nodeContractId != null && nodeContractId != -1) {
-                if (nodeContract == null) {
-                    nodeContract = contractClient.getContractById(nodeContractId);
-                }
-                if (nodeContract.getSecurityLevel() == null) {
-                    secretLevel = "4";
-                } else {
-                    secretLevel = nodeContract.getSecurityLevel().toString();
-                }
-            } else {
-                List<Long> pids = new ArrayList<>();
-                pids.add(archivesAuto.getProjectId());
-                if (contracts == null) {
-                    contracts = contractClient.queryContractListByIds(pids);
-                }
-                for (ContractInfo c : contracts) {
-                    if (c.getContractType() == 3) {
-                        if (nodeContract.getSecurityLevel() == null) {
-                            secretLevel = "4";
-                        } else {
-                            secretLevel = c.getSecurityLevel().toString();
-                        }
-                    }
-                }
-            }
-        }
-        archivesAuto.setSecretLevel(secretLevel);
-
-        //立卷人 从节点规格获取
-        String rollor = node.getRollor();
-        if (StringUtils.isEmpty(rollor)) {
-            //节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
-            Long nodeContractId = archivesAuto.getContractId();
-            if (nodeContractId != null && nodeContractId != -1) {
-                if (nodeContract == null) {
-                    nodeContract = contractClient.getContractById(nodeContractId);
-                }
-                rollor = nodeContract.getFiler();
-            } else {
-                List<Long> pids = new ArrayList<>();
-                pids.add(archivesAuto.getProjectId());
-                if (contracts == null) {
-                    contracts = contractClient.queryContractListByIds(pids);
-                }
-                for (ContractInfo c : contracts) {
-                    if (c.getContractType() == 3) {
-                        rollor = c.getFiler();
-                        ;
-                    }
-                }
-            }
-        }
-        archivesAuto.setRollor(rollor);
-
-        //审核人 从节点规格获取
-        String reviewer = node.getReviewer();
-        if (StringUtils.isEmpty(reviewer)) {
-            //节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
-            Long nodeContractId = archivesAuto.getContractId();
-            if (nodeContractId != null && nodeContractId != -1) {
-                if (nodeContract == null) {
-                    nodeContract = contractClient.getContractById(nodeContractId);
-                }
-                reviewer = nodeContract.getReviewer();
-            } else {
-                List<Long> pids = new ArrayList<>();
-                pids.add(archivesAuto.getProjectId());
-                if (contracts == null) {
-                    contracts = contractClient.queryContractListByIds(pids);
-                }
-                for (ContractInfo c : contracts) {
-                    if (c.getContractType() == 3) {
-                        reviewer = c.getReviewer();
-                    }
-                }
-            }
-        }
-        archivesAuto.setReviewer(reviewer);
-
-        //载体类型
-        if (node.getStorageType() != null) {
-            archivesAuto.setCarrierType(node.getStorageType().toString());
-        }
-        //archivesAuto.setKeywords();//主题词
-        //archivesAuto.setStorageLocation();//存放位置
-        archivesAuto.setIsArchive(1);//已归档
-        //archivesAuto.setRemark();//备注
-        LocalDateTime now = LocalDateTime.now();
-        LocalDateTime nextday = now.plusDays(1);
-        archivesAuto.setRollDate(now);//立卷日期
-        archivesAuto.setReviewDate(nextday);//审核日期
-
-        archivesAuto.setNodeId(node.getId());//归档树节点
-        archivesAuto.setOutUrl("");//TODO 生成案卷的封面 目录 备考表,背级
-        archivesAuto.setFileN(fileN);//文件数量
-        archivesAuto.setPageN(pageN);//案卷页数
-        //archivesAuto.setMileage();
-        //archivesAuto.setFileType();
-        //archivesAuto.setSize();
-        archivesAuto.setTreeSort(node.getTreeSort());
-        //archivesAuto.setIsOpen();
-        //archivesAuto.setIscheck(0);
-        archivesAuto.setIsAutoFile(0);//是否案卷收集上传的案卷
-        archivesAuto.setIsLock(0);//案卷锁定状态
-        archivesAuto.setIsDeleted(0);
-        baseMapper.insert(archivesAuto);
-        log.debug("组好" + archivesAuto.getName());
-        return archivesAuto;
-    }
-
-    private String getArchiveStartDateAndEndDate(List<ArchiveFile> waitArchiveFiles) {
-        //找出文件集合中的最大最小时间
-        List<String> fileTimeList = new ArrayList<>();
-        for (ArchiveFile file : waitArchiveFiles) {
-            fileTimeList.add(file.getFileTime());
-        }
-        Collections.sort(fileTimeList);
-        String startDate = fileTimeList.get(0);
-        String endDate = fileTimeList.get(fileTimeList.size() - 1);
-        return startDate + "," + endDate;
-    }
-
-    private String builtArchiveName(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node, boolean isCrossNode) {
-
-        String archiveName = "";
-
-        Long projectId = node.getProjectId();
-        ProjectInfo projectInfo = projectClient.getById(String.valueOf(projectId));
-        String projectName = projectInfo.getProjectName();
-        //获取案卷题名
-        //--正常节点
-        if (isCrossNode) {
-            archiveName = projectName;
-            //存在跨节点  项目名称+文件对应的所有节点名称
-            Set<String> nodeIdSet = new LinkedHashSet<>();
-            for (ArchiveFile file : waitArchiveFiles) {
-                String nodeId = file.getNodeId();
-                nodeIdSet.add(nodeId);
-            }
-            for (String nodeId : nodeIdSet) {
-                ArchiveTreeContract treeNode = archiveTreeContractClient.getArchiveTreeContractById(Long.parseLong(nodeId));
-                String nodeName = treeNode.getNodeName();
-                archiveName = archiveName + " " + nodeName;
-            }
-        } else {
-            //不存在跨节点  项目名称+节点名称
-            archiveName = projectName + " " + node.getNodeName();
-        }
-
-        //TODO wbs节点
-        //不存在跨节点 项目名称+案卷题名规则(在后台归档目录树设置的)+后缀
-        //存在跨节点  获取当前所有节点的父级节点题名规则+所有同层级跨节点并卷的节点名称拼接+后缀
-        return archiveName + node.getArchiveNameSuffix();
-    }
-
-    private String builtFilePageNo(ArchivesAuto archivesAuto, List<ArchiveFile> waitArchiveFiles) {
-        //生成文件对应的页码,返回url
-        archiveAutoPdfService.builtFilePageNo(archivesAuto, waitArchiveFiles);
-        this.updateById(archivesAuto);
-
-        return "";
-    }
-
-
-    /**
-     * 单独组卷规则组卷
-     *
-     * @param waitArchiveFiles
-     * @param node             规格参数所在节点
-     * @param pageN
-     */
-    private void createArchive3(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node, int pageN) {
-
-        String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
-        String[] split = archiveStartDateAndEndDate.split(",");
-        String startDate = split.length >= 1 ? split[0] : "";
-        String endDate = split.length >= 2 ? split[1] : "";
-        int fileN = waitArchiveFiles.size();
-
-        String archiveName = builtArchiveName(waitArchiveFiles, node, false);//获取案卷题名
-        //1.创建新案卷
-        ArchivesAuto archivesAuto = builtArchives(node, pageN, fileN, startDate, endDate, archiveName);
-        //2.设置文件所属案卷,组卷状态
-        Long archivesAutoId = archivesAuto.getId();
-
-        //封面和生成文件页码
-        archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(), archivesAuto, waitArchiveFiles);
-
-        builtFilePageNo(archivesAuto, waitArchiveFiles);//生成文件页码
-
-
-        for (ArchiveFile file : waitArchiveFiles) {
-            file.setArchiveId(archivesAutoId);//设置文件所属案卷
-            file.setIsArchive(1);
-
-        }
-        archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
-    }
-
-    /**
-     * 分类并卷组卷
-     *
-     * @param waitArchiveFiles
-     * @param archiveAutoGroupId 分类并卷分组ID
-     */
-    private void createArchive2(List<ArchiveFile> waitArchiveFiles, Long archiveAutoGroupId, Long projectId) {
-
-        //获取同一分类archiveAutoGroupId下设置的(设置规则时选中的)节点,排好序
-        List<ArchiveTreeContract> selectList = archiveTreeContractClient.getStorageNodeByGroupId(projectId, archiveAutoGroupId);
-        //分类并卷节点默认采用同类型下第一个存储节点为归属节点
-        ArchiveTreeContract node = selectList.get(0);
-        //获取案卷文件起止时间
-        String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
-        String[] split = archiveStartDateAndEndDate.split(",");
-        String startDate = split.length >= 1 ? split[0] : "";
-        String endDate = split.length >= 2 ? split[1] : "";
-        int fileN = waitArchiveFiles.size();
-        //获取案卷内文件总页数
-        int pageN = 0;
-        for (ArchiveFile file : waitArchiveFiles) {
-            pageN = pageN + file.getFilePage();
-        }
-        //默认组卷存在跨节点组卷  注意案卷归属节点,案卷命名方式
-        //获取案卷题名
-        String archiveName = builtArchiveName(waitArchiveFiles, node, true);//获取案卷题名
-
-        //1.创建新案卷
-        ArchivesAuto archivesAuto = builtArchives(node, pageN, fileN, startDate, endDate, archiveName);
-
-        //2.生成文件页码
-        archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(), archivesAuto, waitArchiveFiles);
-
-        builtFilePageNo(archivesAuto, waitArchiveFiles);
-
-        //3.设置文件所属案卷,组卷状态
-        Long archivesAutoId = archivesAuto.getId();
-        for (ArchiveFile file : waitArchiveFiles) {
-            file.setArchiveId(archivesAutoId);//设置文件所属案卷
-            file.setIsArchive(1);
-        }
-        archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
-    }
-
-    /**
-     * 默认规则组卷
-     *
-     * @param waitArchiveFiles
-     * @param pageN
-     */
-    private void createArchive1(List<ArchiveFile> waitArchiveFiles, int pageN) {
-
-        //获取案卷文件起止时间
-        String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
-        String[] split = archiveStartDateAndEndDate.split(",");
-        String startDate = split.length >= 1 ? split[0] : "";
-        String endDate = split.length >= 2 ? split[1] : "";
-        int fileN = waitArchiveFiles.size();
-
-
-        //默认组卷存在跨节点组卷  注意案卷归属节点,案卷命名方式
-        //案卷归属节点为 排第一的文件所属节点
-        ArchiveFile firstFile = waitArchiveFiles.get(0);
-        Long nodeId = Long.parseLong(firstFile.getNodeId());
-        ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
-
-        //获取案卷题名
-        String archiveName = builtArchiveName(waitArchiveFiles, node, true);//获取案卷题名
-
-        //1.创建新案卷
-        ArchivesAuto archivesAuto = builtArchives(node, pageN, fileN, startDate, endDate, archiveName);
-
-        //2.封面和生成文件页码
-        archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(), archivesAuto, waitArchiveFiles);
-
-        builtFilePageNo(archivesAuto, waitArchiveFiles);
-
-        //3.设置文件所属案卷,组卷状态
-        Long archivesAutoId = archivesAuto.getId();
-        for (ArchiveFile file : waitArchiveFiles) {
-            file.setArchiveId(archivesAutoId);//设置文件所属案卷
-            file.setIsArchive(1);
-        }
-        archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
-    }
-
-    private void createArchiveBox(String boxName, List<ArchiveFile> waitArchiveFiles) {
-
-        if (waitArchiveFiles.size() == 0) {
-            return;
-        }
-
-        String nodeId = waitArchiveFiles.get(0).getNodeId();
-
-        ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(Long.parseLong(nodeId));
-
-        //获取案卷文件起止时间
-        String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
-        String[] split = archiveStartDateAndEndDate.split(",");
-        String startDate = split.length >= 1 ? split[0] : "";
-        String endDate = split.length >= 2 ? split[1] : "";
-        int fileN = waitArchiveFiles.size();
-        //获取案卷内文件总页数
-        int pageN = 0;
-        for (ArchiveFile file : waitArchiveFiles) {
-            pageN = pageN + file.getFilePage();
-        }
-
-
-        //默认组卷存在跨节点组卷  注意案卷归属节点,案卷命名方式
-        //获取案卷题名
-        //String archiveName=builtArchiveName(waitArchiveFiles,node,false);//获取案卷题名
-
-        //1.创建新案卷
-        ArchivesAuto archivesAuto = builtArchives(node, pageN, fileN, startDate, endDate, boxName);
-
-        //2.封面和生成文件页码
-        archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(), archivesAuto, waitArchiveFiles);
-
-        builtFilePageNo(archivesAuto, waitArchiveFiles);
-
-        //3.设置文件所属案卷,组卷状态
-        Long archivesAutoId = archivesAuto.getId();
-        for (ArchiveFile file : waitArchiveFiles) {
-            file.setArchiveId(archivesAutoId);//设置文件所属案卷
-            file.setIsArchive(1);
-        }
-        archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
-    }
-
-
-    /**
-     * 单租组卷流程  节点下的文件只在当前节点下组卷
-     */
-    private void archiveAutoMethod3(List<ArchiveTreeContract> list, Map<String, List<ArchiveFile>> boxMap) {
-        //步骤1:遍历节点集合
-        for (ArchiveTreeContract node : list) {
-            //步骤2:获取当前节点的案卷规格
-            String specificationStr = node.getSpecification();
-            if (StringUtils.isEmpty(specificationStr)) {
-                specificationStr = "30";
-            }
-            int specification = Integer.parseInt(specificationStr);
-            int specificationSize = specification * 10;
-            //步骤3:查询节点下的未组卷文件
-            List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
-            //步骤4:遍历未归档文件
-            //待组卷文件集合
-            List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
-            //待组卷文件总页数
-            int archivesSize = 0;
-            if (archiveFiles != null) {
-                int archiveFilesSize = 0;
-                for (ArchiveFile file : archiveFiles) {
-                    archiveFilesSize++;
-                    //步骤5:判断文件是否存在分盒设置
-                    if (file.getBoxNumber() != null && file.getBoxNumber() != -1) {
-                        //添加到分盒文件集合
-                        addBoxMap(file, boxMap);
-                        if (archiveFilesSize == archiveFiles.size() && waitArchiveFiles.size() > 0) {
-                            //最后一个文件直接将waitArchiveFiles组卷
-                            createArchive3(waitArchiveFiles, node, archivesSize);
-                        }
-                    } else {
-                        //单独组卷流程
-                        //步骤6:计算和判断待组卷文件集合是否达到组卷要求,达到要求创建案卷,案卷归属当前节点,案卷下文件改为已组卷
-                        Integer filePage = file.getFilePage();
-                        archivesSize = archivesSize + filePage;
-                        Integer checkStatus = checkSpecificationSize(specificationSize, archivesSize);
-                        //步骤6.1未到规格 不组卷
-                        if (checkStatus == 0) {
-                            waitArchiveFiles.add(file);
-                            //判断是否最后一个文件
-                            if (archiveFilesSize == archiveFiles.size()) {
-                                //最后一个文件直接将waitArchiveFiles组卷
-                                createArchive3(waitArchiveFiles, node, archivesSize);
-                            } else {
-                                continue;
-                            }
-                        }
-                        //步骤6.2达到规格 可以组一卷
-                        if (checkStatus == 1) {
-                            waitArchiveFiles.add(file);
-                            //将waitArchiveFiles组卷
-                            createArchive3(waitArchiveFiles, node, archivesSize);
-                            //将待组卷文件集合,总页数还原初始值,
-                            waitArchiveFiles.clear();
-                            archivesSize = 0;
-                        }
-                        //步骤6.3超出规格
-                        if (checkStatus == -1) {
-                            //如果waitArchiveFiles集合size>0,先将集合中文件组卷。再将当前文件放入集合
-                            if (waitArchiveFiles.size() > 0) {
-                                //将waitArchiveFiles组卷,
-                                createArchive3(waitArchiveFiles, node, archivesSize - filePage);
-                                //然后将待组卷文件集合,总页数还原初始值,
-                                waitArchiveFiles.clear();
-                                //保存当前文件进入待组卷集合,待组卷页数=当前文件页数
-                                waitArchiveFiles.add(file);
-                                archivesSize = filePage;
-
-                                //判断是否最后一个文件
-                                if (archiveFilesSize == archiveFiles.size()) {
-                                    //如果当前文件最后一个文件直接将waitArchiveFiles组卷
-                                    createArchive3(waitArchiveFiles, node, archivesSize);
-                                    waitArchiveFiles.clear();
-                                    archivesSize = 0;
-                                }
-                            } else {
-                                //步骤6.3.2如果waitArchiveFiles集合size=0,说明当前文件已经超过规格,直接将当前文件组卷
-                                waitArchiveFiles.add(file);
-                                //直接将waitArchiveFiles组卷
-                                createArchive3(waitArchiveFiles, node, archivesSize);
-                                waitArchiveFiles.clear();
-                                archivesSize = 0;
-                            }
-                        }
-                    }
-                }
-            }
-
-        }
-
-    }
-
-    /**
-     * 分类并卷组卷  设置分类的节点下只有一个案卷,节点下的所有文件都组成这个案卷。如果设置分类节点(select=1的)多个,案卷归属排序第一个节点。
-     */
-    private void archiveAutoMethod2(List<ArchiveTreeContract> list, Long projectId, Map<String, List<ArchiveFile>> boxMap) {
-
-        //分类并卷集合<groupId,List<文件>>
-        Map<Long, List<ArchiveFile>> archiveMap = new HashMap<>();
-        //记录同个分组id的第一个节点ID 案卷归属于这个节点
-        Map<Long, Long> groupId2NodeIdMap = new HashMap<>();
-
-        //步骤1:遍历节点集合
-        for (ArchiveTreeContract node : list) {
-            //根据分组ID来创建唯一案卷
-            Long archiveAutoGroupId = node.getArchiveAutoGroupId();
-            //步骤2:查询节点下的未归档文件
-            List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
-            //步骤3:遍历未归档文件
-            if (archiveFiles != null) {
-                for (ArchiveFile file : archiveFiles) {
-                    //步骤4:判断文件是否存在分盒设置
-                    if (file.getBoxNumber() != null && file.getBoxNumber() != -1) {
-                        //添加到分盒文件集合
-                        addBoxMap(file, boxMap);
-                    } else {
-                        //分类并卷流程
-                        //步骤5:将文件按照<groupId,List<文件>>放入集合
-                        if (archiveMap.containsKey(archiveAutoGroupId)) {
-                            List<ArchiveFile> groupList = archiveMap.get(archiveAutoGroupId);
-                            groupList.add(file);
-                            archiveMap.put(archiveAutoGroupId, groupList);
-                        } else {
-                            List<ArchiveFile> groupList = new ArrayList<>();
-                            groupList.add(file);
-                            archiveMap.put(archiveAutoGroupId, groupList);
-                            groupId2NodeIdMap.put(archiveAutoGroupId, node.getId());
-                        }
-                    }
-                }
-            }
-        }
-        //步骤6:按集合创建案卷,每个group类的案卷归属顺序排第一个节点
-        Set<Map.Entry<Long, List<ArchiveFile>>> entries = archiveMap.entrySet();
-        for (Map.Entry<Long, List<ArchiveFile>> entry : entries) {
-            Long archiveAutoGroupId = entry.getKey();
-            List<ArchiveFile> archiveFiles = entry.getValue();
-            //一个archiveAutoGroupId组成一个案卷  案卷归属同个key的归档树节点select=1的第一个groupId2NodeIdMap
-            createArchive2(archiveFiles, archiveAutoGroupId, projectId);
-        }
-
-    }
-
-    /**
-     * 默认组卷流程 文件可以跨节点组卷,受最高并卷节点限制范围,跨节点文件组卷时,案卷规格按照第一个文件所在的节点规格 组卷。
-     */
-    private void archiveAutoMethod1(List<ArchiveTreeContract> list, Map<String, List<ArchiveFile>> boxMap) {
-        //最高并卷节点
-        Long archiveAutoNodeId = null;
-
-        //当前待组卷规格大小
-        int specificationSize = 0;
-        //待组卷文件总页数
-        int archivesSize = 0;
-        //待组卷文件集合
-        List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
-
-        //步骤1:遍历节点集合
-        int nodeSize = 0;
-        for (ArchiveTreeContract node : list) {
-            nodeSize++;
-            if (archiveAutoNodeId == null) {
-                archiveAutoNodeId = node.getArchiveAutoNodeId();
-            }
-            //当前节点的的archiveAutoNodeId
-            Long archiveAutoNodeId_current = node.getArchiveAutoNodeId();
-
-
-            //步骤2:判断当前节点是否超出最高节点
-            if (!archiveAutoNodeId.equals(archiveAutoNodeId_current)) {
-                //超过最高并卷节点(节点是排序好的,只要不相等就超过了)
-                if (waitArchiveFiles.size() > 0) {
-                    //将待组卷集合里的文件组卷
-                    createArchive1(waitArchiveFiles, archivesSize);
-                }
-                waitArchiveFiles.clear();
-                archivesSize = 0;
-                archiveAutoNodeId = node.getArchiveAutoNodeId();//更新当前最高并卷节点
-            }
-
-            //步骤3.1:获取节点规格
-            if (waitArchiveFiles.size() == 0) {
-                //waitArchiveFiles待组卷文件为空时,按当前节点的规格
-                String specificationStr = node.getSpecification();
-                if (StringUtils.isEmpty(specificationStr)) {
-                    specificationStr = "30";
-                }
-                int specification = Integer.parseInt(specificationStr);
-                specificationSize = specification * 10;
-            }
-
-            //步骤3.2:查询出当前节点未组卷的文件
-            List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
-            //步骤3.3:遍历未组卷文件
-            int archiveFilesSize = 0;
-            for (ArchiveFile file : archiveFiles) {
-                archiveFilesSize++;
-                //步骤3.4:判断文件是否存在分盒设置
-                if (file.getBoxNumber() != null && file.getBoxNumber() != -1) {
-                    //添加到分盒文件集合
-                    addBoxMap(file, boxMap);
-                    if (nodeSize == list.size() && archiveFilesSize == archiveFiles.size()) {
-                        //如果当前是最后一个文件直接将waitArchiveFiles组卷
-                        createArchive1(waitArchiveFiles, archivesSize);
-                    }
-                } else {
-                    //步骤3.5 计算和判断待组卷文件集合是否达到组卷要求,达到要求创建案卷,案卷归属当前节点,案卷下文件改为已组卷
-                    Integer filePage = file.getFilePage();
-                    archivesSize = archivesSize + filePage;
-                    Integer checkStatus = checkSpecificationSize(specificationSize, archivesSize);
-                    //步骤3.6未到规格 不组卷
-                    if (checkStatus == 0) {
-                        waitArchiveFiles.add(file);
-                        //判断是否最后一个节点,最后一个文件
-                        if (nodeSize == list.size() && archiveFilesSize == archiveFiles.size()) {
-                            //直接将waitArchiveFiles待组卷集合组卷,归属集合第一个文件所在节点
-                            createArchive1(waitArchiveFiles, archivesSize);
-                            //将待组卷文件集合,总页数还原初始值,
-                            waitArchiveFiles.clear();
-                            archivesSize = 0;
-                        } else {
-                            continue;
-                        }
-                    }
-                    //步骤3.7达到规格 可以组一卷
-                    if (checkStatus == 1) {
-                        waitArchiveFiles.add(file);
-                        //将waitArchiveFiles待组卷集合组卷,归属集合第一个文件所在节点
-                        createArchive1(waitArchiveFiles, archivesSize);
-                        //将待组卷文件集合,总页数还原初始值,
-                        waitArchiveFiles.clear();
-                        archivesSize = 0;
-
-                        String specificationStr = node.getSpecification();
-                        if (StringUtils.isEmpty(specificationStr)) {
-                            specificationStr = "30";
-                        }
-                        int specification = Integer.parseInt(specificationStr);
-                        specificationSize = specification * 10;//更新specificationSize待组卷规格为 当前节点的组卷规格
-                    }
-                    //步骤3.8超出规格
-                    if (checkStatus == -1) {
-                        //步骤3.9如果waitArchiveFiles集合size>0,先将集合中文件组卷。再将当前文件加入集合
-                        if (waitArchiveFiles.size() > 0) {
-                            //3.9.1 将waitArchiveFiles组卷,归属集合第一个文件所在节点
-                            createArchive1(waitArchiveFiles, archivesSize);
-                            //将待组卷文件集合,总页数还原初始值,
-                            waitArchiveFiles.clear();
-                            //3.9.2保存当前文件进入待组卷集合,
-                            waitArchiveFiles.add(file);
-                            //3.9.3待组卷页数=当前文件页数
-                            archivesSize = filePage;
-
-                            String specificationStr = node.getSpecification();
-                            if (StringUtils.isEmpty(specificationStr)) {
-                                specificationStr = "30";
-                            }
-                            int specification = Integer.parseInt(specificationStr);
-                            specificationSize = specification * 10;//更新specificationSize待组卷规格为 当前节点的组卷规格
-
-                            //3.9.4 判断当前文件是不是最后一个节点,最后一个文件
-                            if (nodeSize == list.size() && archiveFilesSize == archiveFiles.size()) {
-                                //最后一个文件再将waitArchiveFiles组卷
-                                createArchive1(waitArchiveFiles, archivesSize);
-                            }
-                        } else {
-                            //步骤3.10 如果waitArchiveFiles集合size=0,说明当前文件已经超过规格,直接将当前文件组卷
-                            waitArchiveFiles.add(file);
-                            //直接将waitArchiveFiles组卷
-                            createArchive1(waitArchiveFiles, archivesSize);
-                            waitArchiveFiles.clear();
-                            archivesSize = 0;
-                        }
-                    }
-
-                }
-            }
-
-        }
-
-    }
-
-    /**
-     * 分盒组卷流程
-     *
-     * @param boxMap
-     */
-    private void archiveAutoMethodBox(Map<String, List<ArchiveFile>> boxMap) {
-        Set<Map.Entry<String, List<ArchiveFile>>> entries = boxMap.entrySet();
-        for (Map.Entry<String, List<ArchiveFile>> entry : entries) {
-            //一个分盒一个案卷 归属第一个文件所在节点
-            createArchiveBox(entry.getKey(), entry.getValue());
-        }
-    }
-
-    /**
-     * 查询案卷,排序
-     *
-     * @param ids
-     * @return
-     */
-    public List<ArchivesAuto> findArchivesAutosByIds(List<Long> ids) {
-        QueryWrapper<ArchivesAuto> queryWrapper = new QueryWrapper<>();
-        queryWrapper.in("node_id", ids)
-                .eq("is_deleted", 0)
-                .eq("is_archive", 1)
-                .ne("is_auto_file", 1)
-                .orderByAsc("tree_sort")
-                .orderByAsc("auto_file_sort")
-                .orderByAsc("file_number");
-
-        return this.list(queryWrapper);
-    }
-
-
-    /**
-     * 不重组的情况下刷新档号
-     * projectId 为当前项目
-     * contractId 为客户端当前选定的合同段
-     * nodeId 为左侧树选定的节点i
-     * 规则,1. 合同段ID为空,则不过滤
-     * 2. 业主或者管理员,treeCode为空,则按照nodeid过滤,nodeid为空,则不过滤
-     * 3. 合同段用户,安装找contractId过滤,过滤该合同段所有节点。
-     *
-     * @param projectId
-     * @param contractId
-     * @param nodeId
-     */
-    public void refreshFileNumberNoSlipt(Long projectId, Long contractId, Long nodeId) {
-        List<ArchiveTreeContract> list = archiveTreeContractClient.getListByProjectId(projectId);
-        this.refreshFileNumberNoSlipt(list, contractId, nodeId);
-    }
-
-    /**
-     * @param archiveTreeContracts
-     * @param contractId
-     * @param nodeId
-     */
-    public void refreshFileNumberNoSlipt(List<ArchiveTreeContract> archiveTreeContracts, Long contractId, Long nodeId) {
-
-        List<ArchiveTreeContractVO2> subTreeList = new ArrayList<>();
-        List<List<ArchiveTreeContract>> subGroupedList = new ArrayList<>();
-        ArchiveTreeUtil.getGroupedList(archiveTreeContracts, subTreeList, subGroupedList);
-        Integer index = 1;
-
-        List<ArchivesAuto> changeList = new ArrayList<>();
-
-        //分组,分程 建设单位,各个合同段,电子单位等
-        for (List<ArchiveTreeContract> subList : subGroupedList) {
-            List<Long> ids = subList.stream()
-                    .map(ArchiveTreeContract::getId)
-                    .collect(Collectors.toList());
-
-            //todo 后续根据 authFilter函数过滤
-
-            subList = authFilter(subList, contractId, nodeId);
-
-            index = 1;
-            List<ArchivesAuto> archivesAutos = findArchivesAutosByIds(ids);
-            if (archivesAutos == null || archivesAutos.size() == 0) {
-                continue;
-            }
-            //准备节点id-节点档号前缀Map
-            Map<String, String> node_fileNumberPrefixMap = new HashMap<>();
-            for (ArchiveTreeContract node : subList) {
-                node_fileNumberPrefixMap.put(node.getId().toString(), node.getFileNumberPrefix());
-            }
-
-            for (ArchivesAuto archivesAuto : archivesAutos) {
-                String nodeId1 = archivesAuto.getNodeId().toString();
-                String fileNumberPrefix = "";
-                if (node_fileNumberPrefixMap.containsKey(nodeId1)) {
-                    fileNumberPrefix = node_fileNumberPrefixMap.get(nodeId1);
-                    if (StringUtils.isEmpty(fileNumberPrefix)) {
-                        //节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
-                        Long nodeContractId = archivesAuto.getContractId();
-                        if (nodeContractId != null) {
-                            ContractInfo nodeContract = contractClient.getContractById(nodeContractId);
-                            fileNumberPrefix = nodeContract.getPrefix();
-                        } else {
-                            List<Long> pids = new ArrayList<>();
-                            pids.add(archivesAuto.getProjectId());
-                            List<ContractInfo> contracts = contractClient.queryContractListByIds(pids);
-                            for (ContractInfo c : contracts) {
-                                if (c.getContractType() == 3) {
-                                    fileNumberPrefix = c.getPrefix();
-                                }
-                            }
-                        }
-                    }
-                }
-
-                String fileNumber = fileNumberPrefix + "_" + index;
-                if (archiveAutoPdfService.refreshFileNumber(archivesAuto, fileNumber)) {
-                    changeList.add(archivesAuto);
-                }
-                index++;
-            }
-        }
-        this.updateBatchById(changeList);
-    }
-
-    /**
-     * 获取案卷合成pdf文件
-     *
-     * @param archiveId
-     * @return
-     */
-    public String getMergeArchivesFile(Long archiveId) {
-        String url = "";
-
-        List<String> urlList = new ArrayList<>();//合成pdf集合
-
-        ArchivesAuto archivesAuto = this.getById(archiveId);
-
-        //判断archivesAuto是否为空
-        if (archivesAuto == null) {
-            return url;
-        }
-        String outUrl = archivesAuto.getOutUrl();
-        //判断outUrl是否为空
-        String[] frontUrls = null;
-        if (StringUtils.isNotEmpty(outUrl)) {
-            frontUrls = outUrl.split(",");
-        }
-
-        ArchiveProjectConfig config = archiveProjectConfigService.getByProjectIdOrNew(archivesAuto.getProjectId());
-
-        // 根据 factorType 字符串生成档案号码字符串链表
-        String front = "";
-        String cataLog = "";
-        String spare = "";
-        String back = "";
-
-
-        if (frontUrls != null) {
-            for (String frontUrl : frontUrls) {
-                if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[0]) && config.getFactorType().contains("1")) {
-                    front = frontUrl;
-                } else if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[1]) && config.getFactorType().contains("2")) {
-                    cataLog = frontUrl;
-                } else if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[2]) && config.getFactorType().contains("3")) {
-                    spare = frontUrl;
-                } else if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[3]) && config.getFactorType().contains("4")) {
-                    back = frontUrl;
-                }
-            }
-        }
-        List<String> fileUrls = new ArrayList<>();
-        if (!archivesAuto.isMedia()) {
-            List<ArchiveFile> result = this.archiveFileClient.getArchiveFileByArchivesId(archivesAuto.getId().toString(), "");
-            if (result != null && result.size() > 0) {
-                //循环访问result,如果pdfpageurl不为空则取出,否则取pdffileurl
-                for (ArchiveFile archiveFile : result) {
-                    String pdfPageUrl = archiveFile.getPdfPageUrl();
-                    if (StringUtils.isEmpty(pdfPageUrl)) {
-                        fileUrls.add(archiveFile.getPdfFileUrl());
-                    } else {
-                        fileUrls.add(pdfPageUrl);
-                    }
-                }
-            }
-        }
-
-        if (fileUrls.size() > 0) {
-            //此处暂时这么处理,等oss上传接口里文件名可以区分后,再单独取
+	private final IDictBizClient iDictBizClient;
+	private ArchiveFileClient archiveFileClient;
+	private ArchiveTreeContractClient archiveTreeContractClient;
+	private ContractClient contractClient;
+	private ProjectClient projectClient;
+	private final ArchivesAutoMapper autoMapper;
+
+	@Autowired
+	private ExecutorService executorService;
+
+	private Map<String,Integer> indexMap = new HashMap<>(); //按立卷位区分和生成流水号
+	private IArchiveAutoPdfService archiveAutoPdfService;
+	private final NewIOSSClient iossClient;
+
+	private final IArchiveProjectConfigService archiveProjectConfigService;
+
+
+	@Override
+	public IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto) {
+		return page.setRecords(baseMapper.selectArchivesAutoPage(page, archivesAuto));
+	}
+
+	@Override
+	public IPage<ArchivesAutoVO> pageByArchivesAuto(ArchivesAutoVO vo) {
+		IPage<ArchivesAutoVO> page = new Page<>(vo.getCurrent(),vo.getSize());
+		if (StringUtils.isNotBlank(vo.getStorageTime())) {
+			vo.setStorageTimes(Arrays.asList(vo.getStorageTime().split(",")));
+		}
+		if (StringUtils.isNotBlank(vo.getSecretLevel())){
+			vo.setSecretLevels(Arrays.asList(vo.getSecretLevel().split(",")));
+		}
+		if (StringUtils.isNotBlank(vo.getCarrierType())) {
+			vo.setCarrierTypes(Arrays.asList(vo.getCarrierType().split(",")));
+		}
+		if (StringUtils.isNotBlank(vo.getYear())) {
+			vo.setYears(Arrays.asList(vo.getYear().split(",")));
+		}
+		if (StringUtils.isNotBlank(vo.getMonth())) {
+			vo.setMonths(Arrays.asList(vo.getMonth().split(",")));
+		}
+		if (StringUtils.isNotBlank(vo.getCarrierType())) {
+			vo.setCarrierTypes(Arrays.asList(vo.getCarrierType().split(",")));
+		}
+		List<ArchivesAutoVO> archivesAutos = null;
+		//获取合同段类型
+		ContractInfo contractInfo = contractClient.getContractById(vo.getContractId());
+		Integer contractType = contractInfo.getContractType();
+		//根据用户在当前合同段的权限,判断返回
+		BladeUser user = AuthUtil.getUser();
+		String name = baseMapper.getUserRoleName(vo.getProjectId(),vo.getContractId(),user.getUserId());
+		if (name.contains("超级管理员") || contractType == 3) {
+			vo.setContractId(null);
+		}
+		if (StringUtils.isNotBlank(vo.getNodeIds())) {
+			vo.setNodeIdArray(Arrays.asList(vo.getNodeIds().split(",")));
+			archivesAutos = baseMapper.pageByArchivesAuto2(page, vo);
+		} else {
+			archivesAutos = baseMapper.pageByArchivesAuto(page, vo);
+		}
+		if (archivesAutos != null && archivesAutos.size() >0) {
+			archivesAutos.stream().forEach(aa -> {
+				if (StringUtils.isNotBlank(aa.getStorageTime())) {
+					aa.setStorageTimeValue("3".equals(aa.getStorageTime()) ? "永久" : ("2".equals(aa.getStorageTime()) ? "30年" : "10年"));
+				}
+				if (StringUtils.isNotBlank(aa.getSecretLevel())) {
+					aa.setSecretLevelValue("1".equals(aa.getSecretLevel()) ? "机密" : ("2".equals(aa.getSecretLevel()) ? "绝密" : "秘密"));
+				}
+			});
+		}
+		return page.setRecords(archivesAutos);
+	}
+
+	@Override
+	public IPage<ArchivesAutoVO> selectArchivesAutoFilePage(ArchivesAutoVO vo) {
+		Query query = new Query();
+		query.setCurrent(vo.getCurrent());
+		query.setSize(vo.getSize());
+		//设置分页
+		IPage<ArchivesAutoVO> iPage = Condition.getPage(query);
+
+		//汇总
+		Integer total = this.baseMapper.selectArchivesAutoFileCount(vo);
+		if(total == null){
+			total = 0;
+		}
+		//分页
+		int current = (vo.getCurrent() - 1) * vo.getSize();
+
+		List<ArchivesAuto> pageList = this.baseMapper.selectArchivesAutoFilePage(current, vo.getSize(), vo);
+		//设置分页信息
+		iPage.setTotal(total);
+		List<ArchivesAutoVO> pageVoList = JSONArray.parseArray(JSONObject.toJSONString(pageList), ArchivesAutoVO.class);
+		List<DictBiz> sheetSourceList = this.iDictBizClient.getList("security_level", "notRoot").getData();
+		List<DictBiz> sheetSourceList1 = this.iDictBizClient.getList("storage_period", "notRoot").getData();
+
+		pageVoList.forEach(vos -> {
+			if(StringUtils.isNotEmpty(vos.getSecretLevel())){
+				sheetSourceList.forEach(source -> {
+					if( source.getDictKey().equals(vos.getSecretLevel())){
+						vos.setSecretLevelValue(source.getDictValue());
+					}
+				});
+			}
+			if(StringUtils.isNotEmpty(vos.getStorageTime())){
+				sheetSourceList1.forEach(source -> {
+					if ( source.getDictKey().equals(vos.getStorageTime())) {
+						vos.setStorageTimeValue(source.getDictValue());
+					}
+				});
+			}
+		});
+
+		return iPage.setRecords(pageVoList);
+	}
+
+	@Override
+	public boolean updateArchivesAutoFileByNodeId(String ids, String nodeId,String nodeSort) {
+		try {
+			baseMapper.updateArchivesAutoFileByNodeId(Func.toLongList(ids),nodeId,nodeSort);
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			return false;
+		}
+		return true;
+	}
+
+	@Override
+	public Map<String, Integer> getAllArchiveByContractType(Long projectId,String typ) {
+		List<ArchivesAutoVO> list = baseMapper.getAllArchiveByContractType(projectId,typ);
+		List<ContractInfo> infos = contractClient.queryContractListByIds(Arrays.asList(projectId));
+		int key1=0,key2=0,key3=0;
+		//判断案卷属于1施工,2监理,还是3业主
+		for (ArchivesAutoVO l : list) {
+			String type = l.getContractType();
+			if (StringUtils.isBlank(type)){
+				//业主
+				key3++;
+			}else if ("S".equals(type)){
+				//监理
+				key2++;
+			}else if ("C".equals(type)){
+				//施工
+				key1++;
+			}else if (type.length() > 10){
+				for (ContractInfo info : infos) {
+					if (type.equals(info.getId()+"")){
+						Integer t = info.getContractType();
+						if (t == 1){
+							key1++;
+						}else if(t==2){
+							key2++;
+						}else {
+							key3++;
+						}
+						break;
+					}
+				}
+			}else {
+				System.out.println(type);
+			}
+		}
+		Map<String,Integer> map = new HashMap<>();
+		map.put("key1",key1);
+		map.put("key2",key2);
+		map.put("key3",key3);
+		return map;
+	}
+
+	@Override
+	public List<Map<String, String>> getAllArchiveAgeByContractType(Long projectId) {
+		List<Map<String,String>> list = baseMapper.getAllArchiveAgeByContractType(projectId);
+		return list;
+	}
+
+	@Override
+	public void splitArchvies(Long projectId,Long contractId,Long nodeId){
+		List<String> removeFiles = new ArrayList<>();
+		//没合同段的默认整个项目
+		if (contractId == null) {
+			//清除案卷封面等pdf
+			List<String> archivesOutUrlList = baseMapper.getArchivesOutUrlList(projectId);
+			if(archivesOutUrlList!=null && archivesOutUrlList.size()>0){
+				for(String outUrl:archivesOutUrlList){
+					String[] splits = outUrl.split(",");
+					for(String url:splits){
+						if(StringUtils.isNotEmpty(url.trim())){
+							removeFiles.add(FileUtils.getAliYunSubUrl(url));
+						}
+					}
+				}
+			}
+			//清除文件页面pdf
+			List<String> filePageUrlList = baseMapper.getFilePageUrlList(projectId);
+			if(filePageUrlList!=null && filePageUrlList.size()>0){
+				for(String url:filePageUrlList){
+					if(StringUtils.isNotEmpty(url.trim())){
+						removeFiles.add(FileUtils.getAliYunSubUrl(url));
+					}
+				}
+			}
+			executorService.execute(()->{
+				iossClient.removeFiles(removeFiles);
+				log.debug("文件删完了");
+			});
+
+			//取消未锁定案卷文件关联
+			baseMapper.splitArchvies(projectId);
+
+		}else{
+			String treeCode = getAuthCode(contractId);
+			if (nodeId!= null) {
+				//有节点的按节点
+				String strNodeId  = nodeId.toString();
+				ArchiveTreeContract archiveTreeContract = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
+				String ancestors=archiveTreeContract.getAncestors()+","+nodeId;
+
+				//清除案卷封面等pdf
+				List<String> archivesOutUrlList = baseMapper.getArchivesOutUrlListByNode(projectId,ancestors,strNodeId);
+				if(archivesOutUrlList!=null && archivesOutUrlList.size()>0){
+					for(String outUrl:archivesOutUrlList){
+						String[] splits = outUrl.split(",");
+						for(String url:splits){
+							if(StringUtils.isNotEmpty(url.trim())){
+								removeFiles.add(FileUtils.getAliYunSubUrl(url));
+							}
+						}
+					}
+				}
+				//清除文件页面pdf
+				List<String> filePageUrlList = baseMapper.getFilePageUrlListByNode(projectId,ancestors,strNodeId);
+				if(filePageUrlList!=null && filePageUrlList.size()>0){
+					for(String url:filePageUrlList){
+						if(StringUtils.isNotEmpty(url.trim())){
+							removeFiles.add(FileUtils.getAliYunSubUrl(url));
+						}
+					}
+				}
+				executorService.execute(()->{
+					iossClient.removeFiles(removeFiles);
+					log.debug("文件删完了");
+				});
+
+				baseMapper.splitArchviesByNode(projectId,ancestors,strNodeId);
+			}else{
+				//没节点的按合同段
+				//清除案卷封面等pdf
+				List<String> archivesOutUrlList = baseMapper.getArchivesOutUrlListByContract(projectId,contractId,treeCode);
+				if(archivesOutUrlList!=null && archivesOutUrlList.size()>0){
+					for(String outUrl:archivesOutUrlList){
+						String[] splits = outUrl.split(",");
+						for(String url:splits){
+							if(StringUtils.isNotEmpty(url.trim())){
+								removeFiles.add(FileUtils.getAliYunSubUrl(url));
+							}
+						}
+					}
+				}
+				//清除文件页面pdf
+				List<String> filePageUrlList = baseMapper.getFilePageUrlListByContract(projectId,contractId,treeCode);
+				if(filePageUrlList!=null && filePageUrlList.size()>0){
+					for(String url:filePageUrlList){
+						if(StringUtils.isNotEmpty(url.trim())){
+							removeFiles.add(FileUtils.getAliYunSubUrl(url));
+						}
+					}
+				}
+				executorService.execute(()->{
+					iossClient.removeFiles(removeFiles);
+					log.debug("文件删完了");
+				});
+
+				//没节点的按合同段
+				baseMapper.splitArchviesByContract(projectId,contractId,treeCode);
+			}
+
+		}
+
+
+
+
+
+
+
+	}
+
+	@Override
+	public void archiveAutoMethod(Long projectId,Long contractId,Long nodeId){
+		//步骤一:把档号集合初始化
+		indexMap = new HashMap<>();
+		//步骤二:查询归档树节点。存在未归档文件的节点。
+		List<ArchiveTreeContract> list = archiveTreeContractClient.getHavedFileNodeByProjectID(projectId);
+
+		//按合同段过滤
+		List<ArchiveTreeContract> authlist = authFilter(list, contractId, nodeId);
+
+		//步骤三:遍历归档树节点整理出 默认规则节点,分类并卷节点,单独组卷节点 三个集合。
+		List<ArchiveTreeContract> list1= new ArrayList<>();
+		List<ArchiveTreeContract> list2= new ArrayList<>();
+		List<ArchiveTreeContract> list3= new ArrayList<>();
+		for(ArchiveTreeContract treeContract:authlist){
+			Integer archiveAutoType = treeContract.getArchiveAutoType();
+			switch (archiveAutoType){
+				case 1:
+					list1.add(treeContract);
+					break;
+				case 2:
+					list2.add(treeContract);
+					break;
+				case 3:
+					list3.add(treeContract);
+					break;
+			}
+		}
+		//步骤四:按照单独,分类,默认,分盒的顺序执行组卷流程。
+
+		//分盒文件集合
+		Map<String,List<ArchiveFile>> boxMap = new LinkedHashMap<>();
+
+		archiveAutoMethod3(list3,boxMap);//单独组卷
+		archiveAutoMethod2(list2,projectId,boxMap);//分类组卷
+		archiveAutoMethod1(list1,boxMap);//默认组卷
+		archiveAutoMethodBox(boxMap);//分盒组卷
+	}
+
+	private void addBoxMap(ArchiveFile file,Map<String,List<ArchiveFile>> boxMap){
+		String boxName = file.getBoxName();
+		if(boxMap.containsKey(boxName)){
+			List<ArchiveFile> boxFiles = boxMap.get(boxName);
+			boxFiles.add(file);
+			boxMap.put(boxName,boxFiles);
+		}else{
+			List<ArchiveFile> boxFiles = new ArrayList<>();
+			boxFiles.add(file);
+			boxMap.put(boxName,boxFiles);
+		}
+	}
+
+	@Override
+	public IPage<ArchivesAutoVO> pageByAuthenticate(ArchivesAutoVO vo) {
+		IPage<ArchivesAutoVO> page = new Page<>(vo.getCurrent(),vo.getSize());
+		//根据权限返回结果
+		ContractInfo contractInfo = contractClient.getContractById(vo.getContractId());
+		Integer contractType = contractInfo.getContractType();
+		//根据用户在当前合同段的权限,判断返回
+		BladeUser user = AuthUtil.getUser();
+		String name = baseMapper.getUserRoleName(vo.getProjectId(),vo.getContractId(),user.getUserId());
+		List<ArchivesAutoVO> list = new ArrayList<>();
+		if (name.contains("超级管理员") || contractType == 3) {
+			list = baseMapper.pageByAuthenticate(page, vo);
+		}else {
+			ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(vo.getNodeId());
+			if (node.getAncestors().split(",").length <= 2){
+				//查询当前合同
+				ArchiveTreeContract archiveTreeContract = archiveTreeContractClient.getArchiveTreeContractByNodeName(contractInfo.getContractName());
+				vo.setNodeId(archiveTreeContract.getId());
+			}
+				list = baseMapper.pageByAuthenticate(page, vo);
+		}
+		if (list != null && list.size() > 0){
+			list.stream().forEach(l->{
+				if (l.getFileSize() != null){
+					l.setFileSizeValue(org.springblade.common.utils.FileUtils.formatSize(l.getFileSize()*1024L));
+				}
+			});
+		}
+		return page.setRecords(list);
+	}
+
+	@Override
+	public List<String> getFilingUnitList(Long projectId) {
+		return baseMapper.getFilingUnitList(projectId);
+	}
+
+	@Override
+	public void batchDestroyArchive(String ids) {
+		List<String> list = Arrays.asList(ids.split(","));
+		//查询出档案的文件
+		List<ArchiveFile> files = archiveFileClient.getAllArchiveFileByArchiveIds(list);
+		if (files != null && files.size() > 0) {
+			//销毁阿里云上文件
+			List<String> removeFiles = new ArrayList<>();
+			for (ArchiveFile file : files) {
+				if (StringUtils.isNotBlank(file.getFileUrl())){
+					removeFiles.add(FileUtils.getAliYunSubUrl(file.getFileUrl()));
+				}
+				if (StringUtils.isNotBlank(file.getPdfFileUrl())){
+					removeFiles.add(FileUtils.getAliYunSubUrl(file.getFileUrl()));
+				}
+
+				//打码的也要删除
+				if (StringUtils.isNotBlank(file.getPdfPageUrl())){
+					removeFiles.add(FileUtils.getAliYunSubUrl(file.getPdfPageUrl()));
+				}
+
+			}
+			iossClient.removeFiles(removeFiles);
+			//删除文件
+			List<Long> collect = files.stream().map(file -> file.getId()).collect(Collectors.toList());
+			archiveFileClient.batchDeleteArchiveFile(collect);
+		}
+		//销毁案卷
+		baseMapper.batchDestroyByIds(list);
+	}
+
+
+	/**
+	 * 检查当前案卷的文件集合是否在规格内,能否开始组卷。
+	 * return
+	 * 0不能组卷,当前文件入待组卷集合,还能试加文件。
+	 * 1可以组卷,当前文件加入待组卷集合后开始组卷。
+	 * -1 不可组卷,当前文件不能加入待组卷集合, 待组卷集合要组卷了。
+	 * null 程序出错了
+	 */
+	private Integer checkSpecificationSize(int SpecificationSize,int archivesSize){
+		//按照当前目录节点的参数(卷盒规格)进行页数组合,
+		// 30MM默认为300页组成一卷、400MM默认为400页组成一卷、50MM默认为500页组成一卷、60MM默认为600组成一卷。
+		//注意:允许组卷上浮区间为100页
+		//意思是如果A\B两个文件进行并卷组卷,总页数规格为300页,但是A+B的文件数为350页,已经超过固定规格,但是上浮区间在100以内,则允许这样组卷。
+		//超过300之后,则不在继续与其他文件进行并卷组卷了。
+		int SpecificationSizeMax =SpecificationSize+100;
+
+		if(archivesSize<SpecificationSize){
+			//小于规格的 返回true ,当前文件加入待组卷集合,还可以试加文件,未到组卷规格
+			return 0;
+		}
+		if(archivesSize==SpecificationSize){
+			//等于规则的  当前文件加入待组卷集合,待组卷集合可以组卷了。
+			return 1;
+		}
+		if(archivesSize<=SpecificationSizeMax){
+			//小于等于规格上浮区间,当前文件加入待组卷集合,当前文件集合可以组卷了
+			return 1;
+		}
+		if(archivesSize>SpecificationSizeMax){
+			//大于规格上浮区间,当前文件不能加入当前待组卷集合,先把当前待组卷集合的文件先组卷完成,清空待组卷集合后再重新计算检查当前文件。
+			return -1;
+		}
+
+		return null;
+	}
+
+	private ArchivesAuto builtArchives(ArchiveTreeContract node,int pageN,int fileN,String startDate,String endDate,String archiveName){
+		ArchivesAuto archivesAuto = new ArchivesAuto();
+		archivesAuto.setProjectId(node.getProjectId());
+		archivesAuto.setContractId(node.getContractId());
+		archivesAuto.setName(archiveName);//案卷题名
+		if(indexMap==null){
+			indexMap=new HashMap<>(); //监理,施工的按合同段分类从0开始依次设置档号,建设单位的没有合同段 就先按一类依次设置
+		}
+
+		ContractInfo nodeContract=null;
+		List<ContractInfo> contracts =null;
+		//获取立卷单位
+		String unit="";
+		String treeCode = node.getTreeCode();
+		if(StringUtils.isEmpty(treeCode)){
+			//treeCode为null的是业主的节点
+			List<Long> pids = new ArrayList<>();
+			pids.add(node.getProjectId());
+			List<ContractInfo> contractInfos = contractClient.getContractByIds(pids);
+			for(ContractInfo contract:contractInfos){
+				if(contract.getContractType()==3){
+					unit=contract.archivesUnit();
+				}
+			}
+		}else{
+			//treeCode不为null则是对应合同段
+			ContractInfo contract = contractClient.getContractById(Long.parseLong(treeCode));
+			unit=contract.archivesUnit();
+		}
+		//获取档号
+		if(StringUtils.isEmpty(treeCode)){
+			treeCode="owner";
+		}
+		//String fileNumberPrefix=node.getFileNumberPrefix(); //档号前缀在节点设置
+		Integer fileNumberSuffix = null;//档号后缀按立卷单位生成流水号
+		if(indexMap.containsKey(treeCode)){
+			fileNumberSuffix = indexMap.get(treeCode);
+			indexMap.put(treeCode,fileNumberSuffix+1);
+		}else{
+			fileNumberSuffix=1;
+			indexMap.put(treeCode,fileNumberSuffix+1);
+		}
+
+		archivesAuto.setFileNumber(fileNumberSuffix.toString());//档号
+		//archivesAuto.setMicron();//微缩号
+		archivesAuto.setUnit(unit);//立卷单位
+		//archivesAuto.setQuantity();//数量/单位
+
+		archivesAuto.setSpecification(node.getSpecification());//案卷规格 从节点规格获取
+		//archivesAuto.setStartDate(LocalDateTime.parse(startDate));//文件开始时间
+		//archivesAuto.setEndDate(LocalDateTime.parse(endDate));//文件结束时间
+
+		//TODO 保管期限
+		String storageTime = node.getStorageTime();
+		if(StringUtils.isEmpty(storageTime)){
+			//节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
+			Long nodeContractId = archivesAuto.getContractId();
+			if(nodeContractId!=null && nodeContractId!=-1){
+				if(nodeContract==null){
+					nodeContract = contractClient.getContractById(nodeContractId);
+				}
+				storageTime = nodeContract.getStoragePeriod().toString();
+			}else{
+				List<Long> pids= new ArrayList<>();
+				pids.add(archivesAuto.getProjectId());
+				if(contracts==null){
+					contracts = contractClient.queryContractListByIds(pids);
+				}
+				for(ContractInfo c:contracts){
+					if(c.getContractType()==3){
+						storageTime = c.getStoragePeriod().toString();
+					}
+				}
+			}
+		}
+		archivesAuto.setStorageTime(storageTime);//保管期限  从节点规格获取
+
+		//保密级别 没地方设置 暂留
+		String secretLevel="";
+		if(StringUtils.isEmpty(secretLevel)){
+			//节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
+			Long nodeContractId = archivesAuto.getContractId();
+			if(nodeContractId!=null && nodeContractId!=-1){
+				if(nodeContract==null){
+					nodeContract = contractClient.getContractById(nodeContractId);
+				}
+				if(nodeContract.getSecurityLevel()==null){
+					secretLevel="4";
+				}else{
+					secretLevel = nodeContract.getSecurityLevel().toString();
+				}
+			}else{
+				List<Long> pids= new ArrayList<>();
+				pids.add(archivesAuto.getProjectId());
+				if(contracts==null){
+					contracts = contractClient.queryContractListByIds(pids);
+				}
+				for(ContractInfo c:contracts){
+					if(c.getContractType()==3){
+						if(nodeContract.getSecurityLevel()==null){
+							secretLevel="4";
+						}else{
+							secretLevel = c.getSecurityLevel().toString();
+						}
+					}
+				}
+			}
+		}
+		archivesAuto.setSecretLevel(secretLevel);
+
+		//立卷人 从节点规格获取
+		String rollor = node.getRollor();
+		if(StringUtils.isEmpty(rollor)){
+			//节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
+			Long nodeContractId = archivesAuto.getContractId();
+			if(nodeContractId!=null && nodeContractId!=-1){
+				if(nodeContract==null){
+					nodeContract = contractClient.getContractById(nodeContractId);
+				}
+				rollor = nodeContract.getFiler();
+			}else{
+				List<Long> pids= new ArrayList<>();
+				pids.add(archivesAuto.getProjectId());
+				if(contracts==null){
+					contracts = contractClient.queryContractListByIds(pids);
+				}
+				for(ContractInfo c:contracts){
+					if(c.getContractType()==3){
+						rollor = c.getFiler();;
+					}
+				}
+			}
+		}
+		archivesAuto.setRollor(rollor);
+
+		//审核人 从节点规格获取
+		String reviewer = node.getReviewer();
+		if(StringUtils.isEmpty(reviewer)){
+			//节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
+			Long nodeContractId = archivesAuto.getContractId();
+			if(nodeContractId!=null && nodeContractId!=-1){
+				if(nodeContract==null){
+					nodeContract = contractClient.getContractById(nodeContractId);
+				}
+				reviewer = nodeContract.getReviewer();
+			}else{
+				List<Long> pids= new ArrayList<>();
+				pids.add(archivesAuto.getProjectId());
+				if(contracts==null){
+					contracts = contractClient.queryContractListByIds(pids);
+				}
+				for(ContractInfo c:contracts){
+					if(c.getContractType()==3){
+						reviewer = c.getReviewer();
+					}
+				}
+			}
+		}
+		archivesAuto.setReviewer(reviewer);
+
+		//载体类型
+		if (node.getStorageType()!= null){
+			archivesAuto.setCarrierType(node.getStorageType().toString());
+		}
+		//archivesAuto.setKeywords();//主题词
+		//archivesAuto.setStorageLocation();//存放位置
+		archivesAuto.setIsArchive(1);//已归档
+		//archivesAuto.setRemark();//备注
+		LocalDateTime now = LocalDateTime.now();
+		LocalDateTime nextday = now.plusDays(1);
+		archivesAuto.setRollDate(now);//立卷日期
+		archivesAuto.setReviewDate(nextday);//审核日期
+
+		archivesAuto.setNodeId(node.getId());//归档树节点
+		archivesAuto.setOutUrl("");//TODO 生成案卷的封面 目录 备考表,背级
+		archivesAuto.setFileN(fileN);//文件数量
+		archivesAuto.setPageN(pageN);//案卷页数
+		//archivesAuto.setMileage();
+		//archivesAuto.setFileType();
+		//archivesAuto.setSize();
+		archivesAuto.setTreeSort(node.getTreeSort());
+		//archivesAuto.setIsOpen();
+		//archivesAuto.setIscheck(0);
+		archivesAuto.setIsAutoFile(0);//是否案卷收集上传的案卷
+		archivesAuto.setIsLock(0);//案卷锁定状态
+		archivesAuto.setIsDeleted(0);
+		baseMapper.insert(archivesAuto);
+		log.debug("组好"+archivesAuto.getName());
+		return archivesAuto;
+	}
+
+	private String getArchiveStartDateAndEndDate(List<ArchiveFile> waitArchiveFiles){
+		//找出文件集合中的最大最小时间
+		List<String> fileTimeList = new ArrayList<>();
+		for(ArchiveFile file:waitArchiveFiles){
+			fileTimeList.add(file.getFileTime());
+		}
+		Collections.sort(fileTimeList);
+		String startDate=fileTimeList.get(0);
+		String endDate=fileTimeList.get(fileTimeList.size()-1);
+		return startDate+","+endDate;
+	}
+
+	private String builtArchiveName(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node,boolean isCrossNode){
+
+		String archiveName="";
+
+		Long projectId = node.getProjectId();
+		ProjectInfo projectInfo = projectClient.getById(String.valueOf(projectId));
+		String projectName = projectInfo.getProjectName();
+		//获取案卷题名
+		//--正常节点
+		if(isCrossNode){
+			archiveName=projectName;
+			//存在跨节点  项目名称+文件对应的所有节点名称
+			Set<String> nodeIdSet = new LinkedHashSet<>();
+			for(ArchiveFile file:waitArchiveFiles){
+				String nodeId = file.getNodeId();
+				nodeIdSet.add(nodeId);
+			}
+			for(String nodeId:nodeIdSet){
+				ArchiveTreeContract treeNode = archiveTreeContractClient.getArchiveTreeContractById(Long.parseLong(nodeId));
+				String nodeName = treeNode.getNodeName();
+				archiveName=archiveName+" "+nodeName;
+			}
+		}else{
+			//不存在跨节点  项目名称+节点名称
+			archiveName=projectName+" "+node.getNodeName();
+		}
+
+		//TODO wbs节点
+		//不存在跨节点 项目名称+案卷题名规则(在后台归档目录树设置的)+后缀
+		//存在跨节点  获取当前所有节点的父级节点题名规则+所有同层级跨节点并卷的节点名称拼接+后缀
+		return archiveName+node.getArchiveNameSuffix();
+	}
+	private String builtFilePageNo(ArchivesAuto archivesAuto,List<ArchiveFile> waitArchiveFiles){
+		//生成文件对应的页码,返回url
+		archiveAutoPdfService.builtFilePageNo(archivesAuto,waitArchiveFiles);
+		this.updateById(archivesAuto);
+
+		return "";
+	}
+
+
+	/**
+	 * 单独组卷规则组卷
+	 * @param waitArchiveFiles
+	 * @param node 规格参数所在节点
+	 * @param pageN
+	 */
+	private void createArchive3(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node,int pageN){
+
+		String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
+		String[] split = archiveStartDateAndEndDate.split(",");
+		String startDate= split.length>=1 ?split[0]:"";
+		String endDate=split.length>=2 ?split[1]:"";
+		int fileN =waitArchiveFiles.size();
+
+		String archiveName=builtArchiveName(waitArchiveFiles,node,false);//获取案卷题名
+		//1.创建新案卷
+		ArchivesAuto archivesAuto = builtArchives(node, pageN, fileN,startDate,endDate,archiveName);
+		//2.设置文件所属案卷,组卷状态
+		Long archivesAutoId = archivesAuto.getId();
+
+		//封面和生成文件页码
+		archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
+
+		builtFilePageNo(archivesAuto,waitArchiveFiles);//生成文件页码
+
+
+
+		for(ArchiveFile file:waitArchiveFiles){
+			file.setArchiveId(archivesAutoId);//设置文件所属案卷
+			file.setIsArchive(1);
+
+		}
+		archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
+	}
+
+	/**
+	 * 分类并卷组卷
+	 * @param waitArchiveFiles
+	 * @param archiveAutoGroupId 分类并卷分组ID
+	 */
+	private void createArchive2(List<ArchiveFile> waitArchiveFiles, Long archiveAutoGroupId,Long projectId){
+
+		//获取同一分类archiveAutoGroupId下设置的(设置规则时选中的)节点,排好序
+		List<ArchiveTreeContract> selectList=archiveTreeContractClient.getStorageNodeByGroupId(projectId,archiveAutoGroupId);
+		//分类并卷节点默认采用同类型下第一个存储节点为归属节点
+		ArchiveTreeContract node = selectList.get(0);
+		//获取案卷文件起止时间
+		String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
+		String[] split = archiveStartDateAndEndDate.split(",");
+		String startDate= split.length>=1 ?split[0]:"";
+		String endDate=split.length>=2 ?split[1]:"";
+		int fileN =waitArchiveFiles.size();
+		//获取案卷内文件总页数
+		int pageN=0;
+		for(ArchiveFile file:waitArchiveFiles){
+			pageN=pageN+file.getFilePage();
+		}
+		//默认组卷存在跨节点组卷  注意案卷归属节点,案卷命名方式
+		//获取案卷题名
+		String archiveName=builtArchiveName(waitArchiveFiles,node,true);//获取案卷题名
+
+		//1.创建新案卷
+		ArchivesAuto archivesAuto = builtArchives(node,pageN,fileN,startDate,endDate,archiveName);
+
+		//2.生成文件页码
+		archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
+
+		builtFilePageNo(archivesAuto,waitArchiveFiles);
+
+		//3.设置文件所属案卷,组卷状态
+		Long archivesAutoId = archivesAuto.getId();
+		for(ArchiveFile file:waitArchiveFiles){
+			file.setArchiveId(archivesAutoId);//设置文件所属案卷
+			file.setIsArchive(1);
+		}
+		archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
+	}
+
+	/**
+	 * 默认规则组卷
+	 * @param waitArchiveFiles
+	 * @param pageN
+	 */
+	private void createArchive1(List<ArchiveFile> waitArchiveFiles,int pageN){
+
+		//获取案卷文件起止时间
+		String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
+		String[] split = archiveStartDateAndEndDate.split(",");
+		String startDate= split.length>=1 ?split[0]:"";
+		String endDate=split.length>=2 ?split[1]:"";
+		int fileN =waitArchiveFiles.size();
+
+
+		//默认组卷存在跨节点组卷  注意案卷归属节点,案卷命名方式
+		//案卷归属节点为 排第一的文件所属节点
+		ArchiveFile firstFile = waitArchiveFiles.get(0);
+		Long nodeId = Long.parseLong(firstFile.getNodeId());
+		ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
+
+		//获取案卷题名
+		String archiveName=builtArchiveName(waitArchiveFiles,node,true);//获取案卷题名
+
+		//1.创建新案卷
+		ArchivesAuto archivesAuto = builtArchives(node,pageN,fileN,startDate,endDate,archiveName);
+
+		//2.封面和生成文件页码
+		archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
+
+		builtFilePageNo(archivesAuto,waitArchiveFiles);
+
+		//3.设置文件所属案卷,组卷状态
+		Long archivesAutoId = archivesAuto.getId();
+		for(ArchiveFile file:waitArchiveFiles){
+			file.setArchiveId(archivesAutoId);//设置文件所属案卷
+			file.setIsArchive(1);
+		}
+		archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
+	}
+
+	private void createArchiveBox(String boxName,List<ArchiveFile> waitArchiveFiles){
+
+		if(waitArchiveFiles.size()==0){
+			return;
+		}
+
+		String nodeId = waitArchiveFiles.get(0).getNodeId();
+
+		ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(Long.parseLong(nodeId));
+
+		//获取案卷文件起止时间
+		String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
+		String[] split = archiveStartDateAndEndDate.split(",");
+		String startDate= split.length>=1 ?split[0]:"";
+		String endDate=split.length>=2 ?split[1]:"";
+		int fileN =waitArchiveFiles.size();
+		//获取案卷内文件总页数
+		int pageN=0;
+		for(ArchiveFile file:waitArchiveFiles){
+			pageN=pageN+file.getFilePage();
+		}
+
+
+		//默认组卷存在跨节点组卷  注意案卷归属节点,案卷命名方式
+		//获取案卷题名
+		//String archiveName=builtArchiveName(waitArchiveFiles,node,false);//获取案卷题名
+
+		//1.创建新案卷
+		ArchivesAuto archivesAuto = builtArchives(node,pageN,fileN,startDate,endDate,boxName);
+
+		//2.封面和生成文件页码
+		archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
+
+		builtFilePageNo(archivesAuto,waitArchiveFiles);
+
+		//3.设置文件所属案卷,组卷状态
+		Long archivesAutoId = archivesAuto.getId();
+		for(ArchiveFile file:waitArchiveFiles){
+			file.setArchiveId(archivesAutoId);//设置文件所属案卷
+			file.setIsArchive(1);
+		}
+		archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
+	}
+
+
+	/**
+	 * 单租组卷流程  节点下的文件只在当前节点下组卷
+	 */
+	private void archiveAutoMethod3(List<ArchiveTreeContract> list,Map<String,List<ArchiveFile>> boxMap){
+		//步骤1:遍历节点集合
+		for(ArchiveTreeContract node:list){
+			//步骤2:获取当前节点的案卷规格
+			String specificationStr = node.getSpecification();
+			if(StringUtils.isEmpty(specificationStr)){
+				specificationStr="30";
+			}
+			int specification = Integer.parseInt(specificationStr);
+			int specificationSize=specification*10;
+			//步骤3:查询节点下的未组卷文件
+			List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
+			//步骤4:遍历未归档文件
+			//待组卷文件集合
+			List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
+			//待组卷文件总页数
+			int archivesSize=0;
+			if(archiveFiles!=null){
+				int archiveFilesSize=0;
+				for(ArchiveFile file:archiveFiles){
+					archiveFilesSize++;
+					//步骤5:判断文件是否存在分盒设置
+					if(file.getBoxNumber()!=null && file.getBoxNumber()!=-1){
+						//添加到分盒文件集合
+						addBoxMap(file,boxMap);
+						if(archiveFilesSize==archiveFiles.size() && waitArchiveFiles.size()>0){
+							//最后一个文件直接将waitArchiveFiles组卷
+							createArchive3(waitArchiveFiles,node,archivesSize);
+						}
+					}else{
+						//单独组卷流程
+						//步骤6:计算和判断待组卷文件集合是否达到组卷要求,达到要求创建案卷,案卷归属当前节点,案卷下文件改为已组卷
+						Integer filePage = file.getFilePage();
+						archivesSize=archivesSize+filePage;
+						Integer checkStatus = checkSpecificationSize(specificationSize, archivesSize);
+						//步骤6.1未到规格 不组卷
+						if(checkStatus==0){
+							waitArchiveFiles.add(file);
+							//判断是否最后一个文件
+							if(archiveFilesSize==archiveFiles.size()){
+								//最后一个文件直接将waitArchiveFiles组卷
+								createArchive3(waitArchiveFiles,node,archivesSize);
+							}else{
+								continue;
+							}
+						}
+						//步骤6.2达到规格 可以组一卷
+						if(checkStatus==1){
+							waitArchiveFiles.add(file);
+							//将waitArchiveFiles组卷
+							createArchive3(waitArchiveFiles,node,archivesSize);
+							//将待组卷文件集合,总页数还原初始值,
+							waitArchiveFiles.clear();
+							archivesSize=0;
+						}
+						//步骤6.3超出规格
+						if(checkStatus==-1){
+							//如果waitArchiveFiles集合size>0,先将集合中文件组卷。再将当前文件放入集合
+							if(waitArchiveFiles.size()>0){
+								//将waitArchiveFiles组卷,
+								createArchive3(waitArchiveFiles,node,archivesSize-filePage);
+								//然后将待组卷文件集合,总页数还原初始值,
+								waitArchiveFiles.clear();
+								//保存当前文件进入待组卷集合,待组卷页数=当前文件页数
+								waitArchiveFiles.add(file);
+								archivesSize=filePage;
+
+								//判断是否最后一个文件
+								if(archiveFilesSize==archiveFiles.size()){
+									//如果当前文件最后一个文件直接将waitArchiveFiles组卷
+									createArchive3(waitArchiveFiles,node,archivesSize);
+									waitArchiveFiles.clear();
+									archivesSize=0;
+								}
+							}else{
+								//步骤6.3.2如果waitArchiveFiles集合size=0,说明当前文件已经超过规格,直接将当前文件组卷
+								waitArchiveFiles.add(file);
+								//直接将waitArchiveFiles组卷
+								createArchive3(waitArchiveFiles,node,archivesSize);
+								waitArchiveFiles.clear();
+								archivesSize=0;
+							}
+						}
+					}
+				}
+			}
+
+		}
+
+	}
+
+	/**
+	 * 分类并卷组卷  设置分类的节点下只有一个案卷,节点下的所有文件都组成这个案卷。如果设置分类节点(select=1的)多个,案卷归属排序第一个节点。
+	 */
+	private void archiveAutoMethod2(List<ArchiveTreeContract> list,Long projectId,Map<String,List<ArchiveFile>> boxMap){
+
+		//分类并卷集合<groupId,List<文件>>
+		Map<Long,List<ArchiveFile>> archiveMap = new HashMap<>();
+		//记录同个分组id的第一个节点ID 案卷归属于这个节点
+		Map<Long,Long> groupId2NodeIdMap = new HashMap<>();
+
+		//步骤1:遍历节点集合
+		for(ArchiveTreeContract node:list) {
+			//根据分组ID来创建唯一案卷
+			Long archiveAutoGroupId=node.getArchiveAutoGroupId();
+			//步骤2:查询节点下的未归档文件
+			List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
+			//步骤3:遍历未归档文件
+			if(archiveFiles!=null){
+				for(ArchiveFile file:archiveFiles){
+					//步骤4:判断文件是否存在分盒设置
+					if(file.getBoxNumber()!=null && file.getBoxNumber()!=-1){
+						//添加到分盒文件集合
+						addBoxMap(file,boxMap);
+					}else{
+						//分类并卷流程
+						//步骤5:将文件按照<groupId,List<文件>>放入集合
+						if(archiveMap.containsKey(archiveAutoGroupId)){
+							List<ArchiveFile> groupList = archiveMap.get(archiveAutoGroupId);
+							groupList.add(file);
+							archiveMap.put(archiveAutoGroupId,groupList);
+						}else{
+							List<ArchiveFile> groupList= new ArrayList<>();
+							groupList.add(file);
+							archiveMap.put(archiveAutoGroupId,groupList);
+							groupId2NodeIdMap.put(archiveAutoGroupId,node.getId());
+						}
+					}
+				}
+			}
+		}
+		//步骤6:按集合创建案卷,每个group类的案卷归属顺序排第一个节点
+		Set<Map.Entry<Long, List<ArchiveFile>>> entries = archiveMap.entrySet();
+		for(Map.Entry<Long, List<ArchiveFile>> entry:entries){
+			Long archiveAutoGroupId = entry.getKey();
+			List<ArchiveFile> archiveFiles = entry.getValue();
+			//一个archiveAutoGroupId组成一个案卷  案卷归属同个key的归档树节点select=1的第一个groupId2NodeIdMap
+			createArchive2(archiveFiles,archiveAutoGroupId,projectId);
+		}
+
+	}
+
+	/**
+	 * 默认组卷流程 文件可以跨节点组卷,受最高并卷节点限制范围,跨节点文件组卷时,案卷规格按照第一个文件所在的节点规格 组卷。
+	 */
+	private void archiveAutoMethod1(List<ArchiveTreeContract> list,Map<String,List<ArchiveFile>> boxMap){
+		//最高并卷节点
+		Long archiveAutoNodeId=null;
+
+		//当前待组卷规格大小
+		int specificationSize=0;
+		//待组卷文件总页数
+		int archivesSize=0;
+		//待组卷文件集合
+		List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
+
+		//步骤1:遍历节点集合
+		int nodeSize=0;
+		for(ArchiveTreeContract node:list){
+			nodeSize++;
+			if(archiveAutoNodeId==null){
+				archiveAutoNodeId=node.getArchiveAutoNodeId();
+			}
+			//当前节点的的archiveAutoNodeId
+			Long archiveAutoNodeId_current = node.getArchiveAutoNodeId();
+
+
+			//步骤2:判断当前节点是否超出最高节点
+			if(!archiveAutoNodeId.equals(archiveAutoNodeId_current)) {
+				//超过最高并卷节点(节点是排序好的,只要不相等就超过了)
+				if(waitArchiveFiles.size()>0){
+					//将待组卷集合里的文件组卷
+					createArchive1(waitArchiveFiles,archivesSize);
+				}
+				waitArchiveFiles.clear();
+				archivesSize=0;
+				archiveAutoNodeId=node.getArchiveAutoNodeId();//更新当前最高并卷节点
+			}
+
+			//步骤3.1:获取节点规格
+			if(waitArchiveFiles.size()==0){
+				//waitArchiveFiles待组卷文件为空时,按当前节点的规格
+				String specificationStr = node.getSpecification();
+				if(StringUtils.isEmpty(specificationStr)){
+					specificationStr="30";
+				}
+				int specification = Integer.parseInt(specificationStr);
+				specificationSize=specification*10;
+			}
+
+			//步骤3.2:查询出当前节点未组卷的文件
+			List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
+			//步骤3.3:遍历未组卷文件
+			int archiveFilesSize=0;
+			for(ArchiveFile file:archiveFiles){
+				archiveFilesSize++;
+				//步骤3.4:判断文件是否存在分盒设置
+				if(file.getBoxNumber()!=null && file.getBoxNumber()!=-1) {
+					//添加到分盒文件集合
+					addBoxMap(file,boxMap);
+					if(nodeSize==list.size() && archiveFilesSize==archiveFiles.size()){
+						//如果当前是最后一个文件直接将waitArchiveFiles组卷
+						createArchive1(waitArchiveFiles,archivesSize);
+					}
+				}else{
+					//步骤3.5 计算和判断待组卷文件集合是否达到组卷要求,达到要求创建案卷,案卷归属当前节点,案卷下文件改为已组卷
+					Integer filePage = file.getFilePage();
+					archivesSize=archivesSize+filePage;
+					Integer checkStatus = checkSpecificationSize(specificationSize, archivesSize);
+					//步骤3.6未到规格 不组卷
+					if(checkStatus==0){
+						waitArchiveFiles.add(file);
+						//判断是否最后一个节点,最后一个文件
+						if(nodeSize==list.size() && archiveFilesSize==archiveFiles.size()){
+							//直接将waitArchiveFiles待组卷集合组卷,归属集合第一个文件所在节点
+							createArchive1(waitArchiveFiles,archivesSize);
+							//将待组卷文件集合,总页数还原初始值,
+							waitArchiveFiles.clear();
+							archivesSize=0;
+						}else{
+							continue;
+						}
+					}
+					//步骤3.7达到规格 可以组一卷
+					if(checkStatus==1){
+						waitArchiveFiles.add(file);
+						//将waitArchiveFiles待组卷集合组卷,归属集合第一个文件所在节点
+						createArchive1(waitArchiveFiles,archivesSize);
+						//将待组卷文件集合,总页数还原初始值,
+						waitArchiveFiles.clear();
+						archivesSize=0;
+
+						String specificationStr = node.getSpecification();
+						if(StringUtils.isEmpty(specificationStr)){
+							specificationStr="30";
+						}
+						int specification = Integer.parseInt(specificationStr);
+						specificationSize=specification*10;//更新specificationSize待组卷规格为 当前节点的组卷规格
+					}
+					//步骤3.8超出规格
+					if(checkStatus==-1){
+						//步骤3.9如果waitArchiveFiles集合size>0,先将集合中文件组卷。再将当前文件加入集合
+						if(waitArchiveFiles.size()>0){
+							//3.9.1 将waitArchiveFiles组卷,归属集合第一个文件所在节点
+							createArchive1(waitArchiveFiles,archivesSize);
+							//将待组卷文件集合,总页数还原初始值,
+							waitArchiveFiles.clear();
+							//3.9.2保存当前文件进入待组卷集合,
+							waitArchiveFiles.add(file);
+							//3.9.3待组卷页数=当前文件页数
+							archivesSize=filePage;
+
+							String specificationStr = node.getSpecification();
+							if(StringUtils.isEmpty(specificationStr)){
+								specificationStr="30";
+							}
+							int specification = Integer.parseInt(specificationStr);
+							specificationSize=specification*10;//更新specificationSize待组卷规格为 当前节点的组卷规格
+
+							//3.9.4 判断当前文件是不是最后一个节点,最后一个文件
+							if(nodeSize==list.size() && archiveFilesSize==archiveFiles.size()){
+								//最后一个文件再将waitArchiveFiles组卷
+								createArchive1(waitArchiveFiles,archivesSize);
+							}
+						}else{
+							//步骤3.10 如果waitArchiveFiles集合size=0,说明当前文件已经超过规格,直接将当前文件组卷
+							waitArchiveFiles.add(file);
+							//直接将waitArchiveFiles组卷
+							createArchive1(waitArchiveFiles,archivesSize);
+							waitArchiveFiles.clear();
+							archivesSize=0;
+						}
+					}
+
+				}
+			}
+
+		}
+
+	}
+
+	/**
+	 * 分盒组卷流程
+	 * @param boxMap
+	 */
+	private void archiveAutoMethodBox(Map<String,List<ArchiveFile>> boxMap){
+		Set<Map.Entry<String, List<ArchiveFile>>> entries = boxMap.entrySet();
+		for (Map.Entry<String, List<ArchiveFile>> entry:entries){
+			//一个分盒一个案卷 归属第一个文件所在节点
+			createArchiveBox(entry.getKey(),entry.getValue());
+		}
+	}
+
+	/**
+	 * 查询案卷,排序
+	 * @param ids
+	 * @return
+	 */
+	public List<ArchivesAuto> findArchivesAutosByIds(List<Long> ids) {
+		QueryWrapper<ArchivesAuto> queryWrapper = new QueryWrapper<>();
+		queryWrapper.in("node_id", ids)
+				.eq("is_deleted",0)
+				.eq("is_archive",1)
+				.ne("is_auto_file",1)
+				.orderByAsc("tree_sort")
+				.orderByAsc("auto_file_sort")
+				.orderByAsc("file_number");
+
+		return this.list(queryWrapper);
+	}
+
+
+	/**
+	 *   不重组的情况下刷新档号
+	 * projectId 为当前项目
+	 * contractId 为客户端当前选定的合同段
+	 * nodeId 为左侧树选定的节点i
+	 * 规则,1. 合同段ID为空,则不过滤
+	 *      2. 业主或者管理员,treeCode为空,则按照nodeid过滤,nodeid为空,则不过滤
+	 *      3. 合同段用户,安装找contractId过滤,过滤该合同段所有节点。
+	 * @param projectId
+	 * @param contractId
+	 * @param nodeId
+	 */
+	public void refreshFileNumberNoSlipt(Long projectId,Long contractId,Long nodeId) {
+		List<ArchiveTreeContract> list = archiveTreeContractClient.getListByProjectId(projectId);
+		this.refreshFileNumberNoSlipt(list,contractId,nodeId);
+	}
+
+	/**
+	 *
+	 * @param archiveTreeContracts
+	 * @param contractId
+	 * @param nodeId
+	 */
+	public void refreshFileNumberNoSlipt(List<ArchiveTreeContract> archiveTreeContracts,Long contractId,Long nodeId) {
+
+		List<ArchiveTreeContractVO2> subTreeList = new ArrayList<>();
+		List<List<ArchiveTreeContract>>  subGroupedList = new ArrayList<>();
+		ArchiveTreeUtil.getGroupedList(archiveTreeContracts,subTreeList,subGroupedList);
+		Integer index = 1;
+
+		List<ArchivesAuto> changeList = new ArrayList<>();
+
+		//分组,分程 建设单位,各个合同段,电子单位等
+		for (List<ArchiveTreeContract> subList: subGroupedList) {
+			List<Long> ids = subList.stream()
+					.map(ArchiveTreeContract::getId)
+					.collect(Collectors.toList());
+
+			//todo 后续根据 authFilter函数过滤
+
+			subList = authFilter(subList,contractId,nodeId);
+
+			index =1;
+			List<ArchivesAuto> archivesAutos = findArchivesAutosByIds(ids);
+			if (archivesAutos == null || archivesAutos.size() == 0) {
+				continue;
+			}
+			//准备节点id-节点档号前缀Map
+			Map<String,String> node_fileNumberPrefixMap= new HashMap<>();
+			for(ArchiveTreeContract node:subList){
+				node_fileNumberPrefixMap.put(node.getId().toString(),node.getFileNumberPrefix());
+			}
+
+			for (ArchivesAuto archivesAuto: archivesAutos) {
+				String nodeId1 = archivesAuto.getNodeId().toString();
+				String fileNumberPrefix ="";
+				if(node_fileNumberPrefixMap.containsKey(nodeId1)){
+					fileNumberPrefix=node_fileNumberPrefixMap.get(nodeId1);
+					if(StringUtils.isEmpty(fileNumberPrefix)){
+						//节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
+						Long nodeContractId = archivesAuto.getContractId();
+						if(nodeContractId!=null){
+							ContractInfo nodeContract = contractClient.getContractById(nodeContractId);
+							fileNumberPrefix = nodeContract.getPrefix();
+						}else{
+							List<Long> pids= new ArrayList<>();
+							pids.add(archivesAuto.getProjectId());
+							List<ContractInfo> contracts = contractClient.queryContractListByIds(pids);
+							for(ContractInfo c:contracts){
+								if(c.getContractType()==3){
+									fileNumberPrefix = c.getPrefix();
+								}
+							}
+						}
+					}
+				}
+
+				String fileNumber = fileNumberPrefix +"_"+ index;
+				if (archiveAutoPdfService.refreshFileNumber(archivesAuto,fileNumber)){
+					changeList.add(archivesAuto);
+				}
+				index++;
+			}
+		}
+		this.updateBatchById(changeList);
+	}
+
+	/**
+	 *	获取案卷合成pdf文件
+	 * @param archiveId
+	 * @return
+	 */
+	public String getMergeArchivesFile(Long archiveId){
+		String url = "";
+
+		List<String> urlList= new ArrayList<>();//合成pdf集合
+
+		ArchivesAuto archivesAuto = this.getById(archiveId);
+
+		//判断archivesAuto是否为空
+		if (archivesAuto == null){
+			return url;
+		}
+		String outUrl = archivesAuto.getOutUrl();
+		//判断outUrl是否为空
+		String[] frontUrls = null;
+		if (StringUtils.isNotEmpty(outUrl)){
+			frontUrls = outUrl.split(",");
+		}
+
+		ArchiveProjectConfig config = archiveProjectConfigService.getByProjectIdOrNew(archivesAuto.getProjectId());
+
+		// 根据 factorType 字符串生成档案号码字符串链表
+		String front = "";
+		String cataLog = "";
+		String spare = "";
+		String back = "";
+
+
+		if(frontUrls != null ) {
+			for (String frontUrl : frontUrls) {
+				if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[0]) && config.getFactorType().contains("1")) {
+					front = frontUrl;
+				} else if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[1]) && config.getFactorType().contains("2")) {
+					cataLog = frontUrl;
+				} else if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[2]) && config.getFactorType().contains("3")) {
+					spare = frontUrl;
+				} else if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[3]) && config.getFactorType().contains("4")) {
+					back = frontUrl;
+				}
+			}
+		}
+		List<String> fileUrls =new ArrayList<>();
+		if (!archivesAuto.isMedia()) {
+			List<ArchiveFile> result = this.archiveFileClient.getArchiveFileByArchivesId(archivesAuto.getId().toString(),"");
+			if(result != null && result.size() > 0){
+				//循环访问result,如果pdfpageurl不为空则取出,否则取pdffileurl
+				for (ArchiveFile archiveFile : result) {
+					String pdfPageUrl = archiveFile.getPdfPageUrl();
+					if (StringUtils.isEmpty(pdfPageUrl)) {
+						fileUrls.add(archiveFile.getPdfFileUrl());
+					}else{
+						fileUrls.add(pdfPageUrl);
+					}
+				}
+			}
+		}
+
+		if (fileUrls.size() > 0){
+			//此处暂时这么处理,等oss上传接口里文件名可以区分后,再单独取
 //			if (frontUrls != null && frontUrls.length > 3){
 //
 //				urlList.add(frontUrls[0]);
 //				urlList.add(frontUrls[1]);
 //			}
-            if (StringUtils.isNotEmpty(front)) {
-                urlList.add(front);
-            }
+			if (StringUtils.isNotEmpty(front)) {
+				urlList.add(front);
+			}
 
-            if (StringUtils.isNotEmpty(cataLog)) {
-                urlList.add(cataLog);
-            }
+			if (StringUtils.isNotEmpty(cataLog)) {
+				urlList.add(cataLog);
+			}
 
-            urlList.addAll(fileUrls);
+			urlList.addAll(fileUrls);
 
 //			if (frontUrls != null && frontUrls.length > 3){
 //				urlList.add(frontUrls[2]);
 //				urlList.add(frontUrls[3]);
 //			}
-            if (StringUtils.isNotEmpty(spare)) {
-                urlList.add(spare);
-            }
-
-            if (StringUtils.isNotEmpty(back)) {
-                urlList.add(back);
-            }
-            String fileName = SnowFlakeUtil.getId().toString();
-            url = archiveAutoPdfService.MergePdfAndUpload(urlList, fileName, null, archivesAuto.getProjectId());
-        }
-        return url;
-    }
-
-    /**
-     * 拆卷
-     *
-     * @param ids
-     * @return
-     */
-    public boolean slipt(String ids) {
-
-        List orgIds = Func.toLongList(ids);
-
-        List<String> strIds = new ArrayList<>();
-        List<Long> lIds = new ArrayList<>();
-
-        //排除锁定的和单文件案卷这种
-        List<ArchivesAuto> archivesAutos = this.listByIds(orgIds);
-        for (ArchivesAuto ar : archivesAutos) {
-            if (ar.getIsLock() != null && ar.getIsLock() == 1) {
-                continue;
-            }
-            if (ar.getIsAutoFile() != null && ar.getIsAutoFile() == 1) {
-                continue;
-            }
-            lIds.add(ar.getId());
-            strIds.add(ar.getId().toString());
-        }
-
-        //更新
-        List<ArchiveFile> files = archiveFileClient.getAllArchiveFileByArchiveIds(strIds);
-        List<String> removeFiles = new ArrayList<>();
-        if (files != null && files.size() > 0) {
-
-            List<Long> fids = files.stream()
-                    .map(ArchiveFile::getId)
-                    .collect(Collectors.toList());
-            baseMapper.splitFiles(fids);
-
-            //删除打码文件
-            for (ArchiveFile file : files) {
-                //打码的也要删除
-                if (StringUtils.isNotBlank(file.getPdfPageUrl())) {
-                    removeFiles.add(FileUtils.getAliYunSubUrl(file.getPdfPageUrl()));
-                }
-            }
-            iossClient.removeFiles(removeFiles);
-        }
-
-        //删除案卷
-        return this.deleteLogic(lIds);
-    }
-
-    /**
-     * 从案卷删除文件,兵重新生成封面和打码文件
-     *
-     * @param ids
-     * @return
-     */
-    public boolean removeFiles(String ids, Long archiveId) {
-        List<Long> fids = Func.toLongList(ids);
-
-
-        ArchivesAuto archivesAuto = this.getById(archiveId);
-
-        List<String> strIds = new ArrayList<>();
-        strIds.add(archiveId.toString());
-        List<ArchiveFile> files = archiveFileClient.getAllArchiveFileByArchiveIds(strIds);
-        List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
-        if (files != null && files.size() > 0) {
-            List<String> removeFiles = new ArrayList<>();
-            for (ArchiveFile file : files) {
-
-                if (StringUtils.isNotBlank(file.getPdfPageUrl())) {
-                    removeFiles.add(FileUtils.getAliYunSubUrl(file.getPdfPageUrl()));
-                }
-
-                if (!fids.contains(file.getId())) {
-                    waitArchiveFiles.add(file);
-                }
-            }
-            //删除文件
-            iossClient.removeFiles(removeFiles);
-
-            //删除不用的案卷
-            if (fids.size() > 0) {
-                baseMapper.splitFiles(fids);
-            }
-
-            Long archivesAutoId = archivesAuto.getId();
-
-            //封面和生成文件页码
-            archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(), archivesAuto, waitArchiveFiles);
-
-            builtFilePageNo(archivesAuto, waitArchiveFiles);//生成文件页码
-
-            for (ArchiveFile file : waitArchiveFiles) {
-                file.setArchiveId(archivesAutoId);//设置文件所属案卷
-                file.setIsArchive(1);
-
-            }
-
-            //保存
-            this.updateById(archivesAuto);
-            archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
-        }
-
-        return true;
-    }
-
-
-    /**
-     * 施工则返回“C”,监理则返回“S”,其他返回“”
-     *
-     * @return
-     */
-    public String getAuthCode(Long contractId) {
-        String code = "";
-        BladeUser bladeUser = AuthUtil.getUser();
-        if (AuthUtil.isAdministrator() || contractId == null) {
-            return code;
-        }
-
-        //查询合同段信息
-        ContractInfo contractInfo = contractClient.getContractById(contractId);
-        switch (contractInfo.getContractType()) {
-            case 2:
-                code = "S";
-                break;
-            case 3:
-                code = "";
-                break;
-            default:
-                code = "C";
-                break;
-        }
-
-        return code;
-    }
-
-    /**
-     * 带权限筛选的档案列表筛选函数
-     * 规则,1. 合同段ID为空,则不过滤
-     * 2. 业主或者管理员,treeCode为空,则按照nodeid过滤,nodeid为空,则不过滤
-     * 3. 合同段用户,安装找contractId过滤,过滤该合同段所有节点。
-     *
-     * @param archiveTreeContracts 档案列表archiveTreeContracts
-     * @param contractId           合同编号,用于获取权限码
-     * @param nodeId               筛选条件:节点编号
-     * @return 符合条件的档案列表
-     */
-    public List<ArchiveTreeContract> authFilter(List<ArchiveTreeContract> archiveTreeContracts, Long contractId, Long nodeId) {
-        //合同段ID为空则全部返回
-        if (contractId == null) {
-            return archiveTreeContracts;
-        }
-
-        String treeCode = getAuthCode(contractId);
-        String strNodeId = "";
-        if (nodeId != null) {
-            ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
-            strNodeId = nodeId.toString();
-            if (node.getContractId() == null || node.getContractId() == -1) {
-                treeCode = "";
-            }
-        }
-
-        return archiveTreeContractFilter(archiveTreeContracts, treeCode, strNodeId, contractId);
-    }
-
-    /**
-     * 对档案列表进行筛选
-     *
-     * @param archiveTreeContracts 档案列表
-     * @param treeCode             筛选条件:权限码
-     * @param nodeId               筛选条件:节点编号
-     * @return 符合条件的档案列表
-     */
-    public List<ArchiveTreeContract> archiveTreeContractFilter(List<ArchiveTreeContract> archiveTreeContracts, String treeCode, String nodeId, Long contractId) {
-        List<ArchiveTreeContract> result = new ArrayList<>();
-
-        if (StringUtils.isEmpty(treeCode) && StringUtils.isEmpty(nodeId)) {
-            return archiveTreeContracts;
-        }
-
-        for (ArchiveTreeContract contract : archiveTreeContracts) {
-            if (StringUtils.isEmpty(treeCode)) {
-                if (StringUtils.isNotEmpty(contract.getAncestors()) && contract.getAncestors().contains(nodeId)) {
-                    result.add(contract);
-                }
-            } else {
-                if (treeCode.equals(contract.getTreeCode()) || contractId.toString().equals(contract.getTreeCode())) {
-                    result.add(contract);
-                }
-            }
-        }
-
-        return result;
-    }
-
-    public void test() {
-        String ids = "1654406079229165569";
-
-        List<Long> fids = Func.toLongList(ids);
-
-
-        LambdaQueryWrapper<ArchiveFile> wrapper = Wrappers.lambdaQuery();
-        wrapper.in(ArchiveFile::getId, fids);
-
-        // 调用 listWrappers() 方法来获取符合条件的 ArchiveFile 对象列表
-        List<ArchiveFile> files = archiveFileClient.listbyIds(fids);
-        System.out.println();
-    }
-
-    @Override
-    public List<DictBiz> getCarrierTypeByDict() {
-        return autoMapper.getCarrierTypeByDict();
-    }
+			if (StringUtils.isNotEmpty(spare)) {
+				urlList.add(spare);
+			}
+
+			if (StringUtils.isNotEmpty(back)) {
+				urlList.add(back);
+			}
+			String fileName = SnowFlakeUtil.getId().toString();
+			url = archiveAutoPdfService.MergePdfAndUpload(urlList,fileName,null,archivesAuto.getProjectId());
+		}
+		return  url;
+	}
+
+	/**
+	 * 拆卷
+	 * @param ids
+	 * @return
+	 */
+	public  boolean slipt(String ids) {
+
+		List orgIds = Func.toLongList(ids);
+
+		List<String> strIds = new ArrayList<>();
+		List<Long> lIds = new ArrayList<>();
+
+		//排除锁定的和单文件案卷这种
+		List<ArchivesAuto> archivesAutos = this.listByIds(orgIds);
+		for (ArchivesAuto ar: archivesAutos) {
+			if (ar.getIsLock()!= null && ar.getIsLock() == 1) {
+				continue;
+			}
+			if (ar.getIsAutoFile()!= null &&  ar.getIsAutoFile() == 1) {
+				continue;
+			}
+			lIds.add(ar.getId());
+			strIds.add(ar.getId().toString());
+		}
+
+		//更新
+		List<ArchiveFile> files = archiveFileClient.getAllArchiveFileByArchiveIds(strIds);
+		List<String> removeFiles = new ArrayList<>();
+		if (files != null && files.size() > 0) {
+
+			List<Long> fids = files.stream()
+					.map(ArchiveFile::getId)
+					.collect(Collectors.toList());
+			baseMapper.splitFiles(fids);
+
+			//删除打码文件
+			for (ArchiveFile file : files) {
+				//打码的也要删除
+				if (StringUtils.isNotBlank(file.getPdfPageUrl())){
+					removeFiles.add(FileUtils.getAliYunSubUrl(file.getPdfPageUrl()));
+				}
+			}
+			iossClient.removeFiles(removeFiles);
+		}
+
+		//删除案卷
+		return this.deleteLogic(lIds);
+	}
+
+	/**
+	 * 从案卷删除文件,兵重新生成封面和打码文件
+	 * @param ids
+	 * @return
+	 */
+	public  boolean removeFiles(String ids,Long archiveId) {
+		List<Long> fids = Func.toLongList(ids);
+
+
+		ArchivesAuto archivesAuto = this.getById(archiveId);
+
+		List<String> strIds = new ArrayList<>();
+		strIds.add(archiveId.toString());
+		List<ArchiveFile> files = archiveFileClient.getAllArchiveFileByArchiveIds(strIds);
+		List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
+		if (files != null && files.size() > 0) {
+			List<String> removeFiles = new ArrayList<>();
+			for (ArchiveFile file : files) {
+
+				if (StringUtils.isNotBlank(file.getPdfPageUrl())){
+					removeFiles.add(FileUtils.getAliYunSubUrl(file.getPdfPageUrl()));
+				}
+
+				if (!fids.contains(file.getId())) {
+					waitArchiveFiles.add(file);
+				}
+			}
+			//删除文件
+			iossClient.removeFiles(removeFiles);
+
+			//删除不用的案卷
+			if (fids.size() > 0) {
+				baseMapper.splitFiles(fids);
+			}
+
+			Long archivesAutoId = archivesAuto.getId();
+
+			//封面和生成文件页码
+			archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
+
+			builtFilePageNo(archivesAuto,waitArchiveFiles);//生成文件页码
+
+			for(ArchiveFile file:waitArchiveFiles){
+				file.setArchiveId(archivesAutoId);//设置文件所属案卷
+				file.setIsArchive(1);
+
+			}
+
+			//保存
+			this.updateById(archivesAuto);
+			archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
+		}
+
+		return true;
+	}
+
+
+	/**
+	 * 施工则返回“C”,监理则返回“S”,其他返回“”
+	 * @return
+	 */
+	public String getAuthCode(Long contractId) {
+		String code ="";
+		BladeUser bladeUser = AuthUtil.getUser();
+		if (AuthUtil.isAdministrator() || contractId == null) {
+			return code;
+		}
+
+		//查询合同段信息
+		ContractInfo contractInfo = contractClient.getContractById(contractId);
+		switch (contractInfo.getContractType()){
+			case 2:
+				code = "S";
+				break;
+			case 3:
+				code = "";
+				break;
+			default:
+				code = "C";
+				break;
+		}
+
+		return code;
+	}
+
+	/**
+	 * 带权限筛选的档案列表筛选函数
+	 * 规则,1. 合同段ID为空,则不过滤
+	 *      2. 业主或者管理员,treeCode为空,则按照nodeid过滤,nodeid为空,则不过滤
+	 *      3. 合同段用户,安装找contractId过滤,过滤该合同段所有节点。
+	 * @param archiveTreeContracts 档案列表archiveTreeContracts
+	 * @param contractId 合同编号,用于获取权限码
+	 * @param nodeId 筛选条件:节点编号
+	 * @return 符合条件的档案列表
+	 */
+	public List<ArchiveTreeContract> authFilter(List<ArchiveTreeContract> archiveTreeContracts, Long contractId, Long nodeId) {
+		//合同段ID为空则全部返回
+		if (contractId == null) {
+			return  archiveTreeContracts;
+		}
+
+		String treeCode = getAuthCode(contractId);
+		String strNodeId = "";
+		if (nodeId!= null) {
+			ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
+			strNodeId  = nodeId.toString();
+			if(node.getContractId()==null || node.getContractId()==-1){
+				treeCode="";
+			}
+		}
+
+		return archiveTreeContractFilter(archiveTreeContracts, treeCode, strNodeId,contractId);
+	}
+
+	/**
+	 * 对档案列表进行筛选
+	 * @param archiveTreeContracts 档案列表
+	 * @param treeCode 筛选条件:权限码
+	 * @param nodeId 筛选条件:节点编号
+	 * @return 符合条件的档案列表
+	 */
+	public List<ArchiveTreeContract> archiveTreeContractFilter(List<ArchiveTreeContract> archiveTreeContracts, String treeCode, String nodeId,Long contractId) {
+		List<ArchiveTreeContract> result = new ArrayList<>();
+
+		if (StringUtils.isEmpty(treeCode) && StringUtils.isEmpty(nodeId)) {
+			return archiveTreeContracts;
+		}
+
+		for (ArchiveTreeContract contract : archiveTreeContracts) {
+			if (StringUtils.isEmpty(treeCode)) {
+				if (StringUtils.isNotEmpty(contract.getAncestors()) && contract.getAncestors().contains(nodeId)) {
+					result.add(contract);
+				}
+			} else {
+				if (treeCode.equals(contract.getTreeCode()) || contractId.toString().equals(contract.getTreeCode())) {
+					result.add(contract);
+				}
+			}
+		}
+
+		return result;
+	}
+
+	public void test(){
+		String ids = "1654406079229165569";
+
+		List<Long> fids = Func.toLongList(ids);
+
+
+
+		LambdaQueryWrapper<ArchiveFile> wrapper = Wrappers.lambdaQuery();
+		wrapper.in(ArchiveFile::getId, fids);
+
+		// 调用 listWrappers() 方法来获取符合条件的 ArchiveFile 对象列表
+		List<ArchiveFile> files = archiveFileClient.listbyIds(fids);
+		System.out.println();
+	}
+
+	@Override
+	public List<DictBiz> getCarrierTypeByDict() {
+		return autoMapper.getCarrierTypeByDict();
+	}
+
+	@Override
+	public List<User> getArchiveDestroyUser() {
+		return autoMapper.getArchiveDestroyUser();
+	}
 
 
 }

+ 66 - 92
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml

@@ -52,9 +52,7 @@
 
 
     <select id="selectArchiveTreeContractPage" resultMap="archiveTreeContractResultMap">
-        select *
-        from m_archive_tree_contract
-        where is_deleted = 0
+        select * from m_archive_tree_contract where is_deleted = 0
     </select>
 
     <resultMap id="treeNodeResultMap" type="org.springblade.manager.vo.TreeNodeVO2">
@@ -119,6 +117,7 @@
     </resultMap>
 
 
+
     <select id="lazyTree" resultMap="treeNodeResultMap">
         SELECT
         d.id,
@@ -136,8 +135,7 @@
         d.ext_id,
         d.archive_auto_type,
         d.archive_auto_node_id,
-        (SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_archive_tree_contract WHERE parent_id = d.id and
-        is_deleted = 0 and project_id = #{projectId})
+        (SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_archive_tree_contract WHERE parent_id = d.id and is_deleted = 0 and project_id = #{projectId})
         AS "has_children"
         FROM
         m_archive_tree_contract d
@@ -214,8 +212,7 @@
         d.specification,
         d.archive_name_suffix,
         d.contract_id,
-        (SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_archive_tree_contract WHERE parent_id = d.id and
-        is_deleted = 0 and project_id = #{projectId})
+        (SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_archive_tree_contract WHERE parent_id = d.id and is_deleted = 0 and project_id = #{projectId})
         AS "has_children"
         FROM
         m_archive_tree_contract d
@@ -278,6 +275,7 @@
     </select>
 
 
+
     <update id="updateBatch">
         UPDATE m_archive_tree_contract
         SET is_upload_file_display_configuration_tree = 1
@@ -302,94 +300,82 @@
     <update id="updateBatch3">
         UPDATE m_archive_tree_contract
         SET is_upload_file_display_configuration_tree = 0
-        WHERE node_type = 2
-          AND is_deleted = 0
-          AND status = 1
+        WHERE
+        node_type = 2
+        AND is_deleted = 0
+        AND status = 1
     </update>
 
     <select id="getHavedFileNodeByProjectID" resultMap="archiveTreeContractResultMap">
-        SELECT *
-        FROM m_archive_tree_contract
-        WHERE 1 = 1
+        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
+            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 ( is_archive = 0 OR is_archive IS NULL )
               AND node_id IS NOT NULL
         )
-        order by ancestors asc, tree_sort asc
+        order by ancestors asc,tree_sort asc
     </select>
     <select id="getListByProjectId" resultType="org.springblade.manager.entity.ArchiveTreeContract">
-        select id,
-               project_id         as projectId,
-               parent_id          as parentId,
-               ancestors,
-               node_name          as nodeName,
-               status,
-               tree_code          as treeCode,
-               ext_type           as extType,
-               is_deleted         as isDeleted,
-               create_time        as createTime,
-               file_number_prefix as fileNumberPrefix
+        select id,project_id as projectId,parent_id as parentId,ancestors,node_name as nodeName,status,tree_code as treeCode, ext_type as extType,
+               is_deleted as isDeleted,create_time as createTime, file_number_prefix as fileNumberPrefix
         from m_archive_tree_contract
-        where project_id = #{projectId}
-          and is_deleted = 0
-        order by tree_sort asc;
+        where project_id=#{projectId} and is_deleted = 0 order by tree_sort asc;
     </select>
 
 
     <select id="getStorageNodeByGroupId" resultMap="archiveTreeContractResultMap">
-        SELECT *
-        FROM m_archive_tree_contract
-        WHERE 1 = 1
+        SELECT
+            *
+        FROM
+            m_archive_tree_contract
+        WHERE
+            1 = 1
           AND project_id = #{projectId}
           AND is_deleted = 0
-          AND archive_auto_type = 2
-          AND is_storage_node = 1
-          AND archive_auto_group_id = #{archiveAutoGroupId}
+          AND archive_auto_type =2
+          AND is_storage_node =1
+          AND archive_auto_group_id =#{archiveAutoGroupId}
         order by tree_sort asc
     </select>
     <select id="getArchiveTreeAndArchiveCount" resultType="java.util.Map">
-        SELECT matc1.id        as id,
-               matc1.node_name as name,
-               (SELECT COUNT(*)
-                FROM u_archives_auto uaa1
-                WHERE uaa1.is_destroy = 0
-                  and uaa1.is_deleted = 0
-                  and (uaa1.node_id in
-                       (select id
-                        from m_archive_tree_contract matc2
-                        WHERE matc2.project_id = #{projectId}
-                          and matc2.ancestors like CONCAT('%', matc1.id, '%')) or uaa1.node_id = matc1.id)
-               ) as 'auto', (SELECT COUNT(*)
-                             FROM u_archives_auto uaa1
-                             WHERE uaa1.is_destroy = 1
-                               and uaa1.is_deleted = 1
-                               and (uaa1.node_id in
-                                    (select id
-                                     from m_archive_tree_contract matc2
-                                     WHERE matc2.project_id = #{projectId}
-                                       and matc2.ancestors like CONCAT('%', matc1.id, '%')) or uaa1.node_id = matc1.id)
-            ) as 'deleted', if((SELECT COUNT(*) from m_archive_tree_contract matc WHERE parent_id = matc1.id) = 0,
-                               false, true) as hasChildren
-        FROM m_archive_tree_contract matc1
-        WHERE matc1.project_id = #{projectId}
-          and matc1.parent_id = #{nodeId}
+        SELECT
+            matc1.id as id,
+            matc1.node_name as name,
+            (SELECT COUNT(*)
+             FROM u_archives_auto uaa1
+             WHERE  uaa1.is_destroy =0 and uaa1.is_deleted =0 and (uaa1.node_id in
+                 (select id from m_archive_tree_contract matc2 WHERE matc2.project_id = #{projectId} and matc2.ancestors like CONCAT('%',matc1.id,'%')) or uaa1.node_id = matc1.id)
+            ) as 'auto',
+            (SELECT COUNT(*)
+             FROM u_archives_auto uaa1
+             WHERE  uaa1.is_destroy =1 and uaa1.is_deleted =1 and (uaa1.node_id in
+                (select id from m_archive_tree_contract matc2 WHERE matc2.project_id = #{projectId} and matc2.ancestors like CONCAT('%',matc1.id,'%')) or uaa1.node_id = matc1.id)
+            ) as 'deleted',
+            if((SELECT COUNT(*) from m_archive_tree_contract matc WHERE parent_id = matc1.id)=0,false,true) as hasChildren
+        FROM m_archive_tree_contract matc1 WHERE matc1.project_id =#{projectId} and matc1.parent_id = #{nodeId} and matc1.is_deleted = 0
     </select>
     <select id="getArchiveTreeByNodeType" resultType="org.springblade.manager.vo.ArchiveTreeContractVO3">
-        SELECT matc1.*,if((SELECT COUNT(*) from m_archive_tree_contract matc WHERE matc.parent_id =
-        matc1.id)=0,true,false)
+        SELECT matc1.*,if((SELECT COUNT(*) from m_archive_tree_contract matc WHERE matc.parent_id = matc1.id)=0,true,false)
         as notExsitChild
         FROM m_archive_tree_contract matc1
-        WHERE matc1.parent_id = (select id from m_archive_tree_contract
-        WHERE parent_id = (select id from m_archive_tree_contract WHERE parent_id = 0 and project_id = #{projectId})
-        and tree_code = #{nodeType})
+        WHERE  matc1.parent_id = (select id from m_archive_tree_contract
+                            WHERE parent_id = (select id from m_archive_tree_contract WHERE parent_id = 0 and project_id = #{projectId})
+                            and tree_code = #{nodeType})
         and matc1.is_deleted = 0
         <if test="contractId !=null and contractId !=''">
             AND matc1.contract_id = #{contractId}
@@ -397,27 +383,19 @@
     </select>
 
     <select id="getArchiveTreeByNodeType2" resultType="org.springblade.manager.vo.ArchiveTreeContractVO3">
-        SELECT matc1.*,
-               if((SELECT COUNT(*) from m_archive_tree_contract matc WHERE matc.parent_id = matc1.id) = 0, true, false)
-                   as notExsitChild
+        SELECT matc1.*,if((SELECT COUNT(*) from m_archive_tree_contract matc WHERE matc.parent_id = matc1.id)=0,true,false)
+            as notExsitChild
         FROM m_archive_tree_contract matc1
-        WHERE matc1.parent_id in (select id
-                                  from m_archive_tree_contract
-                                  WHERE parent_id = (select id
-                                                     from m_archive_tree_contract
-                                                     WHERE parent_id = 0
-                                                       and project_id = #{projectId})
-                                    and tree_code is NULL)
+        WHERE  matc1.parent_id in (select id from m_archive_tree_contract
+                            WHERE parent_id = (select id from m_archive_tree_contract WHERE parent_id = 0 and project_id = #{projectId})
+                              and tree_code is NULL)
           and matc1.is_deleted = 0
     </select>
 
     <select id="getChildrenNodeByNodeId" resultType="org.springblade.manager.vo.ArchiveTreeContractVO3">
-        select matc1.*,
-               if((SELECT COUNT(*) from m_archive_tree_contract matc WHERE matc.parent_id = matc1.id) = 0, true, false)
-                   as notExsitChild
-        from m_archive_tree_contract matc1
-        WHERE matc1.parent_id = #{nodeId}
-          and matc1.is_deleted = 0
+        select matc1.*,if((SELECT COUNT(*) from m_archive_tree_contract matc WHERE matc.parent_id = matc1.id)=0,true,false)
+            as notExsitChild
+        from m_archive_tree_contract matc1 WHERE matc1.parent_id = #{nodeId} and matc1.is_deleted =0
         ORDER BY sort
     </select>
     <select id="getAuthCodeList" resultMap="archiveTreeContractResultMap">
@@ -450,18 +428,14 @@
         SELECT br.role_name
         FROM blade_role br
         WHERE br.id = (
-            SELECT role_id
-            FROM m_project_assignment_user
-            WHERE project_id = #{projectId}
-              AND contract_id = #{contractId}
-              AND user_id = #{userId}
+            SELECT role_id  FROM m_project_assignment_user
+            WHERE project_id = #{projectId} AND contract_id = #{contractId} AND user_id = #{userId}
         )
     </select>
     <select id="getArchiveTreeContractByNodeName"
             resultType="org.springblade.manager.entity.ArchiveTreeContract">
         SELECT *
-        FROM m_archive_tree_contract
-        WHERE node_name = #{nodeName}
-          and is_deleted = 0
+        FROM  m_archive_tree_contract
+        WHERE node_name = #{nodeName} and is_deleted = 0
     </select>
 </mapper>