|
@@ -45,6 +45,8 @@ import org.springblade.manager.feign.ContractClient;
|
|
import org.springblade.manager.feign.ProjectClient;
|
|
import org.springblade.manager.feign.ProjectClient;
|
|
import org.springblade.manager.feign.WbsInfoClient;
|
|
import org.springblade.manager.feign.WbsInfoClient;
|
|
import org.springblade.manager.vo.ArchiveTreeContractVO2;
|
|
import org.springblade.manager.vo.ArchiveTreeContractVO2;
|
|
|
|
+import org.springblade.manager.feign.ContractClient;
|
|
|
|
+import org.springblade.manager.feign.ProjectClient;
|
|
import org.springblade.system.entity.DictBiz;
|
|
import org.springblade.system.entity.DictBiz;
|
|
import org.springblade.system.feign.IDictBizClient;
|
|
import org.springblade.system.feign.IDictBizClient;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
@@ -68,6 +70,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
private ArchiveFileClient archiveFileClient;
|
|
private ArchiveFileClient archiveFileClient;
|
|
private ArchiveTreeContractClient archiveTreeContractClient;
|
|
private ArchiveTreeContractClient archiveTreeContractClient;
|
|
private ContractClient contractClient;
|
|
private ContractClient contractClient;
|
|
|
|
+ private ProjectClient projectClient;
|
|
|
|
+
|
|
private Map<String,Integer> indexMap; //按立卷位区分和生成流水号
|
|
private Map<String,Integer> indexMap; //按立卷位区分和生成流水号
|
|
private IArchiveAutoPdfService archiveAutoPdfService;
|
|
private IArchiveAutoPdfService archiveAutoPdfService;
|
|
|
|
|
|
@@ -210,11 +214,15 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
List<Map<String,String>> list = baseMapper.getAllArchiveAgeByContractType(projectId);
|
|
List<Map<String,String>> list = baseMapper.getAllArchiveAgeByContractType(projectId);
|
|
return list;
|
|
return list;
|
|
}
|
|
}
|
|
|
|
+ @Override
|
|
|
|
+ public void splitArchvies(Long projectId){
|
|
|
|
+ baseMapper.splitArchvies(projectId);
|
|
|
|
+ }
|
|
|
|
|
|
-
|
|
|
|
|
|
+ @Override
|
|
public void archiveAutoMethod(Long projectId){
|
|
public void archiveAutoMethod(Long projectId){
|
|
//步骤一:把项目下未锁定的案卷拆卷。
|
|
//步骤一:把项目下未锁定的案卷拆卷。
|
|
- baseMapper.splitArchvies(projectId);
|
|
|
|
|
|
+
|
|
//步骤二:查询归档树节点。存在未归档文件的节点。
|
|
//步骤二:查询归档树节点。存在未归档文件的节点。
|
|
List<ArchiveTreeContract> list = archiveTreeContractClient.getHavedFileNodeByProjectID(projectId);
|
|
List<ArchiveTreeContract> list = archiveTreeContractClient.getHavedFileNodeByProjectID(projectId);
|
|
//步骤三:遍历归档树节点整理出 默认规则节点,分类并卷节点,单独组卷节点 三个集合。
|
|
//步骤三:遍历归档树节点整理出 默认规则节点,分类并卷节点,单独组卷节点 三个集合。
|
|
@@ -235,10 +243,28 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- //步骤四:按照单独,分类,默认的顺序执行组卷流程。
|
|
|
|
- archiveAutoMethod3(list3);//单独组卷
|
|
|
|
- archiveAutoMethod2(list2,projectId);//分类组卷
|
|
|
|
- archiveAutoMethod1(list1);//默认组卷
|
|
|
|
|
|
+ //步骤四:按照单独,分类,默认,分盒的顺序执行组卷流程。
|
|
|
|
+
|
|
|
|
+ //分盒文件集合
|
|
|
|
+ Map<Integer,List<ArchiveFile>> boxMap = new HashMap<>();
|
|
|
|
+
|
|
|
|
+ archiveAutoMethod3(list3,boxMap);//单独组卷
|
|
|
|
+ archiveAutoMethod2(list2,projectId,boxMap);//分类组卷
|
|
|
|
+ archiveAutoMethod1(list1,boxMap);//默认组卷
|
|
|
|
+ archiveAutoMethodBox(boxMap);//分盒组卷
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void addBoxMap(ArchiveFile file,Map<Integer,List<ArchiveFile>> boxMap){
|
|
|
|
+ Integer boxNumber = file.getBoxNumber();
|
|
|
|
+ if(boxMap.containsKey(boxNumber)){
|
|
|
|
+ List<ArchiveFile> boxFiles = boxMap.get(boxNumber);
|
|
|
|
+ boxFiles.add(file);
|
|
|
|
+ boxMap.put(boxNumber,boxFiles);
|
|
|
|
+ }else{
|
|
|
|
+ List<ArchiveFile> boxFiles = new ArrayList<>();
|
|
|
|
+ boxFiles.add(file);
|
|
|
|
+ boxMap.put(boxNumber,boxFiles);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -284,19 +310,39 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
archivesAuto.setContractId(node.getContractId());
|
|
archivesAuto.setContractId(node.getContractId());
|
|
archivesAuto.setName(archiveName);//案卷题名
|
|
archivesAuto.setName(archiveName);//案卷题名
|
|
if(indexMap==null){
|
|
if(indexMap==null){
|
|
- indexMap=new HashMap<>();
|
|
|
|
|
|
+ indexMap=new HashMap<>(); //监理,施工的按合同段分类从0开始依次设置档号,建设单位的没有合同段 就先按一类依次设置
|
|
}
|
|
}
|
|
- //TODO 获取立卷单位
|
|
|
|
|
|
+
|
|
|
|
+ //获取立卷单位
|
|
String unit="";
|
|
String unit="";
|
|
|
|
+ String treeCode = node.getTreeCode();
|
|
|
|
+ if(StringUtils.isEmpty(treeCode)){
|
|
|
|
+ //treeCode为null的是业主的节点
|
|
|
|
+ List<Long> pids = new ArrayList<>();
|
|
|
|
+ pids.add(node.getProjectId());
|
|
|
|
+ List<ContractInfo> contractInfos = contractClient.getContractByIds(pids);
|
|
|
|
+ for(ContractInfo contract:contractInfos){
|
|
|
|
+ if(contract.getContractType()==3){
|
|
|
|
+ unit=contract.archivesUnit();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }else{
|
|
|
|
+ //treeCode不为null则是对应合同段
|
|
|
|
+ ContractInfo contract = contractClient.getContractById(Long.parseLong(treeCode));
|
|
|
|
+ unit=contract.archivesUnit();
|
|
|
|
+ }
|
|
//获取档号
|
|
//获取档号
|
|
|
|
+ if(StringUtils.isEmpty(treeCode)){
|
|
|
|
+ treeCode="owner";
|
|
|
|
+ }
|
|
String fileNumberPrefix=node.getFileNumberPrefix(); //档号前缀在节点设置
|
|
String fileNumberPrefix=node.getFileNumberPrefix(); //档号前缀在节点设置
|
|
Integer fileNumberSuffix = null;//档号后缀按立卷单位生成流水号
|
|
Integer fileNumberSuffix = null;//档号后缀按立卷单位生成流水号
|
|
- if(indexMap.containsKey(unit)){
|
|
|
|
- fileNumberSuffix = indexMap.get(unit);
|
|
|
|
- indexMap.put(unit,fileNumberSuffix+1);
|
|
|
|
|
|
+ if(indexMap.containsKey(treeCode)){
|
|
|
|
+ fileNumberSuffix = indexMap.get(treeCode);
|
|
|
|
+ indexMap.put(treeCode,fileNumberSuffix+1);
|
|
}else{
|
|
}else{
|
|
fileNumberSuffix=1;
|
|
fileNumberSuffix=1;
|
|
- indexMap.put(unit,fileNumberSuffix+1);
|
|
|
|
|
|
+ indexMap.put(treeCode,fileNumberSuffix+1);
|
|
}
|
|
}
|
|
|
|
|
|
archivesAuto.setFileNumber(fileNumberPrefix+fileNumberSuffix);//档号
|
|
archivesAuto.setFileNumber(fileNumberPrefix+fileNumberSuffix);//档号
|
|
@@ -305,8 +351,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
//archivesAuto.setQuantity();//数量/单位
|
|
//archivesAuto.setQuantity();//数量/单位
|
|
|
|
|
|
archivesAuto.setSpecification(node.getSpecification());//案卷规格 从节点规格获取
|
|
archivesAuto.setSpecification(node.getSpecification());//案卷规格 从节点规格获取
|
|
- archivesAuto.setStartDate(LocalDateTime.parse(startDate));//文件开始时间
|
|
|
|
- archivesAuto.setEndDate(LocalDateTime.parse(endDate));//文件结束时间
|
|
|
|
|
|
+ //archivesAuto.setStartDate(LocalDateTime.parse(startDate));//文件开始时间
|
|
|
|
+ //archivesAuto.setEndDate(LocalDateTime.parse(endDate));//文件结束时间
|
|
archivesAuto.setStorageTime(node.getStorageTime());//保管期限 从节点规格获取
|
|
archivesAuto.setStorageTime(node.getStorageTime());//保管期限 从节点规格获取
|
|
archivesAuto.setSecretLevel("");//保密级别 没地方设置 暂留
|
|
archivesAuto.setSecretLevel("");//保密级别 没地方设置 暂留
|
|
//载体类型
|
|
//载体类型
|
|
@@ -350,8 +396,37 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
}
|
|
}
|
|
|
|
|
|
private String builtArchiveName(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node,boolean isCrossNode){
|
|
private String builtArchiveName(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node,boolean isCrossNode){
|
|
- //TODO 获取案卷题名
|
|
|
|
- return "";
|
|
|
|
|
|
+
|
|
|
|
+ String archiveName="";
|
|
|
|
+
|
|
|
|
+ Long projectId = node.getProjectId();
|
|
|
|
+ ProjectInfo projectInfo = projectClient.getById(String.valueOf(projectId));
|
|
|
|
+ String projectName = projectInfo.getProjectName();
|
|
|
|
+ //获取案卷题名
|
|
|
|
+ //--正常节点
|
|
|
|
+ if(isCrossNode){
|
|
|
|
+ archiveName=projectName;
|
|
|
|
+ //存在跨节点 项目名称+文件对应的所有节点名称
|
|
|
|
+ Set<String> nodeIdSet = new HashSet<>();
|
|
|
|
+ for(ArchiveFile file:waitArchiveFiles){
|
|
|
|
+ String nodeId = file.getNodeId();
|
|
|
|
+ nodeIdSet.add(nodeId);
|
|
|
|
+ }
|
|
|
|
+ for(String nodeId:nodeIdSet){
|
|
|
|
+ ArchiveTreeContract treeNode = archiveTreeContractClient.getArchiveTreeContractById(Long.parseLong(nodeId));
|
|
|
|
+ String nodeName = treeNode.getNodeName();
|
|
|
|
+ archiveName=archiveName+nodeName;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }else{
|
|
|
|
+ //不存在跨节点 项目名称+节点名称
|
|
|
|
+ archiveName=projectName+node.getNodeName();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //TODO wbs节点
|
|
|
|
+ //不存在跨节点 项目名称+案卷题名规则(在后台归档目录树设置的)+后缀
|
|
|
|
+ //存在跨节点 获取当前所有节点的父级节点题名规则+所有同层级跨节点并卷的节点名称拼接+后缀
|
|
|
|
+ return archiveName;
|
|
}
|
|
}
|
|
private String builtFilePageNo(ArchivesAuto archivesAuto,List<ArchiveFile> waitArchiveFiles){
|
|
private String builtFilePageNo(ArchivesAuto archivesAuto,List<ArchiveFile> waitArchiveFiles){
|
|
//TODO 生成文件对应的页码,返回url
|
|
//TODO 生成文件对应的页码,返回url
|
|
@@ -483,11 +558,55 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private void createArchiveBox(List<ArchiveFile> waitArchiveFiles){
|
|
|
|
+
|
|
|
|
+ if(waitArchiveFiles.size()==0){
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ String nodeId = waitArchiveFiles.get(0).getNodeId();
|
|
|
|
+
|
|
|
|
+ ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(Long.parseLong(nodeId));
|
|
|
|
+
|
|
|
|
+ //获取案卷文件起止时间
|
|
|
|
+ String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
|
|
|
|
+ String[] split = archiveStartDateAndEndDate.split(",");
|
|
|
|
+ String startDate=split[0];
|
|
|
|
+ String endDate=split[1];
|
|
|
|
+ int fileN =waitArchiveFiles.size();
|
|
|
|
+ //获取案卷内文件总页数
|
|
|
|
+ int pageN=0;
|
|
|
|
+ for(ArchiveFile file:waitArchiveFiles){
|
|
|
|
+ pageN=pageN+file.getFilePage();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //默认组卷存在跨节点组卷 注意案卷归属节点,案卷命名方式
|
|
|
|
+ //获取案卷题名
|
|
|
|
+ String archiveName=builtArchiveName(waitArchiveFiles,node,false);//获取案卷题名
|
|
|
|
+
|
|
|
|
+ //1.创建新案卷
|
|
|
|
+ ArchivesAuto archivesAuto = builtArchives(node,pageN,fileN,startDate,endDate,archiveName);
|
|
|
|
+
|
|
|
|
+ //2.封面和生成文件页码
|
|
|
|
+ archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
|
|
|
|
+
|
|
|
|
+ builtFilePageNo(archivesAuto,waitArchiveFiles);
|
|
|
|
+
|
|
|
|
+ //3.设置文件所属案卷,组卷状态
|
|
|
|
+ Long archivesAutoId = archivesAuto.getId();
|
|
|
|
+ for(ArchiveFile file:waitArchiveFiles){
|
|
|
|
+ file.setArchiveId(archivesAutoId);//设置文件所属案卷
|
|
|
|
+ file.setIsArchive(1);
|
|
|
|
+ }
|
|
|
|
+ archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
|
|
/**
|
|
/**
|
|
* 单租组卷流程 节点下的文件只在当前节点下组卷
|
|
* 单租组卷流程 节点下的文件只在当前节点下组卷
|
|
*/
|
|
*/
|
|
- private void archiveAutoMethod3(List<ArchiveTreeContract> list){
|
|
|
|
|
|
+ private void archiveAutoMethod3(List<ArchiveTreeContract> list,Map<Integer,List<ArchiveFile>> boxMap){
|
|
//步骤1:遍历节点集合
|
|
//步骤1:遍历节点集合
|
|
for(ArchiveTreeContract node:list){
|
|
for(ArchiveTreeContract node:list){
|
|
//步骤2:获取当前节点的案卷规格
|
|
//步骤2:获取当前节点的案卷规格
|
|
@@ -511,7 +630,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
archiveFilesSize++;
|
|
archiveFilesSize++;
|
|
//步骤5:判断文件是否存在分盒设置
|
|
//步骤5:判断文件是否存在分盒设置
|
|
if(file.getBoxNumber()!=null){
|
|
if(file.getBoxNumber()!=null){
|
|
- //TODO 走分盒组卷流程
|
|
|
|
|
|
+ //添加到分盒文件集合
|
|
|
|
+ addBoxMap(file,boxMap);
|
|
if(archiveFilesSize==archiveFiles.size() && waitArchiveFiles.size()>0){
|
|
if(archiveFilesSize==archiveFiles.size() && waitArchiveFiles.size()>0){
|
|
//最后一个文件直接将waitArchiveFiles组卷
|
|
//最后一个文件直接将waitArchiveFiles组卷
|
|
createArchive3(waitArchiveFiles,node,archivesSize);
|
|
createArchive3(waitArchiveFiles,node,archivesSize);
|
|
@@ -581,7 +701,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
/**
|
|
/**
|
|
* 分类并卷组卷 设置分类的节点下只有一个案卷,节点下的所有文件都组成这个案卷。如果设置分类节点(select=1的)多个,案卷归属排序第一个节点。
|
|
* 分类并卷组卷 设置分类的节点下只有一个案卷,节点下的所有文件都组成这个案卷。如果设置分类节点(select=1的)多个,案卷归属排序第一个节点。
|
|
*/
|
|
*/
|
|
- private void archiveAutoMethod2(List<ArchiveTreeContract> list,Long projectId){
|
|
|
|
|
|
+ private void archiveAutoMethod2(List<ArchiveTreeContract> list,Long projectId,Map<Integer,List<ArchiveFile>> boxMap){
|
|
|
|
|
|
//分类并卷集合<groupId,List<文件>>
|
|
//分类并卷集合<groupId,List<文件>>
|
|
Map<Long,List<ArchiveFile>> archiveMap = new HashMap<>();
|
|
Map<Long,List<ArchiveFile>> archiveMap = new HashMap<>();
|
|
@@ -593,17 +713,14 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
//根据分组ID来创建唯一案卷
|
|
//根据分组ID来创建唯一案卷
|
|
Long archiveAutoGroupId=node.getArchiveAutoGroupId();
|
|
Long archiveAutoGroupId=node.getArchiveAutoGroupId();
|
|
//步骤2:查询节点下的未归档文件
|
|
//步骤2:查询节点下的未归档文件
|
|
- List<ArchiveFile> archiveFiles = archiveFileClient.listWrappers(Wrappers.<ArchiveFile>lambdaQuery()
|
|
|
|
- .eq(ArchiveFile::getNodeId, node)
|
|
|
|
- .eq(ArchiveFile::getIsArchive, 0)
|
|
|
|
- .eq(ArchiveFile::getIsDeleted,0)
|
|
|
|
- .orderByAsc(ArchiveFile::getSort));
|
|
|
|
|
|
+ List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString(),0);
|
|
//步骤3:遍历未归档文件
|
|
//步骤3:遍历未归档文件
|
|
if(archiveFiles!=null){
|
|
if(archiveFiles!=null){
|
|
for(ArchiveFile file:archiveFiles){
|
|
for(ArchiveFile file:archiveFiles){
|
|
//步骤4:判断文件是否存在分盒设置
|
|
//步骤4:判断文件是否存在分盒设置
|
|
- if(file.getBoxNumber()!=null){
|
|
|
|
- //TODO 走分盒流程
|
|
|
|
|
|
+ if(file.getBoxNumber()!=null && file.getBoxNumber()!=-1){
|
|
|
|
+ //添加到分盒文件集合
|
|
|
|
+ addBoxMap(file,boxMap);
|
|
}else{
|
|
}else{
|
|
//分类并卷流程
|
|
//分类并卷流程
|
|
//步骤5:将文件按照<groupId,List<文件>>放入集合
|
|
//步骤5:将文件按照<groupId,List<文件>>放入集合
|
|
@@ -635,7 +752,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
/**
|
|
/**
|
|
* 默认组卷流程 文件可以跨节点组卷,受最高并卷节点限制范围,跨节点文件组卷时,案卷规格按照第一个文件所在的节点规格 组卷。
|
|
* 默认组卷流程 文件可以跨节点组卷,受最高并卷节点限制范围,跨节点文件组卷时,案卷规格按照第一个文件所在的节点规格 组卷。
|
|
*/
|
|
*/
|
|
- private void archiveAutoMethod1(List<ArchiveTreeContract> list){
|
|
|
|
|
|
+ private void archiveAutoMethod1(List<ArchiveTreeContract> list,Map<Integer,List<ArchiveFile>> boxMap){
|
|
//最高并卷节点
|
|
//最高并卷节点
|
|
Long archiveAutoNodeId=null;
|
|
Long archiveAutoNodeId=null;
|
|
|
|
|
|
@@ -689,7 +806,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
archiveFilesSize++;
|
|
archiveFilesSize++;
|
|
//步骤3.4:判断文件是否存在分盒设置
|
|
//步骤3.4:判断文件是否存在分盒设置
|
|
if(file.getBoxNumber()!=null) {
|
|
if(file.getBoxNumber()!=null) {
|
|
- //TODO 走分盒组卷流程
|
|
|
|
|
|
+ //添加到分盒文件集合
|
|
|
|
+ addBoxMap(file,boxMap);
|
|
if(nodeSize==list.size() && archiveFilesSize==archiveFiles.size()){
|
|
if(nodeSize==list.size() && archiveFilesSize==archiveFiles.size()){
|
|
//如果当前是最后一个文件直接将waitArchiveFiles组卷
|
|
//如果当前是最后一个文件直接将waitArchiveFiles组卷
|
|
createArchive1(waitArchiveFiles,archivesSize);
|
|
createArchive1(waitArchiveFiles,archivesSize);
|
|
@@ -765,6 +883,18 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 分盒组卷流程
|
|
|
|
+ * @param boxMap
|
|
|
|
+ */
|
|
|
|
+ private void archiveAutoMethodBox(Map<Integer,List<ArchiveFile>> boxMap){
|
|
|
|
+ Set<Map.Entry<Integer, List<ArchiveFile>>> entries = boxMap.entrySet();
|
|
|
|
+ for (Map.Entry<Integer, List<ArchiveFile>> entry:entries){
|
|
|
|
+ //一个分盒一个案卷 归属第一个文件所在节点
|
|
|
|
+ createArchiveBox(entry.getValue());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 查询案卷,排序
|
|
* 查询案卷,排序
|
|
* @param ids
|
|
* @param ids
|