Sfoglia il codice sorgente

Merge branch 'dev' of http://219.151.181.73:3000/zhuwei/bladex into feature-lihb-bug

LHB 1 mese fa
parent
commit
47394df56b
26 ha cambiato i file con 545 aggiunte e 42 eliminazioni
  1. 2 1
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/TaskSplit.java
  2. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java
  3. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java
  4. 28 0
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/vo/InformationQueryBIMVO.java
  5. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileAutoController.java
  6. 3 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/TaskSplitController.java
  7. 6 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.java
  8. 6 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.xml
  9. 65 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveNameService.java
  10. 287 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveNameServiceImpl.java
  11. 16 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  12. 30 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/TaskSplitServiceImpl.java
  13. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/TraceLogServiceImpl.java
  14. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java
  15. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java
  16. 41 20
      blade-service/blade-business/src/main/java/org/springblade/business/utils/PDFUtil.java
  17. 3 3
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ArchiveController.java
  18. 1 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java
  19. 3 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/job/SystemMsgJob.java
  20. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  21. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java
  22. 12 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/controller/WbsTreeController.java
  23. 4 4
      blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.java
  24. 4 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml
  25. 3 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java
  26. 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;
 }

+ 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);
 }

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

@@ -159,6 +159,12 @@ public class ArchiveTreeContract extends BaseEntity {
      */
     private Long extKeyId;
 
+    /**
+     *
+     * 1单位工程2分部工程 3子分部工程 4分项工程5子分项工程 6工序
+     */
+    private Integer extNodeType;
+
     /**
      * 自动立卷类型 1最高 2分类并卷 3单独组卷   说明:1规则下可以有2或3;2和3两种规则互斥,2下不能有3,3下不能有2;
      */

+ 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,"");
         /**
          * 案卷的只有一个文件,不合并先,需要的时候在把合并方法放出来
          * **/

+ 3 - 2
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;
@@ -73,13 +74,13 @@ public class TaskSplitController extends BladeController {
 	/**
 	 * 查询任务任务信息
 	 */
-/*	@GetMapping("/selectTaskSplit")
+	@GetMapping("/selectTaskSplit")
 	@ApiOperationSupport(order = 1)
 	@ApiOperation(value = "查询任务任务信息", notes = "传入taskSplit")
 	public R<IPage<TaskSplitVO>> page(TaskSplitVO taskSplit, Query query) {
 		IPage<TaskSplitVO> pages = taskSplitService.selectTaskSplitPage(Condition.getPage(query), taskSplit);
 		return R.data(pages);
-	}*/
+	}
 
 	/**
 	 * 新增 解析主标任务

+ 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>

+ 65 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveNameService.java

@@ -0,0 +1,65 @@
+package org.springblade.archive.service;
+
+import org.springblade.manager.entity.ArchiveTreeContract;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+public interface IArchiveNameService {
+
+    /* 节点层级结构(通用静态类)
+     */
+    public class NodeHierarchy {
+        private final Map<Long, List<ArchiveTreeContract>> hierarchyMap;
+        private final Map<Long, ArchiveTreeContract> allNodeMap;
+        private final Map<Long, List<ArchiveTreeContract>> childrenMap; // 新增:父节点到子节点映射
+        private final Map<Long, Integer> totalChildrenCountMap; // 新增:每个父节点的子节点总数
+
+        public NodeHierarchy(
+                Map<Long, List<ArchiveTreeContract>> hierarchyMap,
+                Map<Long, ArchiveTreeContract> allNodeMap,
+                Map<Long, List<ArchiveTreeContract>> childrenMap,
+                Map<Long, Integer> totalChildrenCountMap
+        ) {
+            this.hierarchyMap = hierarchyMap;
+            this.allNodeMap = allNodeMap;
+            this.childrenMap = childrenMap;
+            this.totalChildrenCountMap = totalChildrenCountMap;
+        }
+
+        // 获取某个节点的所有直接子节点
+        public List<ArchiveTreeContract> getChildren(Long parentId) {
+            return childrenMap.getOrDefault(parentId, Collections.emptyList());
+        }
+
+        // 获取某个父节点的子节点总数
+        public int getTotalChildrenCount(Long parentId) {
+            return totalChildrenCountMap.getOrDefault(parentId, 0);
+        }
+
+        // 原始 getters...
+        public Map<Long, List<ArchiveTreeContract>> getHierarchyMap() {
+            return hierarchyMap;
+        }
+
+        public Map<Long, ArchiveTreeContract> getAllNodeMap() {
+            return allNodeMap;
+        }
+    }
+
+    /* 构建节点层级结构映射
+     */
+    NodeHierarchy buildNodeHierarchy(List<ArchiveTreeContract> nodeList);
+
+    /* 获取节点的层级名称
+     */
+    String getLevelName(NodeHierarchy hierarchy, Long nodeId);
+
+    /* 生成完整的层级名称
+     */
+    String generateFullLevelName(
+            List<Long> nodeList,
+            NodeHierarchy hierarchy
+    );
+}

+ 287 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveNameServiceImpl.java

@@ -0,0 +1,287 @@
+package org.springblade.archive.service.impl;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.archive.service.IArchiveNameService;
+import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.feign.ArchiveTreeContractClient;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+@AllArgsConstructor
+public class ArchiveNameServiceImpl implements IArchiveNameService {
+
+    private final ArchiveTreeContractClient archiveTreeContractClient;
+
+
+    @Override
+    public NodeHierarchy buildNodeHierarchy(List<ArchiveTreeContract> nodeList) {
+        if (nodeList == null || nodeList.isEmpty()) {
+            return new NodeHierarchy(
+                    Collections.emptyMap(),
+                    Collections.emptyMap(),
+                    Collections.emptyMap(),
+                    Collections.emptyMap()
+            );
+        }
+
+        // 1. 创建数据结构容器
+        Map<Long, List<ArchiveTreeContract>> hierarchyMap = new HashMap<>();
+        Map<Long, ArchiveTreeContract> allNodeMap = new HashMap<>();
+        Map<Long, List<ArchiveTreeContract>> childrenMap = new HashMap<>();
+        Map<Long, Integer> totalChildrenCountMap = new HashMap<>();
+
+        // 2. 处理当前节点并加入映射
+        Map<Long, ArchiveTreeContract> tempNodeMap = new HashMap<>();
+        for (ArchiveTreeContract node : nodeList) {
+            Long nodeId = node.getId();
+            tempNodeMap.put(nodeId, node);
+            allNodeMap.put(nodeId, node);
+            childrenMap.putIfAbsent(nodeId, new ArrayList<>());
+        }
+
+        // 3. 收集缺失的祖先节点ID
+        Set<Long> missingAncestorIds = new HashSet<>();
+        for (ArchiveTreeContract node : nodeList) {
+            String ancestors = node.getAncestors();
+            if (ancestors == null || ancestors.isEmpty()) continue;
+
+            Arrays.stream(ancestors.split(","))
+                    .map(String::trim)
+                    .filter(id -> !id.isEmpty())
+                    .map(Long::parseLong)
+                    .filter(ancestorId -> !tempNodeMap.containsKey(ancestorId))
+                    .forEach(missingAncestorIds::add);
+        }
+
+        // 4. 批量获取缺失的祖先节点
+        List<ArchiveTreeContract> missingAncestors = Collections.emptyList();
+        if (!missingAncestorIds.isEmpty()) {
+            String ancestorIdsStr = missingAncestorIds.stream()
+                    .map(String::valueOf)
+                    .collect(Collectors.joining(","));
+
+            missingAncestors = archiveTreeContractClient
+                    .getArchiveTreeContractListByIds(ancestorIdsStr);
+
+            for (ArchiveTreeContract ancestor : missingAncestors) {
+                Long ancestorId = ancestor.getId();
+                tempNodeMap.put(ancestorId, ancestor);
+                allNodeMap.put(ancestorId, ancestor);
+                childrenMap.putIfAbsent(ancestorId, new ArrayList<>());
+            }
+
+            log.debug("成功获取 {} 个祖先节点", missingAncestors.size());
+        }
+
+        // 5. 合并所有节点
+        List<ArchiveTreeContract> allNodes = new ArrayList<>(nodeList);
+        allNodes.addAll(missingAncestors);
+
+        // 6. 为每个节点构建完整的层级路径
+        for (ArchiveTreeContract node : allNodes) {
+            Long nodeId = node.getId();
+            List<ArchiveTreeContract> hierarchyList = new ArrayList<>();
+
+            // 处理祖先路径
+            String ancestors = node.getAncestors();
+            if (ancestors != null && !ancestors.isEmpty()) {
+                String[] pathIds = ancestors.split(",");
+                for (String idStr : pathIds) {
+                    idStr = idStr.trim();
+                    if (!idStr.isEmpty()) {
+                        Long id = Long.parseLong(idStr);
+                        ArchiveTreeContract ancestor = tempNodeMap.get(id);
+                        if (ancestor != null) {
+                            hierarchyList.add(ancestor);
+                        }
+                    }
+                }
+            }
+
+            // 添加当前节点到路径末端
+            hierarchyList.add(node);
+
+            // 存入层级映射
+            hierarchyMap.put(nodeId, hierarchyList);
+
+            // 构建父子关系映射
+            Long parentId = node.getParentId();
+            if (parentId != null) {
+                childrenMap.computeIfAbsent(parentId, k -> new ArrayList<>()).add(node);
+            }
+        }
+
+        // 7. 填充总子节点计数
+        for (Map.Entry<Long, List<ArchiveTreeContract>> entry : childrenMap.entrySet()) {
+            totalChildrenCountMap.put(entry.getKey(), entry.getValue().size());
+        }
+
+        return new NodeHierarchy(hierarchyMap, allNodeMap, childrenMap, totalChildrenCountMap);
+    }
+
+    @Override
+    public String getLevelName(NodeHierarchy hierarchy, Long nodeId) {
+        Map<Long, ArchiveTreeContract> allNodeMap = hierarchy.getAllNodeMap();
+
+        // 1. 获取目标节点
+        ArchiveTreeContract targetNode = allNodeMap.get(nodeId);
+        if (targetNode == null) {
+            log.warn("无法找到节点 {} 的详细信息", nodeId);
+            return "未知节点";
+        }
+
+        // 2. 获取节点的层级路径
+        Map<Long, List<ArchiveTreeContract>> hierarchyMap = hierarchy.getHierarchyMap();
+        List<ArchiveTreeContract> hierarchyList = hierarchyMap.getOrDefault(
+                nodeId, Collections.emptyList()
+        );
+
+        // 3. 提取关键层级的节点
+        ArchiveTreeContract lastUnitNode = null;
+        ArchiveTreeContract lastDivisionNode = null;
+        ArchiveTreeContract lastItemNode = null;
+
+        for (ArchiveTreeContract node : hierarchyList) {
+            // 获取displayHierarchy值
+            Integer extNodeType = node.getExtNodeType();
+
+            // 处理空值或空白值
+            if (extNodeType == null ) {
+                continue;
+            }
+
+            try {
+                // 尝试转换为
+
+                switch (extNodeType) {
+                    case 1:
+                        lastUnitNode = node;
+                        break;
+                    case 2:
+                    case 3:
+                        lastDivisionNode = node;
+                        break;
+                    case 4:
+                    case 5:
+                        lastItemNode = node;
+                        break;
+                    // 其他情况不处理
+                }
+            } catch (NumberFormatException e) {
+                // 记录格式错误但继续处理其他节点
+                log.warn("节点 {} 的displayHierarchy值 '{}' 无法转换为整数",
+                        node.getNodeName(), extNodeType);
+            }
+        }
+
+        // 4. 构建层级名称
+        StringBuilder nameBuilder = new StringBuilder();
+
+        // 依次添加单位工程、分部工程、分项工程的名称
+        if (lastUnitNode != null) {
+            nameBuilder.append(lastUnitNode.getNodeName());
+        }
+        if (lastDivisionNode != null) {
+            nameBuilder.append(lastDivisionNode.getNodeName());
+        }
+        if (lastItemNode != null) {
+            nameBuilder.append(lastItemNode.getNodeName());
+        }
+
+        // 5. 返回结果(如果没有找到任何层级节点,则返回目标节点名称)
+        return nameBuilder.length() > 0 ?
+                nameBuilder.toString() :
+                targetNode.getNodeName();
+    }
+
+
+    @Override
+    public String generateFullLevelName(
+            List<Long> nodeIds,
+            NodeHierarchy hierarchy
+    ) {
+        // 1. 获取输入节点
+        Map<Long, ArchiveTreeContract> allNodeMap = hierarchy.getAllNodeMap();
+        List<ArchiveTreeContract> nodes = new ArrayList<>();
+
+        for (Long nodeId : nodeIds) {
+            ArchiveTreeContract node = allNodeMap.get(nodeId);
+            if (node != null) {
+                nodes.add(node);
+            }
+        }
+
+        if (nodes.isEmpty()) {
+            return "";
+        }
+
+        // 2. 按父节点分组
+        Map<Long, List<ArchiveTreeContract>> parentGroups = new LinkedHashMap<>();
+
+        for (ArchiveTreeContract node : nodes) {
+            Long parentId = node.getParentId();
+
+            // 如果没有父节点,单独处理
+            if (parentId == null) {
+                parentGroups.put(node.getId(), Collections.singletonList(node));
+            } else {
+                parentGroups.computeIfAbsent(parentId, k -> new ArrayList<>()).add(node);
+            }
+        }
+
+        // 3. 构建结果部分
+        List<String> nameParts = new ArrayList<>();
+
+        for (Map.Entry<Long, List<ArchiveTreeContract>> entry : parentGroups.entrySet()) {
+            Long groupId = entry.getKey();
+            List<ArchiveTreeContract> groupNodes = entry.getValue();
+
+            // 处理没有父节点的情况
+            if (groupId == null) {
+                groupId = groupNodes.get(0).getId();
+            }
+
+            // 获取父节点(组代表)
+            ArchiveTreeContract parent = allNodeMap.get(groupId);
+
+            // 父节点不存在(特殊情况处理)
+            if (parent == null) {
+                // 可能是没有父节点的单独节点
+                for (ArchiveTreeContract node : groupNodes) {
+                    nameParts.add(node.getNodeName());
+                }
+                continue;
+            }
+
+            // 获取父节点层级名称
+            String parentLevelName = getLevelName(hierarchy, parent.getId());
+
+            // 获取该父节点下的所有子节点(在hierarchy中)
+            List<ArchiveTreeContract> allChildren = hierarchy.getChildren(parent.getId());
+
+            // 获取该父节点下的所有子节点数量
+            int totalChildrenCount = hierarchy.getTotalChildrenCount(parent.getId());
+
+            // 判断是否涵盖所有子节点
+            if (groupNodes.size() == totalChildrenCount && !allChildren.isEmpty()) {
+                // 涵盖所有子节点,直接使用父节点层级名称
+                nameParts.add(parentLevelName);
+            } else {
+                // 部分子节点,添加节点名称
+                StringBuilder groupName = new StringBuilder(parentLevelName);
+                for (ArchiveTreeContract node : groupNodes) {
+                    groupName.append(node.getNodeName());
+                }
+                nameParts.add(groupName.toString());
+            }
+        }
+
+        // 4. 拼接最终结果
+        return String.join("、", nameParts);
+    }
+}

+ 16 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -4121,6 +4121,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		if(fileUrl==null || Func.isNull(fileUrl)){
 			R.fail("请上传fileUrl");
 		}
+
+
 		if(fileName==null || Func.isNull(fileName)){
 			R.fail("请上传fileName");
 		}
@@ -4134,6 +4136,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		if(treeContractId==null || Func.isNull(treeContractId)){
 			R.fail("请校验传输的nodeId和contractId,没有查到父节点Id");
 		}
+
+
+
 		// 将数据插入到 auto表中
 		ArchivesAuto archivesAuto = new ArchivesAuto();
 		long newPkId = SnowFlakeUtil.getId(); //主键Id
@@ -4141,8 +4146,17 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		archivesAuto.setProjectId(Func.toLong(contractInfo.getPId()));
 		archivesAuto.setContractId(Func.toLong(contractId));
 		archivesAuto.setName(fileName);
-
-		return null;
+		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,"操作成功");
 	}
 
 }

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

@@ -59,7 +59,7 @@ public class TraceLogServiceImpl extends BaseServiceImpl<TraceLogMapper, TraceLo
             TraceLog traceLog = new TraceLog();
             traceLog.setTraceId(traceId);
             traceLog.setContent(content);
-            save(traceLog);
+            //save(traceLog);
 
         } catch (Exception e) {
             // 异常处理逻辑,比如打印日志

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

@@ -294,7 +294,7 @@ 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 status in(1,2) and 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);

+ 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);
+    }
+
 }

+ 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) {

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

@@ -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() {
         //执行代码
 

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

@@ -42,7 +42,7 @@ public class SystemMsgJob {
     /**
      *  定时推送公告-取消公告-修改公告状态,不想污染日志,使用jdbc
      */
-     @Scheduled(cron = "0/10 * * * * ?")
+    @Scheduled(cron = "0/10 * * * * ?")
     public void autoUpdateMsgStatus(){
         // 本地环境跳过执行(可添加日志输出)
         if (!schedulerEnabled) return;
@@ -71,13 +71,13 @@ public class SystemMsgJob {
                     .in(SystemMsg::getId,list2.stream().map(SystemMsg::getId).collect(Collectors.toList())));
         }
         /** 维护倒计时*/
-        //  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 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 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>()

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

@@ -50,6 +50,7 @@
         <result column="archive_name_suffix" property="archiveNameSuffix"/>
         <result column="ext_key_id" property="extKeyId"/>
         <result column="out_id" property="outId"/>
+        <result column="ext_node_type" property="extNodeType"/>
     </resultMap>
     <delete id="removeImageNodeChild">
         delete from m_archive_tree_contract

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java

@@ -513,6 +513,7 @@ public class ArTreeContractInitServiceImpl {
             archiveTree.setExtAttachId(subTree.getId());
             archiveTree.setSort(wbsTreeVO2.getSort());
             archiveTree.setDisplayHierarchy(level.toString());
+            archiveTree.setExtNodeType(wbsTreeVO2.getNodeType());
             archiveTree.setIsDeleted(0);
             //上传节点
             if (wbsTreeVO2.getNodeType() != null && wbsTreeVO2.getNodeType().longValue() == level) {

+ 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;
+    }
+
 }