浏览代码

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

yangyj 2 年之前
父节点
当前提交
4b381bc7b5
共有 47 个文件被更改,包括 1875 次插入1146 次删除
  1. 5 0
      blade-common/src/main/java/org/springblade/common/constant/ArchiveConstant.java
  2. 1 0
      blade-ops/blade-flow/blade-flow.iml
  3. 3 4
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchivesAuto.java
  4. 24 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/feign/ArchiveAutoClient.java
  5. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialSelfInspectionRecord.java
  6. 7 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/NeiYeLedgerVO.java
  7. 79 23
      blade-service-api/blade-manager-api/blade-manager-api.iml
  8. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java
  9. 3 3
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClient.java
  10. 1 5
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreePrivateClient.java
  11. 14 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java
  12. 35 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TrialRecordZJTreeVO.java
  13. 28 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractVO6.java
  14. 42 4
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateVO4.java
  15. 29 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeVO2.java
  16. 26 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveAutoClientImpl.java
  17. 1 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  18. 18 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  19. 3 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/NeiYeController.java
  20. 542 533
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  21. 24 6
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java
  22. 4 4
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialSelfInspectionRecordService.java
  23. 9 3
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  24. 3 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDeviceUseServiceImpl.java
  25. 311 245
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  26. 95 88
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java
  27. 1 0
      blade-service/blade-manager/blade-manager.iml
  28. 11 0
      blade-service/blade-manager/pom.xml
  29. 20 16
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  30. 8 13
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  31. 17 14
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java
  32. 10 25
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreePrivateClientImpl.java
  33. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  34. 15 39
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.java
  35. 19 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml
  36. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.xml
  37. 2 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java
  38. 24 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  39. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IContractInfoService.java
  40. 6 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java
  41. 3 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java
  42. 136 14
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java
  43. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  44. 5 7
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java
  45. 63 18
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  46. 173 59
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  47. 40 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

+ 5 - 0
blade-common/src/main/java/org/springblade/common/constant/ArchiveConstant.java

@@ -0,0 +1,5 @@
+package org.springblade.common.constant;
+
+public interface ArchiveConstant {
+    String APPLICATION_WEATHER_NAME = "blade-archive";
+}

+ 1 - 0
blade-ops/blade-flow/blade-flow.iml

@@ -300,6 +300,7 @@
     <orderEntry type="library" scope="PROVIDED" name="Maven: org.springblade:blade-core-auto:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" scope="PROVIDED" name="Maven: org.springblade:blade-core-auto:2.9.1.RELEASE" level="project" />
     <orderEntry type="module" module-name="blade-user-api" />
     <orderEntry type="module" module-name="blade-user-api" />
     <orderEntry type="module" module-name="blade-manager-api" />
     <orderEntry type="module" module-name="blade-manager-api" />
+    <orderEntry type="module" module-name="blade-business-api" />
     <orderEntry type="module" module-name="blade-flow-api" />
     <orderEntry type="module" module-name="blade-flow-api" />
     <orderEntry type="library" name="Maven: org.springblade:blade-starter-flowable:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-starter-flowable:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.flowable:flowable-spring-boot-starter:6.4.2" level="project" />
     <orderEntry type="library" name="Maven: org.flowable:flowable-spring-boot-starter:6.4.2" level="project" />

+ 3 - 4
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchivesAuto.java

@@ -132,16 +132,15 @@ public class ArchivesAuto extends BaseEntity {
 	/**
 	/**
 	* 案卷内文件数量
 	* 案卷内文件数量
 	*/
 	*/
-		private Integer fileN;
+	private Integer fileN;
 	private Integer pageN;
 	private Integer pageN;
 	/**
 	/**
 	* 统一里程信息
 	* 统一里程信息
 	*/
 	*/
-		private String mileage;
+	private String mileage;
 	private Integer fileType;
 	private Integer fileType;
 	private Integer size;
 	private Integer size;
-	private String procsort;
-	private String nodeSort;
+	private String treeSort;
 	private Integer isOpen;
 	private Integer isOpen;
 	private Integer ischeck;
 	private Integer ischeck;
 
 

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

@@ -0,0 +1,24 @@
+package org.springblade.archive.feign;
+
+import org.springblade.archive.entity.ArchivesAuto;
+import org.springblade.archive.vo.ArchivesAutoVO;
+import org.springblade.common.constant.ArchiveConstant;
+import org.springblade.common.constant.EVisaConstant;
+import org.springblade.core.tool.api.R;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+@FeignClient(value = ArchiveConstant.APPLICATION_WEATHER_NAME)
+public interface ArchiveAutoClient {
+    String API_PREFIX = "/api/ArchiveAuto";
+    /**
+     * 项目分配用户批量保存-项目合同分配人员
+     */
+    @PostMapping(API_PREFIX + "/saveListByNodes")
+    @Transactional(rollbackFor = Exception.class)
+    R saveArchiveAutoByNodes(@RequestBody List<ArchivesAuto> list);
+}

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

@@ -37,7 +37,7 @@ public class TrialSelfInspectionRecord extends BaseEntity {
     @ApiModelProperty(value = "检测类别")
     @ApiModelProperty(value = "检测类别")
     private Integer detectionCategory;
     private Integer detectionCategory;
 
 
-    @ApiModelProperty(value = "是否上传合格证 '0'=是 ‘1’=否")
+    @ApiModelProperty(value = "是否上传合格证 '1'=是 '0'=否")
     private Integer isUploadCertificate;
     private Integer isUploadCertificate;
 
 
     @ApiModelProperty(value = "合同段id")
     @ApiModelProperty(value = "合同段id")

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

@@ -80,6 +80,12 @@ public class NeiYeLedgerVO {
     @ApiModelProperty(value = "是否关联试验 true为已关联")
     @ApiModelProperty(value = "是否关联试验 true为已关联")
     private Boolean isExperiment;
     private Boolean isExperiment;
 
 
+    /**
+     *  资料主键
+     */
+    @ApiModelProperty(value = "information-query主键")
+    private String id;
+
     public NeiYeLedgerVO(String... values){
     public NeiYeLedgerVO(String... values){
         this.unitProject = values[0];
         this.unitProject = values[0];
         this.partProject = values[1];
         this.partProject = values[1];
@@ -93,6 +99,7 @@ public class NeiYeLedgerVO {
         this.isEvaluate = Boolean.parseBoolean(values[9]);
         this.isEvaluate = Boolean.parseBoolean(values[9]);
         this.isExperiment = Boolean.parseBoolean(values[10]);
         this.isExperiment = Boolean.parseBoolean(values[10]);
         this.reportNumber = values[11];
         this.reportNumber = values[11];
+        this.id = values[12];
     }
     }
 
 
     public NeiYeLedgerVO(){}
     public NeiYeLedgerVO(){}

+ 79 - 23
blade-service-api/blade-manager-api/blade-manager-api.iml

@@ -20,6 +20,83 @@
     <orderEntry type="inheritedJdk" />
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.80" level="project" />
     <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.80" level="project" />
+    <orderEntry type="module" module-name="blade-business-api" />
+    <orderEntry type="module" module-name="blade-common" />
+    <orderEntry type="library" name="Maven: org.springblade:blade-core-launch:2.9.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.3.12.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.3.12.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.11.4" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.11.4" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.2.15.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-undertow:2.3.12.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-core:2.1.7.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.2.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.xnio:xnio-api:3.8.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.wildfly.common:wildfly-common:1.5.2.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.wildfly.client:wildfly-client-config:1.0.1.Final" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.jboss.xnio:xnio-nio:3.8.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.threads:jboss-threads:3.1.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-servlet:2.1.7.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.3_spec:2.0.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-websockets-jsr:2.1.7.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec:2.0.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.servlet:jakarta.servlet-api:4.0.4" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish:jakarta.el:3.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springblade:blade-starter-ribbon:2.9.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-netflix-ribbon:2.2.9.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-netflix-archaius:2.2.9.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.netflix.ribbon:ribbon:2.3.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.netflix.ribbon:ribbon-transport:2.3.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: io.reactivex:rxnetty-contexts:0.4.9" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: io.reactivex:rxnetty-servo:0.4.9" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: javax.inject:javax.inject:1" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: io.reactivex:rxnetty:0.4.9" level="project" />
+    <orderEntry type="library" name="Maven: com.netflix.ribbon:ribbon-core:2.3.0" level="project" />
+    <orderEntry type="library" name="Maven: com.netflix.ribbon:ribbon-httpclient:2.3.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.jersey:jersey-client:1.19.1" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.jersey:jersey-core:1.19.1" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: javax.ws.rs:jsr311-api:1.1.1" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.jersey.contribs:jersey-apache-client4:1.19.1" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.netflix.servo:servo-core:0.12.21" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.netflix.netflix-commons:netflix-commons-util:0.3.0" level="project" />
+    <orderEntry type="library" name="Maven: com.netflix.ribbon:ribbon-loadbalancer:2.3.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.netflix.netflix-commons:netflix-statistics:0.1.1" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba.cloud:spring-cloud-alibaba-commons:2.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba.spring:spring-context-support:1.0.10" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config:2.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba.nacos:nacos-client:2.0.4" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.14" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpasyncclient:4.1.4" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore-nio:4.4.14" level="project" />
+    <orderEntry type="library" name="Maven: org.reflections:reflections:0.9.11" level="project" />
+    <orderEntry type="library" name="Maven: org.javassist:javassist:3.21.0-GA" level="project" />
+    <orderEntry type="library" name="Maven: io.prometheus:simpleclient:0.5.0" level="project" />
+    <orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.7.22" level="project" />
+    <orderEntry type="library" name="Maven: com.aliyun.oss:aliyun-sdk-oss:3.14.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.14" level="project" />
+    <orderEntry type="library" name="Maven: org.jdom:jdom2:2.0.6" level="project" />
+    <orderEntry type="library" name="Maven: org.codehaus.jettison:jettison:1.2" level="project" />
+    <orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-core:4.5.30" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.7" level="project" />
+    <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
+    <orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
+    <orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish.jaxb:jaxb-runtime:2.3.4" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish.jaxb:txw2:2.3.4" level="project" />
+    <orderEntry type="library" name="Maven: com.sun.istack:istack-commons-runtime:3.0.12" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.activation:jakarta.activation:1.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.68" level="project" />
+    <orderEntry type="library" name="Maven: org.jacoco:org.jacoco.agent:runtime:0.8.7" level="project" />
+    <orderEntry type="library" name="Maven: org.ini4j:ini4j:0.5.4" level="project" />
+    <orderEntry type="library" name="Maven: io.opentracing:opentracing-api:0.33.0" level="project" />
+    <orderEntry type="library" name="Maven: io.opentracing:opentracing-util:0.33.0" level="project" />
+    <orderEntry type="library" name="Maven: io.opentracing:opentracing-noop:0.33.0" level="project" />
+    <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-ram:3.1.0" level="project" />
+    <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-kms:2.11.0" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-starter-mybatis:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-starter-mybatis:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.5.1" level="project" />
     <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.5.1" level="project" />
     <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.5.1" level="project" />
     <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.5.1" level="project" />
@@ -47,24 +124,6 @@
     <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
     <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-starter-auth:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-starter-auth:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-core-tool:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-core-tool:2.9.1.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springblade:blade-core-launch:2.9.1.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.3.12.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.3.12.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.11.4" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.11.4" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.2.15.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-undertow:2.3.12.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: io.undertow:undertow-core:2.1.7.Final" level="project" />
-    <orderEntry type="library" name="Maven: org.jboss.xnio:xnio-api:3.8.0.Final" level="project" />
-    <orderEntry type="library" name="Maven: org.wildfly.common:wildfly-common:1.5.2.Final" level="project" />
-    <orderEntry type="library" name="Maven: org.wildfly.client:wildfly-client-config:1.0.1.Final" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: org.jboss.xnio:xnio-nio:3.8.0.Final" level="project" />
-    <orderEntry type="library" name="Maven: org.jboss.threads:jboss-threads:3.1.0.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.undertow:undertow-servlet:2.1.7.Final" level="project" />
-    <orderEntry type="library" name="Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.3_spec:2.0.1.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.undertow:undertow-websockets-jsr:2.1.7.Final" level="project" />
-    <orderEntry type="library" name="Maven: org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec:2.0.0.Final" level="project" />
-    <orderEntry type="library" name="Maven: jakarta.servlet:jakarta.servlet-api:4.0.4" level="project" />
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.4" level="project" />
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.4" level="project" />
     <orderEntry type="library" name="Maven: com.google.guava:guava:30.1.1-jre" level="project" />
     <orderEntry type="library" name="Maven: com.google.guava:guava:30.1.1-jre" level="project" />
     <orderEntry type="library" name="Maven: com.google.guava:failureaccess:1.0.1" level="project" />
     <orderEntry type="library" name="Maven: com.google.guava:failureaccess:1.0.1" level="project" />
@@ -80,10 +139,8 @@
     <orderEntry type="library" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
     <orderEntry type="library" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
     <orderEntry type="library" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
     <orderEntry type="library" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.3.12.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.3.12.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.glassfish:jakarta.el:3.0.3" level="project" />
     <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.1.7.Final" level="project" />
     <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.1.7.Final" level="project" />
     <orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.2" level="project" />
     <orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.2" level="project" />
-    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.2.Final" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-starter-jwt:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-starter-jwt:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.3.12.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.3.12.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.3.9.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.3.9.RELEASE" level="project" />
@@ -118,7 +175,6 @@
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-context:2.2.9.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-context:2.2.9.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.security:spring-security-rsa:1.0.9.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.security:spring-security-rsa:1.0.9.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.59" level="project" />
     <orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.59" level="project" />
-    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.59" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-openfeign-core:2.2.9.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-openfeign-core:2.2.9.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.3.12.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.3.12.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-netflix-ribbon:2.2.9.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-netflix-ribbon:2.2.9.RELEASE" level="project" />
@@ -136,8 +192,8 @@
     <orderEntry type="library" name="Maven: io.github.openfeign:feign-hystrix:10.12" level="project" />
     <orderEntry type="library" name="Maven: io.github.openfeign:feign-hystrix:10.12" level="project" />
     <orderEntry type="library" name="Maven: com.netflix.archaius:archaius-core:0.7.7" level="project" />
     <orderEntry type="library" name="Maven: com.netflix.archaius:archaius-core:0.7.7" level="project" />
     <orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:3.0.2" level="project" />
     <orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:3.0.2" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: commons-configuration:commons-configuration:1.8" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: commons-lang:commons-lang:2.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-configuration:commons-configuration:1.8" level="project" />
+    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.11.4" level="project" />
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.11.4" level="project" />
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.11.4" level="project" />
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.11.4" level="project" />
     <orderEntry type="library" name="Maven: com.netflix.hystrix:hystrix-core:1.5.18" level="project" />
     <orderEntry type="library" name="Maven: com.netflix.hystrix:hystrix-core:1.5.18" level="project" />

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

@@ -176,6 +176,9 @@ public class ArchiveTreeContract extends BaseEntity {
 	//权限编码
 	//权限编码
 	private String treeCode;
 	private String treeCode;
 
 
+	//树形排序
+	private String treeSort;
+
 
 
 
 
 	public ArchiveTreeContract() {
 	public ArchiveTreeContract() {

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

@@ -1,6 +1,6 @@
 package org.springblade.manager.feign;
 package org.springblade.manager.feign;
 
 
-import com.alibaba.fastjson.JSONObject;
+import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
 import org.springblade.manager.entity.ExcelTab;
 import org.springblade.manager.entity.ExcelTab;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -21,8 +21,8 @@ public interface ExcelTabClient {
     ExcelTab getById(@RequestParam String id);
     ExcelTab getById(@RequestParam String id);
 
 
     @PostMapping(API_PREFIX + "/saveTabData")
     @PostMapping(API_PREFIX + "/saveTabData")
-    String saveTabData(@RequestParam Integer isBatchSave,
-                       @RequestBody JSONObject dataInfo,
+    String saveTabData(@RequestBody TrialSelfInspectionRecordDTO dto,
+                       @RequestParam Integer isBatchSave,
                        @RequestParam Integer type,
                        @RequestParam Integer type,
                        @RequestParam String tableType,
                        @RequestParam String tableType,
                        @RequestParam Long id,
                        @RequestParam Long id,

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

@@ -1,6 +1,5 @@
 package org.springblade.manager.feign;
 package org.springblade.manager.feign;
 
 
-import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.manager.vo.WbsTreePrivateVO;
 import org.springblade.manager.vo.WbsTreePrivateVO;
@@ -39,11 +38,8 @@ public interface WbsTreePrivateClient {
     @PostMapping(API_PREFIX + "/queryWbsTreePrivateByProjectIdAndId")
     @PostMapping(API_PREFIX + "/queryWbsTreePrivateByProjectIdAndId")
     List<WbsTreeContractTreeVOS> queryWbsTreePrivateByProjectIdAndId(@RequestParam String projectId, @RequestParam Long id);
     List<WbsTreeContractTreeVOS> queryWbsTreePrivateByProjectIdAndId(@RequestParam String projectId, @RequestParam Long id);
 
 
-    @PostMapping(API_PREFIX + "/showBussTab")
-    boolean showBussTab(@RequestParam Long pkeyId, @RequestParam Integer status);
-
     @PostMapping(API_PREFIX + "/copyBussTab")
     @PostMapping(API_PREFIX + "/copyBussTab")
-    boolean copyBussTab(@RequestParam Long pKeyId);
+    boolean copyBussTab(@RequestParam Long pKeyId, @RequestParam Long id);
 
 
     @PostMapping(API_PREFIX + "/removeBussTabInfoById")
     @PostMapping(API_PREFIX + "/removeBussTabInfoById")
     boolean removeBussTabInfoById(@RequestParam Long pKeyId);
     boolean removeBussTabInfoById(@RequestParam Long pKeyId);

+ 14 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java

@@ -182,6 +182,11 @@ public class ArchiveTreeContractVO2 implements INode<ArchiveTreeContractVO2> {
 	 */
 	 */
 	private Integer archiveAutoGroupSelect;
 	private Integer archiveAutoGroupSelect;
 
 
+	private Integer sort;
+
+	//树形排序
+	private String treeSort;
+
 	public String toString() {
 	public String toString() {
 		return "TreeNode(parentId=" + this.getParentId()
 		return "TreeNode(parentId=" + this.getParentId()
 				+ ",ancestors" + this.getAncestors()
 				+ ",ancestors" + this.getAncestors()
@@ -213,4 +218,13 @@ public class ArchiveTreeContractVO2 implements INode<ArchiveTreeContractVO2> {
 		}
 		}
 	}
 	}
 
 
+	public Integer sortNum(){
+		if (getSort() != null ) {
+			return getSort() + 100;
+		}
+		return 100;
+	}
+
+
+
 }
 }

+ 35 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TrialRecordZJTreeVO.java

@@ -0,0 +1,35 @@
+package org.springblade.manager.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+import org.springblade.core.tool.node.INode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class TrialRecordZJTreeVO implements INode<TrialRecordZJTreeVO> {
+
+    private Long id;
+
+    private String primaryKeyId;
+
+    private String fullName;
+
+    private Long parentId;
+
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private Boolean hasChildren;
+
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private List<TrialRecordZJTreeVO> children;
+
+    @Override
+    public List<TrialRecordZJTreeVO> getChildren() {
+        if (this.children == null) {
+            this.children = new ArrayList<>();
+        }
+        return this.children;
+    }
+
+}

+ 28 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractVO6.java

@@ -56,6 +56,34 @@ public class WbsTreeContractVO6 extends WbsTreeContract implements INode<WbsTree
         return this.children;
         return this.children;
     }
     }
 
 
+    public boolean isProcessType(){
+        if (this.getMajorDataType() != null ) {
+            if (this.getMajorDataType() == 1
+                    || this.getMajorDataType() == 2
+                    || this.getMajorDataType() == 3){
+                return false;
+            }
+        }
+
+        if (this.getTitle() != null ){
+            if (this.getTitle().contains("中间交工")
+                    || this.getTitle().contains("质量评定")
+                    || this.getTitle().contains("开工报告")
+                    || this.getTitle().contains("质量验收评定")) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    public boolean isMatchLevel(Long level){
+        if (this.getNodeType() != null && this.getNodeType() > level) {
+            return  false;
+        }
+        return true;
+    }
+
     @Override
     @Override
     public Boolean getHasChildren() {
     public Boolean getHasChildren() {
         return hasChildren;
         return hasChildren;

+ 42 - 4
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateVO4.java

@@ -1,16 +1,54 @@
 package org.springblade.manager.vo;
 package org.springblade.manager.vo;
 
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.springblade.manager.entity.WbsTreePrivate;
 
 
+import java.io.Serializable;
 import java.util.Map;
 import java.util.Map;
 
 
 @Data
 @Data
-@EqualsAndHashCode(callSuper = true)
-public class WbsTreePrivateVO4 extends WbsTreePrivate{
+public class WbsTreePrivateVO4 implements Serializable {
     private static final long serialVersionUID = 1L;
     private static final long serialVersionUID = 1L;
 
 
     private Map<String, Object> bussDataInfoTrial;
     private Map<String, Object> bussDataInfoTrial;
 
 
+    @JsonProperty(value = "pKeyId")
+    private Long pKeyId;
+
+    private String projectId;
+
+    private String wbsId;
+
+    private String wbsType;
+
+    private String nodeName;
+
+    private Integer nodeType;
+
+    private Integer type;
+
+    private Integer tableType;
+
+    private String tableOwner;
+
+    private String initTableName;
+
+    private String initTableId;
+
+    private Long excelId;
+
+    private String htmlUrl;
+
+    private String fillRate;
+
+    private Integer isTabPdf;
+
+    private String pdfUrl;
+
+    private Integer isBussShow;
+
+    private Integer tabFileType;
+
+    private Integer isLinkTable;
+
 }
 }

+ 29 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeVO2.java

@@ -62,6 +62,35 @@ public class WbsTreeVO2 implements INode<WbsTreeVO2> {
         return this.children;
         return this.children;
     }
     }
 
 
+    public boolean isProcessType(){
+        if (this.getMajorDataType() != null ) {
+            if (this.getMajorDataType() == 1
+                    || this.getMajorDataType() == 2
+                    || this.getMajorDataType() == 3){
+                return false;
+            }
+        }
+
+        if (this.getTitle() != null ){
+            if (this.getTitle().contains("中间交工")
+                    || this.getTitle().contains("质量评定")
+                    || this.getTitle().contains("开工报告")
+                    || this.getTitle().contains("质量验收评定")) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    public boolean isMatchLevel(Long level){
+        if (this.getNodeType() != null && this.getNodeType() > level) {
+            return  false;
+        }
+        return true;
+    }
+
+
     @Override
     @Override
     public Boolean getHasChildren() {
     public Boolean getHasChildren() {
         return hasChildren;
         return hasChildren;

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

@@ -0,0 +1,26 @@
+package org.springblade.archive.feign;
+
+import lombok.AllArgsConstructor;
+import org.springblade.archive.entity.ArchivesAuto;
+import org.springblade.archive.service.IArchivesAutoService;
+import org.springblade.archive.vo.ArchivesAutoVO;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+@AllArgsConstructor
+public class ArchiveAutoClientImpl implements ArchiveAutoClient {
+
+    private IArchivesAutoService archivesAutoService;
+
+    @Override
+    public R saveArchiveAutoByNodes(@RequestBody List<ArchivesAuto> list){
+
+
+        return  R.status(archivesAutoService.saveBatch(list));
+    }
+}

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

@@ -41,8 +41,7 @@
         <result column="mileage" property="mileage"/>
         <result column="mileage" property="mileage"/>
         <result column="fileType" property="fileType"/>
         <result column="fileType" property="fileType"/>
         <result column="size" property="size"/>
         <result column="size" property="size"/>
-        <result column="procsort" property="procsort"/>
-        <result column="node_sort" property="nodeSort"/>
+        <result column="tree_sort" property="nodeSort"/>
         <result column="isOpen" property="isOpen"/>
         <result column="isOpen" property="isOpen"/>
         <result column="ischeck" property="ischeck"/>
         <result column="ischeck" property="ischeck"/>
     </resultMap>
     </resultMap>

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

@@ -899,6 +899,13 @@ public class InformationWriteQueryController extends BladeController {
     @ApiOperationSupport(order = 20)
     @ApiOperationSupport(order = 20)
     @ApiOperation(value = "批量打印")
     @ApiOperation(value = "批量打印")
     public R<String> batchPrint(@RequestParam String ids) {
     public R<String> batchPrint(@RequestParam String ids) {
+        //判断是否未生成文件
+        List<String> list = Arrays.asList(ids.split(","));
+        for (String s : list) {
+            if (StringUtils.isBlank(s)){
+                return R.fail("选择的资料未生成文件");
+            }
+        }
         //获取勾选的数据
         //获取勾选的数据
         List<InformationQuery> queries = this.informationQueryService.getBaseMapper().selectBatchIds(Arrays.asList(ids.split(",")));
         List<InformationQuery> queries = this.informationQueryService.getBaseMapper().selectBatchIds(Arrays.asList(ids.split(",")));
         //pdf集合
         //pdf集合
@@ -952,8 +959,15 @@ public class InformationWriteQueryController extends BladeController {
     @PostMapping("/batchDownloadFileToZip")
     @PostMapping("/batchDownloadFileToZip")
     @ApiOperationSupport(order = 19)
     @ApiOperationSupport(order = 19)
     @ApiOperation(value = "批量下载")
     @ApiOperation(value = "批量下载")
-    public void batchDownloadFileToZip(String ids, HttpServletResponse response) {
+    public R<String> batchDownloadFileToZip(String ids, HttpServletResponse response) {
         if (StringUtils.isNotEmpty(ids)) {
         if (StringUtils.isNotEmpty(ids)) {
+            //判断是否未生成文件
+            List<String> list = Arrays.asList(ids.split(","));
+            for (String s : list) {
+                if (StringUtils.isBlank(s)){
+                    return R.fail("选择的资料未生成文件");
+                }
+            }
             //获取文件
             //获取文件
             List<InformationQuery> result = this.informationQueryService.list(Wrappers.<InformationQuery>lambdaQuery().in(InformationQuery::getId, Arrays.asList(ids.split(","))));
             List<InformationQuery> result = this.informationQueryService.list(Wrappers.<InformationQuery>lambdaQuery().in(InformationQuery::getId, Arrays.asList(ids.split(","))));
             if (result != null && result.size() > 0) {
             if (result != null && result.size() > 0) {
@@ -968,6 +982,9 @@ public class InformationWriteQueryController extends BladeController {
                     FileUtils.batchDownloadFileToZip(urls, response);
                     FileUtils.batchDownloadFileToZip(urls, response);
                 }
                 }
             }
             }
+            return R.success("下载成功");
+        }else {
+            return R.fail("选择的资料未生成文件");
         }
         }
     }
     }
 
 

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

@@ -243,7 +243,9 @@ public class NeiYeController {
                             new Integer("1").equals(vo.getStatus()) ? "待审批" : new Integer("2").equals(vo.getStatus()) ? "已审批" : "未上报",
                             new Integer("1").equals(vo.getStatus()) ? "待审批" : new Integer("2").equals(vo.getStatus()) ? "已审批" : "未上报",
                             vo.getEvaluate(),
                             vo.getEvaluate(),
                             vo.getIsExperiment(),
                             vo.getIsExperiment(),
-                            vo.getReportNumber()));
+                            vo.getReportNumber(),
+                            vo.getInformationQueryId())
+                    );
                 }
                 }
                 //转换为page信息
                 //转换为page信息
                 Query query = new Query();
                 Query query = new Query();

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

@@ -28,6 +28,7 @@ import org.springblade.core.sms.model.SmsResponse;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.jackson.JsonUtil;
 import org.springblade.core.tool.jackson.JsonUtil;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.flow.core.entity.BladeFlow;
 import org.springblade.flow.core.entity.BladeFlow;
 import org.springblade.flow.core.feign.NewFlowClient;
 import org.springblade.flow.core.feign.NewFlowClient;
@@ -61,475 +62,483 @@ import java.util.stream.Collectors;
 @Api(value = "任务审核主表", tags = "任务审核主表接口")
 @Api(value = "任务审核主表", tags = "任务审核主表接口")
 public class TaskController extends BladeController {
 public class TaskController extends BladeController {
 
 
-	private final ITaskService taskService;
-
-	private final ITaskParallelService taskParallelService;
-
-	private final NewFlowClient newFlowClient;
-
-	private final IDictBizClient dictBizClient;
-
-	private final NewISmsClient newSmsClient;
-
-	private final IDefaultConfigService defaultConfigService;
-
-	private final ITaskBatchService taskBatchService;
-
-	private final ITaskService iTaskService;
-
-	private final WebSocket webSocket;
-
-	private final CommonFileClient commonFileClient;
-
-	private final ContractClient contractClient;
-
-	/**
-	 * 记录短信验证码超时时间
-	 */
-	@GetMapping("/save-sms-timeout")
-	@ApiOperationSupport(order = 13)
-	@ApiOperation(value = "记录短信验证码超时时间")
-	public void saveSmsTimeout(@RequestParam String code){
-		//获取账户记录
-		DefaultConfig config = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery().eq(DefaultConfig::getCreateUser, AuthUtil.getUserId()));
-		if(config != null){
-			//获取当前时间
-			Date now = DateUtil.now();
-			//默认16小时后超时
-			now = DateUtil.plusHours(now, 16);
-
-			LambdaUpdateWrapper<DefaultConfig> wrapper = new LambdaUpdateWrapper<>();
-			wrapper.set(DefaultConfig::getSmsTimeOut, DateUtil.format(now, "yyyy-MM-dd HH:mm:ss"));
-			if(!StringUtils.equals(config.getSmsCode(), code)){
-				wrapper.set(DefaultConfig::getSmsCode, code);
-			}
-			//生成超时时间
-			this.defaultConfigService.update(wrapper.eq(DefaultConfig::getCreateUser, AuthUtil.getUserId()));
-		}
-	}
-
-	/**
-	 * 校验电签短信验证码
-	 */
-	@PostMapping("/check-sms-code")
-	@ApiOperationSupport(order = 12)
-	@ApiOperation(value = "校验电签短信验证码")
-	public R<String> checkSmsCode(){
-		//获取账户验证码
-		DefaultConfig config = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery().eq(DefaultConfig::getCreateUser, AuthUtil.getUserId()));
-
-		if(config != null){
-			if(StringUtils.isNotEmpty(config.getSmsTimeOut())){
-				//获取当前时间
-				Date now = DateUtil.now();
-				//先自行校验是否超时
-				Duration duration = DateUtil.between(DateUtil.parse(config.getSmsTimeOut(), "yyyy-MM-dd HH:mm:ss"), now);
-				if(duration.getSeconds() > 0){
-					//说明已经超时,清空短信验证记录
-					this.defaultConfigService.update(Wrappers.<DefaultConfig>lambdaUpdate().set(DefaultConfig::getSmsTimeOut, null).set(DefaultConfig::getSmsCode, null).eq(DefaultConfig::getId, config.getId()));
-				}
-			}
-			return R.data(config.getSmsTimeOut());
-		}
-
-		return R.data(null);
-	}
-
-	/**
-	 * 批量审批详情
-	 */
-	@GetMapping("/batch-approval-parameter")
-	@ApiOperationSupport(order = 11)
-	@ApiOperation(value = "批量页详情")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "formDataId", value = "数据源", required = true),
-			@ApiImplicitParam(name = "approvalType", value = "上报类型", required = true)
-	})
-	public R<TaskApprovalVO> getBatchApprovalTaskParameter(@RequestParam String formDataId, @RequestParam Integer approvalType){
-		TaskApprovalVO result = new TaskApprovalVO();
-		result.setFormDataId(formDataId);
-		result.setApprovalType(approvalType);
-
-		return R.data(this.taskService.queryBusinessData(result));
-	}
-
-	/**
-	 * 短信验证
-	 */
-	@PostMapping("/send-notice")
-	@ApiOperationSupport(order = 10)
-	@ApiOperation(value = "短信验证")
-	public R<Boolean> sendNotice(@RequestParam String phone){
-		String code = CommonUtil.getCharAndNumber(4);
-		Map<String, String> params = new HashMap<>(3);
-		params.put("code", code);
-		R<SmsResponse> result = this.newSmsClient.sendMessage("test_code", JsonUtil.toJson(params), phone);
-		if(result.getData().isSuccess()){
-			//记录当前验证码
-			DefaultConfig config = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery().eq(DefaultConfig::getCreateUser, AuthUtil.getUserId()));
-			if(config != null){
-				//修改
-				config.setSmsCode(code);
-				this.defaultConfigService.updateById(config);
-			} else {
-				//新增
-				config = new DefaultConfig();
-				config.setSmsCode(code);
-				config.setCreateUser(AuthUtil.getUserId());
-				config.setCreateTime(new Date());
-				this.defaultConfigService.save(config);
-			}
-		}
-		return result.getData().isSuccess() ? R.data(200, true, code) : R.data(499, false, String.valueOf(JSONObject.parseObject(result.getData().getMsg(), Map.class).get("Message")));
-	}
-
-	/**
-	 * 获取发起
-	 */
-	@GetMapping("/query-user-start-flow")
-	@ApiOperationSupport(order =  9)
-	@ApiOperation(value = "获取发起")
-	public R<IPage<TaskVO>> queryUserStartFlow(TaskQueryVO queryVO){
-		//获取发起,只需要查询主表
-		//先查询符合条件的流程
-		LambdaQueryWrapper<Task> wrapper = Wrappers.<Task>lambdaQuery().eq(Task::getProjectId, queryVO.getProjectId()).eq(Task::getReportUser, AuthUtil.getUserId().toString());
-		//设置查询参数
-		this.integrationMethod(wrapper, queryVO);
-		//获取主流程
-		List<Task> masterTaskList = this.taskService.list(wrapper);
-		if(masterTaskList != null && masterTaskList.size() > 0){
-			//获取集合
-			List<String> processInstanceIds = masterTaskList.stream().map(Task::getProcessInstanceId).distinct().collect(Collectors.toList());
-			//设置主表map,方便获取
-			Map<String, Task> masterTaskMap = new HashMap<>();
-			masterTaskList.forEach(task -> masterTaskMap.put(task.getProcessInstanceId(), task));
-
-			R<Object> rObject = this.newFlowClient.selectSendPage(queryVO.getCurrent(), queryVO.getSize(),queryVO.getOrdType()==null?1:queryVO.getOrdType(), String.join(",", processInstanceIds));
-			if(rObject.isSuccess()){
-				Query query = new Query();
-				query.setCurrent(queryVO.getCurrent());
-				query.setSize(queryVO.getSize());
-				//新建一个IPage的实例
-				IPage<BladeFlow> newData = Condition.getPage(query);
-				//使用实例获取具体的类型进行转换
-				IPage flowIPage = JSONObject.parseObject(JSONObject.toJSONString(rObject.getData()), newData.getClass());
-				//本质上这里获取到的集合属于List<JSONObject>,所以需要在这进行一次类型转换,将JSONObject转为BladeFlow
-				List<BladeFlow> result = JSONArray.parseArray(JSONObject.toJSONString(flowIPage.getRecords()), BladeFlow.class);
-
-				//最终结果集合
-				List<TaskVO> finalResult = new ArrayList<>();
-				for(BladeFlow  flow : result) {
-					//获取实体
-					Task task = masterTaskMap.get(flow.getProcessInstanceId());
-					//类型转换
-					TaskVO vo = new TaskVO();
-					BeanUtils.copyProperties(task, vo);
-					//设置关键信息
-					vo.setTypeValue(new Integer("1").equals(vo.getType()) ? "普通任务" : new Integer("2").equals(vo.getType()) ? "验收任务" : "移交任务");
-					vo.setTaskId(flow.getTaskId());
-					vo.setTaskStatus(new Integer("1").equals(task.getStatus()) ? "待审批" : new Integer("2").equals(task.getStatus()) ? "已审批" : "已废除", task.getStatus());
-					//查询分支流程信息
-					List<TaskParallel> linkList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().eq(TaskParallel::getProcessInstanceId, task.getProcessInstanceId()));
-					if (linkList != null && !linkList.isEmpty()) {
-						this.integrationMethod(vo, linkList);
-					}
-					finalResult.add(vo);
-				}
-
-				// 手机app 需要排序接口
-				if(queryVO.getOrdType()!=null && queryVO.getOrdType()==1){ // 降序
-					finalResult.sort(Comparator.comparing(TaskVO::getCreateTime).reversed());
-				}
-				if(queryVO.getOrdType()!=null && queryVO.getOrdType()==2){ // 升序
-					finalResult.sort(Comparator.comparing(TaskVO::getCreateTime));
-				}
-
-				//最终分页数据
-				return this.getIPageR(query, flowIPage, finalResult);
-			}
-		}
-
-		return R.data(null);
-	}
-
-	/**
-	 * 统合方法
-	 */
-	private void integrationMethod(TaskVO vo, List<TaskParallel> linkList) {
-		linkList.forEach(link -> vo.setWaitingUserList(link.getTaskUserName(), new Integer("999").equals(link.getEVisaStatus()) ? 999 : new Integer("2").equals(link.getStatus()) ? 2 : new Integer("3").equals(link.getStatus()) && new Integer("1").equals(link.getInitiative()) ? 3 : 1));
-	}
-
-	/**
-	 * 批量审批
-	 */
-	@PostMapping("/batch-complete-approval-task")
-	@ApiOperationSupport(order = 8)
-	@ApiOperation(value = "批量审批")
-	public R<Boolean> batchCompleteApprovalTask(@RequestBody BatchTaskVO batchTaskVO) throws IOException {
-		String taskIds = batchTaskVO.getTaskIds();
-		String parallelProcessInstanceIds = batchTaskVO.getParallelProcessInstanceIds();
-		if(StringUtils.isNotEmpty(taskIds)){
-			String[] taskIdArray = taskIds.split(",");
-			String[] parallelProcessInstanceIdArray = parallelProcessInstanceIds.split(",");
-			String[] approvalType = batchTaskVO.getApprovalType().split(",");
-			String[] formDataId = batchTaskVO.getFormDataId().split(",");
-
-			List<TaskApprovalVO> taskApprovalVOS = new ArrayList<>();
-
-			for(int i = 0, l = taskIdArray.length; i < l; i ++){
-				TaskApprovalVO approvalVO = new TaskApprovalVO();
-				approvalVO.setTaskId(taskIdArray[i]);
-				approvalVO.setParallelProcessInstanceId(parallelProcessInstanceIdArray[i]);
-				approvalVO.setFlag(batchTaskVO.getFlag());
-				approvalVO.setComment(batchTaskVO.getComment());
-				approvalVO.setApprovalType(Integer.parseInt(approvalType[i]));
-				approvalVO.setFormDataId(formDataId[i]);
-
-				taskApprovalVOS.add(approvalVO);
-			}
-
-			//审批
-			this.taskService.batchCompleteApprovalTask(taskApprovalVOS,AuthUtil.getUserId());
-
-			//通过WebSocket推送数量条数
-			if (ObjectUtil.isNotEmpty(AuthUtil.getUserId())) {
-				Map<String, String> webSocketMessageMap = WebSocket.getWebSocketMessageMap();
-				Set<Map.Entry<String, String>> message = webSocketMessageMap.entrySet();
-				for (Map.Entry<String, String> entry : message) {
-					String userId = entry.getKey();
-					if (userId.equals(AuthUtil.getUserId().toString())) { //只推送当前用户
-						String projectAndContractId = entry.getValue();
-						if (StringUtils.isNotEmpty(projectAndContractId) && StringUtils.isNotEmpty(userId)) {
-							String projectId = projectAndContractId.split(",")[0];
-							String contractId = projectAndContractId.split(",")[1];
-							Map<String, String> stringMap = iTaskService.getTaskCount(projectId, contractId, userId);
-
-							webSocket.sendMessageByUserId(AuthUtil.getUserId().toString(), JSON.toJSONString(stringMap));
-						}
-					}
-				}
-			}
-
-			return R.data(true);
-		}
-		return R.data(false);
-	}
-
-	/**
-	 * 获取当前合同段的上报批次
-	 * @param projectId 项目ID
-	 * @param contractId 合同段ID
-	 */
-	@GetMapping("/query-batch-list")
-	@ApiOperationSupport(order = 7)
-	@ApiOperation(value = "获取当前合同段的上报批次")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "projectId", value = "项目ID", required = true),
-			@ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
-	})
-	public R<List<Task>> queryBatchList(String projectId, String contractId){
-		return R.data(this.taskService.queryBatchList(projectId, contractId));
-	}
-
-	/**
-	 * 获取当前合同段有哪些上报批次
-	 * @param projectId 项目ID
-	 * @param contractId 合同段ID
-	 */
-	@GetMapping("/query-batch-list-two")
-	@ApiOperationSupport(order = 7)
-	@ApiOperation(value = "获取当前合同段的上报批次")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "projectId", value = "项目ID", required = true),
-			@ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
-	})
-	public R<List<String>> queryBatchListTwo(String projectId, String contractId,String type){
-		if (StringUtils.isBlank(type)) {
-			//为空,以information为主表查询填报资料批次
-			return R.data(this.taskService.queryBatchListTwo(projectId, contractId));
-		}else{
-			//如果type为1内页台账不需要去查询首件批次,type为2只查标记为首件的,type为3只查首件
-			return R.data(this.taskService.queryBatchListThree(projectId, contractId,type));
-		}
-	}
-
-
-	/**
-	 * 获取任务类型或任务状态
-	 */
-	@GetMapping("/query-task-type-status")
-	@ApiOperationSupport(order = 6)
-	@ApiOperation(value = "获取任务类型或任务状态")
-	public R<List<DictBiz>> queryTaskTypeOrStatus(String typeOrStatus){
-		return this.dictBizClient.getList(typeOrStatus, "notRoot");
-	}
-
-	/**
-	 * 获取已办
-	 */
-	@GetMapping("/query-user-done-task-list")
-	@ApiOperationSupport(order = 5)
-	@ApiOperation(value = "获取已办")
-	public R<IPage<TaskVO>> queryUserDoneTaskList(TaskQueryVO queryVO){
-		//设置获取参数
-		Map<String,Task> masterTaskMap = new HashMap<>();
-		Map<String,TaskParallel> parallelMap = new HashMap<>();
-		List<String> parallelProcessInstanceIds = new ArrayList<>();
-		//统合查询方法
-		this.integrationMethod(queryVO, masterTaskMap, parallelMap, parallelProcessInstanceIds, "2,3");
-
-		//获取已办(基于原生已办)
-		R<Object> rObject = this.newFlowClient.selectDonePage(queryVO.getCurrent(), queryVO.getSize(),queryVO.getOrdType()==null?1:queryVO.getOrdType(), String.join(",", parallelProcessInstanceIds));
-		//处理参数
-		return this.integrationMethod(queryVO, rObject, masterTaskMap, parallelMap, false);
-	}
-
-	/**
-	 * 审批页详情
-	 */
-	@GetMapping("/query-approval-parameter")
-	@ApiOperationSupport(order = 4)
-	@ApiOperation(value = "审批页详情(单任务时)")
-	public R<TaskApprovalVO> getApprovalTaskParameter(@RequestParam String parallelProcessInstanceId, @RequestParam String formDataId, @RequestParam Integer approvalType){
-		TaskApprovalVO vo = new TaskApprovalVO();
-		vo.setFormDataId(formDataId);
-		vo.setApprovalType(approvalType);
-		//获取具体业务数据
-		return R.data(this.taskService.queryBusinessData(vo));
-	}
-	/**
-	 * 审批页pdf数量详情
-	 */
-	@GetMapping("/query-approval-parameter-pdf-num")
-	@ApiOperationSupport(order = 14)
-	@ApiOperation(value = "审批页pdf数量详情")
-	public R<Object> getApprovalTaskParameterPdfNum(@RequestParam String url){
-		String pdfNum = this.commonFileClient.getPdfNum(url);
-		return R.data(pdfNum);
-	}
-	/**
-	 * 获取当前用户待办流程
-	 */
-	@GetMapping("/user-to-do-task-list")
-	@ApiOperationSupport(order = 3)
-	@ApiOperation(value = "获取当前用户待办流程")
-	public R<IPage<TaskVO>> todoUserApprovalTask(TaskQueryVO queryVO){
-		//设置获取参数
-		Map<String,Task> masterTaskMap = new HashMap<>();
-		Map<String,TaskParallel> parallelMap = new HashMap<>();
-		List<String> parallelProcessInstanceIds = new ArrayList<>();
-		//统合查询方法
-		this.integrationMethod(queryVO, masterTaskMap, parallelMap, parallelProcessInstanceIds, "1");
-		if (masterTaskMap.size() == 0){
-			return R.data(null);
-		}
-		//获取待办(基于原生待办)
-		R<Object> rObject = this.newFlowClient.selectTodoPage(queryVO.getCurrent(), queryVO.getSize(),queryVO.getOrdType()==null?1:queryVO.getOrdType(), String.join(",", parallelProcessInstanceIds));
-		//处理参数
-		return this.integrationMethod(queryVO, rObject, masterTaskMap, parallelMap, true);
-	}
-
-	/**
-	 * 统合查询方法
-	 */
-	private void integrationMethod(TaskQueryVO queryVO, Map<String,Task> masterTaskMap, Map<String,TaskParallel> parallelMap, List<String> parallelProcessInstanceIds, String status){
-		//先查询符合条件的流程
-		LambdaQueryWrapper<Task> wrapper = Wrappers.<Task>lambdaQuery().eq(Task::getIsDeleted, 0)
-				.eq(Task::getProjectId, queryVO.getProjectId()).eq(StringUtils.isNotBlank(queryVO.getBatch()),Task::getBatch,queryVO.getBatch());
-		this.integrationMethod(wrapper, queryVO);
-
-		//符合条件的集合
-		List<Task> masterTaskList = this.taskService.list(wrapper);
-		//根据主表获取附表且当前用户的记录
-		List<String> processInstanceIds = new ArrayList<>();
-		masterTaskList.forEach(task -> {
-			masterTaskMap.put(task.getProcessInstanceId(), task);
-			processInstanceIds.add(task.getProcessInstanceId());
-		});
-
-		if(processInstanceIds.size() > 0){
-			List<TaskParallel> parallelTaskList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().in(TaskParallel::getProcessInstanceId, processInstanceIds).eq(TaskParallel::getTaskUser, AuthUtil.getUserId().toString()).eq(TaskParallel::getIsDeleted, 0).in(TaskParallel::getStatus, Arrays.asList(status.split(","))));
-			parallelTaskList.forEach(parallel -> {
-				parallelMap.put(parallel.getParallelProcessInstanceId(), parallel);
-				parallelProcessInstanceIds.add(parallel.getParallelProcessInstanceId());
-			});
-		}
-	}
-
-	private void integrationMethod(LambdaQueryWrapper<Task> wrapper, TaskQueryVO queryVO){
-		//任务类型
-		if(StringUtils.isNotEmpty(queryVO.getTaskType())){
-			wrapper.eq(Task::getType, queryVO.getTaskType());
-		}
-		//任务状态
-		if(StringUtils.isNotEmpty(queryVO.getTaskStatus())){
-			wrapper.eq(Task::getStatus, queryVO.getTaskStatus());
-		}
-		//合同段ID
-		if(StringUtils.isNotEmpty(queryVO.getContractId())){
-			ContractInfo contractInfo = contractClient.getContractById(Long.valueOf(queryVO.getContractId()));
-			if (contractInfo.getContractType() == 2){
-				wrapper.eq(Task::getProjectId, queryVO.getProjectId());
-			}else {
-				wrapper.eq(Task::getContractId, queryVO.getContractId());
-			}
-		}
-		//开始结束时间
-		if(StringUtils.isNotEmpty(queryVO.getStartTime()) && StringUtils.isNotEmpty(queryVO.getEndTime())){
-			wrapper.between(Task::getStartTime, queryVO.getStartTime(), queryVO.getEndTime());
-		}
-		//关键字查询
-		if(StringUtils.isNotEmpty(queryVO.getQueryValue())){
-			wrapper.like(Task::getTaskName, queryVO.getQueryValue());
-		}
-	}
-
-	/**
-	 * 统合处理方法
-	 */
-	private R<IPage<TaskVO>> integrationMethod(TaskQueryVO queryVO, R<Object> rObject, Map<String,Task> masterTaskMap, Map<String,TaskParallel> parallelMap, boolean isToDo){
-		Query query = new Query();
-		query.setCurrent(queryVO.getCurrent());
-		query.setSize(queryVO.getSize());
-		//最终集合
-		List<TaskVO> finalResult = new ArrayList<>();
-		if(rObject.isSuccess()){
-			//新建一个IPage的实例
-			IPage<BladeFlow> newData = Condition.getPage(query);
-			//使用实例获取具体的类型进行转换
-			IPage flowIPage = JSONObject.parseObject(JSONObject.toJSONString(rObject.getData()), newData.getClass());
-			//本质上这里获取到的集合属于List<JSONObject>,所以需要在这进行一次类型转换,将JSONObject转为BladeFlow
-			List<BladeFlow> result = JSONArray.parseArray(JSONObject.toJSONString(flowIPage.getRecords()), BladeFlow.class);
-
-			if(result != null && result.size() > 0){
-				//获取相关信息
-				result.forEach(flow -> {
-					TaskParallel taskParallel = parallelMap.get(flow.getProcessInstanceId());
-					if(taskParallel != null){
-						//查询主表数据
-						Task task = masterTaskMap.get(taskParallel.getProcessInstanceId());
-
-						if(task != null){
-							//复制数据
-							TaskVO vo = new TaskVO();
-							BeanUtils.copyProperties(task, vo);
-							//设置关键信息
-							vo.setTypeValue(new Integer("1").equals(vo.getType()) ? "普通任务" : new Integer("2").equals(vo.getType()) ? "验收任务" : "移交任务");
-							vo.setParallelProcessInstanceId(flow.getProcessInstanceId());
-							vo.setTaskId(flow.getTaskId());
-							vo.setTaskStatus(new Integer("1").equals(task.getStatus()) ? "待审批" : new Integer("2").equals(task.getStatus()) ? "已审批" : "已废除", task.getStatus());
-							vo.setEVisaContent(taskParallel.getEVisaContent());
-							//获取主流程下所有相关的审批人
-							List<TaskParallel> linkList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().eq(TaskParallel::getProcessInstanceId, task.getProcessInstanceId()).eq(TaskParallel::getIsDeleted, 0));
-							if(linkList != null && linkList.size() > 0){
-								this.integrationMethod(vo, linkList);
-							}
-
-							//设置最终集合
-							finalResult.add(vo);
-						}
-					}
-				});
+    private final ITaskService taskService;
+
+    private final ITaskParallelService taskParallelService;
+
+    private final NewFlowClient newFlowClient;
+
+    private final IDictBizClient dictBizClient;
+
+    private final NewISmsClient newSmsClient;
+
+    private final IDefaultConfigService defaultConfigService;
+
+    private final ITaskBatchService taskBatchService;
+
+    private final ITaskService iTaskService;
+
+    private final WebSocket webSocket;
+
+    private final CommonFileClient commonFileClient;
+
+    private final ContractClient contractClient;
+
+    /**
+     * 记录短信验证码超时时间
+     */
+    @GetMapping("/save-sms-timeout")
+    @ApiOperationSupport(order = 13)
+    @ApiOperation(value = "记录短信验证码超时时间")
+    public void saveSmsTimeout(@RequestParam String code) {
+        //获取账户记录
+        DefaultConfig config = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery().eq(DefaultConfig::getCreateUser, AuthUtil.getUserId()));
+        if (config != null) {
+            //获取当前时间
+            Date now = DateUtil.now();
+            //默认16小时后超时
+            now = DateUtil.plusHours(now, 16);
+
+            LambdaUpdateWrapper<DefaultConfig> wrapper = new LambdaUpdateWrapper<>();
+            wrapper.set(DefaultConfig::getSmsTimeOut, DateUtil.format(now, "yyyy-MM-dd HH:mm:ss"));
+            if (!StringUtils.equals(config.getSmsCode(), code)) {
+                wrapper.set(DefaultConfig::getSmsCode, code);
+            }
+            //生成超时时间
+            this.defaultConfigService.update(wrapper.eq(DefaultConfig::getCreateUser, AuthUtil.getUserId()));
+        }
+    }
+
+    /**
+     * 校验电签短信验证码
+     */
+    @PostMapping("/check-sms-code")
+    @ApiOperationSupport(order = 12)
+    @ApiOperation(value = "校验电签短信验证码")
+    public R<String> checkSmsCode() {
+        //获取账户验证码
+        DefaultConfig config = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery().eq(DefaultConfig::getCreateUser, AuthUtil.getUserId()));
+
+        if (config != null) {
+            if (StringUtils.isNotEmpty(config.getSmsTimeOut())) {
+                //获取当前时间
+                Date now = DateUtil.now();
+                //先自行校验是否超时
+                Duration duration = DateUtil.between(DateUtil.parse(config.getSmsTimeOut(), "yyyy-MM-dd HH:mm:ss"), now);
+                if (duration.getSeconds() > 0) {
+                    //说明已经超时,清空短信验证记录
+                    this.defaultConfigService.update(Wrappers.<DefaultConfig>lambdaUpdate().set(DefaultConfig::getSmsTimeOut, null).set(DefaultConfig::getSmsCode, null).eq(DefaultConfig::getId, config.getId()));
+                }
+            }
+            return R.data(config.getSmsTimeOut());
+        }
+
+        return R.data(null);
+    }
+
+    /**
+     * 批量审批详情
+     */
+    @GetMapping("/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 Integer approvalType) {
+        List<String> longs = Func.toStrList(formDataId);
+        List<TaskApprovalVO> taskApprovalVOList = new ArrayList<>();
+        for (String aLong : longs) {
+            TaskApprovalVO result = new TaskApprovalVO();
+            result.setFormDataId(aLong);
+            result.setApprovalType(approvalType);
+            taskApprovalVOList.add(this.taskService.queryBusinessData(result));
+        }
+        return R.data(taskApprovalVOList);
+    }
+
+    /**
+     * 短信验证
+     */
+    @PostMapping("/send-notice")
+    @ApiOperationSupport(order = 10)
+    @ApiOperation(value = "短信验证")
+    public R<Boolean> sendNotice(@RequestParam String phone) {
+        String code = CommonUtil.getCharAndNumber(4);
+        Map<String, String> params = new HashMap<>(3);
+        params.put("code", code);
+        R<SmsResponse> result = this.newSmsClient.sendMessage("test_code", JsonUtil.toJson(params), phone);
+        if (result.getData().isSuccess()) {
+            //记录当前验证码
+            DefaultConfig config = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery().eq(DefaultConfig::getCreateUser, AuthUtil.getUserId()));
+            if (config != null) {
+                //修改
+                config.setSmsCode(code);
+                this.defaultConfigService.updateById(config);
+            } else {
+                //新增
+                config = new DefaultConfig();
+                config.setSmsCode(code);
+                config.setCreateUser(AuthUtil.getUserId());
+                config.setCreateTime(new Date());
+                this.defaultConfigService.save(config);
+            }
+        }
+        return result.getData().isSuccess() ? R.data(200, true, code) : R.data(499, false, String.valueOf(JSONObject.parseObject(result.getData().getMsg(), Map.class).get("Message")));
+    }
+
+    /**
+     * 获取发起
+     */
+    @GetMapping("/query-user-start-flow")
+    @ApiOperationSupport(order = 9)
+    @ApiOperation(value = "获取发起")
+    public R<IPage<TaskVO>> queryUserStartFlow(TaskQueryVO queryVO) {
+        //获取发起,只需要查询主表
+        //先查询符合条件的流程
+        LambdaQueryWrapper<Task> wrapper = Wrappers.<Task>lambdaQuery().eq(Task::getProjectId, queryVO.getProjectId()).eq(Task::getReportUser, AuthUtil.getUserId().toString());
+        //设置查询参数
+        this.integrationMethod(wrapper, queryVO);
+        //获取主流程
+        List<Task> masterTaskList = this.taskService.list(wrapper);
+        if (masterTaskList != null && masterTaskList.size() > 0) {
+            //获取集合
+            List<String> processInstanceIds = masterTaskList.stream().map(Task::getProcessInstanceId).distinct().collect(Collectors.toList());
+            //设置主表map,方便获取
+            Map<String, Task> masterTaskMap = new HashMap<>();
+            masterTaskList.forEach(task -> masterTaskMap.put(task.getProcessInstanceId(), task));
+
+            R<Object> rObject = this.newFlowClient.selectSendPage(queryVO.getCurrent(), queryVO.getSize(), queryVO.getOrdType() == null ? 1 : queryVO.getOrdType(), String.join(",", processInstanceIds));
+            if (rObject.isSuccess()) {
+                Query query = new Query();
+                query.setCurrent(queryVO.getCurrent());
+                query.setSize(queryVO.getSize());
+                //新建一个IPage的实例
+                IPage<BladeFlow> newData = Condition.getPage(query);
+                //使用实例获取具体的类型进行转换
+                IPage flowIPage = JSONObject.parseObject(JSONObject.toJSONString(rObject.getData()), newData.getClass());
+                //本质上这里获取到的集合属于List<JSONObject>,所以需要在这进行一次类型转换,将JSONObject转为BladeFlow
+                List<BladeFlow> result = JSONArray.parseArray(JSONObject.toJSONString(flowIPage.getRecords()), BladeFlow.class);
+
+                //最终结果集合
+                List<TaskVO> finalResult = new ArrayList<>();
+                for (BladeFlow flow : result) {
+                    //获取实体
+                    Task task = masterTaskMap.get(flow.getProcessInstanceId());
+                    //类型转换
+                    TaskVO vo = new TaskVO();
+                    BeanUtils.copyProperties(task, vo);
+                    //设置关键信息
+                    vo.setTypeValue(new Integer("1").equals(vo.getType()) ? "普通任务" : new Integer("2").equals(vo.getType()) ? "验收任务" : "移交任务");
+                    vo.setTaskId(flow.getTaskId());
+                    vo.setTaskStatus(new Integer("1").equals(task.getStatus()) ? "待审批" : new Integer("2").equals(task.getStatus()) ? "已审批" : "已废除", task.getStatus());
+                    //查询分支流程信息
+                    List<TaskParallel> linkList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().eq(TaskParallel::getProcessInstanceId, task.getProcessInstanceId()));
+                    if (linkList != null && !linkList.isEmpty()) {
+                        this.integrationMethod(vo, linkList);
+                    }
+                    finalResult.add(vo);
+                }
+
+                // 手机app 需要排序接口
+                if (queryVO.getOrdType() != null && queryVO.getOrdType() == 1) { // 降序
+                    finalResult.sort(Comparator.comparing(TaskVO::getCreateTime).reversed());
+                }
+                if (queryVO.getOrdType() != null && queryVO.getOrdType() == 2) { // 升序
+                    finalResult.sort(Comparator.comparing(TaskVO::getCreateTime));
+                }
+
+                //最终分页数据
+                return this.getIPageR(query, flowIPage, finalResult);
+            }
+        }
+
+        return R.data(null);
+    }
+
+    /**
+     * 统合方法
+     */
+    private void integrationMethod(TaskVO vo, List<TaskParallel> linkList) {
+        linkList.forEach(link -> vo.setWaitingUserList(link.getTaskUserName(), new Integer("999").equals(link.getEVisaStatus()) ? 999 : new Integer("2").equals(link.getStatus()) ? 2 : new Integer("3").equals(link.getStatus()) && new Integer("1").equals(link.getInitiative()) ? 3 : 1));
+    }
+
+    /**
+     * 批量审批
+     */
+    @PostMapping("/batch-complete-approval-task")
+    @ApiOperationSupport(order = 8)
+    @ApiOperation(value = "批量审批")
+    public R<Boolean> batchCompleteApprovalTask(@RequestBody BatchTaskVO batchTaskVO) throws IOException {
+        String taskIds = batchTaskVO.getTaskIds();
+        String parallelProcessInstanceIds = batchTaskVO.getParallelProcessInstanceIds();
+        if (StringUtils.isNotEmpty(taskIds)) {
+            String[] taskIdArray = taskIds.split(",");
+            String[] parallelProcessInstanceIdArray = parallelProcessInstanceIds.split(",");
+            String[] approvalType = batchTaskVO.getApprovalType().split(",");
+            String[] formDataId = batchTaskVO.getFormDataId().split(",");
+
+            List<TaskApprovalVO> taskApprovalVOS = new ArrayList<>();
+
+            for (int i = 0, l = taskIdArray.length; i < l; i++) {
+                TaskApprovalVO approvalVO = new TaskApprovalVO();
+                approvalVO.setTaskId(taskIdArray[i]);
+                approvalVO.setParallelProcessInstanceId(parallelProcessInstanceIdArray[i]);
+                approvalVO.setFlag(batchTaskVO.getFlag());
+                approvalVO.setComment(batchTaskVO.getComment());
+                approvalVO.setApprovalType(Integer.parseInt(approvalType[i]));
+                approvalVO.setFormDataId(formDataId[i]);
+
+                taskApprovalVOS.add(approvalVO);
+            }
+
+            //审批
+            this.taskService.batchCompleteApprovalTask(taskApprovalVOS, AuthUtil.getUserId());
+
+            //通过WebSocket推送数量条数
+            if (ObjectUtil.isNotEmpty(AuthUtil.getUserId())) {
+                Map<String, String> webSocketMessageMap = WebSocket.getWebSocketMessageMap();
+                Set<Map.Entry<String, String>> message = webSocketMessageMap.entrySet();
+                for (Map.Entry<String, String> entry : message) {
+                    String userId = entry.getKey();
+                    if (userId.equals(AuthUtil.getUserId().toString())) { //只推送当前用户
+                        String projectAndContractId = entry.getValue();
+                        if (StringUtils.isNotEmpty(projectAndContractId) && StringUtils.isNotEmpty(userId)) {
+                            String projectId = projectAndContractId.split(",")[0];
+                            String contractId = projectAndContractId.split(",")[1];
+                            Map<String, String> stringMap = iTaskService.getTaskCount(projectId, contractId, userId);
+
+                            webSocket.sendMessageByUserId(AuthUtil.getUserId().toString(), JSON.toJSONString(stringMap));
+                        }
+                    }
+                }
+            }
+
+            return R.data(true);
+        }
+        return R.data(false);
+    }
+
+    /**
+     * 获取当前合同段的上报批次
+     *
+     * @param projectId  项目ID
+     * @param contractId 合同段ID
+     */
+    @GetMapping("/query-batch-list")
+    @ApiOperationSupport(order = 7)
+    @ApiOperation(value = "获取当前合同段的上报批次")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "projectId", value = "项目ID", required = true),
+            @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
+    })
+    public R<List<Task>> queryBatchList(String projectId, String contractId) {
+        return R.data(this.taskService.queryBatchList(projectId, contractId));
+    }
+
+    /**
+     * 获取当前合同段有哪些上报批次
+     *
+     * @param projectId  项目ID
+     * @param contractId 合同段ID
+     */
+    @GetMapping("/query-batch-list-two")
+    @ApiOperationSupport(order = 7)
+    @ApiOperation(value = "获取当前合同段的上报批次")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "projectId", value = "项目ID", required = true),
+            @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
+    })
+    public R<List<String>> queryBatchListTwo(String projectId, String contractId, String type) {
+        if (StringUtils.isBlank(type)) {
+            //为空,以information为主表查询填报资料批次
+            return R.data(this.taskService.queryBatchListTwo(projectId, contractId));
+        } else {
+            //如果type为1内页台账不需要去查询首件批次,type为2只查标记为首件的,type为3只查首件
+            return R.data(this.taskService.queryBatchListThree(projectId, contractId, type));
+        }
+    }
+
+
+    /**
+     * 获取任务类型或任务状态
+     */
+    @GetMapping("/query-task-type-status")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "获取任务类型或任务状态")
+    public R<List<DictBiz>> queryTaskTypeOrStatus(String typeOrStatus) {
+        return this.dictBizClient.getList(typeOrStatus, "notRoot");
+    }
+
+    /**
+     * 获取已办
+     */
+    @GetMapping("/query-user-done-task-list")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "获取已办")
+    public R<IPage<TaskVO>> queryUserDoneTaskList(TaskQueryVO queryVO) {
+        //设置获取参数
+        Map<String, Task> masterTaskMap = new HashMap<>();
+        Map<String, TaskParallel> parallelMap = new HashMap<>();
+        List<String> parallelProcessInstanceIds = new ArrayList<>();
+        //统合查询方法
+        this.integrationMethod(queryVO, masterTaskMap, parallelMap, parallelProcessInstanceIds, "2,3");
+
+        //获取已办(基于原生已办)
+        R<Object> rObject = this.newFlowClient.selectDonePage(queryVO.getCurrent(), queryVO.getSize(), queryVO.getOrdType() == null ? 1 : queryVO.getOrdType(), String.join(",", parallelProcessInstanceIds));
+        //处理参数
+        return this.integrationMethod(queryVO, rObject, masterTaskMap, parallelMap, false);
+    }
+
+    /**
+     * 审批页详情
+     */
+    @GetMapping("/query-approval-parameter")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "审批页详情(单任务时)")
+    public R<TaskApprovalVO> getApprovalTaskParameter(@RequestParam String parallelProcessInstanceId, @RequestParam String formDataId, @RequestParam Integer approvalType) {
+        TaskApprovalVO vo = new TaskApprovalVO();
+        vo.setFormDataId(formDataId);
+        vo.setApprovalType(approvalType);
+        //获取具体业务数据
+        return R.data(this.taskService.queryBusinessData(vo));
+    }
+
+    /**
+     * 审批页pdf数量详情
+     */
+    @GetMapping("/query-approval-parameter-pdf-num")
+    @ApiOperationSupport(order = 14)
+    @ApiOperation(value = "审批页pdf数量详情")
+    public R<Object> getApprovalTaskParameterPdfNum(@RequestParam String url) {
+        String pdfNum = this.commonFileClient.getPdfNum(url);
+        return R.data(pdfNum);
+    }
+
+    /**
+     * 获取当前用户待办流程
+     */
+    @GetMapping("/user-to-do-task-list")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "获取当前用户待办流程")
+    public R<IPage<TaskVO>> todoUserApprovalTask(TaskQueryVO queryVO) {
+        //设置获取参数
+        Map<String, Task> masterTaskMap = new HashMap<>();
+        Map<String, TaskParallel> parallelMap = new HashMap<>();
+        List<String> parallelProcessInstanceIds = new ArrayList<>();
+        //统合查询方法
+        this.integrationMethod(queryVO, masterTaskMap, parallelMap, parallelProcessInstanceIds, "1");
+        if (masterTaskMap.size() == 0) {
+            return R.data(null);
+        }
+        //获取待办(基于原生待办)
+        R<Object> rObject = this.newFlowClient.selectTodoPage(queryVO.getCurrent(), queryVO.getSize(), queryVO.getOrdType() == null ? 1 : queryVO.getOrdType(), String.join(",", parallelProcessInstanceIds));
+        //处理参数
+        return this.integrationMethod(queryVO, rObject, masterTaskMap, parallelMap, true);
+    }
+
+    /**
+     * 统合查询方法
+     */
+    private void integrationMethod(TaskQueryVO queryVO, Map<String, Task> masterTaskMap, Map<String, TaskParallel> parallelMap, List<String> parallelProcessInstanceIds, String status) {
+        //先查询符合条件的流程
+        LambdaQueryWrapper<Task> wrapper = Wrappers.<Task>lambdaQuery().eq(Task::getIsDeleted, 0)
+                .eq(Task::getProjectId, queryVO.getProjectId()).eq(StringUtils.isNotBlank(queryVO.getBatch()), Task::getBatch, queryVO.getBatch());
+        this.integrationMethod(wrapper, queryVO);
+
+        //符合条件的集合
+        List<Task> masterTaskList = this.taskService.list(wrapper);
+        //根据主表获取附表且当前用户的记录
+        List<String> processInstanceIds = new ArrayList<>();
+        masterTaskList.forEach(task -> {
+            masterTaskMap.put(task.getProcessInstanceId(), task);
+            processInstanceIds.add(task.getProcessInstanceId());
+        });
+
+        if (processInstanceIds.size() > 0) {
+            List<TaskParallel> parallelTaskList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().in(TaskParallel::getProcessInstanceId, processInstanceIds).eq(TaskParallel::getTaskUser, AuthUtil.getUserId().toString()).eq(TaskParallel::getIsDeleted, 0).in(TaskParallel::getStatus, Arrays.asList(status.split(","))));
+            parallelTaskList.forEach(parallel -> {
+                parallelMap.put(parallel.getParallelProcessInstanceId(), parallel);
+                parallelProcessInstanceIds.add(parallel.getParallelProcessInstanceId());
+            });
+        }
+    }
+
+    private void integrationMethod(LambdaQueryWrapper<Task> wrapper, TaskQueryVO queryVO) {
+        //任务类型
+        if (StringUtils.isNotEmpty(queryVO.getTaskType())) {
+            wrapper.eq(Task::getType, queryVO.getTaskType());
+        }
+        //任务状态
+        if (StringUtils.isNotEmpty(queryVO.getTaskStatus())) {
+            wrapper.eq(Task::getStatus, queryVO.getTaskStatus());
+        }
+        //合同段ID
+        if (StringUtils.isNotEmpty(queryVO.getContractId())) {
+            ContractInfo contractInfo = contractClient.getContractById(Long.valueOf(queryVO.getContractId()));
+            if (contractInfo.getContractType() == 2) {
+                wrapper.eq(Task::getProjectId, queryVO.getProjectId());
+            } else {
+                wrapper.eq(Task::getContractId, queryVO.getContractId());
+            }
+        }
+        //开始结束时间
+        if (StringUtils.isNotEmpty(queryVO.getStartTime()) && StringUtils.isNotEmpty(queryVO.getEndTime())) {
+            wrapper.between(Task::getStartTime, queryVO.getStartTime(), queryVO.getEndTime());
+        }
+        //关键字查询
+        if (StringUtils.isNotEmpty(queryVO.getQueryValue())) {
+            wrapper.like(Task::getTaskName, queryVO.getQueryValue());
+        }
+    }
+
+    /**
+     * 统合处理方法
+     */
+    private R<IPage<TaskVO>> integrationMethod(TaskQueryVO queryVO, R<Object> rObject, Map<String, Task> masterTaskMap, Map<String, TaskParallel> parallelMap, boolean isToDo) {
+        Query query = new Query();
+        query.setCurrent(queryVO.getCurrent());
+        query.setSize(queryVO.getSize());
+        //最终集合
+        List<TaskVO> finalResult = new ArrayList<>();
+        if (rObject.isSuccess()) {
+            //新建一个IPage的实例
+            IPage<BladeFlow> newData = Condition.getPage(query);
+            //使用实例获取具体的类型进行转换
+            IPage flowIPage = JSONObject.parseObject(JSONObject.toJSONString(rObject.getData()), newData.getClass());
+            //本质上这里获取到的集合属于List<JSONObject>,所以需要在这进行一次类型转换,将JSONObject转为BladeFlow
+            List<BladeFlow> result = JSONArray.parseArray(JSONObject.toJSONString(flowIPage.getRecords()), BladeFlow.class);
+
+            if (result != null && result.size() > 0) {
+                //获取相关信息
+                result.forEach(flow -> {
+                    TaskParallel taskParallel = parallelMap.get(flow.getProcessInstanceId());
+                    if (taskParallel != null) {
+                        //查询主表数据
+                        Task task = masterTaskMap.get(taskParallel.getProcessInstanceId());
+
+                        if (task != null) {
+                            //复制数据
+                            TaskVO vo = new TaskVO();
+                            BeanUtils.copyProperties(task, vo);
+                            //设置关键信息
+                            vo.setTypeValue(new Integer("1").equals(vo.getType()) ? "普通任务" : new Integer("2").equals(vo.getType()) ? "验收任务" : "移交任务");
+                            vo.setParallelProcessInstanceId(flow.getProcessInstanceId());
+                            vo.setTaskId(flow.getTaskId());
+                            vo.setTaskStatus(new Integer("1").equals(task.getStatus()) ? "待审批" : new Integer("2").equals(task.getStatus()) ? "已审批" : "已废除", task.getStatus());
+                            vo.setEVisaContent(taskParallel.getEVisaContent());
+                            //获取主流程下所有相关的审批人
+                            List<TaskParallel> linkList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().eq(TaskParallel::getProcessInstanceId, task.getProcessInstanceId()).eq(TaskParallel::getIsDeleted, 0));
+                            if (linkList != null && linkList.size() > 0) {
+                                this.integrationMethod(vo, linkList);
+                            }
+
+                            //设置最终集合
+                            finalResult.add(vo);
+                        }
+                    }
+                });
 
 
 //				//待办的原生方法并没有对数据做分页,所以需要在这里进行手动分页,而已办的原生方法已经做了分页处理
 //				//待办的原生方法并没有对数据做分页,所以需要在这里进行手动分页,而已办的原生方法已经做了分页处理
 //				if(!isToDo){
 //				if(!isToDo){
@@ -545,70 +554,70 @@ public class TaskController extends BladeController {
 //					//最终分页数据
 //					//最终分页数据
 //					return this.getIPageR(query, flowIPage, finalFlowList);
 //					return this.getIPageR(query, flowIPage, finalFlowList);
 //				} else {
 //				} else {
-					//最终分页数据
-					return this.getIPageR(query, flowIPage, finalResult);
+                //最终分页数据
+                return this.getIPageR(query, flowIPage, finalResult);
 //				}
 //				}
-			}
-		}
-		return R.data(null);
-	}
-
-	@NotNull
-	private R<IPage<TaskVO>> getIPageR(Query query, IPage flowIPage, List<TaskVO> finalFlowList) {
-		IPage<TaskVO> finalPage = Condition.getPage(query);
-		finalPage.setTotal(flowIPage.getTotal());
-		finalPage.setSize(query.getSize());
-		finalPage.setCurrent(query.getCurrent());
-		finalPage.setRecords(finalFlowList);
-
-		return R.data(finalPage);
-	}
-
-	/**
-	 * 完成/审批任务
-	 */
-	@PostMapping("/complete-approval-task")
-	@ApiOperationSupport(order = 2)
-	@ApiOperation(value = "完成/审批任务")
-	public R<Boolean> completeApprovalTask(@RequestBody TaskApprovalVO taskApprovalVO) throws FileNotFoundException {
-		//检查当前用户是否存在等待批次
-		//System.out.println(AuthUtil.getUserId());
-		long batchCount = this.taskBatchService.count(Wrappers.<TaskBatch>lambdaQuery().eq(TaskBatch::getCreateUser, AuthUtil.getUserId()));
-
-		if(batchCount > 0){
-			this.taskParallelService.update(Wrappers.<TaskParallel>lambdaUpdate()
-					.set(TaskParallel::getEVisaContent, "当前等待电签的批次较多,请等待几分钟后刷新页面查看........")
-					.eq(TaskParallel::getParallelProcessInstanceId, taskApprovalVO.getParallelProcessInstanceId()));
-
-			//生成等待批次,任务完成后删除
-			List<TaskApprovalVO> taskApprovalVOS = new ArrayList<>();
-			taskApprovalVOS.add(taskApprovalVO);
-
-			//存在批次,当前审批的追加进队列
-			TaskBatch taskBatch = new TaskBatch(taskApprovalVO.getParallelProcessInstanceId(), JSONObject.toJSONString(taskApprovalVOS));
-			taskBatch.setCreateUser(AuthUtil.getUserId());
-			taskBatch.setCreateTime(new Date());
-			this.taskBatchService.save(taskBatch);
-
-			return R.data(true, "当前等待电签的批次较多,请等待几分钟后刷新页面查看........");
-		} else {
-			//生成等待批次,任务完成后删除
-			List<TaskApprovalVO> taskApprovalVOS = new ArrayList<>();
-			taskApprovalVOS.add(taskApprovalVO);
-			this.taskService.batchCompleteApprovalTask(taskApprovalVOS,AuthUtil.getUserId());
-
-			return R.data(true, "提交成功");
-		}
-	}
-
-	/**
-	 * 上报
-	 */
-	@PostMapping("/start-approval")
-	@ApiOperationSupport(order = 1)
-	@ApiOperation(value = "上报", notes = "taskVO对象")
-	public R<Boolean> startApproval(@RequestBody TaskVO taskVO){
-		return this.taskService.startApproval(taskVO) ? R.data(200, true, "操作成功") : R.data(200, false, "操作失败,请联系管理员");
-	}
+            }
+        }
+        return R.data(null);
+    }
+
+    @NotNull
+    private R<IPage<TaskVO>> getIPageR(Query query, IPage flowIPage, List<TaskVO> finalFlowList) {
+        IPage<TaskVO> finalPage = Condition.getPage(query);
+        finalPage.setTotal(flowIPage.getTotal());
+        finalPage.setSize(query.getSize());
+        finalPage.setCurrent(query.getCurrent());
+        finalPage.setRecords(finalFlowList);
+
+        return R.data(finalPage);
+    }
+
+    /**
+     * 完成/审批任务
+     */
+    @PostMapping("/complete-approval-task")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "完成/审批任务")
+    public R<Boolean> completeApprovalTask(@RequestBody TaskApprovalVO taskApprovalVO) throws FileNotFoundException {
+        //检查当前用户是否存在等待批次
+        //System.out.println(AuthUtil.getUserId());
+        long batchCount = this.taskBatchService.count(Wrappers.<TaskBatch>lambdaQuery().eq(TaskBatch::getCreateUser, AuthUtil.getUserId()));
+
+        if (batchCount > 0) {
+            this.taskParallelService.update(Wrappers.<TaskParallel>lambdaUpdate()
+                    .set(TaskParallel::getEVisaContent, "当前等待电签的批次较多,请等待几分钟后刷新页面查看........")
+                    .eq(TaskParallel::getParallelProcessInstanceId, taskApprovalVO.getParallelProcessInstanceId()));
+
+            //生成等待批次,任务完成后删除
+            List<TaskApprovalVO> taskApprovalVOS = new ArrayList<>();
+            taskApprovalVOS.add(taskApprovalVO);
+
+            //存在批次,当前审批的追加进队列
+            TaskBatch taskBatch = new TaskBatch(taskApprovalVO.getParallelProcessInstanceId(), JSONObject.toJSONString(taskApprovalVOS));
+            taskBatch.setCreateUser(AuthUtil.getUserId());
+            taskBatch.setCreateTime(new Date());
+            this.taskBatchService.save(taskBatch);
+
+            return R.data(true, "当前等待电签的批次较多,请等待几分钟后刷新页面查看........");
+        } else {
+            //生成等待批次,任务完成后删除
+            List<TaskApprovalVO> taskApprovalVOS = new ArrayList<>();
+            taskApprovalVOS.add(taskApprovalVO);
+            this.taskService.batchCompleteApprovalTask(taskApprovalVOS, AuthUtil.getUserId());
+
+            return R.data(true, "提交成功");
+        }
+    }
+
+    /**
+     * 上报
+     */
+    @PostMapping("/start-approval")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "上报", notes = "taskVO对象")
+    public R<Boolean> startApproval(@RequestBody TaskVO taskVO) {
+        return this.taskService.startApproval(taskVO) ? R.data(200, true, "操作成功") : R.data(200, false, "操作失败,请联系管理员");
+    }
 
 
 }
 }

+ 24 - 6
blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java

@@ -28,6 +28,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.manager.entity.TrialSelfDataRecord;
 import org.springblade.manager.entity.TrialSelfDataRecord;
+import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.feign.WbsTreePrivateClient;
 import org.springblade.manager.feign.WbsTreePrivateClient;
 import org.springblade.manager.vo.TableFileVO;
 import org.springblade.manager.vo.TableFileVO;
 import org.springblade.manager.vo.WbsTreePrivateVO;
 import org.springblade.manager.vo.WbsTreePrivateVO;
@@ -44,6 +45,8 @@ import java.io.FileNotFoundException;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 
 
 
 @RestController
 @RestController
@@ -178,16 +181,31 @@ public class TrialDetectionController extends BladeController {
 
 
     @GetMapping("/self/show-buss-tab")
     @GetMapping("/self/show-buss-tab")
     @ApiOperationSupport(order = 14)
     @ApiOperationSupport(order = 14)
-    @ApiOperation(value = "自检隐藏表单", notes = "传入节点pKeyId,状态status(1显示 2隐藏)")
-    public R<Object> showBussTab(@RequestParam Long pKeyId, @RequestParam Integer status) {
-        return R.status(wbsTreePrivateClient.showBussTab(pKeyId, status));
+    @ApiOperation(value = "自检隐藏表单", notes = "传入试验记录id,传入节点pKeyId,状态status(1显示 2隐藏)")
+    public R<Object> showBussTab(@RequestParam Long id, @RequestParam Long pKeyId, @RequestParam Integer status) {
+        if (ObjectUtils.isNotEmpty(id)) {
+            //编辑,修改试验记录与按钮关系信息
+            jdbcTemplate.execute("update u_trial_self_data_record set is_buss_show = " + status + " where record_id = " + id + " and tab_id = " + pKeyId);
+
+            //获取当前试验记录信息中表的按钮状态
+            String sql = "select tab_id,is_buss_show,is_tab_pdf,is_tab_file_type from u_trial_self_data_record where record_id = " + id + " and tab_id = " + pKeyId;
+            List<TrialSelfDataRecord> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialSelfDataRecord.class));
+            if (query.size() == 0) {
+                //如果编辑时,该表单没有在新增时就关联按钮记录信息,那么就修改该表单在项目wbs节点按钮状态
+                jdbcTemplate.execute("update m_wbs_tree_private set is_buss_show = " + status + " where p_key_id = " + pKeyId);
+            }
+        } else {
+            //新增,修改项目wbs节点按钮状态(通用)
+            jdbcTemplate.execute("update m_wbs_tree_private set is_buss_show = " + status + " where p_key_id = " + pKeyId);
+        }
+        return R.status(true);
     }
     }
 
 
     @GetMapping("/self/copy-buss-tab")
     @GetMapping("/self/copy-buss-tab")
     @ApiOperationSupport(order = 15)
     @ApiOperationSupport(order = 15)
-    @ApiOperation(value = "自检表单复制", notes = "传入节点pKeyId")
-    public R<Object> copyBussTab(@RequestParam Long pKeyId) {
-        return R.status(wbsTreePrivateClient.copyBussTab(pKeyId));
+    @ApiOperation(value = "自检表单复制", notes = "传入节点pKeyId,当前记录id")
+    public R<Object> copyBussTab(@RequestParam Long pKeyId, @RequestParam Long id) {
+        return R.status(wbsTreePrivateClient.copyBussTab(pKeyId, id));
     }
     }
 
 
     @PostMapping("/self/remove-buss-tabInfo")
     @PostMapping("/self/remove-buss-tabInfo")

+ 4 - 4
blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialSelfInspectionRecordService.java

@@ -27,14 +27,15 @@ public interface ITrialSelfInspectionRecordService extends BaseService<TrialSelf
 
 
     List<TrialSelfInspectionRecordVO2> getRawMaterialInfo(String nodeId, String contractId, String id);
     List<TrialSelfInspectionRecordVO2> getRawMaterialInfo(String nodeId, String contractId, String id);
 
 
-    boolean rawMaterialSubmitRelation(RawMaterialSubmitRelationDTO dto, TrialSelfInspectionRecord obj) throws FileNotFoundException;
-
     String selfPrintPdf(String ids) throws FileNotFoundException;
     String selfPrintPdf(String ids) throws FileNotFoundException;
 
 
     String selfPrintNullPdf(String ids) throws Exception;
     String selfPrintNullPdf(String ids) throws Exception;
 
 
     @Async
     @Async
-    void updateTrialSelfInspectionRecordStatus(String pdfUrlEVisa, List<TaskApprovalVO> obj) throws FileNotFoundException;
+    void updateTrialSelfInspectionRecordStatus(String pdfUrlEVisa, TaskApprovalVO obj) throws FileNotFoundException;
+
+    @Async
+    void updateTrialSelfInspectionRecordStatusFC(TaskApprovalVO obj);
 
 
     String addBussFile(MultipartFile file, Long pkeyId, String nodeId, String contractId, String projectId, String classify, String id, String tableType) throws Exception;
     String addBussFile(MultipartFile file, Long pkeyId, String nodeId, String contractId, String projectId, String classify, String id, String tableType) throws Exception;
 
 
@@ -42,6 +43,5 @@ public interface ITrialSelfInspectionRecordService extends BaseService<TrialSelf
 
 
     boolean fileSubmit(TrialFileSubmitDTO dto) throws FileNotFoundException;
     boolean fileSubmit(TrialFileSubmitDTO dto) throws FileNotFoundException;
 
 
-    boolean recordSampleSubmit(RecordSampleSubmitDTO dto);
 
 
 }
 }

+ 9 - 3
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -450,10 +450,16 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             for (TaskApprovalVO taskApprovalVO : taskApprovalVOS) {
             for (TaskApprovalVO taskApprovalVO : taskApprovalVOS) {
                 String pdfUrlEVisa = this.completeApprovalTask(taskApprovalVO);
                 String pdfUrlEVisa = this.completeApprovalTask(taskApprovalVO);
 
 
-                //TODO ============== 电签成功,修改试验状态,关联工程部位信息pdf(只有电签成功,才修改) ==============
-                if (StringUtils.isNotEmpty(pdfUrlEVisa)){
-                    this.iTrialSelfInspectionRecordService.updateTrialSelfInspectionRecordStatus(pdfUrlEVisa, taskApprovalVOS);
+                //TODO ============== 电签成功,修改试验状态,关联工程部位信息pdf(只有电签成功,才修改) liuYc 2023-03-16 ==============
+                if ("OK".equals(taskApprovalVO.getFlag()) && StringUtils.isNotEmpty(pdfUrlEVisa)) {
+                    //已审批
+                    this.iTrialSelfInspectionRecordService.updateTrialSelfInspectionRecordStatus(pdfUrlEVisa, taskApprovalVO);
                 }
                 }
+                if (!"OK".equals(taskApprovalVO.getFlag())) {
+                    //已废除
+                    this.iTrialSelfInspectionRecordService.updateTrialSelfInspectionRecordStatusFC(taskApprovalVO);
+                }
+
             }
             }
             //删除掉对应批次
             //删除掉对应批次
             this.taskBatchService.deletedById(batchId);
             this.taskBatchService.deletedById(batchId);

+ 3 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDeviceUseServiceImpl.java

@@ -38,6 +38,7 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.resource.feign.NewIOSSClient;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
@@ -72,7 +73,7 @@ public class TrialDeviceUseServiceImpl extends BaseServiceImpl<TrialDeviceUseMap
             dto.setFactoryNumber(trialDeviceInfo.getFactoryNumber());
             dto.setFactoryNumber(trialDeviceInfo.getFactoryNumber());
         }
         }
         TrialDeviceUse trialDeviceUse = BeanUtil.copyProperties(dto, TrialDeviceUse.class);
         TrialDeviceUse trialDeviceUse = BeanUtil.copyProperties(dto, TrialDeviceUse.class);
-        if (trialDeviceUse != null){
+        if (trialDeviceUse != null) {
             return this.saveOrUpdate(trialDeviceUse);
             return this.saveOrUpdate(trialDeviceUse);
         }
         }
         return false;
         return false;
@@ -309,6 +310,7 @@ public class TrialDeviceUseServiceImpl extends BaseServiceImpl<TrialDeviceUseMap
         return this.saveBatch(listData, 1000);
         return this.saveBatch(listData, 1000);
     }
     }
 
 
+    @Async
     public void addDeviceUseInfo(TrialSelfInspectionRecordDTO dto) {
     public void addDeviceUseInfo(TrialSelfInspectionRecordDTO dto) {
         if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotEmpty(dto.getDeviceUseIds())) {
         if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotEmpty(dto.getDeviceUseIds())) {
             //获取进场记录
             //获取进场记录

+ 311 - 245
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.spire.xls.*;
 import com.spire.xls.*;
+import io.swagger.models.auth.In;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.time.DateUtils;
 import org.apache.commons.lang.time.DateUtils;
 import org.springblade.business.dto.*;
 import org.springblade.business.dto.*;
@@ -58,9 +59,7 @@ import java.util.stream.Collectors;
 
 
 @Service
 @Service
 @AllArgsConstructor
 @AllArgsConstructor
-public class TrialSelfInspectionRecordServiceImpl
-        extends BaseServiceImpl<TrialSelfInspectionRecordMapper, TrialSelfInspectionRecord>
-        implements ITrialSelfInspectionRecordService {
+public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialSelfInspectionRecordMapper, TrialSelfInspectionRecord> implements ITrialSelfInspectionRecordService {
 
 
     private final TrialSampleInfoMapper trialSampleInfoMapper;
     private final TrialSampleInfoMapper trialSampleInfoMapper;
     private final TrialMaterialMobilizationMapper trialMaterialMobilizationMapper;
     private final TrialMaterialMobilizationMapper trialMaterialMobilizationMapper;
@@ -80,70 +79,109 @@ public class TrialSelfInspectionRecordServiceImpl
 
 
     @Override
     @Override
     public IPage<TrialSelfInspectionRecordVO> selfPage(IPage<TrialSelfInspectionRecord> page, TrialSelfInspectionRecordPageDTO dto) throws FileNotFoundException {
     public IPage<TrialSelfInspectionRecordVO> selfPage(IPage<TrialSelfInspectionRecord> page, TrialSelfInspectionRecordPageDTO dto) throws FileNotFoundException {
-        QueryWrapper<TrialSelfInspectionRecord> queryWrapper = Condition.getQueryWrapper(dto);
-        if (StringUtils.isNotEmpty(dto.getQueryValue())) {
-            queryWrapper.lambda().like(TrialSelfInspectionRecord::getTrialProjectName, dto.getQueryValue());
-        }
-        if (org.apache.commons.lang.StringUtils.isNotEmpty(dto.getStartTime()) && org.apache.commons.lang.StringUtils.isNotEmpty(dto.getEndTime())) {
-            String endTime = dto.getEndTime();
-            endTime = DateUtil.format(DateUtils.addDays(DateUtil.parse(endTime, "yyyy-MM-dd"), 1), "yyyy-MM-dd");
-            queryWrapper.lambda().between(TrialSelfInspectionRecord::getReportDate, dto.getStartTime(), endTime);
-        }
-        if (org.apache.commons.lang.StringUtils.isNotEmpty(dto.getQueryName())) {
-            queryWrapper.lambda().like(TrialSelfInspectionRecord::getTrialUserName, dto.getQueryName());
-        }
-        if (org.apache.commons.lang.StringUtils.isNotEmpty(dto.getQueryStatus())) {
-            queryWrapper.lambda().eq(TrialSelfInspectionRecord::getDetectionResult, dto.getQueryStatus());
-        }
-        IPage<TrialSelfInspectionRecord> pages = this.page(page, queryWrapper.lambda().orderByDesc(true, TrialSelfInspectionRecord::getCreateTime));
-        IPage<TrialSelfInspectionRecordVO> trialSelfInspectionRecordVOIPage = TrialSelfInspectionRecordWarpper.build().pageVO(pages);
-        List<TrialSelfInspectionRecordVO> records = trialSelfInspectionRecordVOIPage.getRecords();
-        Map<String, Dict> map = iDictClient.getList("trial_detection_category").getData().stream().collect(Collectors.toMap(Dict::getDictKey, Function.identity()));
+        //获取当前选择节点所有的子级节点pKeyIds
+        WbsTreePrivate selectedNode = jdbcTemplate.query("select id,project_id from m_wbs_tree_private where p_key_id = " + dto.getNodeId(), new BeanPropertyRowMapper<>(WbsTreePrivate.class)).stream().findAny().orElse(null);
+        if (selectedNode != null) {
+            List<WbsTreePrivate> ziNodePKeyIds = jdbcTemplate.query("select p_key_id from m_wbs_tree_private where type = 1 and is_deleted = 0 and project_id = " + selectedNode.getProjectId() + " and find_in_set('" + selectedNode.getId() + "',ancestors)", new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+            QueryWrapper<TrialSelfInspectionRecord> queryWrapper = Condition.getQueryWrapper(dto);
+            if (ziNodePKeyIds.size() > 0) {
+                dto.setNodeId(null);
+                List<Long> pIds = ziNodePKeyIds.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
+                queryWrapper.lambda().in(TrialSelfInspectionRecord::getNodeId, pIds);
+            }
+            if (StringUtils.isNotEmpty(dto.getQueryValue())) {
+                queryWrapper.lambda().like(TrialSelfInspectionRecord::getTrialProjectName, dto.getQueryValue());
+            }
+            if (org.apache.commons.lang.StringUtils.isNotEmpty(dto.getStartTime()) && org.apache.commons.lang.StringUtils.isNotEmpty(dto.getEndTime())) {
+                String endTime = dto.getEndTime();
+                endTime = DateUtil.format(DateUtils.addDays(DateUtil.parse(endTime, "yyyy-MM-dd"), 1), "yyyy-MM-dd");
+                queryWrapper.lambda().between(TrialSelfInspectionRecord::getReportDate, dto.getStartTime(), endTime);
+            }
+            if (org.apache.commons.lang.StringUtils.isNotEmpty(dto.getQueryName())) {
+                queryWrapper.lambda().like(TrialSelfInspectionRecord::getTrialUserName, dto.getQueryName());
+            }
+            if (org.apache.commons.lang.StringUtils.isNotEmpty(dto.getQueryStatus())) {
+                queryWrapper.lambda().eq(TrialSelfInspectionRecord::getDetectionResult, dto.getQueryStatus());
+            }
 
 
-        for (TrialSelfInspectionRecordVO record : records) {
-            record.setIsUploadCertificateName((new Integer(1)).equals(record.getIsUploadCertificate()) ? "是" : "否");
-            record.setDetectionResultName((new Integer(1)).equals(record.getDetectionResult()) ? "合格" : "不合格");
+            IPage<TrialSelfInspectionRecord> pages = this.page(page, queryWrapper.lambda().orderByDesc(true, TrialSelfInspectionRecord::getCreateTime));
+            IPage<TrialSelfInspectionRecordVO> trialSelfInspectionRecordVOIPage = TrialSelfInspectionRecordWarpper.build().pageVO(pages);
+            List<TrialSelfInspectionRecordVO> records = trialSelfInspectionRecordVOIPage.getRecords();
+            Map<String, Dict> map = iDictClient.getList("trial_detection_category").getData().stream().collect(Collectors.toMap(Dict::getDictKey, Function.identity()));
 
 
-            if (ObjectUtils.isNotEmpty(record.getDetectionCategory())) {
-                Dict dict = map.get(String.valueOf(record.getDetectionCategory()));
-                if (dict != null) {
-                    record.setDetectionCategoryName(dict.getDictValue());
+            for (TrialSelfInspectionRecordVO record : records) {
+                record.setDetectionResultName((new Integer(1)).equals(record.getDetectionResult()) ? "合格" : "");
+                if (StringUtils.isNotEmpty(record.getDetectionResultName())) {
+                    record.setDetectionResult(1);
+                } else {
+                    record.setDetectionResult(0);
+                }
+
+                if (ObjectUtils.isNotEmpty(record.getDetectionCategory())) {
+                    Dict dict = map.get(String.valueOf(record.getDetectionCategory()));
+                    if (dict != null) {
+                        record.setDetectionCategoryName(dict.getDictValue());
+                    }
+                }
+
+                //工程部位及用途名称
+                if (ObjectUtil.isNotEmpty(record.getProjectPosition())) {
+                    List<String> ids = Func.toStrList(record.getProjectPosition()); //关联的工程部位ids
+                    List<WbsTreeContract> result = baseMapper.selectWbsTreeContractListByPKeyIds(ids); //查询工程部位节点名称信息
+                    List<String> projectPositionNames = result.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList());
+                    String name = projectPositionNames.stream().findAny().orElse(null);
+                    if (projectPositionNames.size() > 1) {
+                        record.setProjectPositionName(name + "等" + projectPositionNames.size() + "个工程部位信息");
+                    } else {
+                        record.setProjectPositionName(name);
+                    }
                 }
                 }
-            }
 
 
-            //工程部位及用途名称
-            if (ObjectUtil.isNotEmpty(record.getProjectPosition())) {
-                List<String> ids = Func.toStrList(record.getProjectPosition()); //关联的工程部位ids
-                List<WbsTreeContract> result = baseMapper.selectWbsTreeContractListByPKeyIds(ids); //查询工程部位节点名称信息
-                List<String> projectPositionNames = result.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList());
-                String name = projectPositionNames.stream().findAny().orElse(null);
-                if (projectPositionNames.size() > 1) {
-                    record.setProjectPositionName(name + "等" + projectPositionNames.size() + "个工程部位信息");
+                //关联取样ids
+                String sql = "select sampling_id from u_trial_self_sample where self_id = " + record.getId();
+                List<Long> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialSelfSample.class)).stream().map(TrialSelfSample::getSamplingId).collect(Collectors.toList());
+                if (query.size() > 0) {
+                    record.setSampleIds(org.apache.commons.lang.StringUtils.join(query, ","));
+                    this.getIsUploadCertificateStatus(record.getSampleIds(), record);
                 } else {
                 } else {
-                    record.setProjectPositionName(name);
+                    record.setIsUploadCertificate(-1);
+                    record.setIsUploadCertificateName(""); //没关联材料显示null
                 }
                 }
-            }
 
 
-            //关联取样ids
-            String sql = "select sampling_id from u_trial_self_sample where self_id = " + record.getId();
-            List<Long> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialSelfSample.class)).stream().map(TrialSelfSample::getSamplingId).collect(Collectors.toList());
-            if (query.size() > 0) {
-                record.setSampleIds(org.apache.commons.lang.StringUtils.join(query, ","));
-            }
+                //原材料检测报告ids
+                String sql1 = "select raw_material_record_id,old_pdf_url from u_trial_raw_material_self_record where self_record_id = " + record.getId();
+                List<TrialRawMaterialSelfRecord> query1 = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(TrialRawMaterialSelfRecord.class));
+                if (query1.size() > 0) {
+                    List<Long> ids = query1.stream().map(TrialRawMaterialSelfRecord::getRawMaterialRecordId).collect(Collectors.toList());
+                    record.setRawMaterialIds(org.apache.commons.lang.StringUtils.join(ids, ","));
+                }
 
 
-            //原材料检测报告ids
-            String sql1 = "select raw_material_record_id,old_pdf_url from u_trial_raw_material_self_record where self_record_id = " + record.getId();
-            List<TrialRawMaterialSelfRecord> query1 = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(TrialRawMaterialSelfRecord.class));
-            if (query1.size() > 0) {
-                List<Long> ids = query1.stream().map(TrialRawMaterialSelfRecord::getRawMaterialRecordId).collect(Collectors.toList());
-                record.setRawMaterialIds(org.apache.commons.lang.StringUtils.join(ids, ","));
+                //合并的pdfUrl
+                String pdf = this.getMergePdfToTrial(record.getContractId(), record.getId());
+                record.setPdfUrl(pdf);
             }
             }
 
 
-            //合并的pdfUrl
-            String pdf = this.getMergePdfToTrial(record.getContractId(), record.getId());
-            record.setPdfUrl(pdf);
+            return trialSelfInspectionRecordVOIPage.setRecords(records);
         }
         }
-        return trialSelfInspectionRecordVOIPage.setRecords(records);
+        return null;
+    }
+
+    private void getIsUploadCertificateStatus(String sampleIds, TrialSelfInspectionRecordVO record) {
+        List<TrialSamplingRecord> mobilizationIds = jdbcTemplate.query("select mobilization_id from u_trial_sampling_record where sample_info_id in(" + sampleIds + ")", new BeanPropertyRowMapper<>(TrialSamplingRecord.class));
+        if (mobilizationIds.size() > 0) {
+            List<Long> collect = mobilizationIds.stream().map(TrialSamplingRecord::getMobilizationId).collect(Collectors.toList());
+            String join = org.apache.commons.lang.StringUtils.join(collect, ",");
+            List<TrialMaterialMobilization> mobilizations = jdbcTemplate.query("select production_certificate from u_trial_material_mobilization where id in(" + join + ")", new BeanPropertyRowMapper<>(TrialMaterialMobilization.class));
+            List<TrialMaterialMobilization> notUpdate = mobilizations.stream().filter(f -> ObjectUtils.isEmpty(f.getProductionCertificate())).collect(Collectors.toList());
+            if (notUpdate.size() != 0) {
+                record.setIsUploadCertificate(1);
+                record.setIsUploadCertificateName("是");
+            } else {
+                record.setIsUploadCertificate(0);
+                record.setIsUploadCertificateName("否");
+            }
+        }
+
     }
     }
 
 
     private String getMergePdfToTrial(Long contractId, Long nodeId) throws FileNotFoundException {
     private String getMergePdfToTrial(Long contractId, Long nodeId) throws FileNotFoundException {
@@ -223,12 +261,20 @@ public class TrialSelfInspectionRecordServiceImpl
             for (Attach attach : query) {
             for (Attach attach : query) {
                 if (StringUtils.isNotEmpty(sampleAncillaryDocumentsVO.getOtherAccessories()) && sampleAncillaryDocumentsVO.getOtherAccessories().equals(attach.getLink())) {
                 if (StringUtils.isNotEmpty(sampleAncillaryDocumentsVO.getOtherAccessories()) && sampleAncillaryDocumentsVO.getOtherAccessories().equals(attach.getLink())) {
                     sampleAncillaryDocumentsVO.setOtherAccessoriesName(attach.getOriginalName());
                     sampleAncillaryDocumentsVO.setOtherAccessoriesName(attach.getOriginalName());
+                } else if (StringUtils.isNotEmpty(sampleAncillaryDocumentsVO.getOtherAccessories()) && !sampleAncillaryDocumentsVO.getOtherAccessories().equals(attach.getLink())) {
+                    sampleAncillaryDocumentsVO.setOtherAccessoriesName(sampleAncillaryDocumentsVO.getOtherAccessories());
                 }
                 }
+
                 if (StringUtils.isNotEmpty(sampleAncillaryDocumentsVO.getProductionCertificate()) && sampleAncillaryDocumentsVO.getProductionCertificate().equals(attach.getLink())) {
                 if (StringUtils.isNotEmpty(sampleAncillaryDocumentsVO.getProductionCertificate()) && sampleAncillaryDocumentsVO.getProductionCertificate().equals(attach.getLink())) {
                     sampleAncillaryDocumentsVO.setProductionCertificateName(attach.getOriginalName());
                     sampleAncillaryDocumentsVO.setProductionCertificateName(attach.getOriginalName());
+                } else if (StringUtils.isNotEmpty(sampleAncillaryDocumentsVO.getProductionCertificate()) && !sampleAncillaryDocumentsVO.getProductionCertificate().equals(attach.getLink())) {
+                    sampleAncillaryDocumentsVO.setProductionCertificateName(sampleAncillaryDocumentsVO.getProductionCertificate());
                 }
                 }
+
                 if (StringUtils.isNotEmpty(sampleAncillaryDocumentsVO.getQualityInspectionReport()) && sampleAncillaryDocumentsVO.getQualityInspectionReport().equals(attach.getLink())) {
                 if (StringUtils.isNotEmpty(sampleAncillaryDocumentsVO.getQualityInspectionReport()) && sampleAncillaryDocumentsVO.getQualityInspectionReport().equals(attach.getLink())) {
                     sampleAncillaryDocumentsVO.setQualityInspectionReportName(attach.getOriginalName());
                     sampleAncillaryDocumentsVO.setQualityInspectionReportName(attach.getOriginalName());
+                } else if (StringUtils.isNotEmpty(sampleAncillaryDocumentsVO.getQualityInspectionReport()) && !sampleAncillaryDocumentsVO.getQualityInspectionReport().equals(attach.getLink())) {
+                    sampleAncillaryDocumentsVO.setQualityInspectionReportName(sampleAncillaryDocumentsVO.getQualityInspectionReport());
                 }
                 }
             }
             }
         }
         }
@@ -345,69 +391,6 @@ public class TrialSelfInspectionRecordServiceImpl
         return recordVO2s;
         return recordVO2s;
     }
     }
 
 
-    @Override
-    @Async
-    public boolean rawMaterialSubmitRelation(RawMaterialSubmitRelationDTO dto, TrialSelfInspectionRecord obj) throws
-            FileNotFoundException {
-        if (ObjectUtil.isEmpty(dto.getId())) {
-            throw new ServiceException("请先保存填报数据后,再关联原材检测报告信息");
-        } else {
-            if (ObjectUtil.isNotEmpty(obj) && (("已审批").equals(obj.getTaskStatus()) || ("待审批").equals(obj.getTaskStatus()))) {
-                throw new ServiceException("当前填报数据已上报,无法进行关联操作");
-            }
-
-            //新增或编辑
-            if (StringUtils.isNotEmpty(dto.getIds())) {
-                //当前关联的原材料记录id
-                List<String> ids = Func.toStrList(dto.getIds());
-
-                //获取原材料的pdf
-                List<TrialSelfInspectionRecord> recordList = baseMapper.selectList(Wrappers.<TrialSelfInspectionRecord>lambdaQuery()
-                        .select(TrialSelfInspectionRecord::getPdfUrl, TrialSelfInspectionRecord::getId)
-                        .in(TrialSelfInspectionRecord::getId, ids).eq(TrialSelfInspectionRecord::getStatus, 1));
-                List<TrialSelfInspectionRecord> recordObjList = recordList.stream().filter(f -> !f.getId().equals(Long.parseLong(dto.getId()))).collect(Collectors.toList());
-                List<String> pdfUrlAll = new ArrayList<>();
-                if (recordObjList.size() > 0) {
-                    pdfUrlAll.addAll(recordObjList.stream().filter(f -> StringUtils.isNotEmpty(f.getPdfUrl())).map(TrialSelfInspectionRecord::getPdfUrl).collect(Collectors.toList()));
-                }
-
-                if (pdfUrlAll.size() > 0) {
-                    String filePath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-                    String listPdf = filePath + "/pdf/" + dto.getNodeId() + ".pdf";
-                    File tabPDF = ResourceUtil.getFile(listPdf);
-                    if (tabPDF.exists()) {
-                        tabPDF.delete();
-                    }
-                    FileUtils.mergePdfPublicMethods(pdfUrlAll, listPdf);
-                    BladeFile bladeFile = this.newIOSSClient.uploadFile(dto.getNodeId() + ".pdf", listPdf);
-
-                    //删除记录关系
-                    String sql1 = "delete from u_trial_raw_material_self_record where self_record_id ='" + dto.getId() + "'";
-                    jdbcTemplate.execute(sql1);
-                    //新增记录关系
-                    for (String recordId : ids) {
-                        if (!recordId.equals(dto.getId())) {
-                            String sql2 = "insert into u_trial_raw_material_self_record(id,self_record_id,raw_material_record_id,old_pdf_url) values(" + SnowFlakeUtil.getId() + "," + dto.getId() + "," + recordId + ",'" + bladeFile.getLink() + "')";
-                            jdbcTemplate.execute(sql2);
-                        }
-                    }
-                    return true;
-                }
-
-            } else {
-                //删除全部
-                String sql = "select id from u_trial_raw_material_self_record where self_record_id =" + dto.getId();
-                List<TrialRawMaterialSelfRecord> recordList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialRawMaterialSelfRecord.class));
-                if (recordList.size() > 0) {
-                    String sql1 = "delete from u_trial_raw_material_self_record where self_record_id ='" + dto.getId() + "'";
-                    jdbcTemplate.execute(sql1);
-                }
-                return true;
-            }
-        }
-        return false;
-    }
-
     @Override
     @Override
     public String selfPrintPdf(String ids) throws FileNotFoundException {
     public String selfPrintPdf(String ids) throws FileNotFoundException {
         List<TrialSelfInspectionRecord> recordList = baseMapper.selectList(Wrappers.<TrialSelfInspectionRecord>lambdaQuery().in(TrialSelfInspectionRecord::getId, Func.toLongList(ids)).eq(TrialSelfInspectionRecord::getStatus, 1));
         List<TrialSelfInspectionRecord> recordList = baseMapper.selectList(Wrappers.<TrialSelfInspectionRecord>lambdaQuery().in(TrialSelfInspectionRecord::getId, Func.toLongList(ids)).eq(TrialSelfInspectionRecord::getStatus, 1));
@@ -469,63 +452,62 @@ public class TrialSelfInspectionRecordServiceImpl
 
 
     @Override
     @Override
     @Async
     @Async
-    public void updateTrialSelfInspectionRecordStatus(String pdfUrlEVisa, List<TaskApprovalVO> obj) throws FileNotFoundException {
-        for (TaskApprovalVO taskApprovalVO : obj) {
-            if (ObjectUtil.isNotEmpty(taskApprovalVO.getParallelProcessInstanceId())) {
-                String sql = "select process_instance_id from u_task_parallel where parallel_process_instance_id = '" + taskApprovalVO.getParallelProcessInstanceId() + "'";
-                TaskParallel taskParallel = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TaskParallel.class)).stream().findAny().orElse(null);
-                if (taskParallel != null && ObjectUtil.isNotEmpty(taskParallel.getProcessInstanceId())) {
-                    String trialSelfInspectionRecordId = baseMapper.selectTaskByTaskId(taskParallel.getProcessInstanceId());
-                    if (StringUtils.isNotEmpty(trialSelfInspectionRecordId)) {
-                        this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate()
-                                .set(TrialSelfInspectionRecord::getTaskStatus, "OK".equals(taskApprovalVO.getFlag()) ? "已审批" : "已废除")
-                                .set(TrialSelfInspectionRecord::getPdfUrl, pdfUrlEVisa) //pdfUrlEVisa=电签后的pdf
-                                .eq(TrialSelfInspectionRecord::getId, trialSelfInspectionRecordId)
-                        );
-
-                        TrialSelfInspectionRecord record = baseMapper.selectById(trialSelfInspectionRecordId);
-                        if (("已审批").equals(record.getTaskStatus()) && (new Integer(1)).equals(record.getDetectionResult()) && (new Integer(1)).equals(record.getDetectionCategory())) {
-                            /**
-                             * 在资料填报工序-预览全部pdf时再拼接合并显示,当前只做储存(如果当前资料填报工序节点有其他多个试验记录pdf关联信息,那么合并存储,否则直接存储)
-                             */
-                            if (StringUtils.isNotEmpty(record.getProjectPosition())) {
-                                //有pdf的节点
-                                String sqlNodeAll = "select wbs_id from u_information_query where wbs_id in(" + record.getProjectPosition() + ") and contract_id = " + record.getContractId();
-                                List<Long> collect = jdbcTemplate.query(sqlNodeAll, new BeanPropertyRowMapper<>(InformationQuery.class)).stream().map(InformationQuery::getWbsId).collect(Collectors.toList());
-                                if (collect.size() > 0) {
-                                    //删除当前记录关联记录
-                                    baseMapper.delSelfQuality(record.getId());
-                                    for (Long pKeyId : collect) {
-                                        //新增当前记录关联信息
-                                        baseMapper.saveSelfQuality(SnowFlakeUtil.getId(), record.getId(), pKeyId);
-
-                                        //获取当前工程部位节点最新的关联试验记录ids
-                                        List<String> trialRecordIds = baseMapper.selectTrialIdByNodeId(pKeyId);
-
-                                        //如果当前工程部位节点的关联试验记录id只有一条,且等于当前关联试验记录id,那么不合并,直接存储该条试验记录的pdf
-                                        if (trialRecordIds.size() == 1 && trialRecordIds.get(0).equals(record.getId().toString())) {
-                                            //修改当前试验pdf到质检树节点的pdf_trial_url_position上存储
-                                            baseMapper.updateInformationQuery(pKeyId, record.getContractId(), record.getPdfUrl());
-                                            continue;
-                                        }
-
-                                        //如果当前工程部位节点的关联试验记录id有多条,那么合并
-                                        List<TrialSelfInspectionRecord> pdfUrlList = baseMapper.selectList(Wrappers.<TrialSelfInspectionRecord>lambdaQuery().select(TrialSelfInspectionRecord::getPdfUrl).in(TrialSelfInspectionRecord::getId, trialRecordIds));
-                                        List<String> pdfS = pdfUrlList.stream().filter(f -> StringUtils.isNotEmpty(f.getPdfUrl())).map(TrialSelfInspectionRecord::getPdfUrl).collect(Collectors.toList());
-
-                                        String filePath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-                                        String listPdf = filePath + "/pdf/" + pKeyId + ".pdf";
-                                        File tabPDF = ResourceUtil.getFile(listPdf);
-                                        if (tabPDF.exists()) {
-                                            tabPDF.delete();
-                                        }
-
-                                        FileUtils.mergePdfPublicMethods(pdfS, listPdf);
-                                        BladeFile bladeFile = this.newIOSSClient.uploadFile(pKeyId + ".pdf", listPdf);
-                                        if (bladeFile != null) {
-                                            //修改合并的试验pdf到质检树节点的pdf_trial_url_position上存储
-                                            baseMapper.updateInformationQuery(pKeyId, record.getContractId(), bladeFile.getLink());
-                                        }
+    public void updateTrialSelfInspectionRecordStatus(String pdfUrlEVisa, TaskApprovalVO obj) throws FileNotFoundException {
+        if (ObjectUtil.isNotEmpty(obj.getParallelProcessInstanceId())) {
+            String sql = "select process_instance_id from u_task_parallel where parallel_process_instance_id = '" + obj.getParallelProcessInstanceId() + "'";
+            TaskParallel taskParallel = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TaskParallel.class)).stream().findAny().orElse(null);
+            if (taskParallel != null && ObjectUtil.isNotEmpty(taskParallel.getProcessInstanceId())) {
+                String trialSelfInspectionRecordId = baseMapper.selectTaskByTaskId(taskParallel.getProcessInstanceId());
+                if (StringUtils.isNotEmpty(trialSelfInspectionRecordId)) {
+                    this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate()
+                            .set(TrialSelfInspectionRecord::getTaskStatus, "已审批")
+                            .set(TrialSelfInspectionRecord::getPdfUrl, pdfUrlEVisa) //pdfUrlEVisa=电签后的pdf
+                            .eq(TrialSelfInspectionRecord::getId, trialSelfInspectionRecordId)
+                    );
+
+                    TrialSelfInspectionRecord record = baseMapper.selectById(trialSelfInspectionRecordId);
+                    //此时的record.getPdfUrl()为电签后的pdf信息
+                    if (("已审批").equals(record.getTaskStatus()) && (new Integer(1)).equals(record.getDetectionResult()) && (new Integer(1)).equals(record.getDetectionCategory())) {
+                        /**
+                         * 在资料填报工序-预览全部pdf时再拼接合并显示,当前只做储存(如果当前资料填报工序节点有其他多个试验记录pdf关联信息,那么合并存储,否则直接存储)
+                         */
+                        if (StringUtils.isNotEmpty(record.getProjectPosition())) {
+                            //有pdf的节点
+                            String sqlNodeAll = "select wbs_id from u_information_query where wbs_id in(" + record.getProjectPosition() + ") and contract_id = " + record.getContractId();
+                            List<Long> collect = jdbcTemplate.query(sqlNodeAll, new BeanPropertyRowMapper<>(InformationQuery.class)).stream().map(InformationQuery::getWbsId).collect(Collectors.toList());
+                            if (collect.size() > 0) {
+                                //删除当前记录关联记录
+                                baseMapper.delSelfQuality(record.getId());
+                                for (Long pKeyId : collect) {
+                                    //新增当前记录关联信息
+                                    baseMapper.saveSelfQuality(SnowFlakeUtil.getId(), record.getId(), pKeyId);
+
+                                    //获取当前工程部位节点最新的关联试验记录ids
+                                    List<String> trialRecordIds = baseMapper.selectTrialIdByNodeId(pKeyId);
+
+                                    //如果当前工程部位节点的关联试验记录id只有一条,且等于当前关联试验记录id,那么不合并,直接存储该条试验记录的pdf
+                                    if (trialRecordIds.size() == 1 && trialRecordIds.get(0).equals(record.getId().toString())) {
+                                        //修改当前试验pdf到质检树节点的pdf_trial_url_position上存储
+                                        baseMapper.updateInformationQuery(pKeyId, record.getContractId(), record.getPdfUrl());
+                                        continue;
+                                    }
+
+                                    //如果当前工程部位节点的关联试验记录id有多条,那么合并
+                                    List<TrialSelfInspectionRecord> pdfUrlList = baseMapper.selectList(Wrappers.<TrialSelfInspectionRecord>lambdaQuery().select(TrialSelfInspectionRecord::getPdfUrl).in(TrialSelfInspectionRecord::getId, trialRecordIds));
+                                    List<String> pdfS = pdfUrlList.stream().filter(f -> StringUtils.isNotEmpty(f.getPdfUrl())).map(TrialSelfInspectionRecord::getPdfUrl).collect(Collectors.toList());
+
+                                    String filePath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+                                    String listPdf = filePath + "/pdf/" + pKeyId + ".pdf";
+                                    File tabPDF = ResourceUtil.getFile(listPdf);
+                                    if (tabPDF.exists()) {
+                                        tabPDF.delete();
+                                    }
+
+                                    FileUtils.mergePdfPublicMethods(pdfS, listPdf);
+                                    BladeFile bladeFile = this.newIOSSClient.uploadFile(pKeyId + ".pdf", listPdf);
+                                    if (bladeFile != null) {
+                                        //修改合并的试验pdf到质检树节点的pdf_trial_url_position上存储
+                                        baseMapper.updateInformationQuery(pKeyId, record.getContractId(), bladeFile.getLink());
                                     }
                                     }
                                 }
                                 }
                             }
                             }
@@ -536,6 +518,25 @@ public class TrialSelfInspectionRecordServiceImpl
         }
         }
     }
     }
 
 
+    @Override
+    public void updateTrialSelfInspectionRecordStatusFC(TaskApprovalVO obj) {
+        if (ObjectUtil.isNotEmpty(obj.getParallelProcessInstanceId())) {
+            String sql = "select process_instance_id from u_task_parallel where parallel_process_instance_id = '" + obj.getParallelProcessInstanceId() + "'";
+            TaskParallel taskParallel = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TaskParallel.class)).stream().findAny().orElse(null);
+            if (taskParallel != null && ObjectUtil.isNotEmpty(taskParallel.getProcessInstanceId())) {
+                String trialSelfInspectionRecordId = baseMapper.selectTaskByTaskId(taskParallel.getProcessInstanceId());
+                if (StringUtils.isNotEmpty(trialSelfInspectionRecordId)) {
+                    this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate()
+                            .set(TrialSelfInspectionRecord::getTaskStatus, "已废除")
+                            .eq(TrialSelfInspectionRecord::getId, trialSelfInspectionRecordId)
+                    );
+                    //废除后修改电签为null
+                    jdbcTemplate.execute("update u_information_query set e_visa_pdf_url = null where wbs_id = " + trialSelfInspectionRecordId);
+                }
+            }
+        }
+    }
+
     @Override
     @Override
     public String addBussFile(MultipartFile file, Long pkeyId, String nodeId, String contractId, String
     public String addBussFile(MultipartFile file, Long pkeyId, String nodeId, String contractId, String
             projectId, String classify, String id, String tableType) throws Exception {
             projectId, String classify, String id, String tableType) throws Exception {
@@ -671,93 +672,84 @@ public class TrialSelfInspectionRecordServiceImpl
 
 
     @Override
     @Override
     public String selfSubmit(TrialSelfInspectionRecordDTO dto) throws FileNotFoundException {
     public String selfSubmit(TrialSelfInspectionRecordDTO dto) throws FileNotFoundException {
-        if (ObjectUtil.isEmpty(dto.getId()) && StringUtils.isNotEmpty(dto.getTableType())) {
-            //构建记录表编号、报告单编号
-            this.buildNumber(dto);
+        //------初始当前填报的表pKeyIds------
+        this.initTrialTabIds(dto);
 
 
-            //任务流程状态初始化未上报
-            dto.setTaskStatus("未上报");
-        }
-
-        //初始化tabIds
-        JSONArray dataArray = dto.getDataInfo().getJSONArray("orderList");
-        List<String> tableIds = new ArrayList<>();
-        for (int i = 0; i < dataArray.size(); i++) {
-            String pkeyId = dataArray.getJSONObject(i).getString("pkeyId");
-            tableIds.add(pkeyId);
-        }
-        String join = org.apache.commons.lang.StringUtils.join(tableIds, ",");
-        dto.setTableIds(join);
+        //------初始编号信息------
+        this.initBuildNumber(dto);
 
 
+        //------新增或编辑------
         this.saveOrUpdate(dto);
         this.saveOrUpdate(dto);
 
 
         if (ObjectUtil.isNotEmpty(dto.getId())) {
         if (ObjectUtil.isNotEmpty(dto.getId())) {
-            //获取当前最新的试验记录信息
+            //------获取最新试验记录------
             TrialSelfInspectionRecord obj = baseMapper.selectById(dto.getId());
             TrialSelfInspectionRecord obj = baseMapper.selectById(dto.getId());
 
 
-            //编辑时生成记录表编号或报告单编号,如果新增时不是两种类型表都填报过,那么有一项编号为Null
-            if (StringUtils.isEmpty(obj.getRecordNo()) && dto.getTableType().contains("1")) {
-                this.buildNumber(dto);
-                this.saveOrUpdate(dto);
-            } else if (StringUtils.isEmpty(obj.getReportNo()) && dto.getTableType().contains("2")) {
-                this.buildNumber(dto);
-                this.saveOrUpdate(dto);
-            }
-
-            //------保存实体表数据、试验记录信息、生成pdf------
-            try {
-                String pdfURL = excelTabClient.saveTabData(dto.getIsBatchSave(), dto.getDataInfo(), dto.getType(), dto.getTableType(), dto.getId(), obj.getTableIds());
-                if (StringUtils.isNotEmpty(pdfURL)) {
-                    //修改合并pdf
-                    this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate().set(TrialSelfInspectionRecord::getPdfUrl, pdfURL).eq(TrialSelfInspectionRecord::getId, dto.getId()));
-                }
-            } catch (Exception e) {
-                throw new ServiceException("保存实体表数据生成pdf时发生异常" + e.getMessage());
-            }
+            //------编辑时生成为Null的记录表编号或报告单编号------
+            this.reBuildNumber(obj, dto);
 
 
-            //------关联工程及用途关系新增或删除------(已做修改,在审批修改状态时,再建立关联关系)
-            /*if (StringUtils.isEmpty(obj.getProjectPosition())) {
-                String delSql = "delete from u_trial_self_quality_project where self_id = " + obj.getId();
-                jdbcTemplate.execute(delSql);
-            } else {
-                String delSql = "delete from u_trial_self_quality_project where self_id = " + obj.getId();
-                jdbcTemplate.execute(delSql);
-
-                //保留新增
-                List<Long> recordIds = Func.toLongList(obj.getProjectPosition());
-                for (Long recordNodeId : recordIds) {
-                    String insertSql = "insert into u_trial_self_quality_project(id,self_id,quality_node_id) values (" + SnowFlakeUtil.getId() + "," + obj.getId() + "," + recordNodeId + ")";
-                    jdbcTemplate.execute(insertSql);
-                }
-            }*/
+            //------保存实体表数据、试验记录信息、生成PDF------
+            this.submitTrialData(obj, dto);
 
 
             //------关联原材料检测报告------
             //------关联原材料检测报告------
-            RawMaterialSubmitRelationDTO relationDTO = new RawMaterialSubmitRelationDTO();
-            relationDTO.setId(obj.getId().toString());
-            relationDTO.setIds(dto.getRawMaterialIds());
-            relationDTO.setNodeId(dto.getNodeId().toString());
-            relationDTO.setContractId(dto.getContractId().toString());
-            relationDTO.setProjectId(dto.getProjectId());
-            relationDTO.setType(dto.getType());
-            this.rawMaterialSubmitRelation(relationDTO, obj);
+            this.rawMaterialSubmitRelation(dto, obj);
 
 
             //------关联取样信息------
             //------关联取样信息------
-            RecordSampleSubmitDTO recordSampleSubmitDTO = new RecordSampleSubmitDTO();
-            recordSampleSubmitDTO.setId(obj.getId());
-            recordSampleSubmitDTO.setSampleIds(dto.getSampleIds());
-            this.recordSampleSubmit(recordSampleSubmitDTO);
+            this.recordSampleSubmit(dto, obj);
 
 
             //------新增设备使用记录信息------
             //------新增设备使用记录信息------
             this.trialDeviceUseService.addDeviceUseInfo(dto);
             this.trialDeviceUseService.addDeviceUseInfo(dto);
         }
         }
-
-        //返回当前记录id
         return dto.getId().toString();
         return dto.getId().toString();
     }
     }
 
 
-    @Override
+    private void initBuildNumber(TrialSelfInspectionRecordDTO dto) {
+        if (ObjectUtil.isEmpty(dto.getId()) && StringUtils.isNotEmpty(dto.getTableType())) {
+            //构建记录表编号、报告单编号
+            this.buildNumber(dto);
+            dto.setTaskStatus("未上报");
+        }
+    }
+
+    private void initTrialTabIds(TrialSelfInspectionRecordDTO dto) {
+        JSONArray dataArray = dto.getDataInfo().getJSONArray("orderList");
+        List<String> tableIds = new ArrayList<>();
+        for (int i = 0; i < dataArray.size(); i++) {
+            String pkeyId = dataArray.getJSONObject(i).getString("pkeyId");
+            tableIds.add(pkeyId);
+        }
+        List<String> ids = tableIds.stream().distinct().collect(Collectors.toList());
+        String join = org.apache.commons.lang.StringUtils.join(ids, ",");
+        dto.setTableIds(join);
+    }
+
+    private void reBuildNumber(TrialSelfInspectionRecord obj, TrialSelfInspectionRecordDTO dto) {
+        if (StringUtils.isEmpty(obj.getRecordNo()) && dto.getTableType().contains("1")) {
+            this.buildNumber(dto);
+            this.saveOrUpdate(dto);
+        } else if (StringUtils.isEmpty(obj.getReportNo()) && dto.getTableType().contains("2")) {
+            this.buildNumber(dto);
+            this.saveOrUpdate(dto);
+        }
+    }
+
+    @Async
+    public void submitTrialData(TrialSelfInspectionRecord obj, TrialSelfInspectionRecordDTO dto) {
+        try {
+            String pdfURL = excelTabClient.saveTabData(dto, dto.getIsBatchSave(), dto.getType(), dto.getTableType(), dto.getId(), obj.getTableIds());
+            if (StringUtils.isNotEmpty(pdfURL)) {
+                this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate().set(TrialSelfInspectionRecord::getPdfUrl, pdfURL).eq(TrialSelfInspectionRecord::getId, dto.getId()));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
     @Async
     @Async
-    public boolean recordSampleSubmit(RecordSampleSubmitDTO dto) {
+    public boolean recordSampleSubmit(TrialSelfInspectionRecordDTO dto1, TrialSelfInspectionRecord obj) {
+        RecordSampleSubmitDTO dto = new RecordSampleSubmitDTO();
+        dto.setId(obj.getId());
+        dto.setSampleIds(dto1.getSampleIds());
         if (ObjectUtil.isEmpty(dto.getId())) {
         if (ObjectUtil.isEmpty(dto.getId())) {
             throw new ServiceException("请先保存填报数据后,再关联取样信息");
             throw new ServiceException("请先保存填报数据后,再关联取样信息");
         }
         }
@@ -816,11 +808,86 @@ public class TrialSelfInspectionRecordServiceImpl
         return true;
         return true;
     }
     }
 
 
+    @Async
+    public boolean rawMaterialSubmitRelation(TrialSelfInspectionRecordDTO dto1, TrialSelfInspectionRecord obj) throws FileNotFoundException {
+        RawMaterialSubmitRelationDTO dto = new RawMaterialSubmitRelationDTO();
+        dto.setId(dto1.getId().toString());
+        dto.setIds(dto1.getRawMaterialIds());
+        dto.setNodeId(dto1.getNodeId().toString());
+        dto.setContractId(dto1.getContractId().toString());
+        dto.setProjectId(dto1.getProjectId());
+        dto.setType(dto1.getType());
+        if (ObjectUtil.isEmpty(dto.getId())) {
+            throw new ServiceException("请先保存填报数据后,再关联原材检测报告信息");
+        } else {
+            if (ObjectUtil.isNotEmpty(obj) && (("已审批").equals(obj.getTaskStatus()) || ("待审批").equals(obj.getTaskStatus()))) {
+                throw new ServiceException("当前填报数据已上报,无法进行关联操作");
+            }
+
+            //新增或编辑
+            if (StringUtils.isNotEmpty(dto.getIds())) {
+                //当前关联的原材料记录id
+                List<String> ids = Func.toStrList(dto.getIds());
+
+                //获取原材料的pdf
+                List<TrialSelfInspectionRecord> recordList = baseMapper.selectList(Wrappers.<TrialSelfInspectionRecord>lambdaQuery()
+                        .select(TrialSelfInspectionRecord::getPdfUrl, TrialSelfInspectionRecord::getId)
+                        .in(TrialSelfInspectionRecord::getId, ids).eq(TrialSelfInspectionRecord::getStatus, 1));
+                List<TrialSelfInspectionRecord> recordObjList = recordList.stream().filter(f -> !f.getId().equals(Long.parseLong(dto.getId()))).collect(Collectors.toList());
+                List<String> pdfUrlAll = new ArrayList<>();
+                if (recordObjList.size() > 0) {
+                    pdfUrlAll.addAll(recordObjList.stream().filter(f -> StringUtils.isNotEmpty(f.getPdfUrl())).map(TrialSelfInspectionRecord::getPdfUrl).collect(Collectors.toList()));
+                }
+
+                if (pdfUrlAll.size() > 0) {
+                    String filePath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+                    String listPdf = filePath + "/pdf/" + dto.getNodeId() + ".pdf";
+                    File tabPDF = ResourceUtil.getFile(listPdf);
+                    if (tabPDF.exists()) {
+                        tabPDF.delete();
+                    }
+                    FileUtils.mergePdfPublicMethods(pdfUrlAll, listPdf);
+                    BladeFile bladeFile = this.newIOSSClient.uploadFile(dto.getNodeId() + ".pdf", listPdf);
+
+                    //删除记录关系
+                    String sql1 = "delete from u_trial_raw_material_self_record where self_record_id ='" + dto.getId() + "'";
+                    jdbcTemplate.execute(sql1);
+                    //新增记录关系
+                    for (String recordId : ids) {
+                        if (!recordId.equals(dto.getId())) {
+                            String sql2 = "insert into u_trial_raw_material_self_record(id,self_record_id,raw_material_record_id,old_pdf_url) values(" + SnowFlakeUtil.getId() + "," + dto.getId() + "," + recordId + ",'" + bladeFile.getLink() + "')";
+                            jdbcTemplate.execute(sql2);
+                        }
+                    }
+                    return true;
+                }
+
+            } else {
+                //删除全部
+                String sql = "select id from u_trial_raw_material_self_record where self_record_id =" + dto.getId();
+                List<TrialRawMaterialSelfRecord> recordList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialRawMaterialSelfRecord.class));
+                if (recordList.size() > 0) {
+                    String sql1 = "delete from u_trial_raw_material_self_record where self_record_id ='" + dto.getId() + "'";
+                    jdbcTemplate.execute(sql1);
+                }
+                return true;
+            }
+        }
+        return false;
+    }
+
     private void buildNumber(TrialSelfInspectionRecordDTO dto) {
     private void buildNumber(TrialSelfInspectionRecordDTO dto) {
         StringSPUtils spUtils = new StringSPUtils();
         StringSPUtils spUtils = new StringSPUtils();
         List<TrialSelfInspectionRecord> result = baseMapper.selectAll(dto.getNodeId(), dto.getContractId());
         List<TrialSelfInspectionRecord> result = baseMapper.selectAll(dto.getNodeId(), dto.getContractId());
         List<TrialSelfInspectionRecord> trialSelfInspectionRecords = result.stream().filter(Objects::nonNull).collect(Collectors.toList());
         List<TrialSelfInspectionRecord> trialSelfInspectionRecords = result.stream().filter(Objects::nonNull).collect(Collectors.toList());
 
 
+        //解决如果当前类型没有表,那么不生成编号
+        /*String tableIds = dto.getTableIds();
+        List<WbsTreePrivate> recordTab = jdbcTemplate.query("select table_type from m_wbs_tree_private where table_type is not null and p_key_id in (" + tableIds + ")", new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+        List<Integer> collect = recordTab.stream().map(WbsTreePrivate::getTableType).distinct().collect(Collectors.toList());
+        String tabType = org.apache.commons.lang.StringUtils.join(collect, ",");
+        dto.setTableType(tabType);*/
+
         //两种类型同时生成
         //两种类型同时生成
         if (dto.getTableType().contains("1,2") || dto.getTableType().contains("2,1")) {
         if (dto.getTableType().contains("1,2") || dto.getTableType().contains("2,1")) {
             String maxRecordNo = "";
             String maxRecordNo = "";
@@ -975,8 +1042,7 @@ public class TrialSelfInspectionRecordServiceImpl
         }
         }
     }
     }
 
 
-    public IPage<TrialSelfInspectionRecordVO> trialDataPage
-            (IPage<TrialSelfInspectionRecord> page, TrialSelfInspectionRecordPageDTO dto) {
+    public IPage<TrialSelfInspectionRecordVO> trialDataPage(IPage<TrialSelfInspectionRecord> page, TrialSelfInspectionRecordPageDTO dto) {
         QueryWrapper<TrialSelfInspectionRecord> queryWrapper = Condition.getQueryWrapper(dto);
         QueryWrapper<TrialSelfInspectionRecord> queryWrapper = Condition.getQueryWrapper(dto);
         if (org.apache.commons.lang.StringUtils.isNotEmpty(dto.getStartTime()) && org.apache.commons.lang.StringUtils.isNotEmpty(dto.getEndTime())) {
         if (org.apache.commons.lang.StringUtils.isNotEmpty(dto.getStartTime()) && org.apache.commons.lang.StringUtils.isNotEmpty(dto.getEndTime())) {
             String endTime = dto.getEndTime();
             String endTime = dto.getEndTime();

+ 95 - 88
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java

@@ -102,10 +102,10 @@ public class EVisaServiceImpl implements EVisaService {
 
 
     @Override
     @Override
     public String certification(String pdfUrl, String fileName, String contractId) {
     public String certification(String pdfUrl, String fileName, String contractId) {
-        try{
+        try {
             //根据当前合同段获取相关的证书
             //根据当前合同段获取相关的证书
             List<SignPfxFile> pfxFiles = this.signPfxClient.querySignPfxByUserIdOrContractId("", contractId);
             List<SignPfxFile> pfxFiles = this.signPfxClient.querySignPfxByUserIdOrContractId("", contractId);
-            if(pfxFiles == null || pfxFiles.size() <= 0){
+            if (pfxFiles == null || pfxFiles.size() <= 0) {
                 return NOT_PFX_OR_FILE;
                 return NOT_PFX_OR_FILE;
             }
             }
             //查询合同段信息
             //查询合同段信息
@@ -113,17 +113,17 @@ public class EVisaServiceImpl implements EVisaService {
 
 
             //找到合同章
             //找到合同章
             SignPfxFile contractPfx = null;
             SignPfxFile contractPfx = null;
-            for(SignPfxFile pfxFile : pfxFiles){
-                if(new Integer("1").equals(contract.getContractType())){
+            for (SignPfxFile pfxFile : pfxFiles) {
+                if (new Integer("1").equals(contract.getContractType())) {
                     //施工方
                     //施工方
-                    if("2".equals(pfxFile.getPfxType())){
+                    if ("2".equals(pfxFile.getPfxType())) {
                         //找到当前合同段的合同章类型
                         //找到当前合同段的合同章类型
                         contractPfx = pfxFile;
                         contractPfx = pfxFile;
                         break;
                         break;
                     }
                     }
-                } else if(new Integer("2").equals(contract.getContractType())){
+                } else if (new Integer("2").equals(contract.getContractType())) {
                     //监理方
                     //监理方
-                    if("3".equals(pfxFile.getPfxType())){
+                    if ("3".equals(pfxFile.getPfxType())) {
                         //找到当前合同段的合同章类型
                         //找到当前合同段的合同章类型
                         contractPfx = pfxFile;
                         contractPfx = pfxFile;
                         break;
                         break;
@@ -131,7 +131,7 @@ public class EVisaServiceImpl implements EVisaService {
                 }
                 }
             }
             }
             //没有找到合同章,直接返回
             //没有找到合同章,直接返回
-            if(contractPfx == null){
+            if (contractPfx == null) {
                 return NOT_PFX_OR_FILE;
                 return NOT_PFX_OR_FILE;
             }
             }
 
 
@@ -144,7 +144,7 @@ public class EVisaServiceImpl implements EVisaService {
             //获取PDF文件
             //获取PDF文件
             PDDocument document = PDDocument.load(pdfInputStream);
             PDDocument document = PDDocument.load(pdfInputStream);
             int page = document.getPages().getCount();
             int page = document.getPages().getCount();
-            for(int i = 0; i < page; i ++){
+            for (int i = 0; i < page; i++) {
                 SealStrategyVO vo = new SealStrategyVO();
                 SealStrategyVO vo = new SealStrategyVO();
                 vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + contractPfx.getCertificatePassword());
                 vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + contractPfx.getCertificatePassword());
                 vo.setSealPassword(contractPfx.getCertificatePassword());
                 vo.setSealPassword(contractPfx.getCertificatePassword());
@@ -155,7 +155,7 @@ public class EVisaServiceImpl implements EVisaService {
                 vo.setSealType("2");
                 vo.setSealType("2");
                 vo.setLx("100");
                 vo.setLx("100");
                 vo.setLy("100");
                 vo.setLy("100");
-                vo.setPage(( i + 1) + "");
+                vo.setPage((i + 1) + "");
                 sealStrategyVOS.add(vo);
                 sealStrategyVOS.add(vo);
             }
             }
             SealPdfVO pdfVO = new SealPdfVO();
             SealPdfVO pdfVO = new SealPdfVO();
@@ -166,33 +166,33 @@ public class EVisaServiceImpl implements EVisaService {
             //兼容大文件签章
             //兼容大文件签章
             Object[] result;
             Object[] result;
             //大于50M的单个文件采用大文件签章处理
             //大于50M的单个文件采用大文件签章处理
-            if(fileByte.length > 52428800){
+            if (fileByte.length > 52428800) {
                 result = null;
                 result = null;
             } else {
             } else {
                 //普通文件签章
                 //普通文件签章
                 result = this.signPdfByAXQZ(pdfVO, fileByte);
                 result = this.signPdfByAXQZ(pdfVO, fileByte);
             }
             }
-            if(result != null){
-                if(result[0] != null){
-                    byte[] newPdfData = (byte[])result[0];
+            if (result != null) {
+                if (result[0] != null) {
+                    byte[] newPdfData = (byte[]) result[0];
                     MultipartFile files = new MockMultipartFile("file", SnowFlakeUtil.getId() + ".pdf", "text/plain", IOUtils.toByteArray(new ByteArrayInputStream(newPdfData)));
                     MultipartFile files = new MockMultipartFile("file", SnowFlakeUtil.getId() + ".pdf", "text/plain", IOUtils.toByteArray(new ByteArrayInputStream(newPdfData)));
                     //重新上传
                     //重新上传
                     BladeFile bladeFile = this.newIOSSClient.uploadFileByInputStream(files);
                     BladeFile bladeFile = this.newIOSSClient.uploadFileByInputStream(files);
-                    if(bladeFile != null){
+                    if (bladeFile != null) {
                         return SUCCESS + "@@@@" + bladeFile.getLink();
                         return SUCCESS + "@@@@" + bladeFile.getLink();
                     } else {
                     } else {
                         return ERROR;
                         return ERROR;
                     }
                     }
                 } else {
                 } else {
                     String s = result[1].toString();
                     String s = result[1].toString();
-                    return s.contains("600619") ? "认证失败! " + fileName + "-文件存在无效签名。" : "认证失败!"+"原因:" + s;
+                    return s.contains("600619") ? "认证失败! " + fileName + "-文件存在无效签名。" : "认证失败!" + "原因:" + s;
                 }
                 }
             } else {
             } else {
                 //电签失败 ,接口返回认证失败
                 //电签失败 ,接口返回认证失败
                 return "认证失败!认证接口调用异常";
                 return "认证失败!认证接口调用异常";
             }
             }
 
 
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();
         }
         }
 
 
@@ -201,6 +201,7 @@ public class EVisaServiceImpl implements EVisaService {
 
 
     /**
     /**
      * 合同章 签字
      * 合同章 签字
+     *
      * @param task
      * @param task
      * @param finalPdfUrl
      * @param finalPdfUrl
      * @return
      * @return
@@ -209,36 +210,36 @@ public class EVisaServiceImpl implements EVisaService {
     public String eVisaContractSeal(EVisaTaskApprovalVO task, String finalPdfUrl) {
     public String eVisaContractSeal(EVisaTaskApprovalVO task, String finalPdfUrl) {
         //获取任务对应表格的电签配置(合同张)
         //获取任务对应表格的电签配置(合同张)
         List<JSONObject> eVisaConfigList = this.taskClient.queryBusinessTableEVisaConfig(task.getParallelProcessInstanceId(), "true");
         List<JSONObject> eVisaConfigList = this.taskClient.queryBusinessTableEVisaConfig(task.getParallelProcessInstanceId(), "true");
-        if(eVisaConfigList == null || eVisaConfigList.size() == 0){
+        if (eVisaConfigList == null || eVisaConfigList.size() == 0) {
             //没有电签配置,默认当前任务为不签字审批,返回成功
             //没有电签配置,默认当前任务为不签字审批,返回成功
             return finalPdfUrl;
             return finalPdfUrl;
         }
         }
 
 
         String sysBatch = ParamCache.getValue(CommonConstant.SYS_USER_TASK_BATCH);
         String sysBatch = ParamCache.getValue(CommonConstant.SYS_USER_TASK_BATCH);
         int batch = 2;
         int batch = 2;
-        if(CommonUtil.checkIsBigDecimal(sysBatch)){
+        if (CommonUtil.checkIsBigDecimal(sysBatch)) {
             batch = new Integer(sysBatch);
             batch = new Integer(sysBatch);
         }
         }
 
 
         //确定合同段并获取合同章
         //确定合同段并获取合同章
         List<SignPfxFile> userPfxList = this.signPfxClient.querySignPfxByUserIdOrContractId("", this.taskClient.queryTaskContractId(task.getParallelProcessInstanceId()));
         List<SignPfxFile> userPfxList = this.signPfxClient.querySignPfxByUserIdOrContractId("", this.taskClient.queryTaskContractId(task.getParallelProcessInstanceId()));
-        if(userPfxList == null || userPfxList.size() <= 0){
+        if (userPfxList == null || userPfxList.size() <= 0) {
             //没有签章,不执行电签
             //没有签章,不执行电签
             return finalPdfUrl;
             return finalPdfUrl;
         }
         }
 
 
         //上锁
         //上锁
         System.out.println(AuthUtil.getUserId().toString());
         System.out.println(AuthUtil.getUserId().toString());
-        if(DistributedRedisLock.acquire(AuthUtil.getUserId().toString(), batch)){
-            try{
+        if (DistributedRedisLock.acquire(AuthUtil.getUserId().toString(), batch)) {
+            try {
                 //准备签章策略
                 //准备签章策略
                 List<SealStrategyVO> sealStrategyVOS = new ArrayList<>();
                 List<SealStrategyVO> sealStrategyVOS = new ArrayList<>();
-                for(JSONObject eVisaConfig : eVisaConfigList){
+                for (JSONObject eVisaConfig : eVisaConfigList) {
                     //找到类型与之对应的合同章
                     //找到类型与之对应的合同章
                     Iterator<SignPfxFile> iterator = userPfxList.iterator();
                     Iterator<SignPfxFile> iterator = userPfxList.iterator();
-                    while (iterator.hasNext()){
+                    while (iterator.hasNext()) {
                         SignPfxFile next = iterator.next();
                         SignPfxFile next = iterator.next();
-                        if(eVisaConfig.getString("type").equals(next.getPfxType())){
+                        if (eVisaConfig.getString("type").equals(next.getPfxType())) {
                             //设置签章策略
                             //设置签章策略
                             SealStrategyVO vo = new SealStrategyVO();
                             SealStrategyVO vo = new SealStrategyVO();
                             vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + next.getId());
                             vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + next.getId());
@@ -268,17 +269,17 @@ public class EVisaServiceImpl implements EVisaService {
                 byte[] fileByte = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(finalPdfUrl));
                 byte[] fileByte = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(finalPdfUrl));
                 //执行电签
                 //执行电签
                 Object[] result = this.signPdfByAXQZ(pdfVO, fileByte);
                 Object[] result = this.signPdfByAXQZ(pdfVO, fileByte);
-                if(result != null){
-                    if(result[0] != null){
-                        MultipartFile newFiles = new MockMultipartFile("file", SnowFlakeUtil.getId() + ".pdf", "text/plain", IOUtils.toByteArray(new ByteArrayInputStream((byte[])result[0])));
+                if (result != null) {
+                    if (result[0] != null) {
+                        MultipartFile newFiles = new MockMultipartFile("file", SnowFlakeUtil.getId() + ".pdf", "text/plain", IOUtils.toByteArray(new ByteArrayInputStream((byte[]) result[0])));
                         //重新上传
                         //重新上传
                         BladeFile bladeFile = this.newIOSSClient.uploadFileByInputStream(newFiles);
                         BladeFile bladeFile = this.newIOSSClient.uploadFileByInputStream(newFiles);
-                        if(bladeFile != null){
+                        if (bladeFile != null) {
                             finalPdfUrl = bladeFile.getLink();
                             finalPdfUrl = bladeFile.getLink();
                         }
                         }
                     }
                     }
                 }
                 }
-            }catch (Exception e){
+            } catch (Exception e) {
                 e.printStackTrace();
                 e.printStackTrace();
             }
             }
         }
         }
@@ -291,6 +292,7 @@ public class EVisaServiceImpl implements EVisaService {
 
 
     /**
     /**
      * 个人-电签信息
      * 个人-电签信息
+     *
      * @param task
      * @param task
      * @return
      * @return
      */
      */
@@ -301,38 +303,44 @@ public class EVisaServiceImpl implements EVisaService {
         //用户默认的电签批次参数
         //用户默认的电签批次参数
         String sysBatch = ParamCache.getValue(CommonConstant.SYS_USER_TASK_BATCH);
         String sysBatch = ParamCache.getValue(CommonConstant.SYS_USER_TASK_BATCH);
         int batch = 2;
         int batch = 2;
-        if(CommonUtil.checkIsBigDecimal(sysBatch)){
+        if (CommonUtil.checkIsBigDecimal(sysBatch)) {
             batch = new Integer(sysBatch);
             batch = new Integer(sysBatch);
         }
         }
 
 
         //根据任务类型获取对应的文件信息
         //根据任务类型获取对应的文件信息
         TaskApprovalVO taskFile = this.taskClient.queryBusinessDataTask(JSONObject.parseObject(JSONObject.toJSONString(task), TaskApprovalVO.class));
         TaskApprovalVO taskFile = this.taskClient.queryBusinessDataTask(JSONObject.parseObject(JSONObject.toJSONString(task), TaskApprovalVO.class));
-        if(taskFile == null || taskFile.getApprovalFileList().size() <= 0){
+        if (taskFile == null || taskFile.getApprovalFileList().size() <= 0) {
             //没有找到业务文件,取消签章
             //没有找到业务文件,取消签章
             return NOT_PFX_OR_FILE;
             return NOT_PFX_OR_FILE;
         }
         }
 
 
         //获取任务对应表格的电签配置
         //获取任务对应表格的电签配置
         List<JSONObject> eVisaConfigList = this.taskClient.queryBusinessTableEVisaConfig(task.getParallelProcessInstanceId(), "false");
         List<JSONObject> eVisaConfigList = this.taskClient.queryBusinessTableEVisaConfig(task.getParallelProcessInstanceId(), "false");
-        if(eVisaConfigList == null || eVisaConfigList.size() == 0){
+        if (eVisaConfigList == null || eVisaConfigList.size() == 0) {
             //没有电签配置,默认当前任务为不签字审批,返回成功
             //没有电签配置,默认当前任务为不签字审批,返回成功
             return SUCCESS + "@@@@" + taskFile.getApprovalFileList().get(0).getFileUrl();
             return SUCCESS + "@@@@" + taskFile.getApprovalFileList().get(0).getFileUrl();
         }
         }
 
 
         //获取当前用户的证书信息
         //获取当前用户的证书信息
         List<SignPfxFile> userPfxList = this.signPfxClient.querySignPfxByUserIdOrContractId(AuthUtil.getUserId().toString(), "");
         List<SignPfxFile> userPfxList = this.signPfxClient.querySignPfxByUserIdOrContractId(AuthUtil.getUserId().toString(), "");
-        if(userPfxList == null || userPfxList.size() <= 0){
+        if (userPfxList == null || userPfxList.size() <= 0) {
             //没有签章,不执行电签
             //没有签章,不执行电签
             return NOT_PFX_OR_FILE;
             return NOT_PFX_OR_FILE;
         }
         }
 
 
         //上锁
         //上锁
-        if(DistributedRedisLock.acquire(AuthUtil.getUserId().toString(), batch)){
-            try{
+        if (DistributedRedisLock.acquire(AuthUtil.getUserId().toString(), batch)) {
+            try {
                 //获取需要签章的数据
                 //获取需要签章的数据
                 List<TaskApprovalVO.ApprovalFile> files = taskFile.getApprovalFileList();
                 List<TaskApprovalVO.ApprovalFile> files = taskFile.getApprovalFileList();
                 //这里的文件只会是一张拼接好的PDF
                 //这里的文件只会是一张拼接好的PDF
-                for(TaskApprovalVO.ApprovalFile file : files){
+                for (TaskApprovalVO.ApprovalFile file : files) {
+
+                    if (file.getFileName().contains("(关联试验文件)") || file.getFileName().contains("(关联试验工程部位信息文件)") || file.getFileName().contains("(原材料检测报告)")) {
+                        //TODO ============== 试验相关的关联文件不电签 liuYC 2023-03-17 ==============
+                        continue;
+                    }
+
                     //准备签章策略
                     //准备签章策略
                     List<SealStrategyVO> sealStrategyVOS = new ArrayList<>();
                     List<SealStrategyVO> sealStrategyVOS = new ArrayList<>();
                     for (JSONObject eVisaConfig : eVisaConfigList) {
                     for (JSONObject eVisaConfig : eVisaConfigList) {
@@ -357,12 +365,12 @@ public class EVisaServiceImpl implements EVisaService {
                     byte[] fileByte = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(file.getFileUrl()));
                     byte[] fileByte = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(file.getFileUrl()));
                     //执行电签
                     //执行电签
                     Object[] result = this.signPdfByAXQZ(pdfVO, fileByte);
                     Object[] result = this.signPdfByAXQZ(pdfVO, fileByte);
-                    if(result != null){
-                        if(result[0] != null){
-                            MultipartFile newFiles = new MockMultipartFile("file", SnowFlakeUtil.getId() + ".pdf", "text/plain", IOUtils.toByteArray(new ByteArrayInputStream((byte[])result[0])));
+                    if (result != null) {
+                        if (result[0] != null) {
+                            MultipartFile newFiles = new MockMultipartFile("file", SnowFlakeUtil.getId() + ".pdf", "text/plain", IOUtils.toByteArray(new ByteArrayInputStream((byte[]) result[0])));
                             //重新上传
                             //重新上传
                             BladeFile bladeFile = this.newIOSSClient.uploadFileByInputStream(newFiles);
                             BladeFile bladeFile = this.newIOSSClient.uploadFileByInputStream(newFiles);
-                            if(bladeFile != null){
+                            if (bladeFile != null) {
                                 resultMessage = SUCCESS + "@@@@" + bladeFile.getLink();
                                 resultMessage = SUCCESS + "@@@@" + bladeFile.getLink();
                             } else {
                             } else {
                                 resultMessage = E_VISA_ERROR;
                                 resultMessage = E_VISA_ERROR;
@@ -373,10 +381,8 @@ public class EVisaServiceImpl implements EVisaService {
                     } else {
                     } else {
                         resultMessage = E_VISA_ERROR;
                         resultMessage = E_VISA_ERROR;
                     }
                     }
-
                 }
                 }
-
-            }catch (Exception e){
+            } catch (Exception e) {
                 e.printStackTrace();
                 e.printStackTrace();
             }
             }
         }
         }
@@ -388,6 +394,7 @@ public class EVisaServiceImpl implements EVisaService {
 
 
     /**
     /**
      * 东方 中讯
      * 东方 中讯
+     *
      * @throws Exception
      * @throws Exception
      */
      */
     public static void signPdfByDFZX(SealPdfVO pdfVO, byte[] fileByte) throws Exception {
     public static void signPdfByDFZX(SealPdfVO pdfVO, byte[] fileByte) throws Exception {
@@ -452,13 +459,13 @@ public class EVisaServiceImpl implements EVisaService {
     /**
     /**
      * 安心 - 签章
      * 安心 - 签章
      */
      */
-    private Object[] signPdfByAXQZ(SealPdfVO pdfVO, byte[] fileByte){
+    private Object[] signPdfByAXQZ(SealPdfVO pdfVO, byte[] fileByte) {
         Object[] result = new Object[3];
         Object[] result = new Object[3];
-        try{
+        try {
             PaperlessClient paperlessClient = new PaperlessClient(SIGN_HOST, SIGN_PORT, 300000, 36000000);
             PaperlessClient paperlessClient = new PaperlessClient(SIGN_HOST, SIGN_PORT, 300000, 36000000);
             paperlessClient.setSSL(false);
             paperlessClient.setSSL(false);
             //*****************************************************************************
             //*****************************************************************************
-            CompoundSealPdfListDetachedRequest compoundSealPdfListDetachedRequest = new  CompoundSealPdfListDetachedRequest();
+            CompoundSealPdfListDetachedRequest compoundSealPdfListDetachedRequest = new CompoundSealPdfListDetachedRequest();
 
 
             RequestHead requestHead = new RequestHead();
             RequestHead requestHead = new RequestHead();
             //业务流水号 非空
             //业务流水号 非空
@@ -471,7 +478,7 @@ public class EVisaServiceImpl implements EVisaService {
             String channelCode = "";
             String channelCode = "";
 
 
             //设置属性
             //设置属性
-            requestHead.setBasicInfo(transactionNo, organizationCode,operatorCode,channelCode);
+            requestHead.setBasicInfo(transactionNo, organizationCode, operatorCode, channelCode);
 
 
             compoundSealPdfListDetachedRequest.setHead(requestHead);
             compoundSealPdfListDetachedRequest.setHead(requestHead);
 
 
@@ -489,8 +496,8 @@ public class EVisaServiceImpl implements EVisaService {
             requestBody.setPdfBeans(pdfBeans);
             requestBody.setPdfBeans(pdfBeans);
             //***********************构造机构章策略 ********************************
             //***********************构造机构章策略 ********************************
             List<SealStrategy> sealStrategies = this.generateSealStrategies(pdfVO.getStrategyVoList());
             List<SealStrategy> sealStrategies = this.generateSealStrategies(pdfVO.getStrategyVoList());
-            if(null == sealStrategies || sealStrategies.size() <= 0){
-                logger.info("【电签模块】{}","签章策略为空");
+            if (null == sealStrategies || sealStrategies.size() <= 0) {
+                logger.info("【电签模块】{}", "签章策略为空");
                 return null;
                 return null;
             }
             }
             requestBody.setSealStrategies(sealStrategies);
             requestBody.setSealStrategies(sealStrategies);
@@ -508,26 +515,26 @@ public class EVisaServiceImpl implements EVisaService {
             ResponseDto responseDto = paperlessClient.execute(compoundSealPdfListDetachedRequest);
             ResponseDto responseDto = paperlessClient.execute(compoundSealPdfListDetachedRequest);
 
 
             //******************************解析响应结果 *********************************************
             //******************************解析响应结果 *********************************************
-            CompoundSealPdfListDetachedResponse compoundSealPdfListDetachedResponse = (CompoundSealPdfListDetachedResponse)responseDto;
-            ResponseHead  responseHead = compoundSealPdfListDetachedResponse.getHead();
+            CompoundSealPdfListDetachedResponse compoundSealPdfListDetachedResponse = (CompoundSealPdfListDetachedResponse) responseDto;
+            ResponseHead responseHead = compoundSealPdfListDetachedResponse.getHead();
             CompoundSealPdfListDetachedResponseBody responseBody = compoundSealPdfListDetachedResponse.getBody();
             CompoundSealPdfListDetachedResponseBody responseBody = compoundSealPdfListDetachedResponse.getBody();
-            if(ClientConstants.CODE_SUCCESS.equals(responseHead.getCode())){
+            if (ClientConstants.CODE_SUCCESS.equals(responseHead.getCode())) {
                 List<PdfBean4Response> pdfBeanList = responseBody.getPdfBeans();
                 List<PdfBean4Response> pdfBeanList = responseBody.getPdfBeans();
-                if(pdfBeanList!=null && pdfBeanList.size()>0){
+                if (pdfBeanList != null && pdfBeanList.size() > 0) {
                     PdfBean4Response pdfBean4Response = pdfBeanList.get(0);
                     PdfBean4Response pdfBean4Response = pdfBeanList.get(0);
                     result[0] = pdfBean4Response.getPdf();
                     result[0] = pdfBean4Response.getPdf();
                 }
                 }
-            }else{
-                logger.info("【电签模块】{}","签章响应Response:" + compoundSealPdfListDetachedResponse);
-                logger.info("【电签模块】{}","签章响应code:" + responseHead.getCode());
+            } else {
+                logger.info("【电签模块】{}", "签章响应Response:" + compoundSealPdfListDetachedResponse);
+                logger.info("【电签模块】{}", "签章响应code:" + responseHead.getCode());
                 result[0] = null;
                 result[0] = null;
                 result[1] = compoundSealPdfListDetachedResponse.toString();
                 result[1] = compoundSealPdfListDetachedResponse.toString();
                 result[2] = responseHead.getMessage();
                 result[2] = responseHead.getMessage();
             }
             }
 
 
-        } catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();
-            logger.info("【电签模块】{}","电签签章接口调用异常");
+            logger.info("【电签模块】{}", "电签签章接口调用异常");
             e.printStackTrace();
             e.printStackTrace();
             return null;
             return null;
         }
         }
@@ -539,16 +546,16 @@ public class EVisaServiceImpl implements EVisaService {
      * 构造机构章签章策略
      * 构造机构章签章策略
      * 使用 :1-印章绑定的图片
      * 使用 :1-印章绑定的图片
      */
      */
-    private List<SealStrategy> generateSealStrategies(List<SealStrategyVO> strategyVoList){
+    private List<SealStrategy> generateSealStrategies(List<SealStrategyVO> strategyVoList) {
         List<SealStrategy> sealStrategies = new ArrayList<>();
         List<SealStrategy> sealStrategies = new ArrayList<>();
 
 
-        if(strategyVoList == null || strategyVoList.size() <= 0){
+        if (strategyVoList == null || strategyVoList.size() <= 0) {
             return null;
             return null;
         }
         }
 
 
         //构建策略
         //构建策略
-        for(SealStrategyVO vo : strategyVoList){
-            try{
+        for (SealStrategyVO vo : strategyVoList) {
+            try {
                 SealStrategy sealStrategy = new SealStrategy();
                 SealStrategy sealStrategy = new SealStrategy();
 
 
                 // 使用图片签章
                 // 使用图片签章
@@ -572,9 +579,9 @@ public class EVisaServiceImpl implements EVisaService {
                 String visible = "1";
                 String visible = "1";
                 sealStrategy.setVisible(visible);
                 sealStrategy.setVisible(visible);
 
 
-                if(!"authentication".equals(vo.getImageUrl())){
+                if (!"authentication".equals(vo.getImageUrl())) {
                     String imageUrl = vo.getImageUrl();
                     String imageUrl = vo.getImageUrl();
-                    if(StringUtils.isEmpty(imageUrl)){
+                    if (StringUtils.isEmpty(imageUrl)) {
                         logger.info("签章图片url为null,签章人员:" + vo.getSealPerson());
                         logger.info("签章图片url为null,签章人员:" + vo.getSealPerson());
                         return null;
                         return null;
                     }
                     }
@@ -584,10 +591,10 @@ public class EVisaServiceImpl implements EVisaService {
                     imageData = ImageUtil.transferAlpha(imageData);
                     imageData = ImageUtil.transferAlpha(imageData);
 
 
                     //设置大小
                     //设置大小
-                    if(vo.isCompanySeal()){
-                        imageData = ImageUtil.resizeImage(imageData,540,540);
-                    }else {
-                        imageData = ImageUtil.resizeImage(imageData,480,132);
+                    if (vo.isCompanySeal()) {
+                        imageData = ImageUtil.resizeImage(imageData, 540, 540);
+                    } else {
+                        imageData = ImageUtil.resizeImage(imageData, 480, 132);
 //                        imageData = ImageUtil.resizeImage(imageData,540,540);
 //                        imageData = ImageUtil.resizeImage(imageData,540,540);
                     }
                     }
 
 
@@ -596,7 +603,7 @@ public class EVisaServiceImpl implements EVisaService {
 
 
                     if (imageData != null) {
                     if (imageData != null) {
                         //图片进行Base64编码/
                         //图片进行Base64编码/
-                        String imageDataString =  new String(Base64.encode(imageData), StandardCharsets.UTF_8);
+                        String imageDataString = new String(Base64.encode(imageData), StandardCharsets.UTF_8);
                         sealStrategy.setSealImage(imageDataString);
                         sealStrategy.setSealImage(imageDataString);
                     }
                     }
                 } else {
                 } else {
@@ -604,7 +611,7 @@ public class EVisaServiceImpl implements EVisaService {
                     sealStrategy.setSealImage(EVisaConstant.base64String);
                     sealStrategy.setSealImage(EVisaConstant.base64String);
                 }
                 }
 
 
-                sealStrategy.setSealMiscInfo(vo.getSealPerson(), vo.getSealLocation(),  vo.getSealReason());
+                sealStrategy.setSealMiscInfo(vo.getSealPerson(), vo.getSealLocation(), vo.getSealReason());
 
 
                 //关键字签章
                 //关键字签章
                 sealStrategy.setSealType(vo.getSealType());
                 sealStrategy.setSealType(vo.getSealType());
@@ -614,14 +621,14 @@ public class EVisaServiceImpl implements EVisaService {
                     sealStrategy.setOffsetY(vo.getOffSetY());
                     sealStrategy.setOffsetY(vo.getOffSetY());
                 } else if (vo.getSealType().equals("2")) {
                 } else if (vo.getSealType().equals("2")) {
                     //设置PDF坐标原点,签章图片定位点   默认为PDF左下角,签章图片定位为左下角
                     //设置PDF坐标原点,签章图片定位点   默认为PDF左下角,签章图片定位为左下角
-                    if(StringUtils.isNotEmpty(vo.getIsCenterCoordinate())){
+                    if (StringUtils.isNotEmpty(vo.getIsCenterCoordinate())) {
                         sealStrategy.setIsCenterCoordinate(vo.getIsCenterCoordinate());
                         sealStrategy.setIsCenterCoordinate(vo.getIsCenterCoordinate());
                     }
                     }
                     sealStrategy.setSignWithCoordinate(vo.getPage(), vo.getLx(), vo.getLy());
                     sealStrategy.setSignWithCoordinate(vo.getPage(), vo.getLx(), vo.getLy());
                 }
                 }
 
 
                 sealStrategies.add(sealStrategy);
                 sealStrategies.add(sealStrategy);
-            }catch (Exception e){
+            } catch (Exception e) {
                 e.printStackTrace();
                 e.printStackTrace();
             }
             }
         }
         }
@@ -635,7 +642,7 @@ public class EVisaServiceImpl implements EVisaService {
         BufferedImage gridImage = ImageIO.read(new ByteArrayInputStream(bytes));
         BufferedImage gridImage = ImageIO.read(new ByteArrayInputStream(bytes));
         final String formatName = "png";
         final String formatName = "png";
         byte[] result = new byte[0];
         byte[] result = new byte[0];
-        for (Iterator<ImageWriter> iw = ImageIO.getImageWritersByFormatName(formatName); iw.hasNext();) {
+        for (Iterator<ImageWriter> iw = ImageIO.getImageWritersByFormatName(formatName); iw.hasNext(); ) {
             ImageWriter writer = iw.next();
             ImageWriter writer = iw.next();
             ImageWriteParam writeParam = writer.getDefaultWriteParam();
             ImageWriteParam writeParam = writer.getDefaultWriteParam();
             ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
             ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
@@ -683,7 +690,7 @@ public class EVisaServiceImpl implements EVisaService {
      */
      */
     @Override
     @Override
     public String createSeal(EVisaMakeSealVO vo) {
     public String createSeal(EVisaMakeSealVO vo) {
-        try{
+        try {
             PaperlessClient paperlessClient = new PaperlessClient(SIGN_HOST, SIGN_PORT, 3000, 20000);
             PaperlessClient paperlessClient = new PaperlessClient(SIGN_HOST, SIGN_PORT, 3000, 20000);
             paperlessClient.setSSL(false);
             paperlessClient.setSSL(false);
 
 
@@ -710,7 +717,7 @@ public class EVisaServiceImpl implements EVisaService {
             String privateKeyPassword = vo.getPfxPassword();
             String privateKeyPassword = vo.getPfxPassword();
             String pkcs12Password = PwdEncryptUtil.encrypto(privateKeyPassword);
             String pkcs12Password = PwdEncryptUtil.encrypto(privateKeyPassword);
 
 
-            sealCertBean.setMakeSealWithPkcs12(pkcs12String, pkcs12Password, BaseConstants.KEY_ALG_RSA , BaseConstants.KEY_ALG_LENGTH_2048);
+            sealCertBean.setMakeSealWithPkcs12(pkcs12String, pkcs12Password, BaseConstants.KEY_ALG_RSA, BaseConstants.KEY_ALG_LENGTH_2048);
             sealCertBean.setUserInfo(vo.getUserName(), vo.getIdType(), vo.getIdNumber());
             sealCertBean.setUserInfo(vo.getUserName(), vo.getIdType(), vo.getIdNumber());
 
 
             // 构造sealInfo
             // 构造sealInfo
@@ -727,27 +734,27 @@ public class EVisaServiceImpl implements EVisaService {
             MakeSealRequest requestBean = new MakeSealRequest();
             MakeSealRequest requestBean = new MakeSealRequest();
             requestBean.setHead(requestHeadBean);
             requestBean.setHead(requestHeadBean);
             requestBean.setBody(requestBodyBean);
             requestBean.setBody(requestBodyBean);
-            logger.info("【电签模块】{}","创建印章请求Request:"+requestBean);
+            logger.info("【电签模块】{}", "创建印章请求Request:" + requestBean);
             // ------调用接口------
             // ------调用接口------
             ResponseDto responseDto = paperlessClient.execute(requestBean);
             ResponseDto responseDto = paperlessClient.execute(requestBean);
 
 
             // 接收响应报文对象
             // 接收响应报文对象
             MakeSealResponse responseBean = (MakeSealResponse) responseDto;
             MakeSealResponse responseBean = (MakeSealResponse) responseDto;
-            logger.info("【电签模块】{}","创建印章响应Response:"+requestBean);
+            logger.info("【电签模块】{}", "创建印章响应Response:" + requestBean);
 
 
             // 响应报文头
             // 响应报文头
             ResponseHead responseHeadBean = responseBean.getHead();
             ResponseHead responseHeadBean = responseBean.getHead();
             // 响应报文体
             // 响应报文体
             MakeSealResponseBody responseBodyBean = responseBean.getBody();
             MakeSealResponseBody responseBodyBean = responseBean.getBody();
-            if(responseBodyBean != null){
+            if (responseBodyBean != null) {
                 logger.info("【电签模块】{}", "创建印章成功==========certDn: " + responseBodyBean.getCertDn() + " ; message: " + responseHeadBean.getMessage());
                 logger.info("【电签模块】{}", "创建印章成功==========certDn: " + responseBodyBean.getCertDn() + " ; message: " + responseHeadBean.getMessage());
                 //请求结果
                 //请求结果
                 return responseHeadBean.getMessage();
                 return responseHeadBean.getMessage();
-            } else if(responseHeadBean.getMessage().contains("is exist")) {
+            } else if (responseHeadBean.getMessage().contains("is exist")) {
                 logger.info("【电签模块】{}", responseHeadBean.getMessage());
                 logger.info("【电签模块】{}", responseHeadBean.getMessage());
                 return "error";
                 return "error";
             }
             }
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();
         }
         }
 
 
@@ -756,7 +763,7 @@ public class EVisaServiceImpl implements EVisaService {
 
 
     @Override
     @Override
     public List<CertBean> onlineCheckSeal(String pdfUrl) {
     public List<CertBean> onlineCheckSeal(String pdfUrl) {
-        try{
+        try {
             PaperlessClient paperlessClient = new PaperlessClient(SIGN_HOST, SIGN_PORT, 300000, 1800000);
             PaperlessClient paperlessClient = new PaperlessClient(SIGN_HOST, SIGN_PORT, 300000, 1800000);
             paperlessClient.setSSL(false);
             paperlessClient.setSSL(false);
 
 
@@ -773,7 +780,7 @@ public class EVisaServiceImpl implements EVisaService {
             //渠道编码 可为空
             //渠道编码 可为空
             String channelCode = EVisaConstant.channelCode;
             String channelCode = EVisaConstant.channelCode;
             //设置属性
             //设置属性
-            requestHead.setBasicInfo(transactionNo, organizationCode,operatorCode,channelCode);
+            requestHead.setBasicInfo(transactionNo, organizationCode, operatorCode, channelCode);
 
 
             verifyPdfSealRequest.setHead(requestHead);
             verifyPdfSealRequest.setHead(requestHead);
             /*==================================================================================*/
             /*==================================================================================*/
@@ -798,18 +805,18 @@ public class EVisaServiceImpl implements EVisaService {
             ResponseDto responseDto = paperlessClient.execute(verifyPdfSealRequest);
             ResponseDto responseDto = paperlessClient.execute(verifyPdfSealRequest);
             /*==================================================================================*/
             /*==================================================================================*/
 
 
-            VerifyPdfSealResponse verifyPdfSealResponse = (VerifyPdfSealResponse)responseDto;
+            VerifyPdfSealResponse verifyPdfSealResponse = (VerifyPdfSealResponse) responseDto;
 
 
-            ResponseHead  responseHead = verifyPdfSealResponse.getHead();
+            ResponseHead responseHead = verifyPdfSealResponse.getHead();
             VerifyPdfSealResponseBody responseBody = verifyPdfSealResponse.getBody();
             VerifyPdfSealResponseBody responseBody = verifyPdfSealResponse.getBody();
 
 
-            if(ClientConstants.CODE_SUCCESS.equals(responseHead.getCode())){
+            if (ClientConstants.CODE_SUCCESS.equals(responseHead.getCode())) {
                 return responseBody.getCertBeans();
                 return responseBody.getCertBeans();
             } else {
             } else {
-                logger.info("【电签模块】{}","验签接口响应code:" + responseHead.getCode());
+                logger.info("【电签模块】{}", "验签接口响应code:" + responseHead.getCode());
                 return null;
                 return null;
             }
             }
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();
             return null;
             return null;
         }
         }

+ 1 - 0
blade-service/blade-manager/blade-manager.iml

@@ -215,6 +215,7 @@
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.4" level="project" />
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.4" level="project" />
     <orderEntry type="module" module-name="blade-user-api" />
     <orderEntry type="module" module-name="blade-user-api" />
     <orderEntry type="module" module-name="blade-business-api" />
     <orderEntry type="module" module-name="blade-business-api" />
+    <orderEntry type="module" module-name="blade-archive-api" />
     <orderEntry type="library" name="Maven: com.jfirer:baseutil:1.0" level="project" />
     <orderEntry type="library" name="Maven: com.jfirer:baseutil:1.0" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.13.1" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.13.1" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:2.2" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:2.2" level="project" />

+ 11 - 0
blade-service/blade-manager/pom.xml

@@ -50,6 +50,11 @@
             <artifactId>blade-business-api</artifactId>
             <artifactId>blade-business-api</artifactId>
             <version>${bladex.project.version}</version>
             <version>${bladex.project.version}</version>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-archive-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
         <dependency>
         <dependency>
             <groupId>com.jfirer</groupId>
             <groupId>com.jfirer</groupId>
             <artifactId>baseutil</artifactId>
             <artifactId>baseutil</artifactId>
@@ -144,6 +149,12 @@
             <version>20.4</version>
             <version>20.4</version>
             <scope>compile</scope>
             <scope>compile</scope>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-archive-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
     </dependencies>
     <build>
     <build>
         <plugins>
         <plugins>

+ 20 - 16
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -23,6 +23,8 @@ import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 import org.jsoup.select.Elements;
+import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
+import org.springblade.business.entity.TrialSelfInspectionRecord;
 import org.springblade.business.feign.ContractLogClient;
 import org.springblade.business.feign.ContractLogClient;
 import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.business.vo.SaveContractLogVO;
 import org.springblade.business.vo.SaveContractLogVO;
@@ -55,6 +57,7 @@ import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.resource.vo.NewBladeFile;
 import org.springblade.resource.vo.NewBladeFile;
 import org.springblade.system.cache.ParamCache;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
@@ -1413,7 +1416,7 @@ public class ExcelTabController extends BladeController {
         String tabName = wbsTreeContract.getInitTableName();
         String tabName = wbsTreeContract.getInitTableName();
         // 字段查询 并去掉公式字段
         // 字段查询 并去掉公式字段
 
 
-        String colkeys = "SELECT GROUP_CONCAT(COLUMN_NAME) as colkeys from information_schema.COLUMNS c where c.table_name='"+tabName+"' and COLUMN_NAME not in('id','p_key_id')";
+        String colkeys = "SELECT GROUP_CONCAT(COLUMN_NAME) as colkeys from information_schema.COLUMNS c where c.table_name='" + tabName + "' and COLUMN_NAME not in('id','p_key_id')";
         Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(colkeys);
         Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(colkeys);
         colkeys = stringObjectMap.get("colkeys") + "";
         colkeys = stringObjectMap.get("colkeys") + "";
         // 复制表数据
         // 复制表数据
@@ -1529,7 +1532,6 @@ public class ExcelTabController extends BladeController {
             if (stringObjectMap.get("e_visa_pdf_url") != null) {
             if (stringObjectMap.get("e_visa_pdf_url") != null) {
                 //优先使用电签的pdf
                 //优先使用电签的pdf
                 pdfUrl = stringObjectMap.get("e_visa_pdf_url");
                 pdfUrl = stringObjectMap.get("e_visa_pdf_url");
-
             }
             }
 
 
             if (stringObjectMap.get("pdf_trial_url") != null || stringObjectMap.get("pdf_trial_url_position") != null) {
             if (stringObjectMap.get("pdf_trial_url") != null || stringObjectMap.get("pdf_trial_url_position") != null) {
@@ -1622,22 +1624,24 @@ public class ExcelTabController extends BladeController {
         //
         //
         String pkeyIds = pkeyId;
         String pkeyIds = pkeyId;
         String groupIds = groupId;
         String groupIds = groupId;
-        for(int i=1;i<dataArray.size();i++){
+        for (int i = 1; i < dataArray.size(); i++) {
             JSONObject jsonObject = dataArray.getJSONObject(i);
             JSONObject jsonObject = dataArray.getJSONObject(i);
-            pkeyIds +=","+ jsonObject.getString("pkeyId");;
-            groupIds +=","+ jsonObject.getString("tabGroupId");;
+            pkeyIds += "," + jsonObject.getString("pkeyId");
+            ;
+            groupIds += "," + jsonObject.getString("tabGroupId");
+            ;
         }
         }
-        if(StringUtils.isNotEmpty(groupIds)){
+        if (StringUtils.isNotEmpty(groupIds)) {
             List<WbsTreeContract> wbsTreeContractList = this.wbsTreeContractService.getBaseMapper().selectList(
             List<WbsTreeContract> wbsTreeContractList = this.wbsTreeContractService.getBaseMapper().selectList(
                     Wrappers.<WbsTreeContract>lambdaQuery()
                     Wrappers.<WbsTreeContract>lambdaQuery()
                             .in(WbsTreeContract::getTabGroupId, groupIds)
                             .in(WbsTreeContract::getTabGroupId, groupIds)
-                            .notIn(WbsTreeContract::getPKeyId,pkeyIds)
-                            .eq(WbsTreeContract::getIsDeleted,BladeConstant.DB_NOT_DELETED)
+                            .notIn(WbsTreeContract::getPKeyId, pkeyIds)
+                            .eq(WbsTreeContract::getIsDeleted, BladeConstant.DB_NOT_DELETED)
             );
             );
-            if(wbsTreeContractList!=null && wbsTreeContractList.size()>=1){
-                for(WbsTreeContract data: wbsTreeContractList){
-                     R bussDataInfo = this.getBussDataInfo(data.getPKeyId());
-                     Object data1 = bussDataInfo.getData();
+            if (wbsTreeContractList != null && wbsTreeContractList.size() >= 1) {
+                for (WbsTreeContract data : wbsTreeContractList) {
+                    R bussDataInfo = this.getBussDataInfo(data.getPKeyId());
+                    Object data1 = bussDataInfo.getData();
                     dataArray.add(data1);
                     dataArray.add(data1);
                 }
                 }
             }
             }
@@ -1651,10 +1655,10 @@ public class ExcelTabController extends BladeController {
             e.printStackTrace();
             e.printStackTrace();
         }
         }
 
 
-            R info = this.excelTabService.saveOrUpdateInfo(tableInfoList);
-            if (!info.isSuccess()) {
-                return info;
-            }
+        R info = this.excelTabService.saveOrUpdateInfo(tableInfoList);
+        if (!info.isSuccess()) {
+            return info;
+        }
 
 
         //单个 pdf加载
         //单个 pdf加载
         for (TableInfo tableInfo : tableInfoList) {
         for (TableInfo tableInfo : tableInfoList) {

+ 8 - 13
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -1,15 +1,13 @@
 package org.springblade.manager.controller;
 package org.springblade.manager.controller;
 
 
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.mixsmart.utils.StringUtils;
 import com.mixsmart.utils.StringUtils;
 import io.swagger.annotations.*;
 import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
+import org.springblade.business.entity.TrialSelfInspectionRecord;
 import org.springblade.business.vo.SaveLogContractVO;
 import org.springblade.business.vo.SaveLogContractVO;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.boot.ctrl.BladeController;
@@ -20,10 +18,8 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.support.Kv;
-import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.core.tool.utils.StringUtil;
-import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.dto.WbsTreePrivateDTO2;
 import org.springblade.manager.dto.WbsTreePrivateDTO2;
 import org.springblade.manager.dto.WbsTreePrivateDTO3;
 import org.springblade.manager.dto.WbsTreePrivateDTO3;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.entity.*;
@@ -574,7 +570,7 @@ public class WbsTreePrivateController extends BladeController {
             @ApiImplicitParam(name = "primaryKeyIds", value = "表的注解ids(多个以,隔开)", required = true),
             @ApiImplicitParam(name = "primaryKeyIds", value = "表的注解ids(多个以,隔开)", required = true),
             @ApiImplicitParam(name = "projectId", value = "合同段Id", required = true),
             @ApiImplicitParam(name = "projectId", value = "合同段Id", required = true),
     })
     })
-    public R addProjectTabInfo(String primaryKeyIds, String projectId) {
+    public R addProjectTabInfo(String primaryKeyIds, String projectId) throws IOException {
         return wbsTreePrivateService.addWbsTreeProjectInfo(primaryKeyIds, projectId);
         return wbsTreePrivateService.addWbsTreeProjectInfo(primaryKeyIds, projectId);
     }
     }
 
 
@@ -615,19 +611,18 @@ public class WbsTreePrivateController extends BladeController {
     @ApiOperationSupport(order = 22)
     @ApiOperationSupport(order = 22)
     @ApiOperation(value = "试验-根据所属方查询当前节点表信息", notes = "传入节点primaryKeyId、所属方type=1施工/=2监理、表单类型tableType=1记录表/=2报告单、合同段id、项目id、isAdd=是否新增、试验记录id")
     @ApiOperation(value = "试验-根据所属方查询当前节点表信息", notes = "传入节点primaryKeyId、所属方type=1施工/=2监理、表单类型tableType=1记录表/=2报告单、合同段id、项目id、isAdd=是否新增、试验记录id")
     public R<List<WbsTreePrivateVO4>> searchNodeAllTable(String primaryKeyId, String type, String tableType, String contractId, String projectId, Integer isAdd, Long id) {
     public R<List<WbsTreePrivateVO4>> searchNodeAllTable(String primaryKeyId, String type, String tableType, String contractId, String projectId, Integer isAdd, Long id) {
-        List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateService.searchNodeAllTable(primaryKeyId, type, tableType, contractId, projectId, isAdd, id);
-        List<WbsTreePrivateVO4> wbsTreePrivateVO4s = BeanUtil.copyProperties(wbsTreePrivates, WbsTreePrivateVO4.class);
+        List<WbsTreePrivateVO4> wbsTreePrivateVO4s = wbsTreePrivateService.searchNodeAllTable(primaryKeyId, type, tableType, contractId, projectId, isAdd, id);
         for (WbsTreePrivateVO4 treePrivate : wbsTreePrivateVO4s) {
         for (WbsTreePrivateVO4 treePrivate : wbsTreePrivateVO4s) {
-            //新增
+            //试验新增
             if ((new Integer(1).equals(isAdd)) && ObjectUtil.isEmpty(id)) {
             if ((new Integer(1).equals(isAdd)) && ObjectUtil.isEmpty(id)) {
                 //按钮状态
                 //按钮状态
                 treePrivate.setPdfUrl(null);
                 treePrivate.setPdfUrl(null);
-                treePrivate.setIsBussShow(1);
+                //treePrivate.setIsBussShow(1); //新增时通过项目wbs表的isBussShow字段单独控制
                 treePrivate.setIsTabPdf(1);
                 treePrivate.setIsTabPdf(1);
                 treePrivate.setTabFileType(1);
                 treePrivate.setTabFileType(1);
             }
             }
 
 
-            //编辑
+            //试验编辑
             if (ObjectUtil.isNotEmpty(id)) {
             if (ObjectUtil.isNotEmpty(id)) {
                 //获取当前试验记录信息中表的按钮状态
                 //获取当前试验记录信息中表的按钮状态
                 String sql = "select tab_id,is_buss_show,is_tab_pdf,is_tab_file_type from u_trial_self_data_record where record_id = " + id;
                 String sql = "select tab_id,is_buss_show,is_tab_pdf,is_tab_file_type from u_trial_self_data_record where record_id = " + id;
@@ -636,12 +631,12 @@ public class WbsTreePrivateController extends BladeController {
                 //按钮状态
                 //按钮状态
                 TrialSelfDataRecord record = map.get(treePrivate.getPKeyId());
                 TrialSelfDataRecord record = map.get(treePrivate.getPKeyId());
                 if (record != null) {
                 if (record != null) {
-                    treePrivate.setIsBussShow(record.getIsBussShow());
+                    treePrivate.setIsBussShow(record.getIsBussShow()); //编辑时通过试验记录关联关系控制
                     treePrivate.setIsTabPdf(record.getIsTabPdf());
                     treePrivate.setIsTabPdf(record.getIsTabPdf());
                     treePrivate.setTabFileType(record.getIsTabFileType());
                     treePrivate.setTabFileType(record.getIsTabFileType());
                 } else {
                 } else {
                     treePrivate.setPdfUrl(null);
                     treePrivate.setPdfUrl(null);
-                    treePrivate.setIsBussShow(1);
+                    //treePrivate.setIsBussShow(1); //没有记录的就根据项目wbs表的isBussShow字段单独控制
                     treePrivate.setIsTabPdf(1);
                     treePrivate.setIsTabPdf(1);
                     treePrivate.setTabFileType(1);
                     treePrivate.setTabFileType(1);
                 }
                 }

+ 17 - 14
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java

@@ -3,6 +3,7 @@ package org.springblade.manager.feign;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
+import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
 import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.entity.TrialSelfInspectionRecord;
 import org.springblade.business.entity.TrialSelfInspectionRecord;
 import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.business.feign.InformationQueryClient;
@@ -10,6 +11,8 @@ import org.springblade.business.vo.TrialRawMaterialSelfRecord;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.oss.model.BladeFile;
+import org.springblade.core.tool.beans.BeanProperty;
+import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.core.tool.utils.ResourceUtil;
@@ -20,13 +23,17 @@ import org.springblade.manager.service.IExcelTabService;
 import org.springblade.manager.utils.FileUtils;
 import org.springblade.manager.utils.FileUtils;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
 import org.springblade.system.cache.ParamCache;
+import org.springframework.beans.BeanUtils;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
 import java.io.File;
 import java.io.File;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 @RestController
 @RestController
@@ -44,24 +51,22 @@ public class ExcelTabClientImpl implements ExcelTabClient {
     }
     }
 
 
     @Override
     @Override
-    public String saveTabData(Integer isBatchSave, JSONObject dataInfo, Integer type, String tableType, Long id, String tabIds) throws Exception {
+    public String saveTabData(TrialSelfInspectionRecordDTO dto, Integer isBatchSave,Integer type, String tableType, Long id, String tabIds) throws Exception {
         //通用参数
         //通用参数
-        JSONArray dataArray = dataInfo.getJSONArray("orderList");
+        String pdfUrl = "";
+        JSONArray dataArray = dto.getDataInfo().getJSONArray("orderList");
         JSONObject table = dataArray.getJSONObject(0);
         JSONObject table = dataArray.getJSONObject(0);
         String nodeId = table.getString("nodeId");
         String nodeId = table.getString("nodeId");
         String projectId = table.getString("projectId");
         String projectId = table.getString("projectId");
         String contractId = table.getString("contractId");
         String contractId = table.getString("contractId");
-        List<TableInfo> tableInfoList = this.excelTabService.getTableInfoList(dataArray);
-        String pdfUrl = "";
 
 
-        /**
-         * ------试验填报数据保存,当前记录id作为groupId------
-         */
+        //获取表模板,已处理隐藏表问题
+        List<TableInfo> tableInfoList = this.excelTabService.getTableInfoListTrial(dataArray, tabIds);
+
+        //------试验填报数据保存,当前记录id作为groupId------
         this.excelTabService.saveOrUpdateInfoTrial(tableInfoList, id);
         this.excelTabService.saveOrUpdateInfoTrial(tableInfoList, id);
 
 
-        /**
-         * ------公式填充------
-         */
+        //------公式填充------
         try {
         try {
             this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeId));
             this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeId));
         } catch (Exception e) {
         } catch (Exception e) {
@@ -69,13 +74,11 @@ public class ExcelTabClientImpl implements ExcelTabClient {
         }
         }
 
 
         if (isBatchSave == 0) {
         if (isBatchSave == 0) {
-            /**
-             * ------单表PDF保存------
-             */
+            //------单表PDF保存------
             TableInfo tableInfo = tableInfoList.stream().findAny().orElse(null);
             TableInfo tableInfo = tableInfoList.stream().findAny().orElse(null);
             assert tableInfo != null;
             assert tableInfo != null;
             if (tabIds.contains(tableInfo.getPkeyId())) {
             if (tabIds.contains(tableInfo.getPkeyId())) {
-
+                //构造pdf
                 excelTabService.getBussPDFTrial(Long.valueOf(tableInfo.getPkeyId()), contractId, id);
                 excelTabService.getBussPDFTrial(Long.valueOf(tableInfo.getPkeyId()), contractId, id);
 
 
                 //重新合并pdf
                 //重新合并pdf

+ 10 - 25
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreePrivateClientImpl.java

@@ -7,18 +7,19 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.mixsmart.utils.StringUtils;
 import com.mixsmart.utils.StringUtils;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
-import org.springblade.core.log.exception.ServiceException;
-import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.manager.entity.WbsTreeContract;
+import org.springblade.manager.entity.TrialSelfDataRecord;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.manager.vo.WbsTreePrivateVO;
 import org.springblade.manager.vo.WbsTreePrivateVO;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
 import java.util.*;
 import java.util.*;
@@ -65,23 +66,8 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
     }
     }
 
 
     @Override
     @Override
-    public boolean showBussTab(Long pkeyId, Integer status) {
-        WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getBaseMapper().selectOne(Wrappers.<WbsTreePrivate>query().lambda()
-                .eq(WbsTreePrivate::getPKeyId, pkeyId));
-        if (wbsTreePrivate == null) {
-            throw new ServiceException("未找到当前表单");
-        }
-        UpdateWrapper<WbsTreePrivate> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.in("p_key_id", pkeyId);
-        updateWrapper.set("is_buss_show", status);
-        wbsTreePrivateService.update(updateWrapper);
-        return true;
-    }
-
-    @Override
-    public boolean copyBussTab(Long pKeyId) {
-        WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getBaseMapper().selectOne(Wrappers.<WbsTreePrivate>query().lambda()
-                .eq(WbsTreePrivate::getPKeyId, pKeyId));
+    public boolean copyBussTab(Long pKeyId, Long id) {
+        WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getBaseMapper().selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, pKeyId));
 
 
         List<WbsTreePrivate> wbsTreePrivateList = wbsTreePrivateService.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>query().lambda()
         List<WbsTreePrivate> wbsTreePrivateList = wbsTreePrivateService.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>query().lambda()
                 .eq(WbsTreePrivate::getId, wbsTreePrivate.getId())
                 .eq(WbsTreePrivate::getId, wbsTreePrivate.getId())
@@ -116,7 +102,7 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
         Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(colkeys);
         Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(colkeys);
         colkeys = stringObjectMap.get("colkeys") + "";
         colkeys = stringObjectMap.get("colkeys") + "";
         //复制表数据
         //复制表数据
-        String querySql = "select " + colkeys + " from " + tabName + " where p_key_id=" + pKeyId;
+        String querySql = "select " + colkeys + " from " + tabName + " where p_key_id=" + pKeyId + " and group_id = " + id;
         List<Map<String, Object>> dataList = jdbcTemplate.queryForList(querySql);
         List<Map<String, Object>> dataList = jdbcTemplate.queryForList(querySql);
         if (dataList != null && dataList.size() >= 1) {
         if (dataList != null && dataList.size() >= 1) {
             Map<String, Object> dataMap2 = dataList.get(0);
             Map<String, Object> dataMap2 = dataList.get(0);
@@ -129,8 +115,8 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
 
 
             sqlInfo = "INSERT INTO " + tabName + " ( ";
             sqlInfo = "INSERT INTO " + tabName + " ( ";
 
 
-            String keyStr = "id,p_key_id,";
-            String valStr = SnowFlakeUtil.getId() + "," + wbsTreePrivate.getPKeyId() + ",";
+            String keyStr = "id,p_key_id,group_id";
+            String valStr = SnowFlakeUtil.getId() + "," + wbsTreePrivate.getPKeyId() + "," + id + ",";
 
 
             for (String keys : dataMap2.keySet()) {
             for (String keys : dataMap2.keySet()) {
                 if (!(dataMap2.get(keys) + "").equals("null")) {
                 if (!(dataMap2.get(keys) + "").equals("null")) {
@@ -143,7 +129,6 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
 
 
             sqlInfo = sqlInfo + keyStr + ") VALUES (" + valStr + ")";
             sqlInfo = sqlInfo + keyStr + ") VALUES (" + valStr + ")";
 
 
-            //huangJN 保存成功后调用生成资料查询列表数据
             jdbcTemplate.execute(sqlInfo);
             jdbcTemplate.execute(sqlInfo);
         }
         }
         wbsTreePrivateService.save(wbsTreePrivate);
         wbsTreePrivateService.save(wbsTreePrivate);
@@ -174,7 +159,7 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
     }
     }
 
 
     @Override
     @Override
-    public List<WbsTreePrivate> queryChildByParent(WbsTreePrivate nodeObj , String queryTable, String classify) {
+    public List<WbsTreePrivate> queryChildByParent(WbsTreePrivate nodeObj, String queryTable, String classify) {
         if ("queryTable".equals(queryTable)) {
         if ("queryTable".equals(queryTable)) {
             LambdaQueryWrapper<WbsTreePrivate> wrapper = Wrappers.lambdaQuery();
             LambdaQueryWrapper<WbsTreePrivate> wrapper = Wrappers.lambdaQuery();
             wrapper.eq(WbsTreePrivate::getParentId, nodeObj.getId()).eq(WbsTreePrivate::getProjectId, nodeObj.getProjectId()).eq(WbsTreePrivate::getType, "2");
             wrapper.eq(WbsTreePrivate::getParentId, nodeObj.getId()).eq(WbsTreePrivate::getProjectId, nodeObj.getProjectId()).eq(WbsTreePrivate::getType, "2");

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

@@ -29,6 +29,7 @@
         <result column="is_interface_node" property="isInterfaceNode"/>
         <result column="is_interface_node" property="isInterfaceNode"/>
         <result column="interface_type" property="interfaceType"/>
         <result column="interface_type" property="interfaceType"/>
         <result column="sort" property="sort"/>
         <result column="sort" property="sort"/>
+        <result column="tree_sort" property="treeSort"/>
         <result column="remark" property="remark"/>
         <result column="remark" property="remark"/>
         <result column="project_type" property="projectType"/>
         <result column="project_type" property="projectType"/>
         <result column="storage_type" property="storageType"/>
         <result column="storage_type" property="storageType"/>

+ 15 - 39
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.java

@@ -1,7 +1,6 @@
 package org.springblade.manager.mapper;
 package org.springblade.manager.mapper;
 
 
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
-import org.apache.ibatis.annotations.Select;
 import org.springblade.manager.dto.FindAllUserByConditionDTO;
 import org.springblade.manager.dto.FindAllUserByConditionDTO;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.entity.ContractRelationJlyz;
@@ -19,8 +18,7 @@ public interface ContractInfoMapper extends BaseMapper<ContractInfo> {
 
 
     List<ContractInfo> selectContractByProjectIds(@Param("ids") List<Long> ids);
     List<ContractInfo> selectContractByProjectIds(@Param("ids") List<Long> ids);
 
 
-    List<ContractInfoVO> selectContractInfoPage(IPage page,
-                                                ContractInfoVO contractInfo);
+    List<ContractInfoVO> selectContractInfoPage(IPage page, ContractInfoVO contractInfo);
 
 
     List<ContractlnfoCountVO> selectContractInfoCount();
     List<ContractlnfoCountVO> selectContractInfoCount();
 
 
@@ -28,44 +26,31 @@ public interface ContractInfoMapper extends BaseMapper<ContractInfo> {
 
 
     List<CRolePostVO> findJobByRoleId(@Param("id") String id);
     List<CRolePostVO> findJobByRoleId(@Param("id") String id);
 
 
-    List<UserVO2> findAllUserByCondition(IPage page,
-                                         @Param("Values") FindAllUserByConditionDTO values);
+    List<UserVO2> findAllUserByCondition(IPage page, @Param("Values") FindAllUserByConditionDTO values);
 
 
-    List<User> findUserListByCondition(IPage page,
-                                       @Param("Values") FindAllUserByConditionDTO values);
+    List<User> findUserListByCondition(IPage page, @Param("Values") FindAllUserByConditionDTO values);
 
 
-    List<User> findUserInfoByCondition(@Param("rId") String rId,
-                                       @Param("pId") String pId,
-                                       @Param("userName") String userName);
+    List<User> findUserInfoByCondition(@Param("rId") String rId, @Param("pId") String pId, @Param("userName") String userName);
 
 
     List<User> findUserList();
     List<User> findUserList();
 
 
-    Integer updatePasswordByUserId(@Param("userId") String userId,
-                                   @Param("password") String password);
+    Integer updatePasswordByUserId(@Param("userId") String userId, @Param("password") String password);
 
 
     Boolean deleteFile(@Param("url") String url);
     Boolean deleteFile(@Param("url") String url);
 
 
-    List<WbsTreeContractTreeVO> tree(@Param("wbsId") String wbsId,
-                                     @Param("projectId") String projectId,
-                                     @Param("contractId") String contractId,
-                                     @Param("wbsType") Integer wbsType,
-                                     @Param("parentId") String parentId);
+    List<WbsTreeContractTreeVO> tree(@Param("wbsId") String wbsId, @Param("projectId") String projectId, @Param("contractId") String contractId, @Param("wbsType") Integer wbsType, @Param("parentId") String parentId);
 
 
-    List<WbsTreeContractVO> tree2(@Param("wbsId") Long wbsId,
-                                  @Param("projectId") Long projectId,
-                                  @Param("contractId") Long contractId,
-                                  @Param("wbsType") Integer wbsType,
-                                  @Param("parentId") String parentId,
-                                  @Param("queryValue") String queryValue);
+    List<WbsTreeContractVO> tree2(@Param("wbsId") Long wbsId, @Param("projectId") Long projectId, @Param("contractId") Long contractId, @Param("wbsType") Integer wbsType, @Param("parentId") String parentId, @Param("queryValue") String queryValue);
 
 
-    List<WbsTreeContractVO> tree3(@Param("wbsId") String wbsId,
-                                  @Param("projectId") String projectId,
-                                  @Param("contractId") String contractId,
-                                  @Param("wbsType") Integer wbsType,
-                                  @Param("parentId") String parentId);
+    List<WbsTreeContractVO> tree3(@Param("wbsId") String wbsId, @Param("projectId") String projectId, @Param("contractId") String contractId, @Param("wbsType") Integer wbsType, @Param("parentId") String parentId);
 
 
-    List<WbsTreeContractVO> tree4(@Param("contractId") String contractId,
-                                  @Param("parentId") String parentId);
+    List<WbsTreeContractVO> tree4(@Param("contractId") String contractId, @Param("parentId") String parentId);
+
+    List<WbsTreeContractTreeAllVO> tree5(@Param("contractId") Long contractId);
+
+    List<WbsTreeContractVO6> tree6(@Param("wbsId") Long wbsId, @Param("projectId") Long projectId, @Param("contractId") Long contractId);
+
+    List<TrialRecordZJTreeVO> trialRelationTree(@Param("projectId") Long projectId, @Param("contractId") Long contractId, @Param("wbsId") Long wbsId);
 
 
     List<WbsTreeContractVO3> selectLists(@Param("contractInfo") ContractInfo contractInfo, @Param("contractType") Integer contractType);
     List<WbsTreeContractVO3> selectLists(@Param("contractInfo") ContractInfo contractInfo, @Param("contractType") Integer contractType);
 
 
@@ -81,13 +66,4 @@ public interface ContractInfoMapper extends BaseMapper<ContractInfo> {
 
 
     List<UserContractInfoVO> userListByIds(@Param("ids") List<String> ids);
     List<UserContractInfoVO> userListByIds(@Param("ids") List<String> ids);
 
 
-    @Select("select quality_node_id from u_trial_self_quality_project where self_id = #{selfId}")
-    List<String> queryList(@Param("selfId") String selfId);
-
-    List<WbsTreeContractTreeAllVO> tree5(@Param("contractId") Long contractId);
-
-    List<WbsTreeContractVO6> tree6(@Param("wbsId") Long wbsId,
-                                  @Param("projectId") Long projectId,
-                                  @Param("contractId") Long contractId);
-
 }
 }

+ 19 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml

@@ -445,7 +445,7 @@
         d.node_name AS "nodeName",
         d.node_name AS "nodeName",
         d.node_type AS "nodeType",
         d.node_type AS "nodeType",
         d.id AS "value",
         d.id AS "value",
-        d.id AS "key"
+        d.id AS "key",
         sort
         sort
         FROM m_wbs_tree_contract d
         FROM m_wbs_tree_contract d
         WHERE
         WHERE
@@ -464,4 +464,22 @@
         ORDER BY d.sort
         ORDER BY d.sort
     </select>
     </select>
 
 
+    <select id="trialRelationTree" resultType="org.springblade.manager.vo.TrialRecordZJTreeVO">
+        SELECT
+            d.p_key_id AS "primaryKeyId",
+            d.id AS id,
+            d.full_name AS fullName,
+            d.parent_id AS "parentId"
+        FROM m_wbs_tree_contract d
+        WHERE
+            d.is_deleted = 0
+        AND d.status = 1
+        AND d.type = 1
+        AND wbs_type = 1
+        AND project_id = #{projectId}
+        AND contract_id = #{contractId}
+        AND wbs_id = #{wbsId}
+        ORDER BY d.sort,d.create_time
+    </select>
+
 </mapper>
 </mapper>

+ 2 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.xml

@@ -100,7 +100,7 @@
         and a.parent_id = 0
         and a.parent_id = 0
         and a.project_id = b.id
         and a.project_id = b.id
         and b.is_deleted = 0
         and b.is_deleted = 0
-        union ALL
+        union
         SELECT id, c.wbs_name, 1 as wbsType FROM m_wbs_info c where c.is_deleted = 0
         SELECT id, c.wbs_name, 1 as wbsType FROM m_wbs_info c where c.is_deleted = 0
         )d where 1=1
         )d where 1=1
         <if test="wbstype!=null and wbstype!=''">
         <if test="wbstype!=null and wbstype!=''">
@@ -163,6 +163,7 @@
         AND dept.project_id = #{wbsId}
         AND dept.project_id = #{wbsId}
         /* AND dept.type = 1
         /* AND dept.type = 1
         AND status = 1*/
         AND status = 1*/
+        GROUP BY dept.id
         ORDER BY dept.sort
         ORDER BY dept.sort
     </select>
     </select>
 
 

+ 2 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java

@@ -8,10 +8,7 @@ import org.springblade.manager.entity.TableInfo;
 import org.springblade.manager.entity.WbsTree;
 import org.springblade.manager.entity.WbsTree;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.injector.EasyBaseMapper;
 import org.springblade.manager.injector.EasyBaseMapper;
-import org.springblade.manager.vo.TreeNodeVOByTabType;
-import org.springblade.manager.vo.WbsNodeTableVO;
-import org.springblade.manager.vo.WbsTreePrivateVO;
-import org.springblade.manager.vo.WbsTreeVO2;
+import org.springblade.manager.vo.*;
 
 
 import java.util.List;
 import java.util.List;
 
 
@@ -86,7 +83,7 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
 
 
     void delTabProjectById(String pKeyId,String projectId);
     void delTabProjectById(String pKeyId,String projectId);
 
 
-    List<WbsTreePrivate> selectWbsTreeContractList(List<String> roleAndTabOwners,String tableType, String projectId, String wbsId, Long parentId, List<String> tableOwnerList);
+    List<WbsTreePrivateVO4> selectWbsTreeContractList(List<String> roleAndTabOwners, String tableType, String projectId, String wbsId, Long parentId, List<String> tableOwnerList);
 
 
     //删除表单信息
     //删除表单信息
     void delTableById(String pKeyId);
     void delTableById(String pKeyId);

+ 24 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -685,8 +685,30 @@
 
 
     </select>
     </select>
 
 
-    <select id="selectWbsTreeContractList" resultType="org.springblade.manager.entity.WbsTreePrivate">
-        SELECT * FROM
+    <select id="selectWbsTreeContractList" resultType="org.springblade.manager.vo.WbsTreePrivateVO4">
+        SELECT
+            p_key_id,
+            node_name,
+            node_type,
+            is_link_table,
+            is_tab_pdf,
+            is_buss_show,
+            tab_file_type,
+            wbs_id,
+            wbs_type,
+            html_url,
+            excel_id,
+            project_id,
+            type,
+            table_type,
+            table_owner,
+            init_table_name,
+            init_table_id,
+            fill_rate,
+            pdf_url,
+            sort,
+            create_time
+        FROM
         m_wbs_tree_private
         m_wbs_tree_private
         WHERE project_id = #{projectId}
         WHERE project_id = #{projectId}
         AND wbs_id = #{wbsId}
         AND wbs_id = #{wbsId}

+ 4 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IContractInfoService.java

@@ -48,6 +48,10 @@ public interface IContractInfoService extends BaseService<ContractInfo> {
 
 
     List<WbsTreeContractVO6> tree6List(String wbsId, String projectId, String contractId);
     List<WbsTreeContractVO6> tree6List(String wbsId, String projectId, String contractId);
 
 
+    List<WbsTreeContractVO6> tree6(String wbsId, String projectId, String contractId);
+
+    List<WbsTreeContractVO6> tree8(String wbsId, String projectId, String contractId);
+
     List<WbsTreeContractVO2> treeTwo(String projectId);
     List<WbsTreeContractVO2> treeTwo(String projectId);
 
 
     List<WbsTreeContractTreeVO> queryContractWbsTreeByContractIdAndType(String contractId, Integer wbsType, String parentId);
     List<WbsTreeContractTreeVO> queryContractWbsTreeByContractIdAndType(String contractId, Integer wbsType, String parentId);

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

@@ -17,6 +17,7 @@
 package org.springblade.manager.service;
 package org.springblade.manager.service;
 
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
+import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.api.R;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.entity.ExcelEditCallback;
 import org.springblade.manager.entity.ExcelEditCallback;
@@ -113,9 +114,13 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
     // 多个pdf 合并
     // 多个pdf 合并
     void getBussPdfs(String nodeId, String classify, String contractId, String projectId) throws Exception;
     void getBussPdfs(String nodeId, String classify, String contractId, String projectId) throws Exception;
 
 
-
     // 试验
     // 试验
 
 
+    /**
+     * 表格数据封装 - 试验
+     */
+    List<TableInfo> getTableInfoListTrial(JSONArray dataArray, String tabIds);
+
     /**
     /**
      * 结果信息持久化 - 试验
      * 结果信息持久化 - 试验
      */
      */

+ 3 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java

@@ -9,6 +9,7 @@ import org.springblade.manager.entity.WbsTree;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.vo.*;
 import org.springblade.manager.vo.*;
 
 
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.IOException;
 import java.util.List;
 import java.util.List;
 
 
@@ -60,7 +61,7 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
     R addWbsTreeContractInfo(String nodeId, String primaryKeyIds, long contractId);
     R addWbsTreeContractInfo(String nodeId, String primaryKeyIds, long contractId);
 
 
     // 向项目添加元素
     // 向项目添加元素
-    R addWbsTreeProjectInfo(String primaryKeyIds, String projectId);
+    R addWbsTreeProjectInfo(String primaryKeyIds, String projectId) throws IOException;
 
 
     R delTabProjectById(String primaryKeyIds, String projectId);
     R delTabProjectById(String primaryKeyIds, String projectId);
 
 
@@ -70,7 +71,7 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
     // 元素关联
     // 元素关联
     R saveLinkeTableInfo(String tabId, String linkids, String type, String wbsId);
     R saveLinkeTableInfo(String tabId, String linkids, String type, String wbsId);
 
 
-    List<WbsTreePrivate> searchNodeAllTable(String primaryKeyId, String type, String tableType, String contractId, String projectId, Integer isAdd, Long id);
+    List<WbsTreePrivateVO4> searchNodeAllTable(String primaryKeyId, String type, String tableType, String contractId, String projectId, Integer isAdd, Long id);
 
 
     Object getExcelHtml(String primaryKeyId) throws IOException;
     Object getExcelHtml(String primaryKeyId) throws IOException;
 
 

+ 136 - 14
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java

@@ -3,6 +3,8 @@ package org.springblade.manager.service.impl;
 import com.mixsmart.utils.StringUtils;
 import com.mixsmart.utils.StringUtils;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
+import org.springblade.archive.entity.ArchivesAuto;
+import org.springblade.archive.feign.ArchiveAutoClient;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.Func;
@@ -18,6 +20,7 @@ import org.springblade.manager.vo.*;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.util.*;
 import java.util.*;
+import java.util.stream.Collectors;
 
 
 @Service
 @Service
 @AllArgsConstructor
 @AllArgsConstructor
@@ -28,6 +31,8 @@ public class ArTreeContractInitServiceImpl {
 
 
     private final ProjectClient projectClient;
     private final ProjectClient projectClient;
 
 
+    private final ArchiveAutoClient archiveAutoClient;
+
     /**
     /**
      *
      *
      * @param tenantId
      * @param tenantId
@@ -100,9 +105,6 @@ public class ArTreeContractInitServiceImpl {
         }
         }
 
 
 
 
-        //设置祖先id
-        InitAncestors(archiveTreeContracts);
-
         return;
         return;
 
 
     }
     }
@@ -223,7 +225,7 @@ public class ArTreeContractInitServiceImpl {
      *
      *
      * @param archiveTreeContracts
      * @param archiveTreeContracts
      */
      */
-    public void InitAncestors(List<ArchiveTreeContract> archiveTreeContracts) {
+    public void InitAncestorsAndTreeSort(List<ArchiveTreeContract> archiveTreeContracts) {
         List<ArchiveTreeContractVO2> archiveTreeContractVO2List = new ArrayList<>();
         List<ArchiveTreeContractVO2> archiveTreeContractVO2List = new ArrayList<>();
         Map<Long,ArchiveTreeContractVO2> vo2Map = new LinkedHashMap<>();
         Map<Long,ArchiveTreeContractVO2> vo2Map = new LinkedHashMap<>();
         for (ArchiveTreeContract archiveTreeContract:archiveTreeContracts) {
         for (ArchiveTreeContract archiveTreeContract:archiveTreeContracts) {
@@ -231,6 +233,7 @@ public class ArTreeContractInitServiceImpl {
             treeContractVO2.setId(archiveTreeContract.getId());
             treeContractVO2.setId(archiveTreeContract.getId());
             treeContractVO2.setParentId(archiveTreeContract.getParentId());
             treeContractVO2.setParentId(archiveTreeContract.getParentId());
             treeContractVO2.setTitle(archiveTreeContract.getNodeName());
             treeContractVO2.setTitle(archiveTreeContract.getNodeName());
+            treeContractVO2.setSort(archiveTreeContract.getSort());
             archiveTreeContractVO2List.add(treeContractVO2);
             archiveTreeContractVO2List.add(treeContractVO2);
             vo2Map.put(treeContractVO2.getId(),treeContractVO2);
             vo2Map.put(treeContractVO2.getId(),treeContractVO2);
         }
         }
@@ -239,10 +242,14 @@ public class ArTreeContractInitServiceImpl {
 
 
         InitAncestors(trees.get(0),"0");
         InitAncestors(trees.get(0),"0");
 
 
+        InitTreeSort(trees.get(0), "");
+
         for (ArchiveTreeContract archiveTreeContract:archiveTreeContracts) {
         for (ArchiveTreeContract archiveTreeContract:archiveTreeContracts) {
             ArchiveTreeContractVO2 tmp = vo2Map.get(archiveTreeContract.getId());
             ArchiveTreeContractVO2 tmp = vo2Map.get(archiveTreeContract.getId());
             if (tmp != null ) {
             if (tmp != null ) {
                 archiveTreeContract.setAncestors(tmp.getAncestors());
                 archiveTreeContract.setAncestors(tmp.getAncestors());
+                archiveTreeContract.setTreeSort(tmp.getTreeSort());
+
             }
             }
         }
         }
     }
     }
@@ -264,6 +271,22 @@ public class ArTreeContractInitServiceImpl {
         }
         }
     }
     }
 
 
+    /**
+     *
+     * @param tree
+     */
+    public void InitTreeSort(ArchiveTreeContractVO2 tree, String treeSort) {
+        String localTreeSort = treeSort + tree.sortNum() ;
+        tree.setTreeSort(localTreeSort);
+
+        List<ArchiveTreeContractVO2> childrens = tree.getChildren();
+        if (childrens!= null) {
+            for (ArchiveTreeContractVO2 child :childrens) {
+                InitTreeSort(child,localTreeSort);
+            }
+        }
+    }
+
 
 
     public ArchiveTreeContractVO2 getTree(List<ArchiveTreeContract> archiveTreeContracts) {
     public ArchiveTreeContractVO2 getTree(List<ArchiveTreeContract> archiveTreeContracts) {
         List<ArchiveTreeContractVO2> archiveTreeContractVO2List = new ArrayList<>();
         List<ArchiveTreeContractVO2> archiveTreeContractVO2List = new ArrayList<>();
@@ -322,13 +345,22 @@ public class ArTreeContractInitServiceImpl {
         ForestNodeMerger.getTreeList(subTree,treeContractVO2s);
         ForestNodeMerger.getTreeList(subTree,treeContractVO2s);
 
 
         //2. 获取对应合同的树
         //2. 获取对应合同的树
-        List<WbsTreeContractVO6> wbsTreeContractVO6s =  contractInfoService.tree6List(wbsId.toString(),subTree.toString(),contractId.toString());
+        //List<WbsTreeContractVO6> wbsTreeContractVO6s =  contractInfoService.tree6List(wbsId.toString(),projectId.toString(),contractId.toString());
+
+        List<WbsTreeContractVO6> wbsTrees =  contractInfoService.tree8(wbsId.toString(),projectId.toString(),contractId.toString());
+        if (wbsTrees == null || wbsTrees.size() == 0) {
+            return archiveTreeContracts;
+        }
+
+        List<WbsTreeContractVO6> wbsTreeContractVO6s = new ArrayList<>();
+        ForestNodeMerger.getTreeList(wbsTrees.get(0),wbsTreeContractVO6s);
 
 
         List<WbsTreeContractVO6> addWbsNodes = new ArrayList<>();
         List<WbsTreeContractVO6> addWbsNodes = new ArrayList<>();
 
 
         //获取已经存在的
         //获取已经存在的
         Map<Long,ArchiveTreeContractVO2> extMap = new LinkedHashMap<>();
         Map<Long,ArchiveTreeContractVO2> extMap = new LinkedHashMap<>();
         Map<Long,Long> oldNewMap = new LinkedHashMap<>();
         Map<Long,Long> oldNewMap = new LinkedHashMap<>();
+        //Map<Long,WbsTreeContractVO6> wbsMap = new LinkedHashMap<>();
         for (ArchiveTreeContractVO2 ar :treeContractVO2s) {
         for (ArchiveTreeContractVO2 ar :treeContractVO2s) {
             if (ar.getExtId() !=null ) {
             if (ar.getExtId() !=null ) {
                 extMap.put(ar.getExtId(),ar);
                 extMap.put(ar.getExtId(),ar);
@@ -338,15 +370,13 @@ public class ArTreeContractInitServiceImpl {
 
 
         for (WbsTreeContractVO6 wbsTreeVO2:wbsTreeContractVO6s) {
         for (WbsTreeContractVO6 wbsTreeVO2:wbsTreeContractVO6s) {
             //不要中间交工,质量评定和开工报告作为目录节点
             //不要中间交工,质量评定和开工报告作为目录节点
-            if (wbsTreeVO2.getMajorDataType() != null ) {
-                if (wbsTreeVO2.getMajorDataType() == 1
-                        || wbsTreeVO2.getMajorDataType() == 2
-                        || wbsTreeVO2.getMajorDataType() == 3){
-                    continue;
-                }
+            //wbsMap.put(wbsTreeVO2.getId(),wbsTreeVO2);
+            if (!wbsTreeVO2.isProcessType()) {
+                continue;
             }
             }
+
             //只展示指定层级之上的
             //只展示指定层级之上的
-            if (wbsTreeVO2.getNodeType() > level){
+            if (!wbsTreeVO2.isMatchLevel(level)){
                 continue;
                 continue;
             }
             }
 
 
@@ -371,28 +401,120 @@ public class ArTreeContractInitServiceImpl {
             archiveTree.setContractId(contractId);
             archiveTree.setContractId(contractId);
             archiveTree.setId(oldNewMap.get(wbsTreeVO2.getId()));
             archiveTree.setId(oldNewMap.get(wbsTreeVO2.getId()));
             if (wbsTreeVO2.getParentId() == 0) {
             if (wbsTreeVO2.getParentId() == 0) {
-                wbsTreeVO2.setParentId(subTree.getId());
+                archiveTree.setParentId(subTree.getId());
             }else {
             }else {
                 archiveTree.setParentId(oldNewMap.get(wbsTreeVO2.getParentId()));
                 archiveTree.setParentId(oldNewMap.get(wbsTreeVO2.getParentId()));
             }
             }
 
 
+            if (archiveTree.getParentId() == null) {
+                continue;
+            }
+
             archiveTree.setNodeName(wbsTreeVO2.getTitle());
             archiveTree.setNodeName(wbsTreeVO2.getTitle());
 
 
             //设置关联
             //设置关联
             archiveTree.setExtType(1);
             archiveTree.setExtType(1);
             archiveTree.setExtId(wbsTreeVO2.getId());
             archiveTree.setExtId(wbsTreeVO2.getId());
+            archiveTree.setSort(wbsTreeVO2.getSort());
             archiveTree.setExtAttachId(subTree.getId());
             archiveTree.setExtAttachId(subTree.getId());
             archiveTree.setDisplayHierarchy(level.toString());
             archiveTree.setDisplayHierarchy(level.toString());
             archiveTree.setIsDeleted(0);
             archiveTree.setIsDeleted(0);
             //上传节点
             //上传节点
-            if (wbsTreeVO2.getNodeType().longValue() ==  level) {
+            if (wbsTreeVO2.getNodeType() != null && wbsTreeVO2.getNodeType().longValue() ==  level) {
                 archiveTree.setIsStorageNode(1);
                 archiveTree.setIsStorageNode(1);
             }
             }
             archiveTreeContracts.add(archiveTree);
             archiveTreeContracts.add(archiveTree);
 
 
         }
         }
 
 
+        //ArchiveTreeContractVO2 ar = getTree(archiveTreeContracts);
+
         return archiveTreeContracts;
         return archiveTreeContracts;
     }
     }
 
 
+    void syncArchiveAutoList(List<ArchiveTreeContract> archiveTreeContracts,List<ContractInfo> contracts) {
+        List<ArchivesAuto> archivesAutos = new ArrayList<>();
+
+        Map<Long,ContractInfo> contractMap = new LinkedHashMap<>();
+
+        for (ContractInfo contractInfo: contracts) {
+            if (contractInfo.getContractType() == 1 && contractMap.get(0L) == null) {
+                contractMap.put(0L,contractInfo);
+            }
+
+            contractMap.put(contractInfo.getId(),contractInfo);
+        }
+
+
+        List<ArchiveTreeContract> storageList = archiveTreeContracts.stream()
+                .filter(e->e.getIsStorageNode()!= null && e.getIsStorageNode() == 1).collect(Collectors.toList());
+
+        for (ArchiveTreeContract storage: storageList) {
+
+
+            ArchivesAuto archivesAuto = new ArchivesAuto();
+            InitArchivesAuto(archivesAuto,storage,contractMap);
+            archivesAutos.add(archivesAuto);
+        }
+        archiveAutoClient.saveArchiveAutoByNodes(archivesAutos);
+    }
+
+    /**
+     *
+     * @param archivesAuto
+     * @param archiveTreeContract
+     */
+    public void InitArchivesAuto(ArchivesAuto archivesAuto,ArchiveTreeContract archiveTreeContract,Map<Long,ContractInfo> contractMap) {
+
+
+        archivesAuto.setName(archiveTreeContract.getNodeName());
+        archivesAuto.setNodeId(archiveTreeContract.getId());
+        archivesAuto.setProjectId(archiveTreeContract.getProjectId());
+        archivesAuto.setContractId(archiveTreeContract.getContractId());
+
+
+        archivesAuto.setUnit(getUnit(archiveTreeContract,contractMap));
+
+        //要设置对
+        archivesAuto.setTreeSort(archiveTreeContract.getTreeSort());
+
+        archivesAuto.setIsArchive(0);
+        archivesAuto.setIsDeleted(0);
+    }
+
+    /**
+     * 获取节点对应的单位
+     * @param archiveTreeContract
+     * @param contractInfo
+     * @return
+     */
+    public String getUnit(ArchiveTreeContract archiveTreeContract,Map<Long,ContractInfo> contractMap){
+
+        ContractInfo contractInfo = contractMap.get(archiveTreeContract.getContractId());
+        if (contractInfo == null ) {
+            contractInfo = contractMap.get(0L);
+        }
+
+        String unit = "";
+        if (StringUtils.isEmpty(archiveTreeContract.getTreeCode())) {
+            unit = contractInfo.getContractorUnitName();
+        }else {
+            if (archiveTreeContract.getTreeCode().equals("C")) {
+                unit = contractInfo.getConstructionUnitName();
+            }else if (archiveTreeContract.getTreeCode().equals("S")) {
+                unit = contractInfo.getSupervisionUnitName();
+            }else {
+                if (contractInfo.getContractType()== 2) {
+                    unit = contractInfo.getSupervisionUnitName();
+                }else if (contractInfo.getContractType() == 1) {
+                    unit = contractInfo.getConstructionUnitName();
+                }else {
+                    unit = contractInfo.getContractorUnitName();
+                }
+            }
+
+        }
+        return unit;
+    }
+
 }
 }

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

@@ -109,11 +109,15 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 
 
 		List<ArchiveTreeContract> addNodes = arTreeContractInitService.getContractProcExtNodes(tenantId,projectId,wbsId,newTree);
 		List<ArchiveTreeContract> addNodes = arTreeContractInitService.getContractProcExtNodes(tenantId,projectId,wbsId,newTree);
 		archiveTreeContracts.addAll(addNodes);
 		archiveTreeContracts.addAll(addNodes);
+
+		//初始化祖先节点和排序
+		arTreeContractInitService.InitAncestorsAndTreeSort(archiveTreeContracts);
 		//todo 同步质检资料动态节点,处理文件提名
 		//todo 同步质检资料动态节点,处理文件提名
 
 
 		//todo 同步立卷规则
 		//todo 同步立卷规则
 
 
 		//todo 同步划分树节点到案卷列表
 		//todo 同步划分树节点到案卷列表
+		arTreeContractInitService.syncArchiveAutoList(archiveTreeContracts,contractInfoVOS);
 
 
 		this.saveBatch(archiveTreeContracts);
 		this.saveBatch(archiveTreeContracts);
 		return true;
 		return true;

+ 5 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java

@@ -398,14 +398,12 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
         //遍历构建
         //遍历构建
         for (WbsTreeVO2 wbsTreeVO2:wbsTreeVO2List) {
         for (WbsTreeVO2 wbsTreeVO2:wbsTreeVO2List) {
             //只展示指定层级之上的
             //只展示指定层级之上的
-            if (wbsTreeVO2.getMajorDataType() != null ) {
-                if (wbsTreeVO2.getMajorDataType() == 1
-                    || wbsTreeVO2.getMajorDataType() == 2
-                    || wbsTreeVO2.getMajorDataType() == 3){
-                    continue;
-                }
+
+            if (!wbsTreeVO2.isProcessType()) {
+                continue;
             }
             }
-            if (wbsTreeVO2.getNodeType() > level){
+
+            if (!wbsTreeVO2.isMatchLevel(level)){
                 continue;
                 continue;
             }
             }
             ArchiveTreeVO2 archiveTree = new ArchiveTreeVO2();
             ArchiveTreeVO2 archiveTree = new ArchiveTreeVO2();

+ 63 - 18
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -195,6 +195,22 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
         return baseMapper.tree6(Long.parseLong(wbsId), Long.parseLong(projectId), Long.parseLong(contractId));
         return baseMapper.tree6(Long.parseLong(wbsId), Long.parseLong(projectId), Long.parseLong(contractId));
     }
     }
 
 
+    @Override
+    public List<WbsTreeContractVO6> tree6(String wbsId, String projectId, String contractId) {
+        List<WbsTreeContractVO6> wbsTreeContractVOS = baseMapper.tree6(Long.parseLong(wbsId), Long.parseLong(projectId), Long.parseLong(contractId));
+        return buildWbsTreeByStream6(wbsTreeContractVOS);
+    }
+
+    @Override
+    public List<WbsTreeContractVO6> tree8(String wbsId, String projectId, String contractId) {
+        List<WbsTreeContractVO6> wbsTreeContractVOS = baseMapper.tree6(Long.parseLong(wbsId), Long.parseLong(projectId), Long.parseLong(contractId));
+        List<WbsTreeContractVO6> wbsTreeVO2s = ForestNodeMerger.merge(wbsTreeContractVOS);
+        List<WbsTreeContractVO6> list = wbsTreeVO2s.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
+
+        return list;
+    }
+
+
     @Override
     @Override
     public List<WbsTreeContractVO> tree(String wbsId, String projectId, String contractId) {
     public List<WbsTreeContractVO> tree(String wbsId, String projectId, String contractId) {
         List<WbsTreeContractVO> wbsTreeContractVOS = baseMapper.tree2(Long.parseLong(wbsId), Long.parseLong(projectId), Long.parseLong(contractId), null, null, null);
         List<WbsTreeContractVO> wbsTreeContractVOS = baseMapper.tree2(Long.parseLong(wbsId), Long.parseLong(projectId), Long.parseLong(contractId), null, null, null);
@@ -226,6 +242,25 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
         }
         }
     }
     }
 
 
+    public List<WbsTreeContractVO6> buildWbsTreeByStream6(List<WbsTreeContractVO6> wbsTreeVO2s) {
+        List<WbsTreeContractVO6> list = wbsTreeVO2s.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
+        Map<Long, List<WbsTreeContractVO6>> map = wbsTreeVO2s.stream().collect(Collectors.groupingBy(WbsTreeContractVO6::getParentId));
+        this.recursionFnTree6(list, map);
+        return list;
+    }
+
+    public void recursionFnTree6(List<WbsTreeContractVO6> list, Map<Long, List<WbsTreeContractVO6>> map) {
+        for (WbsTreeContractVO6 wbsTreeContractVO : list) {
+            List<WbsTreeContractVO6> childrenList = map.get(wbsTreeContractVO.getId());
+            wbsTreeContractVO.setChildren(childrenList);
+            if (childrenList != null && childrenList.size() > 0) {
+                wbsTreeContractVO.setHasChildren(true);
+                recursionFnTree6(childrenList, map);
+            }
+        }
+    }
+
+
     public void recursionFnTreeAll(List<WbsTreeContractTreeAllVO> list, Map<Long, List<WbsTreeContractTreeAllVO>> map) {
     public void recursionFnTreeAll(List<WbsTreeContractTreeAllVO> list, Map<Long, List<WbsTreeContractTreeAllVO>> map) {
         for (WbsTreeContractTreeAllVO wbsTreeContractVO : list) {
         for (WbsTreeContractTreeAllVO wbsTreeContractVO : list) {
             List<WbsTreeContractTreeAllVO> childrenList = map.get(wbsTreeContractVO.getId());
             List<WbsTreeContractTreeAllVO> childrenList = map.get(wbsTreeContractVO.getId());
@@ -484,28 +519,38 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
 
 
     @Override
     @Override
     public Map<String, Object> trialRelationTree(String wbsId, String projectId, String contractId, String selfId) {
     public Map<String, Object> trialRelationTree(String wbsId, String projectId, String contractId, String selfId) {
-        //合同段树
-        List<WbsTreeContractVO> wbsTreeContractVOS = baseMapper.tree2(null, Long.parseLong(projectId), Long.parseLong(contractId), null, null, null);
-        List<WbsTreeContractVO> wbsTreeContractVOList = buildWbsTreeByStream(wbsTreeContractVOS);
-        //是否勾选-试验关联工程部位信息
-        /*List<String> listResult = new ArrayList<>();
-        if (StringUtils.isNotEmpty(selfId)) {
-            List<String> list = baseMapper.queryList(selfId);
-            if (list.size() > 0) {
-                for (WbsTreeContractVO wbsTreeContractVO : wbsTreeContractVOS) {
-                    for (String s : list) {
-                        if (wbsTreeContractVO.getPrimaryKeyId().equals(s)) {
-                            listResult.add(s);
-                        }
-                    }
-                }
+        //当前合同段施工质检树
+        List<TrialRecordZJTreeVO> wbsTreeContractVOS = baseMapper.trialRelationTree(Long.parseLong(projectId), Long.parseLong(contractId), Long.parseLong(wbsId));
+        List<TrialRecordZJTreeVO> trialRecordZJTreeVOS = buildWbsTreeByStreamTrialRecordZJTree(wbsTreeContractVOS);
+        ContractInfo contractInfo = jdbcTemplate.query("select contract_name from m_contract_info where id = " + contractId, new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
+        for (TrialRecordZJTreeVO node : trialRecordZJTreeVOS) {
+            if (node.getParentId() == 0 && contractInfo != null) {
+                node.setFullName(contractInfo.getContractName());
+                break;
             }
             }
-        }*/
+        }
         Map<String, Object> maps = new HashMap<>();
         Map<String, Object> maps = new HashMap<>();
-        maps.put("treeContractAll", wbsTreeContractVOList);
-        //maps.put("isSelectedStatus", listResult.stream().distinct().collect(Collectors.toList()));
+        maps.put("treeContractAll", trialRecordZJTreeVOS);
         return maps;
         return maps;
     }
     }
 
 
+    private List<TrialRecordZJTreeVO> buildWbsTreeByStreamTrialRecordZJTree(List<TrialRecordZJTreeVO> wbsTreeVO2s) {
+        List<TrialRecordZJTreeVO> list = wbsTreeVO2s.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
+        Map<Long, List<TrialRecordZJTreeVO>> map = wbsTreeVO2s.stream().collect(Collectors.groupingBy(TrialRecordZJTreeVO::getParentId));
+        this.recursionFnTreeTrialRecordZJTree(list, map);
+        return list;
+    }
+
+    private void recursionFnTreeTrialRecordZJTree(List<TrialRecordZJTreeVO> list, Map<Long, List<TrialRecordZJTreeVO>> map) {
+        for (TrialRecordZJTreeVO trialRecordZJTreeVO : list) {
+            List<TrialRecordZJTreeVO> childrenList = map.get(trialRecordZJTreeVO.getId());
+            if (childrenList != null && childrenList.size() > 0) {
+                trialRecordZJTreeVO.setChildren(childrenList);
+                trialRecordZJTreeVO.setHasChildren(true);
+                recursionFnTreeTrialRecordZJTree(childrenList, map);
+            }
+        }
+    }
+
 
 
 }
 }

+ 173 - 59
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -42,6 +42,7 @@ import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 import org.jsoup.select.Elements;
+import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
 import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.entity.TrialSelfInspectionRecord;
 import org.springblade.business.entity.TrialSelfInspectionRecord;
 import org.springblade.business.feign.ContractLogClient;
 import org.springblade.business.feign.ContractLogClient;
@@ -720,7 +721,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         if (ListUtils.isNotEmpty(tableInfoList)) {
         if (ListUtils.isNotEmpty(tableInfoList)) {
             //施工资料填报
             //施工资料填报
             String pkids = "";
             String pkids = "";
-            StringBuilder log =new StringBuilder("异常:");
+            StringBuilder log = new StringBuilder("异常:");
             try {
             try {
                 for (TableInfo tableInfo : tableInfoList) {
                 for (TableInfo tableInfo : tableInfoList) {
                     WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
                     WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
@@ -798,23 +799,23 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 e.printStackTrace();
                 e.printStackTrace();
                 return R.fail("操作失败");
                 return R.fail("操作失败");
             }
             }
-            if(log.length()>5){
+            if (log.length() > 5) {
                 return R.fail(reason(log.toString()));
                 return R.fail(reason(log.toString()));
             }
             }
         }
         }
         return R.success("操作成功");
         return R.success("操作成功");
     }
     }
 
 
-    public String reason(String log){
+    public String reason(String log) {
         /*字段过短提示*/
         /*字段过短提示*/
         StringBuilder sb = new StringBuilder();
         StringBuilder sb = new StringBuilder();
-        String[] part= log.split("@@");
-        for(String p:part){
-            Matcher m = RegexUtils.matcher("(m_\\d{14}_\\d{19})\\((.+)\\)VALUES\\(([^)]+)\\).+column'(key_\\d{0,2})'",p.replaceAll("[\\n\\s]*",""));
-            if(m.find()){
-                List<Map<String,Object>> result=this.jdbcTemplate.queryForList("select CONCAT(a.tab_ch_name,'&',b.e_name) tf from m_table_info a join m_wbs_form_element b on b.f_id=a.id where a.tab_en_name='"+m.group(1)+"' and  b.e_key='"+m.group(4)+"'");
-                if(result.size()>0){
-                   sb.append("【").append(result.get(0).values().stream().map(String::valueOf).collect(Collectors.joining(","))).append("】");
+        String[] part = log.split("@@");
+        for (String p : part) {
+            Matcher m = RegexUtils.matcher("(m_\\d{14}_\\d{19})\\((.+)\\)VALUES\\(([^)]+)\\).+column'(key_\\d{0,2})'", p.replaceAll("[\\n\\s]*", ""));
+            if (m.find()) {
+                List<Map<String, Object>> result = this.jdbcTemplate.queryForList("select CONCAT(a.tab_ch_name,'&',b.e_name) tf from m_table_info a join m_wbs_form_element b on b.f_id=a.id where a.tab_en_name='" + m.group(1) + "' and  b.e_key='" + m.group(4) + "'");
+                if (result.size() > 0) {
+                    sb.append("【").append(result.get(0).values().stream().map(String::valueOf).collect(Collectors.joining(","))).append("】");
                 }
                 }
             }
             }
         }
         }
@@ -1070,14 +1071,14 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         reData.remove("contractId");
         reData.remove("contractId");
         reData.remove("pkeyId");
         reData.remove("pkeyId");
         reData.remove("projectId");
         reData.remove("projectId");
-        reData.put("tabGroupId",wbsTreeContract.getTabGroupId());
+        reData.put("tabGroupId", wbsTreeContract.getTabGroupId());
         return R.data(reData);
         return R.data(reData);
     }
     }
 
 
     @Override
     @Override
     public R getBussPdfInfo(Long pkeyId) throws Exception {
     public R getBussPdfInfo(Long pkeyId) throws Exception {
         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-       // String file_path = "/Users/hongchuangyanfa/Desktop/";
+        // String file_path = "/Users/hongchuangyanfa/Desktop/";
         WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
         WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
                 .eq(WbsTreeContract::getPKeyId, pkeyId));
                 .eq(WbsTreeContract::getPKeyId, pkeyId));
 
 
@@ -1423,6 +1424,92 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         jdbcTemplate.execute(sql);
         jdbcTemplate.execute(sql);
     }
     }
 
 
+    @Override
+    public List<TableInfo> getTableInfoListTrial(JSONArray dataArray, String tabIds) {
+        if (dataArray != null && !dataArray.isEmpty()) {
+            List<TableInfo> result = new ArrayList<>();
+            for (int m = 0; m < dataArray.size(); m++) {
+                TableInfo tableInfo = new TableInfo();
+                JSONObject dataInfo2 = dataArray.getJSONObject(m);
+                tableInfo.setPkeyId(dataInfo2.getString("pkeyId"));
+
+                if (!tabIds.contains(tableInfo.getPkeyId())) {
+                    //隐藏表不做处理
+                    continue;
+                }
+
+                tableInfo.setContractId(dataInfo2.getString("contractId"));
+                tableInfo.setProjectId(dataInfo2.getString("projectId"));
+
+                //填报的类型,施工或监理
+                tableInfo.setClassify(dataInfo2.getString("classify"));
+                //设置首件信息
+                this.setFirstData(dataInfo2, tableInfo);
+                //设置日志信息
+                this.setTheLogData(dataInfo2, tableInfo);
+
+                dataInfo2.fluentRemove("contractId")
+                        .fluentRemove("pkeyId")
+                        .fluentRemove("p_key_id")
+                        .fluentRemove("projectId")
+                        .fluentRemove("classify")
+                        .fluentRemove("pickerKey")
+                        .fluentRemove("id")
+                        .fluentRemove("isFirst")
+                        .fluentRemove("firstNodeId")
+                        .fluentRemove("isTheLog")
+                        .fluentRemove("theLogId")
+                        .fluentRemove("linkTabIds")
+                        .fluentRemove("recordTime")
+                        .fluentRemove("businessId")
+                        .fluentRemove("sourceUrl")
+                        .fluentRemove("pdfUrl")
+                        .fluentRemove("firstFileName")
+                        .fluentRemove("");
+                //计算数据
+                LinkedHashMap<String, List<String>> dataMap = dataInfo2.keySet().stream().filter(e -> e.contains("__")).collect(Collectors.groupingBy(e -> e.split("__")[0], LinkedHashMap<String, List<String>>::new, Collectors.toList()));
+                LinkedHashMap<String, String> dataMap2 = new LinkedHashMap<>();
+                //字段组合
+                for (String k : dataMap.keySet()) {
+                    if (dataMap.get(k).size() > 1 && !dataMap.get(k).contains("000Z")) {
+                        String[] ziduan = dataMap.get(k).toArray(new String[]{});
+                        String temp = "";
+                        for (int i = 0; i < ziduan.length - 1; i++) {
+                            for (int j = 0; j < ziduan.length - i - 1; j++) {
+                                int tr = Integer.parseInt((ziduan[j].split("__")[1]).split("_")[0]);
+                                int td = Integer.parseInt(ziduan[j].split("__")[1].split("_")[1]);
+                                int tr_1 = Integer.parseInt(ziduan[j + 1].split("__")[1].split("_")[0]);
+                                int td_1 = Integer.parseInt(ziduan[j + 1].split("__")[1].split("_")[1]);
+                                if (tr > tr_1 && td == td_1) { //纵向排序
+                                    temp = ziduan[j];
+                                    ziduan[j] = ziduan[j + 1];
+                                    ziduan[j + 1] = temp;
+                                }
+                            }
+                        }
+                        StringBuilder lastStr = new StringBuilder(dataInfo2.getString(ziduan[0]) + "_^_" + ziduan[0].split("__")[1]);
+                        for (int i = 1; i < ziduan.length; i++) {
+                            String keyData = dataInfo2.getString(ziduan[i]);
+                            if (!keyData.equals("")) {
+                                lastStr.append("☆").append(dataInfo2.getString(ziduan[i])).append("_^_").append(ziduan[i].split("__")[1]);
+                            }
+
+                        }
+                        dataMap2.put(k, lastStr.toString());
+                    } else {
+                        String dataVal = dataInfo2.getString(dataMap.get(k).get(0));
+                        dataMap2.put(k, dataVal + "_^_" + dataMap.get(k).get(0).split("__")[1]);
+                    }
+                }
+                dataMap2.put("p_key_id", tableInfo.getPkeyId());
+                tableInfo.setDataMap(dataMap2);
+                result.add(tableInfo);
+            }
+            return result;
+        }
+        return null;
+    }
+
     /**
     /**
      * 试验 获取填报信息
      * 试验 获取填报信息
      */
      */
@@ -1457,39 +1544,75 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             File file1 = ResourceUtil.getFile(wbsTreePrivate.getHtmlUrl());
             File file1 = ResourceUtil.getFile(wbsTreePrivate.getHtmlUrl());
             String htmlString = IoUtil.readToString(new FileInputStream(file1));
             String htmlString = IoUtil.readToString(new FileInputStream(file1));
             Document doc = Jsoup.parse(htmlString);
             Document doc = Jsoup.parse(htmlString);
-        } catch (FileNotFoundException e) {
-            e.printStackTrace();
-        }
+            //匹配
+            Elements bgHB = doc.select("el-input[placeholder~=报告编号.*]");
+            Elements jlBH = doc.select("el-input[placeholder~=记录编号.*]");
+
+            TrialSelfInspectionRecord record = jdbcTemplate.query("select record_no,report_no from u_trial_self_inspection_record where id = " + groupId, new BeanPropertyRowMapper<>(TrialSelfInspectionRecord.class)).stream().findAny().orElse(null);
+            if (record != null) {
+                //报告编号
+                if (bgHB.size() >= 1) {
+                    for (Element element : bgHB) {
+                        int trIndex = Integer.parseInt(element.attr("trindex"));
+                        if (trIndex <= 6) {
+                            reData.put(element.attr("keyName"), ObjectUtils.isNotEmpty(record.getReportNo()) ? record.getReportNo() : "");
+                        }
+                    }
+                }
+                //记录编号
+                if (jlBH.size() >= 1) {
+                    for (Element element : jlBH) {
+                        int trIndex = Integer.parseInt(element.attr("trindex"));
+                        if (trIndex <= 6) {
+                            reData.put(element.attr("keyName"), ObjectUtils.isNotEmpty(record.getRecordNo()) ? record.getRecordNo() : "");
+                        }
+                    }
+                }
+            }
 
 
-        if (dataIn.size() >= 1) {
-            Map<String, Object> mysqlData = dataIn.get(0);
-            for (String key : mysqlData.keySet()) {
-                String tabVal = mysqlData.get(key) + "";
+            if (dataIn.size() >= 1) {
+                Map<String, Object> mysqlData = dataIn.get(0);
+                for (String key : mysqlData.keySet()) {
+                    String tabVal = mysqlData.get(key) + "";
 
 
-                // 时间段处理
-                if (StringUtils.isNotEmpty(tabVal) && !tabVal.equals("null")) {
-                    if (tabVal.contains("T") && tabVal.contains(".000Z]")) {
-                        String[] tabData = tabVal.split("_\\^_");
+                    // 时间段处理
+                    if (StringUtils.isNotEmpty(tabVal) && !tabVal.equals("null")) {
+                        if (tabVal.contains("T") && tabVal.contains(".000Z]")) {
+                            String[] tabData = tabVal.split("_\\^_");
 
 
-                        if (reData.containsKey("pickerKey")) {
-                            String pickerKey = reData.get("pickerKey") + "," + key + "__" + tabData[1];
-                            reData.put("pickerKey", pickerKey);
-                        } else {
-                            reData.put("pickerKey", key + "__" + tabData[1]);
-                        }
+                            if (reData.containsKey("pickerKey")) {
+                                String pickerKey = reData.get("pickerKey") + "," + key + "__" + tabData[1];
+                                reData.put("pickerKey", pickerKey);
+                            } else {
+                                reData.put("pickerKey", key + "__" + tabData[1]);
+                            }
 
 
-                        String sql = tabData[0];
-                        sql = sql.replaceAll("\\[", "['");
-                        sql = sql.replaceAll("]", "']");
-                        sql = sql.replaceAll("000Z,", "000Z',");
-                        sql = sql.replaceAll(", 20", ", '20");
-                        //   sql = sql.replaceAll("'", "");
-                        if (StringUtils.isNotEmpty(tabData[0])) {
-                            reData.put(key + "__" + tabData[1], sql);
-                        }
-                    } else if (tabVal.contains("T") && tabVal.contains(".000Z")) { //时间
-                        // 时间和字符串合作
-                        if (tabVal.contains("☆")) {
+                            String sql = tabData[0];
+                            sql = sql.replaceAll("\\[", "['");
+                            sql = sql.replaceAll("]", "']");
+                            sql = sql.replaceAll("000Z,", "000Z',");
+                            sql = sql.replaceAll(", 20", ", '20");
+                            //   sql = sql.replaceAll("'", "");
+                            if (StringUtils.isNotEmpty(tabData[0])) {
+                                reData.put(key + "__" + tabData[1], sql);
+                            }
+                        } else if (tabVal.contains("T") && tabVal.contains(".000Z")) { //时间
+                            // 时间和字符串合作
+                            if (tabVal.contains("☆")) {
+                                String[] mysql = tabVal.split("☆");
+                                for (String data : mysql) {
+                                    String[] tabData = data.split("_\\^_");
+                                    if (StringUtils.isNotEmpty(tabData[0])) {
+                                        reData.put(key + "__" + tabData[1], tabData[0]);
+                                    }
+                                }
+                            } else {
+                                String[] tabData = tabVal.split("_\\^_");
+                                if (StringUtils.isNotEmpty(tabData[0])) {
+                                    reData.put(key + "__" + tabData[1], tabData[0]);
+                                }
+                            }
+                        } else if (tabVal.contains("☆")) {
                             String[] mysql = tabVal.split("☆");
                             String[] mysql = tabVal.split("☆");
                             for (String data : mysql) {
                             for (String data : mysql) {
                                 String[] tabData = data.split("_\\^_");
                                 String[] tabData = data.split("_\\^_");
@@ -1497,30 +1620,19 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                     reData.put(key + "__" + tabData[1], tabData[0]);
                                     reData.put(key + "__" + tabData[1], tabData[0]);
                                 }
                                 }
                             }
                             }
-                        } else {
+                        } else if (tabVal.contains("_^_")) {
                             String[] tabData = tabVal.split("_\\^_");
                             String[] tabData = tabVal.split("_\\^_");
                             if (StringUtils.isNotEmpty(tabData[0])) {
                             if (StringUtils.isNotEmpty(tabData[0])) {
                                 reData.put(key + "__" + tabData[1], tabData[0]);
                                 reData.put(key + "__" + tabData[1], tabData[0]);
                             }
                             }
+                        } else {
+                            reData.put(key, tabVal);
                         }
                         }
-                    } else if (tabVal.contains("☆")) {
-                        String[] mysql = tabVal.split("☆");
-                        for (String data : mysql) {
-                            String[] tabData = data.split("_\\^_");
-                            if (StringUtils.isNotEmpty(tabData[0])) {
-                                reData.put(key + "__" + tabData[1], tabData[0]);
-                            }
-                        }
-                    } else if (tabVal.contains("_^_")) {
-                        String[] tabData = tabVal.split("_\\^_");
-                        if (StringUtils.isNotEmpty(tabData[0])) {
-                            reData.put(key + "__" + tabData[1], tabData[0]);
-                        }
-                    } else {
-                        reData.put(key, tabVal);
                     }
                     }
                 }
                 }
             }
             }
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
         }
         }
 
 
         // 获取默认值
         // 获取默认值
@@ -1735,7 +1847,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         List<Map<String, Object>> bussDataInfoTrial = this.getBussDataInfoTrial(id, pkeyId);
         List<Map<String, Object>> bussDataInfoTrial = this.getBussDataInfoTrial(id, pkeyId);
         Map<String, Object> DataInfo = bussDataInfoTrial.stream().findAny().orElse(null);
         Map<String, Object> DataInfo = bussDataInfoTrial.stream().findAny().orElse(null);
 
 
-        // 获取excel流 和 html流
+        //获取excel流 和 html流
         Workbook wb = new Workbook();
         Workbook wb = new Workbook();
         wb.loadFromMHtml(CommonUtil.getOSSInputStream(excelTab.getFileUrl()));
         wb.loadFromMHtml(CommonUtil.getOSSInputStream(excelTab.getFileUrl()));
         //获取工作表
         //获取工作表
@@ -1956,12 +2068,13 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         //获取有权限的节点信息
         //获取有权限的节点信息
         String sql = "select p_key_id,html_url,table_type from m_wbs_tree_private where is_deleted = 0 and p_key_id in (" + tabIds + ")";
         String sql = "select p_key_id,html_url,table_type from m_wbs_tree_private where is_deleted = 0 and p_key_id in (" + tabIds + ")";
         List<WbsTreePrivate> queryList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
         List<WbsTreePrivate> queryList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
-        //合并pdfUrlsList,报告单在前记录表在后
         List<String> dataPdfUrls = new ArrayList<>();
         List<String> dataPdfUrls = new ArrayList<>();
+
         //报告单
         //报告单
         List<WbsTreePrivate> reportTable = queryList.stream().filter(f -> f.getTableType() == 2).collect(Collectors.toList());
         List<WbsTreePrivate> reportTable = queryList.stream().filter(f -> f.getTableType() == 2).collect(Collectors.toList());
         //记录表
         //记录表
         List<WbsTreePrivate> recordTable = queryList.stream().filter(f -> f.getTableType() == 1).collect(Collectors.toList());
         List<WbsTreePrivate> recordTable = queryList.stream().filter(f -> f.getTableType() == 1).collect(Collectors.toList());
+
         if (queryList.size() > 0) {
         if (queryList.size() > 0) {
             for (WbsTreePrivate report : reportTable) {
             for (WbsTreePrivate report : reportTable) {
                 //没有excel表单的不生成pdf
                 //没有excel表单的不生成pdf
@@ -1974,6 +2087,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 }
                 }
             }
             }
             for (WbsTreePrivate record : recordTable) {
             for (WbsTreePrivate record : recordTable) {
+                //没有excel表单的不生成pdf
                 if (StringUtils.isNotEmpty(record.getHtmlUrl())) {
                 if (StringUtils.isNotEmpty(record.getHtmlUrl())) {
                     //生成记录表pdf
                     //生成记录表pdf
                     String bussPdfInfo = this.getBussPDFTrial(record.getPKeyId(), contractId, id);
                     String bussPdfInfo = this.getBussPDFTrial(record.getPKeyId(), contractId, id);

+ 40 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -1,5 +1,6 @@
 package org.springblade.manager.service.impl;
 package org.springblade.manager.service.impl;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -12,6 +13,7 @@ import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 import org.jsoup.select.Elements;
+import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -28,6 +30,7 @@ import org.springblade.manager.mapper.*;
 import org.springblade.manager.service.ITableInfoService;
 import org.springblade.manager.service.ITableInfoService;
 import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.vo.*;
 import org.springblade.manager.vo.*;
+import org.springblade.system.cache.ParamCache;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -37,6 +40,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.io.File;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.IOException;
 import java.util.*;
 import java.util.*;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Callable;
@@ -1535,7 +1539,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     }
     }
 
 
     @Override
     @Override
-    public R addWbsTreeProjectInfo(String primaryKeyIds, String projectId) {
+    public R addWbsTreeProjectInfo(String primaryKeyIds, String projectId) throws IOException {
         if (com.alibaba.cloud.commons.lang.StringUtils.isEmpty(projectId)) {
         if (com.alibaba.cloud.commons.lang.StringUtils.isEmpty(projectId)) {
             return R.fail("projectId不能为空");
             return R.fail("projectId不能为空");
         }
         }
@@ -1545,11 +1549,44 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
 
         List<Long> longs = Func.toLongList(primaryKeyIds);
         List<Long> longs = Func.toLongList(primaryKeyIds);
         for (Long id : longs) {
         for (Long id : longs) {
-
+            //获取添加的表信息
             TableInfo tableInfo = tableInfoService.getById(id);
             TableInfo tableInfo = tableInfoService.getById(id);
             WbsTreePrivate wbsPrivate = new WbsTreePrivate();
             WbsTreePrivate wbsPrivate = new WbsTreePrivate();
             Long pKeyId1 = SnowFlakeUtil.getId();
             Long pKeyId1 = SnowFlakeUtil.getId();
             wbsPrivate.setPKeyId(pKeyId1);
             wbsPrivate.setPKeyId(pKeyId1);
+            //查询wbs_tree_contract当前项目下是否已存在相同表
+            WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectOne(new LambdaQueryWrapper<WbsTreePrivate>()
+                    .eq(WbsTreePrivate::getProjectId, projectId)
+                    .eq(WbsTreePrivate::getInitTableName, tableInfo.getTabEnName())
+                    .orderByDesc(WbsTreePrivate::getUpdateTime)
+                    .last("limit 1"));
+            //如果存在则复制最新表的配置,调整表单的值
+            if (wbsTreePrivate != null) {
+                if (StringUtils.isNotEmpty(wbsTreePrivate.getExcelId().toString())) {
+                    wbsPrivate.setExcelId(wbsTreePrivate.getExcelId());
+                }
+                if (StringUtils.isNotEmpty(wbsTreePrivate.getHtmlUrl())){
+                    //复制生成html
+                    String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+                    File file_in = ResourceUtil.getFile(wbsTreePrivate.getHtmlUrl());
+//                    File file_in = ResourceUtil.getFile("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1636553444422582272.html");
+                    String filecode = SnowFlakeUtil.getId() + "";
+                    String thmlUrl = file_path + "/privateUrl/" + filecode + ".html";
+//                    String thmlUrl =  "C:\\Users\\泓创研发01\\Desktop\\privateUrl\\9527.html";
+                    File file_out = ResourceUtil.getFile(thmlUrl);
+                    FileUtil.copy(file_in, file_out);
+                    wbsPrivate.setHtmlUrl(thmlUrl);
+                }
+                List<TextdictInfo> list = textDictInfoService.list(new LambdaQueryWrapper<TextdictInfo>()
+                        .eq(TextdictInfo::getTabId, wbsTreePrivate.getPKeyId()));
+                if (list.size() >= 0 ){
+                    list.stream().forEach(l->{
+                        l.setId(SnowFlakeUtil.getId());
+                        l.setTabId(wbsPrivate.getPKeyId().toString());
+                    });
+                    textDictInfoService.saveBatch(list);
+                }
+            }
 
 
             wbsPrivate.setTableOwner(tableInfo.getTableOwner());
             wbsPrivate.setTableOwner(tableInfo.getTableOwner());
             wbsPrivate.setInitTableId(tableInfo.getId() + "");
             wbsPrivate.setInitTableId(tableInfo.getId() + "");
@@ -1633,9 +1670,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             wbsTree.setInitTableId(tableInfo.getId());
             wbsTree.setInitTableId(tableInfo.getId());
             wbsTree.setFillRate(tableInfo.getFillRate());
             wbsTree.setFillRate(tableInfo.getFillRate());
             wbsTree.setTableOwner(tableInfo.getTableOwner());
             wbsTree.setTableOwner(tableInfo.getTableOwner());
-
             wbsTree.setWbsId(wbsId);
             wbsTree.setWbsId(wbsId);
-
             wbsTreeMapper.updateById(wbsTree);
             wbsTreeMapper.updateById(wbsTree);
         } else if (type.equals("2")) {
         } else if (type.equals("2")) {
             TableInfo tableInfo = tableInfoService.getById(tabId);
             TableInfo tableInfo = tableInfoService.getById(tabId);
@@ -1695,7 +1730,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     }
     }
 
 
     @Override
     @Override
-    public List<WbsTreePrivate> searchNodeAllTable(String primaryKeyId, String tableOwner, String tableType, String contractId, String projectId, Integer isAdd, Long id) {
+    public List<WbsTreePrivateVO4> searchNodeAllTable(String primaryKeyId, String tableOwner, String tableType, String contractId, String projectId, Integer isAdd, Long id) {
         WbsTreePrivate wbsTreePrivate = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
         WbsTreePrivate wbsTreePrivate = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
                 .select(WbsTreePrivate::getProjectId, WbsTreePrivate::getWbsId, WbsTreePrivate::getId)
                 .select(WbsTreePrivate::getProjectId, WbsTreePrivate::getWbsId, WbsTreePrivate::getId)
                 .eq(WbsTreePrivate::getPKeyId, primaryKeyId));
                 .eq(WbsTreePrivate::getPKeyId, primaryKeyId));