浏览代码

Merge remote-tracking branch 'origin/master' into master

yangyj 2 年之前
父节点
当前提交
e799215dec
共有 27 个文件被更改,包括 626 次插入83 次删除
  1. 0 9
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveVo.java
  2. 19 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO2.java
  3. 25 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/CheckoutVO.java
  4. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java
  5. 5 2
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/MoistureContentDTO.java
  6. 11 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractLazyFileVO.java
  7. 16 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  8. 6 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java
  9. 13 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  10. 2 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  11. 48 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  12. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.xml
  13. 7 6
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml
  14. 2 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  15. 10 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  16. 10 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/MixProportionInfoController.java
  17. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java
  18. 27 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java
  19. 10 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  20. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/MixProportionInfoMapper.java
  21. 6 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/MixProportionInfoMapper.xml
  22. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  23. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IMixProportionInfoService.java
  24. 4 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
  25. 27 10
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java
  26. 54 21
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/MixProportionInfoServiceImpl.java
  27. 316 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

+ 0 - 9
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveVo.java

@@ -1,9 +0,0 @@
-package org.springblade.archive.vo;
-
-/**
- * @author yangyj
- * @Date 2023/2/17 10:40
- * @description TODO
- */
-public class ArchiveVo {
-}

+ 19 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO2.java

@@ -0,0 +1,19 @@
+package org.springblade.archive.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.archive.entity.ArchivesAuto;
+
+/**
+ * @author yangyj
+ * @Date 2023/2/17 10:40
+ * @description TODO
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ArchivesAutoVO2 extends ArchivesAuto {
+
+    @ApiModelProperty("主节点")
+    private String masterNode;
+}

+ 25 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/CheckoutVO.java

@@ -0,0 +1,25 @@
+package org.springblade.archive.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.archive.entity.ArchivesAuto;
+
+import java.util.List;
+
+/**
+ * @Param    在线验收首页VO
+ * @Author wangwl
+ * @Date 2023/8/23 14:52
+ **/
+@Data
+public class CheckoutVO {
+
+    @ApiModelProperty("节点名称")
+    private String nodeName;
+
+    @ApiModelProperty("档案总数")
+    private Integer total;
+
+    @ApiModelProperty("档案集合")
+    private List<ArchivesAutoVO2> list;
+}

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

@@ -133,5 +133,5 @@ public interface ArchiveFileClient {
     void updateArchiveFile(@RequestBody List<ArchiveFile> files);
 
     @PostMapping(API_PREFIX + "/getListByContractId")
-    List<ArchiveFile> getListByContractId(Long contractId);
+    List<ArchiveFile> getListByContractId(@RequestParam Long contractId);
 }

+ 5 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/MoistureContentDTO.java

@@ -16,8 +16,11 @@ public class MoistureContentDTO {
     @ApiModelProperty(value = "当前位置")
     private String key ;
 
-    @ApiModelProperty(value = "配合比id")
-    private Long mixProportionId ;
+    @ApiModelProperty(value = "合同段id")
+    private String contractId ;
+
+    @ApiModelProperty(value = "设计强度")
+    private String designStrength;
 
     @ApiModelProperty(value = "黄砂含水率")
     private BigDecimal sand ;

+ 11 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractLazyFileVO.java

@@ -0,0 +1,11 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WbsTreeContractLazyFileVO implements Serializable {
+    private Long wbsId;
+    private Long id;
+}

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

@@ -32,6 +32,7 @@ import org.apache.http.message.BasicNameValuePair;
 import org.springblade.archive.service.IArchiveAutoPdfService;
 import org.springblade.archive.utils.CallBgrsjk;
 import org.springblade.archive.utils.FileUtils;
+import org.springblade.archive.vo.CheckoutVO;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
@@ -628,4 +629,19 @@ public class ArchivesAutoController extends BladeController {
         ArchivesAuto archivesAuto = archivesAutoService.getById(id);
         return R.data(archivesAuto);
     }
+
+	/**
+	 * 在线验收-根据单位显示档案
+	 */
+	@GetMapping("/getUnitArchivesAutoView")
+	@ApiOperationSupport(order = 11)
+	@ApiOperation(value = "在线验收-根据单位显示档案", notes = "传入项目id,和单位类型")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "unitType", value = "单位类型,1建设2监理3施工4科研", required = true),
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+	})
+	public R<List<CheckoutVO>> getArchivesAutoViewByUnit(@RequestParam Integer unitType, Long projectId) {
+		List<CheckoutVO> list = archivesAutoService.getArchivesAutoViewByUnit(unitType,projectId);
+		return R.data(list);
+	}
 }

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

@@ -23,6 +23,8 @@ import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.vo.ArchivesAutoVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.archive.vo.ArchivesAutoVO2;
+import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.user.entity.User;
 
@@ -151,4 +153,8 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
 	List<ArchivesAutoVO> getArchivesCabinet22(@Param("vo") ArchivesAutoVO archivesAuto);
 
 	List<ArchivesAutoVO> pageByArchivesAuto5(@Param("vo") ArchivesAutoVO vo);
+
+    List<ArchiveTreeContract> getUnitNodeByProjectId(@Param("projectId") Long projectId);
+
+	List<ArchivesAutoVO2> getUnitAllArchive(@Param("node") String node);
 }

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

@@ -929,6 +929,19 @@
         select *
         from u_archives_auto uaa WHERE uaa.id = #{id} and is_deleted = 0
     </select>
+    <select id="getUnitNodeByProjectId" resultType="org.springblade.manager.entity.ArchiveTreeContract">
+        SELECT matc1.*
+        FROM m_archive_tree_contract matc1
+        WHERE  matc1.parent_id in (select id from m_archive_tree_contract
+                                   WHERE parent_id = (select id from m_archive_tree_contract WHERE parent_id = 0 and project_id = #{projectId} and is_deleted = 0)
+                                     and is_deleted = 0 and tree_code is NULL)
+          and matc1.is_deleted = 0
+    </select>
+    <select id="getUnitAllArchive" resultType="org.springblade.archive.vo.ArchivesAutoVO2">
+        select SUBSTRING_INDEX(SUBSTRING_INDEX(atc.ancestors,",",4),",",-1) as masterNode,uaa.*
+        from (select * from m_archive_tree_contract WHERE is_deleted = 0 and ancestors like concat('%',#{node},'%')) atc
+                 join u_archives_auto uaa on atc.id = uaa.node_id  and uaa.is_deleted = 0
+    </select>
 
 
     <update id="splitFiles">

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

@@ -18,6 +18,7 @@ package org.springblade.archive.service;
 
 import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.vo.ArchivesAutoVO;
+import org.springblade.archive.vo.CheckoutVO;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -102,4 +103,5 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	// 语音搜索
 	R searchInfo(MultipartFile file) throws IOException;
 
+    List<CheckoutVO> getArchivesAutoViewByUnit(Integer unitType, Long projectId);
 }

+ 48 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -39,6 +39,8 @@ import org.springblade.archive.utils.FileUtils;
 import org.springblade.archive.vo.ArchivesAutoVO;
 import org.springblade.archive.mapper.ArchivesAutoMapper;
 import org.springblade.archive.service.IArchivesAutoService;
+import org.springblade.archive.vo.ArchivesAutoVO2;
+import org.springblade.archive.vo.CheckoutVO;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.business.feign.MetadataClassificationClient;
@@ -2270,4 +2272,50 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		}
 		return R.data(jsonObject);
 	}
+
+	/**
+	 * 在线验收-根据单位显示档案
+	 * @param unitType
+	 * @param projectId
+	 * @return
+	 */
+	@Override
+	public List<CheckoutVO> getArchivesAutoViewByUnit(Integer unitType, Long projectId) {
+		//判断单位
+		if (unitType == 1){
+			//获取所有主节点,如果没有档案不显示可以取消
+			List<ArchiveTreeContract> nodes = baseMapper.getUnitNodeByProjectId(projectId);
+			if (nodes == null || nodes.size() <= 0){
+				return null;
+			}
+			String node = nodes.get(0).getAncestors().split(",")[2];
+			//获取建设单位的所有档案
+			List<ArchivesAutoVO2> vo2s = baseMapper.getUnitAllArchive(node);
+			if (vo2s == null || vo2s.size() <= 0){
+				return null;
+			}
+			List<CheckoutVO> list = new ArrayList<>();
+			CheckoutVO vo = new CheckoutVO();
+			vo.setNodeName("建设单位归档资料");
+			vo.setTotal(vo2s.size());
+			list.add(vo);
+			//根据主节点分组
+			Map<String, List<ArchivesAutoVO2>> map = vo2s.parallelStream().collect(Collectors.groupingBy(ArchivesAutoVO2::getMasterNode));
+			//循环主节点并且存入数据
+			for (ArchiveTreeContract contract : nodes) {
+				CheckoutVO v = new CheckoutVO();
+				v.setNodeName(contract.getFullName());
+				List<ArchivesAutoVO2> vo2List = map.get(contract.getId()+"");
+				if (vo2List != null && vo2List.size() > 0){
+					v.setTotal(vo2List.size());
+					v.setList(vo2List);
+				}else {
+					v.setTotal(0);
+				}
+				list.add(v);
+			}
+			return list;
+		}
+		return null;
+	}
 }

+ 1 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.xml

@@ -76,6 +76,7 @@
         from
         (
         select
+        create_time,
         id,
         title,
         text_content,

+ 7 - 6
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml

@@ -4,6 +4,7 @@
 
     <!-- 通用查询映射结果 -->
     <resultMap id="informationQueryResultMap" type="org.springblade.business.entity.InformationQuery">
+        <result column="id" property="id"/>
         <result column="name" property="name"/>
         <result column="number" property="number"/>
         <result column="category" property="category"/>
@@ -889,13 +890,13 @@
     </select>
 
     <select id="getInformationByContractId" resultMap="informationQueryResultMap">
-        id,
-        wbs_id as wbsId,
+        select id,
+        wbs_id,
         name,
-        e_visa_pdf_url as eVisaPdfUrl,
-        business_time as businessTime,
-        e_visa_pdf_page as eVisaPdfPage,
-        e_visa_pdf_size as eVisaPdfSize
+        e_visa_pdf_url,
+        business_time,
+        e_visa_pdf_page,
+        e_visa_pdf_size
         from u_information_query
         where is_deleted = 0
           and contract_id = #{contractId} and is_deleted = 0;

+ 2 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -1102,7 +1102,8 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         archiveFile.setFileSize(fileSize);
         archiveFile.setCreateTime(createTime);
 
-
+        archiveFile.setIsCertification(1);
+        archiveFile.setCertificationTime(query.getBusinessTime());
         //
         archiveFile.setEVisaFile(query.getEVisaPdfUrl());
         archiveFile.setPdfFileUrl(query.getEVisaPdfUrl());

+ 10 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -735,6 +735,16 @@ public class ExcelTabController extends BladeController {
             }
         }
 
+        // 远程搜索配置2-设计强度搜索
+        Elements hc2 = doc.select("hc-form-select-search2");
+        if (hc2.size() >= 1) {
+            for (int i = 0; i < hc2.size(); i++) {
+                Element datax = hc2.get(i);
+                datax.removeAttr("contractId");
+                datax.attr("contractId", wbsTreeContract.getContractId());
+            }
+        }
+
         // 标题解决
         ProjectInfo projectInfo = projectInfoService.getById(wbsTreeContract.getProjectId());
         //判断是否是水利水电表,水利水电项目名14,表名12 。   其他表都是18

+ 10 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/MixProportionInfoController.java

@@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import javax.validation.Valid;
 import java.util.List;
+import java.util.Map;
 
 @RestController
 @AllArgsConstructor
@@ -36,11 +37,12 @@ public class MixProportionInfoController extends BladeController {
     @ApiOperation(value = "计算含水率", notes = "计算含水率")
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "key", value = "当前输入框位置", required = true),
-            @ApiImplicitParam(name = "MixProportionId", value = "配合比id", required = true),
-            @ApiImplicitParam(name = "sand", value = "黄砂含水率", required = true),
-            @ApiImplicitParam(name = "macadamOne", value = "碎石1含水率", required = true),
-            @ApiImplicitParam(name = "macadamTwo", value = "碎石2含水率", required = true),
-            @ApiImplicitParam(name = "macadamThree", value = "碎石3含水率", required = true),
+            @ApiImplicitParam(name = "contractId", value = "合同段id", required = true),
+            @ApiImplicitParam(name = "designStrength", value = "设计强度", required = true),
+            @ApiImplicitParam(name = "sand", value = "黄砂含水率", required = false),
+            @ApiImplicitParam(name = "macadamOne", value = "碎石1含水率", required = false),
+            @ApiImplicitParam(name = "macadamTwo", value = "碎石2含水率", required = false),
+            @ApiImplicitParam(name = "macadamThree", value = "碎石3含水率", required = false),
     })
     public R calculateWater(@Valid @RequestBody MoistureContentDTO dto) {
         return mixProportionInfoService.calculateWater(dto);
@@ -52,9 +54,9 @@ public class MixProportionInfoController extends BladeController {
      */
     @GetMapping("/designStrengthList")
     @ApiOperationSupport(order = 7)
-    @ApiOperation(value = "设计强度列表", notes = "模糊搜索")
-    public R<List<MixProportionInfo>> designStrengthList(@RequestParam String searchValue,Long contractId) {
-        List<MixProportionInfo> list = mixProportionInfoService.designStrengthList(searchValue,contractId);
+    @ApiOperation(value = "设计强度列表", notes = "获取合同段下所有设计强度")
+    public R<Map<String,Map<String,String>>> designStrengthList(@RequestParam Long contractId,@RequestParam String key) {
+        Map<String,Map<String,String>> list = mixProportionInfoService.designStrengthList(contractId,key);
         return R.data(list);
     }
 

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java

@@ -341,6 +341,8 @@ public class TextdictInfoController extends BladeController {
             element.removeAttr("style");
         } else if (textdictInfo.getTextId().equals("searchSelect")) { //搜索框
             element.empty().append("<hc-form-select-search id=" + keyname + " @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' type='dap_site_data' :val=" + vmode + " contractId=''  pkeyId='' @change='formRemoteChange' v-model=" + vmode + " placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%' > </hc-form-select-search>");
+        } else if (textdictInfo.getTextId().equals("strengthSearch")){ //强度搜索框
+            element.empty().append("<hc-form-select-search2 id=" + keyname + " @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' type='strength_search' :val=" + vmode + " contractId=''  pkeyId='' @change='formRemoteChange' v-model=" + vmode + " placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%' > </hc-form-select-search2>");
         }
         element.attr("@click", "getInformation(" + oncklickText + ")");
 

+ 27 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java

@@ -171,7 +171,7 @@ public class WbsTreeContractController extends BladeController {
      */
     @GetMapping("/lazyQueryContractWbsTree")
     @ApiOperationSupport(order = 9)
-    @ApiOperation(value = "客户端懒加载获取合同段树(统计颜色、填报数量)", notes = "传入父级parentId、合同段contractId、关联contractIdRelation")
+    @ApiOperation(value = "客户端懒加载获取合同段树(统计颜色、填报数量)")
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "primaryKeyId"),
             @ApiImplicitParam(name = "parentId", value = "父节点id,为空则查询第一级节点"),
@@ -204,6 +204,30 @@ public class WbsTreeContractController extends BladeController {
         return R.data(vos);
     }
 
+    /**
+     * 影像资料-懒加载获取影像资料合同段树(统计颜色、存储部位文件数量)
+     *
+     * @author liuyc
+     * @date 2023年8月24日14:21:03
+     */
+    @GetMapping("/image/lazyQueryContractWbsTree")
+    @ApiOperationSupport(order = 9)
+    @ApiOperation(value = "影像资料-懒加载获取影像资料合同段树(统计颜色、存储部位文件数量)")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "primaryKeyId"),
+            @ApiImplicitParam(name = "parentId", value = "父节点id,为空则查询第一级节点"),
+            @ApiImplicitParam(name = "contractId", value = "合同段id"),
+            @ApiImplicitParam(name = "contractIdRelation", value = "合同段关联id(监理、业主合同关联施工合同id)"),
+            @ApiImplicitParam(name = "classId", value = "分类id")
+    })
+    public R<List<WbsTreeContractLazyVO>> imageLazyQueryContractWbsTree(@RequestParam String primaryKeyId, @RequestParam String parentId, @RequestParam String contractId, @RequestParam String contractIdRelation, @RequestParam String classId) {
+        if (StringUtils.isNotEmpty(primaryKeyId)) {
+            parentId = primaryKeyId;
+        }
+        List<WbsTreeContractLazyVO> vos = iWbsTreeContractService.imageLazyQueryContractWbsTree(parentId, contractId, contractIdRelation,classId);
+        return R.data(vos);
+    }
+
     /**
      * 同步项目到合同段所有表单排序
      */
@@ -394,8 +418,8 @@ public class WbsTreeContractController extends BladeController {
     @PostMapping("/getConcealedWorksNodeTree")
     @ApiOperationSupport(order = 15)
     @ApiOperation(value = "获取合同段隐蔽工程节点树", notes = "传入合同段id")
-    public R<List<WbsTreeContractLazyVO>> getConcealedWorksNodeTree(@RequestParam String contractId) {
-        List<WbsTreeContractLazyVO> result = iWbsTreeContractService.getConcealedWorksNodeTree(contractId);
+    public R<List<WbsTreeContractVO>> getConcealedWorksNodeTree(@RequestParam String contractId) {
+        List<WbsTreeContractVO> result = iWbsTreeContractService.getConcealedWorksNodeTree(contractId);
         return R.data(result);
     }
 

+ 10 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml

@@ -396,7 +396,7 @@
         FROM m_archive_tree_contract matc1
         WHERE  matc1.parent_id in (select id from m_archive_tree_contract
                             WHERE parent_id = (select id from m_archive_tree_contract WHERE parent_id = 0 and project_id = #{projectId} and is_deleted = 0)
-                              and tree_code is NULL)
+                              and is_deleted = 0 and tree_code is NULL)
           and matc1.is_deleted = 0
     </select>
 
@@ -511,9 +511,16 @@
         <foreach collection="list" item="item" index="index" separator=";">
             update u_archive_file
             <set>
-                sort = #{item.sort}
+                sort = #{item.sort},
+                pdf_file_url = #{item.pdfFileUrl},
+                e_visa_file = #{item.eVisaFile},
+                file_page = #{item.filePage},
+                file_size = #{item.fileSize},
+                is_certification = 1,
+                certification_time = #{item.certificationTime},
+                file_time = #{item.fileTime}
             </set>
-            where id = #{item.Id}
+            where id = #{item.id}
         </foreach>
     </update>
 

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/MixProportionInfoMapper.java

@@ -38,7 +38,7 @@ import java.util.Set;
  */
 public interface MixProportionInfoMapper extends BaseMapper<MixProportionInfo> {
 
-    List<MixProportionInfo> designStrengthList(@Param("searchValue") String searchValue,@Param("contractId") Long contractId);
+    List<String> designStrengthList(@Param("contractId") Long contractId);
 
     Integer compareInfo(@Param("number") Set<String> number,@Param("strength") Set<String> strength,@Param("contractId") Long contractId);
 }

+ 6 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/MixProportionInfoMapper.xml

@@ -3,14 +3,7 @@
 <mapper namespace="org.springblade.manager.mapper.MixProportionInfoMapper">
 
 
-    <select id="designStrengthList" resultType="org.springblade.manager.entity.MixProportionInfo">
-        select id,design_strength
-        from m_mix_proportion_info
-        WHERE is_deleted = 0 and contract_id = #{contractId}
-        <if test="searchValue!=null and searchValue !=''">
-            and design_strength like concat(concat('%', #{searchValue}),'%')
-        </if>
-    </select>
+
     <select id="compareInfo" resultType="java.lang.Integer">
         select count(1)
         from m_mix_proportion_info
@@ -23,4 +16,9 @@
             #{s}
         </foreach>
     </select>
+    <select id="designStrengthList" resultType="java.lang.String">
+        select design_strength
+        from m_mix_proportion_info
+        WHERE is_deleted = 0 and contract_id = #{contractId}
+    </select>
 </mapper>

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

@@ -198,6 +198,7 @@
             update_user        = #{wbsTP.updateUser},
             update_time        = #{wbsTP.updateTime},
             mix_ratio_test_ids = #{wbsTP.mixRatioTestIds},
+            is_concrete        = #{wbsTP.isConcrete},
             status             = 1,
             is_deleted         = 0
         where p_key_id = #{pKeyId}

+ 2 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IMixProportionInfoService.java

@@ -8,11 +8,12 @@ import org.springblade.manager.entity.RawMaterialsInfo;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 public interface IMixProportionInfoService extends BaseService<MixProportionInfo> {
 
-    List<MixProportionInfo> designStrengthList(String searchValue,Long contractId);
+    Map<String, Map<String,String>> designStrengthList(Long contractId,String key);
 
     Integer compareInfo(Set<String> number, Set<String> strength, Long contractId);
 

+ 4 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java

@@ -63,10 +63,13 @@ public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
 
     List<WbsTreeContractLazyVO> lazyQueryContractWbsTree(String id, String contractId, String contractIdRelation, String tableOwner);
 
+    List<WbsTreeContractLazyVO> imageLazyQueryContractWbsTree(String parentId, String contractId, String contractIdRelation, String classId);
+
     boolean syncContractTabSort(String projectId);
 
     List<AppWbsTreeContractVO> searchNodeAllTableAndFile(String primaryKeyId, String type, String contractId, String projectId);
 
-    List<WbsTreeContractLazyVO> getConcealedWorksNodeTree(String contractId);
+    List<WbsTreeContractVO> getConcealedWorksNodeTree(String contractId);
+
 
 }

+ 27 - 10
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java

@@ -182,7 +182,7 @@ public class ArchiveTreeContractSyncImpl {
 
         List<ArchiveTreeContract> saveList = new ArrayList<>();
         //todo 等测试OK再打开
-//        saveList =arTreeContractInitService.getContractExtNodes(AuthUtil.getTenantId(),projectId,dstTree);
+        //saveList =arTreeContractInitService.getContractExtNodes(AuthUtil.getTenantId(),projectId,dstTree);
 
         return saveList;
     }
@@ -415,6 +415,9 @@ public class ArchiveTreeContractSyncImpl {
 
         for (ArchiveTreeContract node : associatedNodes) {
             Integer nodeLevel = Integer.valueOf(associatedNodes.get(0).getDisplayHierarchy());
+            if (nodeLevel == 0) {
+                continue;
+            }
 
             // 获取该合同段下的wbs节点
             List<ArchiveTreeContract> archiveTreeContracts = getArchiveTreeContractsWbs(contractId, node.getId());
@@ -455,12 +458,15 @@ public class ArchiveTreeContractSyncImpl {
             if (keyId != null) {
                 Long id = wbsTreeKeyToIdMap.get(keyId);
 
-
                 ArchiveFile archiveFile = archiveKeyIdMap.get(keyId);
                 Integer sort = wbsTreeKeyToSortMap.get(keyId);
 
-                //业内类型不匹配则不处理
+                //业内类型不匹配则不处理  treeContractVO6判空
                 WbsTreeContractVO6 treeContractVO6 = wbsTreeContractVO6Map.get(id);
+
+                if (treeContractVO6 == null ) {
+                    continue;
+                }
                 if (treeContractVO6.getMajorDataType()!= null) {
                     if (!majarDataType.contains(treeContractVO6.getMajorDataType().toString())) {
                         continue;
@@ -476,7 +482,7 @@ public class ArchiveTreeContractSyncImpl {
                     newInformationQueryList.add(info);
                 }//文件不同,则说明重签过,需要更新,顺序不同也更新
                 else if (!archiveFile.getPdfFileUrl().equals(info.getEVisaPdfUrl())
-                        || (sort!= null && sort != archiveFile.getSort()) ) {
+                        || (!sort.equals(archiveFile.getSort()))) {
 
                     //需要更新的
                     //todo 后续需增加判断已组件或者锁定的不要更新?
@@ -484,6 +490,9 @@ public class ArchiveTreeContractSyncImpl {
                     archiveFile.setEVisaFile(info.getEVisaPdfUrl());
                     archiveFile.setFilePage(info.getEVisaPdfPage());
                     archiveFile.setFileSize(info.getEVisaPdfSize());
+                    archiveFile.setIsCertification(1);
+                    archiveFile.setCertificationTime(info.getBusinessTime());
+                    archiveFile.setFileTime(info.getBusinessTime());
                     archiveFile.setSort(sort);
                     updateArchiveFiles.add(archiveFile);
                 }
@@ -503,8 +512,11 @@ public class ArchiveTreeContractSyncImpl {
 
             //根据map获取到对应的归档树节点nodeid
             Long nodeId = archiveTreeContractIdMap.get(levelKeyId);
+            if (nodeId == null) {
+                continue;
+            }
             //生成新增的归档文件
-            ArchiveFile archiveFile = getArchiveFile(info,nodeId,info.getWbsId(),contractIndfo.archivesUnit());
+            ArchiveFile archiveFile = getArchiveFile(info,nodeId,info.getWbsId(),contractIndfo);
             newArchiveFiles.add(archiveFile);
         }
 
@@ -557,7 +569,7 @@ public class ArchiveTreeContractSyncImpl {
         List<ArchiveTreeContract> archiveTreeContracts = 	archiveTreeContractMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
                 .eq(ArchiveTreeContract::getContractId, contractId)
                 .eq(ArchiveTreeContract::getExtAttachId, attachId)
-                .eq(ArchiveTreeContract::getExtType, 2));
+                .eq(ArchiveTreeContract::getExtType, 1));
         return archiveTreeContracts;
 
         //互殴去
@@ -577,13 +589,14 @@ public class ArchiveTreeContractSyncImpl {
         }
     }
 
-    public ArchiveFile getArchiveFile(InformationQuery query,Long nodeId,Long keyId,String unit) {
+    public ArchiveFile getArchiveFile(InformationQuery query,Long nodeId,Long keyId,ContractInfo contractIndfo) {
         ArchiveFile archiveFile = new ArchiveFile();
         archiveFile.setNodeId(nodeId.toString());
         archiveFile.setNodeExtId(keyId);
 
-        archiveFile.setProjectId(query.getProjectId() == null?"":query.getProjectId().toString());
-        archiveFile.setContractId(query.getContractId().toString());
+
+        archiveFile.setProjectId(contractIndfo.getPId().toString());
+        archiveFile.setContractId(contractIndfo.getId().toString());
         archiveFile.setStatus(2); // 这里是新增归档文件,所以状态为1(已完成)
         //TODO 文件题名规则,待补充
         archiveFile.setFileName(query.getName());
@@ -592,8 +605,12 @@ public class ArchiveTreeContractSyncImpl {
         archiveFile.setSourceType(1);
         archiveFile.setIsArchive(0);
 
+        //设置认证
+        archiveFile.setIsCertification(1);
+        archiveFile.setCertificationTime(query.getBusinessTime());
+
         //责任人怎么取
-        archiveFile.setDutyUser(unit);
+        archiveFile.setDutyUser(contractIndfo.archivesUnit());
 
         //文件大小
         archiveFile.setFileSize(query.getEVisaPdfSize());

+ 54 - 21
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/MixProportionInfoServiceImpl.java

@@ -1,5 +1,6 @@
 package org.springblade.manager.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -47,8 +48,20 @@ public class MixProportionInfoServiceImpl extends BaseServiceImpl<MixProportionI
 
 
     @Override
-    public List<MixProportionInfo> designStrengthList(String searchValue,Long contractId) {
-        return baseMapper.designStrengthList(searchValue,contractId);
+    public Map<String,Map<String,String>> designStrengthList(Long contractId,String key) {
+        //查询当前合同段所有的设计强度
+        List<String> list = baseMapper.designStrengthList(contractId);
+        if (list == null || list.size() <= 0){
+            return null;
+        }
+        Map<String,Map<String,String>> map = new HashMap<>();
+        //包装返回值
+        for (String l : list) {
+            Map<String,String> m = new HashMap<>();
+            m.put(key,l);
+            map.put(l,m);
+        }
+        return map;
     }
 
     @Override
@@ -109,6 +122,9 @@ public class MixProportionInfoServiceImpl extends BaseServiceImpl<MixProportionI
      */
     @Override
     public R calculateWater(MoistureContentDTO dto) {
+        if (StringUtils.isBlank(dto.getDesignStrength())){
+            throw new ServiceException("请先选择设计强度");
+        }
         //获取位置前缀后缀
         String prefix= dto.getKey().replaceAll("__[\\d_]+", "");
         String suffix = dto.getKey().replaceAll("key_\\d+__", "");
@@ -118,39 +134,56 @@ public class MixProportionInfoServiceImpl extends BaseServiceImpl<MixProportionI
         //结果集
         Map<String,BigDecimal> map = new HashMap<>();
         //获取配合比信息
-        MixProportionInfo info = this.getById(dto.getMixProportionId());
+        MixProportionInfo info = this.getOne(new LambdaQueryWrapper<MixProportionInfo>()
+                .eq(MixProportionInfo::getContractId,dto.getContractId())
+                .eq(MixProportionInfo::getDesignStrength,dto.getDesignStrength()));
         if (info == null){
             throw new ServiceException("获取配合比信息失败");
         }
         //含水量计算
+        BigDecimal sand = new BigDecimal(0);
+        BigDecimal macadamOne = new BigDecimal(0);
+        BigDecimal macadamTwo = new BigDecimal(0);
+        BigDecimal macadamThree = new BigDecimal(0);
         //黄砂
-        BigDecimal sand = dto.getSand().divide(new BigDecimal(100)).multiply(info.getSand());
+        if (dto.getSand() != null) {
+            sand = dto.getSand().divide(new BigDecimal(100)).multiply(info.getSand());
+            //黄砂
+            BigDecimal sand2 = info.getSand().add(sand);
+            map.put(prefix + "__" + s1 + "_" + (s2 + 1), sand2);
+        }
         //碎石1
-        BigDecimal macadamOne = dto.getMacadamOne().divide(new BigDecimal(100)).multiply(info.getMacadamOne());
+        if (dto.getMacadamOne() != null) {
+            macadamOne = dto.getMacadamOne().divide(new BigDecimal(100)).multiply(info.getMacadamOne());
+            //碎石1
+            BigDecimal macadamOne2 = info.getMacadamOne().add(macadamOne);
+            map.put(prefix + "__" +s1 + "_" +(s2+2),macadamOne2);
+        }
         //碎石2
-        BigDecimal macadamTwo = dto.getMacadamTwo().divide(new BigDecimal(100)).multiply(info.getMacadamTwo());
+        if (dto.getMacadamTwo() != null) {
+            macadamTwo = dto.getMacadamTwo().divide(new BigDecimal(100)).multiply(info.getMacadamTwo());
+            //碎石2
+            BigDecimal macadamTwo2 = info.getMacadamTwo().add(macadamTwo);
+            map.put(prefix + "__" +s1 + "_" +(s2+3),macadamTwo2);
+        }
         //碎石3
-        BigDecimal macadamThree = dto.getMacadamThree().divide(new BigDecimal(100)).multiply(info.getMacadamThree());
+        if (dto.getMacadamThree() != null) {
+            macadamThree = dto.getMacadamThree().divide(new BigDecimal(100)).multiply(info.getMacadamThree());
+            //碎石3
+            BigDecimal macadamThree2 = info.getMacadamThree().add(macadamThree);
+            map.put(prefix + "__" +s1 + "_" +(s2+4),macadamThree2);
+        }
 
         //施工配合比计算
         //水泥
         BigDecimal cement = info.getCement();
         map.put(prefix + "__" +s1 + "_" +(s2),cement);
-        //黄砂
-        BigDecimal sand2 = info.getSand().add(sand);
-        map.put(prefix + "__" +s1 + "_" +(s2+1),sand2);
-        //碎石1
-        BigDecimal macadamOne2 = info.getMacadamOne().add(macadamOne);
-        map.put(prefix + "__" +s1 + "_" +(s2+2),macadamOne2);
-        //碎石2
-        BigDecimal macadamTwo2 = info.getMacadamTwo().add(macadamTwo);
-        map.put(prefix + "__" +s1 + "_" +(s2+3),macadamTwo2);
-        //碎石3
-        BigDecimal macadamThree2 = info.getMacadamThree().add(macadamThree);
-        map.put(prefix + "__" +s1 + "_" +(s2+4),macadamThree2);
+
         //水
-        BigDecimal water = info.getWater().subtract(sand).subtract(macadamOne).subtract(macadamTwo).subtract(macadamThree);
-        map.put(prefix + "__" +s1 + "_" +(s2+5),water);
+        if (dto.getSand() != null && dto.getMacadamOne() != null && dto.getMacadamTwo() != null && dto.getMacadamThree() != null) {
+            BigDecimal water = info.getWater().subtract(sand).subtract(macadamOne).subtract(macadamTwo).subtract(macadamThree);
+            map.put(prefix + "__" + s1 + "_" + (s2 + 5), water);
+        }
         //掺加剂
         BigDecimal admixture = info.getAdmixture();
         map.put(prefix + "__" +s1 + "_" +(s2+6),admixture);

+ 316 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -415,7 +415,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     public List<AppWbsTreeContractVO> searchNodeAllTable(String primaryKeyId, String tableOwner, String contractId, String projectId) {
         //由于Feign调用时,获取不到UserId
         Long userId;
-        if (primaryKeyId.contains(":")) {
+        if (StringUtils.isNotEmpty(primaryKeyId) && primaryKeyId.contains(":")) {
             String[] ds = primaryKeyId.split(":");
             primaryKeyId = ds[0];
             userId = Long.parseLong(ds[1]);
@@ -907,6 +907,269 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return null;
     }
 
+    @Override
+    public List<WbsTreeContractLazyVO> imageLazyQueryContractWbsTree(String id, String contractId, String contractIdRelation, String classId) {
+        if (ObjectUtil.isNotEmpty(contractId)) {
+            ContractInfo contractInfo = jdbcTemplate.query("select contract_name,contract_type from m_contract_info where id = " + contractId, new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
+            if (contractInfo != null) {
+                //TODO 施工合同段
+                if (new Integer(1).equals(contractInfo.getContractType())) {
+                    //获取当前合同段所有缓存节点信息
+                    List<WbsTreeContractLazyVO> nodesAll;
+                    Object data = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:" + contractId);
+                    if (data != null) {
+                        nodesAll = JSON.parseArray(data.toString(), WbsTreeContractLazyVO.class);
+                    } else {
+                        nodesAll = jdbcTemplate.query("select a.p_key_id,a.id,a.parent_id,(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND type = 1 AND b.contract_id = " + contractId + " AND b.is_deleted = 0 ) AS hasChildren from m_wbs_tree_contract a where type = 1 and status = 1 and is_deleted = 0 and contract_id = " + contractId, new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
+                        if (nodesAll.size() > 0) {
+                            JSONArray array = JSONArray.parseArray(JSON.toJSONString(nodesAll));
+                            redisTemplate.opsForValue().set("blade-manager::contract:wbstree:" + contractId, JSON.toJSON(array).toString());
+                        }
+                    }
+                    //获取当前层懒加载节点
+                    List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query("select p_key_id,(SELECT id FROM u_contract_tree_drawings where process_id = p_key_id) AS drawingsId,id,parent_id,node_type,type,wbs_type,is_concrete,major_data_type,partition_code,old_id,contract_id_relation,is_concealed_works_node,CASE (SELECT count(1) FROM u_tree_contract_first AS tcf WHERE tcf.is_deleted = 0 AND tcf.wbs_node_id = a.p_key_id) WHEN 0 THEN 'false' ELSE 'true' END AS isFirst,IFNULL(if(length(trim(full_name))>0,full_name,node_name),node_name) AS title,(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND b.type = 1 and b.status = 1 AND b.contract_id = " + contractId + " AND b.is_deleted = 0 ) AS hasChildren from m_wbs_tree_contract a where a.node_type != 111 and a.type = 1 and a.status = 1 and a.is_deleted = 0 and parent_id = " + (StringUtils.isNotEmpty(id) ? id : 0) + " and contract_id = " + contractId + " ORDER BY a.sort,title,a.create_time", new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
+                    if (lazyNodes.size() > 0 && nodesAll.size() > 0) {
+                        //所有节点
+                        List<WbsTreeContractLazyVO> distinctNodesAll = nodesAll.stream()
+                                .collect(Collectors.collectingAndThen(
+                                        Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(WbsTreeContractLazyVO::getPKeyId))),
+                                        ArrayList::new
+                                ));
+
+                        //所有节点parentId分组Map
+                        Map<Long, List<WbsTreeContractLazyVO>> parentIdToNodesMap = distinctNodesAll.stream()
+                                .collect(Collectors.groupingBy(WbsTreeContractLazyVO::getParentId));
+
+                        //所有节点id分组Map
+                        Map<Long, List<WbsTreeContractLazyVO>> idToNodesMap = distinctNodesAll.stream()
+                                .collect(Collectors.groupingBy(WbsTreeContractLazyVO::getId));
+
+                        //所有最底层节点
+                        List<WbsTreeContractLazyVO> distinctLowestNodesAll = distinctNodesAll.stream().filter(f -> f.getHasChildren().equals(0)).collect(Collectors.collectingAndThen(
+                                Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(WbsTreeContractLazyVO::getPKeyId))),
+                                ArrayList::new
+                        ));
+                        //获取当前合同段所有影像文件信息
+                        List<WbsTreeContractLazyFileVO> queryFileList = jdbcTemplate.query("select wbs_id,id from u_image_classification_file where status = 1 and contract_id = " + contractId + " and classify_id = " + classId, new BeanPropertyRowMapper<>(WbsTreeContractLazyFileVO.class));
+                        //最底层节点与存储文件数量map
+                        Map<Long, Integer> queryFileMaps = queryFileList.stream()
+                                .collect(Collectors.groupingBy(
+                                        WbsTreeContractLazyFileVO::getWbsId,
+                                        Collectors.collectingAndThen(Collectors.toList(), List::size)
+                                ));
+                        List<Long> pKeyIdList = new ArrayList<>(queryFileMaps.keySet());
+
+                        //所有最底层节点,处理文件数量
+                        List<WbsTreeContractLazyVO> lowestNodesFile = distinctLowestNodesAll.stream().filter(f -> pKeyIdList.contains(f.getPKeyId())).collect(Collectors.toList());
+                        Set<Long> lowestNodeParentIds = lowestNodesFile.stream().map(WbsTreeContractLazyVO::getParentId).collect(Collectors.toSet());
+
+                        //获取所有父级节点
+                        Set<WbsTreeContractLazyVO> resultParentNodes = new HashSet<>();
+                        this.getParentNodes(resultParentNodes, lowestNodeParentIds, idToNodesMap);
+
+                        //处理最终结果集
+                        if (lazyNodes.size() > 0) {
+                            Map<Long, Integer> countMap = new HashMap<>();
+                            for (WbsTreeContractLazyVO node : resultParentNodes) {
+                                Long key = node.getPKeyId();
+                                Set<WbsTreeContractLazyVO> resultNodes = new HashSet<>();
+                                //获取最底层节点的文件数量信息
+                                this.getDcNodes(resultNodes, Collections.singletonList(node), parentIdToNodesMap);
+                                int totalCount = 0;
+                                for (Long pKeyId : resultNodes.stream().map(WbsTreeContractLazyVO::getPKeyId).collect(Collectors.toSet())) {
+                                    totalCount += queryFileMaps.getOrDefault(pKeyId, 0);
+                                }
+                                countMap.put(key, totalCount);
+                            }
+
+                            //返回最终结果集
+                            for (WbsTreeContractLazyVO lazyNodeVO : lazyNodes) {
+                                lazyNodeVO.setType(lazyNodeVO.getNodeType());
+                                lazyNodeVO.setNotExsitChild(!lazyNodeVO.getHasChildren().equals(1));
+                                lazyNodeVO.setPrimaryKeyId(lazyNodeVO.getPKeyId());
+                                if (lazyNodeVO.getParentId() == 0L) {
+                                    if (ObjectUtil.isNotEmpty(contractInfo.getContractName())) {
+                                        lazyNodeVO.setTitle(contractInfo.getContractName());
+                                    }
+                                }
+                                lazyNodeVO.setSubmitCounts(ObjectUtil.isNotEmpty(countMap.get(lazyNodeVO.getPKeyId())) ? countMap.get(lazyNodeVO.getPKeyId()) : (ObjectUtil.isNotEmpty(queryFileMaps.get(lazyNodeVO.getPKeyId())) ? queryFileMaps.get(lazyNodeVO.getPKeyId()) : 0));
+                                if (lazyNodeVO.getSubmitCounts() >= 1) {
+                                    lazyNodeVO.setColorStatus(2);
+                                }
+                            }
+                        }
+                        return lazyNodes;
+                    }
+
+                    //TODO 监理、业主合同段
+                } else if (new Integer("2").equals(contractInfo.getContractType()) || new Integer("3").equals(contractInfo.getContractType())) {
+                    List<WbsTreeContractLazyVO> lazyNodesAll = new ArrayList<>();
+                    List<String> contractIds = new ArrayList<>();
+                    if (ObjectUtil.isNotEmpty(contractIdRelation) && ObjectUtil.isNotEmpty(id)) {
+                        //非根节点时选择加载施工合同段的树
+                        contractIds.add(contractIdRelation);
+                    } else {
+                        //根节点时默认加载所有施工合同段的树
+                        contractIds = this.contractClient.getProcessContractByJLContractId(contractId);
+                    }
+                    if (ObjectUtil.isEmpty(contractIds) || contractIds.size() <= 0) {
+                        return null;
+                    }
+                    for (String sgContractId : contractIds) {
+                        ContractInfo sgContractInfo = jdbcTemplate.query("select contract_name from m_contract_info where id = " + sgContractId, new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
+                        if (sgContractInfo != null) {
+                            //获取当前合同段所有缓存节点信息
+                            List<WbsTreeContractLazyVO> nodesAll;
+                            Object data = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:" + sgContractId);
+                            if (data != null) {
+                                nodesAll = JSON.parseArray(data.toString(), WbsTreeContractLazyVO.class);
+                            } else {
+                                nodesAll = jdbcTemplate.query("select a.p_key_id,a.id,a.parent_id,(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND type = 1 AND b.contract_id = " + sgContractId + " AND b.is_deleted = 0 ) AS hasChildren from m_wbs_tree_contract a where type = 1 and status = 1 and is_deleted = 0 and contract_id = " + sgContractId, new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
+                                if (nodesAll.size() > 0) {
+                                    JSONArray array = JSONArray.parseArray(JSON.toJSONString(nodesAll));
+                                    redisTemplate.opsForValue().set("blade-manager::contract:wbstree:" + sgContractId, JSON.toJSON(array).toString());
+                                }
+                            }
+
+                            //获取当前层懒加载节点
+                            List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query("select p_key_id,(SELECT id FROM u_contract_tree_drawings where process_id = p_key_id) AS drawingsId,id,parent_id,node_type,type,wbs_type,major_data_type,partition_code,old_id,contract_id_relation,is_concealed_works_node,CASE (SELECT count(1) FROM u_tree_contract_first AS tcf WHERE tcf.is_deleted = 0 AND tcf.wbs_node_id = a.p_key_id) WHEN 0 THEN 'false' ELSE 'true' END AS isFirst,IFNULL(if(length(trim(full_name))>0,full_name,node_name),node_name) AS title,(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND  b.type = 1 and b.status = 1 AND b.contract_id = " + sgContractId + " AND b.is_deleted = 0 ) AS hasChildren from m_wbs_tree_contract a where a.node_type != 111 and a.type = 1 and a.status = 1 and a.is_deleted = 0 and parent_id = " + (StringUtils.isNotEmpty(id) ? id : 0) + " and contract_id = " + sgContractId + " ORDER BY a.sort,title,a.create_time", new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
+                            if (lazyNodes.size() > 0 && nodesAll.size() > 0) {
+                                //所有节点
+                                List<WbsTreeContractLazyVO> distinctNodesAll = nodesAll.stream()
+                                        .collect(Collectors.collectingAndThen(
+                                                Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(WbsTreeContractLazyVO::getPKeyId))),
+                                                ArrayList::new
+                                        ));
+
+                                //所有节点parentId分组Map
+                                Map<Long, List<WbsTreeContractLazyVO>> parentIdToNodesMap = distinctNodesAll.stream()
+                                        .collect(Collectors.groupingBy(WbsTreeContractLazyVO::getParentId));
+
+                                //所有节点id分组Map
+                                Map<Long, List<WbsTreeContractLazyVO>> idToNodesMap = distinctNodesAll.stream()
+                                        .collect(Collectors.groupingBy(WbsTreeContractLazyVO::getId));
+
+                                //所有最底层节点
+                                List<WbsTreeContractLazyVO> distinctLowestNodesAll = distinctNodesAll.stream().filter(f -> f.getHasChildren().equals(0)).collect(Collectors.collectingAndThen(
+                                        Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(WbsTreeContractLazyVO::getPKeyId))),
+                                        ArrayList::new
+                                ));
+
+                                //获取当前合同段所有影像文件信息(只查看监理自己的,资料填报是查看的施工合同段的,这里有区别)
+                                List<WbsTreeContractLazyFileVO> queryFileList = jdbcTemplate.query("select wbs_id,id from u_image_classification_file where status = 1 and contract_id = " + contractId + " and classify_id = " + classId, new BeanPropertyRowMapper<>(WbsTreeContractLazyFileVO.class));
+                                //最底层节点与存储文件数量map
+                                Map<Long, Integer> queryFileMaps = queryFileList.stream()
+                                        .collect(Collectors.groupingBy(
+                                                WbsTreeContractLazyFileVO::getWbsId,
+                                                Collectors.collectingAndThen(Collectors.toList(), List::size)
+                                        ));
+
+                                List<Long> pKeyIdList = new ArrayList<>(queryFileMaps.keySet());
+
+                                //所有最底层节点,处理文件数量
+                                List<WbsTreeContractLazyVO> lowestNodesFile = distinctLowestNodesAll.stream().filter(f -> pKeyIdList.contains(f.getPKeyId())).collect(Collectors.toList());
+                                Set<Long> lowestNodeParentIds = lowestNodesFile.stream().map(WbsTreeContractLazyVO::getParentId).collect(Collectors.toSet());
+
+                                //获取所有父级节点
+                                Set<WbsTreeContractLazyVO> resultParentNodes = new HashSet<>();
+                                this.getParentNodes(resultParentNodes, lowestNodeParentIds, idToNodesMap);
+
+                                //处理最终结果集
+                                if (lazyNodes.size() > 0) {
+                                    Map<Long, Integer> countMap = new HashMap<>();
+                                    for (WbsTreeContractLazyVO node : resultParentNodes) {
+                                        Long key = node.getPKeyId();
+                                        Set<WbsTreeContractLazyVO> resultNodes = new HashSet<>();
+                                        //获取最底层节点的文件数量信息
+                                        this.getDcNodes(resultNodes, Collections.singletonList(node), parentIdToNodesMap);
+                                        int totalCount = 0;
+                                        for (Long pKeyId : resultNodes.stream().map(WbsTreeContractLazyVO::getPKeyId).collect(Collectors.toSet())) {
+                                            totalCount += queryFileMaps.getOrDefault(pKeyId, 0);
+                                        }
+                                        countMap.put(key, totalCount);
+                                    }
+
+                                    //返回最终结果集
+                                    for (WbsTreeContractLazyVO lazyNodeVO : lazyNodes) {
+                                        lazyNodeVO.setType(lazyNodeVO.getNodeType()); //前端显示需要一样的,所以修改成一样的
+                                        lazyNodeVO.setNotExsitChild(!lazyNodeVO.getHasChildren().equals(1));
+                                        lazyNodeVO.setPrimaryKeyId(lazyNodeVO.getPKeyId());
+                                        lazyNodeVO.setContractIdRelation(sgContractId);
+                                        if (lazyNodeVO.getParentId() == 0L) {
+                                            if (ObjectUtil.isNotEmpty(sgContractInfo.getContractName())) {
+                                                lazyNodeVO.setTitle(sgContractInfo.getContractName());
+                                            }
+                                        }
+                                        lazyNodeVO.setSubmitCounts(ObjectUtil.isNotEmpty(countMap.get(lazyNodeVO.getPKeyId())) ? countMap.get(lazyNodeVO.getPKeyId()) : (ObjectUtil.isNotEmpty(queryFileMaps.get(lazyNodeVO.getPKeyId())) ? queryFileMaps.get(lazyNodeVO.getPKeyId()) : 0));
+                                        if (lazyNodeVO.getSubmitCounts() >= 1) {
+                                            lazyNodeVO.setColorStatus(2);
+                                        }
+                                    }
+                                }
+                                lazyNodesAll.addAll(lazyNodes);
+                            }
+                        }
+                    }
+                    return lazyNodesAll;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 获取所有父级节点
+     *
+     * @param resultParentNodes
+     * @param parentIds
+     * @param idToNodesMap
+     */
+    private void getParentNodes(Set<WbsTreeContractLazyVO> resultParentNodes, Set<Long> parentIds, Map<Long, List<WbsTreeContractLazyVO>> idToNodesMap) {
+        if (parentIds.size() > 0 && !parentIds.contains(0L)) {
+            Set<Long> parentIdsAll = new HashSet<>();
+            for (Long parentId : parentIds) {
+                List<WbsTreeContractLazyVO> parentNodes = idToNodesMap.get(parentId);
+                if (parentNodes.size() > 0) {
+                    resultParentNodes.addAll(parentNodes);
+                    Set<Long> parentIdsFu = parentNodes.stream().map(WbsTreeContractLazyVO::getParentId).collect(Collectors.toSet());
+                    if (parentIdsFu.size() > 0) {
+                        parentIdsAll.addAll(parentIdsFu);
+                    }
+                }
+            }
+            if (parentIdsAll.size() > 0) {
+                this.getParentNodes(resultParentNodes, parentIdsAll, idToNodesMap);
+            }
+        }
+    }
+
+    /**
+     * 递归获取所有最底层节点
+     */
+    private void getDcNodes(Set<WbsTreeContractLazyVO> resultNodes, List<WbsTreeContractLazyVO> initNode, Map<Long, List<WbsTreeContractLazyVO>> parentIdToNodeAllMap) {
+        Set<Long> childIds = initNode.stream().map(WbsTreeContractLazyVO::getId).collect(Collectors.toSet());
+        if (childIds.size() > 0) {
+            List<WbsTreeContractLazyVO> dcNodeAll = new ArrayList<>();
+            for (Long childId : childIds) {
+                //所有子级
+                List<WbsTreeContractLazyVO> childNodes = parentIdToNodeAllMap.get(childId);
+                //最底层节点,返回结果
+                List<WbsTreeContractLazyVO> dcNode = childNodes.stream().filter(f -> f.getHasChildren() == 0).collect(Collectors.toList());
+                if (dcNode.size() > 0) {
+                    resultNodes.addAll(dcNode);
+                }
+                //非最底层节点,进入下次递归循环
+                List<WbsTreeContractLazyVO> noDcNode = childNodes.stream().filter(f -> f.getHasChildren() == 1).collect(Collectors.toList());
+                if (noDcNode.size() > 0) {
+                    dcNodeAll.addAll(noDcNode);
+                }
+            }
+            if (dcNodeAll.size() > 0) {
+                this.getDcNodes(resultNodes, dcNodeAll, parentIdToNodeAllMap);
+            }
+        }
+    }
+
     @Override
     public boolean syncContractTabSort(String projectId) {
         if (ObjectUtil.isNotEmpty(projectId)) {
@@ -951,20 +1214,65 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     }
 
     @Override
-    public List<WbsTreeContractLazyVO> getConcealedWorksNodeTree(String contractId) {
+    public List<WbsTreeContractVO> getConcealedWorksNodeTree(String contractId) {
         List<WbsTreeContract> wbsTreeContracts = this.getBaseMapper().selectList(Wrappers.<WbsTreeContract>lambdaQuery()
-                .select(WbsTreeContract::getId,WbsTreeContract::getPKeyId,WbsTreeContract::getParentId,WbsTreeContract::getNodeType,
-                        WbsTreeContract::getType,WbsTreeContract::getWbsType,WbsTreeContract::getMajorDataType,WbsTreeContract::getPartitionCode,
-                        WbsTreeContract::getOldId,WbsTreeContract::getContractIdRelation,WbsTreeContract::getIsConcealedWorksNode,WbsTreeContract::getIsConcrete
+                .select(WbsTreeContract::getId, WbsTreeContract::getPKeyId, WbsTreeContract::getParentId, WbsTreeContract::getNodeType,
+                        WbsTreeContract::getType, WbsTreeContract::getWbsType, WbsTreeContract::getMajorDataType, WbsTreeContract::getPartitionCode,
+                        WbsTreeContract::getOldId, WbsTreeContract::getContractIdRelation, WbsTreeContract::getIsConcealedWorksNode, WbsTreeContract::getIsConcrete
                 )
                 .eq(WbsTreeContract::getContractId, contractId).eq(WbsTreeContract::getIsConcealedWorksNode, 1));
-        List<WbsTreeContract> distinctWbsTreeContracts = wbsTreeContracts.stream()
+        List<WbsTreeContract> initNode = wbsTreeContracts.stream()
                 .distinct()
                 .collect(Collectors.toList());
+        //获取所有隐蔽节点的父级、子级
+        Set<WbsTreeContract> resultAllNodes = new HashSet<>();
+        this.getConcealedWorkParentNode(resultAllNodes, initNode, contractId);
+        this.getConcealedWorkChildNode(resultAllNodes, initNode, contractId);
+        resultAllNodes.addAll(initNode);
+
+        List<WbsTreeContractVO> result = new ArrayList<>();
+        for (WbsTreeContract resultAllNode : resultAllNodes) {
+            WbsTreeContractVO vo = new WbsTreeContractVO();
+            BeanUtil.copyProperties(resultAllNode, vo);
+            result.add(vo);
+        }
+        return this.buildWbsTreeByStream(result, 0L);
+    }
 
-        //TODO
+    /**
+     * 递归获取隐蔽工程节点的所有父级节点
+     *
+     * @param resultAllNodes 结果集
+     * @param initNode       初始化节点入参
+     * @param contractId     合同段id
+     */
+    private void getConcealedWorkParentNode(Set<WbsTreeContract> resultAllNodes, List<WbsTreeContract> initNode, String contractId) {
+        Set<Long> parentIds = initNode.stream().map(WbsTreeContract::getParentId).collect(Collectors.toSet());
+        if (parentIds.size() > 0) {
+            List<WbsTreeContract> parentNodes = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().in(WbsTreeContract::getId, parentIds).eq(WbsTreeContract::getContractId, contractId).eq(WbsTreeContract::getType, 1));
+            if (parentNodes.size() > 0) {
+                resultAllNodes.addAll(parentNodes);
+                this.getConcealedWorkParentNode(resultAllNodes, parentNodes, contractId);
+            }
+        }
+    }
 
-        return null;
+    /**
+     * 递归获取隐蔽工程节点的所有子级节点
+     *
+     * @param resultAllNodes 结果集
+     * @param initNode       初始化节点入参
+     * @param contractId     合同段id
+     */
+    private void getConcealedWorkChildNode(Set<WbsTreeContract> resultAllNodes, List<WbsTreeContract> initNode, String contractId) {
+        Set<Long> childIds = initNode.stream().map(WbsTreeContract::getId).collect(Collectors.toSet());
+        if (childIds.size() > 0) {
+            List<WbsTreeContract> childNodes = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().in(WbsTreeContract::getParentId, childIds).eq(WbsTreeContract::getContractId, contractId).eq(WbsTreeContract::getType, 1));
+            if (childNodes.size() > 0) {
+                resultAllNodes.addAll(childNodes);
+                this.getConcealedWorkChildNode(resultAllNodes, childNodes, contractId);
+            }
+        }
     }
 
     /**