Bläddra i källkod

Merge remote-tracking branch 'origin/master'

liuyc 1 år sedan
förälder
incheckning
b1da523a56
26 ändrade filer med 551 tillägg och 57 borttagningar
  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. 17 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  8. 3 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveAutoClientImpl.java
  9. 22 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveExpertConclusionClientImpl.java
  10. 18 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExpertConclusionMapper.java
  11. 6 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExpertConclusionMapper.xml
  12. 21 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExpertScoreMapper.java
  13. 6 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExpertScoreMapper.xml
  14. 4 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java
  15. 35 6
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  16. 15 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExpertConclusionService.java
  17. 15 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExpertScoreService.java
  18. 2 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  19. 38 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertConclusionServiceImpl.java
  20. 32 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertScoreServiceImpl.java
  21. 35 15
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  22. 33 18
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  23. 3 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java
  24. 14 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  25. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java
  26. 52 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.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;
+}

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

@@ -846,7 +846,7 @@ public class ArchivesAutoController extends BladeController {
 	})
 	public R saveInspect(@RequestBody ExpertInspection inspection) {
 		archivesAutoService.saveInspect(inspection);
-		return R.data("保存成功");
+		return R.data("操作成功");
 	}
 
 	/**
@@ -865,6 +865,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);
     }
 
     /**

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