Bladeren bron

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

yangyj 2 jaren geleden
bovenliggende
commit
4b381bc7b5
47 gewijzigde bestanden met toevoegingen van 1875 en 1146 verwijderingen
  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="module" module-name="blade-user-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="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" />

+ 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 String mileage;
+	private String mileage;
 	private Integer fileType;
 	private Integer size;
-	private String procsort;
-	private String nodeSort;
+	private String treeSort;
 	private Integer isOpen;
 	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 = "检测类别")
     private Integer detectionCategory;
 
-    @ApiModelProperty(value = "是否上传合格证 '0'=是 ‘1’=否")
+    @ApiModelProperty(value = "是否上传合格证 '1'=是 '0'=否")
     private Integer isUploadCertificate;
 
     @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为已关联")
     private Boolean isExperiment;
 
+    /**
+     *  资料主键
+     */
+    @ApiModelProperty(value = "information-query主键")
+    private String id;
+
     public NeiYeLedgerVO(String... values){
         this.unitProject = values[0];
         this.partProject = values[1];
@@ -93,6 +99,7 @@ public class NeiYeLedgerVO {
         this.isEvaluate = Boolean.parseBoolean(values[9]);
         this.isExperiment = Boolean.parseBoolean(values[10]);
         this.reportNumber = values[11];
+        this.id = values[12];
     }
 
     public NeiYeLedgerVO(){}

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

@@ -20,6 +20,83 @@
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
     <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: com.baomidou:mybatis-plus: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: 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-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.google.guava:guava:30.1.1-jre" 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.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.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: 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.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" />
@@ -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.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: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.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" />
@@ -136,8 +192,8 @@
     <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.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-databind:2.11.4" 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 treeSort;
+
 
 
 	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;
 
-import com.alibaba.fastjson.JSONObject;
+import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
 import org.springblade.manager.entity.ExcelTab;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -21,8 +21,8 @@ public interface ExcelTabClient {
     ExcelTab getById(@RequestParam String id);
 
     @PostMapping(API_PREFIX + "/saveTabData")
-    String saveTabData(@RequestParam Integer isBatchSave,
-                       @RequestBody JSONObject dataInfo,
+    String saveTabData(@RequestBody TrialSelfInspectionRecordDTO dto,
+                       @RequestParam Integer isBatchSave,
                        @RequestParam Integer type,
                        @RequestParam String tableType,
                        @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;
 
-import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.manager.vo.WbsTreePrivateVO;
@@ -39,11 +38,8 @@ public interface WbsTreePrivateClient {
     @PostMapping(API_PREFIX + "/queryWbsTreePrivateByProjectIdAndId")
     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")
-    boolean copyBussTab(@RequestParam Long pKeyId);
+    boolean copyBussTab(@RequestParam Long pKeyId, @RequestParam Long id);
 
     @PostMapping(API_PREFIX + "/removeBussTabInfoById")
     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 sort;
+
+	//树形排序
+	private String treeSort;
+
 	public String toString() {
 		return "TreeNode(parentId=" + this.getParentId()
 				+ ",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;
     }
 
+    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
     public Boolean getHasChildren() {
         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;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.springblade.manager.entity.WbsTreePrivate;
 
+import java.io.Serializable;
 import java.util.Map;
 
 @Data
-@EqualsAndHashCode(callSuper = true)
-public class WbsTreePrivateVO4 extends WbsTreePrivate{
+public class WbsTreePrivateVO4 implements Serializable {
     private static final long serialVersionUID = 1L;
 
     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;
     }
 
+    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
     public Boolean getHasChildren() {
         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="fileType" property="fileType"/>
         <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="ischeck" property="ischeck"/>
     </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)
     @ApiOperation(value = "批量打印")
     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(",")));
         //pdf集合
@@ -952,8 +959,15 @@ public class InformationWriteQueryController extends BladeController {
     @PostMapping("/batchDownloadFileToZip")
     @ApiOperationSupport(order = 19)
     @ApiOperation(value = "批量下载")
-    public void batchDownloadFileToZip(String ids, HttpServletResponse response) {
+    public R<String> batchDownloadFileToZip(String ids, HttpServletResponse response) {
         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(","))));
             if (result != null && result.size() > 0) {
@@ -968,6 +982,9 @@ public class InformationWriteQueryController extends BladeController {
                     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()) ? "已审批" : "未上报",
                             vo.getEvaluate(),
                             vo.getIsExperiment(),
-                            vo.getReportNumber()));
+                            vo.getReportNumber(),
+                            vo.getInformationQueryId())
+                    );
                 }
                 //转换为page信息
                 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.jackson.JsonUtil;
 import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.flow.core.entity.BladeFlow;
 import org.springblade.flow.core.feign.NewFlowClient;
@@ -61,475 +62,483 @@ import java.util.stream.Collectors;
 @Api(value = "任务审核主表", tags = "任务审核主表接口")
 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){
@@ -545,70 +554,70 @@ public class TaskController extends BladeController {
 //					//最终分页数据
 //					return this.getIPageR(query, flowIPage, finalFlowList);
 //				} 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.ResourceUtil;
 import org.springblade.manager.entity.TrialSelfDataRecord;
+import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.feign.WbsTreePrivateClient;
 import org.springblade.manager.vo.TableFileVO;
 import org.springblade.manager.vo.WbsTreePrivateVO;
@@ -44,6 +45,8 @@ import java.io.FileNotFoundException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 
 @RestController
@@ -178,16 +181,31 @@ public class TrialDetectionController extends BladeController {
 
     @GetMapping("/self/show-buss-tab")
     @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")
     @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")

+ 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);
 
-    boolean rawMaterialSubmitRelation(RawMaterialSubmitRelationDTO dto, TrialSelfInspectionRecord obj) throws FileNotFoundException;
-
     String selfPrintPdf(String ids) throws FileNotFoundException;
 
     String selfPrintNullPdf(String ids) throws Exception;
 
     @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;
 
@@ -42,6 +43,5 @@ public interface ITrialSelfInspectionRecordService extends BaseService<TrialSelf
 
     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) {
                 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);

+ 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.manager.entity.WbsTreePrivate;
 import org.springblade.resource.feign.NewIOSSClient;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletResponse;
@@ -72,7 +73,7 @@ public class TrialDeviceUseServiceImpl extends BaseServiceImpl<TrialDeviceUseMap
             dto.setFactoryNumber(trialDeviceInfo.getFactoryNumber());
         }
         TrialDeviceUse trialDeviceUse = BeanUtil.copyProperties(dto, TrialDeviceUse.class);
-        if (trialDeviceUse != null){
+        if (trialDeviceUse != null) {
             return this.saveOrUpdate(trialDeviceUse);
         }
         return false;
@@ -309,6 +310,7 @@ public class TrialDeviceUseServiceImpl extends BaseServiceImpl<TrialDeviceUseMap
         return this.saveBatch(listData, 1000);
     }
 
+    @Async
     public void addDeviceUseInfo(TrialSelfInspectionRecordDTO dto) {
         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.Wrappers;
 import com.spire.xls.*;
+import io.swagger.models.auth.In;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.time.DateUtils;
 import org.springblade.business.dto.*;
@@ -58,9 +59,7 @@ import java.util.stream.Collectors;
 
 @Service
 @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 TrialMaterialMobilizationMapper trialMaterialMobilizationMapper;
@@ -80,70 +79,109 @@ public class TrialSelfInspectionRecordServiceImpl
 
     @Override
     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 {
-                    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 {
@@ -223,12 +261,20 @@ public class TrialSelfInspectionRecordServiceImpl
             for (Attach attach : query) {
                 if (StringUtils.isNotEmpty(sampleAncillaryDocumentsVO.getOtherAccessories()) && sampleAncillaryDocumentsVO.getOtherAccessories().equals(attach.getLink())) {
                     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())) {
                     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())) {
                     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;
     }
 
-    @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
     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));
@@ -469,63 +452,62 @@ public class TrialSelfInspectionRecordServiceImpl
 
     @Override
     @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
     public String addBussFile(MultipartFile file, Long pkeyId, String nodeId, String contractId, String
             projectId, String classify, String id, String tableType) throws Exception {
@@ -671,93 +672,84 @@ public class TrialSelfInspectionRecordServiceImpl
 
     @Override
     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);
 
         if (ObjectUtil.isNotEmpty(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);
         }
-
-        //返回当前记录id
         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
-    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())) {
             throw new ServiceException("请先保存填报数据后,再关联取样信息");
         }
@@ -816,11 +808,86 @@ public class TrialSelfInspectionRecordServiceImpl
         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) {
         StringSPUtils spUtils = new StringSPUtils();
         List<TrialSelfInspectionRecord> result = baseMapper.selectAll(dto.getNodeId(), dto.getContractId());
         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")) {
             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);
         if (org.apache.commons.lang.StringUtils.isNotEmpty(dto.getStartTime()) && org.apache.commons.lang.StringUtils.isNotEmpty(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
     public String certification(String pdfUrl, String fileName, String contractId) {
-        try{
+        try {
             //根据当前合同段获取相关的证书
             List<SignPfxFile> pfxFiles = this.signPfxClient.querySignPfxByUserIdOrContractId("", contractId);
-            if(pfxFiles == null || pfxFiles.size() <= 0){
+            if (pfxFiles == null || pfxFiles.size() <= 0) {
                 return NOT_PFX_OR_FILE;
             }
             //查询合同段信息
@@ -113,17 +113,17 @@ public class EVisaServiceImpl implements EVisaService {
 
             //找到合同章
             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;
                         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;
                         break;
@@ -131,7 +131,7 @@ public class EVisaServiceImpl implements EVisaService {
                 }
             }
             //没有找到合同章,直接返回
-            if(contractPfx == null){
+            if (contractPfx == null) {
                 return NOT_PFX_OR_FILE;
             }
 
@@ -144,7 +144,7 @@ public class EVisaServiceImpl implements EVisaService {
             //获取PDF文件
             PDDocument document = PDDocument.load(pdfInputStream);
             int page = document.getPages().getCount();
-            for(int i = 0; i < page; i ++){
+            for (int i = 0; i < page; i++) {
                 SealStrategyVO vo = new SealStrategyVO();
                 vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + contractPfx.getCertificatePassword());
                 vo.setSealPassword(contractPfx.getCertificatePassword());
@@ -155,7 +155,7 @@ public class EVisaServiceImpl implements EVisaService {
                 vo.setSealType("2");
                 vo.setLx("100");
                 vo.setLy("100");
-                vo.setPage(( i + 1) + "");
+                vo.setPage((i + 1) + "");
                 sealStrategyVOS.add(vo);
             }
             SealPdfVO pdfVO = new SealPdfVO();
@@ -166,33 +166,33 @@ public class EVisaServiceImpl implements EVisaService {
             //兼容大文件签章
             Object[] result;
             //大于50M的单个文件采用大文件签章处理
-            if(fileByte.length > 52428800){
+            if (fileByte.length > 52428800) {
                 result = null;
             } else {
                 //普通文件签章
                 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)));
                     //重新上传
                     BladeFile bladeFile = this.newIOSSClient.uploadFileByInputStream(files);
-                    if(bladeFile != null){
+                    if (bladeFile != null) {
                         return SUCCESS + "@@@@" + bladeFile.getLink();
                     } else {
                         return ERROR;
                     }
                 } else {
                     String s = result[1].toString();
-                    return s.contains("600619") ? "认证失败! " + fileName + "-文件存在无效签名。" : "认证失败!"+"原因:" + s;
+                    return s.contains("600619") ? "认证失败! " + fileName + "-文件存在无效签名。" : "认证失败!" + "原因:" + s;
                 }
             } else {
                 //电签失败 ,接口返回认证失败
                 return "认证失败!认证接口调用异常";
             }
 
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
         }
 
@@ -201,6 +201,7 @@ public class EVisaServiceImpl implements EVisaService {
 
     /**
      * 合同章 签字
+     *
      * @param task
      * @param finalPdfUrl
      * @return
@@ -209,36 +210,36 @@ public class EVisaServiceImpl implements EVisaService {
     public String eVisaContractSeal(EVisaTaskApprovalVO task, String finalPdfUrl) {
         //获取任务对应表格的电签配置(合同张)
         List<JSONObject> eVisaConfigList = this.taskClient.queryBusinessTableEVisaConfig(task.getParallelProcessInstanceId(), "true");
-        if(eVisaConfigList == null || eVisaConfigList.size() == 0){
+        if (eVisaConfigList == null || eVisaConfigList.size() == 0) {
             //没有电签配置,默认当前任务为不签字审批,返回成功
             return finalPdfUrl;
         }
 
         String sysBatch = ParamCache.getValue(CommonConstant.SYS_USER_TASK_BATCH);
         int batch = 2;
-        if(CommonUtil.checkIsBigDecimal(sysBatch)){
+        if (CommonUtil.checkIsBigDecimal(sysBatch)) {
             batch = new Integer(sysBatch);
         }
 
         //确定合同段并获取合同章
         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;
         }
 
         //上锁
         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<>();
-                for(JSONObject eVisaConfig : eVisaConfigList){
+                for (JSONObject eVisaConfig : eVisaConfigList) {
                     //找到类型与之对应的合同章
                     Iterator<SignPfxFile> iterator = userPfxList.iterator();
-                    while (iterator.hasNext()){
+                    while (iterator.hasNext()) {
                         SignPfxFile next = iterator.next();
-                        if(eVisaConfig.getString("type").equals(next.getPfxType())){
+                        if (eVisaConfig.getString("type").equals(next.getPfxType())) {
                             //设置签章策略
                             SealStrategyVO vo = new SealStrategyVO();
                             vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + next.getId());
@@ -268,17 +269,17 @@ public class EVisaServiceImpl implements EVisaService {
                 byte[] fileByte = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(finalPdfUrl));
                 //执行电签
                 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);
-                        if(bladeFile != null){
+                        if (bladeFile != null) {
                             finalPdfUrl = bladeFile.getLink();
                         }
                     }
                 }
-            }catch (Exception e){
+            } catch (Exception e) {
                 e.printStackTrace();
             }
         }
@@ -291,6 +292,7 @@ public class EVisaServiceImpl implements EVisaService {
 
     /**
      * 个人-电签信息
+     *
      * @param task
      * @return
      */
@@ -301,38 +303,44 @@ public class EVisaServiceImpl implements EVisaService {
         //用户默认的电签批次参数
         String sysBatch = ParamCache.getValue(CommonConstant.SYS_USER_TASK_BATCH);
         int batch = 2;
-        if(CommonUtil.checkIsBigDecimal(sysBatch)){
+        if (CommonUtil.checkIsBigDecimal(sysBatch)) {
             batch = new Integer(sysBatch);
         }
 
         //根据任务类型获取对应的文件信息
         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;
         }
 
         //获取任务对应表格的电签配置
         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();
         }
 
         //获取当前用户的证书信息
         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;
         }
 
         //上锁
-        if(DistributedRedisLock.acquire(AuthUtil.getUserId().toString(), batch)){
-            try{
+        if (DistributedRedisLock.acquire(AuthUtil.getUserId().toString(), batch)) {
+            try {
                 //获取需要签章的数据
                 List<TaskApprovalVO.ApprovalFile> files = taskFile.getApprovalFileList();
                 //这里的文件只会是一张拼接好的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<>();
                     for (JSONObject eVisaConfig : eVisaConfigList) {
@@ -357,12 +365,12 @@ public class EVisaServiceImpl implements EVisaService {
                     byte[] fileByte = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(file.getFileUrl()));
                     //执行电签
                     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);
-                            if(bladeFile != null){
+                            if (bladeFile != null) {
                                 resultMessage = SUCCESS + "@@@@" + bladeFile.getLink();
                             } else {
                                 resultMessage = E_VISA_ERROR;
@@ -373,10 +381,8 @@ public class EVisaServiceImpl implements EVisaService {
                     } else {
                         resultMessage = E_VISA_ERROR;
                     }
-
                 }
-
-            }catch (Exception e){
+            } catch (Exception e) {
                 e.printStackTrace();
             }
         }
@@ -388,6 +394,7 @@ public class EVisaServiceImpl implements EVisaService {
 
     /**
      * 东方 中讯
+     *
      * @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];
-        try{
+        try {
             PaperlessClient paperlessClient = new PaperlessClient(SIGN_HOST, SIGN_PORT, 300000, 36000000);
             paperlessClient.setSSL(false);
             //*****************************************************************************
-            CompoundSealPdfListDetachedRequest compoundSealPdfListDetachedRequest = new  CompoundSealPdfListDetachedRequest();
+            CompoundSealPdfListDetachedRequest compoundSealPdfListDetachedRequest = new CompoundSealPdfListDetachedRequest();
 
             RequestHead requestHead = new RequestHead();
             //业务流水号 非空
@@ -471,7 +478,7 @@ public class EVisaServiceImpl implements EVisaService {
             String channelCode = "";
 
             //设置属性
-            requestHead.setBasicInfo(transactionNo, organizationCode,operatorCode,channelCode);
+            requestHead.setBasicInfo(transactionNo, organizationCode, operatorCode, channelCode);
 
             compoundSealPdfListDetachedRequest.setHead(requestHead);
 
@@ -489,8 +496,8 @@ public class EVisaServiceImpl implements EVisaService {
             requestBody.setPdfBeans(pdfBeans);
             //***********************构造机构章策略 ********************************
             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;
             }
             requestBody.setSealStrategies(sealStrategies);
@@ -508,26 +515,26 @@ public class EVisaServiceImpl implements EVisaService {
             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();
-            if(ClientConstants.CODE_SUCCESS.equals(responseHead.getCode())){
+            if (ClientConstants.CODE_SUCCESS.equals(responseHead.getCode())) {
                 List<PdfBean4Response> pdfBeanList = responseBody.getPdfBeans();
-                if(pdfBeanList!=null && pdfBeanList.size()>0){
+                if (pdfBeanList != null && pdfBeanList.size() > 0) {
                     PdfBean4Response pdfBean4Response = pdfBeanList.get(0);
                     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[1] = compoundSealPdfListDetachedResponse.toString();
                 result[2] = responseHead.getMessage();
             }
 
-        } catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
-            logger.info("【电签模块】{}","电签签章接口调用异常");
+            logger.info("【电签模块】{}", "电签签章接口调用异常");
             e.printStackTrace();
             return null;
         }
@@ -539,16 +546,16 @@ public class EVisaServiceImpl implements EVisaService {
      * 构造机构章签章策略
      * 使用 :1-印章绑定的图片
      */
-    private List<SealStrategy> generateSealStrategies(List<SealStrategyVO> strategyVoList){
+    private List<SealStrategy> generateSealStrategies(List<SealStrategyVO> strategyVoList) {
         List<SealStrategy> sealStrategies = new ArrayList<>();
 
-        if(strategyVoList == null || strategyVoList.size() <= 0){
+        if (strategyVoList == null || strategyVoList.size() <= 0) {
             return null;
         }
 
         //构建策略
-        for(SealStrategyVO vo : strategyVoList){
-            try{
+        for (SealStrategyVO vo : strategyVoList) {
+            try {
                 SealStrategy sealStrategy = new SealStrategy();
 
                 // 使用图片签章
@@ -572,9 +579,9 @@ public class EVisaServiceImpl implements EVisaService {
                 String visible = "1";
                 sealStrategy.setVisible(visible);
 
-                if(!"authentication".equals(vo.getImageUrl())){
+                if (!"authentication".equals(vo.getImageUrl())) {
                     String imageUrl = vo.getImageUrl();
-                    if(StringUtils.isEmpty(imageUrl)){
+                    if (StringUtils.isEmpty(imageUrl)) {
                         logger.info("签章图片url为null,签章人员:" + vo.getSealPerson());
                         return null;
                     }
@@ -584,10 +591,10 @@ public class EVisaServiceImpl implements EVisaService {
                     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);
                     }
 
@@ -596,7 +603,7 @@ public class EVisaServiceImpl implements EVisaService {
 
                     if (imageData != null) {
                         //图片进行Base64编码/
-                        String imageDataString =  new String(Base64.encode(imageData), StandardCharsets.UTF_8);
+                        String imageDataString = new String(Base64.encode(imageData), StandardCharsets.UTF_8);
                         sealStrategy.setSealImage(imageDataString);
                     }
                 } else {
@@ -604,7 +611,7 @@ public class EVisaServiceImpl implements EVisaService {
                     sealStrategy.setSealImage(EVisaConstant.base64String);
                 }
 
-                sealStrategy.setSealMiscInfo(vo.getSealPerson(), vo.getSealLocation(),  vo.getSealReason());
+                sealStrategy.setSealMiscInfo(vo.getSealPerson(), vo.getSealLocation(), vo.getSealReason());
 
                 //关键字签章
                 sealStrategy.setSealType(vo.getSealType());
@@ -614,14 +621,14 @@ public class EVisaServiceImpl implements EVisaService {
                     sealStrategy.setOffsetY(vo.getOffSetY());
                 } else if (vo.getSealType().equals("2")) {
                     //设置PDF坐标原点,签章图片定位点   默认为PDF左下角,签章图片定位为左下角
-                    if(StringUtils.isNotEmpty(vo.getIsCenterCoordinate())){
+                    if (StringUtils.isNotEmpty(vo.getIsCenterCoordinate())) {
                         sealStrategy.setIsCenterCoordinate(vo.getIsCenterCoordinate());
                     }
                     sealStrategy.setSignWithCoordinate(vo.getPage(), vo.getLx(), vo.getLy());
                 }
 
                 sealStrategies.add(sealStrategy);
-            }catch (Exception e){
+            } catch (Exception e) {
                 e.printStackTrace();
             }
         }
@@ -635,7 +642,7 @@ public class EVisaServiceImpl implements EVisaService {
         BufferedImage gridImage = ImageIO.read(new ByteArrayInputStream(bytes));
         final String formatName = "png";
         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();
             ImageWriteParam writeParam = writer.getDefaultWriteParam();
             ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
@@ -683,7 +690,7 @@ public class EVisaServiceImpl implements EVisaService {
      */
     @Override
     public String createSeal(EVisaMakeSealVO vo) {
-        try{
+        try {
             PaperlessClient paperlessClient = new PaperlessClient(SIGN_HOST, SIGN_PORT, 3000, 20000);
             paperlessClient.setSSL(false);
 
@@ -710,7 +717,7 @@ public class EVisaServiceImpl implements EVisaService {
             String privateKeyPassword = vo.getPfxPassword();
             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());
 
             // 构造sealInfo
@@ -727,27 +734,27 @@ public class EVisaServiceImpl implements EVisaService {
             MakeSealRequest requestBean = new MakeSealRequest();
             requestBean.setHead(requestHeadBean);
             requestBean.setBody(requestBodyBean);
-            logger.info("【电签模块】{}","创建印章请求Request:"+requestBean);
+            logger.info("【电签模块】{}", "创建印章请求Request:" + requestBean);
             // ------调用接口------
             ResponseDto responseDto = paperlessClient.execute(requestBean);
 
             // 接收响应报文对象
             MakeSealResponse responseBean = (MakeSealResponse) responseDto;
-            logger.info("【电签模块】{}","创建印章响应Response:"+requestBean);
+            logger.info("【电签模块】{}", "创建印章响应Response:" + requestBean);
 
             // 响应报文头
             ResponseHead responseHeadBean = responseBean.getHead();
             // 响应报文体
             MakeSealResponseBody responseBodyBean = responseBean.getBody();
-            if(responseBodyBean != null){
+            if (responseBodyBean != null) {
                 logger.info("【电签模块】{}", "创建印章成功==========certDn: " + responseBodyBean.getCertDn() + " ; message: " + responseHeadBean.getMessage());
                 //请求结果
                 return responseHeadBean.getMessage();
-            } else if(responseHeadBean.getMessage().contains("is exist")) {
+            } else if (responseHeadBean.getMessage().contains("is exist")) {
                 logger.info("【电签模块】{}", responseHeadBean.getMessage());
                 return "error";
             }
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
         }
 
@@ -756,7 +763,7 @@ public class EVisaServiceImpl implements EVisaService {
 
     @Override
     public List<CertBean> onlineCheckSeal(String pdfUrl) {
-        try{
+        try {
             PaperlessClient paperlessClient = new PaperlessClient(SIGN_HOST, SIGN_PORT, 300000, 1800000);
             paperlessClient.setSSL(false);
 
@@ -773,7 +780,7 @@ public class EVisaServiceImpl implements EVisaService {
             //渠道编码 可为空
             String channelCode = EVisaConstant.channelCode;
             //设置属性
-            requestHead.setBasicInfo(transactionNo, organizationCode,operatorCode,channelCode);
+            requestHead.setBasicInfo(transactionNo, organizationCode, operatorCode, channelCode);
 
             verifyPdfSealRequest.setHead(requestHead);
             /*==================================================================================*/
@@ -798,18 +805,18 @@ public class EVisaServiceImpl implements EVisaService {
             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();
 
-            if(ClientConstants.CODE_SUCCESS.equals(responseHead.getCode())){
+            if (ClientConstants.CODE_SUCCESS.equals(responseHead.getCode())) {
                 return responseBody.getCertBeans();
             } else {
-                logger.info("【电签模块】{}","验签接口响应code:" + responseHead.getCode());
+                logger.info("【电签模块】{}", "验签接口响应code:" + responseHead.getCode());
                 return null;
             }
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             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="module" module-name="blade-user-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" 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" />

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

@@ -50,6 +50,11 @@
             <artifactId>blade-business-api</artifactId>
             <version>${bladex.project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-archive-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
         <dependency>
             <groupId>com.jfirer</groupId>
             <artifactId>baseutil</artifactId>
@@ -144,6 +149,12 @@
             <version>20.4</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-archive-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
     <build>
         <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.Element;
 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.InformationQueryClient;
 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.system.cache.ParamCache;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
@@ -1413,7 +1416,7 @@ public class ExcelTabController extends BladeController {
         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);
         colkeys = stringObjectMap.get("colkeys") + "";
         // 复制表数据
@@ -1529,7 +1532,6 @@ public class ExcelTabController extends BladeController {
             if (stringObjectMap.get("e_visa_pdf_url") != null) {
                 //优先使用电签的pdf
                 pdfUrl = stringObjectMap.get("e_visa_pdf_url");
-
             }
 
             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 groupIds = groupId;
-        for(int i=1;i<dataArray.size();i++){
+        for (int i = 1; i < dataArray.size(); 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(
                     Wrappers.<WbsTreeContract>lambdaQuery()
                             .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);
                 }
             }
@@ -1651,10 +1655,10 @@ public class ExcelTabController extends BladeController {
             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加载
         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;
 
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.mixsmart.utils.StringUtils;
 import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
+import org.springblade.business.entity.TrialSelfInspectionRecord;
 import org.springblade.business.vo.SaveLogContractVO;
 import org.springblade.common.utils.SnowFlakeUtil;
 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.tool.api.R;
 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.StringUtil;
-import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.dto.WbsTreePrivateDTO2;
 import org.springblade.manager.dto.WbsTreePrivateDTO3;
 import org.springblade.manager.entity.*;
@@ -574,7 +570,7 @@ public class WbsTreePrivateController extends BladeController {
             @ApiImplicitParam(name = "primaryKeyIds", value = "表的注解ids(多个以,隔开)", 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);
     }
 
@@ -615,19 +611,18 @@ public class WbsTreePrivateController extends BladeController {
     @ApiOperationSupport(order = 22)
     @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) {
-        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) {
-            //新增
+            //试验新增
             if ((new Integer(1).equals(isAdd)) && ObjectUtil.isEmpty(id)) {
                 //按钮状态
                 treePrivate.setPdfUrl(null);
-                treePrivate.setIsBussShow(1);
+                //treePrivate.setIsBussShow(1); //新增时通过项目wbs表的isBussShow字段单独控制
                 treePrivate.setIsTabPdf(1);
                 treePrivate.setTabFileType(1);
             }
 
-            //编辑
+            //试验编辑
             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;
@@ -636,12 +631,12 @@ public class WbsTreePrivateController extends BladeController {
                 //按钮状态
                 TrialSelfDataRecord record = map.get(treePrivate.getPKeyId());
                 if (record != null) {
-                    treePrivate.setIsBussShow(record.getIsBussShow());
+                    treePrivate.setIsBussShow(record.getIsBussShow()); //编辑时通过试验记录关联关系控制
                     treePrivate.setIsTabPdf(record.getIsTabPdf());
                     treePrivate.setTabFileType(record.getIsTabFileType());
                 } else {
                     treePrivate.setPdfUrl(null);
-                    treePrivate.setIsBussShow(1);
+                    //treePrivate.setIsBussShow(1); //没有记录的就根据项目wbs表的isBussShow字段单独控制
                     treePrivate.setIsTabPdf(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.JSONObject;
 import lombok.AllArgsConstructor;
+import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
 import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.entity.TrialSelfInspectionRecord;
 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.utils.SnowFlakeUtil;
 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.ObjectUtil;
 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.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
+import org.springframework.beans.BeanUtils;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.io.File;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @RestController
@@ -44,24 +51,22 @@ public class ExcelTabClientImpl implements ExcelTabClient {
     }
 
     @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);
         String nodeId = table.getString("nodeId");
         String projectId = table.getString("projectId");
         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);
 
-        /**
-         * ------公式填充------
-         */
+        //------公式填充------
         try {
             this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeId));
         } catch (Exception e) {
@@ -69,13 +74,11 @@ public class ExcelTabClientImpl implements ExcelTabClient {
         }
 
         if (isBatchSave == 0) {
-            /**
-             * ------单表PDF保存------
-             */
+            //------单表PDF保存------
             TableInfo tableInfo = tableInfoList.stream().findAny().orElse(null);
             assert tableInfo != null;
             if (tabIds.contains(tableInfo.getPkeyId())) {
-
+                //构造pdf
                 excelTabService.getBussPDFTrial(Long.valueOf(tableInfo.getPkeyId()), contractId, id);
 
                 //重新合并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.mixsmart.utils.StringUtils;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
 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.utils.BeanUtil;
 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.service.IWbsTreePrivateService;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.manager.vo.WbsTreePrivateVO;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.*;
@@ -65,23 +66,8 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
     }
 
     @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()
                 .eq(WbsTreePrivate::getId, wbsTreePrivate.getId())
@@ -116,7 +102,7 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
         Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(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);
         if (dataList != null && dataList.size() >= 1) {
             Map<String, Object> dataMap2 = dataList.get(0);
@@ -129,8 +115,8 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
 
             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()) {
                 if (!(dataMap2.get(keys) + "").equals("null")) {
@@ -143,7 +129,6 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
 
             sqlInfo = sqlInfo + keyStr + ") VALUES (" + valStr + ")";
 
-            //huangJN 保存成功后调用生成资料查询列表数据
             jdbcTemplate.execute(sqlInfo);
         }
         wbsTreePrivateService.save(wbsTreePrivate);
@@ -174,7 +159,7 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
     }
 
     @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)) {
             LambdaQueryWrapper<WbsTreePrivate> wrapper = Wrappers.lambdaQuery();
             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="interface_type" property="interfaceType"/>
         <result column="sort" property="sort"/>
+        <result column="tree_sort" property="treeSort"/>
         <result column="remark" property="remark"/>
         <result column="project_type" property="projectType"/>
         <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;
 
 import org.apache.ibatis.annotations.Param;
-import org.apache.ibatis.annotations.Select;
 import org.springblade.manager.dto.FindAllUserByConditionDTO;
 import org.springblade.manager.entity.ContractInfo;
 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<ContractInfoVO> selectContractInfoPage(IPage page,
-                                                ContractInfoVO contractInfo);
+    List<ContractInfoVO> selectContractInfoPage(IPage page, ContractInfoVO contractInfo);
 
     List<ContractlnfoCountVO> selectContractInfoCount();
 
@@ -28,44 +26,31 @@ public interface ContractInfoMapper extends BaseMapper<ContractInfo> {
 
     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();
 
-    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);
 
-    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);
 
@@ -81,13 +66,4 @@ public interface ContractInfoMapper extends BaseMapper<ContractInfo> {
 
     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_type AS "nodeType",
         d.id AS "value",
-        d.id AS "key"
+        d.id AS "key",
         sort
         FROM m_wbs_tree_contract d
         WHERE
@@ -464,4 +464,22 @@
         ORDER BY d.sort
     </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>

+ 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.project_id = b.id
         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
         )d where 1=1
         <if test="wbstype!=null and wbstype!=''">
@@ -163,6 +163,7 @@
         AND dept.project_id = #{wbsId}
         /* AND dept.type = 1
         AND status = 1*/
+        GROUP BY dept.id
         ORDER BY dept.sort
     </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.WbsTreePrivate;
 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;
 
@@ -86,7 +83,7 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
 
     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);

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

@@ -685,8 +685,30 @@
 
     </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
         WHERE project_id = #{projectId}
         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> tree6(String wbsId, String projectId, String contractId);
+
+    List<WbsTreeContractVO6> tree8(String wbsId, String projectId, String contractId);
+
     List<WbsTreeContractVO2> treeTwo(String projectId);
 
     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;
 
 import com.alibaba.fastjson.JSONArray;
+import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
 import org.springblade.core.tool.api.R;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.entity.ExcelEditCallback;
@@ -113,9 +114,13 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
     // 多个pdf 合并
     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.vo.*;
 
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.List;
 
@@ -60,7 +61,7 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
     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);
 
@@ -70,7 +71,7 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
     // 元素关联
     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;
 

+ 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 io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
+import org.springblade.archive.entity.ArchivesAuto;
+import org.springblade.archive.feign.ArchiveAutoClient;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.Func;
@@ -18,6 +20,7 @@ import org.springblade.manager.vo.*;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 @AllArgsConstructor
@@ -28,6 +31,8 @@ public class ArTreeContractInitServiceImpl {
 
     private final ProjectClient projectClient;
 
+    private final ArchiveAutoClient archiveAutoClient;
+
     /**
      *
      * @param tenantId
@@ -100,9 +105,6 @@ public class ArTreeContractInitServiceImpl {
         }
 
 
-        //设置祖先id
-        InitAncestors(archiveTreeContracts);
-
         return;
 
     }
@@ -223,7 +225,7 @@ public class ArTreeContractInitServiceImpl {
      *
      * @param archiveTreeContracts
      */
-    public void InitAncestors(List<ArchiveTreeContract> archiveTreeContracts) {
+    public void InitAncestorsAndTreeSort(List<ArchiveTreeContract> archiveTreeContracts) {
         List<ArchiveTreeContractVO2> archiveTreeContractVO2List = new ArrayList<>();
         Map<Long,ArchiveTreeContractVO2> vo2Map = new LinkedHashMap<>();
         for (ArchiveTreeContract archiveTreeContract:archiveTreeContracts) {
@@ -231,6 +233,7 @@ public class ArTreeContractInitServiceImpl {
             treeContractVO2.setId(archiveTreeContract.getId());
             treeContractVO2.setParentId(archiveTreeContract.getParentId());
             treeContractVO2.setTitle(archiveTreeContract.getNodeName());
+            treeContractVO2.setSort(archiveTreeContract.getSort());
             archiveTreeContractVO2List.add(treeContractVO2);
             vo2Map.put(treeContractVO2.getId(),treeContractVO2);
         }
@@ -239,10 +242,14 @@ public class ArTreeContractInitServiceImpl {
 
         InitAncestors(trees.get(0),"0");
 
+        InitTreeSort(trees.get(0), "");
+
         for (ArchiveTreeContract archiveTreeContract:archiveTreeContracts) {
             ArchiveTreeContractVO2 tmp = vo2Map.get(archiveTreeContract.getId());
             if (tmp != null ) {
                 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) {
         List<ArchiveTreeContractVO2> archiveTreeContractVO2List = new ArrayList<>();
@@ -322,13 +345,22 @@ public class ArTreeContractInitServiceImpl {
         ForestNodeMerger.getTreeList(subTree,treeContractVO2s);
 
         //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<>();
 
         //获取已经存在的
         Map<Long,ArchiveTreeContractVO2> extMap = new LinkedHashMap<>();
         Map<Long,Long> oldNewMap = new LinkedHashMap<>();
+        //Map<Long,WbsTreeContractVO6> wbsMap = new LinkedHashMap<>();
         for (ArchiveTreeContractVO2 ar :treeContractVO2s) {
             if (ar.getExtId() !=null ) {
                 extMap.put(ar.getExtId(),ar);
@@ -338,15 +370,13 @@ public class ArTreeContractInitServiceImpl {
 
         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;
             }
 
@@ -371,28 +401,120 @@ public class ArTreeContractInitServiceImpl {
             archiveTree.setContractId(contractId);
             archiveTree.setId(oldNewMap.get(wbsTreeVO2.getId()));
             if (wbsTreeVO2.getParentId() == 0) {
-                wbsTreeVO2.setParentId(subTree.getId());
+                archiveTree.setParentId(subTree.getId());
             }else {
                 archiveTree.setParentId(oldNewMap.get(wbsTreeVO2.getParentId()));
             }
 
+            if (archiveTree.getParentId() == null) {
+                continue;
+            }
+
             archiveTree.setNodeName(wbsTreeVO2.getTitle());
 
             //设置关联
             archiveTree.setExtType(1);
             archiveTree.setExtId(wbsTreeVO2.getId());
+            archiveTree.setSort(wbsTreeVO2.getSort());
             archiveTree.setExtAttachId(subTree.getId());
             archiveTree.setDisplayHierarchy(level.toString());
             archiveTree.setIsDeleted(0);
             //上传节点
-            if (wbsTreeVO2.getNodeType().longValue() ==  level) {
+            if (wbsTreeVO2.getNodeType() != null && wbsTreeVO2.getNodeType().longValue() ==  level) {
                 archiveTree.setIsStorageNode(1);
             }
             archiveTreeContracts.add(archiveTree);
 
         }
 
+        //ArchiveTreeContractVO2 ar = getTree(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);
 		archiveTreeContracts.addAll(addNodes);
+
+		//初始化祖先节点和排序
+		arTreeContractInitService.InitAncestorsAndTreeSort(archiveTreeContracts);
 		//todo 同步质检资料动态节点,处理文件提名
 
 		//todo 同步立卷规则
 
 		//todo 同步划分树节点到案卷列表
+		arTreeContractInitService.syncArchiveAutoList(archiveTreeContracts,contractInfoVOS);
 
 		this.saveBatch(archiveTreeContracts);
 		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) {
             //只展示指定层级之上的
-            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;
             }
             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));
     }
 
+    @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
     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);
@@ -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) {
         for (WbsTreeContractTreeAllVO wbsTreeContractVO : list) {
             List<WbsTreeContractTreeAllVO> childrenList = map.get(wbsTreeContractVO.getId());
@@ -484,28 +519,38 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
 
     @Override
     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<>();
-        maps.put("treeContractAll", wbsTreeContractVOList);
-        //maps.put("isSelectedStatus", listResult.stream().distinct().collect(Collectors.toList()));
+        maps.put("treeContractAll", trialRecordZJTreeVOS);
         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.Element;
 import org.jsoup.select.Elements;
+import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
 import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.entity.TrialSelfInspectionRecord;
 import org.springblade.business.feign.ContractLogClient;
@@ -720,7 +721,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         if (ListUtils.isNotEmpty(tableInfoList)) {
             //施工资料填报
             String pkids = "";
-            StringBuilder log =new StringBuilder("异常:");
+            StringBuilder log = new StringBuilder("异常:");
             try {
                 for (TableInfo tableInfo : tableInfoList) {
                     WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
@@ -798,23 +799,23 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 e.printStackTrace();
                 return R.fail("操作失败");
             }
-            if(log.length()>5){
+            if (log.length() > 5) {
                 return R.fail(reason(log.toString()));
             }
         }
         return R.success("操作成功");
     }
 
-    public String reason(String log){
+    public String reason(String log) {
         /*字段过短提示*/
         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("pkeyId");
         reData.remove("projectId");
-        reData.put("tabGroupId",wbsTreeContract.getTabGroupId());
+        reData.put("tabGroupId", wbsTreeContract.getTabGroupId());
         return R.data(reData);
     }
 
     @Override
     public R getBussPdfInfo(Long pkeyId) throws Exception {
         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()
                 .eq(WbsTreeContract::getPKeyId, pkeyId));
 
@@ -1423,6 +1424,92 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         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());
             String htmlString = IoUtil.readToString(new FileInputStream(file1));
             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("☆");
                             for (String data : mysql) {
                                 String[] tabData = data.split("_\\^_");
@@ -1497,30 +1620,19 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                     reData.put(key + "__" + tabData[1], tabData[0]);
                                 }
                             }
-                        } else {
+                        } 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);
                         }
-                    } 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);
         Map<String, Object> DataInfo = bussDataInfoTrial.stream().findAny().orElse(null);
 
-        // 获取excel流 和 html流
+        //获取excel流 和 html流
         Workbook wb = new Workbook();
         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 + ")";
         List<WbsTreePrivate> queryList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
-        //合并pdfUrlsList,报告单在前记录表在后
         List<String> dataPdfUrls = new ArrayList<>();
+
         //报告单
         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());
+
         if (queryList.size() > 0) {
             for (WbsTreePrivate report : reportTable) {
                 //没有excel表单的不生成pdf
@@ -1974,6 +2087,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 }
             }
             for (WbsTreePrivate record : recordTable) {
+                //没有excel表单的不生成pdf
                 if (StringUtils.isNotEmpty(record.getHtmlUrl())) {
                     //生成记录表pdf
                     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;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -12,6 +13,7 @@ import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
+import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 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.IWbsTreePrivateService;
 import org.springblade.manager.vo.*;
+import org.springblade.system.cache.ParamCache;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -37,6 +40,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.*;
 import java.util.concurrent.Callable;
@@ -1535,7 +1539,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     }
 
     @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)) {
             return R.fail("projectId不能为空");
         }
@@ -1545,11 +1549,44 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
         List<Long> longs = Func.toLongList(primaryKeyIds);
         for (Long id : longs) {
-
+            //获取添加的表信息
             TableInfo tableInfo = tableInfoService.getById(id);
             WbsTreePrivate wbsPrivate = new WbsTreePrivate();
             Long pKeyId1 = SnowFlakeUtil.getId();
             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.setInitTableId(tableInfo.getId() + "");
@@ -1633,9 +1670,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             wbsTree.setInitTableId(tableInfo.getId());
             wbsTree.setFillRate(tableInfo.getFillRate());
             wbsTree.setTableOwner(tableInfo.getTableOwner());
-
             wbsTree.setWbsId(wbsId);
-
             wbsTreeMapper.updateById(wbsTree);
         } else if (type.equals("2")) {
             TableInfo tableInfo = tableInfoService.getById(tabId);
@@ -1695,7 +1730,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     }
 
     @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()
                 .select(WbsTreePrivate::getProjectId, WbsTreePrivate::getWbsId, WbsTreePrivate::getId)
                 .eq(WbsTreePrivate::getPKeyId, primaryKeyId));