瀏覽代碼

Merge branch 'lk20230525'

# Conflicts:
#	blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ProjectClient.java
#	blade-service/blade-archive/src/main/java/org/springblade/archive/config/ThreadPoolConfig.java
#	blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
#	blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
#	blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java
#	blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
#	blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
luok 2 年之前
父節點
當前提交
0af0abe1d6

+ 29 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/config/ScheduledTask.java

@@ -0,0 +1,29 @@
+package org.springblade.archive.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.manager.entity.ProjectInfo;
+import org.springblade.manager.feign.ProjectClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Slf4j
+@Component
+public class ScheduledTask {
+
+    @Autowired
+    private ProjectClient projectClient;
+
+    //@Scheduled(cron ="0/10 * * * * ?")
+    public void archiveAutoMethod() {
+        log.info("自动组卷定时任务开始");
+        List<ProjectInfo> list = projectClient.getList();
+        for(ProjectInfo projectInfo:list){
+
+        }
+        log.info("自动组卷定时任务结束");
+    }
+
+}

+ 379 - 389
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -22,9 +22,9 @@ import com.alibaba.fastjson.JSONObject;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
-
 import javax.validation.Valid;
 
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.service.IArchiveAutoPdfService;
 import org.springblade.business.entity.ArchiveFile;
@@ -37,6 +37,8 @@ import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.feign.ArchiveTreeContractClient;
 import org.springblade.manager.feign.ProjectClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -49,417 +51,405 @@ import org.springblade.core.boot.ctrl.BladeController;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
 
 /**
- * 控制器
+ *  控制器
  *
  * @author BladeX
  * @since 2023-02-17
  */
+@Slf4j
 @RestController
 @AllArgsConstructor
 @RequestMapping("/archivesauto")
 @Api(value = "", tags = "档案接口")
 public class ArchivesAutoController extends BladeController {
 
-    private final IArchivesAutoService archivesAutoService;
-
-    private final IArchiveAutoPdfService archiveAutoPdfService;
-    private final ArchiveTreeContractClient archiveTreeContractClient;
-    private ProjectClient projectClient;
-
-    /**
-     * 详情
-     */
-    @GetMapping("/detail")
-    @ApiOperationSupport(order = 1)
-    @ApiOperation(value = "详情", notes = "传入archivesAuto")
-    public R<ArchivesAutoVO> detail(ArchivesAuto archivesAuto) {
-        ArchivesAuto detail = archivesAutoService.getOne(Condition.getQueryWrapper(archivesAuto));
-        return R.data(ArchivesAutoWrapper.build().entityVO(detail));
-    }
-
-    /**
-     * 分页
-     */
-    @GetMapping("/list")
-    @ApiOperationSupport(order = 2)
-    @ApiOperation(value = "分页", notes = "传入archivesAuto")
-    public R<IPage<ArchivesAutoVO>> list(ArchivesAuto archivesAuto, Query query) {
-        IPage<ArchivesAuto> pages = archivesAutoService.page(Condition.getPage(query), Condition.getQueryWrapper(archivesAuto));
-        return R.data(ArchivesAutoWrapper.build().pageVO(pages));
-    }
-
-
-    /**
-     * 自定义分页
-     */
-    @GetMapping("/page")
-    @ApiOperationSupport(order = 3)
-    @ApiOperation(value = "分页", notes = "传入archivesAuto")
-    public R<IPage<ArchivesAutoVO>> page(ArchivesAutoVO queryVo, Query query) {
+	private final IArchivesAutoService archivesAutoService;
+
+	private final IArchiveAutoPdfService archiveAutoPdfService;
+	private final ArchiveTreeContractClient archiveTreeContractClient;
+	private ProjectClient projectClient;
+	@Autowired
+	private ExecutorService executorService;
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入archivesAuto")
+	public R<ArchivesAutoVO> detail(ArchivesAuto archivesAuto) {
+		ArchivesAuto detail = archivesAutoService.getOne(Condition.getQueryWrapper(archivesAuto));
+		return R.data(ArchivesAutoWrapper.build().entityVO(detail));
+	}
+
+	/**
+	 * 分页 
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入archivesAuto")
+	public R<IPage<ArchivesAutoVO>> list(ArchivesAuto archivesAuto, Query query) {
+		IPage<ArchivesAuto> pages = archivesAutoService.page(Condition.getPage(query), Condition.getQueryWrapper(archivesAuto));
+		return R.data(ArchivesAutoWrapper.build().pageVO(pages));
+	}
+
+
+	/**
+	 * 自定义分页 
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入archivesAuto")
+	public R<IPage<ArchivesAutoVO>> page(ArchivesAutoVO queryVo, Query query) {
 //		IPage<ArchivesAutoVO> pages = archivesAutoService.selectArchivesAutoPage(Condition.getPage(query), archivesAuto);
-        if (queryVo.getNodeIds() == null || queryVo.getNodeIds().equals("")) {
-            return R.data(null);
-        }
-        List<ArchiveTreeContract> archiveTreeContracts = this.archiveTreeContractClient.queryAllChildByAncestors(queryVo.getNodeIds(), queryVo.getContractId());
-        if (archiveTreeContracts != null && archiveTreeContracts.size() > 0) {
-            List<String> ids = JSONArray.parseArray(JSONObject.toJSONString(archiveTreeContracts.stream().map(ArchiveTreeContract::getId).distinct().collect(Collectors.toList())), String.class);
-            ids.add(queryVo.getNodeIds());
-            queryVo.setNodeIdArray(ids);
-        }
-        IPage<ArchivesAutoVO> pages = archivesAutoService.selectArchivesAutoFilePage(queryVo);
-        return R.data(pages);
-    }
-
-    /**
-     * 档案利用-档案查询
-     */
-    @GetMapping("/pageByArchivesAuto")
-    @ApiOperationSupport(order = 3)
-    @ApiOperation(value = "档案利用-档案查询分页", notes = "传入archivesAuto")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "projectId", value = "项目id", required = true),
-            @ApiImplicitParam(name = "year", value = "年"),
-            @ApiImplicitParam(name = "month", value = "yue"),
-            @ApiImplicitParam(name = "storageTime", value = "保管期限"),
-            @ApiImplicitParam(name = "secretLevel", value = "保密级别"),
-            @ApiImplicitParam(name = "carrierType", value = "类别"),
-            @ApiImplicitParam(name = "queryValue", value = "输入框模糊搜索"),
-            @ApiImplicitParam(name = "searchType", value = "搜索类型1案卷2文件"),
-            @ApiImplicitParam(name = "nodeIds", value = "搜索树的节点id集合")
-    })
-    public R<IPage<ArchivesAutoVO>> pageByArchivesAuto(ArchivesAutoVO archivesAuto) {
-        IPage<ArchivesAutoVO> pages = archivesAutoService.pageByArchivesAuto(archivesAuto);
-        return R.data(pages);
-    }
-
-    /**
-     * 档案统计-已组案卷
-     */
-    @GetMapping("/allArchiveByContractType")
-    @ApiOperationSupport(order = 3)
-    @ApiOperation(value = "档案统计-已组案卷")
-    public R allArchiveByContractType(Long projectId) {
-        Map<String, Integer> map = archivesAutoService.getAllArchiveByContractType(projectId, "0");
-        return R.data(map);
-    }
-
-    /**
-     * 档案统计-已销毁案卷
-     */
-    @GetMapping("/allDeletedArchiveByContractType")
-    @ApiOperationSupport(order = 3)
-    @ApiOperation(value = "档案统计-已销毁案卷")
-    public R allDeletedArchiveByContractType(Long projectId) {
-        Map<String, Integer> map = archivesAutoService.getAllArchiveByContractType(projectId, "1");
-        return R.data(map);
-    }
-
-    /**
-     * 档案统计-档案年限占比
-     */
-    @GetMapping("/allArchiveAgeByContractType")
-    @ApiOperationSupport(order = 3)
-    @ApiOperation(value = "档案统计-档案年限占比")
-    public R allArchiveAgeByContractType(Long projectId) {
-        List<Map<String, String>> list = archivesAutoService.getAllArchiveAgeByContractType(projectId);
-        return R.data(list);
-    }
-
-    /**
-     * 新增
-     */
-    @PostMapping("/save")
-    @ApiOperationSupport(order = 4)
-    @ApiOperation(value = "新增", notes = "传入archivesAuto")
-    public R save(@Valid @RequestBody ArchivesAuto archivesAuto) {
-        return R.status(archivesAutoService.save(archivesAuto));
-    }
-
-    /**
-     * 修改
-     */
-    @PostMapping("/update")
-    @ApiOperationSupport(order = 5)
-    @ApiOperation(value = "修改", notes = "传入archivesAuto")
-    public R update(@Valid @RequestBody ArchivesAuto archivesAuto) {
-        return R.status(archivesAutoService.updateById(archivesAuto));
-    }
-
-    /**
-     * 新增或修改
-     */
-    @PostMapping("/submit")
-    @ApiOperationSupport(order = 6)
-    @ApiOperation(value = "新增或修改", notes = "传入archivesAuto")
-    public R submit(@Valid @RequestBody ArchivesAuto archivesAuto) {
-        return R.status(archivesAutoService.saveOrUpdate(archivesAuto));
-    }
-
-    /**
-     * 分页-档案鉴定
-     */
-    @GetMapping("/pageByAuthenticate")
-    @ApiOperationSupport(order = 3)
-    @ApiOperation(value = "分页-档案鉴定", notes = "传入archivesAuto")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "nodeId", value = "节点id", required = true),
-            @ApiImplicitParam(name = "projectId", value = "项目id", required = true),
-            @ApiImplicitParam(name = "storageTime", value = "保管期限", required = false),
-            @ApiImplicitParam(name = "filingUnit", value = "立卷单位", required = false),
-            @ApiImplicitParam(name = "isDeleted", value = "是否删除", required = false)
-    })
-    public R<IPage<ArchivesAutoVO>> pageByAuthenticate(ArchivesAutoVO archivesAuto) {
-        IPage<ArchivesAutoVO> pages = archivesAutoService.pageByAuthenticate(archivesAuto);
-        return R.data(pages);
-    }
-
-    /**
-     * 批量销毁档案-档案鉴定
-     */
-    @GetMapping("/batchDestroyArchive")
-    @ApiOperationSupport(order = 3)
-    @ApiOperation(value = "批量销毁档案-档案鉴定", notes = "传入节点id")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "nodeId", value = "节点id", required = true),
-    })
-    public R batchDestroyArchive(String ids) {
-        if (StringUtils.isBlank(ids)) {
-            return R.fail("参数错误");
-        }
-        archivesAutoService.batchDestroyArchive(ids);
-        return R.success("销毁成功");
-    }
-
-    /**
-     * 获取立卷单位列表-档案鉴定
-     */
-    @GetMapping("/getFilingUnitList")
-    @ApiOperationSupport(order = 3)
-    @ApiOperation(value = "获取立卷单位列表-档案鉴定", notes = "传入节点id")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "nodeId", value = "节点id", required = true),
-    })
-    public R getFilingUnitList(Long projectId) {
-        return R.data(archivesAutoService.getFilingUnitList(projectId));
-    }
-
-
-    /**
-     * 删除
-     */
-    @PostMapping("/remove")
-    @ApiOperationSupport(order = 7)
-    @ApiOperation(value = "逻辑删除", notes = "传入ids")
-    public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-        return R.status(archivesAutoService.deleteLogic(Func.toLongList(ids)));
-    }
-
-
-    /**
-     * 获取归档树同级节点
-     */
-    @GetMapping("/test")
-    @ApiOperationSupport(order = 12)
-    @ApiOperation(value = "获取归档树同级节点", notes = "传入节点id")
-    public R test() {
-
-        archivesAutoService.test();
-        return R.data("");
-    }
-
-    /**
-     * 获取归档树同级节点
-     */
-    @GetMapping("/test1")
-    @ApiOperationSupport(order = 12)
-    @ApiOperation(value = "获取归档树同级节点", notes = "传入节点id")
-    public R test1() {
-
-        archiveAutoPdfService.test1();
+		if(queryVo.getNodeIds() == null || queryVo.getNodeIds().equals("")){
+			return  R.data(null);
+		}
+		List<ArchiveTreeContract> archiveTreeContracts = this.archiveTreeContractClient.queryAllChildByAncestors(queryVo.getNodeIds(),queryVo.getContractId());
+		if(archiveTreeContracts != null && archiveTreeContracts.size() > 0){
+			List<String> ids = JSONArray.parseArray(JSONObject.toJSONString(archiveTreeContracts.stream().map(ArchiveTreeContract::getId).distinct().collect(Collectors.toList())), String.class);
+			ids.add(queryVo.getNodeIds());
+			queryVo.setNodeIdArray(ids);
+		}
+		IPage<ArchivesAutoVO> pages = archivesAutoService.selectArchivesAutoFilePage(queryVo);
+		return R.data(pages);
+	}
+
+	/**
+	 * 档案利用-档案查询
+	 */
+	@GetMapping("/pageByArchivesAuto")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "档案利用-档案查询分页", notes = "传入archivesAuto")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+			@ApiImplicitParam(name = "year", value = "年"),
+			@ApiImplicitParam(name = "month", value = "yue"),
+			@ApiImplicitParam(name = "storageTime", value = "保管期限"),
+			@ApiImplicitParam(name = "secretLevel", value = "保密级别"),
+			@ApiImplicitParam(name = "carrierType", value = "类别"),
+			@ApiImplicitParam(name = "queryValue", value = "输入框模糊搜索"),
+			@ApiImplicitParam(name = "searchType", value = "搜索类型1案卷2文件"),
+			@ApiImplicitParam(name = "nodeIds", value = "搜索树的节点id集合")
+	})
+	public R<IPage<ArchivesAutoVO>> pageByArchivesAuto(ArchivesAutoVO archivesAuto) {
+		IPage<ArchivesAutoVO> pages = archivesAutoService.pageByArchivesAuto(archivesAuto);
+		return R.data(pages);
+	}
+
+	/**
+	 * 档案统计-已组案卷
+	 */
+	@GetMapping("/allArchiveByContractType")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "档案统计-已组案卷")
+	public R allArchiveByContractType(Long projectId) {
+		Map<String, Integer> map = archivesAutoService.getAllArchiveByContractType(projectId,"0");
+		return R.data(map);
+	}
+
+	/**
+	 * 档案统计-已销毁案卷
+	 */
+	@GetMapping("/allDeletedArchiveByContractType")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "档案统计-已销毁案卷")
+	public R allDeletedArchiveByContractType(Long projectId) {
+		Map<String, Integer> map = archivesAutoService.getAllArchiveByContractType(projectId,"1");
+		return R.data(map);
+	}
+
+	/**
+	 * 档案统计-档案年限占比
+	 */
+	@GetMapping("/allArchiveAgeByContractType")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "档案统计-档案年限占比")
+	public R allArchiveAgeByContractType(Long projectId) {
+		List<Map<String, String>> list = archivesAutoService.getAllArchiveAgeByContractType(projectId);
+		return R.data(list);
+	}
+
+	/**
+	 * 新增 
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入archivesAuto")
+	public R save(@Valid @RequestBody ArchivesAuto archivesAuto) {
+		return R.status(archivesAutoService.save(archivesAuto));
+	}
+
+	/**
+	 * 修改 
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入archivesAuto")
+	public R update(@Valid @RequestBody ArchivesAuto archivesAuto) {
+		return R.status(archivesAutoService.updateById(archivesAuto));
+	}
+
+	/**
+	 * 新增或修改 
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入archivesAuto")
+	public R submit(@Valid @RequestBody ArchivesAuto archivesAuto) {
+		return R.status(archivesAutoService.saveOrUpdate(archivesAuto));
+	}
+
+	/**
+	 * 分页-档案鉴定
+	 */
+	@GetMapping("/pageByAuthenticate")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页-档案鉴定", notes = "传入archivesAuto")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "nodeId", value = "节点id", required = true),
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+			@ApiImplicitParam(name = "storageTime", value = "保管期限", required = false),
+			@ApiImplicitParam(name = "filingUnit", value = "立卷单位", required = false),
+			@ApiImplicitParam(name = "isDeleted", value = "是否删除", required = false)
+	})
+	public R<IPage<ArchivesAutoVO>> pageByAuthenticate(ArchivesAutoVO archivesAuto) {
+		IPage<ArchivesAutoVO> pages = archivesAutoService.pageByAuthenticate(archivesAuto);
+		return R.data(pages);
+	}
+
+	/**
+	 * 批量销毁档案-档案鉴定
+	 */
+	@GetMapping("/batchDestroyArchive")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "批量销毁档案-档案鉴定", notes = "传入节点id")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "nodeId", value = "节点id", required = true),
+	})
+	public R batchDestroyArchive(String ids ){
+		if (StringUtils.isBlank(ids)){
+			return R.fail("参数错误");
+		}
+		archivesAutoService.batchDestroyArchive(ids);
+		return R.success("销毁成功");
+	}
+
+	/**
+	 * 获取立卷单位列表-档案鉴定
+	 */
+	@GetMapping("/getFilingUnitList")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "获取立卷单位列表-档案鉴定", notes = "传入节点id")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "nodeId", value = "节点id", required = true),
+	})
+	public R getFilingUnitList(Long projectId){
+		return R.data(archivesAutoService.getFilingUnitList(projectId));
+	}
+
+
+
+	
+	/**
+	 * 删除 
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(archivesAutoService.deleteLogic(Func.toLongList(ids)));
+	}
+
+
+	/**
+	 * 获取归档树同级节点
+	 */
+	@GetMapping("/test")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "获取归档树同级节点", notes = "传入节点id")
+	public R test() {
+
+		archivesAutoService.test();
+		return R.data("");
+	}
+
+	/**
+	 * 获取归档树同级节点
+	 */
+	@GetMapping("/test1")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "获取归档树同级节点", notes = "传入节点id")
+	public R test1() {
+
+		archiveAutoPdfService.test1();
 //		Long projectId = 1645263362890129410L;
 //		List<ArchiveTreeContract> list = archiveTreeContractClient.getListByProjectId(projectId);
-        //archivesAutoService.refreshFileNumberNoSlipt(list,null);
-        return R.data("");
-    }
-
-    /**
-     * 锁定
-     */
-    @PostMapping("/lock")
-    @ApiOperationSupport(order = 10)
-    @ApiOperation(value = "锁定", notes = "传入ids")
-    public R lock(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-
-        List<ArchivesAuto> archivesAutos = archivesAutoService.listByIds(Func.toLongList(ids));
-        for (ArchivesAuto ar : archivesAutos) {
-            ar.setIsLock(1);
-        }
-
-        return R.status(archivesAutoService.updateBatchById(archivesAutos));
-    }
-
-    /**
-     * 解锁
-     */
-    @PostMapping("/unlock")
-    @ApiOperationSupport(order = 11)
-    @ApiOperation(value = "解锁", notes = "传入ids")
-    public R unlock(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-        List<ArchivesAuto> archivesAutos = archivesAutoService.listByIds(Func.toLongList(ids));
-        for (ArchivesAuto ar : archivesAutos) {
-            ar.setIsLock(0);
-        }
-        return R.status(archivesAutoService.updateBatchById(archivesAutos));
-    }
-
-
-    /**
-     * 自动组卷入口
-     * projectId 为当前项目
-     * contractId 为客户端当前选定的合同段
-     * nodeId 为左侧树选定的节点id
-     *
-     * @param projectId
-     * @return
-     */
-    @PostMapping("/archiveAutoMethod")
-    public R archiveAutoMethod(Long projectId, Long contractId, Long nodeId) {
-        try {
-            //先验证当前项目是否在自动组卷中,组卷中直接返回
-            ProjectInfo projectInfo = projectClient.getById(String.valueOf(projectId));
-            Integer isArchivesAuto = projectInfo.getIsArchivesAuto();
-            if (isArchivesAuto != null && isArchivesAuto == 1) {
-                return R.fail("当前项目已经在自动组卷中");
-            }
-            //设置自动组卷中
-            projectClient.updateIsArchivesAutoById(projectId, 1);
-
-            //将项目未锁定案卷拆卷
-            archivesAutoService.splitArchvies(projectId, contractId, nodeId);
-            //项目自动组卷入口
-            archivesAutoService.archiveAutoMethod(projectId, contractId, nodeId);
-            //刷新项目档号
-            archivesAutoService.refreshFileNumberNoSlipt(projectId, contractId, nodeId);
-            //设置自动组卷结束
-            projectClient.updateIsArchivesAutoById(projectId, 0);
-            return R.data("自动组卷结束");
-        } catch (Exception e) {
-            e.printStackTrace();
-            //设置自动组卷结束
-            projectClient.updateIsArchivesAutoById(projectId, 0);
-            return R.fail(e.getMessage());
-        }
-
-    }
-
-    /**
-     * 预览案卷文件
-     */
-    @GetMapping("/printArchive")
-    @ApiOperationSupport(order = 3)
-    @ApiOperation(value = "预览案卷文件")
-    public R printArchive(Long id) {
-        //统计案卷文件大小
-        String url = archivesAutoService.getMergeArchivesFile(id);
-        return R.data(url);
-    }
-
-    /**
-     * 拆卷
-     */
-    @PostMapping("/split")
-    @ApiOperationSupport(order = 15)
-    @ApiOperation(value = "拆卷", notes = "传入ids")
-    public R split(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-        return R.status(archivesAutoService.slipt(ids));
-    }
-
-    /**
-     * 案卷迁移
-     */
-    @PostMapping("/move")
-    @ApiOperationSupport(order = 15)
-    @ApiOperation(value = "案卷迁移", notes = "传入ids,nodeId")
-    public R move(@ApiParam(value = "主键集合", required = true) @RequestParam String ids, @RequestParam Long nodeId) {
-
-        ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
-        if (node == null) {
-            return R.fail("找不到迁移的节点id");
-        }
-
-        List<ArchivesAuto> archivesAutos = archivesAutoService.listByIds(Func.toLongList(ids));
-        for (ArchivesAuto ar : archivesAutos) {
-            ar.setNodeId(nodeId);
-            ar.setTreeSort(node.getTreeSort());
-            ar.setContractId(node.getContractId());
+		//archivesAutoService.refreshFileNumberNoSlipt(list,null);
+		return R.data("");
+	}
+
+	/**
+	 * 锁定
+	 */
+	@PostMapping("/lock")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "锁定", notes = "传入ids")
+	public R lock(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+
+		List<ArchivesAuto> archivesAutos = archivesAutoService.listByIds(Func.toLongList(ids));
+		for (ArchivesAuto ar  :archivesAutos) {
+			ar.setIsLock(1);
+		}
+
+		return R.status(archivesAutoService.updateBatchById(archivesAutos));
+	}
+
+	/**
+	 * 解锁
+	 */
+	@PostMapping("/unlock")
+	@ApiOperationSupport(order = 11)
+	@ApiOperation(value = "解锁", notes = "传入ids")
+	public R unlock(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		List<ArchivesAuto> archivesAutos = archivesAutoService.listByIds(Func.toLongList(ids));
+		for (ArchivesAuto ar  :archivesAutos) {
+			ar.setIsLock(0);
+		}
+		return R.status(archivesAutoService.updateBatchById(archivesAutos));
+	}
+
+
+	/**
+	 * 自动组卷入口
+	 * projectId 为当前项目
+	 * contractId 为客户端当前选定的合同段
+	 * nodeId 为左侧树选定的节点id
+	 * @param projectId
+	 * @return
+	 */
+	@PostMapping("/archiveAutoMethod")
+	public R archiveAutoMethod(Long projectId,Long contractId,Long nodeId) {
+		try{
+			//先验证当前项目是否在自动组卷中,组卷中直接返回
+			ProjectInfo projectInfo = projectClient.getById(String.valueOf(projectId));
+			Integer isArchivesAuto = projectInfo.getIsArchivesAuto();
+			if(isArchivesAuto!=null && isArchivesAuto==1){
+				return R.fail("当前项目已经在自动组卷中,请耐心等待");
+			}
+			log.info("开始自动组卷....");
+			//设置自动组卷中
+			projectClient.updateIsArchivesAutoById(projectId,1);
+
+			archivesAutoService.archiveAutoMethodThread(projectId,contractId,nodeId);
+			return R.data("自动组卷中,请耐心等待");
+		}catch (Exception e){
+			e.printStackTrace();
+			log.error("自动组卷保错。"+e.getMessage()+"--projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId);
+			//设置自动组卷结束
+			projectClient.updateIsArchivesAutoById(projectId,0);
+			return R.fail(e.getMessage());
+		}
+
+	}
+
+	/**
+	 * 预览案卷文件
+	 */
+	@GetMapping("/printArchive")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "预览案卷文件")
+	public R printArchive(Long id) {
+		//统计案卷文件大小
+		String url = archivesAutoService.getMergeArchivesFile(id);
+		return R.data(url);
+	}
+
+	/**
+	 * 拆卷
+	 */
+	@PostMapping("/split")
+	@ApiOperationSupport(order = 15)
+	@ApiOperation(value = "拆卷", notes = "传入ids")
+	public R split(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(archivesAutoService.slipt(ids));
+	}
+
+	/**
+	 * 案卷迁移
+	 */
+	@PostMapping("/move")
+	@ApiOperationSupport(order = 15)
+	@ApiOperation(value = "案卷迁移", notes = "传入ids,nodeId")
+	public R move(@ApiParam(value = "主键集合", required = true) @RequestParam String ids, @RequestParam Long nodeId) {
+
+		ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
+		if (node == null) {
+			return R.fail("找不到迁移的节点id");
+		}
+
+		List<ArchivesAuto> archivesAutos = archivesAutoService.listByIds(Func.toLongList(ids));
+		for (ArchivesAuto ar  :archivesAutos) {
+			ar.setNodeId(nodeId);
+			ar.setTreeSort(node.getTreeSort());
+			ar.setContractId(node.getContractId());
 //			if (node.getStorageType()!= null){
 //				ar.setCarrierType(node.getStorageType().toString());
 //			}
-        }
-        return R.status(archivesAutoService.updateBatchById(archivesAutos));
-    }
-
-    /**
-     * 删除卷内文件
-     */
-    @PostMapping("/removeFiles")
-    @ApiOperationSupport(order = 15)
-    @ApiOperation(value = "删除案卷的卷内文件", notes = "传入文件ids,归档archiveId")
-    public R removeFiles(@ApiParam(value = "主键集合", required = true) @RequestParam String ids, @RequestParam Long archiveId) {
-
-        ArchivesAuto archivesAuto = archivesAutoService.getById(archiveId);
-        if (archivesAuto != null && archivesAuto.getIsLock() == 1) {
-            return R.fail("案卷锁定中,能不能删除卷内文件");
-        }
-
-        return R.status(archivesAutoService.removeFiles(ids, archiveId));
-    }
-
-    /**
-     * 刷新指定项目的档案
-     *
-     * @param projectId 项目id
-     * @return R
-     */
-    @PostMapping("/refreshFileNumber")
-    @ApiOperationSupport(order = 3)
-    @ApiOperation(value = "刷新项目档案", notes = "传入projectId,contractId")
-    public R<String> refreshProjectArchive(@RequestParam Long projectId, @RequestParam Long contractId, @RequestParam Long nodeId) {
-        archivesAutoService.refreshFileNumberNoSlipt(projectId, contractId, nodeId);
-        return R.data("刷新成功");
-    }
-
-    /**
-     * 批量编辑
-     */
-    @PostMapping("/batchUpdate")
-    @ApiOperationSupport(order = 6)
-    @ApiOperation(value = "批量编辑", notes = "传入archivesAutoVo")
-    public R batchUpdate(@Valid @RequestBody ArchivesAutoVO archivesAutoVo) {
-        return R.status(archivesAutoService.updateBatchById(JSONArray.parseArray(JSONObject.toJSONString(archivesAutoVo.getList()), ArchivesAuto.class)));
-    }
-
-    /**
-     * 获取节点载体类别集合
-     */
-    @GetMapping("/getCarrierTypeByDict")
-    @ApiOperationSupport(order = 7)
-    @ApiOperation(value = "获取节点载体类别集合", notes = "获取节点载体类别集合")
-    public R getCarrierTypeByDict() {
-        return R.data(archivesAutoService.getCarrierTypeByDict());
-    }
+		}
+		return R.status(archivesAutoService.updateBatchById(archivesAutos));
+	}
+
+	/**
+	 * 删除卷内文件
+	 */
+	@PostMapping("/removeFiles")
+	@ApiOperationSupport(order = 15)
+	@ApiOperation(value = "删除案卷的卷内文件", notes = "传入文件ids,归档archiveId")
+	public R removeFiles(@ApiParam(value = "主键集合", required = true) @RequestParam String ids, @RequestParam Long archiveId) {
+
+		ArchivesAuto archivesAuto = archivesAutoService.getById(archiveId);
+		if (archivesAuto != null && archivesAuto.getIsLock() == 1) {
+			return R.fail("案卷锁定中,能不能删除卷内文件");
+		}
+
+		return R.status(archivesAutoService.removeFiles(ids,archiveId));
+	}
+
+	/**
+	 * 刷新指定项目的档案
+	 * @param projectId 项目id
+	 * @return R
+	 */
+	@PostMapping("/refreshFileNumber")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "刷新项目档案", notes = "传入projectId,contractId")
+	public R<String> refreshProjectArchive(@RequestParam Long projectId, @RequestParam Long contractId,@RequestParam Long nodeId) {
+		archivesAutoService.refreshFileNumberNoSlipt(projectId,contractId,nodeId);
+		return R.data("刷新成功");
+	}
+
+	/**
+	 * 批量编辑
+	 */
+	@PostMapping("/batchUpdate")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "批量编辑", notes = "传入archivesAutoVo")
+	public R batchUpdate(@Valid @RequestBody ArchivesAutoVO archivesAutoVo) {
+		return R.status(archivesAutoService.updateBatchById(JSONArray.parseArray(JSONObject.toJSONString(archivesAutoVo.getList()), ArchivesAuto.class)));
+	}
 
 	/**
-	 * 获取档案销毁人列表
+	 * 获取节点载体类别集合
 	 */
-	@GetMapping("/getArchiveDestroyUser")
+	@GetMapping("/getCarrierTypeByDict")
 	@ApiOperationSupport(order = 7)
-	@ApiOperation(value = "获取档案销毁人列表", notes = "获取档案销毁人列表")
-	public R getArchiveDestroyUser(){
-		return R.data(archivesAutoService.getArchiveDestroyUser());
+	@ApiOperation(value = "获取节点载体类别集合", notes = "获取节点载体类别集合")
+	public R getCarrierTypeByDict(){
+		return R.data(archivesAutoService.getCarrierTypeByDict());
 	}
 
 }

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

@@ -22,63 +22,63 @@ 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;
 
 /**
- * 服务类
+ *  服务类
  *
  * @author BladeX
  * @since 2023-02-17
  */
 public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 
-    /**
-     * 自定义分页
-     *
-     * @param page
-     * @param archivesAuto
-     * @return
-     */
-    IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto);
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param archivesAuto
+	 * @return
+	 */
+	IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto);
 
-    IPage<ArchivesAutoVO> pageByArchivesAuto(ArchivesAutoVO archivesAuto);
+	IPage<ArchivesAutoVO> pageByArchivesAuto(ArchivesAutoVO archivesAuto);
 
-    IPage<ArchivesAutoVO> selectArchivesAutoFilePage(ArchivesAutoVO queryVo);
+	IPage<ArchivesAutoVO> selectArchivesAutoFilePage(ArchivesAutoVO queryVo);
 
-    boolean updateArchivesAutoFileByNodeId(String ids, String nodeId, String nodeSort);
+	boolean updateArchivesAutoFileByNodeId(String ids, String nodeId,String nodeSort);
 
-    Map<String, Integer> getAllArchiveByContractType(Long projectId, String type);
+	Map<String,Integer> getAllArchiveByContractType(Long projectId,String type);
 
-    List<Map<String, String>> getAllArchiveAgeByContractType(Long projectId);
+	List<Map<String, String>> getAllArchiveAgeByContractType(Long projectId);
 
     IPage<ArchivesAutoVO> pageByAuthenticate(ArchivesAutoVO archivesAuto);
 
-    List<String> getFilingUnitList(Long projectId);
+	List<String> getFilingUnitList(Long projectId);
 
-    void batchDestroyArchive(String ids);
+	void batchDestroyArchive(String ids);
 
-    void archiveAutoMethod(Long project, Long contractId, Long nodeId);
+	void archiveAutoMethod(Long project,Long contractId,Long nodeId);
 
-    void splitArchvies(Long project, Long contractId, Long nodeId);
+	void splitArchvies(Long project,Long contractId,Long nodeId);
 
-    public String getMergeArchivesFile(Long archiveId);
+	public String getMergeArchivesFile(Long archiveId);
 
-    //拆卷
-    boolean slipt(String ids);
+	//拆卷
+	boolean slipt(String ids);
 
-    //从案卷里删除文件
-    boolean removeFiles(String ids, Long archiveId);
+	//从案卷里删除文件
+	boolean removeFiles(String ids,Long archiveId);
 
 
-    //刷新某个项目的档号
-    void refreshFileNumberNoSlipt(Long projectId, Long contractId, Long nodeId);
+	//刷新某个项目的档号
+	void refreshFileNumberNoSlipt(Long projectId,Long contractId,Long nodeId);
 
-    void test();
+	void test();
 
     List<DictBiz> getCarrierTypeByDict();
 
-    List<User> getArchiveDestroyUser();
+	void archiveAutoMethodThread(Long projectId, Long contractId, Long nodeId);
+
 }

+ 110 - 110
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java

@@ -56,7 +56,7 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
     private ArchiveFileClient archiveFileClient;
 
-    public static final String[] ARCHIVE_NUMBER = new String[]{"r_Archives_front", "r_Archives_catalog", "r_Archives_spare", "r_Archives_back"};
+    public static final  String[] ARCHIVE_NUMBER = new String[]{"r_Archives_front","r_Archives_catalog","r_Archives_spare","r_Archives_back"};
 
     public static final Map<String, String> URL_MAP = new HashMap<>();
     public static final Map<String, String> NAME_MAP = new HashMap<>();
@@ -94,19 +94,19 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
         boolean flag = FileUtils.LocalPath.equals(file_path);
-        String excelUrl = file_path + "\\备考表.xlsx";
+        String excelUrl = file_path +  "\\备考表.xlsx";
 
         Map<String, Object> DataInfo = new HashMap<>();
 
         DataVO dataVO = FormulaUtil.convertCellToIndex("C2");
-        String key = "1__" + dataVO.getY() + "_" + dataVO.getX();
-        DataInfo.put(key, "档号12345688888888888888888888888888888888888888888888888888888888888");
+        String key =  "1__"+ dataVO.getY() + "_" + dataVO.getX();
+        DataInfo.put(key,"档号12345688888888888888888888888888888888888888888888888888888888888");
 
         DataVO dataVO1 = FormulaUtil.convertCellToIndex("A9");
-        String key1 = "2__" + dataVO1.getY() + "_" + dataVO1.getX();
-        DataInfo.put(key1, "hahahahaa9999999999999999999999999999999999999999999999999999999999999");
+        String key1 =  "2__"+ dataVO1.getY() + "_" + dataVO1.getX();
+        DataInfo.put(key1,"hahahahaa9999999999999999999999999999999999999999999999999999999999999");
         try {
-            String url = getBussPdfInfo(pkeyId.toString(), DataInfo, excelUrl, file_path, null, null);
+            String url = getBussPdfInfo(pkeyId.toString(),DataInfo,excelUrl,file_path,null,null);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -194,21 +194,20 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
         List<ArchiveFile> archiveFiles = new ArrayList<>();
 
-        for (int i = 0; i < 20; i++) {
+        for (int i = 0; i < 20;i++) {
             archiveFiles.add(archiveFile);
         }
-        buildArchiveFrontPdfs(projectId, archivesAuto, archiveFiles);
+        buildArchiveFrontPdfs(projectId,archivesAuto,archiveFiles);
     }
 
 
     /**
-     * 生成四要素
-     *
+     *  生成四要素
      * @param projectId
-     * @param archivesAuto,   会更新起始时间和结束时间,所以调用后要更新
+     * @param archivesAuto, 会更新起始时间和结束时间,所以调用后要更新
      * @param archiveFileList
      */
-    public void buildArchiveFrontPdfs(Long projectId, ArchivesAuto archivesAuto, List<ArchiveFile> archiveFileList) {
+    public void buildArchiveFrontPdfs(Long projectId, ArchivesAuto archivesAuto,List<ArchiveFile> archiveFileList) {
         // 调用 getByProjectIdOrNew 方法获取 ArchiveProjectConfig 对象,并从中取得 factorType 的值
         ArchiveProjectConfig config = archiveProjectConfigService.getByProjectIdOrNew(projectId);
 
@@ -231,26 +230,26 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
         String secretLevel = archivesAuto.getSecretLevel();
         String storageTime = archivesAuto.getStorageTime();
 
-        Map<String, Object> variables = dataSourceBuilder(archivesAuto, archiveFileList);
+        Map<String,Object> variables = dataSourceBuilder(archivesAuto,archiveFileList);
 
         // 使用生成的档案号码字符串链表生成档案 PDF 文件
         List<String> frontUrls = new ArrayList<>();
         List<String> backUrls = new ArrayList<>();
         for (String number : numberFronts) {
             // 具体实现省略
-            buildFrontPdf(archivesAuto, number, variables, frontUrls);
+            buildFrontPdf(archivesAuto,number, variables,frontUrls);
         }
 
         for (String number : numberBacks) {
             // 具体实现省略
-            buildFrontPdf(archivesAuto, number, variables, backUrls);
+            buildFrontPdf(archivesAuto,number, variables,backUrls);
         }
 
         //将封面写入archivesAuto
         frontUrls.addAll(backUrls);
 
         //统计文件大小
-        RefreshFileSize(archivesAuto, archiveFileList, frontUrls);
+        RefreshFileSize(archivesAuto,archiveFileList,frontUrls);
 
         String joinedUrls = String.join(", ", frontUrls);
         archivesAuto.setOutUrl(joinedUrls);
@@ -260,11 +259,10 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
     /**
      * 打码
-     *
      * @param archivesAuto
      * @param waitArchiveFiles
      */
-    public void builtFilePageNo(ArchivesAuto archivesAuto, List<ArchiveFile> waitArchiveFiles) {
+    public void builtFilePageNo(ArchivesAuto archivesAuto,List<ArchiveFile> waitArchiveFiles){
 
         Long projectId = archivesAuto.getProjectId();
 
@@ -280,13 +278,13 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
         }
 
         List<String> urls = new ArrayList<>();
-        for (ArchiveFile f : waitArchiveFiles) {
+        for (ArchiveFile f: waitArchiveFiles) {
             String url = getPdfFileUrl(f);
             urls.add(url);
         }
         String localPath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        List<String> pageUrls = FileUtils.doForPageNumberUseItextpdf(urls, localPath, newIOSSClient, archivesAuto.getProjectId());
-        for (int i = 0; i < waitArchiveFiles.size(); i++) {
+        List<String> pageUrls = FileUtils.doForPageNumberUseItextpdf(urls,localPath,newIOSSClient, archivesAuto.getProjectId());
+        for(int i=0;i<waitArchiveFiles.size();i++){
             waitArchiveFiles.get(i).setPdfPageUrl(pageUrls.get(i));
         }
 
@@ -294,12 +292,14 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
     }
 
 
+
     /**
-     * @param number    四要素的表名
+     *
+     * @param number  四要素的表名
      * @param variables 参数集
-     * @param urls      返回的url
+     * @param urls  返回的url
      */
-    public void buildFrontPdf(ArchivesAuto archivesAuto, String number, Map<String, Object> variables, List<String> urls) {
+    public void buildFrontPdf(ArchivesAuto archivesAuto,String number, Map<String,Object> variables,List<String> urls) {
         // Step 1: Get the list of formulas using archiveFormulaConfigService
         List<ArchiveFormulaConfig> formulaConfigs = archiveFormulaConfigService.getByNumber(number);
 
@@ -309,19 +309,20 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
         ArchiveFormulaConfig multiLineconfig = null;
         //采取
-        String fileName = FileUtils.generateFilename(number, 0, archivesAuto.getId());
+        String fileName = FileUtils.generateFilename(number,0,archivesAuto.getId());
 
         for (ArchiveFormulaConfig config : formulaConfigs) {
             String coords = config.getCoords();
             String formula = config.getFormula();
 
-            if (variables.containsKey("ArchiveFile") && variables.get("ArchiveFile") instanceof List
-                    && formula.indexOf("ArchiveFile") >= 0) {
+            if(variables.containsKey("ArchiveFile") && variables.get("ArchiveFile") instanceof List
+                    && formula.indexOf("ArchiveFile") >= 0){
 
                 multiLineconfig = config;
                 //handleArchiveFile(coords, formula, variables, file_path, excelUrl, dataInfo,urls);
                 continue;
-            } else {
+            }
+            else{
                 handleNonArchiveFile(config, coords, formula, variables, file_path, excelUrl, dataInfo);
             }
         }
@@ -329,11 +330,11 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
         if (multiLineconfig != null) {
             String coords = multiLineconfig.getCoords();
             String formula = multiLineconfig.getFormula();
-            handleArchiveFile(coords, formula, variables, file_path, excelUrl, dataInfo, urls, fileName, archivesAuto.getProjectId());
+            handleArchiveFile(coords, formula, variables, file_path, excelUrl, dataInfo,urls,fileName, archivesAuto.getProjectId());
 
-        } else {
+        }else {
             try {
-                String url = getBussPdfInfo(fileName, dataInfo, excelUrl, file_path, OssConstant.ARCHIVE_DIRECTORY, archivesAuto.getProjectId());
+                String url = getBussPdfInfo(fileName, dataInfo, excelUrl, file_path,OssConstant.ARCHIVE_DIRECTORY,archivesAuto.getProjectId());
                 urls.add(url);
             } catch (Exception e) {
                 e.printStackTrace();
@@ -344,7 +345,6 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
     /**
      * 生成 卷内目录
-     *
      * @param coords
      * @param formula
      * @param variables
@@ -354,8 +354,8 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
      * @param urls
      */
     private void handleArchiveFile(String coords, String formula,
-                                   Map<String, Object> variables, String file_path,
-                                   String excelUrl, Map<String, Object> dataInfo, List<String> urls, String fileName, Long projectId) {
+                                   Map<String,Object> variables,String file_path,
+                                   String excelUrl, Map<String, Object> dataInfo,List<String> urls,String fileName,Long projectId){
         //todo  目录多页合并一页,文件名带上
 
 
@@ -366,25 +366,29 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
             DataVO dataVO2 = FormulaUtil.convertCellToIndex(coordArr[1]);
             Integer pageSize = dataVO2.getY() - dataVO1.getY() + 1;
 
-            List<Map<String, Object>> archiveFiles = (List<Map<String, Object>>) variables.get("ArchiveFile");
+            List<Map<String,Object>> archiveFiles = (List<Map<String,Object>>)variables.get("ArchiveFile");
 
             Map<String, Object> pageMap = new HashMap<>();
-            if (archiveFiles != null && archiveFiles.size() > 0) {
+            if(archiveFiles != null && archiveFiles.size() > 0){
                 int pageIndex = 0; // 当前页数
                 while (true) {
-                    List<Map<String, Object>> subList = archiveFiles.subList(pageIndex * pageSize,
+                    List<Map<String,Object>> subList = archiveFiles.subList(pageIndex * pageSize,
                             Math.min((pageIndex + 1) * pageSize, archiveFiles.size()));
 
+                    if(subList.size()==0){
+                        break;
+                    }
+
                     pageMap.clear();
                     pageMap.putAll(dataInfo);
 
                     int subIndex = 0;
-                    for (Map<String, Object> archiveMap : subList) {
+                    for (Map<String,Object> archiveMap : subList) {
                         // 处理archiveFile逻辑
                         int y = dataVO1.getY() + subIndex;
                         List<Object> objects = FormulaUtil.expressionParseList(formula, archiveMap);
                         int xIndex = 0;
-                        for (Object o : objects) {
+                        for (Object o: objects) {
                             if (o == null) {
                                 xIndex++;
                                 continue;
@@ -398,7 +402,8 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
                         subIndex++;
                     }
                     try {
-                        String url = getBussPdfInfo(fileName + subIndex, pageMap, excelUrl, file_path, OssConstant.ARCHIVE_DIRECTORY, projectId);
+                        Integer fileNamenum=(pageIndex * pageSize)+subIndex;
+                        String url = getBussPdfInfo(fileName + fileNamenum, pageMap, excelUrl, file_path,OssConstant.ARCHIVE_DIRECTORY,projectId);
                         localUrls.add(url);
                     } catch (Exception e) {
                         e.printStackTrace();
@@ -422,23 +427,22 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
             FileUtils.mergePdfPublicMethods(localUrls, localPdf);
 //            BladeFile bladeFile = this.newIOSSClient.uploadFile(fileName + ".pdf", localPdf, OssConstant.ARCHIVE_DIRECTORY,projectId);
 
-            String absoluteFileName = FileUtils.getOssPath(OssConstant.ARCHIVE_DIRECTORY, fileName, projectId);
+            String absoluteFileName = FileUtils.getOssPath(OssConstant.ARCHIVE_DIRECTORY,fileName,projectId);
             BladeFile bladeFile = newIOSSClient.uploadFile(absoluteFileName + ".pdf", localPdf);
 
 //            ByteArrayOutputStream bos = new ByteArrayOutputStream();
 //            FileUtils.PdfCopyPublicMethods(bos, localUrls);
 //            BladeFile bladeFile = newIOSSClient.updateFile(bos.toByteArray(),fileName + ".pdf");
-            if (bladeFile != null) {
+            if (bladeFile!= null ) {
                 urls.add(bladeFile.getLink());
             }
-        } else if (localUrls.size() == 1) {
+        }else if (localUrls.size() == 1) {
             urls.add(localUrls.get(0));
         }
     }
 
     /**
      * 生成 封面,备考表,脊背
-     *
      * @param config
      * @param coords
      * @param formula
@@ -448,19 +452,19 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
      * @param dataInfo  结果集
      */
     private void handleNonArchiveFile(ArchiveFormulaConfig config, String coords, String formula,
-                                      Map<String, Object> variables, String file_path,
+                                      Map<String,Object> variables,String file_path,
                                       String excelUrl, Map<String, Object> dataInfo) {
         DataVO dataVO = FormulaUtil.convertCellToIndex(coords);
         Object object = null;
         if (formula.indexOf("~") > 0) {
             String[] formulaArr = formula.split("~");
             if (formulaArr.length == 2) {
-                Object object1 = FormulaUtil.expressionParse(formulaArr[0], variables);
-                Object object2 = FormulaUtil.expressionParse(formulaArr[1], variables);
+                Object object1 = FormulaUtil.expressionParse(formulaArr[0],variables);
+                Object object2 = FormulaUtil.expressionParse(formulaArr[1],variables);
                 object = object1 + "~" + object2;
             }
-        } else {
-            object = FormulaUtil.expressionParse(formula, variables);
+        }else {
+            object = FormulaUtil.expressionParse(formula,variables);
         }
 
 
@@ -475,18 +479,17 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
     /**
      * 生成单张pdf
-     *
-     * @param fileName  文件名
+     * @param fileName   文件名
      * @param DataInfo  excel和数据
      * @param excelUrl  excel模板
-     * @param localPath 本地路径
-     * @param ossPath   oss上的路径
+     * @param localPath  本地路径
+     * @param ossPath  oss上的路径
      * @param projectId 项目ID
      * @return
      * @throws Exception
      */
-    public String getBussPdfInfo(String fileName, Map<String, Object> DataInfo, String excelUrl, String localPath,
-                                 String ossPath, Long projectId) throws Exception {
+    public String getBussPdfInfo(String fileName,Map<String, Object> DataInfo,String excelUrl,String localPath,
+         String ossPath, Long projectId) throws Exception{
 
         if (fileName == null) {
             fileName = SnowFlakeUtil.getId().toString();
@@ -502,9 +505,9 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
         // 获取excel流 和 html流
         InputStream exceInp = null;
-        if (isOssFilePath(excelUrl)) {
+        if ( isOssFilePath(excelUrl)){
             exceInp = CommonUtil.getOSSInputStream(excelUrl);
-        } else {
+        }else {
             exceInp = new FileInputStream(new File(excelUrl));
         }
 
@@ -527,12 +530,12 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
                     int x2 = 0;
                     int y2 = 0;
 
-                    if (xy.length == 2) {
+                    if (xy.length == 2 ) {
                         x1 = Integer.parseInt(xy[1]);
                         y1 = Integer.parseInt(xy[0]);
                     }
 
-                    if (xy.length == 4) {
+                    if (xy.length == 4 ) {
                         x2 = Integer.parseInt(xy[3]);
                         y2 = Integer.parseInt(xy[2]);
                     }
@@ -561,10 +564,11 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
                         pict.resize(1, 1);
                         FileUtils.imageOrientation(sheet, anchor, new DataVO(x1 - 1, y1 - 1));
 
-                    } else {
-                        Row row = sheet.getRow(y1);
+                    }
+                    else {
+                        Row row = sheet.getRow(y1 );
                         if (row != null) {
-                            Cell cell = row.getCell(x1);
+                            Cell cell = row.getCell(x1 );
                             if (cell != null || ObjectUtils.isNotEmpty(cell)) {
 //                                boolean bflag = true;
 //                                if (bflag) {
@@ -584,25 +588,24 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
         FileOutputStream outputStream = new FileOutputStream(excelPath);
         workbook.write(outputStream);
         FileUtils.setExcelScaleToPdf(excelPath, localPdfPath);
-        String absoluteFileName = FileUtils.getOssPath(OssConstant.ARCHIVE_DIRECTORY, fileName, projectId);
+        String absoluteFileName = FileUtils.getOssPath(OssConstant.ARCHIVE_DIRECTORY,fileName,projectId);
         BladeFile bladeFile = newIOSSClient.uploadFile(absoluteFileName + ".pdf", localPdfPath);
 
         ///BladeFile bladeFile = newIOSSClient.uploadFile(fileName + ".pdf", localPdfPath,ossPath, projectId);
         String pdfLink = "";
-        if (bladeFile != null) {
+        if (bladeFile!= null ){
             pdfLink = bladeFile.getLink();
         }
         return pdfLink;
     }
 
     /**
-     * 生成四要素的数据源
-     *
+     *  生成四要素的数据源
      * @param archive
      * @param datas
      * @return
      */
-    public static Map<String, Object> dataSourceBuilder(ArchivesAuto archive, List<ArchiveFile> datas) {
+    public static  Map<String,Object> dataSourceBuilder(ArchivesAuto archive, List<ArchiveFile> datas){
 
         //预处理
         archive.setSecretLevel(FormulaUtil.securityLevelMap.get(archive.getSecretLevel()));
@@ -614,7 +617,7 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
         List<Map<String, Object>> fileMapList = new ArrayList<>();
 
         //todo  增加获取总大小
-        for (ArchiveFile file : datas) {
+        for (ArchiveFile file:  datas) {
             idx++;
             //设置序号
             file.setFid(idx);
@@ -626,13 +629,14 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
             file.setPageNum(iStartPage.toString());
 
             //最后一页
-            iStartPage += file.getFilePage();
-            if (idx >= datas.size()) {
-                String lastPageNum = file.getPageNum() + "~" + (iStartPage - 1);
+            iStartPage +=   file.getFilePage();
+            if (idx >= datas.size() ) {
+                String lastPageNum = file.getPageNum() + "~" + (iStartPage-1);
                 file.setPageNum(lastPageNum);
             }
 
 
+
             Map<String, Object> fileMap = new ObjectMapper().convertValue(file, Map.class);
             fileMapList.add(fileMap);
         }
@@ -646,7 +650,7 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
         for (ArchiveFile file : datas) {
             String fileTime = file.getFileTime();
-            if (StringUtils.isNotEmpty(fileTime)) {
+            if(StringUtils.isNotEmpty(fileTime)){
                 if (minDate.isEmpty() || fileTime.compareTo(minDate) <= 0) {
                     minDate = fileTime;
                 }
@@ -658,41 +662,40 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
         // 将日期赋值给startDate和endDate
         if (!minDate.isEmpty()) {
-            LocalDateTime localDateTime = FormulaUtil.parseStringToLocalDateTime(minDate, "yyyyMMdd");
+            LocalDateTime localDateTime = FormulaUtil.parseStringToLocalDateTime(minDate,"yyyyMMdd");
             archive.setStartDate(localDateTime);
         }
         if (!maxDate.isEmpty()) {
-            LocalDateTime localDateTime = FormulaUtil.parseStringToLocalDateTime(maxDate, "yyyyMMdd");
+            LocalDateTime localDateTime = FormulaUtil.parseStringToLocalDateTime(maxDate,"yyyyMMdd");
             archive.setEndDate(localDateTime);
         }
 
         Map<String, Object> archivesAutoMap = new ObjectMapper().convertValue(archive, Map.class);
-        if (archive.getRollDate() != null) {
-            archivesAutoMap.put("rollDate", FormulaUtil.formatLocalDateTime(archive.getRollDate(), "yyyy年MM月dd日"));
+        if (archive.getRollDate()!= null) {
+            archivesAutoMap.put("rollDate",FormulaUtil.formatLocalDateTime(archive.getRollDate(),"yyyy年MM月dd日"));
         }
 
-        if (archive.getReviewDate() != null) {
-            archivesAutoMap.put("reviewDate", FormulaUtil.formatLocalDateTime(archive.getReviewDate(), "yyyy年MM月dd日"));
+        if (archive.getReviewDate()!= null) {
+            archivesAutoMap.put("reviewDate",FormulaUtil.formatLocalDateTime(archive.getReviewDate(),"yyyy年MM月dd日"));
         }
 
-        if (archive.getStartDate() != null) {
-            archivesAutoMap.put("startDate", FormulaUtil.formatLocalDateTime(archive.getStartDate(), "yyyyMMdd"));
+        if (archive.getStartDate()!= null) {
+            archivesAutoMap.put("startDate",FormulaUtil.formatLocalDateTime(archive.getStartDate(),"yyyyMMdd"));
         }
 
-        if (archive.getEndDate() != null) {
-            archivesAutoMap.put("endDate", FormulaUtil.formatLocalDateTime(archive.getEndDate(), "yyyyMMdd"));
+        if (archive.getEndDate()!= null) {
+            archivesAutoMap.put("endDate",FormulaUtil.formatLocalDateTime(archive.getEndDate(),"yyyyMMdd"));
         }
 
-        Map<String, Object> variables = new HashMap<>();
-        variables.put("Archive", archivesAutoMap);
+        Map<String,Object> variables = new HashMap<>();
+        variables.put("Archive",archivesAutoMap);
 
-        variables.put("ArchiveFile", fileMapList);
-        return variables;
+        variables.put("ArchiveFile",fileMapList);
+        return  variables;
     }
 
     /**
      * 获取四要素模板的url,这里写死,后续可以从清表的 ”归档“模板树下获取
-     *
      * @param number
      * @return
      */
@@ -704,16 +707,15 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
     /**
      * 获取指定文件的pdf文件
-     *
      * @param file
      * @return
      */
-    public String getPdfFileUrl(ArchiveFile file) {
+    public String getPdfFileUrl(ArchiveFile file){
         //
         String url = file.getPdfFileUrl();
         if (StringUtil.isEmpty(url)) {
             String fileUrl = file.getFileUrl();
-            if (fileUrl.endsWith(".pdf") || fileUrl.endsWith(".PDF")) {
+            if(fileUrl.endsWith(".pdf") || fileUrl.endsWith(".PDF")){
                 url = file.getFileUrl();
             }
         }
@@ -726,24 +728,23 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
     /**
      * 刷新文件大小
-     *
      * @param archive
      * @param datas
      * @param frontUrls
      */
-    public void RefreshFileSize(ArchivesAuto archive, List<ArchiveFile> datas, List<String> frontUrls) {
+    public void RefreshFileSize(ArchivesAuto archive,List<ArchiveFile> datas,List<String> frontUrls){
 
         List<String> fileUrls = new ArrayList<>();
-        for (ArchiveFile file : datas) {
+        for (ArchiveFile file: datas) {
             String url = getPdfFileUrl(file);
-            if (StringUtils.isEmpty(url)) {
+            if(StringUtils.isEmpty(url)){
                 continue;
             }
             fileUrls.add(url);
         }
 
         fileUrls.addAll(frontUrls);
-        List<FileSize> fileSizes = org.springblade.common.utils.FileUtils.getOssFileSize(fileUrls);
+        List<FileSize>  fileSizes = org.springblade.common.utils.FileUtils.getOssFileSize(fileUrls);
 
         double totalSize = fileSizes.stream()
                 .mapToDouble(FileSize::getFileSize)
@@ -753,9 +754,9 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
         //todo 生成相册内容,待补充
         int i = 0;
-        for (ArchiveFile file : datas) {
+        for (ArchiveFile file: datas) {
             double size = fileSizes.get(i).getFileSize();
-            if (file.getFileSize() != null) {
+            if (file.getFileSize()!= null) {
                 file.setFileSize(Math.round(size));
             }
         }
@@ -763,11 +764,10 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
     /**
      * 刷新档号
-     *
      * @param archive
      * @param fileNumber
      */
-    public boolean refreshFileNumber(ArchivesAuto archive, String fileNumber) {
+    public boolean refreshFileNumber(ArchivesAuto archive,String fileNumber) {
         //没变化则不用刷新
         if (fileNumber.equals(archive.getFileNumber())) {
             return false;
@@ -778,26 +778,25 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
         List<ArchiveFile> archiveFiles = archiveFileClient.getArchiveFileByArchiveID(archive.getId());
 
-        buildArchiveFrontPdfs(projectId, archive, archiveFiles);
+        buildArchiveFrontPdfs(projectId,archive,archiveFiles);
 
         return true;
     }
 
     /**
      * 合并pdf并上传到oss
-     *
      * @param urlList
      * @param fileName
      * @return
      */
-    public String MergePdfAndUpload(List<String> urlList, String fileName, String filePath, Long pojectId) {
-        String url = "";
-        Long id = SnowFlakeUtil.getId();
-        String localPdf = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL) + "/pdf/" + id + ".pdf";
+    public String MergePdfAndUpload(List<String> urlList,String fileName,String filePath,Long pojectId) {
+       String url = "";
+       Long id = SnowFlakeUtil.getId();
+       String localPdf = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL) + "/pdf/" + id + ".pdf";
 
-        try {
+       try {
             //合并pdf
-            FileUtils.mergePdfPublicMethods(urlList, localPdf);
+            FileUtils.mergePdfPublicMethods(urlList,localPdf);
 
             if (StringUtils.isEmpty(filePath)) {
                 filePath = OssConstant.TEMP_DIRECTORY;
@@ -806,8 +805,8 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
             fileName += (OssConstant.SEPARATOR + id);
 
             //上传到oss
-            String absoluteFileName = FileUtils.getOssPath(OssConstant.TEMP_DIRECTORY, fileName, null);
-            BladeFile file = newIOSSClient.uploadFile(absoluteFileName + ".pdf", localPdf);
+           String absoluteFileName = FileUtils.getOssPath(OssConstant.TEMP_DIRECTORY,fileName,null);
+           BladeFile file = newIOSSClient.uploadFile(absoluteFileName + ".pdf", localPdf);
 
 
 //            BladeFile file  = newIOSSClient.uploadFile(fileName+ ".pdf", localPdf,filePath,pojectId);
@@ -819,4 +818,5 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
     }
 
 
+
 }

+ 37 - 14
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -24,6 +24,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.entity.ArchiveProjectConfig;
 import org.springblade.archive.entity.ArchivesAuto;
@@ -58,7 +59,6 @@ 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;
@@ -77,6 +77,7 @@ import java.util.stream.Collectors;
  * @author BladeX
  * @since 2023-02-17
  */
+@Slf4j
 @Service
 @AllArgsConstructor
 public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper, ArchivesAuto> implements IArchivesAutoService {
@@ -261,6 +262,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		List<String> removeFiles = new ArrayList<>();
 		//没合同段的默认整个项目
 		if (contractId == null) {
+			log.info("[自动组卷-拆卷]{}","对全项目未锁定案卷拆卷");
 			//清除案卷封面等pdf
 			List<String> archivesOutUrlList = baseMapper.getArchivesOutUrlList(projectId);
 			if(archivesOutUrlList!=null && archivesOutUrlList.size()>0){
@@ -283,8 +285,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 				}
 			}
 			executorService.execute(()->{
+				log.info("[自动组卷-拆卷]{}","删除旧封面,页码文件开始"+removeFiles);
 				iossClient.removeFiles(removeFiles);
-				log.debug("文件删完了");
+				log.info("[自动组卷-拆卷]{}","删除旧封面,页码文件结束"+removeFiles);
 			});
 
 			//取消未锁定案卷文件关联
@@ -293,6 +296,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		}else{
 			String treeCode = getAuthCode(contractId);
 			if (nodeId!= null) {
+				log.info("[自动组卷-拆卷]{}","对选择节点下未锁定案卷拆卷。projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId);
+
 				//有节点的按节点
 				String strNodeId  = nodeId.toString();
 				ArchiveTreeContract archiveTreeContract = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
@@ -319,14 +324,17 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 						}
 					}
 				}
+
 				executorService.execute(()->{
+					log.info("[自动组卷-拆卷]{}","删除旧封面,页码文件开始"+removeFiles);
 					iossClient.removeFiles(removeFiles);
-					log.debug("文件删完了");
+					log.info("[自动组卷-拆卷]{}","删除旧封面,页码文件结束"+removeFiles);
 				});
 
 				baseMapper.splitArchviesByNode(projectId,ancestors,strNodeId);
 			}else{
 				//没节点的按合同段
+				log.info("[自动组卷-拆卷]{}","对合同段下未锁定案卷拆卷。projectId:"+projectId+"-contractId:"+contractId+"-treeCode:"+treeCode);
 				//清除案卷封面等pdf
 				List<String> archivesOutUrlList = baseMapper.getArchivesOutUrlListByContract(projectId,contractId,treeCode);
 				if(archivesOutUrlList!=null && archivesOutUrlList.size()>0){
@@ -348,9 +356,11 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 						}
 					}
 				}
+
 				executorService.execute(()->{
+					log.info("[自动组卷-拆卷]{}","删除旧封面,页码文件开始"+removeFiles);
 					iossClient.removeFiles(removeFiles);
-					log.debug("文件删完了");
+					log.info("[自动组卷-拆卷]{}","删除旧封面,页码文件结束"+removeFiles);
 				});
 
 				//没节点的按合同段
@@ -440,13 +450,6 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			}
 				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);
 	}
 
@@ -1307,7 +1310,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 					if(StringUtils.isEmpty(fileNumberPrefix)){
 						//节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
 						Long nodeContractId = archivesAuto.getContractId();
-						if(nodeContractId!=null){
+						if(nodeContractId!=null && nodeContractId!=-1){
 							ContractInfo nodeContract = contractClient.getContractById(nodeContractId);
 							fileNumberPrefix = nodeContract.getPrefix();
 						}else{
@@ -1641,8 +1644,28 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	}
 
 	@Override
-	public List<User> getArchiveDestroyUser() {
-		return autoMapper.getArchiveDestroyUser();
+	public void archiveAutoMethodThread(Long projectId, Long contractId, Long nodeId) {
+		executorService.execute(()->{
+			try{
+				//将项目未锁定案卷拆卷
+				log.info("[自动组卷]{}","开始对未锁定案卷拆卷。projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId);
+				splitArchvies(projectId,contractId,nodeId);
+				//项目自动组卷入口
+				log.info("[自动组卷]{}","开始自动组卷。projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId);
+				archiveAutoMethod(projectId,contractId,nodeId);
+				//刷新项目档号
+				log.info("[自动组卷]{}","开始刷新组卷档号。projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId);
+				refreshFileNumberNoSlipt(projectId,contractId,nodeId);
+				//设置自动组卷结束
+				projectClient.updateIsArchivesAutoById(projectId,0);
+				log.info("[自动组卷]{}","自动组卷完成。projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId);
+			}catch (Exception e){
+				e.printStackTrace();
+				log.error("自动组卷报错。"+e.getMessage()+"--projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId);
+				//设置自动组卷结束
+				projectClient.updateIsArchivesAutoById(projectId,0);
+			}
+		});
 	}
 
 

+ 7 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ProjectClientImpl.java

@@ -1,5 +1,6 @@
 package org.springblade.manager.feign;
 
+import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
 import lombok.AllArgsConstructor;
 import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.service.IProjectInfoService;
@@ -33,4 +34,10 @@ public class ProjectClientImpl implements ProjectClient {
         projectInfo.setIsArchivesAuto(isArchivesAuto);
         projectInfoService.updateById(projectInfo);
     }
+
+    @Override
+    public List<ProjectInfo> getList() {
+        List<ProjectInfo> list = projectInfoService.list();
+        return list;
+    }
 }

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

@@ -331,7 +331,7 @@
         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,
+        select id,project_id as projectId,contract_id as contractId,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;

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

@@ -49,7 +49,7 @@ import java.util.*;
 import java.util.stream.Collectors;
 
 /**
- * 服务实现类
+ *  服务实现类
  *
  * @author 00
  * @since 2023-02-18
@@ -58,905 +58,892 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeContractMapper, ArchiveTreeContract> implements IArchiveTreeContractService {
 
-    private final ArchiveTreeContractMapper archiveTreeContractMapper;
-    private final ArchiveTreeMapper archiveTreeMapper;
+	private final ArchiveTreeContractMapper archiveTreeContractMapper;
+	private final ArchiveTreeMapper archiveTreeMapper;
 
-    private final IArchiveTreeService archiveTreeService;
+	private final IArchiveTreeService archiveTreeService;
 
-    private final IContractInfoService contractInfoService;
+	private final IContractInfoService contractInfoService;
 
-    private final ArTreeContractInitServiceImpl arTreeContractInitService;
+	private final ArTreeContractInitServiceImpl arTreeContractInitService;
 
-    private final IProjectInfoService projectInfoService;
+	private final IProjectInfoService projectInfoService;
 
-    private final ArchiveTreeContractSyncImpl archiveTreeContractSync;
+	private final ArchiveTreeContractSyncImpl archiveTreeContractSync;
 
 
-    @Override
-    public IPage<ArchiveTreeContractVO> selectArchiveTreeContractPage(IPage<ArchiveTreeContractVO> page, ArchiveTreeContractVO archiveTreeContract) {
-        return page.setRecords(baseMapper.selectArchiveTreeContractPage(page, archiveTreeContract));
-    }
+	@Override
+	public IPage<ArchiveTreeContractVO> selectArchiveTreeContractPage(IPage<ArchiveTreeContractVO> page, ArchiveTreeContractVO archiveTreeContract) {
+		return page.setRecords(baseMapper.selectArchiveTreeContractPage(page, archiveTreeContract));
+	}
 
-    @Override
-    public boolean initTree2(String tenantId, Long projectId) {
-        if (projectId == null || projectId == 0) {
-            return false;
-        }
+	@Override
+	public boolean initTree2(String tenantId, Long projectId){
+		if (projectId == null || projectId == 0) {
+			return false;
+		}
 
-        //判断客户级是否存在
-        QueryWrapper<ArchiveTreeContract> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("parent_id", 0);
-        queryWrapper.eq("project_id", projectId);
-        queryWrapper.eq("status", 1);
-        queryWrapper.eq("is_deleted", 0);
-        ArchiveTreeContract archiveTreeContract1 = archiveTreeContractMapper.selectOne(queryWrapper);
-        if (archiveTreeContract1 != null) {
-            throw new ServiceException("根节点已存在,请先删除后再进行初始化");
-        }
+		//判断客户级是否存在
+		QueryWrapper<ArchiveTreeContract> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("parent_id", 0);
+		queryWrapper.eq("project_id", projectId);
+		queryWrapper.eq("status", 1);
+		queryWrapper.eq("is_deleted", 0);
+		ArchiveTreeContract archiveTreeContract1 = archiveTreeContractMapper.selectOne(queryWrapper);
+		if (archiveTreeContract1 != null) {
+			throw new ServiceException("根节点已存在,请先删除后再进行初始化");
+		}
 
-        //判断项目级是否存在
-        QueryWrapper<ArchiveTree> queryWrapper1 = new QueryWrapper<>();
-        queryWrapper1.eq("parent_id", 0);
-        queryWrapper1.eq("project_id", projectId);
-        queryWrapper1.eq("status", 1);
-        queryWrapper1.eq("is_deleted", 0);
-        ArchiveTree archiveTree = archiveTreeMapper.selectOne(queryWrapper1);
-        if (archiveTree == null) {
-            boolean bRet = archiveTreeService.initArchiveProjectTree(projectId);
-            if (bRet == false) {
-                return bRet;
-            }
-        }
+		//判断项目级是否存在
+		QueryWrapper<ArchiveTree> queryWrapper1 = new QueryWrapper<>();
+		queryWrapper1.eq("parent_id", 0);
+		queryWrapper1.eq("project_id", projectId);
+		queryWrapper1.eq("status", 1);
+		queryWrapper1.eq("is_deleted", 0);
+		ArchiveTree archiveTree = archiveTreeMapper.selectOne(queryWrapper1);
+		if (archiveTree == null ) {
+			boolean bRet = archiveTreeService.initArchiveProjectTree(projectId);
+			if (bRet == false) {
+				return bRet;
+			}
+		}
 
 
-        List<ArchiveTreeVO2> tree = archiveTreeService.tree2(AuthUtil.getTenantId(), projectId, null, null, null, false);
-        if (tree == null || tree.size() == 0) {
-            return false;
-        }
+		List<ArchiveTreeVO2> tree = archiveTreeService.tree2(AuthUtil.getTenantId(), projectId,null, null,null,false);
+		if (tree == null || tree.size() == 0) {
+			return false;
+		}
 
-        ProjectInfo projectInfo = projectInfoService.getOne(projectId);
+		ProjectInfo projectInfo = projectInfoService.getOne(projectId);
 
-        List<ArchiveTreeContract> archiveTreeContracts = new ArrayList<>();
+		List<ArchiveTreeContract> archiveTreeContracts = new ArrayList<>();
 
 
-        List<ContractInfo> contractInfoVOS = contractInfoService.selectContractInfoPageByPid(projectId.toString());
+		List<ContractInfo> contractInfoVOS = contractInfoService.selectContractInfoPageByPid(projectId.toString());
 
-        arTreeContractInitService.copyTree(tenantId, projectId, projectInfo.getProjectName(), tree.get(0), archiveTreeContracts, contractInfoVOS);
+		arTreeContractInitService.copyTree(tenantId,projectId,projectInfo.getProjectName(),tree.get(0),archiveTreeContracts,contractInfoVOS);
 
-        //是否获取扩展的wbs节点
+		//是否获取扩展的wbs节点
 
-        Long wbsId = null;
-        if (projectInfo != null) {
-            Long lWbsId = projectInfo.getReferenceWbsTemplateId();
-            if (lWbsId != null) {
-                wbsId = projectInfo.getReferenceWbsTemplateId();
-            }
-        }
+		Long wbsId = null;
+		if (projectInfo!= null) {
+			Long lWbsId = projectInfo.getReferenceWbsTemplateId();
+			if (lWbsId != null) {
+				wbsId = projectInfo.getReferenceWbsTemplateId();
+			}
+		}
 
-        ArchiveTreeContractVO2 newTree = arTreeContractInitService.getTree(archiveTreeContracts);
+		ArchiveTreeContractVO2 newTree = arTreeContractInitService.getTree(archiveTreeContracts);
 
         //todo 等测试OK再打开,wbs contract树有很多数据错乱节点。
 //		List<ArchiveTreeContract> addNodes = arTreeContractInitService.getContractProcExtNodes(tenantId,projectId,wbsId,newTree);
 //		archiveTreeContracts.addAll(addNodes);
 
-        //初始化祖先节点和排序
-        arTreeContractInitService.InitTreeSort(archiveTreeContracts, tree);
-        //todo 同步质检资料动态节点,处理文件提名
-
-        //todo 同步立卷规则
-
-        //todo 同步划分树节点到案卷列表
-        arTreeContractInitService.syncArchiveAutoList(archiveTreeContracts, contractInfoVOS);
-
-        this.saveBatch(archiveTreeContracts);
-        return true;
-    }
-
-
-    @Override
-    public List<ArchiveTreeContractVO> lazyTree(String tenantId, Long parentId, Long projectId) {
-        if (AuthUtil.isAdministrator()) {
-            tenantId = StringPool.EMPTY;
-        }
-        return ForestNodeMerger.merge(baseMapper.lazyTree(tenantId, parentId, projectId));
-    }
-
-    @Override
-    public List<ArchiveTreeContractVO> tree(String tenantId, Integer disPlayTree, Integer nodeType, Long projectId) {
-        return ForestNodeMerger.merge(baseMapper.tree(tenantId, disPlayTree, nodeType, projectId));
-    }
-
-    @Override
-    public List<ArchiveTreeContractVO2> lazyTree2(String tenantId, Long parentId, Long projectId, Long contractId) {
-        if (AuthUtil.isAdministrator()) {
-            tenantId = StringPool.EMPTY;
-        }
-        return ForestNodeMergerEx.merge(baseMapper.lazyTree2(tenantId, parentId, projectId, getAuthCode(contractId), getAuthContractId(contractId)));
-    }
-
-    @Override
-    public List<ArchiveTreeContractVO2> tree2(String tenantId, Integer disPlayTree, Integer nodeType, Long projectId, Long contractId) {
-
-        return ForestNodeMergerEx.merge(baseMapper.tree2(tenantId, disPlayTree, nodeType, projectId, getAuthCode(contractId), getAuthContractId(contractId)));
-    }
-
-    @Override
-    public List<ArchiveTreeContractVO2> tree2Root(String tenantId, Integer disPlayTree, Integer nodeType, Long projectId, Long contractId) {
-
-        return ForestNodeMergerEx.mergeOnlyRoot(baseMapper.tree2(tenantId, disPlayTree, nodeType, projectId, getAuthCode(contractId), getAuthContractId(contractId)));
-    }
-
-
-    @Override
-    public List<ArchiveTreeContract> selectByParentIdOrId(String id) {
-        return baseMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
-                .eq(ArchiveTreeContract::getId, id)
-                .or()
-                .eq(ArchiveTreeContract::getParentId, id)
-        );
-    }
-
-    @Override
-    public boolean submit(ArchiveTreeContractDTO archiveTreeContractDTO) {
-        if (Func.isEmpty(archiveTreeContractDTO.getParentId())) {
-            archiveTreeContractDTO.setTenantId(AuthUtil.getTenantId());
-            archiveTreeContractDTO.setParentId(BladeConstant.TOP_PARENT_ID);
-            archiveTreeContractDTO.setAncestors(String.valueOf(BladeConstant.TOP_PARENT_ID));
-        }
-        if (archiveTreeContractDTO.getParentId() > 0) {
-            ArchiveTreeContract parent = getById(archiveTreeContractDTO.getParentId());
-            if (Func.toLong(archiveTreeContractDTO.getParentId()) == Func.toLong(archiveTreeContractDTO.getId())) {
-                throw new ServiceException("父节点不可选择自身!");
-            }
-            archiveTreeContractDTO.setTenantId(parent.getTenantId());
-            String ancestors = parent.getAncestors() + StringPool.COMMA + archiveTreeContractDTO.getParentId();
-            archiveTreeContractDTO.setAncestors(ancestors);
-            archiveTreeContractDTO.setTreeSort(parent.getTreeSort());
-            archiveTreeContractDTO.setContractId(parent.getContractId());
-            archiveTreeContractDTO.setTreeCode(parent.getTreeCode());
-
-            archiveTreeContractDTO.setArchiveAutoNodeId(parent.getArchiveAutoNodeId());
-            archiveTreeContractDTO.setArchiveAutoType(parent.getArchiveAutoType());
-            archiveTreeContractDTO.setArchiveAutoGroupId(parent.getArchiveAutoGroupId());
-            archiveTreeContractDTO.setArchiveAutoGroupSelect(0);
-        }
-
-        archiveTreeContractDTO.setIsDeleted(BladeConstant.DB_NOT_DELETED);
-        archiveTreeContractDTO.setFullName(archiveTreeContractDTO.getNodeName());
-        if (archiveTreeContractDTO.getNodeType() == 1) {
-            archiveTreeContractDTO.setIsStorageNode(1);
-        }
-        if (archiveTreeContractDTO.getId() == null) {
-            List<ArchiveTreeContract> trees = baseMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
-                    .eq(ArchiveTreeContract::getParentId, archiveTreeContractDTO.getParentId())
-            );
-
-            List<ArchiveTreeContract> collect = trees.stream().filter(f -> {
-                if (f.getSort() == null) {
-                    f.setSort(0);
-                }
-                return true;
-            }).collect(Collectors.toList());
-            Optional<ArchiveTreeContract> max = collect.stream().max(Comparator.comparingInt(ArchiveTreeContract::getSort));
-            Integer sort = 0;
-            if (max.isPresent()) {
-                sort = max.get().getSort();
-            }
-            archiveTreeContractDTO.setSort(sort + 1);
-            String treeSort = archiveTreeContractDTO.getTreeSort();
-            if (StringUtils.isNotEmpty(treeSort)) {
-                treeSort = treeSort + 100 + archiveTreeContractDTO.getSort();
-                archiveTreeContractDTO.setTreeSort(treeSort);
-            }
-        }
-
-        return save(archiveTreeContractDTO);
-    }
-
-    @Override
-    public List<ArchiveTreeContract> getSameGradeNode(String id) {
-        ArchiveTreeContract archiveTree = baseMapper.selectById(id);
-        return baseMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
-                .eq(ArchiveTreeContract::getParentId, archiveTree.getParentId())
-                .orderByAsc(ArchiveTreeContract::getSort));
-    }
-
-
-    @Override
-    public boolean submitArchiveTreeSort(List<ArchiveTreeContractDTO> listSort) {
-        int sortNumber = 1;
-        List<ArchiveTreeContract> changeList = new ArrayList<>();
-
-
-        ArchiveTreeContract parent = null;
-        for (ArchiveTreeContractDTO archiveTreeSortDTO : listSort) {
-            if (archiveTreeSortDTO.getSort() != sortNumber) {
-                ArchiveTreeContract archiveTreeContract = getById(archiveTreeSortDTO.getId());
-                if (archiveTreeContract != null) {
-                    archiveTreeContract.setSort(sortNumber);
-                    if (parent == null) {
-                        parent = getById(archiveTreeSortDTO.getParentId());
-                    }
-                    if (parent != null && StringUtils.isNotEmpty(parent.getTreeSort())) {
-                        Integer sort = archiveTreeContract.getSort() + 100;
-                        archiveTreeContract.setTreeSort(parent.getTreeSort() + sort);
-                    }
-                    changeList.add(archiveTreeContract);
-                }
-            }
-            sortNumber++;
-        }
-
-        this.saveOrUpdateBatch(changeList);
-
-        //有子节点,并且父节点排序号不为空,则排序子节点
-        List<Long> changeIds = changeList.stream().map(s -> s.getId()).collect(Collectors.toList());
-
-        List<ArchiveTreeContract> childrens = baseMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
-                .in(ArchiveTreeContract::getParentId, changeIds)
-                .eq(ArchiveTreeContract::getIsDeleted, 0)
-        );
-        if (StringUtils.isNotEmpty(parent.getTreeSort()) &&
-                (childrens == null || childrens.size() == 0)) {
-            return true;
-        }
-
-        this.sortChildren(changeList);
-
-        return true;
-    }
-
-    @Override
-    public boolean submitDisplayConfigTree(String ids) {
-        if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isEmpty(ids)) {
-            baseMapper.updateBatch3();
-            return true;
-        }
-        List<ArchiveTreeContract> archiveTrees = baseMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
-                .eq(ArchiveTreeContract::getIsUploadFileDisplayConfigurationTree, 1));
-        String[] idList = ids.split(",");
-        List<String> idQ = Arrays.asList(idList);
-        List<String> idList1 = idQ.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
-        List<String> idList2 = new ArrayList<>();
-        archiveTrees.forEach(id -> {
-            idList2.add(String.valueOf(id.getId()));
-        });
-        List<String> diffRent = DiffListUtil.getDiffRent(idList1, idList2);
-        if (diffRent.size() == 0) {
-            return true;
-        } else {
-            int row;
-            if (idList1.size() > idList2.size()) {
-                row = baseMapper.updateBatch(diffRent);
-            } else {
-                row = baseMapper.updateBatch2(diffRent);
-            }
-            return row > 0;
-        }
-    }
-
-    /**
-     * 返回所属的合同段,没有则范围“”
-     *
-     * @return
-     */
-    public String getAuthContractId(Long contractId) {
-
-        BladeUser bladeUser = AuthUtil.getUser();
-
-        return contractId == null ? "" : contractId.toString();
-    }
-
-    /**
-     * 施工则返回“C”,监理则返回“S”,其他返回“”
-     *
-     * @return
-     */
-    public String getAuthCode(Long contractId) {
-        String code = "";
-        BladeUser bladeUser = AuthUtil.getUser();
-        if (AuthUtil.isAdministrator() || contractId == null) {
-            return code;
-        }
-
-        //查询合同段信息
-        ContractInfo contractInfo = contractInfoService.getById(contractId);
-        switch (contractInfo.getContractType()) {
-            case 2:
-                code = "S";
-                break;
-            case 3:
-                code = "";
-                break;
-            default:
-                code = "C";
-                break;
-        }
-
-        return code;
-    }
-
-    @Override
-    public List<ArchiveTreeContract> getArchiveTreeContractListByIds(String ids) {
-        List<String> idsList = Arrays.asList(ids.split(","));
-        return baseMapper.getArchiveTreeContractListByIds(idsList);
-    }
-
-    /**
-     * 同步项目级
-     *
-     * @param dstNode
-     * @return
-     */
-    public boolean syncProjectTree(ArchiveTreeContract dstNode) {
-        if (dstNode.getProjectId() == 0) {
-            return false;
-        }
-
-        //如果在合同段节点上点同步,它的fromId是没有的,需要取它的上级节点施工或者监理总节点来同步
-        ArchiveTree srcNode = null;
-        if (dstNode.isContractRoot() && dstNode.getFromId() == null) {
-            ArchiveTreeContract parentNode = this.getById(dstNode.getParentId());
-            if (parentNode != null) {
-                srcNode = archiveTreeService.getById(parentNode.getFromId());
-            }
-        } else {
-            srcNode = archiveTreeService.getById(dstNode.getFromId());
-        }
-
-        if (srcNode == null) {
-            return false;
-        }
-
-        //取出
-        List<ArchiveTreeVO2> srcTrees = archiveTreeService.tree2(AuthUtil.getTenantId(), dstNode.getProjectId(),
-                null, null, null, false);
-        ArchiveTreeVO2 srcTree = srcTrees.get(0);
-        if (srcTree == null) {
-            return false;
-        }
-        //先更新所有节点属性
+		//初始化祖先节点和排序
+		arTreeContractInitService.InitTreeSort(archiveTreeContracts,tree);
+		//todo 同步质检资料动态节点,处理文件提名
+
+		//todo 同步立卷规则
+
+		//todo 同步划分树节点到案卷列表
+		arTreeContractInitService.syncArchiveAutoList(archiveTreeContracts,contractInfoVOS);
+
+		this.saveBatch(archiveTreeContracts);
+		return true;
+	}
+
+
+	@Override
+	public List<ArchiveTreeContractVO> lazyTree(String tenantId, Long parentId,Long projectId) {
+		if (AuthUtil.isAdministrator()) {
+			tenantId = StringPool.EMPTY;
+		}
+		return ForestNodeMerger.merge(baseMapper.lazyTree(tenantId, parentId,projectId));
+	}
+
+	@Override
+	public List<ArchiveTreeContractVO> tree(String tenantId, Integer disPlayTree, Integer nodeType, Long projectId) {
+		return ForestNodeMerger.merge(baseMapper.tree(tenantId, disPlayTree, nodeType,projectId));
+	}
+
+	@Override
+	public List<ArchiveTreeContractVO2> lazyTree2(String tenantId, Long parentId, Long projectId, Long contractId) {
+		if (AuthUtil.isAdministrator()) {
+			tenantId = StringPool.EMPTY;
+		}
+		return ForestNodeMergerEx.merge(baseMapper.lazyTree2(tenantId, parentId,projectId,getAuthCode(contractId),getAuthContractId(contractId)));
+	}
+
+	@Override
+	public List<ArchiveTreeContractVO2> tree2(String tenantId, Integer disPlayTree, Integer nodeType, Long projectId, Long contractId) {
+
+		return ForestNodeMergerEx.merge(baseMapper.tree2(tenantId, disPlayTree, nodeType,projectId,getAuthCode(contractId),getAuthContractId(contractId)));
+	}
+
+	@Override
+	public List<ArchiveTreeContractVO2> tree2Root(String tenantId, Integer disPlayTree, Integer nodeType, Long projectId, Long contractId) {
+
+		return ForestNodeMergerEx.mergeOnlyRoot(baseMapper.tree2(tenantId, disPlayTree, nodeType,projectId,getAuthCode(contractId),getAuthContractId(contractId)));
+	}
+
+
+	@Override
+	public List<ArchiveTreeContract> selectByParentIdOrId(String id) {
+		return baseMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
+				.eq(ArchiveTreeContract::getId, id)
+				.or()
+				.eq(ArchiveTreeContract::getParentId, id)
+		);
+	}
+
+	@Override
+	public boolean submit(ArchiveTreeContractDTO archiveTreeContractDTO) {
+		if (Func.isEmpty(archiveTreeContractDTO.getParentId())) {
+			archiveTreeContractDTO.setTenantId(AuthUtil.getTenantId());
+			archiveTreeContractDTO.setParentId(BladeConstant.TOP_PARENT_ID);
+			archiveTreeContractDTO.setAncestors(String.valueOf(BladeConstant.TOP_PARENT_ID));
+		}
+		if (archiveTreeContractDTO.getParentId() > 0) {
+			ArchiveTreeContract parent = getById(archiveTreeContractDTO.getParentId());
+			if (Func.toLong(archiveTreeContractDTO.getParentId()) == Func.toLong(archiveTreeContractDTO.getId())) {
+				throw new ServiceException("父节点不可选择自身!");
+			}
+			archiveTreeContractDTO.setTenantId(parent.getTenantId());
+			String ancestors = parent.getAncestors() + StringPool.COMMA + archiveTreeContractDTO.getParentId();
+			archiveTreeContractDTO.setAncestors(ancestors);
+			archiveTreeContractDTO.setTreeSort(parent.getTreeSort());
+			archiveTreeContractDTO.setContractId(parent.getContractId());
+			archiveTreeContractDTO.setTreeCode(parent.getTreeCode());
+
+			archiveTreeContractDTO.setArchiveAutoNodeId(parent.getArchiveAutoNodeId());
+			archiveTreeContractDTO.setArchiveAutoType(parent.getArchiveAutoType());
+			archiveTreeContractDTO.setArchiveAutoGroupId(parent.getArchiveAutoGroupId());
+			archiveTreeContractDTO.setArchiveAutoGroupSelect(0);
+		}
+
+		archiveTreeContractDTO.setIsDeleted(BladeConstant.DB_NOT_DELETED);
+		archiveTreeContractDTO.setFullName(archiveTreeContractDTO.getNodeName());
+		if (archiveTreeContractDTO.getNodeType() == 1) {
+			archiveTreeContractDTO.setIsStorageNode(1);
+		}
+		if (archiveTreeContractDTO.getId() == null) {
+			List<ArchiveTreeContract> trees = baseMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
+					.eq(ArchiveTreeContract::getParentId, archiveTreeContractDTO.getParentId())
+			);
+
+			List<ArchiveTreeContract> collect = trees.stream().filter(f -> {
+				if (f.getSort() == null) {
+					f.setSort(0);
+				}
+				return true;
+			}).collect(Collectors.toList());
+			Optional<ArchiveTreeContract> max = collect.stream().max(Comparator.comparingInt(ArchiveTreeContract::getSort));
+			Integer sort = 0;
+			if (max.isPresent()) {
+				sort = max.get().getSort();
+			}
+			archiveTreeContractDTO.setSort(sort + 1);
+			String treeSort = archiveTreeContractDTO.getTreeSort();
+			if (StringUtils.isNotEmpty(treeSort)) {
+				treeSort = treeSort + 100 + archiveTreeContractDTO.getSort();
+				archiveTreeContractDTO.setTreeSort(treeSort);
+			}
+		}
+
+		return save(archiveTreeContractDTO);
+	}
+
+	@Override
+	public List<ArchiveTreeContract> getSameGradeNode(String id) {
+		ArchiveTreeContract archiveTree = baseMapper.selectById(id);
+		return baseMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
+				.eq(ArchiveTreeContract::getParentId, archiveTree.getParentId())
+				.orderByAsc(ArchiveTreeContract::getSort));
+	}
+
+
+	@Override
+	public boolean submitArchiveTreeSort(List<ArchiveTreeContractDTO> listSort) {
+		int sortNumber = 1;
+		List<ArchiveTreeContract> changeList = new ArrayList<>();
+
+
+		ArchiveTreeContract parent = null;
+		for (ArchiveTreeContractDTO archiveTreeSortDTO : listSort) {
+			if (archiveTreeSortDTO.getSort() != sortNumber) {
+				ArchiveTreeContract archiveTreeContract = getById(archiveTreeSortDTO.getId());
+				if (archiveTreeContract!= null ) {
+					archiveTreeContract.setSort(sortNumber);
+					if (parent == null ) {
+						parent = getById(archiveTreeSortDTO.getParentId());
+					}
+					if (parent != null  && StringUtils.isNotEmpty(parent.getTreeSort())){
+						Integer sort = archiveTreeContract.getSort() + 100;
+						archiveTreeContract.setTreeSort(parent.getTreeSort() + sort);
+					}
+					changeList.add(archiveTreeContract);
+				}
+			}
+			sortNumber++;
+		}
+
+		this.saveOrUpdateBatch(changeList);
+
+		//有子节点,并且父节点排序号不为空,则排序子节点
+		List<Long> changeIds = changeList.stream().map(s->s.getId()).collect(Collectors.toList());
+
+		List<ArchiveTreeContract> childrens =  baseMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
+					.in(ArchiveTreeContract::getParentId, changeIds)
+					.eq(ArchiveTreeContract::getIsDeleted, 0)
+			);
+		if (StringUtils.isNotEmpty(parent.getTreeSort()) &&
+				(childrens == null || childrens.size() == 0)) {
+			return true;
+		}
+
+		this.sortChildren(changeList);
+
+		return true;
+	}
+
+	@Override
+	public boolean submitDisplayConfigTree(String ids) {
+		if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isEmpty(ids)) {
+			baseMapper.updateBatch3();
+			return true;
+		}
+		List<ArchiveTreeContract> archiveTrees = baseMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
+				.eq(ArchiveTreeContract::getIsUploadFileDisplayConfigurationTree, 1));
+		String[] idList = ids.split(",");
+		List<String> idQ = Arrays.asList(idList);
+		List<String> idList1 = idQ.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
+		List<String> idList2 = new ArrayList<>();
+		archiveTrees.forEach(id -> {
+			idList2.add(String.valueOf(id.getId()));
+		});
+		List<String> diffRent = DiffListUtil.getDiffRent(idList1, idList2);
+		if (diffRent.size() == 0) {
+			return true;
+		} else {
+			int row;
+			if (idList1.size() > idList2.size()) {
+				row = baseMapper.updateBatch(diffRent);
+			} else {
+				row = baseMapper.updateBatch2(diffRent);
+			}
+			return row > 0;
+		}
+	}
+
+	/**
+	 * 返回所属的合同段,没有则范围“”
+	 * @return
+	 */
+	public String getAuthContractId(Long contractId) {
+
+		BladeUser bladeUser = AuthUtil.getUser();
+
+		return contractId == null?"":contractId.toString();
+	}
+
+	/**
+	 * 施工则返回“C”,监理则返回“S”,其他返回“”
+	 * @return
+	 */
+	public String getAuthCode(Long contractId) {
+		String code ="";
+		BladeUser bladeUser = AuthUtil.getUser();
+		if (AuthUtil.isAdministrator() || contractId == null) {
+			return code;
+		}
+
+		//查询合同段信息
+		ContractInfo contractInfo = contractInfoService.getById(contractId);
+		switch (contractInfo.getContractType()){
+			case 2:
+				code = "S";
+				break;
+			case 3:
+				code = "";
+				break;
+			default:
+				code = "C";
+				break;
+		}
+
+		return code;
+	}
+
+	@Override
+	public List<ArchiveTreeContract> getArchiveTreeContractListByIds(String ids) {
+		List<String> idsList = Arrays.asList(ids.split(","));
+		return baseMapper.getArchiveTreeContractListByIds(idsList);
+	}
+
+	/**
+	 *  同步项目级
+	 * @param dstNode
+	 * @return
+	 */
+	public boolean syncProjectTree(ArchiveTreeContract dstNode) {
+		if ( dstNode.getProjectId() == 0) {
+			return false;
+		}
+
+		//如果在合同段节点上点同步,它的fromId是没有的,需要取它的上级节点施工或者监理总节点来同步
+		ArchiveTree srcNode = null;
+		if (dstNode.isContractRoot() && dstNode.getFromId() == null ) {
+			ArchiveTreeContract parentNode = this.getById(dstNode.getParentId());
+			if (parentNode!= null) {
+				srcNode = archiveTreeService.getById(parentNode.getFromId());
+			}
+		}else {
+			srcNode = archiveTreeService.getById(dstNode.getFromId());
+		}
+
+		if (srcNode == null ) {
+			return false;
+		}
+
+		//取出
+		List<ArchiveTreeVO2> srcTrees = archiveTreeService.tree2(AuthUtil.getTenantId(), dstNode.getProjectId(),
+				null, null,null,false);
+		ArchiveTreeVO2 srcTree = srcTrees.get(0);
+		if (srcTree == null) {
+			return false;
+		}
+		//先更新所有节点属性
 //		ArchiveTreeVO2 subTree = ForestNodeMergerEx.getSubTree(srcTree,srcNode.getId());
 //		UpdateByArchiveTree(dstNode.getProjectId(),subTree);
 
 
-        List<ArchiveTreeContractVO2> dstTrees = this.tree2Root(AuthUtil.getTenantId(), null, null, dstNode.getProjectId(), null);
-        List<ArchiveTreeContract> saveList = new ArrayList<>();
-        List<ArchiveTreeContract> upList = new ArrayList<>();
-        List<ArchiveTreeContract> saveContractList = new ArrayList<>();
-        ArchiveTreeContractVO2 dstTree = dstTrees.get(0);
-        if (dstTree == null) {
-            return false;
-        }
-
-        List<ContractInfo> contractInfos = contractInfoService.selectContractInfoPageByPid(dstNode.getProjectId().toString());
-
-        boolean bHasContract = true;
-        if (contractInfos == null || contractInfos.size() == 0) {
-            bHasContract = false;
-        }
-
-        //看看有没有合同段要复制
-        if (bHasContract) {
-            addNewContract(contractInfos, srcTree, dstTree, dstNode, saveList);
-        }
-
-        if (dstNode.getId().equals(dstTree.getId())) {
-            addNewRootChild(contractInfos, srcTree, dstTree, dstNode, saveList);
-        }
-
-        //如果有新的合同段,合并新增代码到
-        if (saveList.size() > 0) {
-            archiveTreeContractSync.mergerToTree(dstTree, saveList, null);
-        }
-
-        //没有合同段直接同步
-        if (!bHasContract) {
-            saveList = archiveTreeContractSync.getNormalSaveListEx(srcNode.getId(),
-                    srcTrees.get(0), dstNode.getId(), dstTrees.get(0));
-        } else {
-
-            //同步业主,监理各个合同段,施工各个合同段
-            syncAllContracts(srcTree, dstTree, srcNode, dstNode, saveContractList);
-        }
-
-        //更新排序,把排序,自动组卷这种变化,刷新到新增节点和修改节点上
-        //archiveTreeContractSync.InitTreeSort(dstTree,saveContractList,upList,srcTrees);
-        saveList.addAll(saveContractList);
-        archiveTreeContractSync.InitTreeSort(dstTree, saveContractList, upList, srcTrees, saveList);
-
-        //同步生成案卷
-        arTreeContractInitService.syncArchiveAutoList(saveList, contractInfos);
-
-        this.saveBatch(saveList);
-        this.updateBatchById(upList);
-
-        return true;
-    }
-
-    /**
-     * 新增合同段时,要复制一份合同段的分支出来
-     *
-     * @param contractInfos
-     * @param srcTree
-     * @param dstTree
-     * @param dstNode
-     * @param saveList
-     */
-    void addNewContract(List<ContractInfo> contractInfos, ArchiveTreeVO2 srcTree, ArchiveTreeContractVO2 dstTree,
-                        ArchiveTreeContract dstNode, List<ArchiveTreeContract> saveList) {
-        Map<Long, ContractInfo> contractMap = new LinkedHashMap<>();
-
-        for (ContractInfo contractInfo : contractInfos) {
-            contractInfo.setStatus(0);
-            contractMap.put(contractInfo.getId(), contractInfo);
-        }
-
-        dstTree.setValue(1L);
-        for (ArchiveTreeContractVO2 ar : dstTree.getChildren()) {
-            //施工和监理
-            ar.setValue(1L);
-            if (ar.getTreeCode() != null && (
-                    ar.getTreeCode().equals("C") || ar.getTreeCode().equals("S"))) {
-
-                if (ar.getChildren() == null) {
-                    continue;
-                }
-
-                //处理合同节点
-                int contractNum = 0;
-                for (ArchiveTreeContractVO2 contractNode : ar.getChildren()) {
-                    if (contractNode.isContractRoot()) {
-                        //需要删除
-                        contractNum++;
-
-                        contractNode.setValue(1L);
-
-                        //设置哪个合同已经设置了。
-                        ContractInfo c = contractMap.get(Long.parseLong(contractNode.getTreeCode()));
-                        if (c != null) {
-                            c.setStatus(1);
-                        }
-                    }
-                }
-
-                if (contractNum == 0) {
-                    //删除树的子节点
-                    deleteTreeChildren(ar);
-                }
-
-                for (Map.Entry<Long, ContractInfo> entry : contractMap.entrySet()) {
-                    ContractInfo contractInfo = entry.getValue();
-
-                    if (contractInfo.getStatus() == 0) {
-                        if (ar.getTreeCode().equals("C") && contractInfo.getContractType() == 1) {
-                            //复制施工
-                            List<ArchiveTreeContract> tmpSaveList =
-                                    archiveTreeContractSync.getContractSaveList(srcTree, ar, contractInfo, dstNode);
-                            saveList.addAll(tmpSaveList);
-                        }
-                        if (ar.getTreeCode().equals("S") && contractInfo.getContractType() == 2) {
-                            //复制监理
-                            List<ArchiveTreeContract> tmpSaveList =
-                                    archiveTreeContractSync.getContractSaveList(srcTree, ar, contractInfo, dstNode);
-                            saveList.addAll(tmpSaveList);
-                        }
-                    }
-                }
-
-            }
-        }
-    }
-
-    /**
-     * 同步业主,监理各合同段,施工合同段,新增的普通节点,同步wbs节点
-     *
-     * @param srcTree
-     * @param dstTree
-     * @param srcNode
-     * @param dstNode
-     * @param saveList
-     */
-    void syncAllContracts(ArchiveTreeVO2 srcTree, ArchiveTreeContractVO2 dstTree, ArchiveTree srcNode,
-                          ArchiveTreeContract dstNode, List<ArchiveTreeContract> saveList) {
-
-        //获取范围看是在业主,监理各合同段,施工合同段,
-        ArchiveTreeContractVO2 dstScopeTree = ForestNodeMergerEx.getSubTreeByValue(dstTree, dstNode.getId(), 1L);
-        for (ArchiveTreeContractVO2 ar : dstTree.getChildren()) {
-            if (StringUtils.isEmpty(ar.getTreeCode())) {
-                //同步
-                if (dstNode.getParentId() == 0 || dstScopeTree.getId().equals(ar.getId())) {
-                    //同步
-                    List<ArchiveTreeContract> tmpSaveList = null;
-                    if (dstNode.getParentId() == 0) {
-                        ArchiveTreeVO2 tmpSubTree = ForestNodeMergerEx.getSubTree(srcTree, ar.getFromId());
-                        if (tmpSubTree == null) {
-                            continue;
-                        }
-                        tmpSaveList = archiveTreeContractSync.getNormalSaveListEx(tmpSubTree.getId(),
-                                tmpSubTree, ar.getId(), ar);
-                    } else {
-                        tmpSaveList = archiveTreeContractSync.getNormalSaveListEx(srcNode.getId(),
-                                srcTree, dstNode.getId(), ar);
-                    }
-
-                    saveList.addAll(tmpSaveList);
-                }
-            } else {
-                for (ArchiveTreeContractVO2 contractNode : ar.getChildren()) {
-
-                    List<ArchiveTreeContract> tmpSaveList = null;
-                    if (dstNode.getParentId() == 0 || dstScopeTree.getId().equals(contractNode.getId())
-                            || dstScopeTree.getId().equals(contractNode.getParentId())) {
-
-                        ArchiveTreeVO2 tmpSubTree = srcTree;
-                        Long dstNodeId = dstNode.getId();
-                        if (dstNode.getParentId() == 0 || dstScopeTree.getId().equals(contractNode.getParentId())) {
-                            tmpSubTree = ForestNodeMergerEx.getSubTree(srcTree, ar.getFromId());
-                            dstNodeId = contractNode.getId();
-                        }
-                        if (tmpSubTree == null) {
-                            continue;
-                        }
-
-                        //getNormalSaveList 接口除了同步新增节点,还会同步已有节点的属性。
-                        //因为关联工序的位置是固定的,先不考虑新增一个关联工序节点,且一次同步完成情况
-                        tmpSaveList = archiveTreeContractSync.getNormalSaveListEx(srcNode.getId(),
-                                tmpSubTree, dstNodeId, contractNode);
-                        saveList.addAll(tmpSaveList);
-
-                        //获取工序节点
-                        List<ArchiveTreeContract> extSaveList = archiveTreeContractSync.getExtSaveList(dstNodeId,
-                                contractNode, dstNode.getProjectId());
-                        saveList.addAll(extSaveList);
-
-
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * 删除树的所有子节点
-     *
-     * @param tree
-     * @return
-     */
-    public boolean deleteTreeChildren(ArchiveTreeContractVO2 tree) {
-
-        List<Long> ids = ForestNodeMergerEx.getChildrenIds(tree);
-
-        return this.deleteLogic(ids);
-    }
-
-    /**
-     * 同步修改
-     *
-     * @param archiveTree
-     * @return
-     */
-    public boolean UpdateByArchiveTree(ArchiveTree archiveTree) {
-
-        List<ArchiveTreeContract> archiveTreeContracts = baseMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
-                .eq(ArchiveTreeContract::getFromId, archiveTree.getId())
-                .eq(ArchiveTreeContract::getProjectId, archiveTree.getProjectId())
-                .eq(ArchiveTreeContract::getIsDeleted, 0)
-        );
-
-        for (ArchiveTreeContract archiveTreeContract : archiveTreeContracts) {
-            archiveTreeContract.sync(archiveTree);
-        }
-
-        this.saveOrUpdateBatch(archiveTreeContracts);
-        return true;
-    }
-
-
-    /**
-     * 删除子树
-     *
-     * @param id
-     * @return
-     */
-    public boolean deleteTree(Long id) {
-        ArchiveTreeContract dstNode = this.getById(id);
-        if (dstNode == null) {
-            return false;
-        }
-
-        List<ArchiveTreeContractVO2> dstTrees = this.tree2Root(AuthUtil.getTenantId(), null, null, dstNode.getProjectId(), null);
-        if (dstTrees == null || dstTrees.size() == 0) {
-            return false;
-        }
-
-        ArchiveTreeContractVO2 subTree = ForestNodeMergerEx.getSubTree(dstTrees.get(0), id);
-
-        List<Long> ids = ForestNodeMergerEx.getChildrenIds(subTree);
-
-        ids.add(id);
-
-        return this.deleteLogic(ids);
-    }
-
-
-    /**
-     * 批量更新
-     *
-     * @param projectId
-     * @param srcTree
-     * @return
-     */
-    public boolean UpdateByArchiveTree(Long projectId, ArchiveTreeVO2 srcTree) {
-
-        List<Long> ids = new ArrayList<>();
-        List<ArchiveTreeVO2> archiveTreeVO2List = new ArrayList<>();
-
-        ForestNodeMergerEx.getTreeList(srcTree, archiveTreeVO2List);
-        ids = ForestNodeMergerEx.getChildrenIds(srcTree);
-
-        Map<Long, ArchiveTreeVO2> map = new LinkedHashMap<>();
-        for (ArchiveTreeVO2 ar : archiveTreeVO2List) {
-            map.put(ar.getId(), ar);
-        }
-
-        List<ArchiveTreeContract> archiveTreeContracts = baseMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
-                .in(ArchiveTreeContract::getFromId, ids)
-                .eq(ArchiveTreeContract::getProjectId, projectId)
-                .eq(ArchiveTreeContract::getIsDeleted, 0)
-        );
-
-        List<ArchiveTreeContract> upList = new ArrayList<>();
-        for (ArchiveTreeContract archiveTreeContract : archiveTreeContracts) {
-            ArchiveTreeVO2 archiveTreeVO2 = map.get(archiveTreeContract.getFromId());
-            if (archiveTreeVO2 != null) {
-                archiveTreeContract.sync(archiveTreeVO2);
-                upList.add(archiveTreeContract);
-            }
-
-        }
-        this.saveOrUpdateBatch(upList);
-        return true;
-    }
-
-
-    /**
-     * 递归设置
-     *
-     * @param archiveTreeContracts
-     */
-    void sortChildren(List<ArchiveTreeContract> archiveTreeContracts) {
-
-        if (archiveTreeContracts == null || archiveTreeContracts.size() == 0) {
-            return;
-        }
-
-        List<ArchiveTreeContractVO2> trees = this.tree2Root(AuthUtil.getTenantId(), null, null, archiveTreeContracts.get(0).getProjectId(), null);
-        if (trees.size() == 0) {
-            return;
-        }
-        ArchiveTreeContractVO2 tree = trees.get(0);
-
-        ForestNodeMergerEx.InitTreeSort(tree, "", 0);
-
-        List<ArchiveTreeContractVO2> changeList = new ArrayList<>();
-
-        for (ArchiveTreeContract ar : archiveTreeContracts) {
-            ArchiveTreeContractVO2 subTree = ForestNodeMergerEx.getSubTree(tree, ar.getId());
-            List<ArchiveTreeContractVO2> tmpList = new ArrayList<>();
-            ForestNodeMergerEx.getTreeList(subTree, tmpList);
-            changeList.addAll(tmpList);
-        }
-
-        Map<Long, ArchiveTreeContractVO2> map = new HashMap<>();
-        List<Long> ids = new ArrayList<>();
-        for (ArchiveTreeContractVO2 ar : changeList) {
-            ids.add(ar.getId());
-            map.put(ar.getId(), ar);
-        }
-
-        List<ArchiveTreeContract> changeArchiveList = baseMapper.selectBatchIds(ids);
-        for (ArchiveTreeContract changeNode : changeArchiveList) {
-            ArchiveTreeContractVO2 ar = map.get(changeNode.getId());
-            if (ar != null) {
-                changeNode.setTreeSort(ar.getTreeSort());
-            }
-        }
-        this.saveOrUpdateBatch(changeArchiveList);
-    }
-
-    /**
-     * 补充默认的组卷信息
-     *
-     * @param trees
-     * @param projectId
-     */
-    public void fillDefaultArchiveAutoInfo(List<ArchiveTreeContractVO2> trees, Long projectId) {
-
-        List<ContractInfo> contractInfos = contractInfoService.selectContractInfoPageByPid(projectId.toString());
-        if (contractInfos == null || contractInfos.size() == 0) {
-            return;
-        }
-        Map<Long, ContractInfo> contractMap = new LinkedHashMap<>();
-        for (ContractInfo contractInfo : contractInfos) {
-            if (contractInfo.getContractType() == 3) {
-                contractMap.put(0L, contractInfo);
-            }
-            contractMap.put(contractInfo.getId(), contractInfo);
-        }
-
-        for (ArchiveTreeContractVO2 child : trees) {
-            Long contractId = 0L;
-            if (child.getContractId() != null) {
-                contractId = child.getContractId();
-            }
-            ContractInfo contractInfo = contractMap.get(contractId);
-            if (contractInfo != null) {
-                fillDefaultArchiveAutoInfo(child, contractInfo);
-            }
-        }
-
-    }
-
-
-    /**
-     * @param node
-     * @param contractInfo
-     */
-    public void fillDefaultArchiveAutoInfo(ArchiveTreeContractVO2 node, ContractInfo contractInfo) {
-        if (StringUtils.isEmpty(node.getFileNumberPrefix())) {
-            node.setFileNumberPrefix(contractInfo.getPrefix());
-        }
-        if (StringUtils.isEmpty(node.getStorageTime()) && contractInfo.getStoragePeriod() != null) {
-            node.setStorageTime(contractInfo.getStoragePeriod().toString());
-        }
-        if (StringUtils.isEmpty(node.getRollor())) {
-            node.setRollor(contractInfo.getFiler());
-        }
-        if (StringUtils.isEmpty(node.getReviewer())) {
-            node.setReviewer(contractInfo.getReviewer());
-        }
-        if (StringUtils.isEmpty(node.getSpecification())) {
-            //默认30mm ,对应枚举 1
-            node.setSpecification("1");
-        }
-        //没有默认
-        if (StringUtils.isEmpty(node.getArchiveNameSuffix())) {
-            //node.setArchiveNameSuffix(contractInfo.getPrefix());
-        }
-    }
-
-    /**
-     * 填充基本信息
-     *
-     * @param archiveTreeContracts
-     */
-    public void fillDefaultArchiveAutoInfo(List<ArchiveTreeContract> archiveTreeContracts) {
-        Long projectId = archiveTreeContracts.get(0).getProjectId();
-        List<ContractInfo> contractInfos = contractInfoService.selectContractInfoPageByPid(projectId.toString());
-        if (contractInfos == null || contractInfos.size() == 0) {
-            return;
-        }
-        Map<Long, ContractInfo> contractMap = new LinkedHashMap<>();
-        for (ContractInfo contractInfo : contractInfos) {
-            if (contractInfo.getContractType() == 3) {
-                contractMap.put(0L, contractInfo);
-            }
-            contractMap.put(contractInfo.getId(), contractInfo);
-        }
-
-        for (ArchiveTreeContract node : archiveTreeContracts) {
-            Long contractId = 0L;
-            if (node.getContractId() != null) {
-                contractId = node.getContractId();
-            }
-            ContractInfo contractInfo = contractMap.get(contractId);
-            if (contractInfo != null) {
-                if (StringUtils.isEmpty(node.getFileNumberPrefix())) {
-                    node.setFileNumberPrefix(contractInfo.getPrefix());
-                }
-                if (StringUtils.isEmpty(node.getStorageTime()) && contractInfo.getStoragePeriod() != null) {
-                    node.setStorageTime(contractInfo.getStoragePeriod().toString());
-                }
-                if (StringUtils.isEmpty(node.getRollor())) {
-                    node.setRollor(contractInfo.getFiler());
-                }
-                if (StringUtils.isEmpty(node.getReviewer())) {
-                    node.setReviewer(contractInfo.getReviewer());
-                }
-                if (StringUtils.isEmpty(node.getSpecification())) {
-                    //默认30mm ,对应枚举 1
-                    node.setSpecification("30");
-                }
-                //没有默认
-                if (StringUtils.isEmpty(node.getArchiveNameSuffix())) {
-                    //node.setArchiveNameSuffix(contractInfo.getPrefix());
-                }
-            }
-        }
-    }
-
-    @Override
-    public List<Map<String, Object>> getArchiveTreeAndArchiveCount(Long projectId, Long nodeId) {
-        return baseMapper.getArchiveTreeAndArchiveCount(projectId, nodeId);
-    }
-
-    /**
-     * 档案查询,目录树,根据类型获取目录
-     *
-     * @param projectId
-     * @param contractId
-     * @param nodeType
-     * @return
-     */
-    @Override
-    public List<ArchiveTreeContractVO3> getArchiveTreeByNodeType(Long projectId, Long contractId, Integer nodeType) {
-        //获取合同段类型
-        ContractInfo contractInfo = contractInfoService.selectById(contractId + "");
-        Integer contractType = contractInfo.getContractType();
-        //根据用户在当前合同段的权限,判断返回
-        BladeUser user = AuthUtil.getUser();
-        String name = baseMapper.getUserRoleName(projectId, contractId, user.getUserId());
-        if (name.contains("超级管理员") || contractType == 3) {
-            //
-            if (nodeType == 1) {
-                return baseMapper.getArchiveTreeByNodeType2(projectId);
-            } else if (nodeType == 2) {
-                return baseMapper.getArchiveTreeByNodeType(projectId, null, "C");
-            } else if (nodeType == 3) {
-                return baseMapper.getArchiveTreeByNodeType(projectId, null, "S");
-            } else {
-                return null;
-            }
-        } else {
-            //只返回当前合同段
-            if (contractType == 1 && nodeType == 2) {
-                return baseMapper.getArchiveTreeByNodeType(projectId, contractId, "C");
-            } else if (contractType == 2 && nodeType == 3) {
-                return baseMapper.getArchiveTreeByNodeType(projectId, contractId, "S");
-            } else {
-                return null;
-            }
-        }
-    }
-
-    @Override
-    public List<ArchiveTreeContractVO3> getChildrenNodeByNodeId(Long nodeId) {
-        return baseMapper.getChildrenNodeByNodeId(nodeId);
-    }
-
-
-    /**
-     * 新增合同段时,要复制一份合同段的分支出来
-     *
-     * @param contractInfos
-     * @param srcTree
-     * @param dstTree
-     * @param dstNode
-     * @param saveList
-     */
-    void addNewRootChild(List<ContractInfo> contractInfos, ArchiveTreeVO2 srcTree, ArchiveTreeContractVO2 dstTree,
-                         ArchiveTreeContract dstNode, List<ArchiveTreeContract> saveList) {
-
-        //
-        List<ArchiveTreeVO2> srcChilds = srcTree.getChildren();
-        List<ArchiveTreeContractVO2> dstChilds = dstTree.getChildren();
-        Map<Long, Long> dstMap = new HashMap<>();
-
-        for (ArchiveTreeContractVO2 dst : dstChilds) {
-            if (dst.getFromId() != null) {
-                dstMap.put(dst.getFromId(), dst.getId());
-            }
-        }
-
-        for (ArchiveTreeVO2 src : srcChilds) {
-            if (dstMap.get(src.getId()) == null) {
-                List<ArchiveTreeContract> tmpSaveList = archiveTreeContractSync.getNormalSaveListEx(src.getId(), src, dstNode.getId(), dstTree);
-                saveList.addAll(tmpSaveList);
-            }
-        }
-
-    }
+		List<ArchiveTreeContractVO2> dstTrees = this.tree2Root(AuthUtil.getTenantId(),null,null,dstNode.getProjectId(),null);
+		List<ArchiveTreeContract> saveList = new ArrayList<>();
+		List<ArchiveTreeContract> upList = new ArrayList<>();
+		List<ArchiveTreeContract> saveContractList = new ArrayList<>();
+		ArchiveTreeContractVO2 dstTree = dstTrees.get(0);
+		if (dstTree == null ) {
+			return false;
+		}
+
+		List<ContractInfo> contractInfos = contractInfoService.selectContractInfoPageByPid(dstNode.getProjectId().toString());
+
+		boolean bHasContract = true;
+		if (contractInfos == null || contractInfos.size() == 0) {
+			bHasContract = false;
+		}
+
+		//看看有没有合同段要复制
+		if (bHasContract) {
+			addNewContract(contractInfos,srcTree,dstTree,dstNode,saveList);
+		}
+
+		if (dstNode.getId().equals(dstTree.getId())) {
+			addNewRootChild(contractInfos,srcTree,dstTree,dstNode,saveList);
+		}
+
+		//如果有新的合同段,合并新增代码到
+		if (saveList.size() > 0) {
+			archiveTreeContractSync.mergerToTree(dstTree,saveList,null);
+		}
+
+		//没有合同段直接同步
+		if (!bHasContract) {
+			saveList = archiveTreeContractSync.getNormalSaveListEx(srcNode.getId(),
+					srcTrees.get(0),dstNode.getId(),dstTrees.get(0));
+		}else {
+
+			//同步业主,监理各个合同段,施工各个合同段
+			syncAllContracts(srcTree,dstTree,srcNode,dstNode,saveContractList);
+		}
+
+		//更新排序,把排序,自动组卷这种变化,刷新到新增节点和修改节点上
+		//archiveTreeContractSync.InitTreeSort(dstTree,saveContractList,upList,srcTrees);
+		saveList.addAll(saveContractList);
+		archiveTreeContractSync.InitTreeSort(dstTree,saveContractList,upList,srcTrees,saveList);
+
+		//同步生成案卷
+		arTreeContractInitService.syncArchiveAutoList(saveList,contractInfos);
+
+		this.saveBatch(saveList);
+		this.updateBatchById(upList);
+
+		return true;
+	}
+
+	/**
+	 * 新增合同段时,要复制一份合同段的分支出来
+	 * @param contractInfos
+	 * @param srcTree
+	 * @param dstTree
+	 * @param dstNode
+	 * @param saveList
+	 */
+	void addNewContract(List<ContractInfo> contractInfos,ArchiveTreeVO2 srcTree,ArchiveTreeContractVO2 dstTree,
+						   ArchiveTreeContract dstNode,List<ArchiveTreeContract> saveList){
+		Map<Long,ContractInfo> contractMap = new LinkedHashMap<>();
+
+		for (ContractInfo contractInfo: contractInfos) {
+			contractInfo.setStatus(0);
+			contractMap.put(contractInfo.getId(),contractInfo);
+		}
+
+		dstTree.setValue(1L);
+		for (ArchiveTreeContractVO2 ar: dstTree.getChildren()) {
+			//施工和监理
+			ar.setValue(1L);
+			if (ar.getTreeCode()!= null && (
+					ar.getTreeCode().equals("C") || ar.getTreeCode().equals("S"))) {
+
+				if (ar.getChildren() == null ) {
+					continue;
+				}
+
+				//处理合同节点
+				int contractNum = 0;
+				for (ArchiveTreeContractVO2 contractNode : ar.getChildren()) {
+					if (contractNode.isContractRoot()){
+						//需要删除
+						contractNum++;
+
+						contractNode.setValue(1L);
+
+						//设置哪个合同已经设置了。
+						ContractInfo c = contractMap.get(Long.parseLong(contractNode.getTreeCode()));
+						if (c!= null) {
+							c.setStatus(1);
+						}
+					}
+				}
+
+				if (contractNum == 0) {
+					//删除树的子节点
+					deleteTreeChildren(ar);
+				}
+
+				for(Map.Entry<Long,ContractInfo> entry : contractMap.entrySet()){
+					ContractInfo contractInfo = entry.getValue();
+
+					if (contractInfo.getStatus() == 0) {
+						if (ar.getTreeCode().equals("C") && contractInfo.getContractType() == 1) {
+							//复制施工
+							List<ArchiveTreeContract> tmpSaveList =
+									archiveTreeContractSync.getContractSaveList(srcTree,ar,contractInfo,dstNode);
+							saveList.addAll(tmpSaveList);
+						}
+						if (ar.getTreeCode().equals("S") && contractInfo.getContractType() == 2) {
+							//复制监理
+							List<ArchiveTreeContract> tmpSaveList =
+									archiveTreeContractSync.getContractSaveList(srcTree,ar,contractInfo,dstNode);
+							saveList.addAll(tmpSaveList);
+						}
+					}
+				}
+
+			}
+		}
+	}
+
+	/**
+	 * 同步业主,监理各合同段,施工合同段,新增的普通节点,同步wbs节点
+	 * @param srcTree
+	 * @param dstTree
+	 * @param srcNode
+	 * @param dstNode
+	 * @param saveList
+	 */
+	void syncAllContracts(ArchiveTreeVO2 srcTree,ArchiveTreeContractVO2 dstTree,ArchiveTree srcNode,
+						  ArchiveTreeContract dstNode,List<ArchiveTreeContract> saveList){
+
+		//获取范围看是在业主,监理各合同段,施工合同段,
+		ArchiveTreeContractVO2 dstScopeTree = ForestNodeMergerEx.getSubTreeByValue(dstTree,dstNode.getId(),1L);
+		for (ArchiveTreeContractVO2 ar: dstTree.getChildren()) {
+			if (StringUtils.isEmpty(ar.getTreeCode())) {
+				//同步
+				if (dstNode.getParentId() == 0 || dstScopeTree.getId().equals(ar.getId()) ) {
+					//同步
+					List<ArchiveTreeContract> tmpSaveList = null;
+					if (dstNode.getParentId() == 0) {
+						ArchiveTreeVO2 tmpSubTree = ForestNodeMergerEx.getSubTree(srcTree,ar.getFromId());
+						if (tmpSubTree == null) {
+							continue;
+						}
+						tmpSaveList = archiveTreeContractSync.getNormalSaveListEx(tmpSubTree.getId(),
+								tmpSubTree,ar.getId(),ar);
+					}else {
+						tmpSaveList = archiveTreeContractSync.getNormalSaveListEx(srcNode.getId(),
+								srcTree,dstNode.getId(),ar);
+					}
+
+					saveList.addAll(tmpSaveList);
+				}
+			}else {
+				for (ArchiveTreeContractVO2 contractNode : ar.getChildren()){
+
+					List<ArchiveTreeContract> tmpSaveList = null;
+					if (dstNode.getParentId() == 0 || dstScopeTree.getId().equals(contractNode.getId())
+							|| dstScopeTree.getId().equals(contractNode.getParentId())) {
+
+						ArchiveTreeVO2 tmpSubTree = srcTree;
+						Long dstNodeId = dstNode.getId();
+						if (dstNode.getParentId() == 0 ||  dstScopeTree.getId().equals(contractNode.getParentId()) ) {
+							tmpSubTree = ForestNodeMergerEx.getSubTree(srcTree,ar.getFromId());
+							dstNodeId = contractNode.getId();
+						}
+						if (tmpSubTree == null) {
+							continue;
+						}
+
+						//getNormalSaveList 接口除了同步新增节点,还会同步已有节点的属性。
+						//因为关联工序的位置是固定的,先不考虑新增一个关联工序节点,且一次同步完成情况
+						tmpSaveList = archiveTreeContractSync.getNormalSaveListEx(srcNode.getId(),
+								tmpSubTree,dstNodeId,contractNode);
+						saveList.addAll(tmpSaveList);
+
+						//获取工序节点
+						List<ArchiveTreeContract> extSaveList = archiveTreeContractSync.getExtSaveList(dstNodeId,
+								contractNode,dstNode.getProjectId());
+						saveList.addAll(extSaveList);
+
+
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * 删除树的所有子节点
+	 * @param tree
+	 * @return
+	 */
+	public  boolean deleteTreeChildren(ArchiveTreeContractVO2 tree) {
+
+		List<Long> ids = ForestNodeMergerEx.getChildrenIds(tree);
+
+		return this.deleteLogic(ids);
+	}
+
+	/**
+	 * 同步修改
+	 * @param archiveTree
+	 * @return
+	 */
+	public boolean UpdateByArchiveTree(ArchiveTree archiveTree){
+
+		List<ArchiveTreeContract> archiveTreeContracts =  baseMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
+				.eq(ArchiveTreeContract::getFromId, archiveTree.getId())
+				.eq(ArchiveTreeContract::getProjectId, archiveTree.getProjectId())
+				.eq(ArchiveTreeContract::getIsDeleted, 0)
+		);
+
+		for (ArchiveTreeContract archiveTreeContract : archiveTreeContracts) {
+			archiveTreeContract.sync(archiveTree);
+		}
+
+		this.saveOrUpdateBatch(archiveTreeContracts);
+		return true;
+	}
+
+
+	/**
+	 * 删除子树
+	 * @param id
+	 * @return
+	 */
+	public  boolean deleteTree(Long id) {
+		ArchiveTreeContract dstNode = this.getById(id);
+		if (dstNode == null ) {
+			return false;
+		}
+
+		List<ArchiveTreeContractVO2> dstTrees = this.tree2Root(AuthUtil.getTenantId(),null,null,dstNode.getProjectId(),null);
+		if (dstTrees == null || dstTrees.size() == 0) {
+			return false;
+		}
+
+		ArchiveTreeContractVO2 subTree = ForestNodeMergerEx.getSubTree(dstTrees.get(0),id);
+
+		List<Long> ids = ForestNodeMergerEx.getChildrenIds(subTree);
+
+		ids.add(id);
+
+		return this.deleteLogic(ids);
+	}
+
+
+	/**
+	 * 批量更新
+	 * @param projectId
+	 * @param srcTree
+	 * @return
+	 */
+	public boolean UpdateByArchiveTree(Long projectId, ArchiveTreeVO2 srcTree){
+
+		List<Long> ids = new ArrayList<>();
+		List<ArchiveTreeVO2> archiveTreeVO2List = new ArrayList<>();
+
+		ForestNodeMergerEx.getTreeList(srcTree,archiveTreeVO2List);
+		ids = ForestNodeMergerEx.getChildrenIds(srcTree);
+
+		Map<Long, ArchiveTreeVO2> map = new LinkedHashMap<>();
+		for (ArchiveTreeVO2 ar : archiveTreeVO2List) {
+			map.put(ar.getId(),ar);
+		}
+
+		List<ArchiveTreeContract> archiveTreeContracts =  baseMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
+				.in(ArchiveTreeContract::getFromId, ids)
+				.eq(ArchiveTreeContract::getProjectId, projectId)
+				.eq(ArchiveTreeContract::getIsDeleted, 0)
+		);
+
+		List<ArchiveTreeContract> upList = new ArrayList<>();
+		for (ArchiveTreeContract archiveTreeContract : archiveTreeContracts) {
+			ArchiveTreeVO2 archiveTreeVO2 = map.get(archiveTreeContract.getFromId());
+			if (archiveTreeVO2!= null) {
+				archiveTreeContract.sync(archiveTreeVO2);
+				upList.add(archiveTreeContract);
+			}
+
+		}
+		this.saveOrUpdateBatch(upList);
+		return true;
+	}
+
+
+	/**
+	 * 递归设置
+	 * @param archiveTreeContracts
+	 */
+	void sortChildren(List<ArchiveTreeContract> archiveTreeContracts){
+
+		if (archiveTreeContracts == null || archiveTreeContracts.size() == 0) {
+			return;
+		}
+
+		List<ArchiveTreeContractVO2> trees = this.tree2Root(AuthUtil.getTenantId(),null,null,archiveTreeContracts.get(0).getProjectId(),null);
+		if (trees.size() == 0) {
+			return;
+		}
+		ArchiveTreeContractVO2  tree = trees.get(0);
+
+		ForestNodeMergerEx.InitTreeSort(tree,"",0);
+
+		List<ArchiveTreeContractVO2> changeList = new ArrayList<>();
+
+		for (ArchiveTreeContract ar:  archiveTreeContracts) {
+			ArchiveTreeContractVO2 subTree = ForestNodeMergerEx.getSubTree(tree,ar.getId());
+			List<ArchiveTreeContractVO2> tmpList = new ArrayList<>();
+			ForestNodeMergerEx.getTreeList(subTree,tmpList);
+			changeList.addAll(tmpList);
+		}
+
+		Map<Long,ArchiveTreeContractVO2>  map = new HashMap<>();
+		List<Long> ids = new ArrayList<>();
+		for (ArchiveTreeContractVO2 ar : changeList) {
+			ids.add(ar.getId());
+			map.put(ar.getId(),ar);
+		}
+
+		List<ArchiveTreeContract> changeArchiveList = baseMapper.selectBatchIds(ids);
+		for (ArchiveTreeContract changeNode: changeArchiveList) {
+			ArchiveTreeContractVO2 ar = map.get(changeNode.getId());
+			if (ar!= null ){
+				changeNode.setTreeSort(ar.getTreeSort());
+			}
+		}
+		this.saveOrUpdateBatch(changeArchiveList);
+	}
+
+	/**
+	 * 补充默认的组卷信息
+	 * @param trees
+	 * @param projectId
+	 */
+	public  void  fillDefaultArchiveAutoInfo(List<ArchiveTreeContractVO2> trees,Long projectId){
+
+		List<ContractInfo> contractInfos = contractInfoService.selectContractInfoPageByPid(projectId.toString());
+		if (contractInfos == null || contractInfos.size() == 0) {
+			return;
+		}
+		Map<Long,ContractInfo> contractMap = new LinkedHashMap<>();
+		for (ContractInfo contractInfo: contractInfos) {
+			if (contractInfo.getContractType() == 3) {
+				contractMap.put(0L,contractInfo);
+			}
+			contractMap.put(contractInfo.getId(),contractInfo);
+		}
+
+		for (ArchiveTreeContractVO2 child: trees) {
+			Long contractId = 0L;
+			if (child.getContractId() != null ) {
+				contractId = child.getContractId();
+			}
+			ContractInfo contractInfo = contractMap.get(contractId);
+			if (contractInfo != null) {
+				fillDefaultArchiveAutoInfo(child,contractInfo);
+			}
+		}
+
+	}
+
+
+	/**
+	 *
+	 * @param node
+	 * @param contractInfo
+	 */
+	public  void  fillDefaultArchiveAutoInfo(ArchiveTreeContractVO2 node,ContractInfo contractInfo){
+		if (StringUtils.isEmpty(node.getFileNumberPrefix())) {
+			node.setFileNumberPrefix(contractInfo.getPrefix());
+		}
+		if (StringUtils.isEmpty(node.getStorageTime()) && contractInfo.getStoragePeriod() != null) {
+			node.setStorageTime(contractInfo.getStoragePeriod().toString());
+		}
+		if (StringUtils.isEmpty(node.getRollor())) {
+			node.setRollor(contractInfo.getFiler());
+		}
+		if (StringUtils.isEmpty(node.getReviewer())) {
+			node.setReviewer(contractInfo.getReviewer());
+		}
+		if (StringUtils.isEmpty(node.getSpecification())) {
+			//默认30mm ,对应枚举 1
+			node.setSpecification("30");
+		}
+		//没有默认
+		if (StringUtils.isEmpty(node.getArchiveNameSuffix())) {
+			//node.setArchiveNameSuffix(contractInfo.getPrefix());
+		}
+	}
+
+	/**
+	 * 填充基本信息
+	 * @param archiveTreeContracts
+	 */
+	public  void  fillDefaultArchiveAutoInfo(List<ArchiveTreeContract> archiveTreeContracts){
+		Long projectId = archiveTreeContracts.get(0).getProjectId();
+		List<ContractInfo> contractInfos = contractInfoService.selectContractInfoPageByPid(projectId.toString());
+		if (contractInfos == null || contractInfos.size() == 0) {
+			return;
+		}
+		Map<Long,ContractInfo> contractMap = new LinkedHashMap<>();
+		for (ContractInfo contractInfo: contractInfos) {
+			if (contractInfo.getContractType() == 3) {
+				contractMap.put(0L,contractInfo);
+			}
+			contractMap.put(contractInfo.getId(),contractInfo);
+		}
+
+		for (ArchiveTreeContract node: archiveTreeContracts) {
+			Long contractId = 0L;
+			if (node.getContractId() != null ) {
+				contractId = node.getContractId();
+			}
+			ContractInfo contractInfo = contractMap.get(contractId);
+			if (contractInfo != null) {
+				if (StringUtils.isEmpty(node.getFileNumberPrefix())) {
+					node.setFileNumberPrefix(contractInfo.getPrefix());
+				}
+				if (StringUtils.isEmpty(node.getStorageTime()) && contractInfo.getStoragePeriod() != null) {
+					node.setStorageTime(contractInfo.getStoragePeriod().toString());
+				}
+				if (StringUtils.isEmpty(node.getRollor())) {
+					node.setRollor(contractInfo.getFiler());
+				}
+				if (StringUtils.isEmpty(node.getReviewer())) {
+					node.setReviewer(contractInfo.getReviewer());
+				}
+				if (StringUtils.isEmpty(node.getSpecification())) {
+					//默认30mm ,对应枚举 1
+					node.setSpecification("30");
+				}
+				//没有默认
+				if (StringUtils.isEmpty(node.getArchiveNameSuffix())) {
+					//node.setArchiveNameSuffix(contractInfo.getPrefix());
+				}
+			}
+		}
+	}
+
+	@Override
+	public List<Map<String, Object>> getArchiveTreeAndArchiveCount(Long projectId,Long nodeId) {
+		return baseMapper.getArchiveTreeAndArchiveCount(projectId,nodeId);
+	}
+
+	/**
+	 * 档案查询,目录树,根据类型获取目录
+	 * @param projectId
+	 * @param contractId
+	 * @param nodeType
+	 * @return
+	 */
+	@Override
+	public List<ArchiveTreeContractVO3> getArchiveTreeByNodeType(Long projectId, Long contractId,Integer nodeType) {
+		//获取合同段类型
+		ContractInfo contractInfo = contractInfoService.selectById(contractId + "");
+		Integer contractType = contractInfo.getContractType();
+		//根据用户在当前合同段的权限,判断返回
+		BladeUser user = AuthUtil.getUser();
+		String name = baseMapper.getUserRoleName(projectId,contractId,user.getUserId());
+		if (name.contains("超级管理员") || contractType == 3) {
+			//
+			if (nodeType == 1) {
+				return baseMapper.getArchiveTreeByNodeType2(projectId);
+			} else if (nodeType == 2) {
+				return baseMapper.getArchiveTreeByNodeType(projectId,null, "C");
+			} else if (nodeType == 3) {
+				return baseMapper.getArchiveTreeByNodeType(projectId,null, "S");
+			} else {
+				return null;
+			}
+		}else {
+			//只返回当前合同段
+			if (contractType == 1 && nodeType == 2){
+					return baseMapper.getArchiveTreeByNodeType(projectId,contractId, "C");
+			} else if (contractType == 2 && nodeType == 3) {
+					return baseMapper.getArchiveTreeByNodeType(projectId, contractId,"S");
+			}else {
+				return null;
+			}
+		}
+	}
+
+	@Override
+	public List<ArchiveTreeContractVO3> getChildrenNodeByNodeId(Long nodeId) {
+		return baseMapper.getChildrenNodeByNodeId(nodeId);
+	}
+
+
+	/**
+	 * 新增合同段时,要复制一份合同段的分支出来
+	 * @param contractInfos
+	 * @param srcTree
+	 * @param dstTree
+	 * @param dstNode
+	 * @param saveList
+	 */
+	void addNewRootChild(List<ContractInfo> contractInfos,ArchiveTreeVO2 srcTree,ArchiveTreeContractVO2 dstTree,
+						ArchiveTreeContract dstNode,List<ArchiveTreeContract> saveList){
+
+		//
+		List<ArchiveTreeVO2> srcChilds = srcTree.getChildren();
+		List<ArchiveTreeContractVO2> dstChilds  = dstTree.getChildren();
+		Map<Long,Long> dstMap = new HashMap<>();
+
+		for (ArchiveTreeContractVO2 dst: dstChilds) {
+			if (dst.getFromId()!= null ) {
+				dstMap.put(dst.getFromId(),dst.getId());
+			}
+		}
+
+		for (ArchiveTreeVO2 src : srcChilds) {
+			if (dstMap.get(src.getId()) == null ) {
+				List<ArchiveTreeContract> tmpSaveList = archiveTreeContractSync.getNormalSaveListEx(src.getId(),src,dstNode.getId(),dstTree);
+				saveList.addAll(tmpSaveList);
+			}
+		}
+
+	}
 
 
 }