瀏覽代碼

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

lvy 1 月之前
父節點
當前提交
27be8cb212
共有 100 個文件被更改,包括 3367 次插入175 次删除
  1. 2 0
      blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java
  2. 17 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/FindAndReplaceDto1.java
  3. 20 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/StartTimeAndEndTime.java
  4. 53 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialClassificationTreeDTO.java
  5. 11 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialClassificationTreeDTO1.java
  6. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialFileSubmitDTO.java
  7. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialSelfInspectionRecordPageDTO.java
  8. 79 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialSystemDockingDTO.java
  9. 48 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialSystemDockingDTO1.java
  10. 12 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ArchiveFile.java
  11. 97 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ContractLogMonthPack.java
  12. 7 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/InformationQuery.java
  13. 4 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/Task.java
  14. 69 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialClassificationTree.java
  15. 59 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyAccessories.java
  16. 149 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyFinishTestReport.java
  17. 54 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyTestType.java
  18. 285 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyThirdReport.java
  19. 101 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialSystemDocking.java
  20. 14 7
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/WbsTreeContractStatistics.java
  21. 8 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java
  22. 5 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ImageClassificationFileClient.java
  23. 24 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TrialCyAccessoriesClient.java
  24. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/WbsTreeContractStatisticsClient.java
  25. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/BusinessTaskPageVO.java
  26. 45 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ChekPdfPaceVo.java
  27. 9 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ContractLogVO.java
  28. 13 3
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/InformationQueryVO.java
  29. 64 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/NeiYeLedgerVO.java
  30. 9 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/NeiYeQueryVO.java
  31. 36 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/QueryProcessDataVO.java
  32. 20 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ThirdReportVo.java
  33. 50 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialClassificationTreeVO.java
  34. 32 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialCyThirdReportQueryVo.java
  35. 84 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSystemDockingVO.java
  36. 4 1
      blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/vo/SealStrategyVO.java
  37. 11 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/MoveNodeDTO.java
  38. 17 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsInfoDTO.java
  39. 4 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/Album.java
  40. 36 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/AlbumImages.java
  41. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ContractInfo.java
  42. 20 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ProjectInfo.java
  43. 7 4
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/TableFile.java
  44. 3 3
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/TextdictInfo.java
  45. 83 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/UserProjectInfoCollect.java
  46. 13 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsInfo.java
  47. 67 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreeContractExtend.java
  48. 61 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreeContractOldHtml.java
  49. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreePrivate.java
  50. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClient.java
  51. 18 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/INodeBaseInfoServiceClient.java
  52. 2 2
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/TableFileClient.java
  53. 7 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsParamClient.java
  54. 7 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java
  55. 25 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractOldHtmlClient.java
  56. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/AppWbsTreeContractVO.java
  57. 4 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveSyncLogVO.java
  58. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ContractInfoVO.java
  59. 3 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ExceTabTreVO.java
  60. 19 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ExcelTabVO.java
  61. 1 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ExcelTabVo1.java
  62. 17 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ProjectInfoVO.java
  63. 33 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ProjectInfoVO3.java
  64. 4 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TextdictInfoVO.java
  65. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TreeNodeVO.java
  66. 1 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsNodeTableVO.java
  67. 2 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractLazyVO.java
  68. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractTreeAllVO.java
  69. 39 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateQueryVO.java
  70. 34 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateTableVO.java
  71. 12 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateVO.java
  72. 1 1
      blade-service/blade-archive/pom.xml
  73. 25 8
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java
  74. 12 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java
  75. 36 31
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  76. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java
  77. 42 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ContractLogController.java
  78. 143 16
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  79. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/MessageWarningController.java
  80. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/NeiWaiYeProgressController.java
  81. 94 10
      blade-service/blade-business/src/main/java/org/springblade/business/controller/NeiYeController.java
  82. 19 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/RecycleBinController.java
  83. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/StandardInfoController.java
  84. 50 9
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  85. 207 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialClassificationTreeController.java
  86. 100 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialCyController.java
  87. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java
  88. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialMaterialController.java
  89. 166 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialSystemDockingController.java
  90. 28 6
      blade-service/blade-business/src/main/java/org/springblade/business/controller/UserViewProjectContractController.java
  91. 103 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java
  92. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ImageClassificationFileClientImpl.java
  93. 118 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TrialCyAccessoriesClientImpl.java
  94. 15 5
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/WbsTreeContractStatisticsClientImpl.java
  95. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.java
  96. 9 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml
  97. 18 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ContractLogMonthPackMapper.java
  98. 28 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ContractLogMonthPackMapper.xml
  99. 54 51
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.xml
  100. 9 2
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.java

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

@@ -66,6 +66,8 @@ public class AuthProvider {
         DEFAULT_SKIP_URL.add("/getPk"); //成渝第三方登录获取公钥
         DEFAULT_SKIP_URL.add("/getQualityTestingToken"); //成渝第三方登录获取质检系统tokne
         DEFAULT_SKIP_URL.add("/getArchiveToken"); //成渝第三方登录获取档案系统tokne
+        DEFAULT_SKIP_URL.add("/trialclassificationtree/**"); //德飞第三方登录获取质检系统tokne
+        DEFAULT_SKIP_URL.add("/trialsystemdocking/**"); //德飞第三方登录获取档案系统tokne
 
     }
 

+ 17 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/FindAndReplaceDto1.java

@@ -0,0 +1,17 @@
+package org.springblade.business.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springblade.archive.dto.FindAndReplaceDto;
+import org.springblade.business.entity.ArchiveFile;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class FindAndReplaceDto1 {
+    private FindAndReplaceDto dto;
+    private List<ArchiveFile> list;
+}

+ 20 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/StartTimeAndEndTime.java

@@ -0,0 +1,20 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author LHB
+ */
+@Data
+public class StartTimeAndEndTime {
+    @ApiModelProperty("开始时间")
+    @NotBlank(message = "开始时间不能为空")
+    private String startTime;
+    @ApiModelProperty("结束时间")
+    @NotBlank(message = "结束时间不能为空")
+    private String endTime;
+}

+ 53 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialClassificationTreeDTO.java

@@ -0,0 +1,53 @@
+/*
+ *      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.business.dto;
+
+import org.springblade.business.entity.TrialClassificationTree;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 德飞试验系统检测分类树数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2025-08-15
+ */
+@Data
+public class TrialClassificationTreeDTO {
+	private static final long serialVersionUID = 1L;
+
+
+	private Long id;
+
+	/**
+	 * 父级ID
+	 */
+	private Long parentId;
+
+	/**
+	 * 项目ID
+	 */
+
+	private Long projectId;
+
+	/**
+	 * 分类名称
+	 */
+	private String classificationName;
+
+
+}

+ 11 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialClassificationTreeDTO1.java

@@ -0,0 +1,11 @@
+package org.springblade.business.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class TrialClassificationTreeDTO1 {
+   private List<TrialClassificationTreeDTO> list;
+   private Integer groupType;
+}

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialFileSubmitDTO.java

@@ -24,4 +24,7 @@ public class TrialFileSubmitDTO implements Serializable {
     @ApiModelProperty(value = "合同段id")
     private String contractId;
 
+    @ApiModelProperty(value = "附件类型(table_file_type 字典数据)")
+    private String tableFileType;
+
 }

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialSelfInspectionRecordPageDTO.java

@@ -27,4 +27,7 @@ public class TrialSelfInspectionRecordPageDTO extends TrialSelfInspectionRecord
 
     @ApiModelProperty(value = "排序类型, 1 记录/报告编号升序, 2 记录/报告编号降序, 3 规格型号升序, 4 规格型号降序")
     private String sortType;
+
+    @ApiModelProperty("类型:0-施工,1-监理,2-业主")
+    private Integer reportType;
 }

+ 79 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialSystemDockingDTO.java

@@ -0,0 +1,79 @@
+/*
+ *      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.business.dto;
+
+import org.springblade.business.entity.TrialSystemDocking;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 德飞试验系统对接表数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2025-08-15
+ */
+@Data
+public class TrialSystemDockingDTO {
+	private static final long serialVersionUID = 1L;
+	/**
+	 * 项目Id
+	 */
+	@NotNull(message = "projectId 不能为空")
+	private Long projectId;
+	/**
+	 * 报告文件名称
+	 */
+	private String reportName;
+	/**
+	 * 报告编号
+	 */
+	private String reportNumber;
+	/**
+	 * 单位名称
+	 */
+	private String unitName;
+	/**
+	 * 所属检测分类id
+	 */
+	@NotNull(message = "projectId 不能为空")
+	private Long classificationId;
+	/**
+	 * 规格型号
+	 */
+	private String specification;
+	/**
+	 * 报告类型(1原材检测报告,2现场检测报告,3外委报告,4第三方检测报告)
+	 */
+	private Integer reportType;
+	/**
+	 * 工程用途及部位
+	 */
+	private String purposeLocation;
+	/**
+	 * 报告日期(20250822)
+	 */
+	private String reportDate;
+	/**
+	 * 原文件地址
+	 */
+	private String fileUrl;
+
+	private String personInCharge;
+
+}

+ 48 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialSystemDockingDTO1.java

@@ -0,0 +1,48 @@
+package org.springblade.business.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class TrialSystemDockingDTO1 {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 主键
+     */
+    private Long id;
+    /**
+     * 报告文件名称
+     */
+    private String reportName;
+    /**
+     * 报告编号
+     */
+    private String reportNumber;
+    /**
+     * 单位名称
+     */
+    private String unitName;
+    /**
+     * 规格型号
+     */
+    private String specification;
+    /**
+     * 报告类型(1原材检测报告,2现场检测报告,3外委报告,4第三方检测报告)
+     */
+    private Integer reportType;
+    /**
+     * 工程用途及部位
+     */
+    private String purposeLocation;
+    /**
+     * 报告日期(20250822)
+     */
+    private String reportDate;
+    /**
+     * 原文件地址
+     */
+    private String fileUrl;
+
+    private String personInCharge;
+}

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

@@ -304,6 +304,11 @@ public class ArchiveFile extends BaseEntity {
      */
     @ApiModelProperty("u_image_classification_file_id表中的主键id")
     private Long uImageClassificationFileId;
+    /**
+     * m_album表中的主键id
+     */
+    @ApiModelProperty("u_image_classification_file_id表中的主键id")
+    private Long mAlbumId;
 
     /**
      * 归档文件储存类型,可看代码枚举
@@ -331,6 +336,8 @@ public class ArchiveFile extends BaseEntity {
     private String outId;
 
     private String sortNum;
+
+    private String remark;
     @ApiModelProperty("是否锁定 1已锁定")
     private Integer isLock;
 
@@ -448,6 +455,10 @@ public class ArchiveFile extends BaseEntity {
             this.fileTime = "";
             return;
         }
-        this.fileTime = fileTime.replaceAll("[^0-9]", "");
+        if (fileTime.contains("~")) {
+            this.fileTime = fileTime;
+        } else {
+            this.fileTime = fileTime.replaceAll("[^0-9]", "");
+        }
     }
 }

+ 97 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ContractLogMonthPack.java

@@ -0,0 +1,97 @@
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.util.Date;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 日志按月封装表
+ * @TableName u_contract_log_month_pack
+ */
+@TableName(value ="u_contract_log_month_pack")
+@Data
+public class ContractLogMonthPack {
+    /**
+     * 
+     */
+    @TableId
+    @ApiModelProperty("id")
+    private Long id;
+
+    /**
+     * 项目id
+     */
+    @ApiModelProperty("项目id")
+    private Long projectId;
+
+    /**
+     * 合同段id
+     */
+    @ApiModelProperty("合同段id")
+    private Long contractId;
+
+    /**
+     * 私有WBS树p_key_id
+     */
+    @ApiModelProperty("私有WBS树p_key_id")
+    private Long wbsNodeId;
+
+    /**
+     *  日志类型
+     */
+    @ApiModelProperty("日志类型")
+    private Integer wbsNodeType;
+
+    /**
+     * 文件名称
+     */
+    @ApiModelProperty("文件名称")
+    private String fileName;
+
+    /**
+     * 上当月中最后一份文件的日期
+     */
+    @ApiModelProperty("上当月中最后一份文件的日期")
+    private String recordTime;
+
+    /**
+     * 合同段名称
+     */
+    @ApiModelProperty("合同段名称(责任者)")
+    private String contractName;
+
+    /**
+     *  页数
+     */
+    @ApiModelProperty("页数")
+    private Integer page;
+
+    /**
+     * pdf路径
+     */
+    @ApiModelProperty("pdf路径")
+    private String pdfUrl;
+
+    /**
+     *  创建时间
+     */
+    private Date createTime;
+
+    /**
+     *  创建人
+     */
+    private Long createUser;
+
+    /**
+     *  修改时间
+     */
+    private Date updateTime;
+
+    /**
+     *  修改人
+     */
+    private Long updateUser;
+}

+ 7 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/InformationQuery.java

@@ -143,4 +143,11 @@ public class InformationQuery extends BaseEntity {
 
     @ApiModelProperty("重刷次数:如果次数大于5次 每次都是3,就停止重刷")
     private Integer saveAgainCount;
+
+    @ApiModelProperty("0-未检出,1-已提交,2-检查无误,3-检查有误")
+    private Integer chekStatus;
+
+    @ApiModelProperty("检查描述")
+    private String checkDesc;
+
 }

+ 4 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/Task.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.business.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 
 import java.io.Serializable;
@@ -178,4 +179,7 @@ public class Task extends BaseEntity {
     @ApiModelProperty("计量任务是否生成审计意见单 1是0否")
     private Integer isBuildAudit;
 
+    @ApiModelProperty("电签状态")
+    @TableField(exist = false)
+    private Integer eStatus;
 }

+ 69 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialClassificationTree.java

@@ -0,0 +1,69 @@
+/*
+ *      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.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import org.springblade.core.mp.base.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 德飞试验系统检测分类树实体类
+ *
+ * @author BladeX
+ * @since 2025-08-15
+ */
+@Data
+@TableName("u_trial_classification_tree")
+public class TrialClassificationTree extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	* 主键
+	*/
+	private Long id;
+
+
+
+	private Long projectId;
+	/**
+	* 父级ID
+	*/
+		private Long parentId;
+	/**
+	 * 分类祖级
+	 */
+	private String classificationAncestors;
+	/**
+	* 分类名称
+	*/
+		private String classificationName;
+
+		/**
+		 * 分组类型 1是德飞厂商
+		 */
+		private Integer groupType;
+
+	/**
+	 * 是否删除
+ 	 */
+
+	private Integer isDeleted;
+
+}

+ 59 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyAccessories.java

@@ -0,0 +1,59 @@
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 成渝-附件信息
+ * @author LHB
+ * @TableName u_trial_cy_accessories
+ */
+@TableName(value ="u_trial_cy_accessories")
+@Data
+public class TrialCyAccessories {
+    /**
+     * 主键
+     */
+    @ApiModelProperty("唯一id")
+    @TableId(type = IdType.INPUT)
+    private Long id;
+
+    /**
+     * 报告id,已签章的报告/是第三方检测报告/外委检测报告/上传报告
+     */
+    @ApiModelProperty("报告id,已签章的报告/ 是第三方检测报告/ 外委检测报告/ 上传报告")
+    private Long reportId;
+
+    /**
+     * 成渝接口返回的id
+     */
+    @ApiModelProperty("成渝接口返回的")
+    @TableField("acc_id")
+    private String accId;
+
+    /**
+     * 类型名称
+     */
+
+    @ApiModelProperty("类型名称")
+    @TableField("acc_type")
+    private String accType;
+
+    /**
+     * 文件名称
+     */
+    @ApiModelProperty("文件名称")
+    @TableField("file_name")
+    private String fileName;
+
+    /**
+     * 文件路径
+     */
+    @ApiModelProperty("文件路径")
+    @TableField("file_path")
+    private String filePath;
+}

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

@@ -0,0 +1,149 @@
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 已完成(已签章完成)的检测报告接受对象
+ *
+ * @author LHB
+ */
+@TableName("u_trial_cy_finish_test_report")
+@Data
+public class TrialCyFinishTestReport {
+
+    @TableId(type = IdType.INPUT)
+    @ApiModelProperty("唯一id")
+    private Long id;
+    /**
+     * 合同ID
+     */
+    @TableField("contract_id")
+    @ApiModelProperty("合同ID")
+    private Long contractId;
+    /**
+     * 任务ID
+     */
+    @ApiModelProperty("任务ID")
+    private Integer taskId;
+    /**
+     * 合同段编码
+     */
+    @ApiModelProperty("合同段编码")
+    private String contractNumber;
+    /**
+     * 单位类型
+     * 0 施工
+     * 1 监理
+     * 2 中试
+     */
+    @ApiModelProperty("单位类型 0 施工 1 监理 2 中试")
+    private Integer cs;
+    /**
+     * 记录编号
+     */
+    @ApiModelProperty("记录编号")
+    private String number;
+    /**
+     * 报告编号
+     */
+    @ApiModelProperty("报告编号")
+    private String reportNumber;
+    /**
+     * 试验项目名称
+     */
+    @ApiModelProperty("试验项目名称")
+    private String name;
+    /**
+     * 试验工序名称
+     */
+    @ApiModelProperty("试验工序名称")
+    private String processName;
+    /**
+     * 取样地点
+     */
+    @ApiModelProperty("取样地点")
+    @TableField("sampling_place")
+    private String samplingPlace;
+    /**
+     * 样品信息 同试验检测查询界面
+     */
+    @ApiModelProperty("样品信息 同试验检测查询界面")
+    @TableField("sample_info")
+    private String sampleInfo;
+    /**
+     * 类型规格 规格型号
+     */
+    @ApiModelProperty("类型规格 规格型号")
+    @TableField("specification")
+    private String specification;
+    /**
+     * 合格证上传情况 已上传、未上传
+     */
+    @ApiModelProperty("合格证上传情况 已上传、未上传")
+    @TableField("hash_gz")
+    private String hasHGZ;
+    /**
+     * 所检参数信息 同试验检测查询界面
+     */
+    @ApiModelProperty("所检参数信息 同试验检测查询界面")
+    @TableField("test_param_info")
+    private String testParamInfo;
+    /**
+     * 报告时间
+     */
+    @ApiModelProperty("报告时间")
+    private String reportDate;
+    /**
+     * 是否合格 True 合格,False不合格
+     */
+    @ApiModelProperty("是否合格 1 合格,0 不合格")
+    private String experimentResult;
+    /**
+     * 报告人
+     */
+    @ApiModelProperty("报告人")
+    @TableField("user_name")
+    private String username;
+    /**
+     * 使用部位
+     */
+    @ApiModelProperty("使用部位")
+    private String position;
+    /**
+     * 报告文件路径
+     */
+    @ApiModelProperty("报告文件路径")
+    @TableField("report_file_path")
+    private String reportFilePath;
+    /**
+     * 记录文件路径
+     */
+    @ApiModelProperty("记录文件路径")
+    @TableField("record_file_path")
+    private String recordFilePath;
+    /**
+     * 试验树id
+     */
+    @ApiModelProperty("实验树Id")
+    @TableField("exam_name_info_id")
+    public String examNameInfoId;
+    /**
+     * 试验树id
+     */
+    @ApiModelProperty("组装文件(报告+记录+委托单)")
+    @TableField("assemble_file")
+    public String assembleFile;
+    /**
+     * 附件
+     */
+    @ApiModelProperty("附件")
+    @TableField(exist = false)
+    private List<TrialCyAccessories> accessories;
+}

+ 54 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyTestType.java

@@ -0,0 +1,54 @@
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 获取检测项目树(包括自建试验、外委、第三方、上传报告) 接受对象
+ *
+ * @author LHB
+ */
+@TableName("u_trial_cy_test_type")
+@Data
+public class TrialCyTestType {
+    @TableId(type = IdType.INPUT)
+    @ApiModelProperty("唯一id")
+    private Long pKeyId;
+    /**
+     * 项目id
+     */
+    @ApiModelProperty("项目id")
+    private Long projectId;
+    /**
+     * ID唯一标识
+     */
+    @TableField("id")
+    @ApiModelProperty("成渝的id")
+    private String id;
+    /**
+     * 名称
+     */
+    @TableField("name")
+    @ApiModelProperty("名称")
+    private String name;
+    /**
+     * 父级ID
+     */
+    @TableField("father_id")
+    @ApiModelProperty("父级id")
+    private String fatherId;
+    /**
+     * 顺序号
+     */
+    @TableField("order_index")
+    @ApiModelProperty("顺序号")
+    private String orderIndex;
+
+    @TableField(exist = false)
+    @ApiModelProperty("判断是否有子节点")
+    private Boolean hasChildren;
+}

+ 285 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyThirdReport.java

@@ -0,0 +1,285 @@
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 获取已上传的外委检测报告/第三方检测报告/上传报告 接受对象
+ *
+ * @author LHB
+ */
+@TableName("u_trial_cy_third_report")
+@Data
+public class TrialCyThirdReport {
+    @ApiModelProperty("唯一id")
+    @TableId(type = IdType.INPUT)
+    private Long pKeyId;
+    /**
+     * 合同id
+     */
+    @ApiModelProperty("合同id")
+    private Long contractId;
+    /**
+     * ID
+     */
+    @ApiModelProperty("成渝的id")
+    @TableField("id")
+    public String id;
+    /**
+     * 报告类型(0:外委检测,1:第三方检测,2:扫描上传报告)
+     */
+    @ApiModelProperty("报告类型(0:外委检测,1:第三方检测,2:扫描上传报告)")
+    public Integer thirdType;
+    /**
+     * 委托编号
+     */
+    @ApiModelProperty("委托编号")
+    @TableField("consign_no")
+    public String consignNo;
+    /**
+     * 报告编号
+     */
+    @ApiModelProperty("报告编号")
+    @TableField("report_no")
+    public String reportNo;
+    /**
+     * 取样时间 格式如:“2022-06-21”
+     */
+    @ApiModelProperty("取样时间 格式如:“2022-06-21”")
+    @TableField("take_sampling_date")
+    public String takeSamplingDate;
+    /**
+     * 送样时间 格式如:“2022-06-21”
+     */
+    @ApiModelProperty("送样时间 格式如:“2022-06-21”")
+    @TableField("send_sample_date")
+    public String sendSampleDate;
+    /**
+     * 检测时间 格式如:“2022-06-21”
+     */
+    @ApiModelProperty("检测时间 格式如:“2022-06-21”")
+    @TableField("test_date")
+    public String testDate;
+    /**
+     * 报告时间 格式如:“2022-06-21”
+     */
+    @ApiModelProperty("报告时间 格式如:“2022-06-21”")
+    @TableField("report_date")
+    public String reportDate;
+    /**
+     * 委托单位
+     */
+    @ApiModelProperty("委托单位")
+    @TableField("consign_unit")
+    public String consignUnit;
+    /**
+     * 检测机构
+     */
+    @ApiModelProperty("检测机构")
+    @TableField("accept_test_unit")
+    public String acceptTestUnit;
+    /**
+     * 送样人
+     */
+    @ApiModelProperty("送样人")
+    @TableField("send_sample_person")
+    public String sendSamplePerson;
+    /**
+     * 接样人
+     */
+    @ApiModelProperty("接样人")
+    @TableField("witness_person")
+    public String witnessPerson;
+    /**
+     * 工程部位
+     */
+    @ApiModelProperty("工程部位")
+    @TableField("project_part")
+    public String projectPart;
+    /**
+     * 取样地点
+     */
+    @ApiModelProperty("取样地点")
+    @TableField("sampling_place")
+    public String samplingPlace;
+    /**
+     * 样品名称
+     */
+    @ApiModelProperty("样品名称")
+    @TableField("sample_name")
+    public String sampleName;
+    /**
+     * 委托单文件下载地址
+     */
+    @ApiModelProperty("委托单文件下载地址")
+    @TableField("consign_doc_file_path")
+    public String consignDocFilePath;
+    /**
+     * 记录单文件下载地址
+     */
+    @ApiModelProperty("记录单文件下载地址")
+    @TableField("record_doc_file_path")
+    public String recordDocFilePath;
+    /**
+     * 报告单文件下载地址
+     */
+    @ApiModelProperty("报告单文件下载地址")
+    @TableField("report_doc_file_path")
+    public String reportDocFilePath;
+    /**
+     * 检测依据
+     */
+    @ApiModelProperty("检测依据")
+    @TableField("test_standard")
+    public String testStandard;
+    /**
+     * 评定标准
+     */
+    @ApiModelProperty("评定标准")
+    @TableField("assess_standard")
+    public String assessStandard;
+    /**
+     * 检测结论
+     */
+    @ApiModelProperty("检测结论")
+    @TableField("test_conclusion")
+    public String testConclusion;
+    /**
+     * 备注
+     */
+    @ApiModelProperty("备注")
+    @TableField("memo")
+    public String memo;
+    /**
+     * 期数
+     */
+    @ApiModelProperty("期数")
+    @TableField("period_num")
+    public String periodNum;
+    /**
+     * 是否合格
+     */
+    @ApiModelProperty("是否合格:1 合格, 0 不合格")
+    @TableField("is_qualified")
+    public String isQualified;
+    /**
+     * 样品编号
+     */
+    @ApiModelProperty("样品编号")
+    @TableField("sample_code")
+    public String sampleCode;
+    /**
+     * 规格型号
+     */
+    @ApiModelProperty("规格型号")
+    @TableField("gui_ge_xing_hao")
+    public String guiGeXingHao;
+    /**
+     * 生产厂家
+     */
+    @ApiModelProperty("生产厂家")
+    @TableField("sheng_chan_cj")
+    public String shengChanCJ;
+    /**
+     * 产地
+     */
+    @ApiModelProperty("产地")
+    @TableField("chan_di")
+    public String chanDi;
+    /**
+     * 样品数量
+     */
+    @ApiModelProperty("样品数量")
+    @TableField("sample_num")
+    public String sampleNum;
+    /**
+     * 检测机构资质证书编号
+     */
+    @ApiModelProperty("检测机构资质证书编号")
+    @TableField("consign_unit_ability")
+    public String consignUnitAbility;
+    /**
+     * 批号
+     */
+    @ApiModelProperty("批号")
+    @TableField("batch_num")
+    public String batchNum;
+    /**
+     * 代表数量
+     */
+    @ApiModelProperty("代表数量")
+    @TableField("quantity")
+    public String quantity;
+    /**
+     * 单位
+     */
+    @ApiModelProperty("单位")
+    @TableField("unit")
+    public String unit;
+    /**
+     * 类型ID
+     */
+    @ApiModelProperty("类型ID")
+    @TableField("consign_test_cls_id")
+    public String consignTestClsID;
+    /**
+     * 结论
+     */
+    @ApiModelProperty("结论")
+    @TableField("result")
+    public String result;
+    /**
+     * 是否已删除
+     * Null:未删除
+     * 0:未删除
+     * 1:已删除
+     */
+    @ApiModelProperty("是否已删除 0:未删除 1:已删除")
+    @TableField("is_deleted")
+    public String isDeleted;
+    /**
+     * 删除时间
+     */
+    @ApiModelProperty("删除时间")
+    @TableField("delete_time")
+    public String deleteTime;
+    /**
+     * 快报/正式报告
+     * 1 快报
+     * 2 正式报告
+     */
+    @ApiModelProperty("快报/ 正式报告 1 快报 2 正式报告")
+    @TableField("report_type")
+    public Integer reportType;
+    /**
+     * 创建时间 格式如:“2022-06-21 13:44:33 235”
+     */
+    @ApiModelProperty("创建时间 格式如:“2022-06-21 13:44:33 235”")
+    @TableField("create_time")
+    public String createTime;
+    /**
+     * 试验树id
+     */
+    @ApiModelProperty("实验树Id")
+    @TableField("exam_name_info_id")
+    public String examNameInfoId;
+    /**
+     * 试验树id
+     */
+    @ApiModelProperty("组装文件(报告+记录+委托单)")
+    @TableField("assemble_file")
+    public String assembleFile;
+
+    /**
+     * 附件
+     */
+    @ApiModelProperty("附件")
+    @TableField(exist = false)
+    private List<TrialCyAccessories> accessories;
+}

+ 101 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialSystemDocking.java

@@ -0,0 +1,101 @@
+/*
+ *      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.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import org.springblade.core.mp.base.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 德飞试验系统对接表实体类
+ *
+ * @author BladeX
+ * @since 2025-08-15
+ */
+@Data
+@TableName("u_trial_system_docking")
+public class TrialSystemDocking extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	* 主键
+	*/
+	private Long id;
+	/**
+	 * 项目Id
+	 */
+	private Long projectId;
+
+	private String classificationAncestors;
+	/**
+	* 报告文件名称
+	*/
+		private String reportName;
+	/**
+	* 报告编号
+	*/
+		private String reportNumber;
+	/**
+	* 单位名称
+	*/
+		private String unitName;
+	/**
+	* 所属检测分类id
+	*/
+		private Long classificationId;
+	/**
+	* 规格型号
+	*/
+		private String specification;
+	/**
+	* 报告类型(1原材检测报告,2现场检测报告,3外委报告,4第三方检测报告)
+	*/
+		private Integer reportType;
+	/**
+	* 工程用途及部位
+	*/
+		private String purposeLocation;
+	/**
+	* 报告日期(20250822)
+	*/
+		private String reportDate;
+	/**
+	* 原文件地址
+	*/
+		private String fileUrl;
+	/**
+	* 上传后文件地址
+	*/
+		private String fileUrlOss;
+	/**
+	* 负责人
+	*/
+		private String personInCharge;
+	/**
+	 * 是否删除
+ 	 */
+      private Integer isDeleted;
+
+	  /**
+	 * 是否更新OSS  1 是  0 否
+	 */
+	  private Integer isUpdateOss;
+
+}

+ 14 - 7
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/WbsTreeContractStatistics.java

@@ -63,38 +63,38 @@ public class WbsTreeContractStatistics implements Serializable {
      * 叶子节点数量
      */
     @ApiModelProperty(value = "叶子节点数量")
-    private Integer leafNum = 0;
+    private Integer leafNum;
 
     /**
      * 已填报数量
      */
     @ApiModelProperty(value = "已填报数量")
-    private Integer fillNum = 0;
+    private Integer fillNum;
     /**
      * 待审批数量
      */
     @ApiModelProperty(value = "待审批数量")
-    private Integer approveNum = 0;
+    private Integer approveNum;
     /**
      * 已审批数量
      */
     @ApiModelProperty(value = "已审批数量")
-    private Integer completeNum = 0;
+    private Integer completeNum;
     /**
      * 已填报数量(监理)
      */
     @ApiModelProperty(value = "已填报数量(监理)")
-    private Integer jlFillNum = 0;
+    private Integer jlFillNum;
     /**
      * 待审批数量(监理)
      */
     @ApiModelProperty(value = "待审批数量(监理)")
-    private Integer jlApproveNum = 0;
+    private Integer jlApproveNum;
     /**
      * 已审批数量(监理)
      */
     @ApiModelProperty(value = "已审批数量(监理)")
-    private Integer jlCompleteNum = 0;
+    private Integer jlCompleteNum;
 
     @DateTimeFormat(
             pattern = "yyyy-MM-dd HH:mm:ss"
@@ -133,6 +133,13 @@ public class WbsTreeContractStatistics implements Serializable {
             this.ancestors = ancestors == null ? "" : ancestors;
             this.status = 1;
             this.isLeaf = 1;
+            this.fillNum = 0;
+            this.approveNum = 0;
+            this.completeNum = 0;
+            this.jlFillNum = 0;
+            this.jlApproveNum = 0;
+            this.jlCompleteNum = 0;
+            this.leafNum = 0;
         }
     }
 

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

@@ -4,7 +4,9 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import org.springblade.archive.dto.FindAndReplaceDto;
 import org.springblade.archive.dto.SendsWebSocketArchiveDTO;
+import org.springblade.business.dto.FindAndReplaceDto1;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.vo.ArchiveFileVO;
 import org.springblade.common.constant.BusinessConstant;
@@ -167,4 +169,10 @@ public interface ArchiveFileClient {
 
     @PostMapping(API_PREFIX + "/getArchiveFileByArchiveIds")
     List<ArchiveFile> getArchiveFileByArchiveIds(@RequestParam String archiveIds);
+
+    @PostMapping(API_PREFIX + "/findAndReplace")
+    boolean findAndReplace(@RequestBody FindAndReplaceDto1 dto1);
+
+    @PostMapping(API_PREFIX + "/getAllArchiveFileByIds")
+    List<ArchiveFile> getAllArchiveFileByIds(@RequestBody List<String> strList);
 }

+ 5 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ImageClassificationFileClient.java

@@ -4,8 +4,10 @@ import org.springblade.business.dto.ImageClassificationFileDTO;
 import org.springblade.business.entity.ImageClassificationFile;
 import org.springblade.common.constant.BusinessConstant;
 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.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
@@ -28,4 +30,7 @@ public interface ImageClassificationFileClient {
 
     @PostMapping(API_PREFIX + "/getImageClassificationFileById")
     ImageClassificationFile getImageClassificationFileById(@RequestBody Long id);
+
+    @PostMapping(API_PREFIX + "/getImageClassificationFileByIds")
+    List<ImageClassificationFile> getImageClassificationFileByIds(@RequestBody List<Long> imageIds);
 }

+ 24 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TrialCyAccessoriesClient.java

@@ -0,0 +1,24 @@
+package org.springblade.business.feign;
+
+import com.alibaba.fastjson.JSONObject;
+import org.springblade.common.constant.BusinessConstant;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+/**
+ * @author LHB
+ */
+
+@FeignClient(value = BusinessConstant.APPLICATION_WEATHER_NAME)
+public interface TrialCyAccessoriesClient {
+    /**
+     * 接口前缀
+     */
+    String API_PREFIX = "/api/business/detection";
+
+    @PostMapping(API_PREFIX + "/getTrialFilePdfRecord")
+    List<JSONObject> getTrialFilePdfRecord(@RequestParam String primaryKeyId,@RequestParam List<Integer> list);
+}

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

@@ -45,4 +45,7 @@ public interface WbsTreeContractStatisticsClient {
     @GetMapping(API_PREFIX + "/statisticsContract")
     void statisticsContract(@RequestParam Long contractId);
 
+    @GetMapping(API_PREFIX + "/updateAncestors")
+    void updateAncestors(@RequestParam String ids);
+
 }

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/BusinessTaskPageVO.java

@@ -58,4 +58,7 @@ public class BusinessTaskPageVO implements Serializable {
     @ApiModelProperty(value = "签字人员集合")
     private List<TaskParallel> taskApproveUserNamesList;
 
+    @ApiModelProperty("电签状态,用来判断是否同意过")
+    private Integer eStatus;
+
 }

+ 45 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ChekPdfPaceVo.java

@@ -0,0 +1,45 @@
+/*
+ *      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.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.business.entity.ArchiveFile;
+
+/**
+ * 视图实体类
+ *
+ * @author BladeX
+ * @since 2022-07-08
+ */
+@Data
+public class ChekPdfPaceVo {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 当前页
+     */
+    @ApiModelProperty("完成数量")
+    private Integer finishCount;
+
+    @ApiModelProperty("总数量")
+    private Integer totalCount;
+
+    @ApiModelProperty("完成比")
+    private double pace;
+}

+ 9 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ContractLogVO.java

@@ -1,10 +1,13 @@
 package org.springblade.business.vo;
 
 import io.swagger.annotations.ApiModelProperty;
+import org.springblade.business.dto.StartTimeAndEndTime;
 import org.springblade.business.entity.ContractLog;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -49,6 +52,12 @@ public class ContractLogVO extends ContractLog {
     @ApiModelProperty(value = "签字人员集合")
     private List<Object> taskApproveUserNamesList;
 
+
+    @ApiModelProperty(value = "按月封装时间范围")
+    @NotEmpty(message = "请选择时间范围")
+    @Valid
+    private List<StartTimeAndEndTime> startTimeAndEndTimes;
+
     public void setSelectNodeList(String primaryKeyId, String title) {
         if (this.selectNodeList == null) {
             this.selectNodeList = new ArrayList<>();

+ 13 - 3
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/InformationQueryVO.java

@@ -86,12 +86,17 @@ public class InformationQueryVO extends InformationQuery {
     private Integer waitingUserStatus;
 
 
+    @ApiModelProperty("重刷状态 0-待重刷,1-正在重刷,2-重刷成功,3-重刷失败")
+    private Integer saveAgain;
 
-    public void setWaitingUserList(String waitingUserName, Integer status) {
+    @ApiModelProperty("重刷次数:如果次数大于5次 每次都是3,就停止重刷")
+    private Integer saveAgainCount;
+
+    public void setWaitingUserList(String waitingUserName, Integer status, String userId) {
         if (this.waitingUserList == null) {
             this.waitingUserList = new ArrayList<>();
         }
-        this.waitingUserList.add(new WaitingUser(waitingUserName, status));
+        this.waitingUserList.add(new WaitingUser(waitingUserName, status, userId));
     }
 
     @Data
@@ -102,9 +107,14 @@ public class InformationQueryVO extends InformationQuery {
         @ApiModelProperty("审批状态,1未签字(黑色),2已签字(绿色),3已废除(黄色),999签字异常(红色)")
         private Integer status;
 
-        public WaitingUser(String waitingUserName, Integer status) {
+        @ApiModelProperty("用户ID")
+        private String userId;
+
+
+        public WaitingUser(String waitingUserName, Integer status, String userId) {
             this.waitingUserName = waitingUserName;
             this.status = status;
+            this.userId=userId;
         }
     }
 

+ 64 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/NeiYeLedgerVO.java

@@ -1,45 +1,74 @@
 package org.springblade.business.vo;
 
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
 
 @Data
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+//忽略为加excel注解的字段
+@ExcelIgnoreUnannotated
 public class NeiYeLedgerVO {
 
     /**
      * 单位工程
      */
     @ApiModelProperty(value = "单位工程")
+    @ExcelProperty(value = "单位工程",order = 1)
+    @ColumnWidth(30)
+    @ContentStyle(wrapped = true)
     private String unitProject;
 
     /**
      * 分部工程
      */
     @ApiModelProperty(value = "分部工程")
+    @ExcelProperty(value = "分部工程",order = 2)
+    @ColumnWidth(40)
+    @ContentStyle(wrapped = true)
     private String partProject;
 
     /**
      * 子分部工程
      */
     @ApiModelProperty(value = "子分部工程")
+    @ExcelProperty(value = "子分部工程",order = 3)
+    @ColumnWidth(40)
+    @ContentStyle(wrapped = true)
     private String partChildProject;
 
     /**
      * 分项工程
      */
     @ApiModelProperty(value = "分项工程")
+    @ExcelProperty(value = "分项工程",order = 4)
+    @ColumnWidth(40)
+    @ContentStyle(wrapped = true)
     private String subentryProject;
 
     /**
      * 子分项工程
      */
     @ApiModelProperty(value = "子分项工程")
+    @ExcelProperty(value = "子分项工程",order = 5)
+    @ColumnWidth(40)
+    @ContentStyle(wrapped = true)
     private String subentryChildProject;
 
     /**
      * 工序
      */
     @ApiModelProperty(value = "工序")
+    @ExcelProperty(value = "工序",order = 6)
+    @ColumnWidth(40)
+    @ContentStyle(wrapped = true)
     private String process;
 
     //施工台账信息 start ==================================
@@ -66,6 +95,9 @@ public class NeiYeLedgerVO {
      * 审批状态
      */
     @ApiModelProperty(value = "审批状态,1未上报,2待审批,3已审批")
+    @ExcelProperty(value = "审批状态",order = 7)
+    @ColumnWidth(15)
+    @ContentStyle(horizontalAlignment = HorizontalAlignment.CENTER)
     private String taskStatus;
 
     /**
@@ -85,6 +117,38 @@ public class NeiYeLedgerVO {
      */
     @ApiModelProperty(value = "information-query主键")
     private String id;
+    /**
+     * 是否填写了日期
+     */
+    @ApiModelProperty(value = "是否填写了日期")
+    @ExcelProperty(value = "日期是否完整",order = 9)
+    @ColumnWidth(20)
+    @ContentStyle(horizontalAlignment = HorizontalAlignment.CENTER)
+    private String dateIsComplete;
+    /**
+     * 文件提名
+     */
+    @ApiModelProperty(value = "文件提名")
+    @ExcelProperty(value = "文件提名",order = 8)
+    @ColumnWidth(100)
+    @ContentStyle(wrapped = true)
+    private String infoQueryName;
+
+    /**
+     * 文件pdf路径
+     */
+    @ApiModelProperty(value = "路径")
+    @ExcelProperty(value = "文件地址",order = 11)
+    @ColumnWidth(110)
+    private String pdfUrl;
+    /**
+     * 附件报告
+     */
+    @ApiModelProperty(value = "附件报告")
+    @ColumnWidth(100)
+    @ContentStyle(wrapped = true)
+    @ExcelProperty(value = "附件报告",order = 10)
+    private String fileTypeMsg;
 
     public NeiYeLedgerVO(String... values) {
         this.unitProject = values[0];

+ 9 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/NeiYeQueryVO.java

@@ -38,6 +38,15 @@ public class NeiYeQueryVO {
     @ApiModelProperty(value = "项目ID")
     private String contractIdRelation;
 
+    @ApiModelProperty(value = "是否缺少附件:true为完整")
+    private Boolean isFile;
+
+    @ApiModelProperty(value = "日期是否填报,与质检树类型一致")
+    private Integer dateIsComplete;
+
+    @ApiModelProperty(value = "查询类型:1-工序,2-节点")
+    private Integer selectType = 1;
+
     private List<String> wbsIds;
 
 }

+ 36 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/QueryProcessDataVO.java

@@ -33,4 +33,40 @@ public class QueryProcessDataVO {
 
     private String isExperiment;
 
+    /**
+     * 是否填写了日期
+     */
+    private String dateIsComplete;
+    /**
+     * 文件提名
+     */
+    private String infoQueryName;
+
+    /**
+     * 文件pdf路径
+     */
+    private String pdfUrl;
+    /**
+     * 文件pdf路径
+     */
+    private String privateTableFileType;
+    /**
+     * 文件pdf路径
+     */
+    private String contractTableFileType;
+    /**
+     * 文件pdf路径
+     */
+    private String contractTableFileTypeTwo;
+
+    /**
+     * 附件报告
+     */
+    private String fileTypeMsg;
+
+    /**
+     * 附件报告是否完整
+     */
+    private Boolean fileType = false;
+
 }

+ 20 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ThirdReportVo.java

@@ -0,0 +1,20 @@
+package org.springblade.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author LHB
+ */
+@Data
+public class ThirdReportVo {
+    private Long id;
+    private Long contractId;
+    private String reportNo;
+    private String reportDate;
+    private String projectPositionName;
+    private String detectionResultName;
+
+    @ApiModelProperty(value = "是否关联选择过 0=否 1=是")
+    private Integer isSelectedStatus;
+}

+ 50 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialClassificationTreeVO.java

@@ -0,0 +1,50 @@
+/*
+ *      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.business.vo;
+
+import org.springblade.business.entity.TrialClassificationTree;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 德飞试验系统检测分类树视图实体类
+ *
+ * @author BladeX
+ * @since 2025-08-15
+ */
+@Data
+public class TrialClassificationTreeVO  {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	private Long id;
+
+	private Long projectId;
+	/**
+	 * 父级ID
+	 */
+	private Long parentId;
+
+	private Boolean hasChildren;
+	/**
+	 * 分类名称
+	 */
+	private String classificationName;
+
+}

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

@@ -0,0 +1,32 @@
+package org.springblade.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 接口查询条件对象
+ * @author LHB
+ */
+@Data
+public class TrialCyThirdReportQueryVo {
+    private Integer current;
+    private Integer size;
+    @ApiModelProperty("开始时间")
+    private String startTime;
+    @ApiModelProperty("结束时间")
+    private String endTime;
+    @ApiModelProperty("树节点id")
+    @NotNull(message = "树节点id不能为空")
+    private Long nodeId;
+    @ApiModelProperty("合同段id")
+    @NotNull(message = "合同段id不能为空")
+    private Long contractId;
+    @ApiModelProperty("质检节点pkeyid")
+    private Long qualityTestPKeyId;
+    @ApiModelProperty("类型:0-外委检测,1-第三方")
+    private Integer type;
+    @ApiModelProperty("类型:0-施工,1-监理,2-业主")
+    private Integer reportType;
+}

+ 84 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSystemDockingVO.java

@@ -0,0 +1,84 @@
+/*
+ *      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.business.vo;
+
+import org.springblade.business.entity.TrialSystemDocking;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 德飞试验系统对接表视图实体类
+ *
+ * @author BladeX
+ * @since 2025-08-15
+ */
+@Data
+public class TrialSystemDockingVO {
+	private static final long serialVersionUID = 1L;
+
+	private Long id;
+
+	/**
+	 * 项目Id
+	 */
+	private Long projectId;
+	/**
+	 * 报告文件名称
+	 */
+	private String reportName;
+	/**
+	 * 报告编号
+	 */
+	private String reportNumber;
+	/**
+	 * 单位名称
+	 */
+	private String unitName;
+	/**
+	 * 所属检测分类id
+	 */
+
+	private Long classificationId;
+	/**
+	 * 规格型号
+	 */
+	private String specification;
+	/**
+	 * 报告类型(1原材检测报告,2现场检测报告,3外委报告,4第三方检测报告)
+	 */
+	private Integer reportType;
+	/**
+	 * 工程用途及部位
+	 */
+	private String purposeLocation;
+	/**
+	 * 报告日期(20250822)
+	 */
+	private String reportDate;
+	/**
+	 * 原文件地址
+	 */
+	private String fileUrl;
+	/**
+	 * 责任者
+	 */
+	private String personInCharge;
+
+
+}

+ 4 - 1
blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/vo/SealStrategyVO.java

@@ -74,9 +74,12 @@ public class SealStrategyVO {
     private String sealLocation;
 
     /**
-     * 签章原因,可以为空
+     * 用户名称
      */
     private String sealReason;
+
+    // 用户Id
+    private String userId;
     //坐标签章结束 ======================================
 
     /**

+ 11 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/MoveNodeDTO.java

@@ -0,0 +1,11 @@
+package org.springblade.manager.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class MoveNodeDTO {
+    private List<Long> leftPkeyIds;
+    private Long rightPkeyId;
+}

+ 17 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsInfoDTO.java

@@ -4,8 +4,11 @@ import io.swagger.annotations.ApiModelProperty;
 import io.swagger.models.auth.In;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.entity.WbsInfo;
 
+import java.util.List;
+
 @Data
 @EqualsAndHashCode(callSuper = true)
 public class WbsInfoDTO extends WbsInfo {
@@ -27,5 +30,19 @@ public class WbsInfoDTO extends WbsInfo {
      */
     private Integer status;
 
+    /**
+     * 项目名称
+     */
+    @ApiModelProperty(value = "项目名称")
+    private String projectName;
+
+    /**
+     * 项目名称
+     */
+    @ApiModelProperty(value = "项目名称")
+    private String projectId;
+
+    List<ProjectInfo> projectInfoList;
+
 
 }

+ 4 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/Album.java

@@ -61,6 +61,10 @@ public class Album extends BaseEntity {
 	*/
 		private String groupNumber;
 	/**
+	* 起止编号
+	*/
+		private String codes;
+	/**
 	* 开始日期
 	*/
 		private String startDate;

+ 36 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/AlbumImages.java

@@ -0,0 +1,36 @@
+package org.springblade.manager.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * 相册与照片关联关系表
+ * @TableName m_album_images
+ */
+@TableName(value ="m_album_images")
+@Data
+public class AlbumImages {
+    /**
+     * id
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 相册表id
+     */
+    private Long albumId;
+
+    /**
+     * 照片表id
+     */
+    private Long imageId;
+    /**
+     * 照片表id
+     */
+    @TableField(exist = false)
+    private String imagesUrl;
+
+}

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

@@ -181,6 +181,12 @@ public class ContractInfo extends BaseEntity {
     @ApiModelProperty(value = "卷盒规格")
     private String specification;
 
+    /**
+     * 排序
+     */
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
     public BigDecimal getProjectMileage() {
         if (projectMileage == null){
             return null;

+ 20 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ProjectInfo.java

@@ -211,4 +211,24 @@ public class ProjectInfo extends BaseEntity {
     private String jlSuffix;
 
 
+    /**
+     *
+     */
+    @ApiModelProperty(value = "短信时间")
+    private Double msTime;
+    /**
+     * 项目状态
+     */
+    @ApiModelProperty(value = "项目状态, 0:未开始, 1:配置中, 2: 进行中, 3: 已完成")
+    private Integer projectStatus;
+    /**
+     * 项目排序
+     */
+    @ApiModelProperty(value = "项目排序")
+    private Integer sort;
+    /**
+     * 项目负责人
+     */
+    @ApiModelProperty(value = "项目负责人")
+    private Long projectLeader;
 }

+ 7 - 4
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/TableFile.java

@@ -16,10 +16,7 @@
  */
 package org.springblade.manager.entity;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModel;
@@ -98,4 +95,10 @@ public class TableFile implements Serializable {
 
     private Integer sort;
 
+    /**
+     * 文件是否为关联的试验文件
+     */
+    @TableField(exist = false)
+    private Boolean isTrial = false;
+
 }

+ 3 - 3
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/TextdictInfo.java

@@ -85,12 +85,12 @@ public class TextdictInfo implements Serializable {
     /**
      * 偏移坐标X
      */
-    private double pyzbx;
+    private Double pyzbx;
 
     /**
      * 偏移坐标Y
      */
-    private double pyzby;
+    private Double pyzby;
 
     /**
      * excelId
@@ -120,5 +120,5 @@ public class TextdictInfo implements Serializable {
     /**
      * 是否需要时间 1需要 0不需要
      */
-    private int timeState;
+    private Integer timeState;
 }

+ 83 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/UserProjectInfoCollect.java

@@ -0,0 +1,83 @@
+package org.springblade.manager.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+@Data
+@TableName("m_user_project_collect")
+public class UserProjectInfoCollect implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键id")
+    @JsonProperty(value = "id")
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long id;
+
+    /**
+     * 项目Id
+     */
+    @JsonProperty(value = "projectId")
+    @ApiModelProperty(name = "projectId", value = "项目Id", required = true)
+    private Long projectId;
+
+    @ApiModelProperty("排序")
+    private Integer sort;
+
+    /**
+     * 用户id
+     */
+    @JsonProperty(value = "userId")
+    @ApiModelProperty(name = "userId", value = "用户id", required = true)
+    private Long userId;
+
+
+    @JsonProperty(value = "createUser")
+    @ApiModelProperty(name = "createUser", value = "创建人", required = true)
+    private Long createUser;
+
+    @JsonProperty(value = "updateUser")
+    @ApiModelProperty(name = "updateUser", value = "更新人", required = true)
+    private Long updateUser;
+
+    @DateTimeFormat(
+            pattern = "yyyy-MM-dd HH:mm:ss"
+    )
+    @JsonFormat(
+            pattern = "yyyy-MM-dd HH:mm:ss"
+    )
+    @ApiModelProperty("创建时间")
+    private Date createTime;
+
+
+
+    @DateTimeFormat(
+            pattern = "yyyy-MM-dd HH:mm:ss"
+    )
+    @JsonFormat(
+            pattern = "yyyy-MM-dd HH:mm:ss"
+    )
+
+    @ApiModelProperty("更新时间")
+    private Date updateTime = new Date();
+
+    @ApiModelProperty("状态")
+    private Integer status = 1;
+
+    @TableLogic
+    @ApiModelProperty("是否已删除")
+    private Integer isDeleted = 0;
+}

+ 13 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsInfo.java

@@ -1,10 +1,13 @@
 package org.springblade.manager.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.core.mp.base.BaseEntity;
 
+import java.util.List;
+
 @Data
 @TableName("m_wbs_info")
 @EqualsAndHashCode(callSuper = true)
@@ -21,5 +24,15 @@ public class WbsInfo extends BaseEntity {
      */
     private Integer wbsType;
 
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * 项目列表
+     */
+    @TableField(exist = false)
+    private List<ProjectInfo> projectInfoList;
 
 }

+ 67 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreeContractExtend.java

@@ -0,0 +1,67 @@
+package org.springblade.manager.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 合同段-扩展表
+ * @TableName m_wbs_tree_contract_extend
+ */
+@TableName(value ="m_wbs_tree_contract_extend")
+@Data
+public class WbsTreeContractExtend {
+    /**
+     * 
+     */
+    @TableId
+    private Long pKeyId;
+    /**
+     * 合同id
+     */
+    private Long contractId;
+
+    /**
+     *  类型(1-施工,2-监理)
+     */
+    private Integer type;
+    /**
+     *  是否为同步数据(1-是,0-不是)
+     */
+    private Integer isSync;
+    /**
+     *  节点祖级路径
+     */
+    private String ancestors;
+
+    /**
+     *  创建时间
+     */
+    private Date syncTime;
+
+    /**
+     *  是否删除(0-正常,1-已删除)
+     */
+    private Integer isDeleted;
+
+    /**
+     *  创建时间
+     */
+    private Date createTime;
+
+    /**
+     *  创建人
+     */
+    private Long createUser;
+
+    /**
+     *  修改时间
+     */
+    private Date updateTime;
+
+    /**
+     *  修改人
+     */
+    private Long updateUser;
+}

+ 61 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreeContractOldHtml.java

@@ -0,0 +1,61 @@
+package org.springblade.manager.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 合同段表单上报之前的html记录
+ * @author LHB
+ * @TableName m_wbs_tree_contract_old_html
+ */
+@TableName(value ="m_wbs_tree_contract_old_html")
+@Data
+public class WbsTreeContractOldHtml {
+    /**
+     * 
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 合同WBS的p_key_id
+     */
+    private Long contractFormId;
+
+    /**
+     * 上报之前的html表单
+     */
+    private String oldHtmlUrl;
+
+    /**
+     * 上报之前的html表单
+     */
+    private String oldExcelUrl;
+
+    /**
+     *  是否删除(0-正常,1-已删除)
+     */
+    private Integer isDeleted;
+
+    /**
+     *  创建时间
+     */
+    private Date createTime;
+
+    /**
+     *  创建人
+     */
+    private Long createUser;
+
+    /**
+     *  修改时间
+     */
+    private Date updateTime;
+
+    /**
+     *  修改人
+     */
+    private Long updateUser;
+}

+ 2 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreePrivate.java

@@ -267,5 +267,7 @@ public class WbsTreePrivate extends BaseEntity {
     @ApiModelProperty(value = "是否包含单元评定")
     private Integer isClassifition;
 
+    @ApiModelProperty(value = "附件类型(复选)")
+    private String tableFileType;
 
 }

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

@@ -95,7 +95,7 @@ public interface ExcelTabClient {
     void excelInfo(@RequestPart("file") MultipartFile file, @RequestParam String exceUrl, @RequestParam String thmlUrl, @RequestParam String number) throws IOException;
 
     @PostMapping(API_PREFIX + "/saveLinkTab")
-    void saveLinkTab(@RequestParam Long excelId,@RequestParam Long pKeyId) throws IOException;
+    void saveLinkTab(@RequestParam Long excelId,@RequestParam Long pKeyId) throws Exception;
 
     @PostMapping(API_PREFIX + "/getTheLogPdInfo")
     void getTheLogPdInfo(@RequestParam String logPkeyId,  @RequestParam String nodePrimaryKeyId, @RequestParam String recordTime, @RequestParam String contractId,@RequestParam Long createUser) throws Exception;

+ 18 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/INodeBaseInfoServiceClient.java

@@ -0,0 +1,18 @@
+package org.springblade.manager.feign;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
+
+@FeignClient(value = APPLICATION_NAME_PREFIX + "manager")
+public interface INodeBaseInfoServiceClient {
+    /**
+     * 接口前缀
+     */
+    String API_PREFIX = "/api/manager/nodebaseinfo";
+
+    @GetMapping(API_PREFIX + "/getNameRuleByRule")
+    String getNameRuleByRule(@RequestParam String nameRule, @RequestParam String wbsId);
+}

+ 2 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/TableFileClient.java

@@ -29,7 +29,7 @@ public interface TableFileClient {
     @PostMapping(API_PREFIX + "/saveBatch")
     boolean saveBatch(@RequestBody List<TableFile> newFiles);
 
-    @GetMapping(API_PREFIX + "/getTabFilesByTabIds")
-    List<TableFile> getTabFilesByTabIds(@RequestParam String tabFileIds);
+    @PostMapping(API_PREFIX + "/getTabFilesByTabIds")
+    List<TableFile> getTabFilesByTabIds(@RequestBody List<String> tabFileIds);
 
 }

+ 7 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsParamClient.java

@@ -1,6 +1,7 @@
 package org.springblade.manager.feign;
 
 
+import org.springblade.core.tool.api.R;
 import org.springblade.manager.entity.WbsParam;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -9,6 +10,8 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.List;
+
 import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
 
 @FeignClient(value = APPLICATION_NAME_PREFIX + "manager")
@@ -24,6 +27,10 @@ public interface WbsParamClient {
     @GetMapping(API_PREFIX + "/getWbsParam")
     WbsParam getWbsParam(@RequestParam Long nodeId);
 
+    @PostMapping(API_PREFIX + "/saveWbsParams")
+    void saveWbsParams(@RequestBody List<WbsParam> wbsParamList);
     @PostMapping(API_PREFIX + "/createFileTitle")
     String createFileTitle(@RequestBody WbsTreeContract contract);
+    @PostMapping(API_PREFIX + "/getNameRuleByPkeyId")
+    R<List<String>> getNameRuleByPkeyId(@RequestParam Long pKeyId, @RequestParam Long projectId);
 }

+ 7 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java

@@ -1,6 +1,7 @@
 package org.springblade.manager.feign;
 
 import org.springblade.business.dto.EKeyDto;
+import org.springblade.core.tool.api.R;
 import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.vo.AppWbsTreeContractVO;
@@ -205,4 +206,10 @@ public interface WbsTreeContractClient {
 
     @GetMapping(API_PREFIX + "/saveNameRuleByPkeyId")
     void saveNameRuleByPkeyId(@RequestParam Long  pKeyId, @RequestParam String s,  @RequestParam Long projectId);
+
+    @PostMapping(API_PREFIX + "/queryListByPIds")
+    List<WbsTreeContract> queryListByPIds(@RequestBody List<Long> pIds,@RequestParam Integer classify);
+
+    @PostMapping(API_PREFIX + "/findIsExistTreeNode")
+    Integer findIsExistTreeNode(@RequestBody List<String> ids);
 }

+ 25 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractOldHtmlClient.java

@@ -0,0 +1,25 @@
+package org.springblade.manager.feign;
+
+import org.springblade.manager.entity.WbsTreeContract;
+import org.springblade.manager.entity.WbsTreeContractOldHtml;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
+
+@FeignClient(value = APPLICATION_NAME_PREFIX + "manager")
+public interface WbsTreeContractOldHtmlClient {
+    /**
+     * 接口前缀
+     */
+    String API_PREFIX = "/api/manager/WbsTreeContractOldHtml";
+
+    @PostMapping(API_PREFIX + "/save")
+    Boolean save(@RequestBody List<WbsTreeContractOldHtml> data);
+
+    @PostMapping(API_PREFIX + "/deleteByContractFormIds")
+    void deleteByContractFormIds(@RequestBody List<Long> collect);
+}

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

@@ -21,4 +21,6 @@ public class AppWbsTreeContractVO extends WbsTreeContract {
     @ApiModelProperty(value = "文件题名")
     private String fileName;
 
+    @ApiModelProperty(value = "是否最近同步节点")
+    private Integer isSync;
 }

+ 4 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveSyncLogVO.java

@@ -36,4 +36,8 @@ public class ArchiveSyncLogVO {
 
     @ApiModelProperty("电签文件路径")
     private String eVisaPdfUrl;
+    @ApiModelProperty("父级节点")
+    private Long wbsNodeId;
+    @ApiModelProperty("文件页数")
+    private Integer page;
 }

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ContractInfoVO.java

@@ -40,5 +40,11 @@ public class ContractInfoVO extends ContractInfo {
     @ApiModelProperty("计量合同段-关联详情信息")
     private MeterContractInfo meterContractInfo;
 
+    /**
+     * 关联合同段
+     */
+    @ApiModelProperty("关联合同段")
+    private List<ContractInfo> relationContractInfo;
+
 
 }

+ 3 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ExceTabTreVO.java

@@ -51,6 +51,9 @@ public class ExceTabTreVO extends ExcelTab implements INode<ExceTabTreVO> {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long parentId;
 
+
+    private Integer tableOwner;
+
     /**
      * 子孙节点
      */
@@ -63,7 +66,6 @@ public class ExceTabTreVO extends ExcelTab implements INode<ExceTabTreVO> {
     @JsonInclude(JsonInclude.Include.NON_EMPTY)
     private Boolean hasChildren;
 
-    private Integer tableOwner;
 
     @Override
     public List<ExceTabTreVO> getChildren() {

+ 19 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ExcelTabVO.java

@@ -20,6 +20,9 @@ import io.swagger.annotations.ApiModelProperty;
 import org.springblade.manager.entity.ExcelTab;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springblade.manager.entity.ProjectInfo;
+
+import java.util.List;
 
 /**
  * 清表基础数据表视图实体类
@@ -35,4 +38,20 @@ public class ExcelTabVO extends ExcelTab {
     @ApiModelProperty(value = "清表模板类型名称")
     private String tableTemplateTypeName;
 
+    @ApiModelProperty(value = "项目id")
+    private Long projectId;
+
+    @ApiModelProperty(value = "项目名称")
+    private String projectName;
+
+    List<ProjectInfoVO1> projectInfoList;
+
+    @ApiModelProperty(value = "项目使用数量")
+    private Integer projectUseNumber;
+
+    @ApiModelProperty(value = "清表使用数量")
+    private Integer excelUseNumber;
+
+    @ApiModelProperty(value = "创建人名称")
+    private String createUserName;
 }

+ 1 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ExcelTabVo1.java

@@ -9,4 +9,5 @@ public class ExcelTabVo1 {
     private String htmlUrl;
     private String name;
     private String fileUrl;
+    private String tabName;
 }

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

@@ -38,4 +38,21 @@ public class ProjectInfoVO extends ProjectInfo {
     @ApiModelProperty(value = "wbsType")
     private Integer wbsType;
 
+    /**
+     * 项目负责人
+     */
+    @ApiModelProperty(value = "项目负责人姓名")
+    private String projectLeaderName;
+
+    /**
+     * 是否收藏
+     */
+    @ApiModelProperty(value = "是否收藏 0 否, 1 是")
+    private Integer isCollect;
+
+    /**
+     * wbs 类型
+     */
+    @ApiModelProperty(value = "wbs 类型")
+    private List<Integer> wbsTypes;
 }

+ 33 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ProjectInfoVO3.java

@@ -1,5 +1,38 @@
 package org.springblade.manager.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springblade.manager.entity.ProjectInfo;
+import java.io.Serializable;
+@Data
+public class ProjectInfoVO3 implements Serializable {
+    private static final long serialVersionUID = 1L;
 
+    /**
+     * 项目名称、别名
+     */
+    @ApiModelProperty(value = "项目名称、别名")
+    private String name;
+    /**
+     * 项目状态, 0:未开始, 1:配置中, 2: 进行中, 3: 已完成, null: 全部
+     */
+    @ApiModelProperty(value = "项目状态, 0:未开始, 1:配置中, 2: 进行中, 3: 已完成, null: 全部。 默认值:null")
+    private Integer status;
+    /**
+     * 排序方式,0:默认排序, 1:收藏优先, 2:创建时间, 3:我负责的
+     */
+    @ApiModelProperty(value = "排序方式,0:默认排序, 1:收藏优先, 2:创建时间, 3:我负责的。默认值:0")
+    private Integer sort = 0;
+    /**
+     * 是否收藏,0:全部, 1:收藏
+     */
+    @ApiModelProperty(value = "是否收藏,0:全部, 1:收藏。 默认值:1")
+    private Integer isCollect = 1;
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id, 可以不传值")
+    private Long userId;
+
+}
 

+ 4 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TextdictInfoVO.java

@@ -36,6 +36,9 @@ public class TextdictInfoVO extends TextdictInfo {
     //1.电签配置 2.系统识别
     private Integer showType;
 
-    @ApiModelProperty("是否引用系统级电签配置,1 系统级,0 项目级")
+    @ApiModelProperty("本表配置 绿色0,电签库 蓝色1,项目匹配 橙色2")
     private Integer isSystem = 0;
+
+    @ApiModelProperty("元素是否匹配, 1:匹配, 0:不匹配")
+    private Integer isMatch = 1;
 }

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TreeNodeVO.java

@@ -6,6 +6,8 @@ import lombok.Data;
 import org.springblade.core.tool.node.BaseNode;
 import org.springblade.core.tool.node.TreeNode;
 
+import java.util.Date;
+
 @Data
 public class TreeNodeVO extends BaseNode<TreeNode> {
     private static final long serialVersionUID = 1L;
@@ -55,6 +57,10 @@ public class TreeNodeVO extends BaseNode<TreeNode> {
 
     private String erTreeId;
 
+    private Long updateUser;
+    private Date updateTime;
+    private String updateUserName;
+
     public TreeNodeVO() {
     }
 

+ 1 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsNodeTableVO.java

@@ -92,5 +92,6 @@ public class WbsNodeTableVO implements Serializable {
     private String htmlUrl;
 
     private String nodeType;
+    private Integer wbsType;
 
 }

+ 2 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractLazyVO.java

@@ -139,6 +139,7 @@ public class WbsTreeContractLazyVO implements Serializable {
     @ApiModelProperty(value = "是否完成日期填写1是2否")
     private Integer dateIsComplete;
 
-
+    @ApiModelProperty(value = "是否最近同步节点")
+    private Integer isSync;
 
 }

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractTreeAllVO.java

@@ -44,6 +44,9 @@ public class WbsTreeContractTreeAllVO implements INode<WbsTreeContractTreeAllVO>
     @ApiModelProperty(value = "是否完成日期填写 1是 2否")
     private Integer dateIsComplete;
 
+    @ApiModelProperty(value = "是否为自定义新增节点 1=是")
+    private Integer isSync;
+
     @JsonInclude(JsonInclude.Include.NON_EMPTY)
     private List<WbsTreeContractTreeAllVO> children;
 

+ 39 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateQueryVO.java

@@ -0,0 +1,39 @@
+package org.springblade.manager.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class WbsTreePrivateQueryVO {
+
+    @ApiModelProperty(value = "wbs Id", required = true)
+    @NotBlank(message = "wbsId不能为空")
+    private String wbsId;
+
+    @ApiModelProperty(value = "项目id", required = true)
+    @NotBlank(message = "projectId不能为空")
+    private String projectId;
+
+    @ApiModelProperty("搜索内容")
+    private String queryValue;
+
+    @ApiModelProperty("节点类型")
+    private Integer nodeType;
+
+    @ApiModelProperty("内业资料类型")
+    private Integer majorDataType;
+
+    @ApiModelProperty("标准分类")
+    private Integer className;
+
+    @ApiModelProperty(value = "单元名称")
+    private Integer unitName;
+
+    @ApiModelProperty(value = "是否在客户端新增时隐藏,0否1是")
+    private Integer isAddConceal;
+
+    @ApiModelProperty("参数掩码")
+    private String uniqueCode;
+}

+ 34 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateTableVO.java

@@ -0,0 +1,34 @@
+package org.springblade.manager.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tool.node.INode;
+import org.springblade.manager.entity.WbsTree;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class WbsTreePrivateTableVO  implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 标题
+     */
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @ApiModelProperty(value = "表单list")
+    List<WbsNodeTableVO> list;
+
+    public WbsTreePrivateTableVO() {
+    }
+    public WbsTreePrivateTableVO(String title, List<WbsNodeTableVO> list) {
+        this.title = title;
+        this.list = list;
+    }
+}

+ 12 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateVO.java

@@ -6,9 +6,12 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.core.tool.node.INode;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.manager.entity.WbsTreePrivate;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 @Data
@@ -68,5 +71,14 @@ public class WbsTreePrivateVO extends WbsTreePrivate implements INode<WbsTreePri
      */
     private Integer checkStatus = 0;
 
+    /**
+     * 附件类型
+     */
+    private List<String> tableFileTypes;
+
+    /**
+     * 项目名称
+     */
+    private String updateUserName;
 
 }

+ 1 - 1
blade-service/blade-archive/pom.xml

@@ -173,7 +173,7 @@
                     <target>${java.version}</target>
                     <encoding>${project.build.sourceEncoding}</encoding>
                     <compilerArguments>
-                        <bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar:${java.home}/lib/jsse.jar
+                        <bootclasspath>${java.home}/lib/rt.jar${path.separator}${java.home}/lib/jce.jar${path.separator}${java.home}/lib/jsse.jar
                         </bootclasspath>
                     </compilerArguments>
                 </configuration>

+ 25 - 8
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java

@@ -10,9 +10,12 @@ import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import org.apache.commons.lang.StringUtils;
+import org.springblade.archive.dto.FindAndReplaceDto;
+import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.service.IArchivesAutoService;
 import org.springblade.archive.utils.FileUtils;
 import org.springblade.archive.vo.ArchiveDataVo;
+import org.springblade.business.dto.FindAndReplaceDto1;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.business.feign.MetadataClassificationClient;
@@ -65,6 +68,7 @@ public class ArchiveFileController extends BladeController {
     private final MetadataClassificationClient metadataClassificationClient;
     private final IArchivesAutoService autoService;
     private final CommonFileClient commonFileClient;
+
     /**
      * 上传文件
      *
@@ -99,11 +103,11 @@ public class ArchiveFileController extends BladeController {
                 int i = 1;
                 for (ArchiveFileVO saveVo : saveList) {
                     try {
-                        if(StringUtils.isNotEmpty(saveVo.getPdfFileUrl())&&saveVo.getPageNum()==null){
+                        if (StringUtils.isNotEmpty(saveVo.getPdfFileUrl()) && saveVo.getPageNum() == null) {
                             String num = commonFileClient.getPdfNum(saveVo.getPdfFileUrl());
                             saveVo.setFilePage(Integer.valueOf(num));
                         }
-                    }catch (Exception e){
+                    } catch (Exception e) {
                         saveVo.setFilePage(0);
                     }
                     saveVo.setId(SnowFlakeUtil.getId());
@@ -156,8 +160,8 @@ public class ArchiveFileController extends BladeController {
         if (queryVo.getNodeIds().isEmpty() || queryVo.getNodeIds().equals("")) {
 
         } else {
-            ArchiveTreeContract rootNode=  this.archiveTreeContractClient.getArchiveTreeContractById(Long.parseLong(queryVo.getNodeIds()));
-            if (rootNode != null && rootNode.getExtType()!= null ) {
+            ArchiveTreeContract rootNode = this.archiveTreeContractClient.getArchiveTreeContractById(Long.parseLong(queryVo.getNodeIds()));
+            if (rootNode != null && rootNode.getExtType() != null) {
                 queryVo.setExtType(1);
             }
 
@@ -185,6 +189,7 @@ public class ArchiveFileController extends BladeController {
             this.archiveFileClient.updateArchiveFileSort(vo);
             try {
                 for (ArchiveFileVO saveVo : vo.getList()) {
+                    //获取源信息
                     metadataClassificationClient.createMetadataFile(saveVo.getId(), 0);
                 }
             } catch (Exception e) {
@@ -422,7 +427,7 @@ public class ArchiveFileController extends BladeController {
     @ApiOperation(value = "文件收集-上传文件责任者")
     public R getMetadataFile(String fileId) {
         long id;
-        try  {
+        try {
             fileId = fileId.split("_")[0];
             id = Long.parseLong(fileId);
         } catch (Exception e) {
@@ -454,8 +459,20 @@ public class ArchiveFileController extends BladeController {
     @PostMapping("/sendFileToEArchives")
     @ApiOperationSupport(order = 18)
     @ApiOperation(value = "智慧工地推送文件至电子档案数据规则接口")
-    public R<Boolean> sendFileToEArchives(@RequestBody ArchiveDataVo vo) {
-        //数据入库
-        return  autoService.sendFileToEArchives(vo);
+    public R<Boolean> sendFileToEArchives(@RequestBody List<ArchiveDataVo> vo) {
+        for (ArchiveDataVo v : vo) {
+            //数据入库
+            autoService.sendFileToEArchives(v);
+        }
+        return R.success("操作成功");
+    }
+
+    @PostMapping("/findAndReplace")
+    @ApiOperationSupport(order = 12)
+    @ApiOperation(value = "查找并替换", notes = "传入ids")
+    public R findAndReplace(@RequestBody FindAndReplaceDto dto){
+        List<ArchiveFile> archiveFiles = archiveFileClient.getAllArchiveFileByIds(Func.toStrList(dto.getIds()));
+        FindAndReplaceDto1 dto1 = new FindAndReplaceDto1(dto, archiveFiles);
+        return R.status(archiveFileClient.findAndReplace(dto1));
     }
 }

+ 12 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java

@@ -742,12 +742,22 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
                                     CreationHelper helper = workbook.getCreationHelper();
                                     RichTextString richText = helper.createRichTextString(displayText);
 
+                                    // 🔴🔴🔴 新增:获取原单元格的字体样式 🔴🔴🔴
+                                    CellStyle originalStyle = cell.getCellStyle();
+                                    Font originalFont = workbook.getFontAt(originalStyle.getFontIndex());
+
                                     // 创建白色字体(用于"占位"两字)
                                     Font whiteFont = workbook.createFont();
-                                    whiteFont.setColor(IndexedColors.WHITE.getIndex());
+                                    // 🟢🟢🟢 修改:继承原字体属性 🟢🟢🟢
+                                    whiteFont.setFontName(originalFont.getFontName()); // 继承字体名称
+                                    whiteFont.setFontHeightInPoints(originalFont.getFontHeightInPoints()); // 继承字号
+                                    whiteFont.setColor(IndexedColors.WHITE.getIndex()); // 只修改颜色
 
                                     // 创建默认黑色字体(用于实际文本)
                                     Font defaultFont = workbook.createFont();
+                                    // 🟢🟢🟢 修改:继承原字体属性 🟢🟢🟢
+                                    defaultFont.setFontName(originalFont.getFontName());
+                                    defaultFont.setFontHeightInPoints(originalFont.getFontHeightInPoints());
                                     defaultFont.setColor(IndexedColors.BLACK.getIndex());
 
                                     // 🔴 修复:正确设置索引范围
@@ -756,7 +766,7 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
                                     // 剩余字符:黑色(从索引2开始)
                                     if (displayText.length() > 2) {
-                                        richText.applyFont(3, displayText.length() - 1, defaultFont);
+                                        richText.applyFont(2, displayText.length() , defaultFont);
                                     }
 
                                     // 3. 设置单元格值

+ 36 - 31
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -766,7 +766,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	public List<Map<String, String>> getAllArchiveAgeByContractType(Long projectId) {
 		List<Map<String, String>> list = baseMapper.getAllArchiveAgeByContractType(projectId);
 		return list;
-	}
+}
 
 	@Override
 	public void splitArchvies(Long projectId, Long contractId, Long nodeId) {
@@ -3121,7 +3121,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		for (ArchiveTreeContract contract : archiveTreeContracts) {
 			boolean isContractValid = contractId.toString().equals(contract.getTreeCode()) || contractId.equals(contract.getContractId());
 
-			if (StringUtils.isEmpty(treeCode)) {
+			if (StringUtils.isEmpty(treeCode) || treeCode.equals("S")) {
 				if (StringUtils.isNotEmpty(nodeId)) {
 					if (isNodeOrAncestor(contract, nodeId)) {
 						result.add(contract);
@@ -3204,14 +3204,14 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			}
 
 			// 根据treeCode决定额外条件
-			boolean isOwnerContract = StringUtils.isEmpty(treeCode); // 业主合同段标识
+			boolean isOwnerContract = (StringUtils.isEmpty(treeCode) || treeCode.equals("S")); // 业主合同段标识
 			boolean passesOwnerCheck = contractId.toString().equals(contract.getTreeCode())
 					|| contractId.equals(contract.getContractId())
 					|| StringUtils.isEmpty(contract.getTreeCode());
 
 			if (isOwnerContract) {
 				// 业主合同段:仅需额外检查(nodeId为空时)
-				if (passesOwnerCheck) {
+				if (true) {
 					result.add(contract);
 				}
 			} else {
@@ -4579,7 +4579,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		String[] ids = archiveIds.split(",");
 		for (String archiveId : ids) {
 			ArchivesAuto auto = baseMapper.selectById(archiveId);
-			String sql = "select * from u_archive_file where archive_id = " + archiveId + " and is_deleted = 0 order by sort,sort_num,create_time";
+			String sql = "SELECT u.* FROM u_archive_file u LEFT JOIN m_archive_tree_contract m ON u.node_id = m.id WHERE u.archive_id = "+archiveId+" AND u.is_deleted = 0 ORDER BY m.sort, u.sort, u.sort_num, u.create_time";
 			//List<ArchiveFile> archiveFiles = archiveFileClient.getArchiveFileByArchiveID(Long.valueOf(archiveId));
 			List<ArchiveFile> archiveFiles = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ArchiveFile.class));
 			archiveAutoPdfService.buildArchiveFrontPdfs(projectId, auto, archiveFiles, true);
@@ -4784,11 +4784,11 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			return R.fail("请根据接口文档上传参数");
 		}
 
-		String nodeId = dataInfo.getNodeId();
+		String nodeIdstr = dataInfo.getNodeId();
 		String contractId = dataInfo.getContractId();
 		String fileUrl = dataInfo.getFileUrl();
 		String fileName = dataInfo.getFileNmae();
-		if (nodeId == null || Func.isNull(nodeId)) {
+		if (nodeIdstr == null || Func.isNull(nodeIdstr)) {
 			return R.fail("请上传nodeId");
 		}
 		if (contractId == null || Func.isNull(contractId)) {
@@ -4807,31 +4807,33 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		if (contractInfo == null) {
 			return R.fail("请传输正确的contractId");
 		}
-		//获取文件的父节点Id
-		Long treeContractId = baseMapper.getArchiveFileByParentId(nodeId, contractId);
-		if (treeContractId == null || Func.isNull(treeContractId)) {
-			R.fail("请校验传输的nodeId和contractId,没有查到父节点Id");
-		}
-
 
-		// 将数据插入到 auto表中
-		ArchivesAuto archivesAuto = new ArchivesAuto();
-		long newPkId = SnowFlakeUtil.getId(); //主键Id
-		archivesAuto.setId(newPkId);
-		archivesAuto.setProjectId(Func.toLong(contractInfo.getPId()));
-		archivesAuto.setContractId(Func.toLong(contractId));
-		archivesAuto.setName(fileName);
-		archivesAuto.setIsDeleted(0);
-		archivesAuto.setNodeId(treeContractId);
-		this.save(archivesAuto);
-
-		// 保存文件到archive_file表中
-		long arueId = SnowFlakeUtil.getId(); //主键Id
-		ArchiveFile archiveFile = new ArchiveFile();
-		archiveFile.setId(arueId);
-		archiveFile.setArchiveId(newPkId);
-		archiveFile.setFileName(fileName);
-		archiveFileClient.saveArchiveFileByBIM(archiveFile);
+		String[] nodeIds = nodeIdstr.split(",");
+		for (String  nodeId: nodeIds) {
+			//获取文件的父节点Id
+			Long treeContractId = baseMapper.getArchiveFileByParentId(nodeId, contractId);
+			if (treeContractId == null || Func.isNull(treeContractId)) {
+				R.fail("请校验传输的nodeId和contractId,没有查到父节点Id");
+			}
+			// 将数据插入到 auto表中
+			ArchivesAuto archivesAuto = new ArchivesAuto();
+			long newPkId = SnowFlakeUtil.getId(); //主键Id
+			archivesAuto.setId(newPkId);
+			archivesAuto.setProjectId(Func.toLong(contractInfo.getPId()));
+			archivesAuto.setContractId(Func.toLong(contractId));
+			archivesAuto.setName(fileName);
+			archivesAuto.setIsDeleted(0);
+			archivesAuto.setNodeId(treeContractId);
+			this.save(archivesAuto);
+
+			// 保存文件到archive_file表中
+			long arueId = SnowFlakeUtil.getId(); //主键Id
+			ArchiveFile archiveFile = new ArchiveFile();
+			archiveFile.setId(arueId);
+			archiveFile.setArchiveId(newPkId);
+			archiveFile.setFileName(fileName);
+			archiveFileClient.saveArchiveFileByBIM(archiveFile);
+		}
 		return R.success("保存成功");
 	}
 
@@ -5026,6 +5028,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		// 多个组的进行合并组操作
 		List<List<ArchiveFile>> nodeGroups = new ArrayList<>(nodeGroupMap.values());
 		List<List<ArchiveFile>> mergedGroups = new ArrayList<>();
+		List<Integer> mergedGroupsPageCount =  new ArrayList<>();
 
 		int i = 0;
 		while (i < nodeGroups.size()) {
@@ -5035,6 +5038,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			// 如果第一组页数和大于350,则第一组不合并
 			if (currentPages > 350) {
 				mergedGroups.add(currentMergedGroup);
+				mergedGroupsPageCount.add(currentPages);
 				i++;
 				continue;
 			}
@@ -5057,6 +5061,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			}
 
 			mergedGroups.add(currentMergedGroup);
+			mergedGroupsPageCount.add(currentPages);
 			i = j; // 从下一个未处理的组继续
 		}
 

+ 1 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java

@@ -578,7 +578,7 @@ public class FileUtils {
                             } else {
                                 if (rotate!= null && rotate.intValue() == 270) {
                                     //交换width和height
-                                    pdfReader.getPageN(index).put(PdfName.ROTATE, new PdfNumber(0)); // 顺时针旋转270°
+                                    pdfReader.getPageN(index).put(PdfName.ROTATE, new PdfNumber(180)); // 顺时针旋转270°
                                     //横表旋转后打页码坐标不一样
                                     over.showTextAligned(Element.ALIGN_LEFT, pageNumber, width - 35, 20, 0);
                                 }else {

+ 42 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/ContractLogController.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -44,6 +45,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
@@ -664,4 +666,44 @@ public class ContractLogController extends BladeController {
         return R.data(this.wbsTreeContractClient.queryCurrentContractLogList(contractId));
     }
 
+
+    /**
+     * 按月打包
+     *
+     * @param logVo 查询条件
+     * @return 结果
+     */
+    @PostMapping("/byMonthPack")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "按月打包")
+    public R<Boolean> byMonthPack(@RequestBody @Validated ContractLogVO logVo) {
+        return R.data(this.contractLogService.byMonthPack(logVo));
+    }
+
+    /**
+     * 查询按月打包
+     *
+     * @param logVo 查询条件
+     * @return 结果
+     */
+    @PostMapping("/selectByMonthPack")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "查询按月打包")
+    public R<Page<ContractLogMonthPack>> selectByMonthPack(@RequestBody ContractLogVO logVo) {
+        return R.data(this.contractLogService.selectByMonthPack(logVo));
+    }
+
+    /**
+     * 删除按月打包
+     *
+     * @param id id
+     * @return 结果
+     */
+    @GetMapping("/deleteByMonthPack")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "删除按月打包")
+    @ApiImplicitParam(name = "id", value = "id", required = true)
+    public R<Boolean> deleteByMonthPack(@RequestParam Long id) {
+        return R.data(this.contractLogService.deleteByMonthPack(id));
+    }
 }

+ 143 - 16
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -7,6 +7,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
@@ -28,7 +29,6 @@ import org.springblade.business.dto.CustomAddContractNodeDTO;
 import org.springblade.business.dto.ImportTreeDto;
 import org.springblade.business.dto.WbsTreeContractStatisticsDTO;
 import org.springblade.business.dto.FlushQueryNameDTO;
-import org.springblade.business.dto.FlushQueryNameDTO;
 import org.springblade.business.dto.PreviewNodeNameDTO;
 import org.springblade.business.dto.PreviewNodeNameDTO1;
 import org.springblade.business.entity.*;
@@ -68,6 +68,7 @@ import org.springblade.manager.vo.WbsTreeContractVO8;
 import org.springblade.manager.vo.WbsTreePrivateAddVO;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
+import org.springblade.system.entity.Dept;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
 import org.springblade.system.user.feign.IUserClient;
@@ -87,6 +88,9 @@ import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.*;
 import java.net.URLEncoder;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -113,6 +117,7 @@ public class InformationWriteQueryController extends BladeController {
     private final ContractClient contractClient;
 
     private final WbsTreeContractClient wbsTreeContractClient;
+    private final WbsTreeContractOldHtmlClient wbsTreeContractOldHtmlClient;
 
     private final WbsTreePrivateClient wbsTreePrivateClient;
 
@@ -159,6 +164,7 @@ public class InformationWriteQueryController extends BladeController {
     private final IRecycleBinService recycleBinService;
     private final WbsTreeContractStatisticsClientImpl wbsTreeContractStatisticsClient;
     private final IRecycleBinInfoService recycleBinInfoService;
+    private final INodeBaseInfoServiceClient nodeBaseInfoServiceClient;
 
 
     @Autowired
@@ -217,7 +223,7 @@ public class InformationWriteQueryController extends BladeController {
         String sgSuffix="";
         String jlSuffix="";
         if(queryList.size()>0){
-            String sql1="Select sg_suffix,jl_suffix from m_project_info where id="+queryList.get(0).getProjectId()+" and is_deleted=0";
+            String sql1="Select sg_suffix,jl_suffix,template_type from m_project_info where id="+queryList.get(0).getProjectId()+" and is_deleted=0";
             List<ProjectInfo> projectInfos = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(ProjectInfo.class));
             if(projectInfos.size()>0){
                 sgSuffix=projectInfos.get(0).getSgSuffix()==null?"":projectInfos.get(0).getSgSuffix();
@@ -228,7 +234,16 @@ public class InformationWriteQueryController extends BladeController {
                 String sql="select * from m_wbs_tree_contract where p_key_id="+query.getWbsId()+" and is_deleted=0";
                 WbsTreeContract contract = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
                 if(dto.getType()==1){
-                    result=wbsParamClient.createFileTitle(contract);
+                    R<List<String>>  nameRuleList = wbsParamClient.getNameRuleByPkeyId(contract.getPKeyId(), Long.valueOf(contract.getProjectId()));
+                    String nameRule = "";
+                    if (nameRuleList != null && nameRuleList.getData() != null && !nameRuleList.getData().isEmpty()) {
+                        nameRule = String.join("-", nameRuleList.getData());
+                    }
+                    if(projectInfos.get(0)!=null&&projectInfos.get(0).getTemplateType()==2){
+                        result  = nodeBaseInfoServiceClient.getNameRuleByRule(nameRule, contract.getPKeyId()+"");
+                    }else {
+                        result=wbsParamClient.createFileTitle(contract);
+                    }
                 }else {
                     result=nodeNameMap.get(query.getId());
                     //同时修改工程划分节点命名规则
@@ -262,6 +277,7 @@ public class InformationWriteQueryController extends BladeController {
         return R.status(this.informationQueryService.updateBatchById(queryList));
     }
 
+
     public List<String> getNameRuleByPkeyId(Long pKeyId, Long projectId) {
         NameRuleVo vo = new NameRuleVo();
         String sql2="select * from m_wbs_param where node_id="+pKeyId+" and type=200"+" and is_deleted=0 and k='FILE_TITLE'";
@@ -393,13 +409,14 @@ public class InformationWriteQueryController extends BladeController {
             if(StringUtils.isEmpty(dto1.getNameRule())){
                 throw new ServiceException("请输入题名规则");
             }
-            String sql="select p_key_id,ancestors_p_id from m_wbs_tree_contract where p_key_id="+dto1.getWbsId()+" and is_deleted=0";
-            WbsTreeContract contract = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
-            String result="";
-            if(contract!=null){
-                result= createFileTitle(contract, dto1.getNameRule());
-            }
-            list.add(new PreviewNodeNameVO1(dto1.getWbsId(),result));
+           String result=nodeBaseInfoServiceClient.getNameRuleByRule(dto1.getNameRule(),dto1.getWbsId());
+//            String sql="select p_key_id,ancestors_p_id from m_wbs_tree_contract where p_key_id="+dto1.getWbsId()+" and is_deleted=0";
+//            WbsTreeContract contract = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+//            String result="";
+//            if(contract!=null){
+//                result= createFileTitle(contract, dto1.getNameRule());
+//            }
+            list.add(new PreviewNodeNameVO1(dto1.getWbsId(),result.toString()));
         }
         return R.data(list);
     }
@@ -414,7 +431,7 @@ public class InformationWriteQueryController extends BladeController {
             WbsTreeContract contract = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
             String result="";
             if(nameRules!=null){
-                result= createFileTitle(contract, String.join("-", nameRules));
+                result = nodeBaseInfoServiceClient.getNameRuleByRule(String.join("-", nameRules), contract.getPKeyId() + "");
             }
             list.add(new PreviewNodeNameVO(dto.getWbsId(),result,nameRules));
         }
@@ -1214,8 +1231,48 @@ public class InformationWriteQueryController extends BladeController {
                 return R.data(300, false, "未查询到填报信息,上报失败");
             }
         } else { //质检
+            //记录选中节点的所有表单旧html
+            List<Long> list = Arrays.stream(startTaskVO.getIds().split(",")).map(Long::parseLong).collect(Collectors.toList());
+            List<WbsTreeContract> wbsTreeContracts =  wbsTreeContractClient.queryListByPIds(list,startTaskVO.getClassify());
+
+
             businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, startTaskVO.getIds().replaceAll(",", "")).eq(InformationQuery::getClassify, startTaskVO.getClassify().toString()).eq(InformationQuery::getType, 1).last("order by id desc limit 1"));
             if (businessData != null) {
+
+                //处理html 复制之后记录在新表中w
+                if (CollectionUtils.isNotEmpty(wbsTreeContracts)) {
+                    List<WbsTreeContractOldHtml> data = new ArrayList<>();
+                    try {
+                        for (WbsTreeContract wbsTreeContract : wbsTreeContracts) {
+                            ExcelTab byId = excelTabClient.getById(String.valueOf(wbsTreeContract.getExcelId()));
+                            WbsTreeContractOldHtml oldHtml = new WbsTreeContractOldHtml();
+                            oldHtml.setId(SnowFlakeUtil.getId());
+                            oldHtml.setCreateUser(getUser().getUserId());
+                            String htmlUrl = wbsTreeContract.getHtmlUrl();
+                            // 获取或下载文件
+                            Path sourcePath = FileUtils.getOrDownloadFile(htmlUrl);
+                            // 生成副本路径
+                            Path copyPath = FileUtils.generateCopyPath(sourcePath,wbsTreeContract.getPKeyId());
+                            // 执行复制操作(覆盖已存在的文件)
+                            Files.copy(sourcePath, copyPath, StandardCopyOption.REPLACE_EXISTING);
+
+                            oldHtml.setContractFormId(wbsTreeContract.getPKeyId());
+                            oldHtml.setOldHtmlUrl(copyPath.toFile().getAbsolutePath());
+                            //记录历史excel路径
+                            oldHtml.setOldExcelUrl(byId.getFileUrl());
+                            data.add(oldHtml);
+                        }
+                        List<Long> collect = data.stream().map(WbsTreeContractOldHtml::getContractFormId).collect(Collectors.toList());
+                        //删除旧记录
+                        wbsTreeContractOldHtmlClient.deleteByContractFormIds(collect);
+
+                        wbsTreeContractOldHtmlClient.save(data);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        throw new ServiceException(e.getMessage());
+                    }
+                }
+
                 //设置业务数据ID
                 startTaskVO.setIds(businessData.getId().toString());
                 return this.batchTask(startTaskVO);
@@ -1388,6 +1445,7 @@ public R<String> batchDownloadFileToZip(String ids, HttpServletResponse response
                  /*   result.forEach(query -> urls.add(
                             StringUtils.isNotEmpty(query.getNodePdfUrl()) ? query.getNodePdfUrl() + "@@@" + query.getName() + "-" + query.getId() : query.getPdfUrl() + "@@@" + query.getName() + "-" + query.getId()));
                    */
+                Map<String, Integer> nameMap = new HashMap<>();
                 for (int i=0;i<result.size();i++) {
                     String url_link = "";
                     List<TaskApprovalVO.ApprovalFile> files = jdbcTemplate.query("select name as fileName,domain_url as fileUrl from m_table_file where is_deleted = 0 and type in(10,11,12)and tab_id = ?", new BeanPropertyRowMapper<>(TaskApprovalVO.ApprovalFile.class), result.get(i).getWbsId());
@@ -1415,7 +1473,16 @@ public R<String> batchDownloadFileToZip(String ids, HttpServletResponse response
                     } else if (url != null && url.size() == 1) {
                         url_link = url.get(0);
                     }
-                    urls.add(url_link + "@@@" + result.get(i).getName() + "-" + result.get(i).getId());
+                    String fileName = result.get(i).getName();
+                    fileName = fileName == null ? "找不到文件题目" : fileName.replaceAll("\\\\", "_").replaceAll("/", "_");
+                    if (nameMap.containsKey(fileName)) {
+                        int num = nameMap.get(fileName) == null ? 1 : nameMap.get(fileName);
+                        nameMap.put(fileName, num + 1);
+                        fileName = fileName + "_" + num;
+                    } else {
+                        nameMap.put(fileName, 1);
+                    }
+                    urls.add(url_link + "@@@" + fileName);
                 }
 
                 //删除空数据
@@ -1985,7 +2052,6 @@ public R<Boolean> copyContractTreeNode(@RequestBody CopyContractTreeNodeVO vo) {
                         .filter(ObjectUtil::isNotEmpty)
                         .distinct()
                         .collect(Collectors.toList());
-                //表名集合转逗号拼接的字符串
                 if (!tabNames.isEmpty()) {
                     String inClausePlaceholders = String.join(",", Collections.nCopies(tabNames.size(), "?"));
                     String sql = "SELECT table_name AS queryType, GROUP_CONCAT(COLUMN_name) AS ancestors " +
@@ -2229,6 +2295,29 @@ public R<Boolean> copyContractTreeNode(@RequestBody CopyContractTreeNodeVO vo) {
                 if (StringUtils.isEmpty(contractId)) {
                     contractId = toCopyNode.getContractId();
                 }
+                String userRole = AuthUtil.getUserRole();
+                if(!"administrator".equals(userRole) && vo.getIsCopyData() == 1){
+                    // 查询当前节点有没有数据,有数据则不能复制
+                    if(vo.getClassifyType() != null && !vo.getClassifyType().isEmpty()) {
+                        List<InformationQuery> queries = informationQueryService.list(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getContractId, contractId)
+                                .in(InformationQuery::getClassify, vo.getClassifyType()).eq(InformationQuery::getWbsId, toCopyNode.getPKeyId()).in(InformationQuery::getStatus, 1, 2));
+                        if (!queries.isEmpty()) {
+                            Map<Integer, List<InformationQuery>> map = queries.stream().collect(Collectors.groupingBy(InformationQuery::getClassify));
+                            if (vo.getClassifyType().contains("1")) {
+                                List<InformationQuery> queryList = map.get(1);
+                                if (queryList != null && !queryList.isEmpty()) {
+                                    throw new ServiceException(toCopyNode.getFullName() + "节点有施工上报数据,不允许复制");
+                                }
+                            }
+                            if (vo.getClassifyType().contains("2")) {
+                                List<InformationQuery> queryList = map.get(2);
+                                if (queryList != null && !queryList.isEmpty()) {
+                                    throw new ServiceException(toCopyNode.getFullName() + "节点有监理上报数据,不允许复制");
+                                }
+                            }
+                        }
+                    }
+                }
             }
 
             WbsTreeContract needCopyNodeRoot = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getNeedCopyPrimaryKeyId());
@@ -2719,8 +2808,8 @@ private List<WbsTreeContract> reBuildAncestors(List<WbsTreeContract> list) {
 public void addCopyTabFile(Set<WbsTreeContract> addChildNodesTables,
                            Set<WbsTreeContract> addChildNodesTablesOld) {
     //获取所有数据源附件文件
-    List<Long> tabFileIds = addChildNodesTablesOld.stream().distinct().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
-    Map<String, List<TableFile>> tableFileOldMap = tableFileClient.getTabFilesByTabIds(StringUtils.join(tabFileIds, ",")).stream().collect(Collectors.groupingBy(TableFile::getTabId));
+    List<String> tabFileIds = addChildNodesTablesOld.stream().distinct().map(item -> item.getPKeyId() + "").collect(Collectors.toList());
+    Map<String, List<TableFile>> tableFileOldMap = tableFileClient.getTabFilesByTabIds(tabFileIds).stream().collect(Collectors.groupingBy(TableFile::getTabId));
     if (tableFileOldMap != null && tableFileOldMap.size() > 0) {
         List<TableFile> resultFileData = new ArrayList<>();
         Set<Long> updatePKeyIds = new HashSet<>();
@@ -3056,7 +3145,7 @@ private void addCopyNodesAndTabsBuildData(List<WbsTreeContract> addNodeList, Lis
         List<String> initTabNames = needTabs.stream().map(WbsTreeContract::getInitTableName).distinct().filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
         String joined = StringUtils.join(initTabNames, ",");
         joined = "'" + joined.replaceAll(",", "','") + "'";
-        Map<String, QueryProcessDataVO> tabColsAllByTabNameMaps = jdbcTemplate.query("SELECT table_name as queryType, GROUP_CONCAT(COLUMN_name) as ancestors from information_schema.COLUMNS where table_name in (" + joined + ") GROUP BY table_name", new BeanPropertyRowMapper<>(QueryProcessDataVO.class)).stream().collect(Collectors.toMap(QueryProcessDataVO::getQueryType, Function.identity()));
+        Map<String, QueryProcessDataVO> tabColsAllByTabNameMaps = jdbcTemplate.query("SELECT table_name as queryType, GROUP_CONCAT(DISTINCT COLUMN_name) as ancestors from information_schema.COLUMNS where table_name in (" + joined + ") GROUP BY table_name", new BeanPropertyRowMapper<>(QueryProcessDataVO.class)).stream().collect(Collectors.toMap(QueryProcessDataVO::getQueryType, Function.identity()));
         for (WbsTreeContract node : needNodes) {
             Long oldId = node.getId();
             //新节点
@@ -5248,4 +5337,42 @@ public R<Object> customAddContractNode(@RequestBody CustomAddContractNodeDTO dto
         }
         throw new IllegalArgumentException("新数据中未找到根节点");
     }
+
+    // pdf 检查任务添加
+    /**
+     * 首件wbs 树
+     *
+     * @return 结果
+     */
+    @GetMapping("/updateCheckPdfInfo")
+    @ApiOperationSupport(order = 40)
+    @ApiOperation(value = "添加pdf检查接口")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "type", value = "1:节点添加 2:文件添加",required = true),
+            @ApiImplicitParam(name = "classify", value = "1施工2监理",required = true),
+            @ApiImplicitParam(name = "ids", value = "多个用,拼接", required = true)
+    })
+    public  R updateCheckPdfInfo(@RequestParam String type, @RequestParam String ids,@RequestParam String classify) {
+
+        return informationQueryService.updateCheckPdfInfo(type, ids,classify);
+    }
+
+    /**
+     * 首件wbs 树
+     *
+     * @return 结果
+     */
+    @GetMapping("/getCheckPdfPaceInfo")
+    @ApiOperationSupport(order = 40)
+    @ApiOperation(value = "添加pdf检查接口")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "type", value = "1:节点添加 2:文件添加",required = true),
+            @ApiImplicitParam(name = "classify", value = "1施工2监理",required = true),
+            @ApiImplicitParam(name = "ids", value = "多个用,拼接", required = true)
+    })
+    public  R<ChekPdfPaceVo> getCheckPdfPaceInfo(@RequestParam String contractId,@RequestParam String classify) {
+
+        ChekPdfPaceVo checkPdfPaceInfo = informationQueryService.getCheckPdfPaceInfo(contractId, classify);
+        return R.data(checkPdfPaceInfo);
+    }
 }

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

@@ -192,9 +192,9 @@ public class MessageWarningController extends BladeController {
             iPage.getRecords().forEach(reVO -> {
                 if (reVO.getType() != null && reVO.getType() == 3) {
                     if (reVO.getContent() != null && reVO.getContent().contains("驳回了")) {
-                        reVO.setTypeValue("驳回通知");
+                        reVO.setRepealType("驳回通知");
                     } else if (reVO.getContent() != null && reVO.getContent().contains("废除了")) {
-                        reVO.setTypeValue("废除通知");
+                        reVO.setRepealType("废除通知");
                     }
                     return;
                 }

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

@@ -99,7 +99,7 @@ public class NeiWaiYeProgressController {
                 queryProcessDataVOList = this.informationQueryService.queryProcessDataByParentIdAndContractId2(node.getId().toString(), classFy, contractId);
             } else {
                 //填报节点
-                queryProcessDataVOList = this.informationQueryService.queryProcessDataByPrimaryKeyIdAndClassify(node.getPKeyId().toString(), classFy);
+                queryProcessDataVOList = this.informationQueryService.queryProcessDataByPrimaryKeyIdAndClassify(node.getPKeyId().toString(), classFy, null);
                 childList.clear();
                 //设置填报节点进集合中
                 childList.add(node);
@@ -165,7 +165,7 @@ public class NeiWaiYeProgressController {
                 queryProcessDataVOList = this.informationQueryService.queryProcessDataByParentIdAndContractId(node.getId().toString(), 1, contractId);
             } else {
                 //填报节点
-                queryProcessDataVOList = this.informationQueryService.queryProcessDataByPrimaryKeyIdAndClassify(node.getPKeyId().toString(), 1);
+                queryProcessDataVOList = this.informationQueryService.queryProcessDataByPrimaryKeyIdAndClassify(node.getPKeyId().toString(), 1, null);
                 childList.clear();
                 //设置填报节点进集合中
                 childList.add(node);

+ 94 - 10
blade-service/blade-business/src/main/java/org/springblade/business/controller/NeiYeController.java

@@ -1,6 +1,8 @@
 package org.springblade.business.controller;
 
 import cn.hutool.core.date.DateUtil;
+import com.aliyun.oss.ServiceException;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.BeanUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -24,9 +26,11 @@ import org.springblade.business.vo.NeiYeQueryVO;
 import org.springblade.business.vo.QueryProcessDataVO;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.WbsFormElement;
@@ -36,6 +40,8 @@ import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.WbsTreeContractClient;
 import org.springblade.manager.feign.WbsTreePrivateClient;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
+import org.springblade.system.entity.DictBiz;
+import org.springblade.system.entity.Region;
 import org.springframework.core.io.ByteArrayResource;
 import org.springframework.core.io.Resource;
 import org.springframework.http.HttpHeaders;
@@ -46,6 +52,7 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.SingleColumnRowMapper;
 import org.springframework.web.bind.annotation.*;
 import org.springblade.core.mp.support.Query;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.ByteArrayOutputStream;
@@ -86,6 +93,12 @@ public class NeiYeController {
     @ApiOperation(value = "获取内业台账列表")
     public R<IPage<NeiYeLedgerVO>> queryCurrentNodeNeiYeLedger(@RequestBody NeiYeQueryVO queryVO) {
         if (queryVO.getWbsIds() != null && queryVO.getWbsIds().size() > 0) {
+            //查询字典 dict_biz  code = table_file_type
+            List<DictBiz> dictBiz = jdbcTemplate.query("select * from blade_dict_biz where code = 'table_file_type'", new BeanPropertyRowMapper<>(DictBiz.class));
+            if(CollectionUtil.isEmpty(dictBiz)){
+               throw new ServiceException("table_file_type 字典未查询到数据");
+            }
+            Map<String, String> dictMap = dictBiz.stream().collect(Collectors.toMap(DictBiz::getDictKey, DictBiz::getDictValue));
             //生成列表
             List<NeiYeLedgerVO> neiYeLedgerVOList = new ArrayList<>();
             Integer contractType = 1;
@@ -112,18 +125,21 @@ public class NeiYeController {
             }
             //不是工序,则查询当前节点下的所有填报节点
             List<QueryProcessDataVO> queryDataResult;
+            //本身就是工序节点就查本节点
+            if(node.getNodeType() == 6){
+                queryVO.setSelectType(2);
+            }
             //有些填报节点的MajorDataType为0
-            if (!new Integer("6").equals(node.getNodeType()) && ObjectUtil.isNotEmpty(node.getMajorDataType()) &&!Arrays.asList("1,2,3,4".split(",")).contains(node.getMajorDataType().toString())
-                    && !node.getNodeName().contains("开工报告") && !node.getNodeName().contains("质量检验评定表")) {
+            if (queryVO.getSelectType() != null && queryVO.getSelectType() == 1) {
                 //非填报节点
                 if (node.getParentId() == 0) {
-                    queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractIdTwo("", contractType, contractId);
+                    queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractIdTwo("", contractType, contractId, queryVO.getDateIsComplete());
                 } else {
-                    queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractIdTwo(node.getPKeyId().toString(), contractType, contractId);
+                    queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractIdTwo(node.getAncestorsPId() + "," + node.getPKeyId(), contractType, contractId, queryVO.getDateIsComplete());
                 }
             } else {
                 //填报节点
-                queryDataResult = this.informationQueryService.queryProcessDataByPrimaryKeyIdAndClassify(node.getPKeyId().toString(), contractType);
+                queryDataResult = this.informationQueryService.queryProcessDataByPrimaryKeyIdAndClassify(node.getPKeyId().toString(), contractType, queryVO.getDateIsComplete());
             }
 
             if (queryDataResult != null && queryDataResult.size() > 0) {
@@ -134,6 +150,43 @@ public class NeiYeController {
                 List<String> stringList = jdbcTemplate.queryForList(sql, String.class);
                 if (stringList.size() > 0) {
                     queryDataResult.stream().forEach(qdr -> {
+                        StringBuilder sb = new StringBuilder();
+                        if (StringUtils.isEmpty(qdr.getPrivateTableFileType())) {
+                            sb.append("/");
+                        } else {
+                            //后台节点配置的附件类型
+                            List<String> privateFileType = Arrays.asList(qdr.getPrivateTableFileType().split(","));
+                            //附件名称
+                            List<String> names = new ArrayList<>();
+
+                            if (StringUtils.isNotEmpty(qdr.getContractTableFileType()) || StringUtils.isNotEmpty(qdr.getContractTableFileTypeTwo())) {
+                                if(StringUtils.isEmpty(qdr.getContractTableFileType())){
+                                    qdr.setContractTableFileType(qdr.getContractTableFileTypeTwo());
+                                } else {
+                                    qdr.setContractTableFileType(qdr.getContractTableFileType()+","+qdr.getContractTableFileTypeTwo());
+                                }
+
+                                List<String> contractFileType = Arrays.asList(qdr.getContractTableFileType().split(","));
+
+                                HashSet<String> strings = new HashSet<>(contractFileType);
+                                //后台配置的与合同段配置的附件类型比较 查到质检未配置的附件名称
+                                List<String> collect = privateFileType.stream().filter(fileType -> !strings.contains(fileType)).collect(Collectors.toList());
+                                if (CollectionUtil.isNotEmpty(collect)) {
+                                    collect.forEach(f -> names.add("【" + dictMap.get(f) + "】"));
+                                } else {
+                                    sb.append("报告完整");
+                                    qdr.setFileType(true);
+                                }
+                            } else {
+                                privateFileType.forEach(f -> names.add("【" + dictMap.get(f) + "】"));
+                            }
+                            if(CollectionUtil.isNotEmpty(names)){
+                                sb.append("缺少").append(StringUtils.join(names, "、"));
+                            }
+                        }
+
+                        qdr.setFileTypeMsg(sb.toString());
+
                         if (stringList.contains(qdr.getPrimaryKeyId())) {
                             qdr.setIsExperiment("true");
                         }
@@ -145,6 +198,10 @@ public class NeiYeController {
                     queryDataResult = queryDataResult.stream()
                             .filter(qdr -> isExperiment.equals(qdr.getIsExperiment())).collect(Collectors.toList());
                 }
+                //过滤附件
+                if (queryVO.getIsFile() != null) {
+                    queryDataResult = queryDataResult.stream().filter(f -> Objects.equals(f.getFileType(), queryVO.getIsFile())).collect(Collectors.toList());
+                }
                 //设置评定值
                 queryDataResult.stream().forEach(qdr -> qdr.setEvaluate("false"));
                 List<QueryProcessDataVO> vos = queryDataResult.stream().filter(qdr -> qdr.getTitle().contains("质量检验评定表"))
@@ -240,8 +297,13 @@ public class NeiYeController {
                     return R.data(300, null, "未查询到数据");
                 }
                 //分组
-                List<List<QueryProcessDataVO>> groupList = CommonUtil.getBatchSize(queryDataResult, queryVO.getSize());
-                List<QueryProcessDataVO> groupQueryList = groupList.get(queryVO.getCurrent() == 0 ? 0 : queryVO.getCurrent() - 1);
+                List<QueryProcessDataVO> groupQueryList = null;
+                if(queryVO.getSize() != null && queryVO.getSize() > 0){
+                    List<List<QueryProcessDataVO>> groupList = CommonUtil.getBatchSize(queryDataResult, queryVO.getSize());
+                     groupQueryList = groupList.get(queryVO.getCurrent() == 0 ? 0 : queryVO.getCurrent() - 1);
+                }else{
+                    groupQueryList = queryDataResult;
+                }
 
                 //获取所有施工日志记录
                 List<String> primaryKeyIds = groupQueryList.stream().map(QueryProcessDataVO::getPrimaryKeyId).distinct().collect(Collectors.toList());
@@ -273,7 +335,7 @@ public class NeiYeController {
                     }
                     //todo 当前缺少是否关联评定、是否关联试验 =================================
                     //新增列表数据
-                    neiYeLedgerVOList.add(new NeiYeLedgerVO(map.get("unitProject"),
+                    NeiYeLedgerVO neiYeLedgerVO = new NeiYeLedgerVO(map.get("unitProject"),
                             map.get("partProject"),
                             map.get("partChildProject"),
                             map.get("subentryProject"),
@@ -285,8 +347,13 @@ public class NeiYeController {
                             vo.getEvaluate(),
                             vo.getIsExperiment(),
                             vo.getReportNumber(),
-                            vo.getInformationQueryId())
-                    );
+                            vo.getInformationQueryId());
+
+                    neiYeLedgerVO.setDateIsComplete(vo.getDateIsComplete());
+                    neiYeLedgerVO.setInfoQueryName(vo.getInfoQueryName());
+                    neiYeLedgerVO.setPdfUrl(vo.getPdfUrl());
+                    neiYeLedgerVO.setFileTypeMsg(vo.getFileTypeMsg());
+                    neiYeLedgerVOList.add(neiYeLedgerVO);
                 }
                 //转换为page信息
                 Query query = new Query();
@@ -552,4 +619,21 @@ public class NeiYeController {
         }
     }
 
+
+    /**
+     * 导出业内台账
+     */
+    @PostMapping("export")
+    @ApiOperationSupport(order = 11)
+    @ApiOperation(value = "导出业内台账", notes = "传入user")
+    public void exportRegion(@RequestBody NeiYeQueryVO queryVO,HttpServletResponse response) {
+        //导出所有
+        queryVO.setSize(-1);
+        R<IPage<NeiYeLedgerVO>> iPageR = queryCurrentNodeNeiYeLedger(queryVO);
+        //获取数据
+        if(iPageR.isSuccess()){
+            List<NeiYeLedgerVO> list = iPageR.getData().getRecords();
+            ExcelUtil.export(response, "内业台账" + org.springblade.core.tool.utils.DateUtil.time(), "行政区划数据表", list, NeiYeLedgerVO.class);
+        }
+    }
 }

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

@@ -3,6 +3,7 @@ package org.springblade.business.controller;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -81,7 +82,7 @@ public class RecycleBinController extends BladeController {
         if (vo.getRegainIds() != null && vo.getRegainIds().size() > 0) {
             //获取数据
             List<Long> longs = vo.getRegainIds().stream().map(i -> i.getId()).collect(Collectors.toList());
-            List<RecycleBin> recycleBinList = this.recycleBinService.list(Wrappers.<RecycleBin>lambdaQuery().in(RecycleBin::getId, longs));
+            List<RecycleBin> recycleBinList = this.recycleBinService.list(Wrappers.<RecycleBin>lambdaQuery().eq(RecycleBin::getStatus,1).in(RecycleBin::getId, longs));
             //恢复数据成功后删除回收站对应记录
             List<String> recycleBinIds = new ArrayList<>();
             //划分数据类型
@@ -89,10 +90,26 @@ public class RecycleBinController extends BladeController {
             List<RecycleBin> nodeTypeList = recycleBinList.stream().filter(recycleBin -> new Integer("2").equals(recycleBin.getDelType())).distinct().collect(Collectors.toList());
             boolean regainNode = false, regainFile = false;
             if (nodeTypeList.size() > 0) {
+                List<RecycleBin> errorList = new ArrayList<>();
+                //筛选出项目级存在的节点
+                for (RecycleBin recycleBin : nodeTypeList) {
+                    //当前是否有节点在项目级被删除了  如果是标记当前节点不可用
+                    Integer count = this.wbsTreeContractClient.findIsExistTreeNode(Arrays.asList(recycleBin.getBusinessId().split(",")));
+                    if (count > 0){
+                        recycleBin.setStatus(2);
+                        errorList.add(recycleBin);
+                    }
+                }
+                if(CollectionUtils.isNotEmpty(errorList)){
+                    recycleBinService.updateBatchById(errorList);
+                    nodeTypeList.removeAll(errorList);
+                }
+
                 //恢复集合
                 List<String> processNodeList = new ArrayList<>();
                 this.foreachQueryData(nodeTypeList, recycleBinIds, processNodeList);
                 try {
+
                     //恢复数据
                     if (processNodeList.size() > 0) {
                         regainNode = this.wbsTreeContractClient.regainRemoveTreeByPrimaryKeyIds(processNodeList);
@@ -142,7 +159,7 @@ public class RecycleBinController extends BladeController {
 
     private void foreachQueryData(List<RecycleBin> recycleList, List<String> recycleBinIds, List<String> result) {
         for (RecycleBin recycleBin : recycleList) {
-            if (StringUtils.isNotEmpty(recycleBin.getBusinessId())) {
+            if (StringUtils.isNotEmpty(recycleBin.getBusinessId()) && recycleBin.getStatus() == 1) {
                 if (recycleBin.getBusinessId().contains(",")) {
                     result.addAll(new ArrayList<>(Arrays.asList(recycleBin.getBusinessId().split(","))));
                 } else {

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

@@ -47,8 +47,8 @@ public class StandardInfoController {
      */
     @GetMapping("page")
     @ApiOperation(value = "分页查询所有数据", notes = "传入分页对象和高级查询对象")
-    public R<IPage<StandardInfoDTO>> selectAll(Query query, StandardInfo standardInfo) {
-        IPage<StandardInfoDTO> page = this.uStandardInfoService.selectMyPage(query, standardInfo);
+    public R<IPage<StandardInfoDtoVo>> selectAll(Query query, StandardInfo standardInfo) {
+        IPage<StandardInfoDtoVo> page = this.uStandardInfoService.selectMyPage(query, standardInfo);
         return R.data(page);
     }
 

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

@@ -52,6 +52,7 @@ import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.entity.ProjectInfo;
+import org.springblade.manager.feign.ProjectClient;
 import org.springblade.resource.feign.CommonFileClient;
 import org.springblade.resource.feign.NewISmsClient;
 import org.springblade.system.cache.ParamCache;
@@ -103,6 +104,7 @@ public class TaskController extends BladeController {
     private final ArchiveExpertConclusionClient conclusionClient;
     private final MessageWarningServiceImpl messageWarningServiceImpl;
     private final OperationLogClient operationLogClient;
+    private final ProjectClient projectClient;
 
     /**
      * 记录短信验证码超时时间
@@ -110,18 +112,23 @@ public class TaskController extends BladeController {
     @GetMapping("/save-sms-timeout")
     @ApiOperationSupport(order = 13)
     @ApiOperation(value = "记录短信验证码超时时间")
-    public void saveSmsTimeout(@RequestParam String code) {
+    public void saveSmsTimeout(@RequestParam String code,String projectId) {
         //获取账户记录
      ///   String aesKey = "O2BEeIv399qHQNhD6aGW8R8DEj4bqHXm";
      //   String accode = AesUtil.decryptFormBase64ToString(code, aesKey);
         DefaultConfig config = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery()
                 .eq(DefaultConfig::getCreateUser, AuthUtil.getUserId())
                 .isNotNull(DefaultConfig::getSmsCode));
+        int addTime = 1;
         if (config != null) {
+            if(projectId!=null && !projectId.equals("") && Func.isNotEmpty(projectId)){
+                ProjectInfo projectInfo = projectClient.getById(projectId);
+                addTime = projectInfo.getMsTime() == null ? 60 : (int)(projectInfo.getMsTime() * 60);
+            }
             //获取当前时间
             Date now = DateUtil.now();
             // 16 改为 1小时后超时
-            now = DateUtil.plusHours(now, 1);
+            now = DateUtil.plusMinutes(now, addTime);
 
             LambdaUpdateWrapper<DefaultConfig> wrapper = new LambdaUpdateWrapper<>();
             wrapper.set(DefaultConfig::getSmsTimeOut, DateUtil.format(now, "yyyy-MM-dd HH:mm:ss"));
@@ -165,14 +172,16 @@ public class TaskController extends BladeController {
     /**
      * 批量审批详情
      */
-    @GetMapping("/batch-approval-parameter")
+    @PostMapping("/batch-approval-parameter")
     @ApiOperationSupport(order = 11)
     @ApiOperation(value = "批量页详情")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "formDataId", value = "数据源", required = true),
             @ApiImplicitParam(name = "approvalType", value = "上报类型", required = true)
     })
-    public R<List<TaskApprovalVO>> getBatchApprovalTaskParameter(@RequestParam String formDataId, @RequestParam String approvalType) {
+    public R<List<TaskApprovalVO>> getBatchApprovalTaskParameter(@RequestBody BatchTaskVO vo) {
+        String formDataId = vo.getFormDataId();
+        String approvalType = vo.getApprovalType();
         List<String> longs = Func.toStrList(formDataId);
         List<String> apptype = Func.toStrList(approvalType);
         List<TaskApprovalVO> taskApprovalVOList = new ArrayList<>();
@@ -1294,7 +1303,8 @@ public class TaskController extends BladeController {
         int size = dto.getSize();
         //封装入参SQL
         List<Object> params = new ArrayList<>();
-        StringBuilder sqlString = new StringBuilder("SELECT * FROM u_task WHERE 1=1 AND is_deleted = 0 AND approval_type in(1,3,4,8,9,10)");
+        String sqlResult = "SELECT * ";
+        StringBuilder sqlString = new StringBuilder(" FROM u_task WHERE 1=1 AND is_deleted = 0 AND approval_type in(1,3,4,8,9,10)");
         if (ObjectUtil.isNotEmpty(dto.getTypeValue())) {
             sqlString.append(" AND type = ?");
             params.add(dto.getTypeValue());
@@ -1370,7 +1380,8 @@ public class TaskController extends BladeController {
                     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 = ?)");
                     params.add(1);
                     params.add(SecureUtil.getUserId());
-
+                    sqlResult = "SELECT *, (SELECT ifnull(e_visa_status, -1)  FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.STATUS = 1 " +
+                            "AND u_task_parallel.task_user = " + SecureUtil.getUserId() + " and is_deleted = 0 order by id desc limit 1) as e_status";
                     //如果是待办页面,且 任务状态下拉框 选择的不是 待审批状态 的任务,那么直接返回null
                 } else if (ObjectUtil.isNotEmpty(dto.getStatusValue()) && !dto.getStatusValue().equals(1)) {
                     return null;
@@ -1381,6 +1392,8 @@ public class TaskController extends BladeController {
                     params.add(1);
                     params.add(SecureUtil.getUserId());
                     sqlString.append(" AND status = 1");
+                    sqlResult = "SELECT *, (SELECT ifnull(e_visa_status, -1)  FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.STATUS = 1 " +
+                            "AND u_task_parallel.task_user = " + SecureUtil.getUserId() + " and is_deleted = 0 order by id desc limit 1) as e_status";
                 }
 
             } else if (dto.getSelectedType().equals(2)) { //已办页面
@@ -1398,7 +1411,7 @@ public class TaskController extends BladeController {
 //        sqlString.append(" AND (SELECT COUNT(1)  FROM u_information_query WHERE u_task.form_data_id = id and is_deleted=0) > 0");
 
         //总数量
-        String sqlCount = sqlString.toString().replace("*", "count(1)");
+        String sqlCount = "select count(1) " +  sqlString;
         Optional<Integer> totalCountOptional = Optional.ofNullable(jdbcTemplate.queryForObject(sqlCount, Integer.class, params.toArray()));
         int totalCount = totalCountOptional.orElse(0);
 
@@ -1414,13 +1427,17 @@ public class TaskController extends BladeController {
             }
         } else {
             //Web端默认倒叙
-            sqlString.append(" ORDER BY create_time DESC LIMIT ? OFFSET ?");
+            if (!sqlResult.equals("SELECT * ")) {
+                sqlString.append(" ORDER BY e_status asc, create_time DESC LIMIT ? OFFSET ?");
+            } else {
+                sqlString.append(" ORDER BY create_time DESC LIMIT ? OFFSET ?");
+            }
         }
         params.add(size);
         params.add((current - 1) * size);
 
         //执行SQL获取数据
-        String sqlPage = sqlString.toString();
+        String sqlPage = sqlResult + sqlString;
         List<Task> resultList = jdbcTemplate.query(
                 sqlPage,
                 new BeanPropertyRowMapper<>(Task.class),
@@ -1458,6 +1475,7 @@ public class TaskController extends BladeController {
                     vo.setApprovalType(task.getApprovalType());
                     vo.setFormDataId(task.getFormDataId());
                     vo.setProcessInstanceId(task.getProcessInstanceId());
+                    vo.setEStatus(task.getEStatus());
                     List<TaskParallel> taskParallelList = finalTaskParallelGroupMap.get(task.getProcessInstanceId());
                     if (taskParallelList != null && taskParallelList.size() > 0) {
                         //如果是垂直签,且是待办页面,判断是否是当前用户审批轮次,不是当前用户审批轮次就不显示该任务
@@ -2065,6 +2083,18 @@ public class TaskController extends BladeController {
         return taskService.reSigningEVisaStatus0(dtos,header);
     }
 
+    @GetMapping("/checkAndRepairPDFisNull")
+    @ApiOperation(value = "检查PDF是否为空")
+    @ApiOperationSupport(order = 3)
+    public void checkAndRepairPDFisNull(HttpServletRequest request) throws Exception {
+        String header = request.getHeader("Blade-Auth");
+        Long projectId=1904814720589430785L;
+        String sql="select id,wbs_id,project_id,contract_id from u_information_query where project_id="+projectId+" and pdf_url is null and node_pdf_url is null  and status in(0,1,2) and is_deleted=0";
+        List<reSigningEVisaStatus> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(reSigningEVisaStatus.class));
+        taskService.reSigningEVisaStatus0(query,header);
+        System.out.println("完成");
+    }
+
     @PostMapping("/reSigningEntrust")
     @ApiOperationSupport(order = 3)
     @ApiOperation(value = "委托单管理-一键重签", notes = "传入taskIds、下拉框的contractId、projectId")
@@ -2220,4 +2250,15 @@ public class TaskController extends BladeController {
         return R.data(true);
     }
 
+    /**
+     * 资料填报-任务管理- 电签签字
+     */
+    @PostMapping("/reSigningEVisaByUserIds")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "任务管理-一键重签", notes = "传入taskIds、下拉框的contractId、projectId")
+    public R<Object> reSigningEVisaByUserIds(@RequestParam String ids, @RequestParam String userIds) {
+
+       return taskService.reSigningEVisaByUserIds(ids,userIds);
+    }
+
 }

+ 207 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialClassificationTreeController.java

@@ -0,0 +1,207 @@
+/*
+ *      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.business.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.business.dto.TrialClassificationTreeDTO;
+import org.springblade.business.dto.TrialClassificationTreeDTO1;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.business.entity.TrialClassificationTree;
+import org.springblade.business.vo.TrialClassificationTreeVO;
+import org.springblade.business.service.ITrialClassificationTreeService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * 德飞试验系统检测分类树 控制器
+ *
+ * @author BladeX
+ * @since 2025-08-15
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/trialclassificationtree")
+@Api(value = "德飞试验系统检测分类树", tags = "德飞试验系统检测分类树接口")
+public class TrialClassificationTreeController extends BladeController {
+
+	private final ITrialClassificationTreeService trialClassificationTreeService;
+
+//	/**
+//	 * 详情
+//	 */
+//	@GetMapping("/detail")
+//	@ApiOperationSupport(order = 1)
+//	@ApiOperation(value = "详情", notes = "传入trialClassificationTree")
+//	public R<TrialClassificationTree> detail(TrialClassificationTree trialClassificationTree) {
+//		TrialClassificationTree detail = trialClassificationTreeService.getOne(Condition.getQueryWrapper(trialClassificationTree));
+//		return R.data(detail);
+//	}
+//
+	/**
+	 * 德飞试验系统检测分类树
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "查询当前节点的子节点", notes = "传入trialClassificationTree")
+	public R<List<TrialClassificationTreeVO>> list(Long id,Long projectId) {
+		if(projectId==null){
+			throw new ServiceException("请选择项目");
+		}
+		List<TrialClassificationTreeVO> list = trialClassificationTreeService.selectAllNode(id,projectId);
+		return R.data(list);
+	}
+
+//	/**
+//	 * 自定义分页 德飞试验系统检测分类树
+//	 */
+//	@GetMapping("/page")
+//	@ApiOperationSupport(order = 3)
+//	@ApiOperation(value = "分页", notes = "传入trialClassificationTree")
+//	public R<IPage<TrialClassificationTreeVO>> page(TrialClassificationTreeVO trialClassificationTree, Query query) {
+//		IPage<TrialClassificationTreeVO> pages = trialClassificationTreeService.selectTrialClassificationTreePage(Condition.getPage(query), trialClassificationTree);
+//		return R.data(pages);
+//	}
+
+	/**
+	 * 新增 德飞试验系统检测分类树
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入trialClassificationTree")
+	public R save(@Valid @RequestBody TrialClassificationTreeDTO1 dto) {
+		Boolean flag=false;
+		if(dto.getGroupType()!=null&&dto.getGroupType()==1){
+			if(dto.getList().size()>1){
+				trialClassificationTreeService.deleteByGroupType(dto.getGroupType());
+				flag=true;
+			}
+		}
+		// 假设您有一个 List<TrialClassificationTreeDTO> list
+		Map<Long, Long> map = dto.getList().stream()
+				.collect(Collectors.toMap(
+						TrialClassificationTreeDTO::getId, // 按 parentId 分组
+						TrialClassificationTreeDTO::getParentId // 收集每个分组的 id 列表
+				));
+		List<TrialClassificationTree>insertList=new ArrayList<>();
+		for (TrialClassificationTreeDTO trialClassificationTreeDTO : dto.getList()) {
+			TrialClassificationTree trialClassificationTree = new TrialClassificationTree();
+			BeanUtil.copy(trialClassificationTreeDTO, trialClassificationTree);
+			Long parentId = trialClassificationTree.getParentId();
+			StringBuilder classificationAncestors = new StringBuilder();
+			classificationAncestors.append(trialClassificationTree.getId());
+			if(parentId!=0){
+				classificationAncestors.append( ",").append(parentId);
+			}
+			while (parentId!=null&&parentId!=0){
+				parentId = selectAncestors(parentId,map,flag);
+				if(parentId!=null&&parentId!=0){
+					classificationAncestors.append(",").append(parentId);
+				}
+			}
+			trialClassificationTree.setClassificationAncestors(classificationAncestors.toString());
+			trialClassificationTree.setGroupType(dto.getGroupType());
+			insertList.add(trialClassificationTree);
+		}
+		return R.status(trialClassificationTreeService.saveBatch(insertList));
+	}
+
+	public Long selectAncestors(Long parentId,Map<Long, Long> map,Boolean flag) {
+		if(parentId==0){
+			return null;
+		}
+		if(map.containsKey(parentId)){
+			if(map.get(parentId)!=null){
+				return map.get(parentId);
+			}
+		}else {
+			if(!flag){
+				return trialClassificationTreeService.selectAncestors(parentId);
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * 修改 德飞试验系统检测分类树
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入trialClassificationTree")
+	public R update(Long id,String classificationName) {
+		if(id==null){
+			return R.fail("请选择要修改的分类");
+		}
+		if(Func.isEmpty(classificationName)){
+			return R.fail("请输入分类名称");
+		}
+		TrialClassificationTree trialClassificationTree = new TrialClassificationTree();
+		trialClassificationTree.setClassificationName(classificationName);
+		return R.status(trialClassificationTreeService.update(new UpdateWrapper<TrialClassificationTree>().set("classification_name", classificationName).eq("id", id)));
+	}
+
+//	/**
+//	 * 新增或修改 德飞试验系统检测分类树
+//	 */
+//	@PostMapping("/submit")
+//	@ApiOperationSupport(order = 6)
+//	@ApiOperation(value = "新增或修改", notes = "传入trialClassificationTree")
+//	public R submit(@Valid @RequestBody List<TrialClassificationTree> trialClassificationTrees) {
+//		return R.status(trialClassificationTreeService.saveOrUpdateBatch(trialClassificationTrees));
+//	}
+
+	
+//	/**
+//	 * 删除 德飞试验系统检测分类树
+//	 */
+//	@PostMapping("/remove")
+//	@ApiOperationSupport(order = 7)
+//	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+//	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+//		return R.status(trialClassificationTreeService.deleteLogic(Func.toLongList(ids)));
+//	}
+
+
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入id")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam Long id) {
+		boolean update = trialClassificationTreeService.update(new UpdateWrapper<TrialClassificationTree>().set("is_deleted", 1).in("classification_ancestors", id));
+		return R.status(update);
+	}
+}

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

@@ -0,0 +1,100 @@
+package org.springblade.business.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.business.entity.TrialContainerClassification;
+import org.springblade.business.entity.TrialCyFinishTestReport;
+import org.springblade.business.entity.TrialCyTestType;
+import org.springblade.business.entity.TrialCyThirdReport;
+import org.springblade.business.service.TrialCyService;
+import org.springblade.business.service.TrialCyTestTypeService;
+import org.springblade.business.vo.ThirdReportVo;
+import org.springblade.business.vo.TrialCyThirdReportQueryVo;
+import org.springblade.core.tool.api.R;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 成渝试验数据接口
+ * @author LHB
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/cyTrial")
+@Api(value = "成渝试验数据接口", tags = "成渝试验数据接口")
+public class TrialCyController {
+
+    private TrialCyService trialCyService;
+
+
+    /**
+     * 根据合同段id验证当前合同段是否未成渝项目下未开启试验功能的合同段
+     * @return
+     */
+    @GetMapping("/isCyAndTestModule")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "验证是否使用成渝那边的树", notes = "传入合同段id")
+    public R<Boolean> isCyAndTestModule(Long projectId,Long contractId){
+        return R.data(trialCyService.isCyAndTestModule(projectId, contractId));
+    }
+
+    /**
+     * 获取成渝那边的树
+     * @return
+     */
+    @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));
+    }
+
+    /**
+     * 获取试验检测报告
+     * @return
+     */
+    @GetMapping("/getTrialDetectionReport")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "获取试验检测报告", notes = "")
+    public R<Page<ThirdReportVo>> getTrialDetectionReport(@Validated TrialCyThirdReportQueryVo queryVo){
+        return R.data(trialCyService.getTrialDetectionReport(queryVo));
+    }
+
+
+    /**
+     * 获取第三方/外委 检测报告
+     * @return
+     */
+    @GetMapping("/getThirdReport")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "获取第三方/外委 检测报告", notes = "")
+    public R<Page<ThirdReportVo>> getThirdReport(@Validated TrialCyThirdReportQueryVo queryVo){
+        return R.data(trialCyService.getThirdReport(queryVo));
+    }
+
+
+    /**
+     * 清除成渝试验关联
+     * @return
+     */
+    @GetMapping("/clearTrialAssociation")
+    @ApiOperation(value = "清除成渝试验关联", notes = "")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "nodeId", value = "节点", required = true),
+            @ApiImplicitParam(name = "recordId", value = "pkeyId", required = true)
+    })
+    public R<Boolean> clearTrialAssociation(Long nodeId, Long recordId){
+        return R.data(trialCyService.clearTrialAssociation(nodeId,recordId));
+    }
+
+}

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

@@ -179,6 +179,8 @@ public class TrialDetectionController extends BladeController {
         jdbcTemplate.execute(sql5);
         String sql6 = "delete from u_information_query where wbs_id in(" + ids + ") and type = 2";
         jdbcTemplate.execute(sql6);
+        String sql7="update u_trial_auto_number set is_deleted=0 where form_data_id in ("+ids+")";
+        jdbcTemplate.execute(sql7);
         return R.status(true);
     }
 

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

@@ -153,8 +153,10 @@ public class TrialMaterialController extends BladeController {
         if(b){
             //删除关联表中的额数据
             String sqlForDelTrailSampleRecord = "delete from u_trial_sampling_record where sample_info_id in ("+ids+")";
+            String update="update u_trial_auto_number set is_deleted=1 where form_data_id in ("+ids+")";
             try {
                 jdbcTemplate.execute(sqlForDelTrailSampleRecord);
+                jdbcTemplate.update(update);
             } catch (DataAccessException e) {
                 log.error("删除关联表中的额数据失败", e);
                 throw new RuntimeException(e);

+ 166 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialSystemDockingController.java

@@ -0,0 +1,166 @@
+/*
+ *      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.business.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.apache.commons.lang.StringUtils;
+import org.springblade.business.dto.TrialSystemDockingDTO;
+import org.springblade.business.dto.TrialSystemDockingDTO1;
+import org.springblade.business.entity.TrialClassificationTree;
+import org.springblade.business.service.ITrialClassificationTreeService;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.business.entity.TrialSystemDocking;
+import org.springblade.business.vo.TrialSystemDockingVO;
+import org.springblade.business.service.ITrialSystemDockingService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * 德飞试验系统对接表 控制器
+ *
+ * @author BladeX
+ * @since 2025-08-15
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/trialsystemdocking")
+@Api(value = "德飞试验系统对接表", tags = "德飞试验系统对接表接口")
+public class TrialSystemDockingController extends BladeController {
+
+	private final ITrialSystemDockingService trialSystemDockingService;
+
+	private final ITrialClassificationTreeService trialClassificationTreeService;
+
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入trialSystemDocking")
+	public R<TrialSystemDocking> detail(@RequestParam Long id) {
+		TrialSystemDocking detail = trialSystemDockingService.getById(id);
+		return R.data(detail);
+	}
+
+//	/**
+//	 * 分页 德飞试验系统对接表
+//	 */
+//	@GetMapping("/list")
+//	@ApiOperationSupport(order = 2)
+//	@ApiOperation(value = "分页", notes = "传入trialSystemDocking")
+//	public R<IPage<TrialSystemDocking>> list(TrialSystemDocking trialSystemDocking, Query query) {
+//		IPage<TrialSystemDocking> pages = trialSystemDockingService.page(Condition.getPage(query), Condition.getQueryWrapper(trialSystemDocking));
+//		return R.data(pages);
+//	}
+
+	/**
+	 * 自定义分页 德飞试验系统对接表
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入trialSystemDocking")
+	public R<IPage<TrialSystemDockingVO>> page(TrialSystemDockingVO trialSystemDocking, Query query) {
+		IPage<TrialSystemDockingVO> pages = trialSystemDockingService.selectTrialSystemDockingPage(Condition.getPage(query), trialSystemDocking);
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增 德飞试验系统对接表
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入trialSystemDocking")
+	public R save(@Valid @RequestBody List<TrialSystemDockingDTO> list) {
+		List<TrialSystemDocking>list1=new ArrayList<>();
+		for (TrialSystemDockingDTO trialSystemDockingDTO : list) {
+			TrialSystemDocking trialSystemDocking = new TrialSystemDocking();
+			BeanUtil.copy(trialSystemDockingDTO,trialSystemDocking);
+			TrialClassificationTree trialClassificationTree = trialClassificationTreeService.getById(trialSystemDockingDTO.getClassificationId());
+			if(trialClassificationTree!=null){
+				trialSystemDocking.setClassificationAncestors(trialClassificationTree.getClassificationAncestors());
+			}
+			list1.add(trialSystemDocking);
+		}
+		boolean b = trialSystemDockingService.saveBatch(list1);
+		if(b){
+			//异步下载文件并且上传Oss
+			trialSystemDockingService.syncUpdateFile(list1);
+		}
+		Map<Long, String> map = list1.stream().collect(Collectors.toMap(TrialSystemDocking::getId, TrialSystemDocking::getReportName));
+		return R.data(map);
+	}
+
+	/**
+	 * 修改 德飞试验系统对接表
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入trialSystemDocking")
+	public R update(@Valid @RequestBody TrialSystemDockingDTO1 trialSystemDockingDTO) {
+		TrialSystemDocking trialSystemDocking = trialSystemDockingService.getById(trialSystemDockingDTO.getId());
+		BeanUtil.copy(trialSystemDockingDTO,trialSystemDocking);
+		if(StringUtils.isNotEmpty(trialSystemDockingDTO.getFileUrl())&&!trialSystemDockingDTO.getFileUrl().equals(trialSystemDocking.getFileUrl())){
+			trialSystemDockingService.syncUpdateFile1(trialSystemDocking);
+		}
+		return R.status(trialSystemDockingService.updateById(trialSystemDocking));
+	}
+
+//	/*
+//	 * 新增或修改 德飞试验系统对接表
+//	 */
+//	@PostMapping("/submit")
+//	@ApiOperationSupport(order = 6)
+//	@ApiOperation(value = "新增或修改", notes = "传入trialSystemDocking")
+//	public R submit(@Valid @RequestBody TrialSystemDocking trialSystemDocking) {
+//		return R.status(trialSystemDockingService.saveOrUpdate(trialSystemDocking));
+//	}
+
+	
+	/**
+	 * 删除 德飞试验系统对接表
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		if (Func.isEmpty(ids)) {
+			return R.fail("参数错误");
+		}
+		trialSystemDockingService.updatedelete(Func.toLongList(ids));
+		return R.status(true);
+	}
+
+}

+ 28 - 6
blade-service/blade-business/src/main/java/org/springblade/business/controller/UserViewProjectContractController.java

@@ -23,6 +23,7 @@ import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.entity.SignPfxFile;
+import org.springblade.manager.entity.UserProjectInfoCollect;
 import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.ProjectAssignmentUserClient;
 import org.springblade.manager.feign.ProjectClient;
@@ -35,6 +36,7 @@ import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.SingleColumnRowMapper;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -46,9 +48,7 @@ import java.io.InputStream;
 import java.math.BigDecimal;
 import java.net.URL;
 import java.net.URLConnection;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @RestController
@@ -268,18 +268,40 @@ public class UserViewProjectContractController {
                     contractInfoList.sort(Comparator.comparingInt(ContractInfoVO::getIsDefault).reversed());
                     vo.setContractInfoList(contractInfoList);
                 });
-                //排序项目
-                projectInfoVOS.sort(Comparator.comparingInt(ProjectInfoVO::getIsDefault).reversed());
             }
 
             //剔除没有合同段的项目
             projectInfoVOS.removeIf(next -> next.getContractInfoList().size() == 0);
+            //排序项目
+            List<Long> collectIds = new ArrayList<>();
+            if (!projectInfoVOS.isEmpty()) {
+                String pIds = projectInfoVOS.stream().map(projectInfoVO -> projectInfoVO.getId() + "").collect(Collectors.joining(","));
+                collectIds = jdbcTemplate.query("select project_id from m_user_project_collect where is_deleted = 0 and user_id = " + AuthUtil.getUserId() + " and project_id in ( " + pIds + ")",
+                        new SingleColumnRowMapper<>(Long.class));
+            }
+            Map<Long, Long> collect = collectIds.stream().collect(Collectors.toMap(v -> v, v -> v, (k1, k2) -> k1));
+            // 按是否收藏进行排序,然后按照sort 进行排序
+            projectInfoVOS.sort((o1, o2) -> {
+                if (collect.containsKey(o1.getId())) {
+                    if (!collect.containsKey(o2.getId())) {
+                        return -1;
+                    }
+                } else {
+                    if (collect.containsKey(o2.getId())) {
+                        return 1;
+                    }
+                }
+                if (o1.getSort() != null && o2.getSort() != null) {
+                    return o1.getSort().compareTo(o2.getSort());
+                }
+                return 0;
+            });
             //将合同段中业主合同段排在最前面
             if(ObjectUtil.isNotEmpty(projectInfoVOS)){
                 for (ProjectInfoVO projectInfoVO : projectInfoVOS) {
                     if(ObjectUtil.isNotEmpty(projectInfoVO.getContractInfoList())){
                         List<ContractInfoVO> contractInfoList = projectInfoVO.getContractInfoList();
-                        contractInfoList.sort(Comparator.comparingInt(contractInfo->contractInfo.getContractType() == 3 ? -1:0));
+                        contractInfoList.sort(Comparator.comparingInt(ContractInfoVO::getSort));
                     }
                 }
             }

+ 103 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java

@@ -8,7 +8,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
+import org.springblade.archive.dto.FindAndReplaceDto;
+import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.vo.ArchivesAutoVO;
+import org.springblade.business.dto.FindAndReplaceDto1;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.business.mapper.ArchiveFileMapper;
@@ -16,6 +19,7 @@ import org.springblade.business.service.IArchiveFileService;
 import org.springblade.business.service.ITaskService;
 import org.springblade.business.vo.ArchiveFileVO;
 import org.springblade.common.utils.FileUtils;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.enums.StorageTypeEnum;
 import org.springblade.manager.feign.ContractClient;
@@ -25,6 +29,8 @@ import org.springframework.web.bind.annotation.RestController;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.function.Function;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 
@@ -352,4 +358,101 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
         return iArchiveFileService.getArchiveFileByArchivesId(archiveIds,null);
     }
 
+    @Override
+    public boolean findAndReplace(FindAndReplaceDto1 dto1) {
+        List<ArchiveFile> archiveFiles = dto1.getList();
+        FindAndReplaceDto dto = dto1.getDto();
+        List<ArchiveFile> updates = new ArrayList<>();
+
+        for (ArchiveFile archiveFile : archiveFiles) {
+            String originalName = archiveFile.getFileName();
+            if (StringUtils.isEmpty(originalName) || StringUtils.isEmpty(dto.getQuery())) {
+                continue;
+            }
+
+            if (!originalName.contains(dto.getQuery())) {
+                continue;
+            }
+
+            String newName = processFileName(originalName, dto);
+            if (!originalName.equals(newName)) {
+                ArchiveFile update = new ArchiveFile();
+                update.setId(archiveFile.getId());
+                update.setFileName(newName);
+                updates.add(update);
+            }
+        }
+
+        if (!updates.isEmpty()) {
+            return iArchiveFileService.updateBatchById(updates);
+        }
+        return true;
+    }
+
+    private String processFileName(String fileName, FindAndReplaceDto dto) {
+        String query = dto.getQuery();
+        String replace = dto.getReplace();
+
+        switch (dto.getType()) {
+            case 1: // 在指定位置插入
+                return handleInsertAtPosition(fileName, query, replace, dto.getPosition());
+
+            case 2: // 普通替换
+                return handleReplace(fileName, query, replace, false);
+
+            default: // 删除匹配内容
+                return handleReplace(fileName, query, "", true);
+        }
+    }
+
+    private String handleInsertAtPosition(String fileName, String query, String replace, Integer position) {
+        if (position == null) {
+            return fileName; // 没有指定位置时保持原样
+        }
+
+        StringBuilder sb = new StringBuilder();
+        int lastIndex = 0;
+        int index = fileName.indexOf(query);
+
+        while (index != -1) {
+            // 添加未处理部分
+            sb.append(fileName, lastIndex, index);
+
+            // 根据位置插入内容
+            switch (position) {
+                case 1: // 在查询内容前插入
+                    sb.append(replace).append(query);
+                    break;
+                case 2: // 在查询内容后插入
+                    sb.append(query).append(replace);
+                    break;
+                default:
+                    throw new ServiceException("请选择正确的定位条件");
+            }
+
+            lastIndex = index + query.length();
+            index = fileName.indexOf(query, lastIndex);
+        }
+
+        // 添加剩余部分
+        sb.append(fileName.substring(lastIndex));
+        return sb.toString();
+    }
+
+    private String handleReplace(String fileName, String query, String replacement, boolean isLiteral) {
+        if (isLiteral) {
+            // 字面量替换(避免正则表达式特殊字符问题)
+            return fileName.replace(query, replacement);
+        } else {
+            // 使用正则表达式替换,需要转义特殊字符
+            String escapedQuery = Pattern.quote(query); // 自动转义所有特殊字符
+            return fileName.replaceAll(escapedQuery, Matcher.quoteReplacement(replacement));
+        }
+    }
+
+    @Override
+    public List<ArchiveFile> getAllArchiveFileByIds(List<String> strList) {
+        return fileMapper.getAllArchiveFileByIds(strList);
+    }
+
 }

+ 5 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ImageClassificationFileClientImpl.java

@@ -8,6 +8,7 @@ import org.springblade.business.mapper.ImageClassificationFileMapper;
 import org.springblade.business.service.IImageClassificationFileService;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Collections;
 import java.util.List;
 
 @RestController
@@ -27,4 +28,8 @@ public class ImageClassificationFileClientImpl implements ImageClassificationFil
         return imageClassificationFileService.getById(id);
     }
 
+    @Override
+    public List<ImageClassificationFile> getImageClassificationFileByIds(List<Long> imageIds) {
+        return imageClassificationFileService.listByIds(imageIds);
+    }
 }

+ 118 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TrialCyAccessoriesClientImpl.java

@@ -0,0 +1,118 @@
+package org.springblade.business.feignClient;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.AllArgsConstructor;
+import org.springblade.business.entity.TrialCyFinishTestReport;
+import org.springblade.business.entity.TrialCyThirdReport;
+import org.springblade.business.feign.TrialCyAccessoriesClient;
+import org.springblade.business.mapper.TrialSelfInspectionRecordMapper;
+import org.springblade.business.service.TrialCyFinishTestReportService;
+import org.springblade.business.service.TrialCyThirdReportService;
+import org.springblade.core.tool.utils.CollectionUtil;
+import org.springblade.manager.entity.TableFile;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author LHB
+ */
+@RestController
+@AllArgsConstructor
+public class TrialCyAccessoriesClientImpl implements TrialCyAccessoriesClient {
+
+    private final TrialSelfInspectionRecordMapper trialSelfInspectionRecordMapper;
+
+    /**
+     * 第三方、外委
+     */
+    private final TrialCyThirdReportService trialCyThirdReportService;
+
+    /**
+     * 试验报告
+     */
+    private final TrialCyFinishTestReportService trialCyFinishTestReportService;
+
+    @Override
+    public List<JSONObject> getTrialFilePdfRecord(String primaryKeyId, List<Integer> list) {
+        //获取id
+        List<Map<String, Object>> 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(list1)) {
+                    list1.forEach(f -> {
+                        String[] split = f.getAssembleFile().split("/");
+                        JSONObject jsonObject = new JSONObject();
+                        jsonObject.put("id", f.getId());
+                        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);
+                    });
+                }
+            }
+            return result;
+        }
+
+        return null;
+    }
+}

+ 15 - 5
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/WbsTreeContractStatisticsClientImpl.java

@@ -9,6 +9,7 @@ import org.springblade.business.feign.WbsTreeContractStatisticsClient;
 import org.springblade.business.mapper.InformationQueryMapper;
 import org.springblade.business.service.IWbsTreeContractStatisticsService;
 import org.springblade.business.service.impl.WbsTreeContractStatisticsServiceImpl;
+import org.springblade.common.utils.SystemUtils;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
@@ -36,11 +37,14 @@ public class WbsTreeContractStatisticsClientImpl implements WbsTreeContractStati
 
     @Scheduled(cron = "0/30 * * * * ?")
     public void updateInformationQueryStatus() {
+        if (!SystemUtils.isLinux()) {
+            return;
+        }
         Map<String, String> map = new HashMap<>();
-        List<String> queryIds = redisTemplate.opsForList().range(INFORMATION_QUERY_STATUS_STATISTICS_KEY, 0, 100);
+        List<String> queryIds = redisTemplate.opsForList().range(INFORMATION_QUERY_STATUS_STATISTICS_KEY, 0, 1000);
         if (queryIds != null && !queryIds.isEmpty()) {
             String ids = queryIds.stream().distinct().collect(Collectors.joining(","));
-            List<InformationQuery> queryList = jdbcTemplate.query("select wbs_id, classify, contract_id from u_information_query where id in ( " + ids +" ) and is_deleted = 0 group by contract_id,wbs_id,classify",
+            List<InformationQuery> queryList = jdbcTemplate.query("select id,wbs_id, classify, contract_id from u_information_query where id in ( " + ids +" ) and is_deleted = 0 group by contract_id,wbs_id,classify",
                     new BeanPropertyRowMapper<>(InformationQuery.class));
             if (!queryList.isEmpty()) {
                 for (InformationQuery query : queryList) {
@@ -55,9 +59,9 @@ public class WbsTreeContractStatisticsClientImpl implements WbsTreeContractStati
                         log.error("updateInformationQueryStatus wbsId = {}, contractId = {}, classify = {}", query.getWbsId(), query.getContractId(), query.getClassify() , e);
                     }
                 }
-                for (String queryId : queryIds) {
-                    redisTemplate.opsForList().remove("blade:statistics:information_query_statistics_key", 1, queryId);
-                }
+            }
+            for (String queryId : queryIds) {
+                redisTemplate.opsForList().remove("blade:statistics:information_query_statistics_key", 1, queryId);
             }
         }
     }
@@ -160,4 +164,10 @@ public class WbsTreeContractStatisticsClientImpl implements WbsTreeContractStati
     public void statisticsContract(Long contractId) {
         wbsTreeContractStatisticsService.statisticsContract(contractId);
     }
+
+    @Override
+    @Async
+    public void updateAncestors(String ids) {
+        wbsTreeContractStatisticsService.updateAncestors(ids);
+    }
 }

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

@@ -120,4 +120,6 @@ public interface ArchiveFileMapper extends BaseMapper<ArchiveFile> {
      * @return
      */
     Map<String, BigDecimal> getAllArchiveAutoByContractTypeSummary(@Param("projectId") Long projectId);
+
+    List<ArchiveFile> getAllArchiveFileByIds(@Param("strList") List<String> strList);
 }

+ 9 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml

@@ -554,4 +554,13 @@
       ) a
 
     </select>
+    <select id="getAllArchiveFileByIds" resultType="org.springblade.business.entity.ArchiveFile">
+        select * from u_archive_file where is_deleted = 0
+        <if test="strList != null and strList != ''">
+            and id in
+            <foreach collection="strList" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
+    </select>
 </mapper>

+ 18 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ContractLogMonthPackMapper.java

@@ -0,0 +1,18 @@
+package org.springblade.business.mapper;
+
+import org.springblade.business.entity.ContractLogMonthPack;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author LHB
+* @description 针对表【u_contract_log_month_pack(日志按月封装表)】的数据库操作Mapper
+* @createDate 2025-08-20 14:35:00
+* @Entity generator.domain.UContractLogMonthPack
+*/
+public interface ContractLogMonthPackMapper extends BaseMapper<ContractLogMonthPack> {
+
+}
+
+
+
+

+ 28 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ContractLogMonthPackMapper.xml

@@ -0,0 +1,28 @@
+<?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.business.mapper.ContractLogMonthPackMapper">
+
+    <resultMap id="BaseResultMap" type="org.springblade.business.entity.ContractLogMonthPack">
+            <id property="id" column="id" />
+            <result property="projectId" column="project_id" />
+            <result property="contractId" column="contract_id" />
+            <result property="wbsNodeId" column="wbs_node_id" />
+            <result property="wbsNodeType" column="wbs_node_type" />
+            <result property="fileName" column="file_name" />
+            <result property="recordTime" column="record_time" />
+            <result property="contractName" column="contract_name" />
+            <result property="page" column="page" />
+            <result property="createTime" column="create_time" />
+            <result property="createUser" column="create_user" />
+            <result property="updateTime" column="update_time" />
+            <result property="updateUser" column="update_user" />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,project_id,contract_id,wbs_node_id,wbs_node_type,file_name,
+        record_time,contract_name,page,create_time,create_user,
+        update_time,update_user
+    </sql>
+</mapper>

+ 54 - 51
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.xml

@@ -73,60 +73,63 @@
 
     <select id="selectImageClassificationFilePage" resultMap="imageClassificationFileResultMap">
         select
-            files.id,
-            files.title,
-            files.text_content,
-            files.shooting_user,
-            files.shooting_time,
-            files.file_size,
-            files.image_url,
-            files.pdf_url,
-            files.type,
-            files.marge_pdf_url,
-            files.create_time,
-            files.wbs_id
+        files.id,
+        files.title,
+        files.text_content,
+        files.shooting_user,
+        files.shooting_time,
+        files.file_size,
+        files.image_url,
+        files.pdf_url,
+        files.type,
+        files.marge_pdf_url,
+        files.create_time,
+        files.wbs_id
         from
         (
-            select
-                wbs_id,
-                create_time,
-                id,
-                title,
-                text_content,
-                shooting_user,
-                shooting_time,
-                file_size,
-                image_url,
-                pdf_url,
-                marge_pdf_url,
-                type,
-                date_format(shooting_time,'%Y-%m-%d') as shootingTimeStr
-            from u_image_classification_file
-            where is_deleted = 0 and status = 1
-                and project_id = #{param.projectId}
-                and classify_id = #{param.classifyId}
-            <if test="param.contractId != null and param.contractId != ''">
-                and contract_id = #{param.contractId}
-            </if>
-            <if test="param.queryStr != null and param.queryStr != ''">
-                and (title like concat('%',#{param.queryStr},'%') OR shooting_user like concat('%',#{param.queryStr},'%'))
-            </if>
-            <if test="param.wbsIds != null and param.wbsIds.size != 0">
-                and wbs_id in
-                <foreach collection="param.wbsIds" item="wbsId" open="(" separator="," close=")">
-                    #{wbsId}
-                </foreach>
-            </if>
-            <if test="param.staDate != null and param.staDate != ''">
-                <![CDATA[ and  shooting_time >= DATE_FORMAT(#{param.staDate}, '%Y-%m-%d %H:%i:%S') ]]>
-            </if>
-            <if test="param.endDate != null and param.endDate != ''">
-                <![CDATA[ and  shooting_time <= DATE_FORMAT(#{param.endDate}, '%Y-%m-%d %H:%i:%S') ]]>
-            </if>
-                order by shooting_time desc
-            ) as files
+        select
+        uicf.wbs_id,
+        uicf.create_time,
+        uicf.id,
+        uicf.title,
+        uicf.text_content,
+        uicf.shooting_user,
+        uicf.shooting_time,
+        uicf.file_size,
+        uicf.image_url,
+        uicf.pdf_url,
+        uicf.marge_pdf_url,
+        uicf.type,
+        date_format(uicf.shooting_time,'%Y-%m-%d') as shootingTimeStr
+        from u_image_classification_file uicf
+        <if test="param.wbsIds == null or param.wbsIds.size == 0">
+            JOIN m_wbs_tree_contract mwtc ON uicf.wbs_id = mwtc.p_key_id AND mwtc.is_deleted = 0
+        </if>
+        where uicf.is_deleted = 0 and uicf.status = 1
+        and uicf.project_id = #{param.projectId}
+        and uicf.classify_id = #{param.classifyId}
+        <if test="param.contractId != null and param.contractId != ''">
+            and uicf.contract_id = #{param.contractId}
+        </if>
+        <if test="param.queryStr != null and param.queryStr != ''">
+            and (uicf.title like concat('%',#{param.queryStr},'%') OR uicf.shooting_user like concat('%',#{param.queryStr},'%'))
+        </if>
+        <if test="param.wbsIds != null and param.wbsIds.size != 0">
+            and uicf.wbs_id in
+            <foreach collection="param.wbsIds" item="wbsId" open="(" separator="," close=")">
+                #{wbsId}
+            </foreach>
+        </if>
+        <if test="param.staDate != null and param.staDate != ''">
+            <![CDATA[ and uicf.shooting_time >= DATE_FORMAT(#{param.staDate}, '%Y-%m-%d %H:%i:%S') ]]>
+        </if>
+        <if test="param.endDate != null and param.endDate != ''">
+            <![CDATA[ and uicf.shooting_time <= DATE_FORMAT(#{param.endDate}, '%Y-%m-%d %H:%i:%S') ]]>
+        </if>
+        order by uicf.shooting_time desc
+        ) as files
         where
-            1 = 1
+        1 = 1
         <if test="param.queryDate != null and param.queryDate != ''">
             and files.shootingTimeStr like concat('%',#{param.queryDate},'%')
         </if>

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

@@ -17,6 +17,7 @@
 package org.springblade.business.mapper;
 
 import org.springblade.business.entity.InformationQuery;
+import org.springblade.business.vo.ChekPdfPaceVo;
 import org.springblade.business.vo.InformationQueryVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -42,7 +43,7 @@ public interface InformationQueryMapper extends BaseMapper<InformationQuery> {
 
     List<WbsTreeContractTreeVOS> queryContractTree(@Param("contractId") String contractId, @Param("parentId") String parentId, @Param("classify") Integer classify);
 
-    List<QueryProcessDataVO> queryProcessDataByPrimaryKeyIdAndClassify(@Param("primaryKeyId") String primaryKeyId, @Param("classify") Integer classify);
+    List<QueryProcessDataVO> queryProcessDataByPrimaryKeyIdAndClassify(@Param("primaryKeyId") String primaryKeyId, @Param("classify") Integer classify, @Param("dateIsComplete") Integer dateIsComplete);
 
     /**
      * 查询工序节点的填报记录
@@ -57,7 +58,7 @@ public interface InformationQueryMapper extends BaseMapper<InformationQuery> {
     /**
      * 查询工序节点的填报记录
      */
-    List<QueryProcessDataVO> queryProcessDataByParentIdAndContractIdTwo(@Param("parentId") String parentId, @Param("classify") Integer classify, @Param("contractId") String contractId);
+    List<QueryProcessDataVO> queryProcessDataByParentIdAndContractIdTwo(@Param("parentId") String parentId, @Param("classify") Integer classify, @Param("contractId") String contractId, @Param("dateIsComplete") Integer dateIsComplete);
 
     /**
      * 查询工序节点的填报记录3
@@ -145,4 +146,10 @@ public interface InformationQueryMapper extends BaseMapper<InformationQuery> {
     List<TabBusstimeInfo> getTabussTimeInfo(@Param("tables") List<String> tables);
 
     List<Long> getInfoByNodeIds(@Param("ids") List<Long> ids);
+
+    int addCheckPdfInfoByNodeId(@Param("ids") String ids,@Param("classify") String classify);
+
+    int addCheckPdfInfoByIds(@Param("ids") List<String> ids,@Param("classify") String classify);
+
+    ChekPdfPaceVo getCheckPdfPaceInfo(@Param("contractId") String contractI, @Param("classify") String classify);
 }

部分文件因文件數量過多而無法顯示