Forráskód Böngészése

Merge branch 'lk20230418'

# Conflicts:
#	blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.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/ArchivesAutoServiceImpl.java
#	blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java
#	blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.java
#	blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml
luok 2 éve
szülő
commit
8f85c67e98

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

@@ -73,4 +73,7 @@ public interface ArchiveFileClient {
 
     @PostMapping(API_PREFIX + "/getAllArchiveFileSize")
     Long getAllArchiveFileSize(@RequestBody Long projectId);
+
+    @PostMapping(API_PREFIX + "/getListByNodeID")
+    List<ArchiveFile> getListByNodeID(@RequestParam String nodeId,@RequestParam Integer isArchive);
 }

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

@@ -6,6 +6,7 @@ import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang.StringUtils;
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -157,4 +158,17 @@ public class ContractInfo extends BaseEntity {
     @ApiModelProperty(value = "是否引用编号 '0'否 '1'是")
     private Integer isReferenceNumber;
 
+
+    public String  archivesUnit() {
+
+        String unit = getContractorUnitName();//建设单位名称
+        if (this.contractType== 1) {
+            unit = getConstructionUnitName();//施工单位名称
+        }else if (this.contractType== 2) {
+            unit = getSupervisionUnitName();//监理单位名称
+        }
+        return unit;
+
+    }
+
 }

+ 15 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -239,5 +239,19 @@ public class ArchivesAutoController extends BladeController {
 		return R.status(archivesAutoService.updateBatchById(archivesAutos));
 	}
 
-	
+
+	/**
+	 * 自动组卷入口
+	 * @param projectId
+	 * @return
+	 */
+	@PostMapping("/archiveAutoMethod")
+	public R archiveAutoMethod(Long projectId) {
+		archivesAutoService.splitArchvies(projectId);
+		archivesAutoService.archiveAutoMethod(projectId);
+		return R.data("");
+	}
+
+
+
 }

+ 5 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -115,10 +115,13 @@
 
     <update id="splitArchvies" >
         /**把未锁定案卷的文件关联去掉*/
-        update u_archive_file set archive_id = null where
+        update u_archive_file
+        set archive_id = null,
+            is_archive=0
+        where
             is_deleted=0 and
             archive_id in(
-                select id u_archives_auto where project_id=#{projectId}
+                select id from u_archives_auto where project_id=#{projectId}
                   and is_auto_file!=1
                   and is_deleted=0
                   and is_lock=0

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

@@ -50,4 +50,8 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	Map<String,Integer> getAllArchiveByContractType(Long projectId,String type);
 
 	List<Map<String, String>> getAllArchiveAgeByContractType(Long projectId);
+
+	void archiveAutoMethod(Long project);
+
+	void splitArchvies(Long project);
 }

+ 158 - 28
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -45,6 +45,8 @@ import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.ProjectClient;
 import org.springblade.manager.feign.WbsInfoClient;
 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.feign.IDictBizClient;
 import org.springframework.stereotype.Service;
@@ -68,6 +70,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	private ArchiveFileClient archiveFileClient;
 	private ArchiveTreeContractClient archiveTreeContractClient;
 	private ContractClient contractClient;
+	private ProjectClient projectClient;
+
 	private Map<String,Integer> indexMap; //按立卷位区分和生成流水号
 	private IArchiveAutoPdfService archiveAutoPdfService;
 
@@ -210,11 +214,15 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		List<Map<String,String>> list = baseMapper.getAllArchiveAgeByContractType(projectId);
 		return list;
 	}
+	@Override
+	public void splitArchvies(Long projectId){
+		baseMapper.splitArchvies(projectId);
+	}
 
-
+	@Override
 	public void archiveAutoMethod(Long projectId){
 		//步骤一:把项目下未锁定的案卷拆卷。
-		baseMapper.splitArchvies(projectId);
+
 		//步骤二:查询归档树节点。存在未归档文件的节点。
 		List<ArchiveTreeContract> list = archiveTreeContractClient.getHavedFileNodeByProjectID(projectId);
 		//步骤三:遍历归档树节点整理出 默认规则节点,分类并卷节点,单独组卷节点 三个集合。
@@ -235,10 +243,28 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 					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.setName(archiveName);//案卷题名
 		if(indexMap==null){
-			indexMap=new HashMap<>();
+			indexMap=new HashMap<>(); //监理,施工的按合同段分类从0开始依次设置档号,建设单位的没有合同段 就先按一类依次设置
 		}
-		//TODO 获取立卷单位
+
+		//获取立卷单位
 		String unit="";
+		String treeCode = node.getTreeCode();
+		if(StringUtils.isEmpty(treeCode)){
+			//treeCode为null的是业主的节点
+			List<Long> pids = new ArrayList<>();
+			pids.add(node.getProjectId());
+			List<ContractInfo> contractInfos = contractClient.getContractByIds(pids);
+			for(ContractInfo contract:contractInfos){
+				if(contract.getContractType()==3){
+					unit=contract.archivesUnit();
+				}
+			}
+		}else{
+			//treeCode不为null则是对应合同段
+			ContractInfo contract = contractClient.getContractById(Long.parseLong(treeCode));
+			unit=contract.archivesUnit();
+		}
 		//获取档号
+		if(StringUtils.isEmpty(treeCode)){
+			treeCode="owner";
+		}
 		String fileNumberPrefix=node.getFileNumberPrefix(); //档号前缀在节点设置
 		Integer fileNumberSuffix = null;//档号后缀按立卷单位生成流水号
-		if(indexMap.containsKey(unit)){
-			fileNumberSuffix = indexMap.get(unit);
-			indexMap.put(unit,fileNumberSuffix+1);
+		if(indexMap.containsKey(treeCode)){
+			fileNumberSuffix = indexMap.get(treeCode);
+			indexMap.put(treeCode,fileNumberSuffix+1);
 		}else{
 			fileNumberSuffix=1;
-			indexMap.put(unit,fileNumberSuffix+1);
+			indexMap.put(treeCode,fileNumberSuffix+1);
 		}
 
 		archivesAuto.setFileNumber(fileNumberPrefix+fileNumberSuffix);//档号
@@ -305,8 +351,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//archivesAuto.setQuantity();//数量/单位
 
 		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.setSecretLevel("");//保密级别 没地方设置 暂留
 		//载体类型
@@ -350,8 +396,37 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	}
 
 	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){
 		//TODO 生成文件对应的页码,返回url
@@ -483,11 +558,55 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		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:遍历节点集合
 		for(ArchiveTreeContract node:list){
 			//步骤2:获取当前节点的案卷规格
@@ -511,7 +630,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 					archiveFilesSize++;
 					//步骤5:判断文件是否存在分盒设置
 					if(file.getBoxNumber()!=null){
-						//TODO 走分盒组卷流程
+						//添加到分盒文件集合
+						addBoxMap(file,boxMap);
 						if(archiveFilesSize==archiveFiles.size() && waitArchiveFiles.size()>0){
 							//最后一个文件直接将waitArchiveFiles组卷
 							createArchive3(waitArchiveFiles,node,archivesSize);
@@ -581,7 +701,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	/**
 	 * 分类并卷组卷  设置分类的节点下只有一个案卷,节点下的所有文件都组成这个案卷。如果设置分类节点(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<文件>>
 		Map<Long,List<ArchiveFile>> archiveMap = new HashMap<>();
@@ -593,17 +713,14 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			//根据分组ID来创建唯一案卷
 			Long archiveAutoGroupId=node.getArchiveAutoGroupId();
 			//步骤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:遍历未归档文件
 			if(archiveFiles!=null){
 				for(ArchiveFile file:archiveFiles){
 					//步骤4:判断文件是否存在分盒设置
-					if(file.getBoxNumber()!=null){
-						//TODO 走分盒流程
+					if(file.getBoxNumber()!=null && file.getBoxNumber()!=-1){
+						//添加到分盒文件集合
+						addBoxMap(file,boxMap);
 					}else{
 						//分类并卷流程
 						//步骤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;
 
@@ -689,7 +806,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 				archiveFilesSize++;
 				//步骤3.4:判断文件是否存在分盒设置
 				if(file.getBoxNumber()!=null) {
-					//TODO 走分盒组卷流程
+					//添加到分盒文件集合
+					addBoxMap(file,boxMap);
 					if(nodeSize==list.size() && archiveFilesSize==archiveFiles.size()){
 						//如果当前是最后一个文件直接将waitArchiveFiles组卷
 						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

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

@@ -186,4 +186,12 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
             return 0L;
         }
     }
+
+    @Override
+    public List<ArchiveFile> getListByNodeID(String nodeId,Integer isArchive) {
+        List<ArchiveFile> files = fileMapper.getListByNodeID(nodeId, isArchive);
+        return files;
+    }
+
+
 }

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.java

@@ -72,4 +72,6 @@ public interface ArchiveFileMapper extends BaseMapper<ArchiveFile> {
 	List<ArchiveFileVO> getAllArchiveFileByContractType(@Param("projectId")Long projectId);
 
 	List<ArchiveFile> getAllArchiveFileUrl(@Param("projectId")Long projectId);
+
+	public List<ArchiveFile> getListByNodeID(@Param("nodeId") String nodeId,@Param("isArchive")Integer isArchive);
 }

+ 11 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml

@@ -287,4 +287,15 @@
         WHERE  uaf.project_id = #{projectId};
     </select>
 
+
+
+    <select id="getListByNodeID" resultMap="archiveFileResultMap">
+        select * from u_archive_file
+        where
+          node_id = #{nodeId} and
+          is_archive = #{isArchive} and
+          is_deleted = 0
+          order by sort
+    </select>
+
 </mapper>