Explorar o código

Merge branch 'master' of http://121.41.40.202:3000/zhuwei/bladex

huangtf hai 1 ano
pai
achega
5ddca25bf1
Modificáronse 31 ficheiros con 758 adicións e 268 borrados
  1. 67 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExpertConclusion.java
  2. 75 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExpertScore.java
  3. 1 1
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/feign/ArchiveAutoClient.java
  4. 18 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/feign/ArchiveExpertConclusionClient.java
  5. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InspectTreeVO.java
  6. 16 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TwoTreeVO.java
  7. 7 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractLazyVO.java
  8. 17 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  9. 3 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveAutoClientImpl.java
  10. 22 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveExpertConclusionClientImpl.java
  11. 18 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExpertConclusionMapper.java
  12. 6 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExpertConclusionMapper.xml
  13. 21 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExpertScoreMapper.java
  14. 6 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExpertScoreMapper.xml
  15. 4 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java
  16. 35 6
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  17. 15 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExpertConclusionService.java
  18. 15 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExpertScoreService.java
  19. 2 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  20. 38 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertConclusionServiceImpl.java
  21. 32 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertScoreServiceImpl.java
  22. 35 15
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  23. 33 18
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  24. 3 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java
  25. 4 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  26. 14 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  27. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java
  28. 52 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  29. 1 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MeterTreeContractServiceImpl.java
  30. 92 76
      blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml
  31. 103 133
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

+ 67 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExpertConclusion.java

@@ -0,0 +1,67 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.archive.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;
+
+import java.math.BigDecimal;
+
+/**
+ * 档案专家结论实体类
+ *
+ * @author BladeX
+ * @since 2023-02-17
+ */
+@Data
+@TableName("u_archive_expert_conclusion")
+@EqualsAndHashCode(callSuper = true)
+public class ArchiveExpertConclusion extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("项目id")
+    private Long projectId;
+
+    @ApiModelProperty("申请验收的pdf地址")
+    private String app_url;
+
+    @ApiModelProperty("结论报表的pdf地址")
+    private String table_url;
+
+    @ApiModelProperty("是否生成打分表:0否1是")
+    private Integer is_build_score;
+
+    @ApiModelProperty("前言")
+    private String foreword;
+
+    @ApiModelProperty("项目概况")
+    private String general_situation;
+
+    @ApiModelProperty("管理情况")
+    private String admin_condition;
+
+    @ApiModelProperty("存在问题及建议")
+    private String question_suggest;
+
+    @ApiModelProperty("审批状态,0未上报,1待审批,2已审批,3已废除")
+    private Integer approve_status;
+
+}

+ 75 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExpertScore.java

@@ -0,0 +1,75 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.archive.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 档案专家评分实体类
+ *
+ * @author BladeX
+ * @since 2023-02-17
+ */
+@Data
+@TableName("u_archive_expert_score")
+@EqualsAndHashCode(callSuper = true)
+public class ArchiveExpertScore extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("项目id")
+    private Long projectId;
+
+    @ApiModelProperty("单位类型:1施工2监理3业主")
+    private Integer unitType;
+
+    @ApiModelProperty("评分项")
+    private String scoreItem;
+
+    @ApiModelProperty("完整性")
+    private Integer integrality;
+
+    @ApiModelProperty("完整性扣分")
+    private Integer integralityDeduction;
+
+    @ApiModelProperty("规范性")
+    private Integer normative;
+
+    @ApiModelProperty("规范性扣分")
+    private Integer normativeDeduction;
+
+    public ArchiveExpertScore() {
+    }
+
+    public ArchiveExpertScore(Long projectId, Integer unitType, String scoreItem, Integer integrality, Integer integralityDeduction, Integer normative, Integer normativeDeduction) {
+        this.projectId = projectId;
+        this.unitType = unitType;
+        this.scoreItem = scoreItem;
+        this.integrality = integrality;
+        this.integralityDeduction = integralityDeduction;
+        this.normative = normative;
+        this.normativeDeduction = normativeDeduction;
+    }
+}

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

@@ -36,7 +36,7 @@ public interface ArchiveAutoClient {
      * 批量修改档案申请验收状态
      */
     @PostMapping(API_PREFIX + "/batchUpdateIsApply")
-    R<Boolean> batchUpdateIsApply(@RequestParam Integer isApply,@RequestParam List<Long> ids);
+    R<Boolean> batchUpdateIsApply(@RequestBody List<Long> ids);
 
     /**
      * 批量修改档案专家,参数为节点集合

+ 18 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/feign/ArchiveExpertConclusionClient.java

@@ -0,0 +1,18 @@
+package org.springblade.archive.feign;
+
+import org.springblade.common.constant.ArchiveConstant;
+import org.springblade.core.tool.api.R;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.Map;
+
+@FeignClient(value = ArchiveConstant.APPLICATION_WEATHER_NAME)
+public interface ArchiveExpertConclusionClient {
+    String API_PREFIX = "/api/archive/archiveExpertConclusion";
+
+    @GetMapping(API_PREFIX + "/saveBaseTableInfo")
+    R saveBaseTableInfo(@RequestParam Long projectId, @RequestParam String appUrl);
+}

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

@@ -63,5 +63,7 @@ public class InspectTreeVO implements INode<InspectTreeVO> {
     @ApiModelProperty(value = "false没有子节点,true有子节点")
     private Boolean isChildren;
 
+    @ApiModelProperty(value = "false没有子节点,true有子节点")
+    private Integer total;
 
 }

+ 16 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TwoTreeVO.java

@@ -0,0 +1,16 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Param   档案抽检分配,返回两棵树
+ * @Author wangwl
+ * @Date 2024/1/5 17:27
+ **/
+@Data
+public class TwoTreeVO {
+    List<InspectTreeVO> list;
+    List<Long> ids;
+}

+ 7 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractLazyVO.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -80,4 +81,10 @@ public class WbsTreeContractLazyVO implements Serializable {
     @ApiModelProperty(value = "子级集合(在构造树形结构时使用)")
     private List<WbsTreeContractLazyVO> children;
 
+    private Integer sort;
+
+    private String fullName;
+
+    private Date createTime;
+
 }

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

@@ -854,7 +854,7 @@ public class ArchivesAutoController extends BladeController {
 	})
 	public R saveInspect(@RequestBody ExpertInspection inspection) {
 		archivesAutoService.saveInspect(inspection);
-		return R.data("保存成功");
+		return R.data("操作成功");
 	}
 
 	/**
@@ -873,6 +873,22 @@ public class ArchivesAutoController extends BladeController {
 		return R.data(page);
 	}
 
+	/**
+	 * 在线验收-专家抽检记录汇总
+	 */
+	@GetMapping("/getUserInspectInfo2")
+	@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>> getUserInspectInfo2(Query query,@RequestParam Long projectId) {
+		IPage<ExpertInspectionVO> page = archivesAutoService.getUserInspectInfo2(query, projectId);
+		return R.data(page);
+	}
+
 
 
 	/**

+ 3 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveAutoClientImpl.java

@@ -9,6 +9,7 @@ import org.springblade.archive.service.IArchiveProjectConfigService;
 import org.springblade.archive.service.IArchivesAutoService;
 import org.springblade.archive.vo.ArchivesAutoVO;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
@@ -44,8 +45,8 @@ public class ArchiveAutoClientImpl implements ArchiveAutoClient {
     }
 
     @Override
-    public R<Boolean> batchUpdateIsApply(Integer isApply, List<Long> ids) {
-        return archivesAutoService.batchUpdateIsApply(isApply,ids);
+    public R<Boolean> batchUpdateIsApply(List<Long> ids) {
+        return archivesAutoService.batchUpdateIsApply(1,ids);
     }
 
     @Override

+ 22 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveExpertConclusionClientImpl.java

@@ -0,0 +1,22 @@
+package org.springblade.archive.feign;
+
+import lombok.AllArgsConstructor;
+import org.springblade.archive.service.IArchiveExpertConclusionService;
+import org.springblade.archive.service.IArchiveInspectionService;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+@RestController
+@AllArgsConstructor
+public class ArchiveExpertConclusionClientImpl implements ArchiveExpertConclusionClient {
+
+    private final IArchiveExpertConclusionService conclusionService;
+
+
+    @Override
+    public R saveBaseTableInfo(Long projectId, String appUrl) {
+        return conclusionService.saveBaseTableInfo(projectId,appUrl);
+    }
+}

+ 18 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExpertConclusionMapper.java

@@ -0,0 +1,18 @@
+package org.springblade.archive.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.archive.entity.ArchiveExpertConclusion;
+import org.springblade.archive.entity.ArchiveExpertScore;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @since 2023-04-09
+ */
+public interface ArchiveExpertConclusionMapper extends BaseMapper<ArchiveExpertConclusion> {
+
+
+}

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

@@ -0,0 +1,6 @@
+<?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.ArchiveExpertConclusionMapper">
+
+
+</mapper>

+ 21 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExpertScoreMapper.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.ArchiveExpertScore;
+import org.springblade.archive.entity.ExpertInspection;
+
+import java.util.List;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @since 2023-04-09
+ */
+public interface ArchiveExpertScoreMapper extends BaseMapper<ArchiveExpertScore> {
+
+
+}

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

@@ -0,0 +1,6 @@
+<?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.ArchiveExpertScoreMapper">
+
+
+</mapper>

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

@@ -173,8 +173,12 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
 	//用于档案巡检查询单位下档案
 	List<ArchivesAutoVO2> getUnitAllArchive2(@Param("firstNode") Long firstNode,@Param("grade") Integer grade,@Param("isApply") Integer isApply);
 
+	//查询所有的,树不加id,档案状态加
 	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);
 
+	//查询专家的,树加id,档案状态加
+	IPage<ArchiveInspectVO> getNodeArchives2(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);

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

@@ -1003,11 +1003,35 @@
     </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
+               if((select count(1) from u_archive_expert_inspection aei where aei.is_deleted =0 and aei.archive_id = uaa.id
+                   and aei.expert_id = #{userId}) > 0,'已抽检','未抽检') as inspectStatusName,
+               (CASE when (select count(1) from u_archive_expert_inspection aei where aei.is_deleted =0 and aei.archive_id = uaa.id
+                    and aei.expert_id = #{userId} and is_pass = 1) = 1 then '合格'
+                   when (select count(1) from u_archive_expert_inspection aei where aei.is_deleted =0 and aei.archive_id = uaa.id
+                    and aei.expert_id = #{userId} and is_pass = 0) > 0 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="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="getNodeArchives2" resultType="org.springblade.archive.vo.ArchiveInspectVO">
+        select uaa.id ,uaa.file_number,uaa.name ,uaa.unit,
+        if((select count(1) from u_archive_expert_inspection aei where aei.is_deleted =0 and aei.archive_id = uaa.id
+            and aei.expert_id = #{userId}) > 0,'已抽检','未抽检') as inspectStatusName,
+        (CASE when (select count(1) from u_archive_expert_inspection aei where aei.is_deleted =0 and aei.archive_id = uaa.id
+            and aei.expert_id = #{userId} and is_pass = 1) = 1 then '合格'
+            when (select count(1) from u_archive_expert_inspection aei where aei.is_deleted =0 and aei.archive_id = uaa.id
+            and aei.expert_id = #{userId} and is_pass = 0) > 0 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>
@@ -1032,15 +1056,20 @@
         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 COUNT(1)
+        from (SELECT DISTINCT (archive_id)
+              from u_archive_expert_inspection
+              WHERE project_id = #{projectId}
+                and is_deleted = 0
+                and expert_id = #{userId}
+             ) a
     </select>
     <select id="getUserInspectInfo" resultType="org.springblade.archive.vo.ExpertInspectionVO">
-        select aei.id,aei.archive_name ,aei.opinion , aei.archive_id,expert_name,file_id,
+        select aei.id,aei.archive_name ,aei.opinion , aei.archive_id,expert_name,file_id,aei.is_pass,
                (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
+        WHERE project_id = #{projectId} and is_deleted = 0 and is_pass = 0
         <if test="userId != null">
             and expert_id = #{userId}
         </if>

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

@@ -0,0 +1,15 @@
+package org.springblade.archive.service;
+
+import org.springblade.archive.entity.ArchiveExpertConclusion;
+import org.springblade.archive.entity.ArchiveExpertScore;
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.core.tool.api.R;
+
+
+public interface IArchiveExpertConclusionService extends BaseService<ArchiveExpertConclusion> {
+
+
+    //验收申请审批通过,创建当前报表基本信息
+    R saveBaseTableInfo(Long projectId,String appUrl);
+
+}

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

@@ -0,0 +1,15 @@
+package org.springblade.archive.service;
+
+import org.springblade.archive.entity.ArchiveExpertScore;
+import org.springblade.archive.entity.ExpertInspection;
+import org.springblade.core.mp.base.BaseService;
+
+import java.util.List;
+
+
+public interface IArchiveExpertScoreService extends BaseService<ArchiveExpertScore> {
+
+    // 审批成功,保存基础评分信息
+    void saveBaseScoreInfo(Long projectId);
+
+}

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

@@ -134,6 +134,8 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 
 	IPage<ExpertInspectionVO> getUserInspectInfo(Query query, Long projectId);
 
+	IPage<ExpertInspectionVO> getUserInspectInfo2(Query query, Long projectId);
+
     ProjectInspectStatVO projectInspectStat(Long projectId);
 
 	ExpertInspectionVO getArchiveFileOpinion(Long fileId, Long projectId);

+ 38 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertConclusionServiceImpl.java

@@ -0,0 +1,38 @@
+package org.springblade.archive.service.impl;
+
+
+import lombok.AllArgsConstructor;
+import org.springblade.archive.entity.ArchiveExpertConclusion;
+import org.springblade.archive.entity.ArchiveExpertScore;
+import org.springblade.archive.mapper.ArchiveExpertConclusionMapper;
+import org.springblade.archive.mapper.ArchiveExpertScoreMapper;
+import org.springblade.archive.service.IArchiveExpertConclusionService;
+import org.springblade.archive.service.IArchiveExpertScoreService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.tool.api.R;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@AllArgsConstructor
+public class ArchiveExpertConclusionServiceImpl extends BaseServiceImpl<ArchiveExpertConclusionMapper, ArchiveExpertConclusion> implements IArchiveExpertConclusionService {
+
+    private final IArchiveExpertScoreService scoreService;
+
+    @Override
+    @Transactional
+    public R saveBaseTableInfo(Long projectId, String appUrl) {
+        //保存表单基础信息
+        ArchiveExpertConclusion conclusion = new ArchiveExpertConclusion();
+        conclusion.setProjectId(projectId);
+        conclusion.setApp_url(appUrl);
+        conclusion.setIs_build_score(0);
+        conclusion.setStatus(1);
+        conclusion.setApprove_status(0);
+        this.save(conclusion);
+        //保存评分基础信息
+        scoreService.saveBaseScoreInfo(projectId);
+        return R.data("保存成功");
+    }
+}
+

+ 32 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertScoreServiceImpl.java

@@ -0,0 +1,32 @@
+package org.springblade.archive.service.impl;
+
+
+import org.springblade.archive.entity.ArchiveExpertScore;
+import org.springblade.archive.entity.ExpertInspection;
+import org.springblade.archive.mapper.ArchiveExpertScoreMapper;
+import org.springblade.archive.mapper.ExpertInspectionMapper;
+import org.springblade.archive.service.IArchiveExpertScoreService;
+import org.springblade.archive.service.IExpertInspectionService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class ArchiveExpertScoreServiceImpl extends BaseServiceImpl<ArchiveExpertScoreMapper, ArchiveExpertScore> implements IArchiveExpertScoreService {
+
+
+    @Override
+    public void saveBaseScoreInfo(Long projectId) {
+        List<ArchiveExpertScore> list = new ArrayList<>();
+        //施工
+        list.add(new ArchiveExpertScore(projectId,1,"施工评分项1",10,0,10,0));
+        //监理
+        list.add(new ArchiveExpertScore(projectId,1,"监理评分项1",10,0,10,0));
+        //业主
+        list.add(new ArchiveExpertScore(projectId,1,"监理评分项1",10,0,10,0));
+        this.saveBatch(list);
+    }
+}
+

+ 35 - 15
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -2640,10 +2640,10 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		}else {
 			unitAllArchive = baseMapper.getUnitAllArchive2(FirstNode.getId(),4,isApply);
 		}
+		vo.setUnitInfo(unitName+"("+unitAllArchive.size()+"卷)");
 		if (unitAllArchive.size() == 0){
-			return null;
+			return vo;
 		}
-		vo.setUnitInfo(unitName+"("+unitAllArchive.size()+"卷)");
 		List<ArchiveInspectPreviewVO.NodeList> nodeLists = new ArrayList<>();
 		//档案按照二级节点分组
 		Map<Long, List<ArchivesAutoVO2>> archiveMap = unitAllArchive.stream().collect(Collectors.groupingBy(ArchivesAutoVO2::getMasterNode));
@@ -2667,6 +2667,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		return vo;
 	}
 
+
+
 	@Override
 	public void batchDownloadFileToZip(String ids, HttpServletResponse response) {
 		List<Long> longs = Func.toLongList(ids);
@@ -2951,9 +2953,11 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	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 {
+			//查询所有的,树不加id,档案状态加
 			return baseMapper.getNodeArchives(page,nodeId,projectId,searchType,searchValue,AuthUtil.getUserId());
+		}else {
+			//查询专家的,树加id,档案状态加
+			return baseMapper.getNodeArchives2(page,nodeId,projectId,searchType,searchValue,AuthUtil.getUserId());
 		}
 	}
 
@@ -2972,6 +2976,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		map.put("total",t1+"");
 		//获取用户归属档案所有已阅总数
 		Integer t2 = baseMapper.getUserReviewedTotal(projectId, userId);
+		if (t2 == null){
+			t2 = 0;
+		}
 		if (t2 > t1){
 			throw new ServiceException("数据错误,已阅比总数多");
 		}
@@ -3055,42 +3062,45 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			ContractInfo contract = contractClient.getContractById(archive.getContractId());
 			unitType = contract.getContractType();
 		}
-		//判断是否存在意见
+		//判断是否合格
 		Integer isPass = 1;
 		if (StringUtils.isNotBlank(inspection.getOpinion())){
+			//专家有填写意见,不合格
 			isPass = 0;
 		}
+		inspection.setProjectId(archive.getProjectId());
 		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>()
+			//判断当前档案是否存在合格意见,存在则直接跳过,不存在就重新保存
+			ExpertInspection one = inspectionService.getOne(new LambdaQueryWrapper<ExpertInspection>()
 					.eq(ExpertInspection::getExpertId, userId)
 					.eq(ExpertInspection::getArchiveId, archive.getId())
 					.eq(ExpertInspection::getIsPass, 1));
-			if (count3 == 0){
+			if (one == null) {
 				//先删除当前专家对当前案卷当前文件的意见
 				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>()
+				//判断当前档案是否存在其他意见,有则直接跳过
+				long count3 = inspectionService.count(new LambdaQueryWrapper<ExpertInspection>()
 						.eq(ExpertInspection::getExpertId, userId)
 						.eq(ExpertInspection::getArchiveId, archive.getId())
 						.eq(ExpertInspection::getIsPass, 0));
-				//没有就直接保存合格
-				if (count2 == 0) {
+				if (count3 == 0) {
+					//没有就直接保存合格
 					inspection.setFileId(null);
+					inspection.setId(null);
 					inspectionService.save(inspection);
 				}
 			}
 		}else {
-			//如果专家对案卷有意见,先删除当前专家在意见表对当前档案合格的意见
+			//专家对案卷有意见,先删除当前专家在意见表对当前档案合格的意见
 			inspectionService.remove(new LambdaQueryWrapper<ExpertInspection>()
 					.eq(ExpertInspection::getExpertId, userId)
 					.eq(ExpertInspection::getArchiveId, inspection.getArchiveId())
@@ -3129,10 +3139,20 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	 */
 	@Override
 	public IPage<ExpertInspectionVO> getUserInspectInfo(Query query, Long projectId) {
+		Long userId = AuthUtil.getUserId();
+		IPage<ExpertInspectionVO> page = new Page<>(query.getCurrent(),query.getSize());
+		return baseMapper.getUserInspectInfo(page,projectId,userId);
+	}
+
+	/**
+	 * 在线验收-抽检记录-汇总
+	 */
+	@Override
+	public IPage<ExpertInspectionVO> getUserInspectInfo2(Query query, Long projectId) {
 		Long userId = AuthUtil.getUserId();
 		//判断当前用户职位是否为专家组长,专家组长查看所有
 		String userRole = AuthUtil.getUserRole();
-		if ("1656191696348082177".equals(userRole)){
+		if ("专家组长".equals(userRole)){
 			userId = null;
 		}
 		IPage<ExpertInspectionVO> page = new Page<>(query.getCurrent(),query.getSize());

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

@@ -19,6 +19,7 @@ import org.apache.commons.lang.time.DateUtils;
 import org.jetbrains.annotations.NotNull;
 import org.springblade.archive.dto.SaveApplyDTO;
 import org.springblade.archive.feign.ArchiveAutoClient;
+import org.springblade.archive.feign.ArchiveExpertConclusionClient;
 import org.springblade.business.dto.*;
 import org.springblade.business.entity.*;
 import org.springblade.business.service.*;
@@ -64,6 +65,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletRequest;
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.io.InputStream;
 import java.text.SimpleDateFormat;
 import java.time.Duration;
 import java.util.*;
@@ -93,6 +95,7 @@ public class TaskController extends BladeController {
     private final ArchiveFileTaskClient archiveFileTaskClient;
     private final IUserClient userClient;
     private final ArchiveAutoClient archiveClient;
+    private final ArchiveExpertConclusionClient conclusionClient;
 
     /**
      * 记录短信验证码超时时间
@@ -631,7 +634,7 @@ public class TaskController extends BladeController {
             for (TaskArchiveDTO taskArchiveDTO : taskArchiveOuterLayerDTO.getTaskArchiveDtoList()) {
                 if (StringUtils.isNotEmpty(taskArchiveDTO.getTaskId())) {
                     //通过checkArchiveTaskUserByCurrent检查,说明当前登陆用户是该条任务的审批人,修改审批任务状态
-                    Task task = jdbcTemplate.queryForObject("select id,contract_id,project_id,process_instance_id,form_data_id,type,archive_ids from u_task where id = " + taskArchiveDTO.getTaskId(), new BeanPropertyRowMapper<>(Task.class));
+                    Task task = jdbcTemplate.queryForObject("select id,contract_id,project_id,process_instance_id,form_data_id,type,archive_ids,attachment_pdf_url from u_task where id = " + taskArchiveDTO.getTaskId(), new BeanPropertyRowMapper<>(Task.class));
                     if (task != null) {
                         //判断任务类型是否是验收任务,档案验收任务单独处理修改状态直接返回
                         if (task.getType() == 2) {
@@ -696,12 +699,17 @@ public class TaskController extends BladeController {
                                 //修改档案类型
                                 String archiveIds = task.getArchiveIds();
                                 if (StringUtils.isNotBlank(archiveIds)) {
-                                    List<Long> longs = Func.toLongList(archiveIds);
-                                    R<Boolean> booleanR = archiveClient.batchUpdateIsApply(1, longs);
+                                    List<Long> ids = Func.toLongList(archiveIds);
+                                    R<Boolean> booleanR = archiveClient.batchUpdateIsApply(ids);
                                     if (booleanR.getData() == null || !booleanR.isSuccess()) {
                                         throw new ServiceException("修改档案类型失败");
                                     }
                                 }
+                                //创建报表基本信息,报表中会自动创建评分基础信息
+                                R r = conclusionClient.saveBaseTableInfo(Long.parseLong(task.getProjectId()), task.getAttachmentPdfUrl());
+                                if (r == null || !"保存成功".equals(r.getData())){
+                                    throw new ServiceException("保存报表基本信息失败");
+                                }
                             }
                             return R.data(true);
                         }
@@ -781,22 +789,29 @@ public class TaskController extends BladeController {
     @PostMapping("/getArchiveFileTaskPdfs")
     @ApiOperationSupport(order = 8)
     @ApiOperation(value = "批量审批-获取档案审批任务对应业务数据的pdf信息", notes = "传入任务id,封装成taskIds,字符串逗号分割拼接")
-    public R<List<ArchiveFileTaskPDFVO>> getArchiveFileTaskPdfs(@RequestParam String taskIds) {
-        if (StringUtils.isNotEmpty(taskIds)) {
-            List<Task> taskList = jdbcTemplate.query("select form_data_id from u_task where approval_type = 4 and id in(" + taskIds + ")", new BeanPropertyRowMapper<>(Task.class));
-            Set<String> formDataIds = taskList.stream().map(Task::getFormDataId).collect(Collectors.toSet());
-            if (formDataIds.size() > 0) {
-                List<ArchiveFile> archiveFiles = jdbcTemplate.query("select id,file_name,pdf_file_url,e_visa_file from u_archive_file where id in(" + StringUtils.join(formDataIds, ",") + ")", new BeanPropertyRowMapper<>(ArchiveFile.class));
-                List<ArchiveFileTaskPDFVO> collect = archiveFiles.stream()
-                        .map(obj -> {
-                            ArchiveFileTaskPDFVO vo = new ArchiveFileTaskPDFVO();
-                            vo.setId(obj.getId());
-                            vo.setPdfUrl(ObjectUtil.isNotEmpty(obj.getEVisaFile()) ? obj.getEVisaFile() : obj.getPdfFileUrl());
-                            vo.setFileName(obj.getFileName());
-                            return vo;
-                        }).collect(Collectors.toList());
-                return R.data(collect);
+    public R<List<ArchiveFileTaskPDFVO>> getArchiveFileTaskPdfs(@RequestParam String taskIds,@RequestParam Integer type) {
+        //普通任务
+        if (type == 1) {
+            if (StringUtils.isNotEmpty(taskIds)) {
+                List<Task> taskList = jdbcTemplate.query("select form_data_id from u_task where approval_type = 4 and id in(" + taskIds + ")", new BeanPropertyRowMapper<>(Task.class));
+                Set<String> formDataIds = taskList.stream().map(Task::getFormDataId).collect(Collectors.toSet());
+                if (formDataIds.size() > 0) {
+                    List<ArchiveFile> archiveFiles = jdbcTemplate.query("select id,file_name,pdf_file_url,e_visa_file from u_archive_file where id in(" + StringUtils.join(formDataIds, ",") + ")", new BeanPropertyRowMapper<>(ArchiveFile.class));
+                    List<ArchiveFileTaskPDFVO> collect = archiveFiles.stream()
+                            .map(obj -> {
+                                ArchiveFileTaskPDFVO vo = new ArchiveFileTaskPDFVO();
+                                vo.setId(obj.getId());
+                                vo.setPdfUrl(ObjectUtil.isNotEmpty(obj.getEVisaFile()) ? obj.getEVisaFile() : obj.getPdfFileUrl());
+                                vo.setFileName(obj.getFileName());
+                                return vo;
+                            }).collect(Collectors.toList());
+                    return R.data(collect);
+                }
             }
+        }else if (type == 2){
+            //验收任务
+            List<ArchiveFileTaskPDFVO> vos = jdbcTemplate.query("select id,task_name as fileName,attachment_pdf_url as pdfUrl from u_task where approval_type = 4 and id in(" + taskIds + ")", new BeanPropertyRowMapper<>(ArchiveFileTaskPDFVO.class));
+            return R.data(vos);
         }
         return R.data(null);
     }

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

@@ -459,9 +459,9 @@ public class ArchiveTreeContractController extends BladeController {
             @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);
+    public R<TwoTreeVO> getUnitAllNode(@RequestParam Long projectId, @RequestParam String types) {
+        TwoTreeVO vo = archiveTreeContractService.getUnitAllNode(projectId,types);
+        return R.data(vo);
     }
 
     /**

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

@@ -325,7 +325,10 @@ public class WbsTreePrivateController extends BladeController {
             Set<String> ids = rs.stream().map(WbsNodeTableVO::getId).collect(Collectors.toSet());
             Map<Long, Long> initTableIdMaps = wbsTreeService.getBaseMapper().selectList(Wrappers.<WbsTree>lambdaQuery()
                     .select(WbsTree::getInitTableId, WbsTree::getId)
-                    .in(WbsTree::getId, ids)).stream().collect(Collectors.toMap(WbsTree::getId, WbsTree::getInitTableId));
+                    .in(WbsTree::getId, ids))
+                    .stream()
+                    .filter(wbsTree -> wbsTree.getId() != null && wbsTree.getInitTableId() != null)
+                    .collect(Collectors.toMap(WbsTree::getId, WbsTree::getInitTableId));
 
             /*元素FidSet,统计数量*/
             Set<Long> formElementFids = new HashSet<>();

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

@@ -540,7 +540,11 @@
             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
+            and (id = atc.id or FIND_IN_SET(atc.id,ancestors)))), '卷)')) as 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 total
+
             from m_archive_tree_contract atc
             WHERE is_deleted =0 and project_id = #{projectId}
             and (id = #{ownerUnit} or FIND_IN_SET(#{ownerUnit},ancestors))
@@ -554,7 +558,9 @@
             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
+            and (id = atc.id or FIND_IN_SET(atc.id,ancestors)))), '卷)')) as 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 total
             from m_archive_tree_contract atc
             WHERE is_deleted =0 and project_id = #{projectId}
             and  (id = #{supervisorUnit} or FIND_IN_SET(#{supervisorUnit},ancestors))
@@ -568,7 +574,9 @@
             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
+            and (id = atc.id or FIND_IN_SET(atc.id,ancestors)))), '卷)')) as 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 total
             from m_archive_tree_contract atc
             WHERE is_deleted =0 and project_id = #{projectId}
             and  (id = #{buildUnit} or FIND_IN_SET(#{buildUnit},ancestors))
@@ -581,7 +589,9 @@
                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
+                and (id = atc.id or FIND_IN_SET(atc.id,ancestors)))), ')')) as 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 total
         from m_archive_tree_contract atc
         WHERE atc.parent_id = 0 and atc.is_deleted = 0 and project_id =#{projectId}
     </select>

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

@@ -125,7 +125,7 @@ public interface IArchiveTreeContractService extends BaseService<ArchiveTreeCont
 
     public void updateWbsRuleNodes(Long projectId);
 
-    List<InspectTreeVO> getUnitAllNode(Long project, String types);
+   TwoTreeVO getUnitAllNode(Long project, String types);
 
     void saveAllSelectNodes(Map<String, String> map);
 

+ 52 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -1353,7 +1353,8 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 	 * @return
 	 */
 	@Override
-	public List<InspectTreeVO> 	getUnitAllNode(Long projectId,String types) {
+	public TwoTreeVO getUnitAllNode(Long projectId,String types) {
+		TwoTreeVO twoTreeVO = new TwoTreeVO();
 		/**
 		 *  1业主2监理3施工4影像5竣工图,根据勾选的类型,返回单位首节点集合,勾选哪个单位回显哪个
 		 *   如果勾选了施工,又勾选了影像和竣工图,则只返回施工,
@@ -1385,9 +1386,52 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		List<InspectTreeVO> unitAllNode = baseMapper.getUnitAllNode(projectId,ownerUnit,supervisorUnit,buildUnit);
 		unitAllNode.add(firstNode);
 		List<InspectTreeVO> list = org.springblade.manager.utils.ForestNodeMerger.merge(unitAllNode);
+		twoTreeVO.setList(list);
+		List<InspectTreeVO> list2 = new ArrayList<>();
+		gatherSortNode(list,list2);
+		//查看当前档案是否分配过其他专家
+		if (list.size() > 1){
+			throw new ServiceException("节点信息错误");
+		}
+		//判断是否被分配
+		Boolean isAllot = false;
+		List<InspectTreeVO> vos = list.get(0).getChildren();
+		for (InspectTreeVO vo : vos) {
+			if (org.apache.commons.lang3.StringUtils.isNotBlank(vo.getNodeInfo())){
+				isAllot = true;
+				break;
+			}
+		}
 		List<Long> ids = new ArrayList<>();
-		gatherSortNode(list,ids);
-		return org.springblade.manager.utils.ForestNodeMerger.merge(unitAllNode);
+		if (isAllot){
+			//分配过其他专家,过滤出没有绑定专家的案卷
+			List<InspectTreeVO> list3 = list2.stream().filter(l-> org.apache.commons.lang3.StringUtils.isBlank(l.getNodeInfo())).collect(Collectors.toList());
+			if (list3.size() != 0){
+				//把剩下未分配的档案全部分配给当前专家
+				ids = list3.stream().map(InspectTreeVO::getId).collect(Collectors.toList());
+			}else {
+				//没有可分配的档案,直接为当前专家分配所有案卷
+				ids = list2.stream().map(InspectTreeVO::getId).collect(Collectors.toList());
+			}
+		}else {
+			//没有分配过
+			int reduce = firstNode.getTotal();
+			if (reduce == 0){
+				throw new ServiceException("当前没有案卷申请验收,无法分配");
+			}
+			int t = 0;
+			reduce = (int)(reduce * 0.7);
+			for (InspectTreeVO vo : list2) {
+				ids.add(vo.getId());
+				t += vo.getTotal();
+				if (t > reduce){
+					break;
+				}
+			}
+
+		}
+		twoTreeVO.setIds(ids);
+		return twoTreeVO;
 	}
 
 	@Override
@@ -1432,13 +1476,15 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 	}
 
 	//递归方法
-	private void gatherSortNode(List<InspectTreeVO>list, List<Long> ids){
+	private void gatherSortNode(List<InspectTreeVO>list, List<InspectTreeVO> list2){
 		for (InspectTreeVO vo : list) {
 			if (vo.getChildren().size() == 0){
-				ids.add(vo.getId());
+				if (vo.getTotal() > 0) {
+					list2.add(vo);
+				}
 				continue;
 			}else {
-				gatherSortNode(vo.getChildren(), ids);
+				gatherSortNode(vo.getChildren(), list2);
 			}
 		}
 	}

+ 1 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MeterTreeContractServiceImpl.java

@@ -578,7 +578,7 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
         } else {
             /*非根节点导入,获取当前节点*/
             if (ObjectUtil.isEmpty(meterTreeContract.getNodeCode())) {
-                throw new ServiceException("当前选择导入的节点编号为空,操作失败");
+                throw new ServiceException("当前选择导入的工程编号为空,操作失败");
             }
             rootNodesImport.add(meterTreeContract);
         }

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

@@ -129,82 +129,98 @@
     </select>
 
     <select id="selectInformationQueryPageTwo" resultType="org.springblade.business.entity.InformationQuery">
-        select
-        query.pdf_trial_url,
-        query.pdf_trial_url_position,
-        query.wbs_id,
-        query.id,
-        query.name,
-        query.number,
-        query.create_time,
-        query.status,
-        query.report_number,
-        query.file_user_id_and_name,
-        query.pdf_url,
-        query.e_visa_pdf_url,
-        query.task_id,
-        query.sj_record_ids
-        from
-        (
-        select
-        iq.pdf_trial_url_position,
-        iq.pdf_trial_url,
-        iq.sort,
-        iq.id,
-        iq.name,
-        iq.number,
-        iq.create_time,
-        iq.status,
-        (case iq.STATUS when 0 THEN null else t.batch end) as report_number,
-        iq.file_user_id_and_name,
-        date_format(iq.create_time,'%Y-%m-%d') as createTimes,
-        iq.pdf_url,
-        iq.e_visa_pdf_url,
-        iq.wbs_id,
-        t.id as task_id,
-        iq.sj_record_ids
-        from u_information_query iq left join (select * from u_task k where k.status!=3 and k.project_id =
-        #{query.projectId} group by
-        form_data_id) t on iq.id = t.form_data_id and t.is_deleted = 0
-        where
-        iq.is_deleted = 0
-        and iq.classify = #{query.classify}
-        and iq.contract_id = #{query.contractId}
-        <if test="query.taskStatus != null and query.taskStatus != ''">
-            <choose>
-                <when test="query.taskStatus == 0">
-                    and (iq.status = 0 or iq.status = 3)
-                </when>
-                <otherwise>
-                    and iq.status = #{query.taskStatus}
-                </otherwise>
-            </choose>
-        </if>
-        <if test="query.sourceType != null and query.sourceType != ''">and iq.source_type = #{query.sourceType}</if>
-        <if test="query.reportNumber != null and query.reportNumber != ''">and t.batch = #{query.reportNumber}</if>
-        <if test="query.fileUserIdAndName != null and query.fileUserIdAndName != ''">and iq.file_user_id_and_name like
-            concat('%',#{query.fileUserIdAndName},'%')
-        </if>
-        <if test="query.queryValue != null and query.queryValue != ''">and (iq.name like
-            concat('%',#{query.queryValue},'%') OR iq.number like concat('%',#{query.queryValue},'%'))
-        </if>
-        <if test="query.firstTitle != null and query.firstTitle != ''">and iq.type = 3</if>
-        <if test="query.firstTitle == null or query.firstTitle == ''">and iq.type != 3</if>
-        <if test="query.wbsIds != null">
-            and iq.wbs_id in
-            <foreach collection="query.wbsIds" item="wbsIdc" open="(" separator="," close=")">
-                #{wbsIdc}
-            </foreach>
-        </if>
-        ) AS query
-        where
-        1 = 1
-        <if test="query.reportNumber != null and query.reportNumber != ''">and report_number = #{query.reportNumber}
-        </if>
-        <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
-            and query.createTimes between #{query.startTime} and #{query.endTime}
-        </if>
-        order by create_time desc
+        SELECT
+            query.pdf_trial_url,
+            query.pdf_trial_url_position,
+            query.wbs_id,
+            query.id,
+            query.name,
+            query.number,
+            query.create_time,
+            query.status,
+            query.report_number,
+            query.file_user_id_and_name,
+            query.pdf_url,
+            query.e_visa_pdf_url,
+            query.task_id,
+            query.sj_record_ids
+        FROM
+            (
+            SELECT
+                iq.pdf_trial_url_position,
+                iq.pdf_trial_url,
+                iq.sort,
+                iq.id,
+                iq.name,
+                iq.number,
+                iq.create_time,
+                date_format(iq.create_time,'%Y-%m-%d') AS createTimes,
+                iq.status,
+                (CASE iq.STATUS WHEN 0 THEN NULL ELSE t.batch END) AS report_number,
+                iq.file_user_id_and_name,
+                iq.pdf_url,
+                iq.e_visa_pdf_url,
+                iq.wbs_id,
+                t.id AS task_id,
+                iq.sj_record_ids
+            FROM
+                 u_information_query iq
+                LEFT JOIN
+                ( SELECT form_data_id, batch, id, is_deleted FROM u_task k
+                WHERE k.STATUS != 3 AND k.contract_id = #{query.contractId}
+                ORDER BY k.create_time DESC LIMIT 1 ) t ON iq.id = t.form_data_id
+                AND t.is_deleted = 0
+
+            WHERE
+                iq.is_deleted = 0
+            AND iq.classify = #{query.classify}
+            AND iq.contract_id = #{query.contractId}
+
+                <if test="query.taskStatus != null and query.taskStatus != ''">
+                    <choose>
+                        <when test="query.taskStatus == 0">
+                            AND (iq.status = 0 OR iq.status = 3)
+                        </when>
+                        <otherwise>
+                            AND iq.status = #{query.taskStatus}
+                        </otherwise>
+                    </choose>
+                </if>
+                <if test="query.sourceType != null and query.sourceType != ''">
+                    AND iq.source_type = #{query.sourceType}
+                </if>
+                <if test="query.reportNumber != null and query.reportNumber != ''">
+                    AND t.batch = #{query.reportNumber}
+                </if>
+                <if test="query.fileUserIdAndName != null and query.fileUserIdAndName != ''">
+                    AND iq.file_user_id_and_name LIKE concat('%',#{query.fileUserIdAndName},'%')
+                </if>
+                <if test="query.queryValue != null and query.queryValue != ''">
+                    AND (iq.name LIKE concat('%',#{query.queryValue},'%') OR iq.number LIKE concat('%',#{query.queryValue},'%'))
+                </if>
+                <if test="query.firstTitle != null and query.firstTitle != ''">
+                    AND iq.type = 3
+                </if>
+                <if test="query.firstTitle == null or query.firstTitle == ''">
+                    AND iq.type != 3
+                </if>
+                <if test="query.wbsIds != null">
+                    AND iq.wbs_id IN
+                    <foreach collection="query.wbsIds" item="wbsIdc" open="(" separator="," close=")">
+                        #{wbsIdc}
+                    </foreach>
+                </if>
+            ) AS query
+
+        WHERE 1 = 1
+
+            <if test="query.reportNumber != null and query.reportNumber != ''">
+                AND report_number = #{query.reportNumber}
+            </if>
+            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
+                AND query.createTimes BETWEEN #{query.startTime} AND #{query.endTime}
+            </if>
+
     </select>
 
 </mapper>

+ 103 - 133
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -1,5 +1,7 @@
 package org.springblade.system.user.service.impl;
 
+import cn.hutool.core.date.StopWatch;
+import cn.hutool.log.StaticLog;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.nacos.common.utils.StringUtils;
@@ -948,7 +950,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
     /**
      * 定时清理本地缓存信息,不在批量电签时删除,批量电签是多线程,会一直删除,导致缓存基本不生效(已废除Redis缓存,走本地缓存不需要Redis)
      */
-    @Scheduled(fixedRate = 120000) //每2分钟执行一次
+    @Scheduled(fixedRate = 180000) //每3分钟执行一次
     public void clearContractLocalCacheAndRedisCache() {
         //获取锁
         ReentrantLock lock = new ReentrantLock();
@@ -968,7 +970,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
         } finally {
             //释放锁
             lock.unlock();
-            _logger.info("定时执行任务:{clearContractLocalCacheAndRedisCache} 完成 ... ");
+            _logger.info("定时执行任务:{clearContractLocalCacheAndRedisCache} 完成 ");
         }
     }
 
@@ -996,7 +998,9 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
             do {
                 offset = (pageNumber - 1) * pageSize;
                 nodesAllPage = jdbcTemplate.query(
-                        "SELECT p_key_id, id, parent_id FROM m_wbs_tree_contract " +
+                        "SELECT p_key_id,id,parent_id " +
+                                ",sort,create_time,IFNULL(if(LENGTH (trim(full_name)) > 0, full_name, node_name), node_name) AS fullName " +
+                                "FROM m_wbs_tree_contract " +
                                 "WHERE type = 1 " +
                                 "AND status = 1 " +
                                 "AND is_deleted = 0 " +
@@ -1241,7 +1245,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
         if (ObjectUtil.isEmpty(contract)) {
             throw new ServiceException("获取合同段信息失败");
         }
-        vo.setClassify(org.apache.commons.lang.StringUtils.isNotEmpty(vo.getClassifyType()) ? new Integer(vo.getClassifyType()) : contract.getContractType() == null ? 1 : new Integer("1").equals(contract.getContractType()) ? 1 : 2);
+        vo.setClassify(StringUtils.isNotEmpty(vo.getClassifyType()) ? new Integer(vo.getClassifyType()) : contract.getContractType() == null ? 1 : new Integer("1").equals(contract.getContractType()) ? 1 : 2);
 
         Query query = new Query();
         query.setSize(vo.getSize());
@@ -1251,18 +1255,18 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
         submitNodeKeyIds.add(vo.getWbsId().toString());
         WbsTreeContract node = jdbcTemplate.query("SELECT * FROM m_wbs_tree_contract WHERE p_key_id = " + vo.getWbsId(), new BeanPropertyRowMapper<>(WbsTreeContract.class)).stream().findAny().orElse(null);
         if (node == null) {
-            if (org.apache.commons.lang.StringUtils.isEmpty(vo.getContractIdRelation())) {
+            if (StringUtils.isEmpty(vo.getContractIdRelation())) {
                 return null;
             }
             //监理
             node = jdbcTemplate.query("SELECT * FROM m_wbs_tree_contract WHERE id = " + vo.getWbsId() + " AND contract_id = " + vo.getContractIdRelation(), new BeanPropertyRowMapper<>(WbsTreeContract.class)).stream().findAny().orElse(null);
         }
 
+        List<Long> childNodesPkeyIds = new ArrayList<>();
+        List<Long> lowestNodesPkeyIds = new ArrayList<>();
+
         if (node != null) {
-            List<WbsTreeContractVO8> lowestNodes = new ArrayList<>();
-            List<QueryProcessDataVO> queryDataResult = new ArrayList<>();
             if (!new Integer("6").equals(node.getNodeType()) && !Arrays.asList("1,2,3,4".split(",")).contains(node.getMajorDataType() + "")) {
-                //TODO(暂不响应第一层根节点、第二层数据,数据量过多会导致响应超时)
                 if (node.getParentId() == 0) {
                     throw new ServiceException("请从第三层级节点开始进行检索");
                 } else {
@@ -1270,53 +1274,24 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                     if (wbsTreeContract != null && wbsTreeContract.getParentId().equals(0L)) {
                         throw new ServiceException("请从第三层级节点开始进行检索");
                     }
-
-                    WbsTreeContractVO8 vo8 = BeanUtil.copyProperties(node, WbsTreeContractVO8.class);
-                    this.lowestNodesRecursively(lowestNodes, Collections.singleton(vo8), node.getContractId());
-
-                    List<String> pKeyIds = lowestNodes.stream().map(WbsTreeContractVO8::getPKeyId).map(String::valueOf).collect(Collectors.toList());
-                    List<List<String>> partition = Lists.partition(pKeyIds, 1000);
-                    for (List<String> items : partition) {
-                        String sql = "SELECT wtc.id AS treeId,wtc.p_key_id AS primaryKeyId,wtc.ancestors AS ancestors,wtc.major_data_type AS majorDataType," +
-                                " wtc.node_type AS nodeType,IFNULL(if(length(trim(wtc.full_name)) > 0, wtc.full_name, wtc.node_name), wtc.node_name) AS title," +
-                                " wtc.parent_id AS parentId,uiq.id AS informationQueryId,IFNULL(uiq.status, 0) AS status,uiq.type AS queryType," +
-                                " CASE WHEN uiq.pdf_trial_url IS NULL THEN FALSE ELSE TRUE end AS isExperiment FROM m_wbs_tree_contract AS wtc" +
-                                " LEFT JOIN u_information_query AS uiq ON wtc.p_key_id = uiq.wbs_id AND uiq.classify = " + contract.getContractType() +
-                                " AND uiq.is_deleted = 0 AND wtc.is_deleted = 0 AND wtc.status = 1 WHERE wtc.p_key_id IN (" + org.apache.commons.lang.StringUtils.join(items, ",") + ")";
-                        List<QueryProcessDataVO> result = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(QueryProcessDataVO.class));
-                        if (result.size() > 0) {
-                            queryDataResult.addAll(result);
-                        }
-                    }
-                }
-
-                //首件
-                if (queryDataResult.size() > 0) {
-                    if (org.apache.commons.lang.StringUtils.isNotEmpty(vo.getIsFirst())) {
-                        if (org.apache.commons.lang.StringUtils.isNotEmpty(vo.getFirstTitle())) {
-                            queryDataResult = queryDataResult.stream().filter(qdr -> "3".equals(qdr.getQueryType())).collect(Collectors.toList());
-                        } else {
-                            List<String> treeIds = queryDataResult.stream().map(QueryProcessDataVO::getPrimaryKeyId).distinct().collect(Collectors.toList());
-                            List<TreeContractFirst> firstList = jdbcTemplate.query("SELECT * FROM u_tree_contract_first WHERE is_deleted = 0 AND wbs_node_id IN (" + org.apache.commons.lang.StringUtils.join(treeIds, ",") + ")", new BeanPropertyRowMapper<>(TreeContractFirst.class));
-                            List<String> list = firstList.stream().map(fl -> (fl.getWbsNodeId() + "")).collect(Collectors.toList());
-                            queryDataResult = queryDataResult.stream().filter(qdr -> list.contains(qdr.getPrimaryKeyId())).collect(Collectors.toList());
-                        }
+                    WbsTreeContract oldSelectedNode = BeanUtil.copyProperties(node, WbsTreeContract.class);
+                    childNodesPkeyIds = this.getChildNodesPkeyIds(oldSelectedNode, lowestNodesPkeyIds);
+                    List<String> sj = this.getSJ(contract, vo, lowestNodesPkeyIds);
+                    if (sj != null && sj.size() > 0) {
+                        submitNodeKeyIds.addAll(sj);
                     }
-                    submitNodeKeyIds.addAll(queryDataResult.stream().map(QueryProcessDataVO::getPrimaryKeyId).distinct().collect(Collectors.toList()));
                 }
             }
-
             vo.setWbsIds(submitNodeKeyIds);
-
-            if (org.apache.commons.lang.StringUtils.isNotEmpty(vo.getContractIdRelation())) {
+            if (StringUtils.isNotEmpty(vo.getContractIdRelation())) {
                 vo.setContractId(Long.valueOf(vo.getContractIdRelation()));
             }
         }
 
-        return this.selectInformationQueryPage(Condition.getPage(query), vo, node);
+        return this.selectInformationQueryPage(Condition.getPage(query), vo, node, childNodesPkeyIds);
     }
 
-    private IPage<InformationQueryVO> selectInformationQueryPage(IPage<InformationQueryVO> page, InformationQueryVO vo, WbsTreeContract node) {
+    private IPage<InformationQueryVO> selectInformationQueryPage(IPage<InformationQueryVO> page, InformationQueryVO vo, WbsTreeContract node, List<Long> childNodesPkeyIds) {
         if (StringUtils.isNotEmpty(vo.getBetweenTime())) {
             String[] betweenTime;
             if (vo.getBetweenTime().contains("~")) {
@@ -1329,7 +1304,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
             vo.setEndTime(betweenTime[1]);
         }
 
-        if (org.apache.commons.lang.StringUtils.isNotEmpty(vo.getFileUserIdAndName())) {
+        if (StringUtils.isNotEmpty(vo.getFileUserIdAndName())) {
             vo.setFileUserIdAndName(vo.getFileUserIdAndName().split("-")[0]);
         }
 
@@ -1337,15 +1312,24 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
             vo.setTaskStatus(vo.getStatus().toString());
         }
 
-        //获取全部数据
-        List<InformationQuery> result = baseMapper.selectInformationQueryPageTwo(vo);
-        if (result != null && result.size() != 0) {
-            //属于待审批、已审批状态任务Task信息,以及当前任务对应的副任务TaskParallel信息
+        long startTime = System.currentTimeMillis();
+        List<InformationQuery> result = new ArrayList<>();
+        List<List<String>> partition = Lists.partition(vo.getWbsIds(), 500);
+        for (List<String> wbsIds : partition) {
+            vo.setWbsIds(wbsIds);
+            List<InformationQuery> queries = baseMapper.selectInformationQueryPageTwo(vo);
+            result.addAll(queries);
+        }
+        long endTime = System.currentTimeMillis();
+        long executionTime = endTime - startTime;
+        _logger.info("合同段 " + node.getContractId() + " 获取当前资料缓存 执行时间:" + executionTime + " ms");
+
+        if (result.size() != 0) {
             Map<String, List<Task>> taskMaps = new HashMap<>();
             Map<String, List<TaskParallel>> taskParallelMaps = new HashMap<>();
             List<Long> informationIds = result.stream().filter(f -> f.getStatus().equals(1) || f.getStatus().equals(2)).map(InformationQuery::getId).collect(Collectors.toList());
             String informationIdsStr = informationIds.stream().map(String::valueOf).collect(Collectors.joining(","));
-            if (org.apache.commons.lang.StringUtils.isNotEmpty(informationIdsStr)) {
+            if (StringUtils.isNotEmpty(informationIdsStr)) {
                 List<Task> query = jdbcTemplate.query("SELECT id,form_data_id,process_instance_id,approval_type,status,batch,project_id,contract_id,create_time FROM u_task WHERE form_data_id IN(" + informationIdsStr + ") AND status IN (1, 2) AND is_deleted = 0", new BeanPropertyRowMapper<>(Task.class));
                 taskMaps = query.stream().collect(Collectors.groupingBy(Task::getFormDataId));
                 Set<String> processInstanceIds = query.stream().map(Task::getProcessInstanceId).map(id -> "'" + id + "'").collect(Collectors.toSet());
@@ -1355,7 +1339,6 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                 }
             }
 
-            //校验关联的工序节点是否全都已审批
             List<String> sjRecordIds = result.stream().map(InformationQuery::getSjRecordIds).filter(Objects::nonNull).collect(Collectors.toList());
             Set<Long> ids = new HashSet<>();
             for (String sjRecordId : sjRecordIds) {
@@ -1364,7 +1347,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
             }
             List<InformationQuery> informationQueries = new ArrayList<>();
             if (ids.size() > 0) {
-                informationQueries = jdbcTemplate.query("SELECT * FROM u_information_query WHERE id IN(" + StringUtils.join(ids, ",") + ")", new BeanPropertyRowMapper<>(InformationQuery.class));
+                informationQueries = jdbcTemplate.query("SELECT id FROM u_information_query WHERE id IN(" + StringUtils.join(ids, ",") + ")", new BeanPropertyRowMapper<>(InformationQuery.class));
             }
 
             List<InformationQueryVO> voResult = JSONArray.parseArray(JSONObject.toJSONString(result), InformationQueryVO.class);
@@ -1391,9 +1374,10 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                     e.printStackTrace();
                 }
 
+                /*任务状态*/
                 if (Arrays.asList("1,2".split(",")).contains(vor.getStatus().toString())) {
                     List<Task> tasks = finalTaskMaps.getOrDefault(vor.getId().toString(), null);
-                    //获取创建时间最新的那条任务数据(存在多条任务指向同一个form_data_id,即一条资料多次上报,这里要获取最新的)
+                    /*获取创建时间最新的那条任务数据(存在多条任务指向同一个form_data_id,即一条资料多次上报,这里要获取最新的)*/
                     if (tasks != null && tasks.size() > 0) {
                         Optional<Task> maxTask = tasks.stream().max(Comparator.comparing(Task::getCreateTime));
                         Task maxTaskObject = maxTask.get();
@@ -1405,7 +1389,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                     }
                 }
 
-                //校验关联的工序节点是否全都已审批
+                /*首件判断*/
                 if (StringUtils.isNotEmpty(vor.getSjRecordIds())) {
                     List<String> recordIdList = Func.toStrList(vor.getSjRecordIds());
                     List<InformationQuery> informationQueryList = finalInformationQueries.stream()
@@ -1416,7 +1400,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                     vor.setIsApprove(isApprove);
                 }
 
-                //试验关联文件pdf
+                /*试验文件关联*/
                 try {
                     this.getMergePdf(vor);
                 } catch (FileNotFoundException e) {
@@ -1434,7 +1418,6 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
 
             } else if (voResult.size() > 1) {
                 if (org.apache.commons.lang.StringUtils.isNotEmpty(vo.getIsFirst())) {
-
                     long current = (page.getCurrent() - 1) * page.getSize();
                     if (current < 0) {
                         throw new IllegalArgumentException("当前页码不能小于0");
@@ -1447,33 +1430,16 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                     page.setRecords(subList);
                     page.setTotal(voResult.size());
                     return page;
-
                 } else {
-                    /**
-                     * 资料查询
-                     * @author liuyc
-                     * @date 2024年1月6日10:23:14
-                     * @description
-                     *   处理资料查询,page资料填报数据与节点顺序同步展示问题,查询出当前选择节点下所有资料填报信息,
-                     *   然后匹配节点位置信息,不分页查询page数据,分页查询会导致数据匹配异常,处理完匹配后,再分页返回。
-                     */
-                    //获取选择的节点下的所有子节点信息
-                    WbsTreeContract oldSelectedNode = BeanUtil.copyProperties(node, WbsTreeContract.class);
-                    List<WbsTreeContract> treeAll = this.getChildNodesZL(oldSelectedNode);
-                    if (treeAll == null) {
-                        treeAll = new ArrayList<>();
-                    }
-                    treeAll.add(0, oldSelectedNode);
-
-                    if (treeAll.size() > 1) {
+                    childNodesPkeyIds.add(0, node.getPKeyId());
+                    if (childNodesPkeyIds.size() > 1) {
                         LinkedList<InformationQueryVO> resultData = new LinkedList<>();
                         LinkedHashMap<Long, InformationQueryVO> dataMaps = voResult.stream()
                                 .collect(Collectors.toMap(InformationQueryVO::getWbsId, Function.identity(),
                                         (oldValue, newValue) -> oldValue, LinkedHashMap::new));
-                        for (WbsTreeContract resultNode : treeAll) {
-                            InformationQueryVO queryVO = dataMaps.get(resultNode.getPKeyId());
+                        for (Long pKeyId : childNodesPkeyIds) {
+                            InformationQueryVO queryVO = dataMaps.get(pKeyId);
                             if (queryVO != null) {
-                                //按节点顺序插入Page数据
                                 resultData.add(queryVO);
                             }
                         }
@@ -1500,25 +1466,38 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
         return page.setRecords(null);
     }
 
-    private void lowestNodesRecursively(List<WbsTreeContractVO8> lowestNodes, Set<WbsTreeContractVO8> nodes, String contractId) {
-        if (nodes.size() > 0) {
-            Set<Long> ids = nodes.stream().map(WbsTreeContractVO8::getId).collect(Collectors.toSet());
-            if (ids.size() > 0) {
-                List<WbsTreeContractVO8> childNodes = jdbcTemplate.query("select a.p_key_id,a.id,(SELECT CASE WHEN COUNT(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND b.contract_id = " + contractId + " AND b.status = 1 AND b.type = 1 AND b.is_deleted = 0) AS hasChildren from m_wbs_tree_contract a where a.type = 1 and a.status = 1 and a.is_deleted = 0 and a.contract_id = " + contractId + " and a.parent_id in(" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")", new BeanPropertyRowMapper<>(WbsTreeContractVO8.class));
-                if (childNodes.size() > 0) {
-                    Set<WbsTreeContractVO8> lowestNode = childNodes.stream().filter(f -> f.getHasChildren().equals(0)).collect(Collectors.toSet());
-                    Set<WbsTreeContractVO8> noLowestNode = childNodes.stream().filter(f -> f.getHasChildren().equals(1)).collect(Collectors.toSet());
-                    //最底层节点
-                    if (lowestNode.size() > 0) {
-                        lowestNodes.addAll(lowestNode);
-                    }
-                    //非最底层节点
-                    if (noLowestNode.size() > 0) {
-                        this.lowestNodesRecursively(lowestNodes, noLowestNode, contractId);
-                    }
+    private List<String> getSJ(ContractInfo contract, InformationQueryVO vo, List<Long> lowestNodesPkeyIds) {
+        /*首件相关*/
+        List<QueryProcessDataVO> queryDataResult = new ArrayList<>();
+        List<List<Long>> partition = Lists.partition(lowestNodesPkeyIds, 500);
+        for (List<Long> items : partition) {
+            String sql = "SELECT wtc.p_key_id AS primaryKeyId,uiq.type AS queryType " +
+                    " FROM m_wbs_tree_contract AS wtc" +
+                    " LEFT JOIN u_information_query AS uiq ON wtc.p_key_id = uiq.wbs_id" +
+                    " AND uiq.classify = " + contract.getContractType() +
+                    " AND uiq.is_deleted = 0 " +
+                    " WHERE wtc.p_key_id IN (" + org.apache.commons.lang.StringUtils.join(items, ",") + ") " +
+                    " AND wtc.is_deleted = 0 AND wtc.status = 1 ";
+
+            List<QueryProcessDataVO> result = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(QueryProcessDataVO.class));
+            if (result.size() > 0) {
+                queryDataResult.addAll(result);
+            }
+        }
+        if (queryDataResult.size() > 0) {
+            if (org.apache.commons.lang.StringUtils.isNotEmpty(vo.getIsFirst())) {
+                if (org.apache.commons.lang.StringUtils.isNotEmpty(vo.getFirstTitle())) {
+                    queryDataResult = queryDataResult.stream().filter(qdr -> "3".equals(qdr.getQueryType())).collect(Collectors.toList());
+                } else {
+                    List<String> treeIds = queryDataResult.stream().map(QueryProcessDataVO::getPrimaryKeyId).distinct().collect(Collectors.toList());
+                    List<TreeContractFirst> firstList = jdbcTemplate.query("SELECT wbs_node_id FROM u_tree_contract_first WHERE is_deleted = 0 AND wbs_node_id IN (" + org.apache.commons.lang.StringUtils.join(treeIds, ",") + ")", new BeanPropertyRowMapper<>(TreeContractFirst.class));
+                    List<String> list = firstList.stream().map(fl -> (fl.getWbsNodeId() + "")).collect(Collectors.toList());
+                    queryDataResult = queryDataResult.stream().filter(qdr -> list.contains(qdr.getPrimaryKeyId())).collect(Collectors.toList());
                 }
             }
+            return queryDataResult.stream().map(QueryProcessDataVO::getPrimaryKeyId).distinct().collect(Collectors.toList());
         }
+        return null;
     }
 
     private void integrationMethod(InformationQueryVO vo, List<TaskParallel> linkList) {
@@ -1589,52 +1568,43 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
         }
     }
 
-    private List<WbsTreeContract> getChildNodesZL(WbsTreeContract obj) {
+    private List<Long> getChildNodesPkeyIds(WbsTreeContract obj, List<Long> lowestNodesPkeyIds) {
         if (obj != null) {
-            List<WbsTreeContract> wbsTreeContracts = Collections.singletonList(obj);
-            List<WbsTreeContract> result = new ArrayList<>();
-            this.recursionGetChildNodesZL(wbsTreeContracts, result, obj.getContractId());
-            if (result.size() > 0) {
-                return result;
+            List<Long> resultPKeyId = new ArrayList<>();
+            List<WbsTreeContractLazyVO> nodeAll = this.getNodeAll(obj.getContractId());
+            this.recursionGetChildNodesPkeyIds(nodeAll, Collections.singletonList(obj.getId()), resultPKeyId, lowestNodesPkeyIds);
+            if (resultPKeyId.size() > 0) {
+                return resultPKeyId;
             }
         }
-        return null;
+        return new ArrayList<>();
     }
 
-    private void recursionGetChildNodesZL(List<WbsTreeContract> list, List<WbsTreeContract> result, String contractId) {
-        List<Long> ids = list.stream().map(WbsTreeContract::getId).collect(Collectors.toList());
+    private void recursionGetChildNodesPkeyIds(List<WbsTreeContractLazyVO> nodeAll, List<Long> ids, List<Long> resultPKeyId, List<Long> lowestNodesPkeyIds) {
         if (ids.size() > 0) {
-            //构建以parent_id为key的Map
-            Map<Long, List<WbsTreeContract>> queryMap = jdbcTemplate.query(
-                    "SELECT id,p_key_id,parent_id,sort,create_time," +
-                            "IFNULL(if(LENGTH (trim(full_name)) > 0, full_name, node_name), node_name) AS fullName " +
-                            "FROM m_wbs_tree_contract WHERE type = 1 AND status = 1 AND is_deleted = 0 " +
-                            "AND parent_id IN (" + org.apache.commons.lang.StringUtils.join(ids, ",") + ") " +
-                            "AND contract_id = " + contractId + " ORDER BY sort,fullName,create_time",
-                    rs -> {
-                        Map<Long, List<WbsTreeContract>> map = new LinkedHashMap<>();
-                        while (rs.next()) {
-                            WbsTreeContract item = new WbsTreeContract();
-                            item.setId(rs.getLong("id"));
-                            item.setPKeyId(rs.getLong("p_key_id"));
-                            item.setParentId(rs.getLong("parent_id"));
-                            item.setSort(rs.getInt("sort"));
-                            item.setFullName(rs.getString("fullName"));
-                            item.setCreateTime(rs.getTime("create_time"));
-                            Long parentId = item.getParentId();
-                            if (!map.containsKey(parentId)) {
-                                map.put(parentId, new ArrayList<>());
-                            }
-                            map.get(parentId).add(item);
-                        }
-                        return map;
-                    });
-            //按照ids的顺序加入result
+            List<WbsTreeContractLazyVO> sortedFilteredNodes = nodeAll.stream()
+                    .filter(f -> ids.contains(f.getParentId()))
+                    .sorted(Comparator.comparing(WbsTreeContractLazyVO::getSort, Comparator.nullsLast(Integer::compareTo))
+                            .thenComparing(WbsTreeContractLazyVO::getFullName, Comparator.nullsLast(String::compareTo))
+                            .thenComparing(WbsTreeContractLazyVO::getCreateTime, Comparator.nullsLast(Comparator.naturalOrder())))
+                    .collect(Collectors.toList());
+
+            Map<Long, List<WbsTreeContractLazyVO>> filteredNodesMap = new LinkedHashMap<>();
+            sortedFilteredNodes.forEach(node -> {
+                Long parentId = node.getParentId();
+                filteredNodesMap.computeIfAbsent(parentId, k -> new ArrayList<>()).add(node);
+            });
+
             for (Long id : ids) {
-                if (queryMap != null && queryMap.containsKey(id)) {
-                    List<WbsTreeContract> nodes = queryMap.get(id);
-                    result.addAll(nodes);
-                    recursionGetChildNodesZL(nodes, result, contractId);
+                if (filteredNodesMap.containsKey(id)) {
+                    List<WbsTreeContractLazyVO> nodes = filteredNodesMap.get(id);
+                    for (WbsTreeContractLazyVO node : nodes) {
+                        if (node.getHasChildren().equals(0)) {
+                            lowestNodesPkeyIds.add(node.getPKeyId());
+                        }
+                        resultPKeyId.add(node.getPKeyId());
+                    }
+                    this.recursionGetChildNodesPkeyIds(nodeAll, nodes.stream().map(WbsTreeContractLazyVO::getId).collect(Collectors.toList()), resultPKeyId, lowestNodesPkeyIds);
                 }
             }
         }