Browse Source

合并冲突

laibulaizheli 3 months ago
parent
commit
b26ec584d2
33 changed files with 358 additions and 123 deletions
  1. 2 1
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/TaskSplit.java
  2. 58 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveDataVo.java
  3. 2 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO.java
  4. 1 17
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/TaskSplitVO.java
  5. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java
  6. 1 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ArchiveTreeContractDTO.java
  7. 28 0
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/vo/InformationQueryBIMVO.java
  8. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileAutoController.java
  9. 13 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java
  10. 2 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  11. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/TaskSplitController.java
  12. 2 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java
  13. 20 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  14. 6 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.java
  15. 6 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.xml
  16. 2 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  17. 57 55
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  18. 30 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/TaskSplitServiceImpl.java
  19. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java
  20. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java
  21. 4 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml
  22. 41 20
      blade-service/blade-business/src/main/java/org/springblade/business/utils/PDFUtil.java
  23. 7 7
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ArchiveController.java
  24. 1 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java
  25. 10 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java
  26. 3 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/SystemMsgController.java
  27. 13 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/job/SystemMsgJob.java
  28. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  29. 12 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/controller/WbsTreeController.java
  30. 4 4
      blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.java
  31. 4 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml
  32. 3 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java
  33. 12 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

+ 2 - 1
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/TaskSplit.java

@@ -69,5 +69,6 @@ public class TaskSplit extends BaseEntity {
 	@ApiModelProperty("完成数量")
 		private Integer finished;
 
-
+	@ApiModelProperty("分解任务名称")
+	private String taskName;
 }

+ 58 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveDataVo.java

@@ -0,0 +1,58 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.archive.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 任务审核主表视图实体类
+ *
+ * @author BladeX
+ * @since 2022-07-01
+ */
+@Data
+public class ArchiveDataVo {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("节点Id")
+    private String nodeId;
+
+    @ApiModelProperty("文件编号")
+    private String filenNo;
+
+    @ApiModelProperty("文件名称")
+    private String fileNmae;
+
+    @ApiModelProperty("文件路径")
+    private String fileUrl;
+
+    @ApiModelProperty("文件日期")
+    private String fileDate;
+
+    @ApiModelProperty("责任者")
+    private String responsibility;
+
+    @ApiModelProperty("文件来源")
+    private String fileSible;
+
+    @ApiModelProperty("合同段Id")
+    private String contractId;
+
+    @ApiModelProperty("1:签名文件 2:附件")
+    private String sendType;
+}

+ 2 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO.java

@@ -80,6 +80,8 @@ public class ArchivesAutoVO extends ArchivesAuto {
 	 */
 	private List<String> queryList;
 
+    private Integer queryValueSize;
+
 	/**
 	 * 节点查询条件
 	 */

+ 1 - 17
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/TaskSplitVO.java

@@ -1,24 +1,8 @@
-/*
- *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions are met:
- *
- *  Redistributions of source code must retain the above copyright notice,
- *  this list of conditions and the following disclaimer.
- *  Redistributions in binary form must reproduce the above copyright
- *  notice, this list of conditions and the following disclaimer in the
- *  documentation and/or other materials provided with the distribution.
- *  Neither the name of the dreamlu.net developer nor the names of its
- *  contributors may be used to endorse or promote products derived from
- *  this software without specific prior written permission.
- *  Author: Chill 庄骞 (smallchill@163.com)
- */
 package org.springblade.archive.vo;
 
-import org.springblade.archive.entity.TaskSplit;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springblade.archive.entity.TaskSplit;
 
 /**
  * 解析主标任务视图实体类

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

@@ -161,4 +161,7 @@ public interface ArchiveFileClient {
 
     @PostMapping(API_PREFIX + "/updateFilesEx")
     void updateArchiveFileEx(@RequestBody List<ArchiveFile> files);
+
+    @PostMapping(API_PREFIX + "/saveArchiveFileByBIM")
+    void saveArchiveFileByBIM(@RequestBody ArchiveFile archiveFile);
 }

+ 1 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ArchiveTreeContractDTO.java

@@ -39,4 +39,5 @@ public class ArchiveTreeContractDTO extends ArchiveTreeContract {
     private String nodeName;
     private String updateUserName;
     private String updateUserTime;
+    private Integer isSaveChild;
 }

+ 28 - 0
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/vo/InformationQueryBIMVO.java

@@ -0,0 +1,28 @@
+package org.springblade.system.user.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+@TableName("u_information_query")
+public class InformationQueryBIMVO {
+
+    @TableField("id")
+    private String id;
+    @TableField("父级id")
+    private String parentId;
+
+    @TableField("名称")
+    private String name;
+
+    @JsonProperty("eVisaPdfUrl")
+    private String fileUrlPath;
+
+    @TableField("nodeType 1节点 2文件")
+    private String nodeType;
+
+    @TableField("文件状态 0未上报,1待审批,2已审批,3已废除")
+    private String status;
+}

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

@@ -341,7 +341,7 @@ ArchiveFileAutoController extends BladeController {
         List<ArchiveFile> result = this.archiveFileClient.getArchiveFileByArchivesId(ids, "");
         List<String> pdfUrls = result.stream().map(archiveFile -> StringUtils.isNotEmpty(archiveFile.getPdfFileUrl()) ? archiveFile.getPdfFileUrl() : archiveFile.getFileUrl()).distinct().collect(Collectors.toList());
 
-//        FileUtils.mergePdfPublicMethods(pdfUrls,"");
+        //FileUtils.mergePdfPublicMethods(pdfUrls,"");
         /**
          * 案卷的只有一个文件,不合并先,需要的时候在把合并方法放出来
          * **/

+ 13 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java

@@ -12,6 +12,7 @@ import lombok.SneakyThrows;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.service.IArchivesAutoService;
 import org.springblade.archive.utils.FileUtils;
+import org.springblade.archive.vo.ArchiveDataVo;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.business.feign.MetadataClassificationClient;
@@ -435,4 +436,16 @@ public class ArchiveFileController extends BladeController {
         }
         return R.data(true);
     }
+
+
+    /**
+     * 智慧工地推送文件至电子档案数据规则 接口
+     */
+    @PostMapping("/sendFileToEArchives")
+    @ApiOperationSupport(order = 18)
+    @ApiOperation(value = "智慧工地推送文件至电子档案数据规则接口")
+    public R<Boolean> sendFileToEArchives(@RequestBody ArchiveDataVo vo) {
+        //数据入库
+        return  autoService.sendFileToEArchives(vo);
+    }
 }

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

@@ -152,6 +152,8 @@ public class ArchivesAutoController extends BladeController {
 		return R.data(pages);
 	}
 
+
+
 	/**
 	 * 档案利用-档案查询
 	 */

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

@@ -22,6 +22,7 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 import javax.validation.Valid;
 
+import org.springblade.archive.vo.TaskSplitVO;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
@@ -30,7 +31,6 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.archive.entity.TaskSplit;
-import org.springblade.archive.vo.TaskSplitVO;
 import org.springblade.archive.service.ITaskSplitService;
 import org.springblade.core.boot.ctrl.BladeController;
 

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

@@ -224,4 +224,6 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
 	 * @return
 	 */
 	Map<String, BigDecimal> getAllArchiveByContractTypeSummary(@Param("projectId") Long projectId,@Param("type") String typ);
+
+	String getArchiveFileByParentId(@Param("nodeId") String nodeId,@Param("contractId") String contractId);
 }

+ 20 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -285,6 +285,22 @@
                 #{nodeId}
             </foreach>
         </if>
+        <if test="vo.queryValueSize != null and vo.queryValueSize != ''">
+            <choose>
+                <when test="vo.queryValueSize == 1">
+                    and CHAR_LENGTH(u.name) <![CDATA[ < ]]> 80
+                </when>
+                <when test="vo.queryValueSize == 2">
+                    and CHAR_LENGTH(u.name) >= 80 and CHAR_LENGTH(u.name) <![CDATA[ < ]]> 120
+                </when>
+                <when test="vo.queryValueSize == 3">
+                    and CHAR_LENGTH(u.name) >= 120 and CHAR_LENGTH(u.name) <![CDATA[ < ]]> 150
+                </when>
+                <when test="vo.queryValueSize == 4">
+                    and CHAR_LENGTH(u.name) >= 150
+                </when>
+            </choose>
+        </if>
         order by m.tree_sort,u.auto_file_sort is null ,u.auto_file_sort,u.file_number is null,
         SUBSTRING_INDEX(u.file_number, '_', 1), SUBSTRING_INDEX(u.file_number, '_', -1) + 0 ,u.create_time asc
         limit #{current}, #{size}
@@ -1396,5 +1412,9 @@
         )a
     </select>
 
+    <select id="getArchiveFileByParentId" resultType="java.lang.String">
+        SELECT b.id from m_archive_tree a ,m_archive_tree_contract b where a.id=b.from_id and a.id=#{nodeId} and contract_id=#{contractId} and a.is_deleted=0 and b.is_deleted=0
+    </select>
+
 
 </mapper>

+ 6 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.archive.mapper;
 
+import org.apache.ibatis.annotations.Param;
 import org.springblade.archive.entity.TaskSplit;
 import org.springblade.archive.vo.TaskSplitVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -37,7 +38,11 @@ public interface TaskSplitMapper extends BaseMapper<TaskSplit> {
 	 * @param taskSplit
 	 * @return
 	 */
-	List<TaskSplitVO> selectTaskSplitPage(IPage page, TaskSplitVO taskSplit);
+	List<TaskSplitVO> selectTaskSplitPage(IPage page,@Param("taskSplit") TaskSplitVO taskSplit);
 
+	//获取合同段下 整个文件数
 	Integer getArchiveCount(String contractId);
+
+	// 获取分解任务是否存在
+	Integer getSpliteTaskCount(String contractId);
 }

+ 6 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.xml

@@ -18,15 +18,20 @@
         <result column="type" property="type"/>
         <result column="tool_count" property="toolCount"/>
         <result column="finished" property="finished"/>
+        <result column="task_name" property="taskName"/>
     </resultMap>
 
 
     <select id="selectTaskSplitPage" resultMap="taskSplitResultMap">
-        select * from u_task_split where is_deleted = 0
+        select * from u_task_split where is_deleted = 0 and contract_id = #{taskSplit.contractId}
     </select>
 
     <select id="getArchiveCount" resultType="java.lang.Integer">
         select count(1) from u_archives_auto where contract_id = #{contractId}
     </select>
 
+    <select id="getSpliteTaskCount" resultType="java.lang.Integer">
+        select count(1) from u_task_split where contract_id = #{contractId} and type=2
+    </select>
+
 </mapper>

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

@@ -154,4 +154,6 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	List<List<Map<String, List<CabinetVO>>>> getUnitAllCabinet(Long projectId, Integer type);
 
     List<JiLinArchiveAutoDto> getArchiveAutoDtoList(Long projId, List<JiLinQueryDto>dtos);
+
+	R sendFileToEArchives(ArchiveDataVo dataInfo);
 }

+ 57 - 55
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -134,7 +134,6 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 	private final IArchiveExpertConclusionService expertConclusionService;
 	private final ITraceLogService iTraceLogService;
-	private  final IArchiveNameService archiveNameService;
 
 	//表格高度
 	private static int high = 20;
@@ -1320,8 +1319,6 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//获取案卷题名
 		String archiveName = builtArchiveName(waitArchiveFiles, node, true);//获取案卷题名
 
-		//test(waitArchiveFiles);
-
 		//1.创建新案卷
 		ArchivesAuto archivesAuto = builtArchives(node, pageN, fileN, startDate, endDate, archiveName);
 
@@ -4090,71 +4087,76 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 	}
 
-	public void test(List<ArchiveFile> waitArchiveFiles) {
-		// 1. 提取并保持节点ID顺序(使用LinkedHashSet保持原始顺序)
-		Set<String> uniqueNodeIds = waitArchiveFiles.stream()
-				.map(ArchiveFile::getNodeId)
-				.filter(nodeId -> nodeId != null && !nodeId.isEmpty())
-				.collect(Collectors.toCollection(LinkedHashSet::new));
 
-		if (uniqueNodeIds.isEmpty()) {
-			log.info("没有需要处理的节点ID");
-			return;
+	private String formatExecutionTime(long millis) {
+		if (millis < 1000) {
+			return millis + "毫秒";
+		} else if (millis < 60000) {
+			return String.format("%.2f秒", millis / 1000.0);
+		} else {
+			long minutes = TimeUnit.MILLISECONDS.toMinutes(millis);
+			long seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % 60;
+			return minutes + "分钟" + seconds + "秒";
 		}
+	}
 
-		try {
-			// 2. 将节点ID从String转换为Long(保持原始顺序)
-			List<Long> nodeIds = uniqueNodeIds.stream()
-					.map(this::safeParseLong)
-					.filter(Objects::nonNull)
-					.collect(Collectors.toList());
-
-			if (nodeIds.isEmpty()) {
-				log.warn("无法解析任何有效的节点ID");
-				return;
-			}
-			String nodeIdsStr = nodeIds.stream()
-					.map(String::valueOf)
-					.collect(Collectors.joining(","));
-			// 3. 批量获取节点信息
-			List<ArchiveTreeContract> nodeList = archiveTreeContractClient
-					.getArchiveTreeContractListByIds(nodeIdsStr);
-
-			if (nodeList.isEmpty()) {
-				log.warn("未找到任何节点信息");
-				return;
-			}
-
-			// 4. 构建节点层级关系
-			IArchiveNameService.NodeHierarchy hierarchy =
-					archiveNameService.buildNodeHierarchy(nodeList);
-
-			// 5. 生成完整层级名称
-			String fullName = archiveNameService.generateFullLevelName(nodeIds, hierarchy);
 
-			// 6. 输出或使用结果
-			System.out.println("完整层级名称: " + fullName);
-			log.info("成功生成长度 {} 的层级名称", fullName.length());
+	@Override
+	public R sendFileToEArchives(ArchiveDataVo dataInfo) {
 
-		} catch (Exception e) {
-			log.error("生成层级名称时出错", e);
+		if(dataInfo==null || Func.isNull(dataInfo)){
+			return R.fail("请根据接口文档上传参数");
 		}
-	}
 
-	// 安全解析Long的方法(处理格式异常)
-	private Long safeParseLong(String value) {
-		try {
-			return Long.parseLong(value);
-		} catch (NumberFormatException e) {
-			log.warn("无法转换的节点ID格式: {}", value);
-			return null;
+		String nodeId = dataInfo.getNodeId();
+		String contractId = dataInfo.getContractId();
+		String fileUrl = dataInfo.getFileUrl();
+		String fileName = dataInfo.getFileNmae();
+		if(nodeId==null || Func.isNull(nodeId)){
+			return R.fail("请上传nodeId");
+		}
+		if(contractId==null || Func.isNull(contractId)){
+			R.fail("请上传contractId");
+		}
+		if(fileUrl==null || Func.isNull(fileUrl)){
+			R.fail("请上传fileUrl");
 		}
-	}
 
 
+		if(fileName==null || Func.isNull(fileName)){
+			R.fail("请上传fileName");
+		}
 
+		ContractInfo contractInfo = contractClient.getContractById(Func.toLong(contractId));
+		if(contractInfo==null){
+			return R.fail("请传输正确的contractId");
+		}
+		//获取文件的父节点Id
+		String treeContractId = baseMapper.getArchiveFileByParentId(nodeId, contractId);
+		if(treeContractId==null || Func.isNull(treeContractId)){
+			R.fail("请校验传输的nodeId和contractId,没有查到父节点Id");
+		}
 
 
 
+		// 将数据插入到 auto表中
+		ArchivesAuto archivesAuto = new ArchivesAuto();
+		long newPkId = SnowFlakeUtil.getId(); //主键Id
+		archivesAuto.setId(newPkId);
+		archivesAuto.setProjectId(Func.toLong(contractInfo.getPId()));
+		archivesAuto.setContractId(Func.toLong(contractId));
+		archivesAuto.setName(fileName);
+		archivesAuto.setIsDeleted(0);
+		this.save(archivesAuto);
+
+		// 保存文件到archive_file表中
+		long arueId = SnowFlakeUtil.getId(); //主键Id
+		ArchiveFile archiveFile = new ArchiveFile();
+		archiveFile.setId(arueId);
+		archiveFile.setArchiveId(newPkId);
+		archiveFile.setFileName(fileName);
+		archiveFileClient.saveArchiveFileByBIM(archiveFile);
+		return R.success("保存成功");
+	}
 
 }

+ 30 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/TaskSplitServiceImpl.java

@@ -24,11 +24,17 @@ import org.springblade.archive.service.ITaskSplitService;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
 import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
 
 /**
  * 解析主标任务 服务实现类
@@ -51,6 +57,7 @@ public class TaskSplitServiceImpl extends BaseServiceImpl<TaskSplitMapper, TaskS
 	@Override
 	public R saveTaskSplit(TaskSplit taskSplit) {
 		// 数据校验区
+		Map<String,Object> data = new HashMap<>();
 		String contractId = taskSplit.getContractId();
 		String splitIds = taskSplit.getIds();
 		if (contractId=="" || contractId==null || contractId.length()==0 || Func.isEmpty(contractId)){
@@ -60,19 +67,41 @@ public class TaskSplitServiceImpl extends BaseServiceImpl<TaskSplitMapper, TaskS
 		if (splitIds=="" || splitIds==null || splitIds.length()==0 || Func.isEmpty(splitIds)){ // 代表整个合同解析
 			taskSplit.setType(2);
 			// 查询整个合同段下的所有文件
+			Integer spliteTaskCount =baseMapper.getSpliteTaskCount(contractId);
+			if(spliteTaskCount>=1){
+				return R.fail("该合同已经添加任务,无需重复操作");
+			}
+
+			Random random = new Random();
+			int randomNumber = random.nextInt(11) + 10; // 生成10到20之间的随机数
+			int i = (int) Math.ceil(randomNumber * spliteTaskCount/60.0 );
+
 			Integer archiveCount = baseMapper.getArchiveCount(contractId);
 			taskSplit.setToolCount(archiveCount);
 			taskSplit.setFinished(0);
 
+			taskSplit.setTaskName("整个合同段 "+archiveCount+" 条的分解任务");
+			data.put("fileCount",archiveCount);
+			data.put("taskTime",i);
 		}else{ // 指定文件解析
 			taskSplit.setType(3);
 			String[] split = splitIds.split(",");
 			taskSplit.setToolCount(split.length);
 			taskSplit.setFinished(0);
+
+			Random random = new Random();
+			int randomNumber = random.nextInt(11) + 10; // 生成10到20之间的随机数
+			int i = (int) Math.ceil(randomNumber * split.length/60.0 );
+			data.put("fileCount",split.length);
+			data.put("taskTime",i);
+			LocalDateTime now = LocalDateTime.now();
+			DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss");
+			String formattedDateTime = now.format(formatter)+"_"+split.length+"条分解任务";
+			taskSplit.setTaskName(formattedDateTime);
 		}
 
 		int insert = baseMapper.insert(taskSplit);
-		return R.success("dddd");
+		return R.data(200,data,"操作成功");
 	}
 
 }

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java

@@ -294,12 +294,12 @@ public class TrialDetectionController extends BladeController {
     @ApiOperationSupport(order = 18)
     @ApiOperation(value = "自检多表PDF预览", notes = "传入nodeId=试验记录id、classify、contractId、projectId")
     public R<Object> getPDFs(String nodeId, String classify, String contractId, String projectId) throws FileNotFoundException {
-        String sql = "select pdf_url,e_visa_pdf_url from u_information_query where project_id ='" + projectId + "' and classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "'";
+        String sql = "select pdf_url,e_visa_pdf_url from u_information_query where status in(0,1,2) and project_id ='" + projectId + "' and classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "'";
         List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
         if (maps.size() >= 1) {
             Map<String, Object> stringObjectMap = maps.get(0);
             Object pdfUrl = stringObjectMap.get("pdf_url");
-            if (stringObjectMap.get("e_visa_pdf_url") != null) {
+            if (stringObjectMap.get("e_visa_pdf_url") != null ) {
                 //优先使用电签的pdf
                 pdfUrl = stringObjectMap.get("e_visa_pdf_url");
             }

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

@@ -341,4 +341,9 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
         }
     }
 
+    @Override
+    public void saveArchiveFileByBIM(ArchiveFile archiveFile) {
+        iArchiveFileService.save(archiveFile);
+    }
+
 }

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

@@ -160,6 +160,10 @@
         <if test="vo.rectification != null and vo.rectification != ''">
             and u.rectification = #{vo.rectification}
         </if>
+        <if test="vo.sourceType != null and vo.sourceType != ''">
+            and u.source_type = #{sourceType}
+        </if>
+
         <if test="vo.rectification == null and vo.archiveId == null">
             and (u.is_auto_file is null or u.is_auto_file != 1)
         </if>

+ 41 - 20
blade-service/blade-business/src/main/java/org/springblade/business/utils/PDFUtil.java

@@ -8,12 +8,17 @@ import com.spire.pdf.PdfDocument;
 import com.spire.pdf.PdfPageBase;
 import com.spire.pdf.general.find.PdfTextFind;
 import com.spire.pdf.general.find.PdfTextFindCollection;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.text.PDFTextStripper;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.tool.utils.Func;
 
+import java.io.File;
+import java.io.FileInputStream;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 
 public class PDFUtil {
@@ -89,34 +94,50 @@ public class PDFUtil {
         table.addCell(cell);
     }
 
-    public static List<String> getPdfSignIds(String pdfUrl) {
-        PdfDocument pdf = new PdfDocument();
+    public static List<String>  getPdfSignIds(String pdfUr) {
         List<String> eVisaConfigList = new ArrayList<>();
-        try {
-            InputStream ossInputStream = CommonUtil.getOSSInputStream(pdfUrl);
-            //加载PDF文档
-            pdf.loadFromStream(ossInputStream);
-
-            for(int i= 0;i<pdf.getPages().getCount();i++){
-                PdfPageBase page = pdf.getPages().get(i);
-                PdfTextFindCollection allText = page.findAllText();
-                PdfTextFind[] finds = allText.getFinds();
-                for(int k=0;k<finds.length;k++){
-                    String textStr = finds[k].getMatchText();
-                    System.out.println(textStr);
-                    String[] textS = Func.toStrArray("\\|\\|",textStr);
-                    for(String txt : textS){
-                        if (txt.length() >= 15 && Func.isNumeric(txt)||(Func.isNumeric(txt)&&txt.length()==8&&txt.startsWith("123"))) {
-                            eVisaConfigList.add(txt);
+        try  {
+            InputStream inputStream = CommonUtil.getOSSInputStream(pdfUr);
+            PDDocument document = PDDocument.load(inputStream);
+            PDFTextStripper stripper = new PDFTextStripper();
+            String text = stripper.getText(document);
+            String[] lines = text.split("[ \\n]+");
+            for(int k=0;k<lines.length;k++){
+                String textStr = lines[k];
+                if(textStr.indexOf("*")>=0){
+                    textStr = textStr.substring(textStr.lastIndexOf("*")+1,textStr.length());
+                }
+
+                String[] textS = Func.toStrArray("\\|\\|",textStr);
+                for(String txt : textS){
+                    for (int i = 0; i < txt.length(); i++) {
+                        if (!Character.isDigit(txt.charAt(i))) {
+                            txt=txt.substring(0,i);
                         }
                     }
+                    if (txt.length() >= 15 && Func.isNumeric(txt)) {
+                        eVisaConfigList.add(txt);
+                    }
+                }
+
+                // 特殊处理
+                if(textStr.indexOf("1")>=0){
+                    String txt = textStr.substring(textStr.indexOf("1"));
+                    if (txt.length() >= 15 && Func.isNumeric(txt)) {
+                        System.out.println(txt);
+                        eVisaConfigList.add(txt);
+                    }
                 }
             }
-            ossInputStream.close();
+
+            List<String> unique = eVisaConfigList.stream().distinct().collect(Collectors.toList());
+            document.close();
+            return unique;
         }catch (Exception e){
             e.printStackTrace();
+            System.out.println("pdf大小为0");
+            return eVisaConfigList;
         }
-        return eVisaConfigList;
     }
 
 /*     public static void main(String[] args) {

+ 7 - 7
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ArchiveController.java

@@ -90,10 +90,10 @@ public class ArchiveController {
                 }
             }
         }
-        System.out.println("队列数量_img" + executor.getQueue().size());
-        System.out.println("活跃数量_img" + executor.getActiveCount());
-        System.out.println("总共数量_img" + executor.getTaskCount());
-        System.out.println("完成数量_img" + executor.getCompletedTaskCount());
+        System.out.println("队列数量_img2" + executor.getQueue().size());
+        System.out.println("活跃数量_img2" + executor.getActiveCount());
+        System.out.println("总共数量_img2" + executor.getTaskCount());
+        System.out.println("完成数量_img2" + executor.getCompletedTaskCount());
     }
 
     // 分解第一页的任务
@@ -181,12 +181,12 @@ public class ArchiveController {
             String firstPage = FileUtils.getSysLocalFileUrl() + "archiveSplit/";
             int bkb = 0 ;
             //将imagePath 的数据转成一个可解析的html
-            String htmlUrl1 = pngToHtml(firstPage, archiveId);
-            String htmlUrl2 = pngToHtml(firstPage, archiveId);
+            String htmlUrl = pngToHtml(firstPage, archiveId);
+            /*String htmlUrl2 = pngToHtml(firstPage, archiveId);
             String htmlUrl = "";
             if (htmlUrl1.equals(htmlUrl2) && htmlUrl1.indexOf("_001.html") >= 0 && htmlUrl1.indexOf("archiveSplit") >= 0) {
                 htmlUrl = htmlUrl2;
-            }
+            }*/
 
             if (htmlUrl.indexOf("_001.html") >= 0 && htmlUrl.indexOf("archiveSplit") >= 0) {
                 String htmlString = IoUtil.readToString(new FileInputStream(htmlUrl));

+ 1 - 1
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java

@@ -58,7 +58,7 @@ public class EVController {
     @Resource(name = "taskExecutor1")
     private ThreadPoolExecutor executor;
 
-    @Scheduled(cron = "0/10 * * * * ?")
+   // @Scheduled(cron = "0/10 * * * * ?")
     public void SignInfo() {
         //执行代码
 

+ 10 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java

@@ -107,6 +107,9 @@ public class ArchiveTreeContractController extends BladeController {
         if(detail.getReviewer()==null&&info!=null&&info.getReviewer()!=null){
             detail.setReviewer(info.getReviewer());
         }
+        if(detail.getFileNumberPrefix()==null&&info!=null&&info.getPrefix()!=null){
+            detail.setFileNumberPrefix(info.getPrefix());
+        }
         return R.data(detail);
     }
 
@@ -154,7 +157,10 @@ public class ArchiveTreeContractController extends BladeController {
     @PostMapping("/update")
     @ApiOperationSupport(order = 5)
     @ApiOperation(value = "修改", notes = "传入archiveTreeContract")
-    public R update(@Valid @RequestBody ArchiveTreeContract archiveTreeContract) {
+    /**
+     * isSaveChild 0是保存子节点,1不保存子节点
+     */
+    public R update(@Valid @RequestBody ArchiveTreeContractDTO archiveTreeContract) {
         if (archiveTreeContract == null) {
             return R.fail(200, "未查询到对应节点信息");
         }
@@ -219,9 +225,9 @@ public class ArchiveTreeContractController extends BladeController {
 
         boolean b = archiveTreeContractService.updateById(ar);
         //更新下级节点为同一规则
-
-        archiveTreeContractService.updateAllSonNodeIdsForArchiveAutoRule(ar);
-
+        if(archiveTreeContract.getIsSaveChild()!=null&&archiveTreeContract.getIsSaveChild()==0){
+            archiveTreeContractService.updateAllSonNodeIdsForArchiveAutoRule(ar);
+        }
         return R.status(b);
     }
 

+ 3 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/SystemMsgController.java

@@ -47,7 +47,9 @@ public class SystemMsgController extends BladeController {
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "新增", notes = "传入版本信息")
     public R add(@Valid @RequestBody SystemMsg systemMsg){
-        systemMsg.setPushDateTime(systemMsg.getPushDateTime().with(ChronoField.SECOND_OF_MINUTE, 0));
+        //systemMsg.setPushDateTime(systemMsg.getPushDateTime().with(ChronoField.SECOND_OF_MINUTE, 0));
+
+        systemMsg.setPushDateTime(systemMsg.getPushDateTime());
         //如果新增的是更新公告,则校验是否已经存在更新公告
         if (systemMsg.getMsgType() == 1) {
             List<SystemMsg> list = systemMsgService.list(new LambdaQueryWrapper<SystemMsg>()

+ 13 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/job/SystemMsgJob.java

@@ -10,6 +10,7 @@ import org.springblade.manager.entity.SystemMsg;
 import org.springblade.manager.service.ISystemMsgService;
 import org.springblade.websocket.vo.MsgVO;
 import org.springblade.websocket.vo.SystMsgVO;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -34,13 +35,20 @@ public class SystemMsgJob {
 
     private final JdbcTemplate jdbcTemplate;
 
+    // 读取配置并设置默认值
+    @Value("${scheduler.enabled:true}")
+    private boolean schedulerEnabled;
+
     /**
      *  定时推送公告-取消公告-修改公告状态,不想污染日志,使用jdbc
      */
     @Scheduled(cron = "0/10 * * * * ?")
     public void autoUpdateMsgStatus(){
+        // 本地环境跳过执行(可添加日志输出)
+        if (!schedulerEnabled) return;
+
         /** 普通公告推送*/
-        String sql1 = "select * from m_system_msg where is_deleted = 0 and msg_type = 2 and push_status = 1 and push_end_date_time >= now()";
+        String sql1 = "select * from m_system_msg where is_deleted = 0 and msg_type = 2 and push_status = 1 and now()<=push_end_date_time and now()>=push_date_time ";
         List<SystemMsg> list1 = jdbcTemplate.query(sql1,new BeanPropertyRowMapper<>(SystemMsg.class));
         if (list1.size() > 0){
             for (SystemMsg msg : list1) {
@@ -52,7 +60,7 @@ public class SystemMsgJob {
         }
         /** 维护公告推送*/
         //String sql2 = "select * from m_system_msg where is_deleted = 0 and msg_type = 1 and status = 1 and push_status = 1 and push_date_time >= now() and push_warn_date_time <= TIMESTAMPADD(SECOND, 1, NOW())";
-        String sql2 = "select * from m_system_msg where is_deleted = 0 and msg_type = 1 and status = 1 and push_status = 1 and push_warn_date_time>=NOW() ";
+        String sql2 = "select * from m_system_msg where is_deleted = 0 and msg_type = 1 and status = 1 and push_status = 1 and TIMESTAMPDIFF(SECOND,push_warn_date_time,sysdate())>0  ";
         List<SystemMsg> list2 = jdbcTemplate.query(sql2,new BeanPropertyRowMapper<>(SystemMsg.class));
         if (list2.size() > 0){
             for (SystemMsg msg : list2) {
@@ -64,12 +72,13 @@ public class SystemMsgJob {
         }
         /** 维护倒计时*/
       //  String sql3 = "select * from m_system_msg where is_deleted = 0 and msg_type = 1 and status != 3 and TIMESTAMPADD(SECOND, 1, NOW()) >= push_count_down_date_time and now() < push_date_time ";
-        String sql3 = "select * from m_system_msg where is_deleted = 0 and msg_type = 1 and status != 3 and push_count_down_date_time >=NOW() ";
+        String sql3 = "select * from m_system_msg where is_deleted = 0 and msg_type = 1 and status != 3 and TIMESTAMPDIFF(SECOND,push_count_down_date_time,sysdate())>0  ";
         List<SystemMsg> list3 = jdbcTemplate.query(sql3,new BeanPropertyRowMapper<>(SystemMsg.class));
         if (list3.size() > 0){
             SystemMsg msg = list3.get(0);
             msg.setMsgType(3);
-            msg.setMsgContent(Duration.between(LocalDateTime.now(), msg.getPushDateTime()).getSeconds()+"");
+           // msg.setMsgContent(Duration.between(LocalDateTime.now(), msg.getPushDateTime()).getSeconds()+"");
+            msg.setMsgContent((msg.getMsgCountDownTime()*60)+"");
             systemMsgService.pushSystemMsgToAllUser(msg);
             systemMsgService.update(new LambdaUpdateWrapper<SystemMsg>()
                     .set(SystemMsg::getStatus,3)

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -3257,14 +3257,14 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             //报告编号
             if (bgHB.size() >= 1 && StringUtils.isNotEmpty(dto.getReportNo())) {
                 for (Element element : bgHB) {
-                    DataInfo.put(element.attr("keyname"), "NUMBER-" + dto.getReportNo());
+                   // DataInfo.put(element.attr("keyname"), "NUMBER-" + dto.getReportNo());
                     break;
                 }
             }
             //记录编号
             if (jlBH.size() >= 1 && StringUtils.isNotEmpty(dto.getRecordNo())) {
                 for (Element element : jlBH) {
-                    DataInfo.put(element.attr("keyname"), "NUMBER-" + dto.getRecordNo());
+                   // DataInfo.put(element.attr("keyname"), "NUMBER-" + dto.getRecordNo());
                     break;
                 }
             }

+ 12 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/controller/WbsTreeController.java

@@ -19,6 +19,7 @@ import org.springblade.manager.vo.PrivateTreeVO2;
 import org.springblade.manager.vo.WbsTreeContractLazyVO;
 import org.springblade.system.user.service.IUserService;
 import org.springblade.system.user.util.ComplexStringComparator;
+import org.springblade.system.user.vo.InformationQueryBIMVO;
 import org.springblade.system.user.vo.InformationQueryVO1;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
@@ -167,6 +168,17 @@ public class WbsTreeController extends BladeController {
         return R.data(iUserService.queryInformationByContractIdAndName(contractId, name));
     }
 
+    @GetMapping("/informationWriteQuery/queryInformationByFileNumber")
+    @ApiOperation("根据合同段Id,模糊文件名查询(杭宁项目专用)")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "contractId",value = "合同段Id"),
+            @ApiImplicitParam(name="fileNumber",value = "划分编号")
+    })
+    public R<List<InformationQueryBIMVO>> queryInformationByFileNumber(@RequestParam String contractId, @RequestParam String fileNumber){
+        return R.data(iUserService.queryInformationByFileNumber(contractId, fileNumber));
+    }
+
+
 //    /**
 //     * 项目全加载树
 //     *

+ 4 - 4
blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.java

@@ -25,10 +25,7 @@ import org.springblade.business.vo.InformationQueryVO;
 import org.springblade.manager.vo.PrivateTreeVO2;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.excel.UserExcel;
-import org.springblade.system.user.vo.InformationQueryVO1;
-import org.springblade.system.user.vo.InformationQueryVO2;
-import org.springblade.system.user.vo.UserContractInfoVO;
-import org.springblade.system.user.vo.UserVO;
+import org.springblade.system.user.vo.*;
 
 import java.util.List;
 
@@ -80,4 +77,7 @@ public interface UserMapper extends BaseMapper<User> {
     List<PrivateTreeVO2> getAllNode(@Param("projectId") String projectId);
 
     List<InformationQueryVO1> queryInformationByContractIdAndName(@Param("contractId")String contractId, @Param("name")String name);
+
+    //
+    List<InformationQueryBIMVO> queryInformationByFileNumber(@Param("contractId")String contractId, @Param("name")String name);
 }

+ 4 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml

@@ -247,4 +247,8 @@
         </if>
     </select>
 
+    <select id="queryInformationByFileNumber" resultType="org.springblade.system.user.vo.InformationQueryBIMVO">
+
+    </select>
+
 </mapper>

+ 3 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java

@@ -16,6 +16,7 @@ import org.springblade.system.user.entity.UserInfo;
 import org.springblade.system.user.entity.UserOauth;
 import org.springblade.system.user.enums.UserEnum;
 import org.springblade.system.user.excel.UserExcel;
+import org.springblade.system.user.vo.InformationQueryBIMVO;
 import org.springblade.system.user.vo.InformationQueryVO1;
 import org.springblade.system.user.vo.UserVO;
 
@@ -244,4 +245,6 @@ public interface IUserService extends BaseService<User> {
 
 
     List<InformationQueryVO1> queryInformationByContractIdAndName(String contractId, String name);
+
+    List<InformationQueryBIMVO> queryInformationByFileNumber(String contractId, String fieldNumber);
 }

+ 12 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -63,6 +63,7 @@ import org.springblade.system.user.service.IUserOauthService;
 import org.springblade.system.user.service.IUserService;
 import org.springblade.system.user.util.FileUtils;
 import org.springblade.system.user.util.ForestNodeMerger;
+import org.springblade.system.user.vo.InformationQueryBIMVO;
 import org.springblade.system.user.vo.InformationQueryVO1;
 import org.springblade.system.user.vo.InformationQueryVO2;
 import org.springblade.system.user.vo.UserVO;
@@ -2048,4 +2049,15 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
     }
 
 
+    @Override
+    public List<InformationQueryBIMVO> queryInformationByFileNumber(String contractId, String fileNumber) {
+        if (StringUtil.isEmpty(contractId)) {
+            throw new ServiceException("未获取到合同段id");
+        }
+
+        List<InformationQueryBIMVO> informationQueryVO1s = baseMapper.queryInformationByFileNumber(contractId, fileNumber);
+
+        return informationQueryVO1s;
+    }
+
 }