Explorar o código

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

yangyj hai 1 ano
pai
achega
68c64afbf8
Modificáronse 33 ficheiros con 1496 adicións e 220 borrados
  1. 6 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchivesAuto.java
  2. 46 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ExpertInspection.java
  3. 6 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/feign/ArchiveAutoClient.java
  4. 22 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveInspectVO.java
  5. 19 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO3.java
  6. 24 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ExpertInspectionVO.java
  7. 52 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ProjectInspectStatVO.java
  8. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java
  9. 6 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java
  10. 68 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InspectTreeVO.java
  11. 21 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/MyInspectTreeVO.java
  12. 119 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  13. 23 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveAutoClientImpl.java
  14. 12 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java
  15. 50 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  16. 21 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ExpertInspectionMapper.java
  17. 9 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ExpertInspectionMapper.xml
  18. 19 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  19. 15 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IExpertInspectionService.java
  20. 326 9
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  21. 22 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ExpertInspectionServiceImpl.java
  22. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  23. 41 9
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  24. 63 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java
  25. 52 53
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  26. 6 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java
  27. 11 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
  28. 109 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  29. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.java
  30. 9 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java
  31. 109 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  32. 199 125
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  33. 3 3
      blade-service/blade-manager/src/main/resources/application-dev.yml

+ 6 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchivesAuto.java

@@ -172,6 +172,12 @@ public class ArchivesAuto extends BaseEntity {
     private Integer isReviewed;
     @ApiModelProperty("申请验收状态,0未申请或已申请1验收中")
     private Integer isApply;
+    @ApiModelProperty("整改状态 0默认1整改2合格")
+    private Integer updateStatus;
+    @ApiModelProperty(value = "专家id,逗号分隔")
+    private String expertId;
+    @ApiModelProperty("是否抽检,0未抽检1已抽检")
+    private Integer isInspect;
 
     //是否是影音
     public boolean isMedia() {

+ 46 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ExpertInspection.java

@@ -0,0 +1,46 @@
+package org.springblade.archive.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+/**
+ * @Param   档案专家意见表
+ * @Author wangwl
+ * @Date 2023/11/16 14:49
+ **/
+@Data
+@TableName("u_archive_expert_inspection")
+@EqualsAndHashCode(callSuper = true)
+public class ExpertInspection extends BaseEntity {
+
+    @ApiModelProperty("项目id")
+    private Long projectId;
+
+    @ApiModelProperty("单位类型:1施工2监理3业主")
+    private Integer UnitType;
+
+    @ApiModelProperty("档案id")
+    private Long archiveId;
+
+    @ApiModelProperty("文件id")
+    private Long fileId;
+
+    @ApiModelProperty("抽检意见")
+    private String opinion;
+
+    @ApiModelProperty("专家id")
+    private Long expertId;
+
+    @ApiModelProperty("专家名称")
+    private String expertName;
+
+    @ApiModelProperty("案卷名称")
+    private String archiveName;
+
+    @ApiModelProperty("是否合格,0不合格1合格")
+    private Integer isPass;
+
+}

+ 6 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/feign/ArchiveAutoClient.java

@@ -37,4 +37,10 @@ public interface ArchiveAutoClient {
      */
     @PostMapping(API_PREFIX + "/batchUpdateIsApply")
     R<Boolean> batchUpdateIsApply(@RequestParam Integer isApply,@RequestParam List<Long> ids);
+
+    /**
+     * 批量修改档案专家,参数为节点集合
+     */
+    @PostMapping(API_PREFIX + "/batchUpdateExpertId")
+    R<Boolean> batchUpdateExpertId(@RequestParam String userId,@RequestParam List<Long> ids);
 }

+ 22 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveInspectVO.java

@@ -0,0 +1,22 @@
+package org.springblade.archive.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.archive.entity.ArchivesAuto;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/11/15 16:04
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ArchiveInspectVO extends ArchivesAuto {
+    @ApiModelProperty("是否查阅名称")
+    private String inspectStatusName;
+
+    @ApiModelProperty("整改状态名称")
+    private String updateStatusName;
+
+}

+ 19 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO3.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 wangwl 档案初检总统计,带档案单位
+ * @Date 2023/2/17 10:40
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ArchivesAutoVO3 extends ArchivesAuto {
+
+    @ApiModelProperty("主节点")
+    private Integer unitType;
+
+}

+ 24 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ExpertInspectionVO.java

@@ -0,0 +1,24 @@
+package org.springblade.archive.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.archive.entity.ExpertInspection;
+
+/**
+ * @Param   用于显示当前专家抽检记录
+ * @Author wangwl
+ * @Date 2023/11/17 11:57
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ExpertInspectionVO extends ExpertInspection {
+    @ApiModelProperty("抽检所属")
+    private String unitName;
+
+    @ApiModelProperty("所有意见")
+    private String allOpinion;
+
+    @ApiModelProperty("文件PDF")
+    private String filePdf;
+}

+ 52 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ProjectInspectStatVO.java

@@ -0,0 +1,52 @@
+package org.springblade.archive.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Param   项目抽检统计返回
+ * @Author wangwl
+ * @Date 2023/11/17 14:31
+ **/
+@Data
+public class ProjectInspectStatVO {
+    @ApiModelProperty("预警提示")
+    private String tips;
+
+    @ApiModelProperty("总抽检率")
+    private String totalInspectRatio;
+
+    @ApiModelProperty("整改状态名称")
+    private List<ProjectInspectStatVO.UnitGroup> list;
+
+    @Data
+    public static class UnitGroup {
+        @ApiModelProperty("分组")
+        private String name;
+
+        @ApiModelProperty("总案卷")
+        private Integer total;
+
+        @ApiModelProperty("已抽检")
+        private Integer endInspect;
+
+        @ApiModelProperty("需整改")
+        private Integer needUpdate;
+
+        @ApiModelProperty("抽检率")
+        private String inspectRatio;
+
+        public UnitGroup() {
+        }
+
+        public UnitGroup(Integer total, Integer endInspect, Integer needUpdate, String inspectRatio) {
+            this.total = total;
+            this.endInspect = endInspect;
+            this.needUpdate = needUpdate;
+            this.inspectRatio = inspectRatio;
+        }
+    }
+
+}

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

@@ -227,6 +227,12 @@ public class ArchiveTreeContract extends BaseEntity {
      */
     private Integer classify;
 
+    @ApiModelProperty(value = "专家id,逗号分隔")
+    private String expertId;
+
+    @ApiModelProperty(value = "专家名称,逗号分隔")
+    private String expertName;
+
 
     public ArchiveTreeContract() {
     }

+ 6 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java

@@ -181,5 +181,10 @@ public interface WbsTreeContractClient {
 
     //获取 节点下表单
     @GetMapping(API_PREFIX + "/searchNodeAllTableInfo")
-    List<AppWbsTreeContractVO> searchNodeAllTableInfo(@RequestParam String primaryKeyId, @RequestParam String type, @RequestParam String contractId, @RequestParam String projectId,@RequestParam Long userId);
+    List<AppWbsTreeContractVO> searchNodeAllTableInfo(@RequestParam String primaryKeyId, @RequestParam String type, @RequestParam String contractId, @RequestParam String projectId, @RequestParam Long userId);
+
+    /*删除合同段本地缓存*/
+    @GetMapping(API_PREFIX + "/deleteContractLocalCache")
+    void deleteContractLocalCache(@RequestParam String contractId);
+
 }

+ 68 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InspectTreeVO.java

@@ -0,0 +1,68 @@
+package org.springblade.manager.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.core.tool.node.INode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/11/9 18:05
+ **/
+@Data
+public class InspectTreeVO implements INode<InspectTreeVO> {
+
+    /**
+     * 主键ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    /**
+     * 父节点ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long parentId;
+
+    /**
+     * 子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private List<InspectTreeVO> children;
+
+    /**
+     * 是否有子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    @ApiModelProperty(value = "false没有子节点,true有子节点")
+    private Boolean hasChildren;
+
+    @Override
+    public List<InspectTreeVO> getChildren() {
+        if (this.children == null) {
+            this.children = new ArrayList<>();
+        }
+        return this.children;
+    }
+
+    @ApiModelProperty(value = "是否选择0否1是")
+    private Integer isSelect;
+
+    @ApiModelProperty(value = "节点名称")
+    private String nodeName;
+
+
+    @ApiModelProperty(value = "分属专家")
+    private String nodeInfo;
+
+    @ApiModelProperty(value = "false没有子节点,true有子节点")
+    private Boolean isChildren;
+
+
+}

+ 21 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/MyInspectTreeVO.java

@@ -0,0 +1,21 @@
+package org.springblade.manager.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.manager.entity.ArchiveTreeContract;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/11/15 15:35
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class MyInspectTreeVO extends ArchiveTreeContract {
+    @ApiModelProperty(value = "节点名称")
+    private String title;
+
+    @ApiModelProperty(value = "false没有子节点,true有子节点")
+    private Boolean hasChildren;
+}

+ 119 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -33,11 +33,11 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.apache.http.message.BasicNameValuePair;
 import org.springblade.archive.dto.SaveApplyDTO;
+import org.springblade.archive.entity.ExpertInspection;
 import org.springblade.archive.service.IArchiveAutoPdfService;
 import org.springblade.archive.utils.CallBgrsjk;
 import org.springblade.archive.utils.FileUtils;
-import org.springblade.archive.vo.ArchiveInspectPreviewVO;
-import org.springblade.archive.vo.CheckoutVO;
+import org.springblade.archive.vo.*;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.entity.InformationQuery;
 import org.springblade.common.constant.CommonConstant;
@@ -53,6 +53,7 @@ import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.feign.ArchiveTreeContractClient;
 import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.ProjectClient;
+import org.springblade.manager.vo.MyInspectTreeVO;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
@@ -60,7 +61,6 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.archive.entity.ArchivesAuto;
-import org.springblade.archive.vo.ArchivesAutoVO;
 import org.springblade.archive.wrapper.ArchivesAutoWrapper;
 import org.springblade.archive.service.IArchivesAutoService;
 import org.springblade.core.boot.ctrl.BladeController;
@@ -764,4 +764,120 @@ public class ArchivesAutoController extends BladeController {
 		ArchiveInspectPreviewVO vo = archivesAutoService.getArchivesAutoViewByUnit(unitType,projectId,1);
 		return R.data(vo);
 	}
+
+	/**
+	 * 在线验收-查询节点已经上报的档案
+	 */
+	@GetMapping("/getNodeArchives")
+	@ApiOperationSupport(order = 31)
+	@ApiOperation(value = "档案在线验收-查询节点已经上报的档案", notes = "分页查询,传入当前节点id,搜索值,返回档案集合")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+			@ApiImplicitParam(name = "nodeId", value = "当前节点id", required = true),
+			@ApiImplicitParam(name = "searchType", value = "搜索类型1档案名称2文件名称", required = true),
+			@ApiImplicitParam(name = "searchValue", value = "搜索值", required = false),
+			@ApiImplicitParam(name = "current", value = "当前页", required = true),
+			@ApiImplicitParam(name = "size", value = "每页的数量", required = true),
+			@ApiImplicitParam(name = "type", value = "树类型,所有案卷1,我验收的案卷2", required = true)
+	})
+	public R<IPage<ArchiveInspectVO>> getNodeArchives(Query query,@RequestParam Long nodeId,@RequestParam Long projectId,@RequestParam Integer searchType,@RequestParam String searchValue,@RequestParam Integer type) {
+		IPage<ArchiveInspectVO> list = archivesAutoService.getNodeArchives(query,nodeId,projectId,searchType,searchValue,type);
+		return R.data(list);
+	}
+
+	/**
+	 * 在线验收-专家抽检统计
+	 */
+	@GetMapping("/userInspectStats")
+	@ApiOperationSupport(order = 32)
+	@ApiOperation(value = "在线验收-专家抽检统计", notes = "传入项目id")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+	})
+	public R<Map<String,String>> userInspectStats(@RequestParam Long projectId) {
+		Map<String, String> map = archivesAutoService.userInspectStats(projectId);
+		return R.data(map);
+	}
+
+	/**
+	 * 在线验收-修改抽检状态
+	 */
+	@GetMapping("/updateInspectStatus")
+	@ApiOperationSupport(order = 33)
+	@ApiOperation(value = "在线验收-修改抽检状态", notes = "在当前页面停留30秒再调接口:传入档案id,返回查阅完成,可以显示到页面")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+			@ApiImplicitParam(name = "archiveId", value = "档案id", required = true)
+	})
+	public R updateInspectStatus(@RequestParam Long archiveId,@RequestParam Long projectId) {
+		archivesAutoService.updateInspectStatus(archiveId,projectId);
+		return R.data("当前案卷查阅完成");
+	}
+
+	/**
+	 * 在线验收-获取档案文件抽检意见
+	 */
+	@GetMapping("/getArchiveFileOpinion")
+	@ApiOperationSupport(order = 33)
+	@ApiOperation(value = "在线验收-获取档案文件抽检意见", notes = "传入项目id,文件id")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+			@ApiImplicitParam(name = "fileId", value = "文件id", required = true)
+	})
+	public R<ExpertInspectionVO> getArchiveFileOpinion(@RequestParam Long fileId,@RequestParam Long projectId) {
+		ExpertInspectionVO vo = archivesAutoService.getArchiveFileOpinion(fileId, projectId);
+		return R.data(vo);
+	}
+
+	/**
+	 * 在线验收-保存抽检意见
+	 */
+	@PostMapping("/saveInspect")
+	@ApiOperationSupport(order = 34)
+	@ApiOperation(value = "在线验收-保存抽检意见", notes = "传入档案id,文件id,抽检意见")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+			@ApiImplicitParam(name = "archiveId", value = "档案id", required = true),
+			@ApiImplicitParam(name = "fileId", value = "文件id", required = false),
+			@ApiImplicitParam(name = "opinion", value = "抽检意见", required = false)
+	})
+	public R saveInspect(@RequestBody ExpertInspection inspection) {
+		archivesAutoService.saveInspect(inspection);
+		return R.data("保存成功");
+	}
+
+	/**
+	 * 在线验收-专家抽检记录
+	 */
+	@GetMapping("/getUserInspectInfo")
+	@ApiOperationSupport(order = 35)
+	@ApiOperation(value = "在线验收-专家抽检记录", notes = "分页返回当前专家抽检记录:传入项目id")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "current", value = "当前页", required = true),
+			@ApiImplicitParam(name = "size", value = "每页的数量", required = true),
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+	})
+	public R<IPage<ExpertInspectionVO>> getUserInspectInfo(Query query,@RequestParam Long projectId) {
+		IPage<ExpertInspectionVO> page = archivesAutoService.getUserInspectInfo(query, projectId);
+		return R.data(page);
+	}
+
+
+
+	/**
+	 * 在线验收-项目抽检统计
+	 */
+	@GetMapping("/projectInspectStat")
+	@ApiOperationSupport(order = 35)
+	@ApiOperation(value = "在线验收-项目抽检统计", notes = "传入项目id")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+	})
+	public R<ProjectInspectStatVO> projectInspectStat(@RequestParam Long projectId) {
+		ProjectInspectStatVO vo = archivesAutoService.projectInspectStat(projectId);
+		return R.data(vo);
+	}
+
+
+
 }

+ 23 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveAutoClientImpl.java

@@ -1,8 +1,10 @@
 package org.springblade.archive.feign;
 
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.entity.ArchiveProjectConfig;
 import org.springblade.archive.entity.ArchivesAuto;
+import org.springblade.archive.mapper.ArchivesAutoMapper;
 import org.springblade.archive.service.IArchiveProjectConfigService;
 import org.springblade.archive.service.IArchivesAutoService;
 import org.springblade.archive.vo.ArchivesAutoVO;
@@ -18,6 +20,8 @@ import java.util.List;
 @AllArgsConstructor
 public class ArchiveAutoClientImpl implements ArchiveAutoClient {
 
+    private ArchivesAutoMapper autoMapper;
+
     private IArchivesAutoService archivesAutoService;
 
     private final IArchiveProjectConfigService archiveProjectConfigService;
@@ -43,4 +47,23 @@ public class ArchiveAutoClientImpl implements ArchiveAutoClient {
     public R<Boolean> batchUpdateIsApply(Integer isApply, List<Long> ids) {
         return archivesAutoService.batchUpdateIsApply(isApply,ids);
     }
+
+    @Override
+    public R<Boolean> batchUpdateExpertId(String userId, List<Long> ids) {
+        List<ArchivesAuto> list = autoMapper.getNodeAllArchive(ids);
+        //循环判断是否已经存在专家,存在则追加
+        list.stream().forEach(l->{
+            if (StringUtils.isBlank(l.getExpertId())){
+                //为空
+                l.setExpertId(userId);
+            }else {
+                //不为空
+                String expertId = l.getExpertId();
+                l.setExpertId(expertId+","+userId);
+            }
+        });
+        //保存所有节点
+        archivesAutoService.updateBatchById(list);
+        return R.data(true);
+    }
 }

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

@@ -21,10 +21,9 @@ import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.archive.dto.ArchivesAutoDTO;
 import org.springblade.archive.entity.ArchivesAuto;
-import org.springblade.archive.vo.ArchivesAutoVO;
+import org.springblade.archive.vo.*;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springblade.archive.vo.ArchivesAutoVO2;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.system.entity.DictBiz;
@@ -173,4 +172,15 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
 	//用于档案巡检查询单位下档案
 	List<ArchivesAutoVO2> getUnitAllArchive2(@Param("firstNode") Long firstNode,@Param("grade") Integer grade,@Param("isApply") Integer isApply);
 
+	IPage<ArchiveInspectVO> getNodeArchives(IPage<ArchiveInspectVO> page,@Param("id") Long nodeId,@Param("projectId") Long projectId,@Param("searchType") Integer searchType,@Param("searchValue") String searchValue,@Param("userId") Long userId);
+
+    List<ArchivesAuto> getNodeAllArchive(@Param("ids") List<Long> ids);
+
+    Integer getUserArchiveTotal(@Param("projectId") Long projectId,@Param("userId") Long userId);
+
+	Integer getUserReviewedTotal(@Param("projectId") Long projectId,@Param("userId") Long userId);
+
+	IPage<ExpertInspectionVO> getUserInspectInfo(IPage<ExpertInspectionVO> page,@Param("projectId") Long projectId,@Param("userId") Long userId);
+
+    List<ArchivesAutoVO3> getAllInspectArchive(@Param("projectId")Long projectId);
 }

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

@@ -1001,6 +1001,56 @@
         WHERE uaa.is_deleted = 0 and matc.is_deleted = 0 and uaa.is_apply = #{isApply} and matc.ancestors like concat("%",#{firstNode},"%")
         order by uaa.tree_sort
     </select>
+    <select id="getNodeArchives" resultType="org.springblade.archive.vo.ArchiveInspectVO">
+        select uaa.id ,uaa.file_number,uaa.name ,uaa.unit,
+               (CASE when uaa.is_inspect = 0 then '未抽检' else '已抽检' end) as inspectStatusName,
+               (CASE when uaa.update_status = 1 then '整改' when uaa.update_status = 2 then '合格' else null end) as updateStatusName
+        from m_archive_tree_contract atc right join u_archives_auto uaa on atc.id = uaa.node_id
+        WHERE uaa.is_apply = 1 and uaa.project_id = #{projectId} and atc.project_id = #{projectId} and atc.is_deleted = 0 and uaa.is_deleted =0
+          and FIND_IN_SET(#{id}, atc.ancestors)
+        <if test="userId != null">
+            and FIND_IN_SET(#{userId}, uaa.expert_id)
+        </if>
+        <if test="searchValue != null and searchValue != ''">
+            <if test="searchType == 1">
+                and uaa.name like concat('%',#{searchValue},'%')
+            </if>
+            <if test="searchType == 2">
+                and (select COUNT(1) from u_archive_file uaf WHERE uaf.archive_id = uaa.id and uaf.file_name like concat('%',#{searchValue},'%'))
+            </if>
+        </if>
+    </select>
+    <select id="getNodeAllArchive" resultType="org.springblade.archive.entity.ArchivesAuto">
+        select id,expert_id
+        from u_archives_auto where is_deleted = 0 and node_id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+    <select id="getUserArchiveTotal" resultType="java.lang.Integer">
+        SELECT COUNT(1) from u_archives_auto
+        WHERE project_id = #{projectId} and is_deleted = 0 and FIND_IN_SET(#{userId},expert_id)
+    </select>
+    <select id="getUserReviewedTotal" resultType="java.lang.Integer">
+        SELECT COUNT(1) from u_archives_auto
+        WHERE project_id = #{projectId} and is_deleted = 0 and is_inspect = 1 and FIND_IN_SET(#{userId},expert_id)
+    </select>
+    <select id="getUserInspectInfo" resultType="org.springblade.archive.vo.ExpertInspectionVO">
+        select aei.id,aei.archive_name ,aei.opinion , aei.archive_id,expert_name,
+               (case when unit_type = 1 then '施工' when unit_type = 2 then '监理' else '业主' end) as unitName,
+               (select uaf.pdf_file_url from u_archive_file uaf where uaf.id = aei.file_id) as filePdf
+        from u_archive_expert_inspection aei
+        WHERE project_id = #{projectId} and is_deleted = 0
+        <if test="userId != null">
+            and expert_id = #{userId}
+        </if>
+        order BY update_time DESC
+    </select>
+    <select id="getAllInspectArchive" resultType="org.springblade.archive.vo.ArchivesAutoVO3">
+        SELECT (case when contract_id is null then '3' when contract_id = -1 then '3' else (SELECT contract_type from m_contract_info mci WHERE mci.id = uaa.contract_id) end) as unitType,
+               uaa.*
+        from u_archives_auto uaa WHERE project_id = #{projectId} and is_deleted = 0 and is_apply = 1
+    </select>
 
 
     <update id="splitFiles">

+ 21 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ExpertInspectionMapper.java

@@ -0,0 +1,21 @@
+package org.springblade.archive.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.archive.entity.ExpertInspection;
+import org.springblade.archive.vo.ExpertInspectionVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @since 2023-04-09
+ */
+public interface ExpertInspectionMapper extends BaseMapper<ExpertInspection> {
+
+    List<ExpertInspection> getListByFileId(@Param("fileId") Long fileId,@Param("projectId") Long projectId);
+}

+ 9 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ExpertInspectionMapper.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.archive.mapper.ExpertInspectionMapper">
+
+    <select id="getListByFileId" resultType="org.springblade.archive.entity.ExpertInspection">
+        select * from u_archive_expert_inspection
+        where project_id = #{projectId} and file_id = #{fileId} and is_deleted = 0 and is_pass = 0
+    </select>
+</mapper>

+ 19 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java

@@ -18,12 +18,12 @@ package org.springblade.archive.service;
 
 import org.springblade.archive.dto.SaveApplyDTO;
 import org.springblade.archive.entity.ArchivesAuto;
-import org.springblade.archive.vo.ArchiveInspectPreviewVO;
-import org.springblade.archive.vo.ArchivesAutoVO;
-import org.springblade.archive.vo.CheckoutVO;
+import org.springblade.archive.entity.ExpertInspection;
+import org.springblade.archive.vo.*;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.system.entity.DictBiz;
@@ -121,4 +121,20 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	Boolean getApplyStatus(Long projectId);
 
 	void annulApply(Long projectId);
+
+	IPage<ArchiveInspectVO> getNodeArchives(Query query,Long nodeId, Long projectId,Integer searchType,String searchValue,Integer type);
+
+	Map<String,String> userInspectStats(Long projectId);
+
+	void updateInspectStatus(Long archiveId,Long projectId);
+
+	void saveInspect(ExpertInspection inspection);
+
+	IPage<ExpertInspectionVO> getUserInspectInfo(Query query, Long projectId);
+
+    ProjectInspectStatVO projectInspectStat(Long projectId);
+
+	ExpertInspectionVO getArchiveFileOpinion(Long fileId, Long projectId);
+
+
 }

+ 15 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IExpertInspectionService.java

@@ -0,0 +1,15 @@
+package org.springblade.archive.service;
+
+import org.springblade.archive.entity.ArchiveProjectConfig;
+import org.springblade.archive.entity.ExpertInspection;
+import org.springblade.archive.vo.ExpertInspectionVO;
+import org.springblade.core.mp.base.BaseService;
+
+import java.util.List;
+
+
+public interface IExpertInspectionService extends BaseService<ExpertInspection> {
+
+
+    List<ExpertInspection> getListByFileId(Long fileId, Long projectId);
+}

+ 326 - 9
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -25,6 +25,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.AllArgsConstructor;
@@ -33,18 +34,13 @@ import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.dto.SaveApplyDTO;
 import org.springblade.archive.entity.ArchiveProjectConfig;
 import org.springblade.archive.entity.ArchivesAuto;
-import org.springblade.archive.service.IArchiveAutoPdfService;
-import org.springblade.archive.service.IArchiveOfflineVersionInfoService;
-import org.springblade.archive.service.IArchiveProjectConfigService;
+import org.springblade.archive.entity.ExpertInspection;
+import org.springblade.archive.service.*;
 import org.springblade.archive.utils.ArchiveTreeUtil;
 import org.springblade.archive.utils.FileTransJavaDemo;
 import org.springblade.archive.utils.FileUtils;
-import org.springblade.archive.vo.ArchiveInspectPreviewVO;
-import org.springblade.archive.vo.ArchivesAutoVO;
+import org.springblade.archive.vo.*;
 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.entity.Task;
 import org.springblade.business.entity.TaskParallel;
@@ -96,6 +92,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.math.BigDecimal;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -138,6 +135,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 	private final TaskClient taskClient;
 
+	private final IExpertInspectionService inspectionService;
+
 
 
 
@@ -2630,7 +2629,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		task.setContractId(contractInfos.get(0).getId()+"");
 		task.setStartTime(dto.getStartDate().toString());
 		task.setReportUser(AuthUtil.getUserId().toString());
-		task.setReportUserName(AuthUtil.getUserName());
+		task.setReportUserName(AuthUtil.getNickName());
 		task.setTaskName(dto.getTaskName());
 		task.setTaskContent(dto.getTaskContent());
 		//数据指向设置为专家信息
@@ -2694,6 +2693,324 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		}
 	}
 
+	/**
+	 * 在线验收-查询节点已经上报的档案,id为节点id
+	 */
+	@Override
+	public IPage<ArchiveInspectVO> getNodeArchives(Query query,Long nodeId,Long projectId,Integer searchType,String searchValue,Integer type) {
+		IPage<ArchiveInspectVO> page = new Page<>(query.getCurrent(),query.getSize());
+		if (type == 1){
+			return baseMapper.getNodeArchives(page,nodeId,projectId,searchType,searchValue,null);
+		}else {
+			return baseMapper.getNodeArchives(page,nodeId,projectId,searchType,searchValue,AuthUtil.getUserId());
+		}
+	}
+
+	/**
+	 * 在线验收-抽检统计
+	 */
+	@Override
+	public Map<String, String> userInspectStats(Long projectId) {
+		Map<String, String> map = new HashMap<>();
+		Long userId = AuthUtil.getUserId();
+		//获取用户归属档案总数
+		Integer t1 = baseMapper.getUserArchiveTotal(projectId, userId);
+		if (t1 == 0){
+			return null;
+		}
+		map.put("total",t1+"");
+		//获取用户归属档案所有已阅总数
+		Integer t2 = baseMapper.getUserReviewedTotal(projectId, userId);
+		if (t2 > t1){
+			throw new ServiceException("数据错误,已阅比总数多");
+		}
+		map.put("reviewed",t2+"");
+		if (t2 == 0){
+			map.put("ratio","0%");
+		}else {
+			map.put("ratio", new BigDecimal(t2).divide(new BigDecimal(t1), 3, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).setScale(1) + "%");
+		}
+		return map;
+	}
+
+	/**
+	 * 在线验收-修改抽检状态
+	 */
+	@Override
+	@Transactional
+	public void updateInspectStatus(Long archiveId,Long projectId) {
+		//查看当前档案是否存在有意见的数据,存在则什么都不修改,不存在则修改已抽检,合格
+		long count2 = inspectionService.count(new LambdaQueryWrapper<ExpertInspection>()
+				.eq(ExpertInspection::getIsPass, 0)
+				.eq(ExpertInspection::getArchiveId, archiveId));
+		//修改档案抽检状态
+		if (count2 == 0) {
+			this.update(new LambdaUpdateWrapper<ArchivesAuto>()
+					.set(ArchivesAuto::getIsInspect, 1)
+					.set(ArchivesAuto::getUpdateStatus,2)
+					.eq(ArchivesAuto::getId, archiveId));
+		}
+		//查看当前专家在意见表中是否对当前案卷有数据,如果存在数据则证明抽检过,直接跳过
+		Long userId = AuthUtil.getUserId();
+		long count = inspectionService.count(new LambdaQueryWrapper<ExpertInspection>()
+						.eq(ExpertInspection::getExpertId, userId)
+						.eq(ExpertInspection::getArchiveId, archiveId));
+		if (count == 0){
+			String userName = AuthUtil.getNickName();
+			//获取档案信息,如果状态未未查阅则修改
+			ArchivesAuto archive = this.getById(archiveId);
+			//查询当前案卷节点的合同段类型
+			Integer unitType;
+			if (archive.getContractId() == null || archive.getContractId() == -1){
+				unitType = 3;
+			}else {
+				ContractInfo contract = contractClient.getContractById(archive.getContractId());
+				unitType = contract.getContractType();
+			}
+			ExpertInspection inspection = new ExpertInspection();
+			inspection.setProjectId(projectId);
+			inspection.setExpertId(userId);
+			inspection.setExpertName(userName);
+			inspection.setIsPass(1);
+			inspection.setUnitType(unitType);
+			inspection.setArchiveId(archiveId);
+			inspection.setArchiveName(archive.getName());
+			inspectionService.save(inspection);
+		}
+
+	}
+
+	/**
+	 * 在线验收-保存抽检意见
+	 */
+	@Override
+	@Transactional
+	public void saveInspect(ExpertInspection inspection) {
+		//判断是否存在文件id
+		if (inspection.getFileId() == null){
+			throw new ServiceException("未获取到当前的文件id");
+		}
+		//专家基本信息
+		Long userId = AuthUtil.getUserId();
+		String userName = AuthUtil.getNickName();
+		//获取档案信息,如果状态未未查阅则修改
+		ArchivesAuto archive = this.getById(inspection.getArchiveId());
+		archive.setIsInspect(1);
+		//查询当前案卷节点的合同段类型
+		Integer unitType;
+		if (archive.getContractId() == null || archive.getContractId() == -1){
+			unitType = 3;
+		}else {
+			ContractInfo contract = contractClient.getContractById(archive.getContractId());
+			unitType = contract.getContractType();
+		}
+		//判断是否存在意见
+		Integer isPass = 1;
+		if (StringUtils.isNotBlank(inspection.getOpinion())){
+			isPass = 0;
+		}
+		inspection.setArchiveName(archive.getName());
+		inspection.setExpertId(userId);
+		inspection.setExpertName(userName);
+		inspection.setIsPass(isPass);
+		inspection.setUnitType(unitType);
+		//如果专家对案卷没有意见
+		if (isPass == 1){
+			//判断是否有合格意见,有则直接跳过
+			long count3 = inspectionService.count(new LambdaQueryWrapper<ExpertInspection>()
+					.eq(ExpertInspection::getExpertId, userId)
+					.eq(ExpertInspection::getArchiveId, archive.getId())
+					.eq(ExpertInspection::getIsPass, 1));
+			if (count3 == 0){
+				//先删除当前专家对当前案卷当前文件的意见
+				inspectionService.remove(new LambdaQueryWrapper<ExpertInspection>()
+						.eq(ExpertInspection::getExpertId, userId)
+						.eq(ExpertInspection::getArchiveId, inspection.getArchiveId())
+						.eq(ExpertInspection::getFileId, inspection.getFileId()));
+				//再查看当前专家是否对当前档案有意见
+				long count2 = inspectionService.count(new LambdaQueryWrapper<ExpertInspection>()
+						.eq(ExpertInspection::getExpertId, userId)
+						.eq(ExpertInspection::getArchiveId, archive.getId())
+						.eq(ExpertInspection::getIsPass, 0));
+				//没有就直接保存合格
+				if (count2 == 0) {
+					inspection.setFileId(null);
+					inspectionService.save(inspection);
+				}
+			}
+		}else {
+			//如果专家对案卷有意见,先删除当前专家在意见表对当前档案合格的意见
+			inspectionService.remove(new LambdaQueryWrapper<ExpertInspection>()
+					.eq(ExpertInspection::getExpertId, userId)
+					.eq(ExpertInspection::getArchiveId, inspection.getArchiveId())
+					.eq(ExpertInspection::getIsPass, 1));
+			//再去查看意见表是否存在对当前档案当前文件的意见
+			ExpertInspection one = inspectionService.getOne(new LambdaQueryWrapper<ExpertInspection>()
+					.eq(ExpertInspection::getExpertId, userId)
+					.eq(ExpertInspection::getArchiveId, inspection.getArchiveId())
+					.eq(ExpertInspection::getFileId, inspection.getFileId()));
+			//如果不存在数据,然后保存
+			if (one == null) {
+				inspectionService.save(inspection);
+			} else {
+				//如果存在数据,则判断是否存在意见,然后修改
+				one.setIsPass(isPass);
+				one.setOpinion(inspection.getOpinion());
+				inspectionService.updateById(one);
+			}
+		}
+		//查询当前档案的所有不合格专家意见
+		long count = inspectionService.count(new LambdaQueryWrapper<ExpertInspection>()
+				.eq(ExpertInspection::getArchiveId, archive.getId())
+				.eq(ExpertInspection::getIsPass, 0));
+		if (count > 0){
+			//如果有则修改档案不合格
+			archive.setUpdateStatus(1);
+		}else {
+			//如果没有则修改档案为合格
+			archive.setUpdateStatus(2);
+		}
+		this.updateById(archive);
+	}
+
+	/**
+	 * 在线验收-抽检记录
+	 */
+	@Override
+	public IPage<ExpertInspectionVO> getUserInspectInfo(Query query, Long projectId) {
+		Long userId = AuthUtil.getUserId();
+		//判断当前用户职位是否为专家组长,专家组长查看所有
+		String userRole = AuthUtil.getUserRole();
+		if ("1656191696348082177".equals(userRole)){
+			userId = null;
+		}
+		IPage<ExpertInspectionVO> page = new Page<>(query.getCurrent(),query.getSize());
+		return baseMapper.getUserInspectInfo(page,projectId,userId);
+	}
+
+	/**
+	 * 在线验收-项目抽检统计
+	 */
+	@Override
+	public ProjectInspectStatVO projectInspectStat(Long projectId) {
+		//获取当前项目下所有已经申请抽检的案卷
+		List<ArchivesAutoVO3> list = baseMapper.getAllInspectArchive(projectId);
+		if (list == null || list.size() == 0){
+			return null;
+		}
+		ProjectInspectStatVO vo = new ProjectInspectStatVO();
+		List<ProjectInspectStatVO.UnitGroup> groupList = new ArrayList<>();
+		//总抽检率
+		BigDecimal totalRatio = new BigDecimal(0) ;
+		//根据单位类型分组
+		Map<Integer, List<ArchivesAutoVO3>> listMap = list.stream().collect(Collectors.groupingBy(ArchivesAutoVO3::getUnitType));
+		//统计业主
+		List<ArchivesAutoVO3> list1 = listMap.get(3);
+		if (list1 != null && list1.size() > 0){
+			ProjectInspectStatVO.UnitGroup unitGroup = new ProjectInspectStatVO.UnitGroup();
+			unitGroup.setTotal(list1.size());
+			list1.removeIf(l-> l.getIsInspect() == 0);
+			unitGroup.setEndInspect(list1.size());
+			list1.removeIf(l->l.getUpdateStatus() == 2);
+			unitGroup.setNeedUpdate(list1.size());
+			BigDecimal bigDecimal = new BigDecimal(unitGroup.getEndInspect()).divide(new BigDecimal(unitGroup.getTotal()), 3, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).setScale(1);
+			unitGroup.setInspectRatio(bigDecimal.toString()+"%");
+			unitGroup.setName("业主组");
+			groupList.add(unitGroup);
+			totalRatio = totalRatio.add(bigDecimal);
+
+		}else {
+			ProjectInspectStatVO.UnitGroup unitGroup = new ProjectInspectStatVO.UnitGroup(0,0,0,"0%");
+			unitGroup.setName("业主组");
+			groupList.add(unitGroup);
+		}
+		//统计监理
+		List<ArchivesAutoVO3> list2 = listMap.get(2);
+		if (list2 != null && list2.size() > 0){
+			ProjectInspectStatVO.UnitGroup unitGroup = new ProjectInspectStatVO.UnitGroup();
+			unitGroup.setTotal(list2.size());
+			list2.removeIf(l-> l.getIsInspect() == 0);
+			unitGroup.setEndInspect(list2.size());
+			list2.removeIf(l->l.getUpdateStatus() == 2);
+			unitGroup.setNeedUpdate(list2.size());
+			BigDecimal bigDecimal = new BigDecimal(unitGroup.getEndInspect()).divide(new BigDecimal(unitGroup.getTotal()), 3, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).setScale(1);
+			unitGroup.setInspectRatio(bigDecimal.toString()+"%");
+			unitGroup.setName("监理组");
+			groupList.add(unitGroup);
+			totalRatio = totalRatio.add(bigDecimal);
+
+		}else {
+			ProjectInspectStatVO.UnitGroup unitGroup = new ProjectInspectStatVO.UnitGroup(0,0,0,"0%");
+			unitGroup.setName("监理组");
+			groupList.add(unitGroup);
+		}
+		//统计施工
+		List<ArchivesAutoVO3> list3 = listMap.get(1);
+		if (list3 != null && list3.size() > 0){
+			ProjectInspectStatVO.UnitGroup unitGroup = new ProjectInspectStatVO.UnitGroup();
+			unitGroup.setTotal(list3.size());
+			list3.removeIf(l-> l.getIsInspect() == 0);
+			unitGroup.setEndInspect(list3.size());
+			list3.removeIf(l->l.getUpdateStatus() == 2);
+			unitGroup.setNeedUpdate(list3.size());
+			BigDecimal bigDecimal = new BigDecimal(unitGroup.getEndInspect()).divide(new BigDecimal(unitGroup.getTotal()), 3, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).setScale(1);
+			unitGroup.setInspectRatio(bigDecimal.toString()+"%");
+			unitGroup.setName("施工组");
+			groupList.add(unitGroup);
+			totalRatio = totalRatio.add(bigDecimal);
+
+		}else {
+			ProjectInspectStatVO.UnitGroup unitGroup = new ProjectInspectStatVO.UnitGroup(0,0,0,"0%");
+			unitGroup.setName("施工组");
+			groupList.add(unitGroup);
+		}
+		ProjectInspectStatVO.UnitGroup unitGroup2 = new ProjectInspectStatVO.UnitGroup(0,0,0,"0%");
+		unitGroup2.setName("声像组");
+		groupList.add(unitGroup2);
+		ProjectInspectStatVO.UnitGroup unitGroup3 = new ProjectInspectStatVO.UnitGroup(0,0,0,"0%");
+		unitGroup3.setName("竣工图组");
+		groupList.add(unitGroup3);
+		vo.setList(groupList);
+		vo.setTotalInspectRatio(totalRatio.toString());
+		//案卷低于100卷,则需要全部抽检完,抽检率必须达到100%,否则则提示抽检率不达标,未达到100%;
+		//案卷高于100卷,所有抽检案卷加起来的抽检率不足10%,则提示抽检率未达到10%
+		if (list.size() <= 100){
+			if (new BigDecimal(100).compareTo(totalRatio) != 0){
+				vo.setTips("预警提示:抽检率未达到验收要求,目前只抽检了"+totalRatio+"%");
+			}
+		}else {
+			if (new BigDecimal(10).compareTo(totalRatio) != -1){
+				vo.setTips("预警提示:抽检率未达到验收要求,目前只抽检了"+totalRatio+"%");
+			}
+		}
+		return vo;
+	}
+
+	/**
+	 * 在线验收-获取档案文件抽检意见
+	 */
+	@Override
+	public ExpertInspectionVO getArchiveFileOpinion(Long fileId, Long projectId) {
+		Long userId = AuthUtil.getUserId();
+		String userName = AuthUtil.getNickName();
+		ExpertInspectionVO vo = new ExpertInspectionVO();
+		//获取意见表里当前文件相关意见
+		List<ExpertInspection> list = inspectionService.getListByFileId(fileId,projectId);
+		if (list != null && list.size() > 0){
+			StringBuilder str = new StringBuilder();
+			for (ExpertInspection inspection : list) {
+				str.append(inspection.getExpertName()+":"+inspection.getOpinion()+";");
+				if (userId.equals(inspection.getExpertId())){
+					vo.setOpinion(inspection.getOpinion());
+				}
+			}
+			vo.setAllOpinion(str.toString());
+		}
+		return vo;
+	}
+
+
+
 	public void deleteFile(String defaultDir,Long id){
 		String dir = defaultDir+"/"+id;
 		String file = defaultDir+"/"+id+".zip";

+ 22 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ExpertInspectionServiceImpl.java

@@ -0,0 +1,22 @@
+package org.springblade.archive.service.impl;
+
+
+import org.springblade.archive.entity.ExpertInspection;
+import org.springblade.archive.mapper.ExpertInspectionMapper;
+import org.springblade.archive.service.IExpertInspectionService;
+import org.springblade.archive.vo.ExpertInspectionVO;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class ExpertInspectionServiceImpl extends BaseServiceImpl<ExpertInspectionMapper, ExpertInspection> implements IExpertInspectionService {
+
+
+    @Override
+    public List<ExpertInspection> getListByFileId(Long fileId, Long projectId) {
+        return baseMapper.getListByFileId(fileId,projectId);
+    }
+}
+

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

@@ -685,7 +685,7 @@ public class TaskController extends BladeController {
                                     dto.setTenantId(AuthUtil.getTenantId());
                                     dto.setAccount("expert"+phone);
                                     StringSPUtils stringSPUtils = new StringSPUtils();
-                                    dto.setPassword(stringSPUtils.getStringSP(name)+phone);
+                                    dto.setPassword(stringSPUtils.getStringSP(name).toLowerCase(Locale.ROOT)+phone);
                                     dto.setUserType("3");
                                     dto.setRealName(name);
                                     dto.setPhone(phone);

+ 41 - 9
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java

@@ -25,6 +25,7 @@ import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.entity.TabBusstimeInfo;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.feign.ContractClient;
@@ -908,16 +909,47 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
 
     @Override
     public void delAsyncWbsTree(String contractId) {
-        //模糊匹配所有以contractId开头的所有合同段节点key值
-        Set<String> keysByNodes = RedisTemplate.keys("blade-manager::contract:wbstree:" + contractId + "*");
-        if (keysByNodes != null) {
-            RedisTemplate.delete(keysByNodes);
-        }
+        ContractInfo contractInfo = jdbcTemplate.query("select id,contract_type from m_contract_info where id = " + contractId, new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
+
+        /*================ 监理合同段 ================*/
+        if (contractInfo != null && (new Integer("2").equals(contractInfo.getContractType()) || new Integer("3").equals(contractInfo.getContractType()))) {
+            String sql = "select * from m_contract_relation_jlyz where contract_id_jlyz = " + contractInfo.getId();
+            List<Long> record_SG = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ContractRelationJlyz.class)).stream().map(ContractRelationJlyz::getContractIdSg).collect(Collectors.toList());
+            if (record_SG.size() > 0) {
+                for (Long sgId : record_SG) {
+                    //模糊匹配所有以contractId开头的所有合同段节点key值
+                    Set<String> keysByNodes = RedisTemplate.keys("blade-manager::contract:wbstree:" + sgId + "*");
+                    if (keysByNodes != null) {
+                        RedisTemplate.delete(keysByNodes);
+                    }
+
+                    //模糊匹配所有以contractId开头的所有资料填报key值
+                    Set<String> keysByInformationQuery = RedisTemplate.keys("blade-manager::contract:wbstree:byInformationQuery:" + sgId + "*");
+                    if (keysByInformationQuery != null) {
+                        RedisTemplate.delete(keysByInformationQuery);
+                    }
+
+                    //删除合同段本地缓存
+                    wbsTreeContractClient.deleteContractLocalCache(String.valueOf(sgId));
+                }
+            }
+
+            /*================ 施工合同段 ================*/
+        } else if (contractInfo != null && new Integer("1").equals(contractInfo.getContractType())) {
+            //模糊匹配所有以contractId开头的所有合同段节点key值
+            Set<String> keysByNodes = RedisTemplate.keys("blade-manager::contract:wbstree:" + contractId + "*");
+            if (keysByNodes != null) {
+                RedisTemplate.delete(keysByNodes);
+            }
+
+            //模糊匹配所有以contractId开头的所有资料填报key值
+            Set<String> keysByInformationQuery = RedisTemplate.keys("blade-manager::contract:wbstree:byInformationQuery:" + contractId + "*");
+            if (keysByInformationQuery != null) {
+                RedisTemplate.delete(keysByInformationQuery);
+            }
 
-        //模糊匹配所有以contractId开头的所有资料填报key值
-        Set<String> keysByInformationQuery = RedisTemplate.keys("blade-manager::contract:wbstree:byInformationQuery:" + contractId + "*");
-        if (keysByInformationQuery != null) {
-            RedisTemplate.delete(keysByInformationQuery);
+            //删除合同段本地缓存
+            wbsTreeContractClient.deleteContractLocalCache(contractId);
         }
     }
 

+ 63 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java

@@ -21,10 +21,12 @@ import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 
 import lombok.extern.slf4j.Slf4j;
 import org.checkerframework.checker.units.qual.A;
+import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.cache.utils.CacheUtil;
 import org.springblade.core.log.exception.ServiceException;
@@ -43,14 +45,12 @@ import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.service.IArchiveTreeService;
 import org.springblade.manager.service.IContractInfoService;
 import org.springblade.manager.service.impl.ArchiveTreeContractSyncImpl;
-import org.springblade.manager.vo.ArchiveTreeContractVO2;
+import org.springblade.manager.vo.*;
 
-import org.springblade.manager.vo.ArchiveTreeContractVO4;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.manager.entity.ArchiveTreeContract;
-import org.springblade.manager.vo.ArchiveTreeContractVO;
 import org.springblade.manager.wrapper.ArchiveTreeContractWrapper;
 import org.springblade.manager.service.IArchiveTreeContractService;
 import org.springblade.core.boot.ctrl.BladeController;
@@ -448,4 +448,64 @@ public class ArchiveTreeContractController extends BladeController {
 
         return R.success("开始同步合同段,请耐心等待" );
     }
+
+    /**
+     * 在线验收-确认抽检范围
+     */
+    @GetMapping("/getUnitAllNode")
+    @ApiOperationSupport(order = 20)
+    @ApiOperation(value = "档案在线验收-确认抽检范围", notes = "传入选择参数")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "projectId", value = "项目id"),
+            @ApiImplicitParam(name = "types", value = "1业主2监理3施工4影像5竣工图")
+    })
+    public R<List<InspectTreeVO>> getUnitAllNode(@RequestParam Long projectId, @RequestParam String types) {
+        List<InspectTreeVO> list = archiveTreeContractService.getUnitAllNode(projectId,types);
+        return R.data(list);
+    }
+
+    /**
+     * 在线验收-确认并进入抽检
+     */
+    @PostMapping("/saveAllSelectNodes")
+    @ApiOperationSupport(order = 21)
+    @ApiOperation(value = "档案在线验收-确认并进入抽检", notes = "传入选择参数")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "ids", value = "选择的节点,逗号拼接")
+    })
+    public R saveAllSelectNodes(@RequestBody Map<String, String> map) {
+        archiveTreeContractService.saveAllSelectNodes(map);
+        return R.data("分配成功");
+    }
+
+    /**
+     * 在线验收-我验收的案卷
+     */
+    @GetMapping("/lazyTree")
+    @ApiOperationSupport(order = 22)
+    @ApiOperation(value = "档案在线验收-我验收的案卷", notes = "懒加载树,传入父id和项目id,返回子集合")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "parentId", value = "父id,首节点传0"),
+            @ApiImplicitParam(name = "projectId", value = "项目id")
+    })
+    public R<List<MyInspectTreeVO>> lazyTree(@RequestParam Long parentId, @RequestParam Long projectId) {
+        List<MyInspectTreeVO> list = archiveTreeContractService.lazyTree(parentId, projectId);
+        return R.data(list);
+    }
+
+    /**
+     * 在线验收-开始抽检
+     */
+    @GetMapping("/startInspect")
+    @ApiOperationSupport(order = 22)
+    @ApiOperation(value = "档案在线验收-开始抽检", notes = "返回true跳转初始化验收,返回false跳转档案初检")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "projectId", value = "项目id")
+    })
+    public R<Boolean> startInspect(@RequestParam Long projectId) {
+        return R.data(archiveTreeContractService.startInspect(projectId));
+    }
+
+
+
 }

+ 52 - 53
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -313,7 +313,7 @@ public class ExcelTabController extends BladeController {
         BladeFile bladeFile = newIOSSClient.uploadFile(file.getOriginalFilename(), exceUrl);
         // 解析原始excel
 
-      //  BladeFile bladeFileR = newIOSSClient.uploadFileByInputStream(file);
+        //  BladeFile bladeFileR = newIOSSClient.uploadFileByInputStream(file);
         detail.setExtension(file.getOriginalFilename());
         detail.setFileUrl(bladeFile.getLink());
         detail.setFileType(3); // 表示为清表信息  1 表示祖节点  2 表示为节点信息 3 表示清表
@@ -1801,7 +1801,7 @@ public class ExcelTabController extends BladeController {
         // 解析 style
         Document doc = Jsoup.parse(htmlString);
         Element table = doc.select("table").first();
-        table.select("table").attr("min-width","-webkit-fill-available");
+        table.select("table").attr("min-width", "-webkit-fill-available");
         doc.select("Col").remove();
         fileInputStream.close();
         return R.data(table + "");
@@ -1960,7 +1960,7 @@ public class ExcelTabController extends BladeController {
         String sql = "select pdf_url,e_visa_pdf_url,pdf_trial_url,pdf_trial_url_position,status from u_information_query where classify='" + classify + "' and wbs_id='" + nodeId + "' and contract_id='" + contractId + "'";
         List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
         if (maps == null || maps.size() == 0) {
-            WbsTreeContract contract = wbsTreeContractService.getOne(new LambdaQueryWrapper<WbsTreeContract>().eq(WbsTreeContract::getPKeyId,nodeId));
+            WbsTreeContract contract = wbsTreeContractService.getOne(new LambdaQueryWrapper<WbsTreeContract>().eq(WbsTreeContract::getPKeyId, nodeId));
             String fileName = this.wbsParamService.createFileTitle(contract);
             InformationQuery query = new InformationQuery();
             query.setId(SnowFlakeUtil.getId());
@@ -1972,7 +1972,7 @@ public class ExcelTabController extends BladeController {
             query.setType((contract.getIsExpernode() == null || contract.getIsExpernode() <= 0) ? 1 : 2);
             query.setName(fileName);
             query.setCreateTime(new Date());
-            query.setFileUserIdAndName(AuthUtil.getUserId()+"-"+AuthUtil.getUserName());
+            query.setFileUserIdAndName(AuthUtil.getUserId() + "-" + AuthUtil.getUserName());
             informationQueryClient.saveInfo(query);
         }
         excelTabService.getBussPdfs(nodeId, classify, contractId, projectId);
@@ -2031,11 +2031,11 @@ public class ExcelTabController extends BladeController {
                 return R.fail("暂无PDF数据");
             } else {
                 // 由于独立附件 需要追加最后
-                List<TableFileVO> data = tableFileService.selectTableFileListByTen(Long.valueOf(nodeId+""));
+                List<TableFileVO> data = tableFileService.selectTableFileListByTen(Long.valueOf(nodeId + ""));
                 List<String> datainfo = new ArrayList<>();
                 datainfo.add(pdfUrl);
-                if(data!=null && data.size()>=1){
-                    for(TableFileVO tabsx :data){
+                if (data != null && data.size() >= 1) {
+                    for (TableFileVO tabsx : data) {
                         datainfo.add(tabsx.getUrl());
                     }
                     String listPdf = file_path + "/pdf/" + nodeId + ".pdf";
@@ -2046,7 +2046,7 @@ public class ExcelTabController extends BladeController {
                     FileUtils.mergePdfPublicMethods(datainfo, listPdf);
                     String netUrl = FileUtils.getNetUrl(listPdf);
                     return R.data(netUrl);
-                }else{
+                } else {
                     return R.data(pdfUrl);
                 }
             }
@@ -2106,9 +2106,6 @@ public class ExcelTabController extends BladeController {
     }
 
 
-
-
-
     @PostMapping("/save_buss_data")
     @ApiOperationSupport(order = 13)
     @ApiOperation(value = "填报页面数据保存", notes = "填报页面数据保存")
@@ -2189,7 +2186,7 @@ public class ExcelTabController extends BladeController {
         if (errorPKeyIds.size() > 0) {
             List<AppWbsTreeContractVO> errorTabs = new LinkedList<>();
             for (AppWbsTreeContractVO appWbsTreeContractVO : tableAll) {
-                if (errorPKeyIds.contains(appWbsTreeContractVO.getPKeyId().toString())){
+                if (errorPKeyIds.contains(appWbsTreeContractVO.getPKeyId().toString())) {
                     errorTabs.add(appWbsTreeContractVO);
                 }
             }
@@ -2411,8 +2408,8 @@ public class ExcelTabController extends BladeController {
                                                 sheet.getCellRange(y1, x1).getStyle().setShrinkToFit(true);
 
                                             } else if (data.html().indexOf("hc-form-checkbox-group") >= 0) {
-                                                 CellRange cellRange = sheet.getCellRange(y1, x1);
-                                                 String exceVal = cellRange.getValue().replaceAll(" ", "");
+                                                CellRange cellRange = sheet.getCellRange(y1, x1);
+                                                String exceVal = cellRange.getValue().replaceAll(" ", "");
                                                 //如果有□ 代表 自动生成  如果没有 代表后期添加 需要显示html 中的值
                                                 if (exceVal.indexOf("□") >= 0) {
                                                     if (myData.equals("1")) {
@@ -2420,7 +2417,7 @@ public class ExcelTabController extends BladeController {
                                                     }
                                                 } else {
                                                     List<Node> nodes = data.childNodes();
-                                                    Node node = nodes.get(nodes.size() -1);
+                                                    Node node = nodes.get(nodes.size() - 1);
                                                     String dataJson = node.attr(":objs");
                                                     if (StringUtils.isNotEmpty(dataJson)) {
                                                         JSONArray jsonArray = JSONArray.parseArray(dataJson);
@@ -3800,47 +3797,48 @@ public class ExcelTabController extends BladeController {
     @PostMapping("/save_sigpdfInfo12313213")
     @ApiOperationSupport(order = 72)
     @ApiOperation(value = "pdf", notes = "pdf")
-    public void synPDFInfo(@RequestParam String contractid,@RequestParam String typeinfo){
-        String sqlInfo = "SELECT DISTINCT wbs_id,classify,contract_id,project_id,type from u_information_query where contract_id='"+contractid+"' and is_deleted=0 and type=1 and  classify='"+typeinfo+"' and wbs_id in(SELECT p_key_id from m_wbs_tree_contract where is_deleted=0 and contract_id='"+contractid+"')";
+    public void synPDFInfo(@RequestParam String contractid, @RequestParam String typeinfo) {
+        String sqlInfo = "SELECT DISTINCT wbs_id,classify,contract_id,project_id,type from u_information_query where contract_id='" + contractid + "' and is_deleted=0 and type=1 and  classify='" + typeinfo + "' and wbs_id in(SELECT p_key_id from m_wbs_tree_contract where is_deleted=0 and contract_id='" + contractid + "')";
         List<Map<String, Object>> maps = jdbcTemplate.queryForList(sqlInfo);
         System.out.println(maps.size());
 
-            int i=0;
-            if(maps!=null && maps.size()>=1){
-                for(Map<String, Object> dataMap:maps){
-                    String nodeId = dataMap.get("wbs_id")+"";
-                    String classify = dataMap.get("classify")+"";
-                    String contractId = dataMap.get("contract_id")+"";
-                    String projectId = dataMap.get("project_id")+"";
-                    List<AppWbsTreeContractVO> tableAll = wbsTreeContractService.searchNodeAllTable(nodeId, classify, contractId, projectId);
-                    if(tableAll!=null && tableAll.size()>=1){
-                        for(AppWbsTreeContractVO tab:tableAll){
-                            try {
-                                 excelTabService.getBussPdfInfo(Long.parseLong(tab.getPKeyId()+""));
-                            }catch (Exception e){
-                                e.printStackTrace();
-                            }finally {
-                                continue;
-                            }
+        int i = 0;
+        if (maps != null && maps.size() >= 1) {
+            for (Map<String, Object> dataMap : maps) {
+                String nodeId = dataMap.get("wbs_id") + "";
+                String classify = dataMap.get("classify") + "";
+                String contractId = dataMap.get("contract_id") + "";
+                String projectId = dataMap.get("project_id") + "";
+                List<AppWbsTreeContractVO> tableAll = wbsTreeContractService.searchNodeAllTable(nodeId, classify, contractId, projectId);
+                if (tableAll != null && tableAll.size() >= 1) {
+                    for (AppWbsTreeContractVO tab : tableAll) {
+                        try {
+                            excelTabService.getBussPdfInfo(Long.parseLong(tab.getPKeyId() + ""));
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        } finally {
+                            continue;
                         }
                     }
-                    i=i+1;
-                    System.out.println("完成1---="+i);
-                    try {
-                        excelTabService.getBussPdfs(nodeId, classify, contractId, projectId);
-                    } catch (Exception e) {
-                        continue;
-                    }finally {
-                        continue;
-                    }
+                }
+                i = i + 1;
+                System.out.println("完成1---=" + i);
+                try {
+                    excelTabService.getBussPdfs(nodeId, classify, contractId, projectId);
+                } catch (Exception e) {
+                    continue;
+                } finally {
+                    continue;
                 }
             }
+        }
 
     }
 
 
     /**
      * 用户保存新接口
+     *
      * @param dataInfo
      * @return
      * @throws Exception
@@ -3856,13 +3854,14 @@ public class ExcelTabController extends BladeController {
         } else { //单个保存
             dataArray.add(dataInfo);
         }
-        this.excelTabService.formulaFillData2(dataArray,ExecuteType.INSPECTION);
+        this.excelTabService.formulaFillData2(dataArray, ExecuteType.INSPECTION);
         return excelTabService.saveBussData(dataArray);
     }
 
 
     /**
      * 质检附件追加
+     *
      * @return ObjectStat
      */
     @SneakyThrows
@@ -3876,8 +3875,8 @@ public class ExcelTabController extends BladeController {
     })
     public R addBussFile(@RequestParam("file") MultipartFile[] file, String nodeId) {
         List<TableFile> fileList = new ArrayList<>();
-        if(file!=null && file.length>=1){
-            for (MultipartFile multipartFile:file){
+        if (file != null && file.length >= 1) {
+            for (MultipartFile multipartFile : file) {
                 R<BladeFile> bladeFile = iossClient.addFileInfo(multipartFile);
                 BladeFile bladeFile1 = bladeFile.getData();
 
@@ -3894,7 +3893,7 @@ public class ExcelTabController extends BladeController {
             }
             tableFileService.saveOrUpdateBatch(fileList);
             return R.data("操作成功");
-        }else{
+        } else {
             return R.data("请上传pdf");
         }
 
@@ -3910,21 +3909,21 @@ public class ExcelTabController extends BladeController {
             @ApiImplicitParam(name = "classify", value = "classify", required = true),
             @ApiImplicitParam(name = "projectId", value = "projectId", required = true)
     })
-    public R synPDFInfo(String contractId,String nodeIds, String classify, String projectId) {
+    public R synPDFInfo(String contractId, String nodeIds, String classify, String projectId) {
 
-        if( contractId==null && StringUtils.isEmpty(contractId)){
+        if (contractId == null && StringUtils.isEmpty(contractId)) {
             return R.data("contractId不能为空");
         }
 
-        if(nodeIds==null && StringUtils.isEmpty(nodeIds)){
+        if (nodeIds == null && StringUtils.isEmpty(nodeIds)) {
             return R.data("nodeId不能为空");
         }
 
-        if(classify==null && StringUtils.isEmpty(classify)){
+        if (classify == null && StringUtils.isEmpty(classify)) {
             return R.data("classify不能为空");
         }
 
-        if(projectId==null && StringUtils.isEmpty(projectId)){
+        if (projectId == null && StringUtils.isEmpty(projectId)) {
             return R.data("projectId不能为空");
         }
 
@@ -3962,7 +3961,7 @@ public class ExcelTabController extends BladeController {
                 js.put("dataInfo", js2);
                 this.saveBussData2(js);
             }
-        }catch (Exception e){
+        } catch (Exception e) {
             return null;
         }
         return R.data("成功");

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

@@ -425,4 +425,10 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
         return list;
     }
 
+    /*删除合同段本地缓存*/
+    @Override
+    public void deleteContractLocalCache(String contractId) {
+        wbsTreeContractServiceImpl.deleteContractLocalCache(contractId);
+    }
+
 }

+ 11 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java

@@ -23,12 +23,9 @@ import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.entity.InformationQuery;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.entity.WbsTreePrivate;
-import org.springblade.manager.vo.ArchiveTreeContractVO;
+import org.springblade.manager.vo.*;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springblade.manager.vo.ArchiveTreeContractVO2;
-import org.springblade.manager.vo.ArchiveTreeContractVO3;
-import org.springblade.manager.vo.ArchiveTreeVO;
 
 import java.util.List;
 import java.util.Map;
@@ -121,4 +118,14 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
 //     List<ArchiveFile> getListByContractId(@Param("contractId") Long contractId);
 //
 //    List<InformationQuery> getInformationByContractId(@Param("contractId") Long contractId);
+
+    List<InspectTreeVO> getUnitAllNode(@Param("projectId") Long project,@Param("ownerUnit")Long ownerUnit,@Param("supervisorUnit") Long supervisorUnit,@Param("buildUnit") Long buildUnit);
+
+    InspectTreeVO getFirstNode(@Param("projectId") Long projectId);
+
+    List<ArchiveTreeContract> getUnitFirstNode(@Param("id") Long id);
+
+    List<ArchiveTreeContract> getSelectNodes(@Param("ids") List<Long> longs);
+
+    List<MyInspectTreeVO> MyLazyTree(@Param("parentId") Long parentId,@Param("projectId") Long projectId,@Param("userId") Long userId);
 }

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

@@ -500,6 +500,115 @@
         order by ancestors
             limit 1
     </select>
+<!--    <select id="getUnitAllNode" resultType="org.springblade.manager.vo.InspectTreeVO">-->
+<!--        <if test="ownerUnit != null">-->
+<!--            select id,parent_id,node_name,-->
+<!--            (CASE when LENGTH(expert_id) > 0 then 0 else 1 end) as isSelect,-->
+<!--            (CASE when LENGTH(expert_id) > 0 then concat('该目录已分属', atc.expert_name , '专家') else '' end) as nodeInfo-->
+<!--            from m_archive_tree_contract atc-->
+<!--            WHERE is_deleted =0 and project_id = #{projectId}-->
+<!--            and (id = #{ownerUnit} or FIND_IN_SET(#{ownerUnit},ancestors))-->
+<!--        </if>-->
+<!--        <if test="ownerUnit != null and (supervisorUnit != null or buildUnit != null)">-->
+<!--            UNION all-->
+<!--        </if>-->
+<!--        <if test="supervisorUnit != null">-->
+<!--            select id,parent_id,node_name,-->
+<!--            (CASE when LENGTH(expert_id) > 0 then 0 else 1 end) as isSelect,-->
+<!--            (CASE when LENGTH(expert_id) > 0 then concat('该目录已分属', atc.expert_name , '专家') else '' end) as nodeInfo-->
+<!--            from m_archive_tree_contract atc-->
+<!--            WHERE is_deleted =0 and project_id = #{projectId}-->
+<!--            and  (id = #{supervisorUnit} or FIND_IN_SET(#{supervisorUnit},ancestors))-->
+<!--        </if>-->
+<!--        <if test="supervisorUnit != null and buildUnit != null">-->
+<!--            UNION all-->
+<!--        </if>-->
+<!--        <if test="buildUnit != null ">-->
+<!--        select id,parent_id,node_name,-->
+<!--        (CASE when LENGTH(expert_id) > 0 then 0 else 1 end) as isSelect,-->
+<!--        (CASE when LENGTH(expert_id) > 0 then concat('该目录已分属', atc.expert_name , '专家') else '' end) as nodeInfo-->
+<!--        from m_archive_tree_contract atc-->
+<!--        WHERE is_deleted =0 and project_id = #{projectId}-->
+<!--        and  (id = #{buildUnit} or FIND_IN_SET(#{buildUnit},ancestors))-->
+<!--        </if>-->
+<!--    </select>-->
+
+    <select id="getUnitAllNode" resultType="org.springblade.manager.vo.InspectTreeVO">
+        <if test="ownerUnit != null">
+            select id,parent_id,
+            (CASE when LENGTH(expert_id) > 0 then 0 else 1 end) as isSelect,
+            if((select COUNT(1) from m_archive_tree_contract WHERE is_deleted = 0 and parent_id = atc.id) > 0,true,false) as isChildren,
+            (CASE when LENGTH(expert_id) > 0 then concat('该目录已分属', atc.expert_name , '专家') else '' end) as nodeInfo,
+            (concat(atc.node_name,'(', (select COUNT(1) from u_archives_auto  WHERE  is_apply = 1 and is_deleted=0 and node_id in (select id from m_archive_tree_contract where is_deleted = 0 and project_id = #{projectId}
+            and (id = atc.id or FIND_IN_SET(atc.id,ancestors)))), '卷)')) as node_name
+            from m_archive_tree_contract atc
+            WHERE is_deleted =0 and project_id = #{projectId}
+            and (id = #{ownerUnit} or FIND_IN_SET(#{ownerUnit},ancestors))
+        </if>
+        <if test="ownerUnit != null and (supervisorUnit != null or buildUnit != null)">
+            UNION all
+        </if>
+        <if test="supervisorUnit != null">
+            select id,parent_id,
+            (CASE when LENGTH(expert_id) > 0 then 0 else 1 end) as isSelect,
+            if((select COUNT(1) from m_archive_tree_contract WHERE is_deleted = 0 and parent_id = atc.id) > 0,true,false) as isChildren,
+            (CASE when LENGTH(expert_id) > 0 then concat('该目录已分属', atc.expert_name , '专家') else '' end) as nodeInfo,
+            (concat(atc.node_name,'(', (select COUNT(1) from u_archives_auto  WHERE  is_apply = 1 and is_deleted=0 and node_id in (select id from m_archive_tree_contract where is_deleted = 0 and project_id = #{projectId}
+            and (id = atc.id or FIND_IN_SET(atc.id,ancestors)))), '卷)')) as node_name
+            from m_archive_tree_contract atc
+            WHERE is_deleted =0 and project_id = #{projectId}
+            and  (id = #{supervisorUnit} or FIND_IN_SET(#{supervisorUnit},ancestors))
+        </if>
+        <if test="supervisorUnit != null and buildUnit != null">
+            UNION all
+        </if>
+        <if test="buildUnit != null ">
+            select id,parent_id,
+            (CASE when LENGTH(expert_id) > 0 then 0 else 1 end) as isSelect,
+            if((select COUNT(1) from m_archive_tree_contract WHERE is_deleted = 0 and parent_id = atc.id) > 0,true,false) as isChildren,
+            (CASE when LENGTH(expert_id) > 0 then concat('该目录已分属', atc.expert_name , '专家') else '' end) as nodeInfo,
+            (concat(atc.node_name,'(', (select COUNT(1) from u_archives_auto  WHERE  is_apply = 1 and is_deleted=0 and node_id in (select id from m_archive_tree_contract where is_deleted = 0 and project_id = #{projectId}
+            and (id = atc.id or FIND_IN_SET(atc.id,ancestors)))), '卷)')) as node_name
+            from m_archive_tree_contract atc
+            WHERE is_deleted =0 and project_id = #{projectId}
+            and  (id = #{buildUnit} or FIND_IN_SET(#{buildUnit},ancestors))
+        </if>
+    </select>
+
+    <select id="getFirstNode" resultType="org.springblade.manager.vo.InspectTreeVO">
+        select id,parent_id,
+               (CASE when LENGTH(expert_id) > 0 then 0 else 1 end) as isSelect,
+               if((select COUNT(1) from m_archive_tree_contract WHERE is_deleted = 0 and parent_id = atc.id) > 0,true,false) as isChildren,
+--                (CASE when LENGTH(expert_id) > 0 then concat('该目录已分属', atc.expert_name , '专家') else '' end) as nodeInfo,
+               (concat(atc.node_name,'(', (select COUNT(1) from u_archives_auto  WHERE  is_apply = 1 and is_deleted=0 and node_id in (select id from m_archive_tree_contract where is_deleted = 0 and project_id = #{projectId}
+                and (id = atc.id or FIND_IN_SET(atc.id,ancestors)))), ')')) as node_name
+        from m_archive_tree_contract atc
+        WHERE atc.parent_id = 0 and atc.is_deleted = 0 and project_id =#{projectId}
+    </select>
+    <select id="getUnitFirstNode" resultType="org.springblade.manager.entity.ArchiveTreeContract">
+        SELECT id,
+               (CASE tree_code WHEN 'C' THEN 3 WHEN  's' THEN 2 ELSE 1 END) as tree_code
+        from m_archive_tree_contract
+        WHERE parent_id = #{id} and is_deleted = 0
+    </select>
+    <select id="getSelectNodes" resultType="org.springblade.manager.entity.ArchiveTreeContract">
+        select id,expert_id,expert_name
+        from m_archive_tree_contract where id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+    <select id="MyLazyTree" resultType="org.springblade.manager.vo.MyInspectTreeVO">
+        select *,node_name as title,
+               if((select COUNT(1) from m_archive_tree_contract WHERE is_deleted = 0 and parent_id = d.id) > 0,true,false) as hasChildren
+        FROM
+        m_archive_tree_contract d
+        WHERE
+        d.parent_id = #{parentId} AND d.is_deleted = 0 and project_id = #{projectId}
+        and FIND_IN_SET(#{userId},d.expert_id)
+        ORDER BY d.sort
+    </select>
+
 
     <update id="updateAllSonNodeIdsForArchiveAutoRule">
 

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

@@ -9,7 +9,7 @@ import org.springblade.manager.vo.*;
 
 import java.util.List;
 
-@CacheNamespace
+//@CacheNamespace
 public interface WbsTreeContractMapper extends EasyBaseMapper<WbsTreeContract> {
 
     int deleteByIds(@Param("ids") List<Long> ids);

+ 9 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java

@@ -24,11 +24,9 @@ import org.springblade.manager.dto.ArchiveTreeDTO;
 import org.springblade.manager.entity.ArchiveTree;
 import org.springblade.manager.entity.ArchiveTreeContract;
 
-import org.springblade.manager.vo.ArchiveTreeContractVO;
+import org.springblade.manager.vo.*;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springblade.manager.vo.ArchiveTreeContractVO2;
-import org.springblade.manager.vo.ArchiveTreeContractVO3;
 
 
 import java.util.ArrayList;
@@ -126,4 +124,12 @@ public interface IArchiveTreeContractService extends BaseService<ArchiveTreeCont
                                                  String periodName);
 
     public void updateWbsRuleNodes(Long projectId);
+
+    List<InspectTreeVO> getUnitAllNode(Long project, String types);
+
+    void saveAllSelectNodes(Map<String, String> map);
+
+    List<MyInspectTreeVO> lazyTree(Long parentId, Long projectId);
+
+    Boolean startInspect(Long projectId);
 }

+ 109 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -16,18 +16,22 @@
  */
 package org.springblade.manager.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.mixsmart.utils.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import lombok.AllArgsConstructor;
+import org.springblade.archive.feign.ArchiveAutoClient;
 import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.manager.dto.ArchiveTreeContractDTO;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.feign.WbsTreeContractClient;
@@ -42,6 +46,7 @@ import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.*;
@@ -78,6 +83,8 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 
 	private final ArchiveAutoRuleWbsMapper archiveAutoRuleWbsMapper;
 
+	private final ArchiveAutoClient archiveAutoClient;
+
 
 
 
@@ -1339,5 +1346,107 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		}
 	}
 
+	/**
+	 * 档案验收返回单位所有节点
+	 * @param projectId
+	 * @return
+	 */
+	@Override
+	public List<InspectTreeVO> getUnitAllNode(Long projectId,String types) {
+		/**
+		 *  1业主2监理3施工4影像5竣工图,根据勾选的类型,返回单位首节点集合,勾选哪个单位回显哪个
+		 *   如果勾选了施工,又勾选了影像和竣工图,则只返回施工,
+		 *   如果只勾选了影像和竣工图,则返回施工节点类型为声像、隐蔽、竣工图类型的节点
+		 *   如果当前目录下所有节点都属于某个专家,则显示该目录已分属XX专家
+		 *   每个节点下有多少卷档案也要标识
+		 */
+		//获取首节点
+		InspectTreeVO firstNode = baseMapper.getFirstNode(projectId);
+		//获取三个单位节点
+		List<ArchiveTreeContract> unitFirstNode = baseMapper.getUnitFirstNode(firstNode.getId());
+		Map<String, Long> unitMap = unitFirstNode.stream().collect(Collectors.toMap(l -> l.getTreeCode(), l -> l.getId()));
+		//根据选择单位选择
+		Long ownerUnit = null;
+		Long supervisorUnit = null;
+		Long buildUnit = null;
+		if (types.contains("1")){
+			ownerUnit = unitMap.get("1");
+		}
+		if (types.contains("2")){
+			supervisorUnit = unitMap.get("2");
+		}
+		if (types.contains("3")){
+			buildUnit = unitMap.get("3");
+		}else if(types.contains("4") || types.contains("5")){
+			buildUnit = unitMap.get("3");
+		}
+		//结果集
+		List<InspectTreeVO> unitAllNode = baseMapper.getUnitAllNode(projectId,ownerUnit,supervisorUnit,buildUnit);
+		unitAllNode.add(firstNode);
+		return org.springblade.manager.utils.ForestNodeMerger.merge(unitAllNode);
+	}
+
+	@Override
+	@Transactional
+	public void saveAllSelectNodes(Map<String, String> map) {
+		String ids = map.get("ids");
+		//获取当前用户id与名称
+		String userId = AuthUtil.getUserId()+"";
+		String userName = AuthUtil.getNickName();
+		//取出所有选择的节点,只获取专家名称和专家id字段
+		List<Long> longs = Func.toLongList(ids);
+		List<ArchiveTreeContract> list = baseMapper.getSelectNodes(longs);
+		//循环判断是否已经存在专家,存在则追加
+		list.stream().forEach(l->{
+			if (org.apache.commons.lang3.StringUtils.isBlank(l.getExpertId())){
+				//为空
+				l.setExpertId(userId);
+				l.setExpertName(userName);
+			}else {
+				//不为空
+				String expertId = l.getExpertId();
+				l.setExpertId(expertId+","+userId);
+				String expertName = l.getExpertName();
+				l.setExpertName(expertName+"/"+userName);
+			}
+		});
+		//保存所有节点
+		this.updateBatchById(list);
+		//修改节点下所有档案,并保存
+		R<Boolean> booleanR = archiveAutoClient.batchUpdateExpertId(userId, longs);
+		if (booleanR.getData() == null || booleanR.getData() != true){
+			throw new ServiceException("为档案绑定专家失败");
+		}
+	}
+
+	@Override
+	public List<MyInspectTreeVO> lazyTree(Long parentId, Long projectId) {
+		//获取当前用户id,用于获取分配给当前用户的树
+		Long userId = AuthUtil.getUserId();
+		List<MyInspectTreeVO> vos = baseMapper.MyLazyTree(parentId, projectId, userId);
+		return vos;
+	}
+
+	/**
+	 * 在线验收-开始抽检
+	 */
+	@Override
+	public Boolean startInspect(Long projectId) {
+		//获取当前项目首节点
+		ArchiveTreeContract one = this.getOne(new LambdaQueryWrapper<ArchiveTreeContract>()
+				.eq(ArchiveTreeContract::getProjectId, projectId)
+				.eq(ArchiveTreeContract::getParentId, 0));
+		if (one == null){
+			throw new ServiceException("未找到当前项目首节点");
+		}
+		Long userId = AuthUtil.getUserId();
+		//判断是否存在当前专家id
+		if (StringUtil.isNotBlank(one.getExpertId()) && one.getExpertId().contains(userId+"")){
+			return false;
+		}else {
+			return true;
+		}
+	}
+
 
 }

+ 199 - 125
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -14,6 +14,8 @@ import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springblade.business.entity.ConstructionLedger;
 import org.springblade.business.feign.ConstructionLedgerFeignClient;
 import org.springblade.business.feign.InformationQueryClient;
@@ -25,7 +27,6 @@ import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.secure.utils.AuthUtil;
-import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.bean.NodeVO;
@@ -52,10 +53,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.LinkedCaseInsensitiveMap;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
 import java.math.BigInteger;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
@@ -69,6 +67,7 @@ import java.util.stream.Stream;
 @AllArgsConstructor
 public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractMapper, WbsTreeContract> implements IWbsTreeContractService {
 
+    private static final Logger logger = LoggerFactory.getLogger(WbsTreeContractServiceImpl.class);
     private final ConstructionLedgerFeignClient constructionLedgerFeign;
     private final WbsTreePrivateMapper wbsTreePrivateMapper;
     private final ContractInfoMapper contractInfoMapper;
@@ -79,6 +78,10 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     @Autowired
     StringRedisTemplate redisTemplate;
 
+    //存储当前合同段contractId对应的合同段树
+    private final Map<String, List<WbsTreeContractLazyVO>> localCacheNodes = new ConcurrentHashMap<>();
+    //存储当前合同段contractId_tableOwner对应的资料查询信息缓存
+    private final Map<String, List<WbsTreeContractLazyQueryInfoVO>> localCacheQueryInfos = new ConcurrentHashMap<>();
 
     @Override
     public List<WbsTreeContract> selectQueryCurrentNodeByAncestors(List<String> ids, String contractId) {
@@ -682,52 +685,55 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     @Override
     public List<WbsTreeContractLazyVO> lazyQueryContractWbsTree(String id, String contractId, String contractIdRelation, String tableOwner) {
         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);
+            ContractInfo contractInfo = contractInfoMapper.selectOne(Wrappers.<ContractInfo>lambdaQuery().select(ContractInfo::getContractName, ContractInfo::getContractType).eq(ContractInfo::getId, contractId));
             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 {*/
-
-                    //long startTime1 = System.currentTimeMillis();
-
-                    /*开启mybatis-plus二级缓存*/
-                    List<WbsTreeContract> wbsTreeContracts = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
-                            .select(WbsTreeContract::getId, WbsTreeContract::getPKeyId, WbsTreeContract::getParentId)
-                            .eq(WbsTreeContract::getType, 1)
-                            .eq(WbsTreeContract::getStatus, 1)
-                            .eq(WbsTreeContract::getContractId, contractId)
-                    );
-
-                    /*long endTime1 = System.currentTimeMillis();
-                    long executionTime1 = endTime1 - startTime1;
-                    System.out.println("1111111111111:" + executionTime1);*/
-
-                    nodesAll = BeanUtil.copyProperties(wbsTreeContracts, WbsTreeContractLazyVO.class);
-
-                    //nodesAll = jdbcTemplate.query("select a.p_key_id,a.id,a.parent_id from m_wbs_tree_contract a where a.type = 1 and a.status = 1 and a.is_deleted = 0 and a.contract_id = " + contractId, new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
-                    if (nodesAll.size() > 0) {
-                        //判断是否有子级,赋值
-                        Map<Long, List<WbsTreeContractLazyVO>> groupedByParentId = nodesAll.stream().collect(Collectors.groupingBy(WbsTreeContractLazyVO::getParentId));
-                        for (WbsTreeContractLazyVO vo : nodesAll) {
-                            if (vo.getParentId() == 0) {
-                                vo.setHasChildren(1);
-                            }
-                            List<WbsTreeContractLazyVO> childNodes = groupedByParentId.getOrDefault(vo.getId(), null);
-                            if (childNodes != null && childNodes.size() > 0) {
-                                vo.setHasChildren(1);
-                            } else {
-                                vo.setHasChildren(0);
+                    /*获取本地缓存*/
+                    List<WbsTreeContractLazyVO> nodesAll = localCacheNodes.get(contractId);
+
+                    if (nodesAll == null || nodesAll.size() == 0) {
+
+                        //获取当前合同段所有缓存节点信息
+                        Object data = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:" + contractId);
+                        if (data != null) {
+                            //从Redis获取数据
+                            nodesAll = JSON.parseArray(data.toString(), WbsTreeContractLazyVO.class);
+                            /*更新本地缓存*/
+                            localCacheNodes.put(contractId, nodesAll);
+
+                        } else {
+
+                            long startTime1 = System.currentTimeMillis();
+
+                            nodesAll = jdbcTemplate.query("select a.p_key_id,a.id,a.parent_id from m_wbs_tree_contract a where a.type = 1 and a.status = 1 and a.is_deleted = 0 and a.contract_id = " + contractId, new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
+
+                            long endTime1 = System.currentTimeMillis();
+                            long executionTime1 = endTime1 - startTime1;
+                            logger.info("查询合同段" + contractId + "所有树执行时间:" + executionTime1 + " ms");
+
+                            if (nodesAll.size() > 0) {
+                                //判断是否有子级,赋值
+                                Map<Long, List<WbsTreeContractLazyVO>> groupedByParentId = nodesAll.stream().collect(Collectors.groupingBy(WbsTreeContractLazyVO::getParentId));
+                                for (WbsTreeContractLazyVO vo : nodesAll) {
+                                    if (vo.getParentId() == 0) {
+                                        vo.setHasChildren(1);
+                                    }
+                                    List<WbsTreeContractLazyVO> childNodes = groupedByParentId.getOrDefault(vo.getId(), null);
+                                    if (childNodes != null && childNodes.size() > 0) {
+                                        vo.setHasChildren(1);
+                                    } else {
+                                        vo.setHasChildren(0);
+                                    }
+                                }
+                                /*更新本地缓存*/
+                                localCacheNodes.put(contractId, nodesAll);
+
+                                JSONArray array = JSONArray.parseArray(JSON.toJSONString(nodesAll));
+                                redisTemplate.opsForValue().set("blade-manager::contract:wbstree:" + contractId, JSON.toJSON(array).toString());
                             }
                         }
-                        /*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,contract_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));
@@ -746,7 +752,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         ));
 
                         //获取当前合同段所有填报资料缓存信息
-                        List<WbsTreeContractLazyQueryInfoVO> queryInfoList;
+                        List<WbsTreeContractLazyQueryInfoVO> queryInfoList = this.getQueryInfoList(contractId, tableOwner);
+                        /*List<WbsTreeContractLazyQueryInfoVO> queryInfoList;
                         Object dataInformationQuery;
                         if (ObjectUtil.isEmpty(tableOwner)) {
                             dataInformationQuery = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:byInformationQuery:" + contractId + "_1");
@@ -769,25 +776,24 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                     redisTemplate.opsForValue().set("blade-manager::contract:wbstree:byInformationQuery:" + contractId + "_" + tableOwner, JSON.toJSON(array).toString());
                                 }
                             }
-                        }
+                        }*/
                         Map<Long, Integer> queryInfoMaps = queryInfoList.stream().filter(f -> ObjectUtil.isNotEmpty(f.getWbsId()))
                                 .collect(Collectors.toMap(WbsTreeContractLazyQueryInfoVO::getWbsId, WbsTreeContractLazyQueryInfoVO::getStatus, (existingValue, newValue) -> existingValue));
                         List<Long> pKeyIdList = new ArrayList<>(queryInfoMaps.keySet());
 
-
                         //TODO 处理数量
                         //填报过的所有最底层节点
                         List<WbsTreeContractLazyVO> lowestNodesTB = distinctLowestNodesAll.parallelStream().filter(f -> pKeyIdList.contains(f.getPKeyId())).collect(Collectors.toList());
                         List<Long> lowestNodeParentIdsTB = lowestNodesTB.parallelStream().map(WbsTreeContractLazyVO::getParentId).collect(Collectors.toList());
                         List<WbsTreeContractLazyVO> resultParentNodesTB = new ArrayList<>();
 
-                        //long startTime2 = System.currentTimeMillis();
+                        long startTime2 = System.currentTimeMillis();
 
                         this.recursiveGetParentNodes(resultParentNodesTB, lowestNodeParentIdsTB, nodesAll);
 
-                        /*long endTime2 = System.currentTimeMillis();
+                        long endTime2 = System.currentTimeMillis();
                         long executionTime2 = endTime2 - startTime2;
-                        System.out.println("2222222222222:" + executionTime2);*/
+                        logger.info("recursiveGetParentNodes 处理数量 执行时间:" + executionTime2 + " ms");
 
                         //最底层节点颜色构造后Map
                         Map<Long, WbsTreeContractLazyVO> lowestNodesMap = lowestNodesTB.stream()
@@ -803,7 +809,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                     }
                                 }).collect(Collectors.toMap(WbsTreeContractLazyVO::getPKeyId, Function.identity()));
 
-                        //long startTime3 = System.currentTimeMillis();
+                        long startTime3 = System.currentTimeMillis();
+
                         //TODO 处理颜色
                         //先将WbsTreeContractLazyVO转为NodeVO
                         List<NodeVO> nodeVOList = distinctNodesAll.stream().map(this::convertToNodeVO).collect(Collectors.toList());
@@ -818,9 +825,9 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         //获取所有节点颜色Map
                         Map<Long, Integer> nodeColorStatusMap = nodeVOS.stream().collect(Collectors.toMap(NodeVO::getPKeyId, NodeVO::getStatus, (existing, replacement) -> existing));
 
-                        /*long endTime3 = System.currentTimeMillis();
-                        long executionTime3 = endTime3- startTime3;
-                        System.out.println("3333333333333:" + executionTime3);*/
+                        long endTime3 = System.currentTimeMillis();
+                        long executionTime3 = endTime3 - startTime3;
+                        logger.info("处理颜色执行时间:" + executionTime3 + " ms");
 
                         //TODO 处理最终结果集
                         if (lazyNodes.size() > 0) {
@@ -881,41 +888,43 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                     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 {*/
+                            /*获取本地缓存*/
+                            List<WbsTreeContractLazyVO> nodesAll = localCacheNodes.get(sgContractId);
 
-                            List<WbsTreeContract> wbsTreeContracts = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
-                                    .select(WbsTreeContract::getId, WbsTreeContract::getPKeyId, WbsTreeContract::getParentId)
-                                    .eq(WbsTreeContract::getType, 1)
-                                    .eq(WbsTreeContract::getStatus, 1)
-                                    .eq(WbsTreeContract::getContractId, sgContractId)
-                            );
-                            nodesAll = BeanUtil.copyProperties(wbsTreeContracts, WbsTreeContractLazyVO.class);
+                            if (nodesAll == null || nodesAll.size() == 0) {
 
-                            //nodesAll = jdbcTemplate.query("select a.p_key_id,a.id,a.parent_id from m_wbs_tree_contract a where a.type = 1 and a.status = 1 and a.is_deleted = 0 and a.contract_id = " + sgContractId, new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
-                            if (nodesAll.size() > 0) {
-                                //判断是否有子级,赋值
-                                Map<Long, List<WbsTreeContractLazyVO>> groupedByParentId = nodesAll.stream().collect(Collectors.groupingBy(WbsTreeContractLazyVO::getParentId));
-                                for (WbsTreeContractLazyVO vo : nodesAll) {
-                                    if (vo.getParentId() == 0) {
-                                        vo.setHasChildren(1);
-                                    }
-                                    List<WbsTreeContractLazyVO> childNodes = groupedByParentId.getOrDefault(vo.getId(), null);
-                                    if (childNodes != null && childNodes.size() > 0) {
-                                        vo.setHasChildren(1);
-                                    } else {
-                                        vo.setHasChildren(0);
+                                //获取当前合同段所有缓存节点信息
+                                Object data = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:" + sgContractId);
+                                if (data != null) {
+                                    //从Redis获取数据
+                                    nodesAll = JSON.parseArray(data.toString(), WbsTreeContractLazyVO.class);
+                                    /*更新本地缓存*/
+                                    localCacheNodes.put(sgContractId, nodesAll);
+
+                                } else {
+                                    nodesAll = jdbcTemplate.query("select a.p_key_id,a.id,a.parent_id from m_wbs_tree_contract a where a.type = 1 and a.status = 1 and a.is_deleted = 0 and a.contract_id = " + sgContractId, new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
+                                    if (nodesAll.size() > 0) {
+                                        //判断是否有子级,赋值
+                                        Map<Long, List<WbsTreeContractLazyVO>> groupedByParentId = nodesAll.stream().collect(Collectors.groupingBy(WbsTreeContractLazyVO::getParentId));
+                                        for (WbsTreeContractLazyVO vo : nodesAll) {
+                                            if (vo.getParentId() == 0) {
+                                                vo.setHasChildren(1);
+                                            }
+                                            List<WbsTreeContractLazyVO> childNodes = groupedByParentId.getOrDefault(vo.getId(), null);
+                                            if (childNodes != null && childNodes.size() > 0) {
+                                                vo.setHasChildren(1);
+                                            } else {
+                                                vo.setHasChildren(0);
+                                            }
+                                        }
+                                        /*更新本地缓存*/
+                                        localCacheNodes.put(sgContractId, nodesAll);
+
+                                        JSONArray array = JSONArray.parseArray(JSON.toJSONString(nodesAll));
+                                        redisTemplate.opsForValue().set("blade-manager::contract:wbstree:" + sgContractId, JSON.toJSON(array).toString());
                                     }
                                 }
-
-                                /*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,contract_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));
@@ -934,7 +943,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                 ));
 
                                 //获取当前合同段所有填报资料缓存信息
-                                List<WbsTreeContractLazyQueryInfoVO> queryInfoList;
+                                List<WbsTreeContractLazyQueryInfoVO> queryInfoList = this.getQueryInfoList(sgContractId, tableOwner);
+                                /*List<WbsTreeContractLazyQueryInfoVO> queryInfoList;
                                 Object dataInformationQuery;
                                 if (ObjectUtil.isEmpty(tableOwner)) {
                                     dataInformationQuery = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:byInformationQuery:" + sgContractId + "_1");
@@ -945,7 +955,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                     queryInfoList = JSON.parseArray(dataInformationQuery.toString(), WbsTreeContractLazyQueryInfoVO.class);
                                 } else {
                                     if (ObjectUtil.isEmpty(tableOwner)) {
-                                        queryInfoList = jdbcTemplate.query("select wbs_id,status from u_information_query where type = 1 and contract_id = " + sgContractId, new BeanPropertyRowMapper<>(WbsTreeContractLazyQueryInfoVO.class));
+                                        queryInfoList = jdbcTemplate.query("select wbs_id,status from u_information_query where type = 1 and contract_id = " + sgContractId + " and classify = 1", new BeanPropertyRowMapper<>(WbsTreeContractLazyQueryInfoVO.class));
                                         if (queryInfoList.size() > 0) {
                                             JSONArray array = JSONArray.parseArray(JSON.toJSONString(queryInfoList));
                                             redisTemplate.opsForValue().set("blade-manager::contract:wbstree:byInformationQuery:" + sgContractId + "_1", JSON.toJSON(array).toString());
@@ -957,7 +967,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                             redisTemplate.opsForValue().set("blade-manager::contract:wbstree:byInformationQuery:" + sgContractId + "_" + tableOwner, JSON.toJSON(array).toString());
                                         }
                                     }
-                                }
+                                }*/
                                 Map<Long, Integer> queryInfoMaps = queryInfoList.stream().filter(f -> ObjectUtil.isNotEmpty(f.getWbsId()))
                                         .collect(Collectors.toMap(WbsTreeContractLazyQueryInfoVO::getWbsId, WbsTreeContractLazyQueryInfoVO::getStatus, (existingValue, newValue) -> existingValue));
                                 List<Long> pKeyIdList = new ArrayList<>(queryInfoMaps.keySet());
@@ -1048,8 +1058,63 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return null;
     }
 
+    //构建资料查询缓存的key
+    private String buildCacheKey(String contractId, String tableOwner) {
+        if (StringUtils.isNotEmpty(tableOwner)) {
+            return contractId + "_" + tableOwner;
+        } else {
+            return contractId + "_1";
+        }
+    }
+
+    //获取当前合同段所有填报资料缓存信息
+    public List<WbsTreeContractLazyQueryInfoVO> getQueryInfoList(String contractId, String tableOwner) {
+        //从本地缓存获取
+        String cacheKey = buildCacheKey(contractId, tableOwner);
+        List<WbsTreeContractLazyQueryInfoVO> cachedQueryInfoList = localCacheQueryInfos.get(cacheKey);
+
+        if (cachedQueryInfoList != null && !cachedQueryInfoList.isEmpty()) {
+            return cachedQueryInfoList;
+        }
+
+        //根据需要更新localCacheQueryInfos
+        Object dataInformationQuery;
+        if (ObjectUtil.isEmpty(tableOwner)) {
+            dataInformationQuery = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:byInformationQuery:" + contractId + "_1");
+        } else {
+            dataInformationQuery = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:byInformationQuery:" + contractId + "_" + tableOwner);
+        }
+        List<WbsTreeContractLazyQueryInfoVO> queryInfoList;
+        if (dataInformationQuery != null) {
+            //返回redis数据
+            queryInfoList = JSON.parseArray(dataInformationQuery.toString(), WbsTreeContractLazyQueryInfoVO.class);
+            localCacheQueryInfos.put(cacheKey, queryInfoList); //更新本地缓存
+
+        } else {
+            //返回数据库数据
+            String querySql = ObjectUtil.isEmpty(tableOwner) ?
+                    "select wbs_id,status from u_information_query where type = 1 and contract_id = " + contractId + " and classify =1" :
+                    "select wbs_id,status from u_information_query where type = 1 and contract_id = " + contractId + " and classify = " + tableOwner;
+
+            queryInfoList = jdbcTemplate.query(querySql, new BeanPropertyRowMapper<>(WbsTreeContractLazyQueryInfoVO.class));
+
+            if (!queryInfoList.isEmpty()) {
+                JSONArray array = JSONArray.parseArray(JSON.toJSONString(queryInfoList));
+                if (ObjectUtil.isEmpty(tableOwner)) {
+                    redisTemplate.opsForValue().set("blade-manager::contract:wbstree:byInformationQuery:" + contractId + "_1", JSON.toJSON(array).toString());
+                } else {
+                    redisTemplate.opsForValue().set("blade-manager::contract:wbstree:byInformationQuery:" + contractId + "_" + tableOwner, JSON.toJSON(array).toString());
+                }
+                localCacheQueryInfos.put(cacheKey, queryInfoList); //更新本地缓存
+            }
+        }
+
+        return queryInfoList;
+    }
+
     @Override
-    public List<WbsTreeContractLazyVO> imageLazyQueryContractWbsTree(String id, String contractId, String contractIdRelation, String classId) {
+    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) {
@@ -1298,7 +1363,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     }
 
     @Override
-    public List<AppWbsTreeContractVO> searchNodeAllTableAndFile(String primaryKeyId, String type, String contractId, String projectId) {
+    public List<AppWbsTreeContractVO> searchNodeAllTableAndFile(String primaryKeyId, String type, String
+            contractId, String projectId) {
         List<AppWbsTreeContractVO> vos = this.searchNodeAllTable(primaryKeyId, type, contractId, projectId);
         if (vos != null && vos.size() > 0) {
             List<Long> list = vos.stream().map(AppWbsTreeContractVO::getPKeyId).collect(Collectors.toList());
@@ -1383,7 +1449,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
      * @param initNode       初始化节点入参
      * @param contractId     合同段id
      */
-    private void getConcealedWorkParentNode(Set<WbsTreeContract> resultAllNodes, List<WbsTreeContract> initNode, String contractId) {
+    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));
@@ -1401,7 +1468,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
      * @param initNode       初始化节点入参
      * @param contractId     合同段id
      */
-    private void getConcealedWorkChildNode(Set<WbsTreeContract> resultAllNodes, List<WbsTreeContract> initNode, String contractId) {
+    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));
@@ -1439,43 +1507,31 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
      * @param lowestNodeParentIds 最底层节点ParentIds
      * @param nodesAll            所有节点
      */
-    /*public void recursiveGetParentNodes(List<WbsTreeContractLazyVO> result, List<Long> lowestNodeParentIds, List<WbsTreeContractLazyVO> nodesAll) {
+    public void recursiveGetParentNodes
+    (List<WbsTreeContractLazyVO> result, List<Long> lowestNodeParentIds, List<WbsTreeContractLazyVO> nodesAll) {
         if (lowestNodeParentIds.isEmpty()) {
             return;
         }
 
         //父级Id与出现的次数Map
-        Map<Long, Long> parentIdGroup = lowestNodeParentIds.stream()
-                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
-
-        List<String> keysWithValueOne = new ArrayList<>();
-        Map<Long, Long> keysWithValueSome = new HashMap<>();
-
-        for (Map.Entry<Long, Long> entry : parentIdGroup.entrySet()) {
-            if (entry.getValue() == 1L) {
-                keysWithValueOne.add(entry.getKey().toString());
-            } else {
-                keysWithValueSome.put(entry.getKey(), entry.getValue());
-            }
-        }
+        Map<Long, Long> parentIdGroup = lowestNodeParentIds.parallelStream()
+                .collect(Collectors.groupingByConcurrent(Function.identity(), Collectors.counting()));
 
         //批量查询单次节点
-        List<WbsTreeContractLazyVO> parentNodes = new ArrayList<>();
-        if (keysWithValueOne.size() > 0) {
-            parentNodes = nodesAll.stream().filter(f -> keysWithValueOne.contains(f.getId().toString())).collect(Collectors.toList());
-        }
+        List<WbsTreeContractLazyVO> parentNodes = parentIdGroup.entrySet().parallelStream()
+                .filter(entry -> entry.getValue() == 1L)
+                .flatMap(entry -> nodesAll.parallelStream()
+                        .filter(f -> entry.getKey().equals(f.getId())))
+                .collect(Collectors.toList());
 
         //批量查询多次节点
-        List<WbsTreeContractLazyVO> multipleParentNodes = new ArrayList<>();
-        for (Map.Entry<Long, Long> entry : keysWithValueSome.entrySet()) {
-            Long key = entry.getKey();
-            Long count = entry.getValue();
-
-            List<WbsTreeContractLazyVO> nodes = nodesAll.stream().filter(f -> key.equals(f.getId())).collect(Collectors.toList());
-            if (!nodes.isEmpty()) {
-                multipleParentNodes.addAll(Collections.nCopies(count.intValue(), nodes.get(0)));
-            }
-        }
+        List<WbsTreeContractLazyVO> multipleParentNodes = parentIdGroup.entrySet().parallelStream()
+                .filter(entry -> entry.getValue() > 1L)
+                .flatMap(entry -> nodesAll.parallelStream()
+                        .filter(f -> entry.getKey().equals(f.getId()))
+                        .limit(1)
+                        .flatMap(node -> Collections.nCopies(entry.getValue().intValue(), node).stream()))
+                .collect(Collectors.toList());
 
         //结果集
         List<Long> collect = Stream.concat(parentNodes.stream(), multipleParentNodes.stream())
@@ -1487,8 +1543,9 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             result.addAll(multipleParentNodes);
             this.recursiveGetParentNodes(result, collect, nodesAll);
         }
-    }*/
-    public void recursiveGetParentNodes(List<WbsTreeContractLazyVO> result, List<Long> lowestNodeParentIds, List<WbsTreeContractLazyVO> nodesAll) {
+    }
+
+    /*public void recursiveGetParentNodes(List<WbsTreeContractLazyVO> result, List<Long> lowestNodeParentIds, List<WbsTreeContractLazyVO> nodesAll) {
         if (lowestNodeParentIds.isEmpty()) {
             return;
         }
@@ -1538,7 +1595,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             result.addAll(multipleParentNodes);
             this.recursiveGetParentNodes(result, collect, nodesAll);
         }
-    }
+    }*/
 
     @Override
     public boolean syncTabData(String pKeyId) throws Exception {
@@ -2525,13 +2582,15 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
      * @param distinctNodesAll 去重后所有节点数据
      * @return
      */
-    public List<NodeVO> buildNodeTreeByStream(List<WbsTreeContractLazyVO> distinctNodesAll, Map<Long, WbsTreeContractLazyVO> lowestNodesMap) {
+    public List<NodeVO> buildNodeTreeByStream
+    (List<WbsTreeContractLazyVO> distinctNodesAll, Map<Long, WbsTreeContractLazyVO> lowestNodesMap) {
         List<WbsTreeContractLazyVO> list = distinctNodesAll.stream().filter(f -> f.getParentId().equals(0L)).collect(Collectors.toList());
         Map<Long, List<WbsTreeContractLazyVO>> map = distinctNodesAll.stream().collect(Collectors.groupingBy(WbsTreeContractLazyVO::getParentId));
         return recursionFnNodeTree(list, map, lowestNodesMap);
     }
 
-    public List<NodeVO> recursionFnNodeTree(List<WbsTreeContractLazyVO> list, Map<Long, List<WbsTreeContractLazyVO>> map, Map<Long, WbsTreeContractLazyVO> lowestNodesMap) {
+    public List<NodeVO> recursionFnNodeTree
+            (List<WbsTreeContractLazyVO> list, Map<Long, List<WbsTreeContractLazyVO>> map, Map<Long, WbsTreeContractLazyVO> lowestNodesMap) {
         List<NodeVO> result = new ArrayList<>();
         for (WbsTreeContractLazyVO vo : list) {
             if (vo.getHasChildren().equals(0)) {
@@ -2675,5 +2734,20 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return list;
     }
 
+    /*删除合同段本地缓存*/
+    public void deleteContractLocalCache(String contractId) {
+        /*删除节点缓存*/
+        localCacheNodes.remove(contractId);
+
+        /*删除资料缓存*/
+        Iterator<Map.Entry<String, List<WbsTreeContractLazyQueryInfoVO>>> iterator = localCacheQueryInfos.entrySet().iterator();
+        while (iterator.hasNext()) {
+            Map.Entry<String, List<WbsTreeContractLazyQueryInfoVO>> entry = iterator.next();
+            String cacheKey = entry.getKey();
+            if (cacheKey.startsWith(contractId + "_")) {
+                iterator.remove();
+            }
+        }
+    }
 
 }

+ 3 - 3
blade-service/blade-manager/src/main/resources/application-dev.yml

@@ -19,6 +19,6 @@ oss:
   bucket-name: bladex-test-info
 
 #Mybatis-plus配置
-mybatis-plus:
-  configuration:
-    cache-enabled: true #开启mybatis的二级缓存
+#mybatis-plus:
+#  configuration:
+#    cache-enabled: true