Browse Source

Merge branch 'lk20230403'

# Conflicts:
#	blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ArchiveTreeContractClient.java
#	blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ArchiveTreeContractImpl.java
#	blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
luok 1 year ago
parent
commit
e86d52906c

+ 14 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java

@@ -181,6 +181,20 @@ public class ArchiveTreeContract extends BaseEntity {
 	//树形排序
 	private String treeSort;
 
+	//---节点基础信息,自动组卷需要这些参数来确定
+	//档号前缀
+	private String fileNumberPrefix;
+	//保管期限
+	private String storageTime;
+	//立卷人
+	private String rollor;
+	//审核人
+	private String reviewer;
+	//卷盒规格
+	private String specification;
+	//案卷后缀
+	private String archiveNameSuffix;
+
 
 
 	public ArchiveTreeContract() {

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

@@ -30,4 +30,10 @@ public interface ArchiveTreeContractClient {
     @PostMapping(API_PREFIX + "/getListByProjectId")
     List<ArchiveTreeContract> getListByProjectId(@RequestParam Long projectId);
 
+    @PostMapping(API_PREFIX + "/getSelectNodeByGroupId")
+    List<ArchiveTreeContract> getSelectNodeByGroupId(@RequestParam Long projectId,@RequestParam Long archiveAutoGroupId);
+
+    @PostMapping(API_PREFIX + "/getArchiveTreeContractById")
+    ArchiveTreeContract getArchiveTreeContractById(@RequestParam Long id);
+
 }

+ 183 - 36
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -55,6 +55,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	private ArchiveFileClient archiveFileClient;
 	private ArchiveTreeContractClient archiveTreeContractClient;
 
+	private Map<String,Integer> indexMap; //按立卷位区分和生成流水号
 
 	@Override
 	public IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto) {
@@ -143,7 +144,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		}
 		//步骤四:按照单独,分类,默认的顺序执行组卷流程。
 		archiveAutoMethod3(list3);//单独组卷
-		archiveAutoMethod2(list2);//分类组卷
+		archiveAutoMethod2(list2,projectId);//分类组卷
 		archiveAutoMethod1(list1);//默认组卷
 	}
 
@@ -184,27 +185,45 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		return null;
 	}
 
-	private ArchivesAuto builtArchives(ArchiveTreeContract node,int pageN,int fileN){
+	private ArchivesAuto builtArchives(ArchiveTreeContract node,int pageN,int fileN,String startDate,String endDate,String archiveName){
 		ArchivesAuto archivesAuto = new ArchivesAuto();
 		archivesAuto.setProjectId(node.getProjectId());
 		archivesAuto.setContractId(node.getContractId());
-		archivesAuto.setName("");//TODO 案卷题名
-		archivesAuto.setFileNumber("");//TODO 档号
+		archivesAuto.setName(archiveName);//案卷题名
+		if(indexMap==null){
+			indexMap=new HashMap<>();
+		}
+		//TODO 获取立卷单位
+		String unit="";
+		//获取档号
+		String fileNumberPrefix=node.getFileNumberPrefix(); //档号前缀在节点设置
+		Integer fileNumberSuffix = null;//档号后缀按立卷单位生成流水号
+		if(indexMap.containsKey(unit)){
+			fileNumberSuffix = indexMap.get(unit);
+			indexMap.put(unit,fileNumberSuffix+1);
+		}else{
+			fileNumberSuffix=1;
+			indexMap.put(unit,fileNumberSuffix+1);
+		}
+
+		archivesAuto.setFileNumber(fileNumberPrefix+fileNumberSuffix);//档号
 		//archivesAuto.setMicron();//微缩号
-		archivesAuto.setUnit("");//TODO 单位
+		archivesAuto.setUnit(unit);//立卷单位
 		//archivesAuto.setQuantity();//数量/单位
-		archivesAuto.setSpecification("");//TODO 规格 从节点规格获取
-		archivesAuto.setStartDate(null);//TODO 文件开始时间
-		archivesAuto.setEndDate(null);//TODO 文件结束时间
-		archivesAuto.setStorageTime("");//TODO 保管时间  从节点规格获取
-		archivesAuto.setSecretLevel("");//TODO 保密级别 从节点规格获取
+
+		archivesAuto.setSpecification(node.getSpecification());//案卷规格 从节点规格获取
+		archivesAuto.setStartDate(LocalDateTime.parse(startDate));//文件开始时间
+		archivesAuto.setEndDate(LocalDateTime.parse(endDate));//文件结束时间
+		archivesAuto.setStorageTime(node.getStorageTime());//保管期限  从节点规格获取
+		archivesAuto.setSecretLevel("");//保密级别 没地方设置 暂留
 		//archivesAuto.setCarrierType();//载体类型
 		//archivesAuto.setKeywords();//主题词
 		//archivesAuto.setStorageLocation();//存放位置
 		archivesAuto.setIsArchive(1);//已归档
 		//archivesAuto.setRemark();//备注
-		archivesAuto.setRollDate(null);// TODO 立卷日期
-		archivesAuto.setRollor("自动");//立卷人
+		archivesAuto.setRollDate(LocalDateTime.now());//立卷日期
+		archivesAuto.setRollor(node.getRollor());//立卷人 从节点规格获取
+		archivesAuto.setReviewer(node.getReviewer());//审核人 从节点规格获取
 		archivesAuto.setNodeId(node.getId());//归档树节点
 		archivesAuto.setOutUrl("");//TODO 生成案卷的封面 目录 备考表,背级
 		archivesAuto.setFileN(fileN);//文件数量
@@ -214,28 +233,143 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//archivesAuto.setSize();
 		archivesAuto.setTreeSort(node.getTreeSort());
 		//archivesAuto.setIsOpen();
-		archivesAuto.setIscheck(0);
+		//archivesAuto.setIscheck(0);
 		archivesAuto.setIsAutoFile(0);//是否案卷收集上传的案卷
 		archivesAuto.setIsLock(0);//案卷锁定状态
 		baseMapper.insert(archivesAuto);
 		return archivesAuto;
 	}
 
+	private String getArchiveStartDateAndEndDate(List<ArchiveFile> waitArchiveFiles){
+		//找出文件集合中的最大最小时间
+		List<String> fileTimeList = new ArrayList<>();
+		for(ArchiveFile file:waitArchiveFiles){
+			fileTimeList.add(file.getFileTime());
+		}
+		Collections.sort(fileTimeList);
+		String startDate=fileTimeList.get(0);
+		String endDate=fileTimeList.get(fileTimeList.size()-1);
+		return startDate+","+endDate;
+	}
+
+	private String builtArchiveName(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node,boolean isCrossNode){
+		//TODO 获取案卷题名
+		return "";
+	}
+	private String builtFilePageNo(List<ArchiveFile> waitArchiveFiles){
+		//TODO 生成文件对应的页码,返回url
+		return "";
+	}
+
+
 	/**
 	 * 单独组卷规则组卷
 	 * @param waitArchiveFiles
-	 * @param node
+	 * @param node 规格参数所在节点
+	 * @param pageN
 	 */
 	private void createArchive3(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node,int pageN){
 
+		String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
+		String[] split = archiveStartDateAndEndDate.split(",");
+		String startDate=split[0];
+		String endDate=split[1];
+		int fileN =waitArchiveFiles.size();
+
+		String archiveName=builtArchiveName(waitArchiveFiles,node,false);//获取案卷题名
 		//1.创建新案卷
-		ArchivesAuto archivesAuto = builtArchives(node, pageN, waitArchiveFiles.size());
+		ArchivesAuto archivesAuto = builtArchives(node, pageN, fileN,startDate,endDate,archiveName);
 		//2.设置文件所属案卷,组卷状态
 		Long archivesAutoId = archivesAuto.getId();
+
+		builtFilePageNo(waitArchiveFiles);//生成文件页码
+
+		for(ArchiveFile file:waitArchiveFiles){
+			file.setArchiveId(archivesAutoId);//设置文件所属案卷
+			file.setIsArchive(1);
+
+		}
+		archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
+	}
+
+	/**
+	 * 分类并卷组卷
+	 * @param waitArchiveFiles
+	 * @param archiveAutoGroupId 分类并卷分组ID
+	 */
+	private void createArchive2(List<ArchiveFile> waitArchiveFiles, Long archiveAutoGroupId,Long projectId){
+
+		//获取同一分类archiveAutoGroupId下设置的(设置规则时选中的)节点,排好序
+		List<ArchiveTreeContract> selectList=archiveTreeContractClient.getSelectNodeByGroupId(projectId,archiveAutoGroupId);
+		//分类并卷节点默认采用设置节点的第一个节点为案卷归属节点。
+		ArchiveTreeContract node = selectList.get(0);
+		//获取案卷文件起止时间
+		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,true);//获取案卷题名
+
+		//1.创建新案卷
+		ArchivesAuto archivesAuto = builtArchives(node,pageN,fileN,startDate,endDate,archiveName);
+
+		//2.生成文件页码
+		builtFilePageNo(waitArchiveFiles);
+
+		//3.设置文件所属案卷,组卷状态
+		Long archivesAutoId = archivesAuto.getId();
+		for(ArchiveFile file:waitArchiveFiles){
+			file.setArchiveId(archivesAutoId);//设置文件所属案卷
+			file.setIsArchive(1);
+		}
+		archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
+	}
+
+	/**
+	 * 默认规则组卷
+	 * @param waitArchiveFiles
+	 * @param pageN
+	 */
+	private void createArchive1(List<ArchiveFile> waitArchiveFiles,int pageN){
+
+		//获取案卷文件起止时间
+		String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
+		String[] split = archiveStartDateAndEndDate.split(",");
+		String startDate=split[0];
+		String endDate=split[1];
+		int fileN =waitArchiveFiles.size();
+
+
+		//默认组卷存在跨节点组卷  注意案卷归属节点,案卷命名方式
+		//案卷归属节点为 排第一的文件所属节点
+		ArchiveFile firstFile = waitArchiveFiles.get(0);
+		Long nodeId = Long.parseLong(firstFile.getNodeId());
+		ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
+
+		//获取案卷题名
+		String archiveName=builtArchiveName(waitArchiveFiles,node,true);//获取案卷题名
+
+		//1.创建新案卷
+		ArchivesAuto archivesAuto = builtArchives(node,pageN,fileN,startDate,endDate,archiveName);
+
+		//2.生成文件页码
+		builtFilePageNo(waitArchiveFiles);
+
+		//3.设置文件所属案卷,组卷状态
+		Long archivesAutoId = archivesAuto.getId();
 		for(ArchiveFile file:waitArchiveFiles){
 			file.setArchiveId(archivesAutoId);//设置文件所属案卷
 			file.setIsArchive(1);
-			//TODO 重新打页码文件
 		}
 		archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
 	}
@@ -248,7 +382,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//步骤1:遍历节点集合
 		for(ArchiveTreeContract node:list){
 			//步骤2:获取当前节点的案卷规格
-			int specificationSize=300;//TODO
+			String specificationStr = node.getSpecification();
+			int specification = Integer.parseInt(specificationStr);
+			int specificationSize=specification*10;
 			//步骤3:查询节点下的未组卷文件
 			List<ArchiveFile> archiveFiles = archiveFileClient.listWrappers(Wrappers.<ArchiveFile>lambdaQuery()
 					.eq(ArchiveFile::getNodeId, node)
@@ -331,16 +467,12 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 		}
 
-
-
-
-
 	}
 
 	/**
 	 * 分类并卷组卷  设置分类的节点下只有一个案卷,节点下的所有文件都组成这个案卷。如果设置分类节点(select=1的)多个,案卷归属排序第一个节点。
 	 */
-	private void archiveAutoMethod2(List<ArchiveTreeContract> list){
+	private void archiveAutoMethod2(List<ArchiveTreeContract> list,Long projectId){
 
 		//分类并卷集合<groupId,List<文件>>
 		Map<Long,List<ArchiveFile>> archiveMap = new HashMap<>();
@@ -383,10 +515,10 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//步骤6:按集合创建案卷,每个group类的案卷归属顺序排第一个节点
 		Set<Map.Entry<Long, List<ArchiveFile>>> entries = archiveMap.entrySet();
 		for(Map.Entry<Long, List<ArchiveFile>> entry:entries){
-			Long key = entry.getKey();
+			Long archiveAutoGroupId = entry.getKey();
 			List<ArchiveFile> archiveFiles = entry.getValue();
-			//TODO 一个key 组成一个案卷  案卷归属同个key的归档树节点select=1的第一个groupId2NodeIdMap
-
+			//一个archiveAutoGroupId组成一个案卷  案卷归属同个key的归档树节点select=1的第一个groupId2NodeIdMap
+			createArchive2(archiveFiles,archiveAutoGroupId,projectId);
 		}
 
 	}
@@ -420,7 +552,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			if(!archiveAutoNodeId.equals(archiveAutoNodeId_current)) {
 				//超过最高并卷节点(节点是排序好的,只要不相等就超过了)
 				if(waitArchiveFiles.size()>0){
-					//TODO 将待组卷集合里的文件组卷
+					//将待组卷集合里的文件组卷
+					createArchive1(waitArchiveFiles,archivesSize);
 				}
 				waitArchiveFiles.clear();
 				archivesSize=0;
@@ -430,7 +563,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			//步骤3.1:获取节点规格
 			if(waitArchiveFiles.size()==0){
 				//waitArchiveFiles待组卷文件为空时,按当前节点的规格
-				specificationSize=300;//TODO
+				String specificationStr = node.getSpecification();
+				int specification = Integer.parseInt(specificationStr);
+				specificationSize=specification*10;
 			}
 
 			//步骤3.2:查询出当前节点未组卷的文件
@@ -447,7 +582,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 				if(file.getBoxNumber()!=null) {
 					//TODO 走分盒组卷流程
 					if(nodeSize==list.size() && archiveFilesSize==archiveFiles.size()){
-						//TODO 如果当前是最后一个文件直接将waitArchiveFiles组卷
+						//如果当前是最后一个文件直接将waitArchiveFiles组卷
+						createArchive1(waitArchiveFiles,archivesSize);
 					}
 				}else{
 					//步骤3.5 计算和判断待组卷文件集合是否达到组卷要求,达到要求创建案卷,案卷归属当前节点,案卷下文件改为已组卷
@@ -459,7 +595,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 						waitArchiveFiles.add(file);
 						//判断是否最后一个节点,最后一个文件
 						if(nodeSize==list.size() && archiveFilesSize==archiveFiles.size()){
-							//TODO 直接将waitArchiveFiles待组卷集合组卷,归属集合第一个文件所在节点
+							//直接将waitArchiveFiles待组卷集合组卷,归属集合第一个文件所在节点
+							createArchive1(waitArchiveFiles,archivesSize);
 							//将待组卷文件集合,总页数还原初始值,
 							waitArchiveFiles.clear();
 							archivesSize=0;
@@ -470,35 +607,45 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 					//步骤3.7达到规格 可以组一卷
 					if(checkStatus==1){
 						waitArchiveFiles.add(file);
-						//TODO 将waitArchiveFiles待组卷集合组卷,归属集合第一个文件所在节点
+						//将waitArchiveFiles待组卷集合组卷,归属集合第一个文件所在节点
+						createArchive1(waitArchiveFiles,archivesSize);
 						//将待组卷文件集合,总页数还原初始值,
 						waitArchiveFiles.clear();
 						archivesSize=0;
-						specificationSize=300;//TODO 更新specificationSize待组卷规格为 当前节点的组卷规格
+
+						String specificationStr = node.getSpecification();
+						int specification = Integer.parseInt(specificationStr);
+						specificationSize=specification*10;//更新specificationSize待组卷规格为 当前节点的组卷规格
 					}
 					//步骤3.8超出规格
 					if(checkStatus==-1){
 						//步骤3.9如果waitArchiveFiles集合size>0,先将集合中文件组卷。再将当前文件加入集合
 						if(waitArchiveFiles.size()>0){
-							//3.9.1 TODO 将waitArchiveFiles组卷,归属集合第一个文件所在节点
+							//3.9.1 将waitArchiveFiles组卷,归属集合第一个文件所在节点
+							createArchive1(waitArchiveFiles,archivesSize);
 							//将待组卷文件集合,总页数还原初始值,
 							waitArchiveFiles.clear();
 							//3.9.2保存当前文件进入待组卷集合,
 							waitArchiveFiles.add(file);
 							//3.9.3待组卷页数=当前文件页数
 							archivesSize=filePage;
-							specificationSize=300;//TODO 更新specificationSize待组卷规格为 当前节点的组卷规格
+
+							String specificationStr = node.getSpecification();
+							int specification = Integer.parseInt(specificationStr);
+							specificationSize=specification*10;//更新specificationSize待组卷规格为 当前节点的组卷规格
+
 							//3.9.4 判断当前文件是不是最后一个节点,最后一个文件
 							if(nodeSize==list.size() && archiveFilesSize==archiveFiles.size()){
-								//TODO 最后一个文件再将waitArchiveFiles组卷
+								//最后一个文件再将waitArchiveFiles组卷
+								createArchive1(waitArchiveFiles,archivesSize);
 							}
 						}else{
 							//步骤3.10 如果waitArchiveFiles集合size=0,说明当前文件已经超过规格,直接将当前文件组卷
 							waitArchiveFiles.add(file);
-							//TODO 直接将waitArchiveFiles组卷
+							//直接将waitArchiveFiles组卷
+							createArchive1(waitArchiveFiles,archivesSize);
 							waitArchiveFiles.clear();
 							archivesSize=0;
-							specificationSize=300;//TODO 更新specificationSize待组卷规格为 当前节点的组卷规格
 						}
 					}
 

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

@@ -49,5 +49,16 @@ public class ArchiveTreeContractImpl implements ArchiveTreeContractClient {
         return archiveTreeContractMapper.getListByProjectId(projectId);
     }
 
+    @Override
+    public List<ArchiveTreeContract> getSelectNodeByGroupId(Long projectId,Long archiveAutoGroupId) {
+        List<ArchiveTreeContract> list = archiveTreeContractMapper.getSelectNodeByGroupId(projectId,archiveAutoGroupId);
+        return list;
+    }
+
+    @Override
+    public ArchiveTreeContract getArchiveTreeContractById(Long id) {
+        return null;
+    }
+
 
 }

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

@@ -70,4 +70,6 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
 	List<ArchiveTreeContract> getHavedFileNodeByProjectID(@Param("projectId") Long projectId);
 
 	List<ArchiveTreeContract> getListByProjectId(@Param("projectId")Long projectId);
+
+	List<ArchiveTreeContract> getSelectNodeByGroupId(@Param("projectId") Long projectId,@Param("archiveAutoGroupId") Long archiveAutoGroupId);
 }

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

@@ -316,4 +316,20 @@
         where project_id=#{projectId};
     </select>
 
+
+    <select id="getSelectNodeByGroupId" resultMap="archiveTreeContractResultMap">
+        SELECT
+            *
+        FROM
+            m_archive_tree_contract
+        WHERE
+            1 = 1
+          AND project_id = #{projectId}
+          AND is_deleted = 0
+          AND archive_auto_type =2
+          AND archive_auto_group_select =1
+          AND archive_auto_group_id =#{archiveAutoGroupId}
+        order by tree_sort asc
+    </select>
+
 </mapper>