Переглянути джерело

Merge branch 'test-merge' of http://219.151.181.73:3000/zhuwei/bladex into test-merge

lvy 1 день тому
батько
коміт
e6aa1065e6
40 змінених файлів з 866 додано та 276 видалено
  1. 1 0
      blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java
  2. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyFinishTestReport.java
  3. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/InformationQueryClient.java
  4. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialCyThirdReportQueryVo.java
  5. 19 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/cq/Attachment.java
  6. 21 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/cq/QualityData.java
  7. 24 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/cq/QualityDataFile.java
  8. 30 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/cq/ResultApi.java
  9. 51 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/APIWbsContractSubdivisionExpandVo.java
  10. 2 26
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/APIWbsContractSubdivisionVo.java
  11. 17 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TaskProgressVO1.java
  12. 3 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  13. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialCyController.java
  14. 5 1
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/InformationQueryClientImpl.java
  15. 8 54
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TrialCyAccessoriesClientImpl.java
  16. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.java
  17. 13 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml
  18. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyAccessoriesMapper.java
  19. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyAccessoriesMapper.xml
  20. 7 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyFinishTestReportMapper.java
  21. 32 14
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyFinishTestReportMapper.xml
  22. 2 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyTestTypeMapper.java
  23. 3 2
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyTestTypeMapper.xml
  24. 12 13
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyThirdReportMapper.xml
  25. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSelfInspectionRecordMapper.java
  26. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSelfInspectionRecordMapper.xml
  27. 18 7
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/ChenYuTestScheduled.java
  28. 8 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyFinishTestReportService.java
  29. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyService.java
  30. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyTestTypeService.java
  31. 3 19
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyAccessoriesServiceImpl.java
  32. 14 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyFinishTestReportServiceImpl.java
  33. 9 11
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyServiceImpl.java
  34. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyTestTypeServiceImpl.java
  35. 3 15
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  36. 121 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/APIController.java
  37. 3 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.java
  38. 10 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  39. 4 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
  40. 405 90
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

+ 1 - 0
blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java

@@ -68,6 +68,7 @@ public class AuthProvider {
         DEFAULT_SKIP_URL.add("/getQualityTestingToken"); //成渝第三方登录获取质检系统tokne
         DEFAULT_SKIP_URL.add("/getArchiveToken"); //成渝第三方登录获取档案系统tokne
         DEFAULT_SKIP_URL.add("/meeting/**");//DingDing会议接口
+        DEFAULT_SKIP_URL.add("/hczc/api/meter/**");//重庆高速计量获取分部分项划分
 
     }
 

+ 1 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyFinishTestReport.java

@@ -138,7 +138,7 @@ public class TrialCyFinishTestReport {
      * 试验树id
      */
     @ApiModelProperty("组装文件(报告+记录+委托单)")
-    @TableField("assemble_file")
+        @TableField("assemble_file")
     public String assembleFile;
     /**
      * 附件

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/InformationQueryClient.java

@@ -104,4 +104,7 @@ public interface InformationQueryClient {
 
     @PostMapping(API_PREFIX+"/delInformation")
     void delInformation(@RequestBody InformationQuery infoByWbsId);
+
+    @PostMapping(API_PREFIX+"/getInformationByContractIdAll")
+    List<InformationQuery> getInformationByContractIdAll(@RequestParam Long contractId);
 }

+ 1 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialCyThirdReportQueryVo.java

@@ -19,7 +19,7 @@ public class TrialCyThirdReportQueryVo {
     private String endTime;
     @ApiModelProperty("树节点id")
     @NotNull(message = "树节点id不能为空")
-    private Long nodeId;
+    private String nodeId;
     @ApiModelProperty("合同段id")
     @NotNull(message = "合同段id不能为空")
     private Long contractId;

+ 19 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/cq/Attachment.java

@@ -0,0 +1,19 @@
+package org.springblade.manager.entity.cq;
+
+import lombok.Data;
+
+/**
+ * @author LHB
+ */
+@Data
+public class Attachment {
+
+    //文件名称
+    private String name;
+    //文件类型排序
+    private String order;
+    //pdf文件url
+    private String url;
+    //文件备注
+    private String comment;
+}

+ 21 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/cq/QualityData.java

@@ -0,0 +1,21 @@
+package org.springblade.manager.entity.cq;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author LHB
+ * 质量资料对象
+ */
+@Data
+public class QualityData {
+    //文件类型(支持多个文件类型)
+    private String type;
+    //文件类型名称
+    private String typename;
+    //文件类型排序
+    private Integer typeOrder;
+    //文件(支持多个文件)
+    private List<QualityDataFile> files;
+}

+ 24 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/cq/QualityDataFile.java

@@ -0,0 +1,24 @@
+package org.springblade.manager.entity.cq;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author LHB
+ */
+@Data
+public class QualityDataFile {
+    //文件名称
+    private String name;
+    //文件类型名称
+    private String typeName;
+    //文件类型排序
+    private String order;
+    //pdf文件url
+    private String url;
+    //文件备注
+    private String comment;
+    //附件(支持多个附件)
+    private List<Attachment> attachments;
+}

+ 30 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/cq/ResultApi.java

@@ -0,0 +1,30 @@
+package org.springblade.manager.entity.cq;
+
+
+import lombok.Data;
+
+/**
+ * @author LHB
+ * 重庆高速计量接口响应类
+ */
+@Data
+public class ResultApi<T> {
+    private Integer state;
+    private String message;
+    private T data;
+
+    public static ResultApi success(Object data) {
+        ResultApi resultApi = new ResultApi();
+        resultApi.setState(1);
+        resultApi.setMessage("");
+        resultApi.setData(data);
+        return resultApi;
+    }
+
+    public static ResultApi fail(String message) {
+        ResultApi resultApi = new ResultApi();
+        resultApi.setState(2);
+        resultApi.setMessage(message);
+        return resultApi;
+    }
+}

+ 51 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/APIWbsContractSubdivisionExpandVo.java

@@ -0,0 +1,51 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+
+/**
+ * 合同段分部分项划分节点试图
+ * 包含各个状态
+ * | 01   | 交工证书     | 所有子节点存在一个的major_data_type = 3   值为 true     |
+ * | 02   | 7天强度报告  | 所有最小节点中在m_table_file 中type = 11  存在一个true  |
+ * | 03   | 28天强度报告 | 所有最小节点中在m_table_file 中type = 12   存在一个true |
+ * | 04   | 监理收验资料 | 监理 major_data_type = 4  全部已审批                    |
+ * | 05   | 桩检报告     | 所有最小节点中在m_table_file  中type = 13   存在一个true |
+ * | 06   | 质检资料     | 质检 major_data_type = 4  全部已审批                    |
+ * | 07   | 评定资料     | major_data_type = 2  全部已审批                         |
+ * @author LHB
+ */
+@Data
+public class APIWbsContractSubdivisionExpandVo {
+    /**
+     * 主键
+     */
+    private Long id;
+    /**
+     * 交工证书
+     */
+    private Boolean completionCertificate = false;
+    /**
+     * 7天强度报告
+     */
+    private Boolean strengthReportSeven = false;
+    /**
+     * 28天强度报告
+     */
+    private Boolean strengthReportTwentyEight = false;
+    /**
+     * 监理资料
+     */
+    private Boolean supervisionData = false;
+    /**
+     * 桩检报告
+     */
+    private Boolean pileInspectionReport = false;
+    /**
+     * 质检资料
+     */
+    private Boolean qualityInspectionData = false;
+    /**
+     * 评定资料
+     */
+    private Boolean evaluationData = false;
+}

+ 2 - 26
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/APIWbsContractSubdivisionVo.java

@@ -54,31 +54,7 @@ public class APIWbsContractSubdivisionVo {
      */
     private String partitionCatagName;
     /**
-     * 交工证书
+     * 排序
      */
-    private Boolean completionCertificate = false;
-    /**
-     * 7天强度报告
-     */
-    private Boolean strengthReportSeven = false;
-    /**
-     * 28天强度报告
-     */
-    private Boolean strengthReportTwentyEight = false;
-    /**
-     * 监理资料
-     */
-    private Boolean supervisionData = false;
-    /**
-     * 桩检报告
-     */
-    private Boolean pileInspectionReport = false;
-    /**
-     * 质检资料
-     */
-    private Boolean qualityInspectionData = false;
-    /**
-     * 评定资料
-     */
-    private Boolean evaluationData = false;
+    private Integer sort;
 }

+ 17 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TaskProgressVO1.java

@@ -0,0 +1,17 @@
+package org.springblade.manager.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class TaskProgressVO1 {
+
+    private String finishCount;
+
+    private String totalCount;
+
+    private String pace;
+}

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

@@ -1773,8 +1773,10 @@ public class TaskController extends BladeController {
                 sqlString.append("report_user = ?");
                 params.add(SecureUtil.getUserId());
             } else if (dto.getSelectedType().equals(4)) {
-                sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_content='当前等待电签的批次较多,请等待几分钟后刷新页面查看........' AND u_task_parallel.task_user = ?)");
+                sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ? AND u_task_parallel.e_visa_content='当前等待电签的批次较多,请等待几分钟后刷新页面查看........')");
+                params.add(1);
                 params.add(SecureUtil.getUserId());
+                sqlString.append(" AND status = 1");
             }
             sqlString.append(")");
         }

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialCyController.java

@@ -55,8 +55,8 @@ public class TrialCyController {
     @GetMapping("/getTree")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "获取成渝那边的树", notes = "传入项目id")
-    public R<List<TrialCyTestType>> getTree(Long projectId, String parentId){
-        return R.data(trialCyService.getTree(projectId,parentId));
+    public R<List<TrialCyTestType>> getTree(Long projectId, String parentId, String contractId){
+        return R.data(trialCyService.getTree(projectId,parentId,contractId));
     }
 
     /**

+ 5 - 1
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/InformationQueryClientImpl.java

@@ -15,6 +15,7 @@ import org.springblade.business.vo.QueryProcessDataVO;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -142,5 +143,8 @@ public class InformationQueryClientImpl implements InformationQueryClient {
         informationQueryMapper.deleteById(infoByWbsId);
     }
 
-
+    @Override
+    public List<InformationQuery> getInformationByContractIdAll(Long contractId) {
+        return informationQueryMapper.getInformationByContractIdAll(contractId);
+    }
 }

+ 8 - 54
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TrialCyAccessoriesClientImpl.java

@@ -40,68 +40,22 @@ public class TrialCyAccessoriesClientImpl implements TrialCyAccessoriesClient {
     @Override
     public List<JSONObject> getTrialFilePdfRecord(String primaryKeyId, List<Integer> list) {
         //获取id
-        List<Map<String, Object>> trialFilePdfRecord = trialSelfInspectionRecordMapper.getTrialFilePdfRecord(primaryKeyId, list);
+        List<String> trialFilePdfRecord = trialSelfInspectionRecordMapper.getTrialFilePdfRecord(primaryKeyId, list);
 
         if (CollectionUtil.isNotEmpty(trialFilePdfRecord)) {
 
-            //试验报告ids
-            List<Long> listOne = new ArrayList<>();
-            //第三方外委ids
-            List<Long> listTwo = new ArrayList<>();
-
-            for (Map<String, Object> stringObjectMap : trialFilePdfRecord) {
-
-                Integer type = (Integer) stringObjectMap.get("type");
-                Long recordId = (Long) stringObjectMap.get("record_id");
-                //试验报告
-                if (type == 11) {
-                    listOne.add(recordId);
-                } else {
-                    //第三方、外委
-                    listTwo.add(recordId);
-                }
-            }
-
             List<JSONObject> result = new ArrayList<>();
-
-            if (CollectionUtil.isNotEmpty(listOne)) {
-                List<TrialCyFinishTestReport> list1 = trialCyFinishTestReportService.list(Wrappers.<TrialCyFinishTestReport>lambdaQuery()
-                        .isNotNull(TrialCyFinishTestReport::getAssembleFile)
-                        .in(TrialCyFinishTestReport::getTaskId, listOne)
-                );
-
-                if (CollectionUtil.isNotEmpty(list1)) {
-                    list1.forEach(f -> {
-                        String[] split = f.getAssembleFile().split("/");
-                        JSONObject jsonObject = new JSONObject();
-                        jsonObject.put("id", f.getTaskId());
-                        jsonObject.put("name", split[split.length - 1]);
-                        jsonObject.put("contractId", f.getContractId());
-                        jsonObject.put("domainUrl", f.getAssembleFile());
-                        jsonObject.put("domainPdfUrl", f.getAssembleFile());
-                        jsonObject.put("tabId", primaryKeyId);
-                        jsonObject.put("extension", "pdf");
-                        //是否为试验关联的附件
-                        jsonObject.put("isTrial", true);
-                        result.add(jsonObject);
-                    });
-                }
-            }
-            if (CollectionUtil.isNotEmpty(listTwo)) {
-                List<TrialCyThirdReport> list1 = trialCyThirdReportService.list(Wrappers.<TrialCyThirdReport>lambdaQuery()
-                        .isNotNull(TrialCyThirdReport::getAssembleFile)
-                        .in(TrialCyThirdReport::getId, listTwo)
-                );
-
+            if (CollectionUtil.isNotEmpty(trialFilePdfRecord)) {
+                List<Map<String,Object>> list1 = trialCyFinishTestReportService.selectViewList(trialFilePdfRecord);
                 if (CollectionUtil.isNotEmpty(list1)) {
                     list1.forEach(f -> {
-                        String[] split = f.getAssembleFile().split("/");
+                        String[] split = f.get("assembleFile").toString().split("/");
                         JSONObject jsonObject = new JSONObject();
-                        jsonObject.put("id", f.getId());
+                        jsonObject.put("id", f.get("id"));
                         jsonObject.put("name", split[split.length - 1]);
-                        jsonObject.put("contractId", f.getContractId());
-                        jsonObject.put("domainUrl", f.getAssembleFile());
-                        jsonObject.put("domainPdfUrl", f.getAssembleFile());
+                        jsonObject.put("contractId", f.get("contractId"));
+                        jsonObject.put("domainUrl", f.get("assembleFile"));
+                        jsonObject.put("domainPdfUrl", f.get("assembleFile"));
                         jsonObject.put("tabId", primaryKeyId);
                         jsonObject.put("extension", "pdf");
                         //是否为试验关联的附件

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.java

@@ -152,4 +152,6 @@ public interface InformationQueryMapper extends BaseMapper<InformationQuery> {
     int addCheckPdfInfoByIds(@Param("ids") List<String> ids,@Param("classify") String classify);
 
     ChekPdfPaceVo getCheckPdfPaceInfo(@Param("contractId") String contractId, @Param("classify") String classify);
+
+    List<InformationQuery> getInformationByContractIdAll(@Param("contractId") Long contractId);
 }

+ 13 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml

@@ -988,7 +988,7 @@
         node_pdf_url
         from u_information_query
         where is_deleted = 0
-          and contract_id = #{contractId} and classify = #{classify} and status = 2 and is_deleted = 0;
+          and contract_id = #{contractId} and classify = #{classify} and status in(0,1,2) and is_deleted = 0;
     </select>
 
     <select id="getTabussTimeInfo" resultMap="tabBusstimeInfoResultMap">
@@ -1043,5 +1043,17 @@
           AND classify = #{classify,jdbcType=VARCHAR}
           AND chek_status IN (0,1,2,3)
     </select>
+    <select id="getInformationByContractIdAll" resultType="org.springblade.business.entity.InformationQuery">
+        select id,
+               wbs_id,
+               name,
+               IFNULL(IFNULL(e_visa_pdf_url,node_pdf_url),pdf_url) pdf_url,
+               classify,
+               sort
+        from u_information_query
+        where is_deleted = 0
+          and (pdf_url is not null or e_visa_pdf_url is not null or node_pdf_url is not null)
+          and contract_id = #{contractId} and classify in(1,2) and status in(0,1,2) and is_deleted = 0;
+    </select>
 
 </mapper>

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyAccessoriesMapper.java

@@ -18,7 +18,7 @@ public interface TrialCyAccessoriesMapper extends BaseMapper<TrialCyAccessories>
     Boolean clearTrialAssociation(@Param("nodeId") Long nodeId,
                                   @Param("recordId") Long recordId);
 
-    List<String> selectFilePdfList(@Param("nodeId") Long nodeId,
+    List<Long> selectFilePdfList(@Param("nodeId") Long nodeId,
                                    @Param("types") Integer... types);
 }
 

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

@@ -19,7 +19,7 @@
     <delete id="clearTrialAssociation">
         delete from u_trial_file_pdf_record where node_id = #{nodeId} and record_id=#{recordId}
     </delete>
-    <select id="selectFilePdfList" resultType="java.lang.String">
+    <select id="selectFilePdfList" resultType="java.lang.Long">
         select record_id from u_trial_file_pdf_record where node_id = #{nodeId} and type in
           <foreach collection="types" item="type" open="(" close=")" separator=",">
               #{type}

+ 7 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyFinishTestReportMapper.java

@@ -7,6 +7,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.springblade.business.vo.ThirdReportVo;
 import org.springblade.business.vo.TrialCyThirdReportQueryVo;
 
+import java.util.List;
+import java.util.Map;
+
 /**
 * @author LHB
 * @description 针对表【u_trial_cy_finish_test_report(成渝-获取标段已完成(已签章完成)的检测报告)】的数据库操作Mapper
@@ -16,6 +19,10 @@ import org.springblade.business.vo.TrialCyThirdReportQueryVo;
 public interface TrialCyFinishTestReportMapper extends BaseMapper<TrialCyFinishTestReport> {
 
     Page<ThirdReportVo> myPage(Page<ThirdReportVo> page, @Param("query") TrialCyThirdReportQueryVo queryVo);
+
+    List<String> selectViewPdfList(@Param("ids") List<Long> ids);
+
+    List<Map<String,Object>> selectViewList(@Param("ids") List<String> ids);
 }
 
 

+ 32 - 14
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyFinishTestReportMapper.xml

@@ -5,33 +5,51 @@
 <mapper namespace="org.springblade.business.mapper.TrialCyFinishTestReportMapper">
     <select id="myPage" resultType="org.springblade.business.vo.ThirdReportVo">
         select
-            task_id id,
-            contract_id contractId,
-            report_number reportNo,
-            report_date reportDate,
-            position projectPositionName,
-            case
-                when experiment_result = 1 then '合格'
-                else '不合格'
-            end detectionResultName,
+            id,
+            contractId,
+            reportNo,
+            reportDate,
+            projectPositionName,
+            detectionResultName,
         (select count(0) > 0 from u_trial_file_pdf_record where node_id = #{query.qualityTestPKeyId}  and type = 11 and record_id = t.id) isSelectedStatus
-        from u_trial_cy_finish_test_report t
+        from vw_u_trial_cy_decoment t
         <where>
+            and `type` in(1,2)
             <if test="query.contractId != null">
-                AND contract_id = #{query.contractId}
+                AND contractId = #{query.contractId}
             </if>
             <if test="query.nodeId != null">
-                AND exam_name_info_id = #{query.nodeId}
+                AND node_id = #{query.nodeId}
             </if>
             <if test="query.startTime != null">
-                AND report_date >= #{query.startTime}
+                AND reportDate >= #{query.startTime}
             </if>
             <if test="query.endTime != null">
-                AND report_date &lt;= #{query.endTime}
+                AND reportDate &lt;= #{query.endTime}
             </if>
             <if test="query.reportType != null">
                 AND cs = #{query.reportType}
             </if>
         </where>
     </select>
+    <select id="selectViewPdfList" resultType="java.lang.String">
+        select
+            assemble_file
+        from vw_u_trial_cy_decoment
+        where id in
+        <foreach item="item" collection="ids" separator="," open="(" close=")" index="">
+            #{item}
+        </foreach>
+    </select>
+    <select id="selectViewList" resultType="java.util.Map">
+        select
+            id,
+            contractId,
+            assemble_file as assembleFile
+        from vw_u_trial_cy_decoment
+        where assemble_file is not null and id in
+        <foreach item="item" collection="ids" separator="," open="(" close=")" index="">
+            #{item}
+        </foreach>
+    </select>
 </mapper>

+ 2 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyTestTypeMapper.java

@@ -15,7 +15,8 @@ import java.util.List;
 public interface TrialCyTestTypeMapper extends BaseMapper<TrialCyTestType> {
 
     List<TrialCyTestType> getTree(@Param("projectId") Long projectId,
-                                  @Param("parentId") String parentId);
+                                  @Param("parentId") String parentId,
+                                  @Param("contractId") String contractId);
 }
 
 

+ 3 - 2
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyTestTypeMapper.xml

@@ -15,9 +15,10 @@
     <select id="getTree" resultType="org.springblade.business.entity.TrialCyTestType">
         select
             <include refid="Base_sql"/>,
-            (select count(1) > 0 from u_trial_cy_test_type where father_id = t.id) has_children
-        from u_trial_cy_test_type t
+            (select count(1) > 0 from vw_u_trial_cy_tree where father_id = t.id and contract_id = #{contractId}) has_children
+        from vw_u_trial_cy_tree t
         where project_id = #{projectId}
+          and contract_id = #{contractId}
           and father_id = #{parentId}
         order by order_index
     </select>

+ 12 - 13
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyThirdReportMapper.xml

@@ -6,30 +6,29 @@
     <select id="myPage" resultType="org.springblade.business.vo.ThirdReportVo">
         select
             id,
-            contract_id contractId,
-            report_no reportNo,
-            report_date reportDate,
-            project_part projectPositionName,
-            case when is_qualified = 1 then '合格'
-                else '不合格'
-            end detectionResultName,
+            contractId,
+            reportNo,
+            reportDate,
+            projectPositionName,
+            detectionResultName,
         (select count(0) > 0 from u_trial_file_pdf_record where node_id = #{query.qualityTestPKeyId}  and type in(12,13) and record_id = t.id) isSelectedStatus
-        from u_trial_cy_third_report t
+        from vw_u_trial_cy_decoment t
         <where>
+            AND `type` in(3,4)
             <if test="query.contractId != null">
-                AND contract_id = #{query.contractId}
+                AND contractId = #{query.contractId}
             </if>
             <if test="query.type != null">
-                AND `third_type` = #{query.type}
+                AND `type` = #{query.type}
             </if>
             <if test="query.startTime != null">
-                AND report_date >= #{query.startTime}
+                AND reportDate >= #{query.startTime}
             </if>
             <if test="query.endTime != null">
-                AND report_date &lt;= #{query.endTime}
+                AND reportDate &lt;= #{query.endTime}
             </if>
             <if test="query.nodeId != null">
-                AND exam_name_info_id = #{query.nodeId}
+                AND node_id = #{query.nodeId}
             </if>
         </where>
     </select>

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSelfInspectionRecordMapper.java

@@ -46,6 +46,6 @@ public interface TrialSelfInspectionRecordMapper extends BaseMapper<TrialSelfIns
     @Select("select self_id from u_trial_self_quality_project where quality_node_id = #{pKeyId}")
     List<String> selectTrialIdByNodeId(Long pKeyId);
 
-    List<Map<String,Object>> getTrialFilePdfRecord(@Param("nodeId") String nodeId,
+    List<String> getTrialFilePdfRecord(@Param("nodeId") String nodeId,
                                                    @Param("types") List<Integer> types);
 }

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSelfInspectionRecordMapper.xml

@@ -108,8 +108,8 @@
             </if>
         </where>
     </select>
-    <select id="getTrialFilePdfRecord" resultType="java.util.Map">
-        select record_id,type from u_trial_file_pdf_record where node_id = #{nodeId} and `type` in
+    <select id="getTrialFilePdfRecord" resultType="java.lang.String">
+        select record_id from u_trial_file_pdf_record where node_id = #{nodeId} and `type` in
        <foreach collection="types" item="type" open="(" close=")" separator=",">
            #{type}
        </foreach>

+ 18 - 7
blade-service/blade-business/src/main/java/org/springblade/business/scheduled/ChenYuTestScheduled.java

@@ -212,7 +212,7 @@ public class ChenYuTestScheduled {
         }
         try {
             // 构建参数化查询
-            String sql = "SELECT id FROM m_contract_info WHERE contract_number = " + CONTRACT_CODE;
+            String sql = "SELECT id FROM m_contract_info WHERE contract_number = '" + CONTRACT_CODE + "'";
             List<ContractInfo> contracts = jdbcTemplate.query(
                     sql,
                     new BeanPropertyRowMapper<>(ContractInfo.class)
@@ -253,6 +253,8 @@ public class ChenYuTestScheduled {
                     .eq(TrialCyFinishTestReport::getContractId, contractId));
             //等会准备删除的历史数据
             List<Long> ids = list.stream().map(TrialCyFinishTestReport::getId).collect(Collectors.toList());
+            //获取旧数据 task_id 与 id的映射关系
+            Map<Integer, Long> taskIdMap = list.stream().collect(Collectors.toMap(TrialCyFinishTestReport::getTaskId, TrialCyFinishTestReport::getId));
 
             int pageIndex = 0;
             final int pageSize = 100;
@@ -294,7 +296,10 @@ public class ChenYuTestScheduled {
                     for (TrialCyFinishTestReport report : reports) {
                         //数据太长且不需要
                         report.setTestParamInfo(null);
-                        Long id = SnowFlakeUtil.getId();
+                        Long id = taskIdMap.get(report.getTaskId());
+                        if(id == null){
+                            id = SnowFlakeUtil.getId();
+                        }
                         report.setId(id);
                         report.setContractId(contractId);
                         //处理boolean值
@@ -311,9 +316,10 @@ public class ChenYuTestScheduled {
                         //处理附件
                         List<TrialCyAccessories> accessories = report.getAccessories();
                         if (CollectionUtil.isNotEmpty(accessories)) {
+                            Long finalId = id;
                             accessories.forEach(f -> {
                                 f.setId(SnowFlakeUtil.getId());
-                                f.setReportId(id);
+                                f.setReportId(finalId);
                                 if (StringUtil.isNotBlank(f.getFilePath())) {
                                     urls.add(f.getFilePath());
                                 }
@@ -397,7 +403,8 @@ public class ChenYuTestScheduled {
                     .eq(TrialCyThirdReport::getContractId, contractId));
             //等会要删除的id
             List<Long> ids = list.stream().map(TrialCyThirdReport::getPKeyId).collect(Collectors.toList());
-
+            //获取旧数据 id 和 pKId的映射关系
+            Map<String, Long> linkMap = list.stream().collect(Collectors.toMap(TrialCyThirdReport::getId, TrialCyThirdReport::getPKeyId));
 
             int pageIndex = 0;
             final int pageSize = 100;
@@ -448,8 +455,11 @@ public class ChenYuTestScheduled {
                             if (StringUtil.isNotBlank(report.getRecordDocFilePath())) {
                                 urls.add(report.getRecordDocFilePath());
                             }
-
-                            Long id = SnowFlakeUtil.getId();
+                            //如果能通过id找到旧pkid 就使用旧pkid
+                            Long id = linkMap.get(report.getId());
+                            if(id == null){
+                                id = SnowFlakeUtil.getId();
+                            }
                             report.setPKeyId(id);
                             report.setContractId(contractId);
                             //报告类型
@@ -461,9 +471,10 @@ public class ChenYuTestScheduled {
                             //处理附件
                             List<TrialCyAccessories> accessories = report.getAccessories();
                             if (CollectionUtil.isNotEmpty(accessories)) {
+                                Long finalId = id;
                                 accessories.forEach(f -> {
                                     f.setId(SnowFlakeUtil.getId());
-                                    f.setReportId(id);
+                                    f.setReportId(finalId);
 
                                     if (StringUtil.isNotBlank(f.getFilePath())) {
                                         urls.add(f.getFilePath());

+ 8 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyFinishTestReportService.java

@@ -7,6 +7,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import org.springblade.business.vo.ThirdReportVo;
 import org.springblade.business.vo.TrialCyThirdReportQueryVo;
 
+import java.util.List;
+import java.util.Map;
+
 /**
 * @author LHB
 * @description 针对表【u_trial_cy_finish_test_report(成渝-获取标段已完成(已签章完成)的检测报告)】的数据库操作Service
@@ -16,4 +19,9 @@ public interface TrialCyFinishTestReportService extends IService<TrialCyFinishTe
 
     Page<ThirdReportVo> myPage(Page<ThirdReportVo> objectPage,
                                TrialCyThirdReportQueryVo queryVo);
+
+    List<String> selectViewPdfList(List<Long> longList);
+
+    List<Map<String,Object>> selectViewList(List<String> trialFilePdfRecord);
+
 }

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

@@ -15,7 +15,7 @@ import java.util.List;
 public interface TrialCyService {
     Boolean isCyAndTestModule(Long projectId, Long contractId);
 
-    List<TrialCyTestType> getTree(Long projectId, String parentId);
+    List<TrialCyTestType> getTree(Long projectId, String parentId, String contractId);
 
     Page<ThirdReportVo> getTrialDetectionReport(TrialCyThirdReportQueryVo queryVo);
 

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

@@ -12,5 +12,5 @@ import java.util.List;
 */
 public interface TrialCyTestTypeService extends IService<TrialCyTestType> {
 
-    List<TrialCyTestType> getTree(Long projectId, String parentId);
+    List<TrialCyTestType> getTree(Long projectId, String parentId, String contractId);
 }

+ 3 - 19
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyAccessoriesServiceImpl.java

@@ -54,8 +54,7 @@ public class TrialCyAccessoriesServiceImpl extends ServiceImpl<TrialCyAccessorie
 
         baseMapper.clearTrialAssociation(nodeId, recordId);
         //重新生成pdf
-        List<String> listOne = baseMapper.selectFilePdfList(nodeId, 11);
-        List<String> listTwo = baseMapper.selectFilePdfList(nodeId, 11, 12);
+        List<Long> listOne = baseMapper.selectFilePdfList(nodeId, 11,12,13);
 
         InformationQuery informationQuery = informationQueryService.getBaseMapper().selectList(Wrappers.<InformationQuery>lambdaQuery()
                 .eq(InformationQuery::getWbsId, nodeId)
@@ -66,25 +65,10 @@ public class TrialCyAccessoriesServiceImpl extends ServiceImpl<TrialCyAccessorie
         List<String> pdfList = new ArrayList<>();
         //成渝自检
         if (CollectionUtil.isNotEmpty(listOne)) {
-            List<TrialCyFinishTestReport> trialCyFinishTestReports = trialCyFinishTestReportService.getBaseMapper().selectList(Wrappers.<TrialCyFinishTestReport>lambdaQuery()
-                    .in(TrialCyFinishTestReport::getTaskId, listOne));
-            trialCyFinishTestReports.forEach(f -> {
-                if (StringUtils.isNotBlank(f.getAssembleFile())) {
-                    pdfList.add(f.getAssembleFile());
-                }
-            });
+            List<String> pdfFiles = trialCyFinishTestReportService.selectViewPdfList(listOne);
+            pdfList.addAll(pdfFiles);
         }
 
-        //外委-第三方
-        if (CollectionUtil.isNotEmpty(listOne)) {
-            List<TrialCyThirdReport> trialCyThirdReports = trialCyThirdReportService.getBaseMapper().selectList(Wrappers.<TrialCyThirdReport>lambdaQuery()
-                    .in(TrialCyThirdReport::getId, listTwo));
-            trialCyThirdReports.forEach(f -> {
-                if (StringUtils.isNotBlank(f.getAssembleFile())) {
-                    pdfList.add(f.getAssembleFile());
-                }
-            });
-        }
 
         String pdfTrialUrl = informationQuery.getPdfTrialUrl();
         //删除之前的文件

+ 14 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyFinishTestReportServiceImpl.java

@@ -9,6 +9,10 @@ import org.springblade.business.vo.ThirdReportVo;
 import org.springblade.business.vo.TrialCyThirdReportQueryVo;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
 /**
 * @author LHB
 * @description 针对表【u_trial_cy_finish_test_report(成渝-获取标段已完成(已签章完成)的检测报告)】的数据库操作Service实现
@@ -22,6 +26,16 @@ public class TrialCyFinishTestReportServiceImpl extends ServiceImpl<TrialCyFinis
     public Page<ThirdReportVo> myPage(Page<ThirdReportVo> page, TrialCyThirdReportQueryVo queryVo) {
         return baseMapper.myPage(page,queryVo);
     }
+
+    @Override
+    public List<String> selectViewPdfList(List<Long> ids) {
+        return baseMapper.selectViewPdfList(ids);
+    }
+
+    @Override
+    public List<Map<String,Object>> selectViewList(List<String> ids) {
+        return baseMapper.selectViewList(ids);
+    }
 }
 
 

+ 9 - 11
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyServiceImpl.java

@@ -52,29 +52,27 @@ public class TrialCyServiceImpl implements TrialCyService {
     }
 
     @Override
-    public List<TrialCyTestType> getTree(Long projectId, String parentId) {
-        List<TrialCyTestType> list = trialCyTestTypeService.getTree(projectId, parentId);
+    public List<TrialCyTestType> getTree(Long projectId, String parentId, String contractId) {
+        List<TrialCyTestType> list = trialCyTestTypeService.getTree(projectId, parentId, contractId);
         return list;
     }
 
     @Override
     public Page<ThirdReportVo> getTrialDetectionReport(TrialCyThirdReportQueryVo queryVo) {
-        TrialCyTestType byId = trialCyTestTypeService.getById(queryVo.getNodeId());
-        if(StringUtils.isBlank(byId.getId())){
-            return new Page<>();
-        }
-        queryVo.setNodeId(Long.valueOf(byId.getId()));
         Page<ThirdReportVo> page = trialCyFinishTestReportService.myPage(new Page<ThirdReportVo>(queryVo.getCurrent(), queryVo.getSize()),queryVo);
         return page;
     }
 
     @Override
     public Page<ThirdReportVo> getThirdReport(TrialCyThirdReportQueryVo queryVo) {
-        TrialCyTestType byId = trialCyTestTypeService.getById(queryVo.getNodeId());
-        if(StringUtils.isBlank(byId.getId())){
-            return new Page<>();
+        if(queryVo.getType() != null){
+            if(queryVo.getType() == 0){
+                queryVo.setType(3);
+            }
+            if(queryVo.getType() == 1){
+                queryVo.setType(4);
+            }
         }
-        queryVo.setNodeId(Long.valueOf(byId.getId()));
         Page<ThirdReportVo> page = trialCyThirdReportService.myPage(new Page<ThirdReportVo>(queryVo.getCurrent(), queryVo.getSize()), queryVo);
         return page;
     }

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

@@ -18,8 +18,8 @@ import java.util.List;
 public class TrialCyTestTypeServiceImpl extends ServiceImpl<TrialCyTestTypeMapper, TrialCyTestType>
     implements TrialCyTestTypeService {
     @Override
-    public List<TrialCyTestType> getTree(Long projectId, String parentId) {
-        return baseMapper.getTree(projectId, parentId);
+    public List<TrialCyTestType> getTree(Long projectId, String parentId, String contractId) {
+        return baseMapper.getTree(projectId, parentId,contractId);
     }
 }
 

+ 3 - 15
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java

@@ -2051,21 +2051,9 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
                 }
 
                 //成渝自检
-                if (dto.getType().equals(11)) {
-                    List<TrialCyFinishTestReport> trialCyFinishTestReports = trialCyFinishTestReportService.getBaseMapper().selectList(Wrappers.<TrialCyFinishTestReport>lambdaQuery().in(TrialCyFinishTestReport::getTaskId, Func.toLongList(dto.getIds())));
-                    trialCyFinishTestReports.forEach(f -> {
-                        if (StringUtils.isNotBlank(f.getAssembleFile())) {
-                            pdfList.add(f.getAssembleFile());
-                        }
-
-                    });
-                } else if (dto.getType().equals(12) || dto.getType().equals(13)) {
-                    List<TrialCyThirdReport> trialCyThirdReports = trialCyThirdReportService.getBaseMapper().selectList(Wrappers.<TrialCyThirdReport>lambdaQuery().in(TrialCyThirdReport::getId, Func.toLongList(dto.getIds())));
-                    trialCyThirdReports.forEach(f -> {
-                        if (StringUtils.isNotBlank(f.getAssembleFile())) {
-                            pdfList.add(f.getAssembleFile());
-                        }
-                    });
+                if (dto.getType().equals(11) || dto.getType().equals(12) || dto.getType().equals(13)) {
+                    List<String> files = trialCyFinishTestReportService.selectViewPdfList(Func.toLongList(dto.getIds()));
+                    pdfList.addAll(files);
                 }
 
                 if (pdfList.size() > 0) {

+ 121 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/APIController.java

@@ -1,15 +1,23 @@
 package org.springblade.manager.controller;
 
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.jsonwebtoken.Claims;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import me.zhyd.oauth.model.AuthToken;
 import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.jwt.JwtUtil;
+import org.springblade.core.jwt.props.JwtProperties;
+import org.springblade.core.launch.constant.TokenConstant;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.manager.entity.cq.QualityData;
+import org.springblade.manager.entity.cq.ResultApi;
 import org.springblade.manager.service.IWbsTreeContractService;
 import org.springblade.manager.vo.APIWbsContractNodeHzrcVo;
 import org.springblade.manager.vo.APIWbsContractNodeVo;
@@ -17,6 +25,7 @@ import org.springblade.manager.vo.APIWbsContractSubdivisionVo;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -27,7 +36,7 @@ import java.util.Map;
 @RequestMapping("/hczc/api")
 @Api(value = "接口信息", tags = "接口信息类")
 public class APIController extends BladeController {
-
+    private final JwtProperties jwtProperties;
     private final JdbcTemplate jdbcTemplate;
     private final IWbsTreeContractService iWbsTreeContractService;
 
@@ -95,15 +104,123 @@ public class APIController extends BladeController {
         return R.fail(200, "未查询到信息");
     }
 
+
+
+    @GetMapping("/meter/getContractInfo")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "获取合同段信息", notes = "传入项目Id")
+    public ResultApi getContractInfoMeter(@RequestParam String projectId, HttpServletRequest handler) {
+        //解析token
+        String token = handler.getHeader("sx_token");
+        token = JwtUtil.getToken(token);
+        Claims claims = JwtUtil.parseJWT(token);
+        if (token == null || claims == null) {
+            return ResultApi.fail("请求未授权");
+        }
+        String userId = String.valueOf(claims.get(TokenConstant.USER_ID));
+        if(StringUtil.isBlank(userId)){
+            return ResultApi.fail("用户不存在");
+        }
+
+        List<Map<String, Object>> maps = jdbcTemplate.queryForList("SELECT distinct c.id,c.contract_number code,c.contract_name as name from m_contract_info c,m_project_info a  where  c.is_deleted=0 and c.p_id='"+projectId+"'");
+        return ResultApi.success(maps);
+    }
     /**
      * 获取某一合同段的分部分项划分
      */
-    @GetMapping("/getWbsContractSubdivision")
+    @GetMapping("/meter/getWbsContractSubdivision")
     @ApiOperationSupport(order = 5)
     @ApiOperation(value = "获取某一合同段的分部分项划分", notes = "合同")
     @ApiImplicitParam(name = "sectionId", value = "合同段Id", required = true)
-    public R<List<APIWbsContractSubdivisionVo>> getWbsContractSubdivision(String sectionId){
+    public ResultApi getWbsContractSubdivision(@RequestParam String sectionId, HttpServletRequest handler){
+        String token = handler.getHeader("sx_token");
+        token = JwtUtil.getToken(token);
+        Claims claims = JwtUtil.parseJWT(token);
+        if (token == null || claims == null) {
+            return ResultApi.fail("请求未授权");
+        }
+        String userId = String.valueOf(claims.get(TokenConstant.USER_ID));
+        if(StringUtil.isBlank(userId)){
+            return ResultApi.fail("用户不存在");
+        }
+
         List<APIWbsContractSubdivisionVo> list = iWbsTreeContractService.getWbsContractSubdivision(sectionId);
-        return R.data(list);
+        return ResultApi.success(list);
+    }
+
+    /**
+     * 可计量的分部分项编码获取接口
+     */
+    @GetMapping("/meter/getWbsContractSubdivisionMeasurable")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "可计量的分部分项编码获取接口", notes = "合同")
+    @ApiImplicitParam(name = "sectionId", value = "合同段Id", required = true)
+    public ResultApi getWbsContractSubdivisionMeasurable(@RequestParam String projectId,
+                                                         @RequestParam String sectionId,
+                                                         String pid, HttpServletRequest handler){
+        String token = handler.getHeader("sx_token");
+        token = JwtUtil.getToken(token);
+        Claims claims = JwtUtil.parseJWT(token);
+        if (token == null || claims == null) {
+            return ResultApi.fail("请求未授权");
+        }
+        String userId = String.valueOf(claims.get(TokenConstant.USER_ID));
+        if(StringUtil.isBlank(userId)){
+            return ResultApi.fail("用户不存在");
+        }
+
+        Object list = iWbsTreeContractService.getWbsContractSubdivisionMeasurable(projectId, sectionId, pid, true);
+        return ResultApi.success(list);
+    }
+
+    /**
+     * 不可计量的分部分项编码获取接口
+     */
+    @GetMapping("/meter/getWbsContractSubdivisionUnmeasurable")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "不可计量的分部分项编码获取接口", notes = "合同")
+    @ApiImplicitParam(name = "sectionId", value = "合同段Id", required = true)
+    public ResultApi getWbsContractSubdivisionUnmeasurable(@RequestParam String projectId,
+                                                           @RequestParam String sectionId,
+                                                           HttpServletRequest handler){
+        String token = handler.getHeader("sx_token");
+        token = JwtUtil.getToken(token);
+        Claims claims = JwtUtil.parseJWT(token);
+        if (token == null || claims == null) {
+            return ResultApi.fail("请求未授权");
+        }
+        String userId = String.valueOf(claims.get(TokenConstant.USER_ID));
+        if(StringUtil.isBlank(userId)){
+            return ResultApi.fail("用户不存在");
+        }
+
+        Object list = iWbsTreeContractService.getWbsContractSubdivisionMeasurable(projectId, sectionId, null, false);
+        return ResultApi.success(list);
+    }
+
+    /**
+     * 质量资料获取接口
+     */
+    @GetMapping("/meter/qualityDataAcquisition")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "质量资料获取接口", notes = "合同")
+    @ApiImplicitParam(name = "sectionId", value = "合同段Id", required = true)
+    public ResultApi qualityDataAcquisition(@RequestParam String projectId,
+                                            @RequestParam String sectionId,
+                                            @RequestParam String codesId,
+                                            HttpServletRequest handler){
+        String token = handler.getHeader("sx_token");
+        token = JwtUtil.getToken(token);
+        Claims claims = JwtUtil.parseJWT(token);
+        if (token == null || claims == null) {
+            return ResultApi.fail("请求未授权");
+        }
+        String userId = String.valueOf(claims.get(TokenConstant.USER_ID));
+        if(StringUtil.isBlank(userId)){
+            return ResultApi.fail("用户不存在");
+        }
+
+        List<QualityData> list = iWbsTreeContractService.qualityDataAcquisition(projectId, sectionId, codesId);
+        return ResultApi.success(list);
     }
 }

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

@@ -164,7 +164,9 @@ public interface WbsTreeContractMapper extends EasyBaseMapper<WbsTreeContract> {
      * @param contractId
      * @return
      */
-    List<APIWbsContractSubdivisionVo> getWbsContractSubdivision(@Param("contractId") String contractId);
+    List<APIWbsContractSubdivisionVo> getWbsContractSubdivision(@Param("contractId") String contractId,
+                                                                @Param("pid") String pid,
+                                                                @Param("type") Integer type);
 
     /**
      * 获取只当合同段下的分部分项划分节点的祖级节点

+ 10 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml

@@ -1018,6 +1018,7 @@
             CASE
                 WHEN node_type = 18 THEN 1
                 WHEN node_type = 2 THEN 2
+                WHEN node_type = 1 THEN 0
                 ELSE 3
                 END nodeType,
             null levelCode,
@@ -1026,10 +1027,17 @@
         FROM
             `m_wbs_tree_contract`
         WHERE
-            node_type IN ( 2, 4, 18 )
-          AND is_deleted = 0
+          is_deleted = 0
+        <if test="type != null and type == 1">
+            AND node_type IN ( 1, 2, 4, 18 )
+        </if>
           AND status = 1
+          AND type = #{type}
+          AND p_id > 0
           AND contract_id = #{contractId}
+        <if test="pid != null and pid != ''">
+            AND find_in_set(#{pid}, ancestors_p_id)
+        </if>
     </select>
     <select id="getWbsContractSubdivisionParentNode"
             resultType="org.springblade.manager.vo.APIWbsContractSubdivisionVo">

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

@@ -11,6 +11,7 @@ import org.springblade.manager.dto.WbsTreeContractDTO2;
 import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.manager.entity.cq.QualityData;
 import org.springblade.manager.vo.*;
 import org.springframework.core.io.Resource;
 import org.springframework.http.ResponseEntity;
@@ -114,5 +115,7 @@ public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
 
     R moveNode(MoveNodeDTO dto);
 
-    List<WbsTreeContract> queryListByPIds(List<Long> pIds);
+    Object getWbsContractSubdivisionMeasurable(String projectId, String sectionId, String pid, Boolean judgment);
+
+    List<QualityData> qualityDataAcquisition(String projectId, String sectionId, String codesId);
 }

+ 405 - 90
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -59,6 +59,9 @@ import org.springblade.core.tool.utils.*;
 import org.springblade.manager.bean.NodeVO;
 import org.springblade.manager.dto.*;
 import org.springblade.manager.entity.*;
+import org.springblade.manager.entity.cq.Attachment;
+import org.springblade.manager.entity.cq.QualityData;
+import org.springblade.manager.entity.cq.QualityDataFile;
 import org.springblade.manager.excel.WbsExcelBatchUtil;
 import org.springblade.manager.excel.WbsExcelUtil;
 import org.springblade.manager.feign.ContractClient;
@@ -3461,12 +3464,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
 
 
-    @Override
-    public List<WbsTreeContract> queryListByPIds(List<Long> pIds) {
-        return baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
-                .in(WbsTreeContract::getPId, pIds)
-                .eq(WbsTreeContract::getIsDeleted, 0));
-    }
 
     /**
      * 展开所有合并单元格并将值填充到每个单元格
@@ -4591,101 +4588,101 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         executionTime.info("----查询开始----");
 
         // 1. 查询符合条件的节点
-        List<APIWbsContractSubdivisionVo> list = baseMapper.getWbsContractSubdivision(contractId);
+        List<APIWbsContractSubdivisionVo> list = baseMapper.getWbsContractSubdivision(contractId, null, 1);
         if (CollectionUtil.isEmpty(list)) {
             return Collections.emptyList();
         }
 
         // 2. 查询所有节点并构建快速查找结构
-        List<WbsTreeContract> allContract = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
-                .eq(WbsTreeContract::getContractId, contractId)
-                .eq(WbsTreeContract::getType, 1)
-                .isNotNull(WbsTreeContract::getAncestorsPId)
-                .eq(WbsTreeContract::getIsDeleted, 0));
+//        List<WbsTreeContract> allContract = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+//                .eq(WbsTreeContract::getContractId, contractId)
+//                .eq(WbsTreeContract::getType, 1)
+//                .isNotNull(WbsTreeContract::getAncestorsPId)
+//                .eq(WbsTreeContract::getIsDeleted, 0));
 
         // 构建祖先ID到节点列表的映射
-        Map<Long, List<WbsTreeContract>> ancestorMap = new HashMap<>();
-        for (WbsTreeContract node : allContract) {
-            Arrays.stream(node.getAncestorsPId().split(","))
-                    .filter(StringUtils::isNotBlank)
-                    .map(Long::parseLong)
-                    .forEach(ancestorId -> {
-                        ancestorMap.computeIfAbsent(ancestorId, k -> new ArrayList<>()).add(node);
-                    });
-        }
-        executionTime.info("----构建节点映射完成----");
+//        Map<Long, List<WbsTreeContract>> ancestorMap = new HashMap<>();
+//        for (WbsTreeContract node : allContract) {
+//            Arrays.stream(node.getAncestorsPId().split(","))
+//                    .filter(StringUtils::isNotBlank)
+//                    .map(Long::parseLong)
+//                    .forEach(ancestorId -> {
+//                        ancestorMap.computeIfAbsent(ancestorId, k -> new ArrayList<>()).add(node);
+//                    });
+//        }
+//        executionTime.info("----构建节点映射完成----");
 
         // 3. 查询节点附件
-        List<TableFile> nodeFiles = tableFileService.list(Wrappers.<TableFile>lambdaQuery()
-                .eq(TableFile::getContractId, contractId)
-                .in(TableFile::getType, FILE_TYPES)
-                .eq(TableFile::getIsDeleted, 0));
-
-        // 构建附件查找表 (tabId -> 类型集合)
-        Map<Long, Set<Integer>> fileTypeMap = new HashMap<>();
-        for (TableFile file : nodeFiles) {
-            fileTypeMap.computeIfAbsent(Long.valueOf(file.getTabId()), k -> new HashSet<>())
-                    .add(file.getType());
-        }
-        executionTime.info("----构建附件映射完成----");
+//        List<TableFile> nodeFiles = tableFileService.list(Wrappers.<TableFile>lambdaQuery()
+//                .eq(TableFile::getContractId, contractId)
+//                .in(TableFile::getType, FILE_TYPES)
+//                .eq(TableFile::getIsDeleted, 0));
+//
+//        // 构建附件查找表 (tabId -> 类型集合)
+//        Map<Long, Set<Integer>> fileTypeMap = new HashMap<>();
+//        for (TableFile file : nodeFiles) {
+//            fileTypeMap.computeIfAbsent(Long.valueOf(file.getTabId()), k -> new HashSet<>())
+//                    .add(file.getType());
+//        }
+//        executionTime.info("----构建附件映射完成----");
 
         // 4. 查询审批信息
-        List<InformationQuery> oneQuery = informationQueryClient.getInformationByContractId(Long.valueOf(contractId), 1);
-        Set<Long> oneQueryWbsIds = oneQuery.stream().map(InformationQuery::getWbsId).collect(Collectors.toSet());
-
-        List<InformationQuery> twoQuery = informationQueryClient.getInformationByContractId(Long.valueOf(contractId), 2);
-        Set<Long> twoQueryWbsIds = twoQuery.stream().map(InformationQuery::getWbsId).collect(Collectors.toSet());
-
-        Set<Long> allQueryIds = new HashSet<>();
-        allQueryIds.addAll(oneQueryWbsIds);
-        allQueryIds.addAll(twoQueryWbsIds);
-        executionTime.info("----获取审批信息完成----");
-
+//        List<InformationQuery> oneQuery = informationQueryClient.getInformationByContractId(Long.valueOf(contractId), 1);
+//        Set<Long> oneQueryWbsIds = oneQuery.stream().map(InformationQuery::getWbsId).collect(Collectors.toSet());
+//
+//        List<InformationQuery> twoQuery = informationQueryClient.getInformationByContractId(Long.valueOf(contractId), 2);
+//        Set<Long> twoQueryWbsIds = twoQuery.stream().map(InformationQuery::getWbsId).collect(Collectors.toSet());
+//
+//        Set<Long> allQueryIds = new HashSet<>();
+//        allQueryIds.addAll(oneQueryWbsIds);
+//        allQueryIds.addAll(twoQueryWbsIds);
+//        executionTime.info("----获取审批信息完成----");
+//
         // 5. 处理每个节点
-        for (APIWbsContractSubdivisionVo vo : list) {
-            // 6. 从映射中直接获取子节点
-            List<WbsTreeContract> children = ancestorMap.getOrDefault(vo.getId(), Collections.emptyList());
-            if (CollectionUtil.isEmpty(children)) {
-                continue;
-            }
-
-            // 7. 数据匹配处理
-            Set<Long> childrenIds = children.stream()
-                    .map(WbsTreeContract::getPKeyId)
-                    .collect(Collectors.toSet());
-
-            // 交工证书判断
-            List<Long> completionCertificate = children.stream()
-                    .filter(node -> node.getMajorDataType() != null && node.getMajorDataType() == 3)
-                    .map(WbsTreeContract::getPKeyId)
-                    .collect(Collectors.toList());
-            if (CollectionUtil.isNotEmpty(completionCertificate)) {
-                vo.setCompletionCertificate(allQueryIds.containsAll(completionCertificate));
-            }
-
-            // 附件报告判断
-            vo.setStrengthReportSeven(childrenIds.stream().anyMatch(id ->
-                    fileTypeMap.getOrDefault(id, Collections.emptySet()).contains(11)));
-            vo.setStrengthReportTwentyEight(childrenIds.stream().anyMatch(id ->
-                    fileTypeMap.getOrDefault(id, Collections.emptySet()).contains(12)));
-            vo.setPileInspectionReport(childrenIds.stream().anyMatch(id ->
-                    fileTypeMap.getOrDefault(id, Collections.emptySet()).contains(13)));
-
-            // 评定资料判断
-            List<Long> evaluationNodes = children.stream()
-                    .filter(node -> node.getMajorDataType() != null && node.getMajorDataType() == 2)
-                    .map(WbsTreeContract::getPKeyId)
-                    .collect(Collectors.toList());
-            if (CollectionUtil.isNotEmpty(evaluationNodes)) {
-                vo.setEvaluationData(allQueryIds.containsAll(evaluationNodes));
-            }
-
-            // 施工收监报告
-            processApprovalData(vo, children, SG_SET, oneQueryWbsIds, "qualityInspectionData");
-
-            // 监理收监报告
-            processApprovalData(vo, children, JL_SET, twoQueryWbsIds, "supervisionData");
-        }
+//        for (APIWbsContractSubdivisionVo vo : list) {
+//            // 6. 从映射中直接获取子节点
+//            List<WbsTreeContract> children = ancestorMap.getOrDefault(vo.getId(), Collections.emptyList());
+//            if (CollectionUtil.isEmpty(children)) {
+//                continue;
+//            }
+//
+//            // 7. 数据匹配处理
+//            Set<Long> childrenIds = children.stream()
+//                    .map(WbsTreeContract::getPKeyId)
+//                    .collect(Collectors.toSet());
+//
+//            // 交工证书判断
+//            List<Long> completionCertificate = children.stream()
+//                    .filter(node -> node.getMajorDataType() != null && node.getMajorDataType() == 3)
+//                    .map(WbsTreeContract::getPKeyId)
+//                    .collect(Collectors.toList());
+//            if (CollectionUtil.isNotEmpty(completionCertificate)) {
+//                vo.setCompletionCertificate(allQueryIds.containsAll(completionCertificate));
+//            }
+//
+//            // 附件报告判断
+//            vo.setStrengthReportSeven(childrenIds.stream().anyMatch(id ->
+//                    fileTypeMap.getOrDefault(id, Collections.emptySet()).contains(11)));
+//            vo.setStrengthReportTwentyEight(childrenIds.stream().anyMatch(id ->
+//                    fileTypeMap.getOrDefault(id, Collections.emptySet()).contains(12)));
+//            vo.setPileInspectionReport(childrenIds.stream().anyMatch(id ->
+//                    fileTypeMap.getOrDefault(id, Collections.emptySet()).contains(13)));
+//
+//            // 评定资料判断
+//            List<Long> evaluationNodes = children.stream()
+//                    .filter(node -> node.getMajorDataType() != null && node.getMajorDataType() == 2)
+//                    .map(WbsTreeContract::getPKeyId)
+//                    .collect(Collectors.toList());
+//            if (CollectionUtil.isNotEmpty(evaluationNodes)) {
+//                vo.setEvaluationData(allQueryIds.containsAll(evaluationNodes));
+//            }
+//
+//            // 施工收监报告
+//            processApprovalData(vo, children, SG_SET, oneQueryWbsIds, "qualityInspectionData");
+//
+//            // 监理收监报告
+//            processApprovalData(vo, children, JL_SET, twoQueryWbsIds, "supervisionData");
+//        }
 
         executionTime.info("----组装完成----");
         executionTime.brief();
@@ -5734,7 +5731,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
 
     // 抽取公共处理逻辑
-    private void processApprovalData(APIWbsContractSubdivisionVo vo,
+    private void processApprovalData(APIWbsContractSubdivisionExpandVo vo,
                                      List<WbsTreeContract> children,
                                      Set<Integer> ownerSet,
                                      Set<Long> approvalIds,
@@ -5772,4 +5769,322 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         }
         return baseMapper.selectList(eq);
     }
+
+    @Override
+    public Object getWbsContractSubdivisionMeasurable(String projectId, String contractId, String pid, Boolean judgment) {
+        // 1. 静态数组转为静态常量
+        final Set<Integer> SG_SET = Collections.unmodifiableSet(
+                new HashSet<>(Arrays.asList(1, 2, 3))
+        );
+        final Set<Integer> JL_SET = Collections.unmodifiableSet(
+                new HashSet<>(Arrays.asList(4,5,6))
+        );
+        final Set<Integer> FILE_TYPES = Collections.unmodifiableSet(
+                new HashSet<>(Arrays.asList(11, 12, 13))
+        );
+        ExecutionTime executionTime = new ExecutionTime();
+        executionTime.info("----查询开始----");
+
+        // 1. 查询符合条件的节点
+        List<APIWbsContractSubdivisionVo> list1 = baseMapper.getWbsContractSubdivision(contractId, pid, 1);
+
+        List<APIWbsContractSubdivisionExpandVo> list = BeanUtil.copyProperties(list1, APIWbsContractSubdivisionExpandVo.class);
+
+
+        if (CollectionUtil.isEmpty(list)) {
+            return Collections.emptyList();
+        }
+
+
+        // 2. 查询所有节点并构建快速查找结构
+        List<WbsTreeContract> allContract = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                .eq(WbsTreeContract::getContractId, contractId)
+                .eq(WbsTreeContract::getType, 1)
+                .isNotNull(WbsTreeContract::getAncestorsPId)
+                .eq(WbsTreeContract::getIsDeleted, 0));
+
+        // 构建祖先ID到节点列表的映射
+        Map<Long, List<WbsTreeContract>> ancestorMap = new HashMap<>();
+        for (WbsTreeContract node : allContract) {
+            Arrays.stream(node.getAncestorsPId().split(","))
+                    .filter(StringUtils::isNotBlank)
+                    .map(Long::parseLong)
+                    .forEach(ancestorId -> {
+                        ancestorMap.computeIfAbsent(ancestorId, k -> new ArrayList<>()).add(node);
+                    });
+        }
+        executionTime.info("----构建节点映射完成----");
+
+        // 3. 查询节点附件
+        List<TableFile> nodeFiles = tableFileService.list(Wrappers.<TableFile>lambdaQuery()
+                .eq(TableFile::getContractId, contractId)
+                .in(TableFile::getType, FILE_TYPES)
+                .eq(TableFile::getIsDeleted, 0));
+
+        // 构建附件查找表 (tabId -> 类型集合)
+        Map<Long, Set<Integer>> fileTypeMap = new HashMap<>();
+        for (TableFile file : nodeFiles) {
+            fileTypeMap.computeIfAbsent(Long.valueOf(file.getTabId()), k -> new HashSet<>())
+                    .add(file.getType());
+        }
+        executionTime.info("----构建附件映射完成----");
+
+        // 4. 查询审批信息
+        List<InformationQuery> oneQuery = informationQueryClient.getInformationByContractId(Long.valueOf(contractId), 1);
+        Set<Long> oneQueryWbsIds = oneQuery.stream().map(InformationQuery::getWbsId).collect(Collectors.toSet());
+
+        List<InformationQuery> twoQuery = informationQueryClient.getInformationByContractId(Long.valueOf(contractId), 2);
+        Set<Long> twoQueryWbsIds = twoQuery.stream().map(InformationQuery::getWbsId).collect(Collectors.toSet());
+
+        Set<Long> allQueryIds = new HashSet<>();
+        allQueryIds.addAll(oneQueryWbsIds);
+        allQueryIds.addAll(twoQueryWbsIds);
+        executionTime.info("----获取审批信息完成----");
+        // 5. 处理每个节点
+        for (APIWbsContractSubdivisionExpandVo vo : list) {
+            // 6. 从映射中直接获取子节点
+            List<WbsTreeContract> children = ancestorMap.getOrDefault(vo.getId(), Collections.emptyList());
+            if (CollectionUtil.isEmpty(children)) {
+                continue;
+            }
+
+            // 7. 数据匹配处理
+            Set<Long> childrenIds = children.stream()
+                    .map(WbsTreeContract::getPKeyId)
+                    .collect(Collectors.toSet());
+
+            // 交工证书判断
+            List<Long> completionCertificate = children.stream()
+                    .filter(node -> node.getMajorDataType() != null && node.getMajorDataType() == 3)
+                    .map(WbsTreeContract::getPKeyId)
+                    .collect(Collectors.toList());
+            if (CollectionUtil.isNotEmpty(completionCertificate)) {
+                vo.setCompletionCertificate(allQueryIds.containsAll(completionCertificate));
+            }
+
+            // 附件报告判断
+            vo.setStrengthReportSeven(childrenIds.stream().anyMatch(id ->
+                    fileTypeMap.getOrDefault(id, Collections.emptySet()).contains(11)));
+            vo.setStrengthReportTwentyEight(childrenIds.stream().anyMatch(id ->
+                    fileTypeMap.getOrDefault(id, Collections.emptySet()).contains(12)));
+            vo.setPileInspectionReport(childrenIds.stream().anyMatch(id ->
+                    fileTypeMap.getOrDefault(id, Collections.emptySet()).contains(13)));
+            // 评定资料判断
+            List<Long> evaluationNodes = children.stream()
+                    .filter(node -> node.getMajorDataType() != null && node.getMajorDataType() == 2)
+                    .map(WbsTreeContract::getPKeyId)
+                    .collect(Collectors.toList());
+            if (CollectionUtil.isNotEmpty(evaluationNodes)) {
+                vo.setEvaluationData(allQueryIds.containsAll(evaluationNodes));
+            }
+
+            // 施工收监报告
+            processApprovalData(vo, children, SG_SET, oneQueryWbsIds, "qualityInspectionData");
+
+            // 监理收监报告
+            processApprovalData(vo, children, JL_SET, twoQueryWbsIds, "supervisionData");
+
+        }
+        executionTime.info("----组装完成----");
+        executionTime.brief();
+        if(judgment){
+            return list.stream().filter(f -> f.getCompletionCertificate() || f.getStrengthReportSeven() || f.getStrengthReportTwentyEight()).collect(Collectors.toList());
+        }else{
+            List<String> collect = list.stream().filter(f -> !f.getCompletionCertificate() && !f.getStrengthReportSeven() && !f.getStrengthReportTwentyEight()).map(APIWbsContractSubdivisionExpandVo::getId).map(String::valueOf).collect(Collectors.toList());
+            //若返回合同段ID,则表示该合同段都不允许计量
+            if(collect.size() == list.size()){
+                collect.clear();
+                collect.add(contractId);
+            }
+            return collect;
+        }
+
+    }
+
+    @Override
+    public List<QualityData> qualityDataAcquisition(String projectId, String contractId, String codesId) {
+        final Set<Integer> NODE_TYPES = Collections.unmodifiableSet(
+                new HashSet<>(Arrays.asList(2, 8, 9))
+        );
+        //所有表单父级id
+        Set<Long> ids = new HashSet<>();
+        ArrayList<QualityData> qualityDatas = new ArrayList<>();
+
+        //1、根据codesId 获取所有子级节点的表单
+        List<String> pIds = Arrays.asList(codesId.split(","));
+        // 1. 查询符合条件的节点
+        pIds.forEach(pId -> {
+            List<APIWbsContractSubdivisionVo> list = baseMapper.getWbsContractSubdivision(contractId, pId, 2);
+            if(CollectionUtil.isNotEmpty(list)){
+                ids.addAll(list.stream().map(APIWbsContractSubdivisionVo::getPid).collect(Collectors.toSet()));
+            }
+        });
+
+        //查询所有有pdf的资料
+        List<InformationQuery> oneQuery = informationQueryClient.getInformationByContractIdAll(Long.valueOf(contractId));
+        if(CollectionUtil.isEmpty(oneQuery)){
+            oneQuery = new ArrayList<>();
+        }
+        //根据wbs分组
+        Map<Long, List<InformationQuery>> collect = oneQuery.stream().filter(f -> StringUtils.isNotBlank(f.getPdfUrl())).collect(Collectors.groupingBy(InformationQuery::getWbsId));
+        //查询当前合同下所有附件资料
+        List<TableFile> list = tableFileService.list(Wrappers.<TableFile>lambdaQuery().eq(TableFile::getContractId, Long.valueOf(contractId)));
+        Map<String, List<TableFile>> collect1 = list.stream().collect(Collectors.groupingBy(TableFile::getTabId));
+
+
+        //查询所有父节点
+        List<WbsTreeContract> list1 = wbsTreeContractMapper.selectBatchIds(ids);
+        list1 = list1.stream().sorted(Comparator.comparing(WbsTreeContract::getSort)).collect(Collectors.toList());
+        //排序
+        list1.sort(this::compareAncestors);
+
+        for (int i = 0; i < list1.size(); i++) {
+            WbsTreeContract wbsTreeContract = list1.get(i);
+            Long f = wbsTreeContract.getPKeyId();
+            QualityData qualityData = new QualityData();
+
+            List<InformationQuery> informationQueries = collect.get(f);
+            if(CollectionUtil.isNotEmpty(informationQueries)){
+                String type = "99";
+                String typename;
+                if(wbsTreeContract.getMajorDataType() == 1){
+                    type = "1";
+                    typename = "开工报告";
+                }else if(NODE_TYPES.contains(wbsTreeContract.getMajorDataType())){
+                    type = "4";
+                    typename = "评定报告及表格对应的附件";
+                }else if(wbsTreeContract.getMajorDataType() == 3){
+                    type = "5";
+                    typename = "交工证书";
+                }else if(wbsTreeContract.getMajorDataType() == 4){
+                    if(informationQueries.size() == 2){
+                        type = "2,3";
+                        typename = "工序资料、监理抽检资料";
+                    }else{
+                        if(informationQueries.get(0).getClassify() == 1){
+                            type = "2";
+                            typename = "工序资料";
+                        }else{
+                            type = "3";
+                            typename = "监理抽检资料";
+                        }
+                    }
+                } else {
+                    typename = "其他";
+                }
+                //当前节点下的附件
+                List<TableFile> tableFiles = collect1.get(f.toString());
+                //根据类型分组
+                Map<Integer, List<TableFile>> collect2;
+                if(CollectionUtil.isNotEmpty(tableFiles)){
+                    //根据类型分组
+                    collect2 = tableFiles.stream().collect(Collectors.groupingBy(TableFile::getClassify));
+                } else {
+                    collect2 = null;
+                }
+                //封装数据
+                qualityData.setType(type);
+                qualityData.setTypename(typename);
+                qualityData.setTypeOrder(i + 1);
+
+                ArrayList<QualityDataFile> qualityDataFiles = new ArrayList<>();
+                //封装文件
+                informationQueries.forEach(f1 -> {
+                    QualityDataFile file = new QualityDataFile();
+                    file.setName(f1.getName());
+                    if(wbsTreeContract.getMajorDataType() == 4){
+                        if(f1.getClassify() == 1) {
+                            file.setTypeName("工序资料");
+                        } else {
+                            file.setTypeName("监理抽检资料");
+                        }
+                    }else{
+                        file.setTypeName(typename);
+                    }
+
+                    file.setOrder(String.valueOf(f1.getSort()));
+                    file.setUrl(f1.getPdfUrl());
+
+                    //封装附件
+                    if(collect2 != null){
+                        List<TableFile> tableFiles1 = collect2.get(f1.getClassify());
+                        if(CollectionUtil.isNotEmpty(tableFiles1)){
+                            List<Attachment> attachmentArrList = new ArrayList<Attachment>();
+                            tableFiles1.forEach(f2 -> {
+                                Attachment attachment = new Attachment();
+                                attachment.setName(f2.getName());
+                                attachment.setOrder(String.valueOf(f2.getSort()));
+                                attachment.setUrl(f2.getDomainPdfUrl());
+                                attachmentArrList.add(attachment);
+                            });
+                            file.setAttachments(attachmentArrList);
+                        }
+                    }
+
+                    qualityDataFiles.add(file);
+                });
+                qualityData.setFiles(qualityDataFiles);
+                qualityDatas.add(qualityData);
+            }
+        }
+
+        //3、根据id获取query表中资料文件
+        return qualityDatas;
+    }
+
+    /**
+     * 比较两个祖级路径
+     */
+    private int compareAncestors(WbsTreeContract obj1, WbsTreeContract obj2) {
+        String ancestors1 = obj1.getAncestorsPId();
+        String ancestors2 = obj2.getAncestorsPId();
+        if (ancestors1 == null && ancestors2 == null) return 0;
+        if (ancestors1 == null) return -1;
+        if (ancestors2 == null) return 1;
+
+        String[] arr1 = ancestors1.split(",");
+        String[] arr2 = ancestors2.split(",");
+
+        int minLength = Math.min(arr1.length, arr2.length);
+
+        // 比较相同索引的ID
+        for (int i = 0; i < minLength; i++) {
+            String id1 = arr1[i].trim();
+            String id2 = arr2[i].trim();
+
+            if (!id1.equals(id2)) {
+                // 查询数据库获取排序值
+                Integer sort1 = wbsTreeContractMapper.selectById(id1).getSort();
+                Integer sort2 = wbsTreeContractMapper.selectById(id2).getSort();
+
+                // 比较排序值
+                if (sort1 != null && sort2 != null) {
+                    return Integer.compare(sort1, sort2);
+                } else if (sort1 != null) {
+                    return -1;
+                } else if (sort2 != null) {
+                    return 1;
+                } else {
+                    return id1.compareTo(id2); // 降级方案
+                }
+            }
+        }
+        // 如果共同部分都相同,说明是同级节点
+        if (arr1.length == arr2.length) {
+            Integer sort1 = obj1.getSort();
+            Integer sort2 = obj2.getSort();
+            if (sort1 != null && sort2 != null) {
+                return Integer.compare(sort1, sort2);
+            } else if (sort1 != null) {
+                return -1;
+            } else if (sort2 != null) {
+                return 1;
+            } else {
+                return 0; // 都没有排序值,保持原顺序
+            }
+        }
+
+        // 如果共同部分都相同,长度短的排在前面(父级在子级前面)
+        return Integer.compare(arr1.length, arr2.length);
+    }
 }