Browse Source

试验检测自检相关

liuyc 2 years ago
parent
commit
c8754c2ccb
51 changed files with 2576 additions and 547 deletions
  1. 1 1
      blade-common/src/main/java/org/springblade/common/utils/SystemUtils.java
  2. 110 106
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java
  3. 29 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/RawMaterialSubmitRelationDTO.java
  4. 20 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialSelfInspectionRecordDTO.java
  5. 25 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialSelfInspectionRecordPageDTO.java
  6. 7 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialDetectionData.java
  7. 80 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialSelfInspectionRecord.java
  8. 20 13
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/InformationQueryClient.java
  9. 20 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TrialSelfInspectionRecordClient.java
  10. 27 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/SampleAncillaryDocumentsVO.java
  11. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSampleInfoVO3.java
  12. 23 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSelfInspectionRecordVO.java
  13. 32 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSelfInspectionRecordVO2.java
  14. 21 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/wrapper/TrialSelfInspectionRecordWarpper.java
  15. 7 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/TrialCompactionEvaluationParam.java
  16. 5 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/TrialTemperatureDensityParam.java
  17. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTree.java
  18. 18 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreePrivate.java
  19. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClient.java
  20. 12 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreePrivateClient.java
  21. 1 4
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java
  22. 134 9
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java
  23. 6 6
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialSievePoreController.java
  24. 28 5
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/InformationQueryClientImpl.java
  25. 24 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TrialSelfInspectionRecordClientImpl.java
  26. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialDetectionDataMapper.xml
  27. 4 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSampleInfoMapper.java
  28. 4 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSampleInfoMapper.xml
  29. 20 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSelfInspectionRecordMapper.java
  30. 55 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSelfInspectionRecordMapper.xml
  31. 35 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialSelfInspectionRecordService.java
  32. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDeviceInfoServiceImpl.java
  33. 1 4
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDeviceOverhaulServiceImpl.java
  34. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDeviceUseServiceImpl.java
  35. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialMaterialMobilizationServiceImpl.java
  36. 52 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSampleInfoServiceImpl.java
  37. 357 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  38. 134 0
      blade-service/blade-business/src/main/java/org/springblade/business/utils/StringSPUtils.java
  39. 6 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TrialParamConfigurationController.java
  40. 22 16
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  41. 53 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java
  42. 119 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreePrivateClientImpl.java
  43. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.java
  44. 22 22
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.xml
  45. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java
  46. 26 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  47. 69 59
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java
  48. 7 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java
  49. 353 43
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  50. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java
  51. 565 238
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/utils/SystemUtils.java → blade-common/src/main/java/org/springblade/common/utils/SystemUtils.java

@@ -1,4 +1,4 @@
-package org.springblade.business.utils;
+package org.springblade.common.utils;
 
 public class SystemUtils {
 

+ 110 - 106
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java

@@ -17,6 +17,7 @@
 package org.springblade.resource.builder.oss;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import org.springblade.core.cache.utils.CacheUtil;
 import org.springblade.core.log.exception.ServiceException;
@@ -27,10 +28,7 @@ import org.springblade.core.oss.props.OssProperties;
 import org.springblade.core.oss.rule.BladeOssRule;
 import org.springblade.core.oss.rule.OssRule;
 import org.springblade.core.secure.utils.AuthUtil;
-import org.springblade.core.tool.utils.Func;
-import org.springblade.core.tool.utils.StringPool;
-import org.springblade.core.tool.utils.StringUtil;
-import org.springblade.core.tool.utils.WebUtil;
+import org.springblade.core.tool.utils.*;
 import org.springblade.resource.entity.Oss;
 import org.springblade.resource.service.IOssService;
 
@@ -46,115 +44,121 @@ import static org.springblade.core.cache.constant.CacheConstant.RESOURCE_CACHE;
  */
 public class OssBuilder {
 
-	public static final String OSS_CODE = "oss:code:";
-	public static final String OSS_PARAM_KEY = "code";
+    public static final String OSS_CODE = "oss:code:";
+    public static final String OSS_PARAM_KEY = "code";
+    public static final String OSS_TENANT_ID = "000000";
 
-	private final OssProperties ossProperties;
-	private final IOssService ossService;
+    private final OssProperties ossProperties;
+    private final IOssService ossService;
 
-	public OssBuilder(OssProperties ossProperties, IOssService ossService) {
-		this.ossProperties = ossProperties;
-		this.ossService = ossService;
-	}
+    public OssBuilder(OssProperties ossProperties, IOssService ossService) {
+        this.ossProperties = ossProperties;
+        this.ossService = ossService;
+    }
 
-	/**
-	 * OssTemplate配置缓存池
-	 */
-	private final Map<String, OssTemplate> templatePool = new ConcurrentHashMap<>();
+    /**
+     * OssTemplate配置缓存池
+     */
+    private final Map<String, OssTemplate> templatePool = new ConcurrentHashMap<>();
 
-	/**
-	 * oss配置缓存池
-	 */
-	private final Map<String, Oss> ossPool = new ConcurrentHashMap<>();
+    /**
+     * oss配置缓存池
+     */
+    private final Map<String, Oss> ossPool = new ConcurrentHashMap<>();
 
-	/**
-	 * 获取template
-	 *
-	 * @return OssTemplate
-	 */
-	public OssTemplate template() {
-		return template(StringPool.EMPTY);
-	}
+    /**
+     * 获取template
+     *
+     * @return OssTemplate
+     */
+    public OssTemplate template() {
+        return template(StringPool.EMPTY);
+    }
 
-	/**
-	 * 获取template
-	 *
-	 * @param code 资源编号
-	 * @return OssTemplate
-	 */
-	public OssTemplate template(String code) {
-		String tenantId = AuthUtil.getTenantId();
-		Oss oss = getOss(tenantId, code);
-		Oss ossCached = ossPool.get(tenantId);
-		OssTemplate template = templatePool.get(tenantId);
-		// 若为空或者不一致,则重新加载
-		if (Func.hasEmpty(template, ossCached) || !oss.getEndpoint().equals(ossCached.getEndpoint()) || !oss.getAccessKey().equals(ossCached.getAccessKey())) {
-			synchronized (OssBuilder.class) {
-				template = templatePool.get(tenantId);
-				if (Func.hasEmpty(template, ossCached) || !oss.getEndpoint().equals(ossCached.getEndpoint()) || !oss.getAccessKey().equals(ossCached.getAccessKey())) {
-					OssRule ossRule;
-					// 若采用默认设置则开启多租户模式, 若是用户自定义oss则不开启
-					if (oss.getEndpoint().equals(ossProperties.getEndpoint()) && oss.getAccessKey().equals(ossProperties.getAccessKey()) && ossProperties.getTenantMode()) {
-						ossRule = new BladeOssRule(Boolean.TRUE);
-					} else {
-						ossRule = new BladeOssRule(Boolean.FALSE);
-					}
-					if (oss.getCategory() == OssEnum.MINIO.getCategory()) {
-						template = MinioOssBuilder.template(oss, ossRule);
-					} else if (oss.getCategory() == OssEnum.QINIU.getCategory()) {
-						template = QiniuOssBuilder.template(oss, ossRule);
-					} else if (oss.getCategory() == OssEnum.ALI.getCategory()) {
-						template = AliOssBuilder.template(oss, ossRule);
-					} else if (oss.getCategory() == OssEnum.TENCENT.getCategory()) {
-						template = TencentOssBuilder.template(oss, ossRule);
-					}
-					templatePool.put(tenantId, template);
-					ossPool.put(tenantId, oss);
-				}
-			}
-		}
-		return template;
-	}
+    /**
+     * 获取template
+     *
+     * @param code 资源编号
+     * @return OssTemplate
+     */
+    public OssTemplate template(String code) {
+        String tenantId = AuthUtil.getTenantId();
+        Oss oss = getOss(tenantId, code);
+        Oss ossCached = ossPool.get(tenantId);
+        OssTemplate template = templatePool.get(tenantId);
+        // 若为空或者不一致,则重新加载
+        if (Func.hasEmpty(template, ossCached) || !oss.getEndpoint().equals(ossCached.getEndpoint()) || !oss.getAccessKey().equals(ossCached.getAccessKey())) {
+            synchronized (OssBuilder.class) {
+                template = templatePool.get(tenantId);
+                if (Func.hasEmpty(template, ossCached) || !oss.getEndpoint().equals(ossCached.getEndpoint()) || !oss.getAccessKey().equals(ossCached.getAccessKey())) {
+                    OssRule ossRule;
+                    // 若采用默认设置则开启多租户模式, 若是用户自定义oss则不开启
+                    if (oss.getEndpoint().equals(ossProperties.getEndpoint()) && oss.getAccessKey().equals(ossProperties.getAccessKey()) && ossProperties.getTenantMode()) {
+                        ossRule = new BladeOssRule(Boolean.TRUE);
+                    } else {
+                        ossRule = new BladeOssRule(Boolean.FALSE);
+                    }
+                    if (oss.getCategory() == OssEnum.MINIO.getCategory()) {
+                        template = MinioOssBuilder.template(oss, ossRule);
+                    } else if (oss.getCategory() == OssEnum.QINIU.getCategory()) {
+                        template = QiniuOssBuilder.template(oss, ossRule);
+                    } else if (oss.getCategory() == OssEnum.ALI.getCategory()) {
+                        template = AliOssBuilder.template(oss, ossRule);
+                    } else if (oss.getCategory() == OssEnum.TENCENT.getCategory()) {
+                        template = TencentOssBuilder.template(oss, ossRule);
+                    }
+                    templatePool.put(tenantId, template);
+                    ossPool.put(tenantId, oss);
+                }
+            }
+        }
+        return template;
+    }
 
-	/**
-	 * 获取对象存储实体
-	 *
-	 * @param tenantId 租户ID
-	 * @return Oss
-	 */
-	public Oss getOss(String tenantId, String code) {
-		String key = tenantId;
-		LambdaQueryWrapper<Oss> lqw = Wrappers.<Oss>query().lambda().eq(Oss::getTenantId, tenantId);
-		// 获取传参的资源编号并查询,若有则返回,若没有则调启用的配置
-		String ossCode = StringUtil.isBlank(code) ? WebUtil.getParameter(OSS_PARAM_KEY) : code;
-		if (StringUtil.isNotBlank(ossCode)) {
-			key = key.concat(StringPool.DASH).concat(ossCode);
-			lqw.eq(Oss::getOssCode, ossCode);
-		} else {
-			lqw.eq(Oss::getStatus, OssStatusEnum.ENABLE.getNum());
-		}
-		Oss oss = CacheUtil.get(RESOURCE_CACHE, OSS_CODE, key, () -> {
-			Oss o = ossService.getOne(lqw);
-			// 若为空则调用默认配置
-			if ((Func.isEmpty(o))) {
-				Oss defaultOss = new Oss();
-				defaultOss.setId(0L);
-				defaultOss.setCategory(OssEnum.of(ossProperties.getName()).getCategory());
-				defaultOss.setEndpoint(ossProperties.getEndpoint());
-				defaultOss.setBucketName(ossProperties.getBucketName());
-				defaultOss.setAccessKey(ossProperties.getAccessKey());
-				defaultOss.setSecretKey(ossProperties.getSecretKey());
-				return defaultOss;
-			} else {
-				return o;
-			}
-		});
-		if (oss == null || oss.getId() == null) {
-			throw new ServiceException("未获取到对应的对象存储配置");
-		} else {
-			return oss;
-		}
-	}
+    /**
+     * 获取对象存储实体
+     *
+     * @param tenantId 租户ID
+     * @return Oss
+     */
+    public Oss getOss(String tenantId, String code) {
+        String key = StringUtils.isNotEmpty(tenantId) ? tenantId : OSS_TENANT_ID;
+
+        LambdaQueryWrapper<Oss> lqw = Wrappers.<Oss>query().lambda().eq(Oss::getTenantId, key);
+        // 获取传参的资源编号并查询,若有则返回,若没有则调启用的配置
+        String ossCode = StringUtil.isBlank(code) ? WebUtil.getParameter(OSS_PARAM_KEY) : code;
+        if (StringUtil.isNotBlank(ossCode)) {
+            key = key.concat(StringPool.DASH).concat(ossCode);
+            lqw.eq(Oss::getOssCode, ossCode);
+        } else {
+            lqw.eq(Oss::getStatus, OssStatusEnum.ENABLE.getNum());
+            Oss o = ossService.getOne(lqw);
+            if (Func.notNull(o)) {
+                key = o.getOssCode();
+            }
+        }
+        Oss oss = CacheUtil.get(RESOURCE_CACHE, OSS_CODE, key, () -> {
+            Oss o = ossService.getOne(lqw);
+            // 若为空则调用默认配置
+            if ((Func.isEmpty(o))) {
+                Oss defaultOss = new Oss();
+                defaultOss.setId(0L);
+                defaultOss.setCategory(OssEnum.of(ossProperties.getName()).getCategory());
+                defaultOss.setEndpoint(ossProperties.getEndpoint());
+                defaultOss.setBucketName(ossProperties.getBucketName());
+                defaultOss.setAccessKey(ossProperties.getAccessKey());
+                defaultOss.setSecretKey(ossProperties.getSecretKey());
+                return defaultOss;
+            } else {
+                return o;
+            }
+        });
+        if (oss == null || oss.getId() == null) {
+            throw new ServiceException("未获取到对应的对象存储配置");
+        } else {
+            return oss;
+        }
+    }
 
 
 }

+ 29 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/RawMaterialSubmitRelationDTO.java

@@ -0,0 +1,29 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class RawMaterialSubmitRelationDTO implements Serializable {
+
+    @ApiModelProperty("当前自检记录id")
+    private String id;
+
+    @ApiModelProperty("需要关联的记录ids")
+    private String ids;
+
+    @ApiModelProperty("节点id")
+    private String nodeId;
+
+    @ApiModelProperty("合同段id")
+    private String contractId;
+
+    @ApiModelProperty("项目id")
+    private String projectId;
+
+    @ApiModelProperty("所属方类型 1=施工自检 2=监理抽检")
+    private Integer type;
+
+}

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

@@ -0,0 +1,20 @@
+package org.springblade.business.dto;
+
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.business.entity.TrialSelfInspectionRecord;
+
+@Data
+public class TrialSelfInspectionRecordDTO extends TrialSelfInspectionRecord {
+
+    @ApiModelProperty("表单数据dataInfo")
+    private JSONObject dataInfo;
+
+    @ApiModelProperty("样品信息ids")
+    private String sampleIds;
+
+    @ApiModelProperty(value = "表类型 1=记录表 2=报告单")
+    private Integer tableType;
+
+}

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

@@ -0,0 +1,25 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.business.entity.TrialSelfInspectionRecord;
+
+@Data
+public class TrialSelfInspectionRecordPageDTO extends TrialSelfInspectionRecord {
+
+    @ApiModelProperty("查询输入框 项目名称")
+    private String queryValue;
+
+    @ApiModelProperty(value = "报告时间-起")
+    private String startTime;
+
+    @ApiModelProperty(value = "报告时间-止")
+    private String endTime;
+
+    @ApiModelProperty(value = "送样人员")
+    private String queryName;
+
+    @ApiModelProperty(value = "是否合格 '0'=不合格 '1'=合格")
+    private String queryStatus;
+
+}

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

@@ -36,6 +36,12 @@ public class TrialDetectionData extends BaseEntity {
     @ApiModelProperty(value = "样品编号")
     private String specificationNumber;
 
+    @ApiModelProperty(value = "规格型号")
+    private String specificationModel;
+
+    @ApiModelProperty(value = "试验类型")
+    private String trialType;
+
     @ApiModelProperty(value = "合格状态 '0'=不合格 '1'=合格")
     private Integer status;
 
@@ -73,7 +79,7 @@ public class TrialDetectionData extends BaseEntity {
 
     @ApiModelProperty(value = "检测日期")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
-    private Long testDate;
+    private Date testDate;
 
     @ApiModelProperty(value = "生产厂家")
     private String manufacturer;

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

@@ -0,0 +1,80 @@
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.util.Date;
+
+@Data
+@TableName("u_trial_self_inspection_record")
+@EqualsAndHashCode(callSuper = true)
+public class TrialSelfInspectionRecord extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "节点ID")
+    private Long nodeId;
+
+    @ApiModelProperty(value = "记录编号")
+    private String recordNo;
+
+    @ApiModelProperty(value = "报告编号")
+    private String reportNo;
+
+    @ApiModelProperty(value = "取样地点")
+    private String samplingLocation;
+
+    @ApiModelProperty(value = "试验项目名称")
+    private String trialProjectName;
+
+    @ApiModelProperty(value = "所属方类型 1=施工自检 2=监理抽检")
+    private Integer type;
+
+    @ApiModelProperty(value = "检测类别")
+    private Integer detectionCategory;
+
+    @ApiModelProperty(value = "是否上传合格证 '0'=是 ‘1’=否")
+    private Integer isUploadCertificate;
+
+    @ApiModelProperty(value = "合同段id")
+    private Long contractId;
+
+    @ApiModelProperty(value = "单位")
+    private String company;
+
+    @ApiModelProperty(value = "样品编号")
+    private String specificationNumber;
+
+    @ApiModelProperty(value = "规格类型")
+    private String specificationModel;
+
+    @ApiModelProperty(value = "检测结果 '0'=不合格 '1'=合格")
+    private Integer detectionResult;
+
+    @ApiModelProperty(value = "工程部位及用途")
+    private String projectPosition;
+
+    @ApiModelProperty(value = "报告日期")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date reportDate;
+
+    @ApiModelProperty(value = "试验人员名称")
+    private String trialUserName;
+
+    @ApiModelProperty(value = "任务状态")
+    private String taskStatus;
+
+    @ApiModelProperty(value = "清表ids")
+    private String tableIds;
+
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
+    @ApiModelProperty(value = "多表合并PDF")
+    private String pdfUrl;
+
+}

+ 20 - 13
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/InformationQueryClient.java

@@ -28,22 +28,29 @@ public interface InformationQueryClient {
 
     /**
      * 保存填报时新增或修改填报资料记录表数据
-     * @param wbsId 当前填报节点
-     * @param fileName 文件题名
-     * @param classify 1施工2质检
+     *
+     * @param wbsId      当前填报节点
+     * @param fileName   文件题名
+     * @param classify   1施工2质检
      * @param sourceType 1原生2数据化
      */
     @PostMapping(API_PREFIX + "/saveOrUpdateInformationQueryData")
     String saveOrUpdateInformationQueryData(@RequestParam String wbsId,
-                                          @RequestParam String tableId,
-                                          @RequestParam String businessId,
-                                          @RequestParam String fileName,
-                                          @RequestParam Integer classify,
-                                          @RequestParam Integer sourceType,
-                                          @RequestParam String isFirst,
-                                          @RequestParam String sourceUrl,
-                                          @RequestParam String pdfUrl,
-                                          @RequestParam String firstFileName,
-                                          @RequestBody List<JSONObject> linkDataList);
+                                            @RequestParam String tableId,
+                                            @RequestParam String businessId,
+                                            @RequestParam String fileName,
+                                            @RequestParam Integer classify,
+                                            @RequestParam Integer sourceType,
+                                            @RequestParam String isFirst,
+                                            @RequestParam String sourceUrl,
+                                            @RequestParam String pdfUrl,
+                                            @RequestParam String firstFileName,
+                                            @RequestBody List<JSONObject> linkDataList);
+
+    @PostMapping(API_PREFIX + "/saveData")
+    void saveData(@RequestParam String nodeId, @RequestParam String projectId, @RequestParam String contractId, @RequestParam String classify, @RequestParam String link);
+
+    @PostMapping(API_PREFIX + "/updateInformationQuery")
+    void updateInformationQuery(@RequestParam String link, @RequestParam String classify, @RequestParam String nodeId, @RequestParam String contractId);
 
 }

+ 20 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TrialSelfInspectionRecordClient.java

@@ -0,0 +1,20 @@
+package org.springblade.business.feign;
+
+import org.springblade.common.constant.BusinessConstant;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(value = BusinessConstant.APPLICATION_WEATHER_NAME)
+public interface TrialSelfInspectionRecordClient {
+
+    /**
+     * 接口前缀
+     */
+    String API_PREFIX = "/api/business/detection";
+
+    @PostMapping(API_PREFIX + "/updateURL")
+    void updateURL(@RequestParam String url, @RequestParam String pKeyId);
+
+
+}

+ 27 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/SampleAncillaryDocumentsVO.java

@@ -0,0 +1,27 @@
+package org.springblade.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+@Data
+public class SampleAncillaryDocumentsVO implements Serializable {
+
+    @ApiModelProperty("材料id")
+    private Long id;
+
+    @ApiModelProperty("材料名称")
+    private String name;
+
+    @ApiModelProperty(value = "生产合格证")
+    private String productionCertificate;
+
+    @ApiModelProperty(value = "厂家质检报告")
+    private String qualityInspectionReport;
+
+    @ApiModelProperty(value = "其他附件")
+    private String otherAccessories;
+
+}

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

@@ -10,4 +10,7 @@ public class TrialSampleInfoVO3 extends TrialSampleInfo {
     @ApiModelProperty("取样人")
     private String userName;
 
+    @ApiModelProperty(value = "是否关联过 关联=1")
+    private Integer isRelation;
+
 }

+ 23 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSelfInspectionRecordVO.java

@@ -0,0 +1,23 @@
+package org.springblade.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.business.entity.TrialSelfInspectionRecord;
+
+
+@Data
+public class TrialSelfInspectionRecordVO extends TrialSelfInspectionRecord {
+
+    @ApiModelProperty("检测类别名称")
+    private String detectionCategoryName;
+
+    @ApiModelProperty("检测结果名称")
+    private String detectionResultName;
+
+    @ApiModelProperty(value = "是否上传合格证名称")
+    private String isUploadCertificateName;
+
+    @ApiModelProperty(value = "工程部位及用途名称")
+    private String projectPositionName;
+
+}

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

@@ -0,0 +1,32 @@
+package org.springblade.business.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class TrialSelfInspectionRecordVO2 implements Serializable {
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "报告编号")
+    private String reportNo;
+
+    @ApiModelProperty(value = "试验项目名称")
+    private String trialProjectName;
+
+    @ApiModelProperty(value = "工程部位及用途")
+    private String projectPosition;
+
+    @ApiModelProperty(value = "报告日期")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date reportDate;
+
+    @ApiModelProperty(value = "是否关联过 关联=1")
+    private Integer isRawMaterialRelation;
+
+}

+ 21 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/wrapper/TrialSelfInspectionRecordWarpper.java

@@ -0,0 +1,21 @@
+package org.springblade.business.wrapper;
+
+import org.springblade.business.entity.TrialSelfInspectionRecord;
+import org.springblade.business.vo.TrialSelfInspectionRecordVO;
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+
+import java.util.Objects;
+
+public class TrialSelfInspectionRecordWarpper extends BaseEntityWrapper<TrialSelfInspectionRecord, TrialSelfInspectionRecordVO> {
+
+    public static TrialSelfInspectionRecordWarpper build() {
+        return new TrialSelfInspectionRecordWarpper();
+    }
+
+    @Override
+    public TrialSelfInspectionRecordVO entityVO(TrialSelfInspectionRecord entity) {
+        return Objects.requireNonNull(BeanUtil.copy(entity, TrialSelfInspectionRecordVO.class));
+    }
+
+}

+ 7 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/TrialCompactionEvaluationParam.java

@@ -4,8 +4,11 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.hibernate.validator.constraints.Length;
 import org.springblade.core.mp.base.BaseEntity;
 
+import javax.validation.constraints.Size;
+
 
 @Data
 @TableName("m_trial_compaction_evaluation_param")
@@ -14,15 +17,19 @@ public class TrialCompactionEvaluationParam extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
     @ApiModelProperty("N值")
+    @Size(max = 10, min = 1, message = "长度必须大于等于1或小于等于10")
     private String valueN;
 
     @ApiModelProperty("保证率99%")
+    @Size(max = 5, min = 1, message = "长度必须大于等于1或小于等于5")
     private String assuranceRateNinetyNinePercent;
 
     @ApiModelProperty("保证率95%")
+    @Size(max = 5, min = 1, message = "长度必须大于等于1或小于等于5")
     private String assuranceRateNinetyFivePercent;
 
     @ApiModelProperty("保证率90%")
+    @Size(max = 5, min = 1, message = "长度必须大于等于1或小于等于5")
     private String assuranceRateNinetyPercent;
 
     @ApiModelProperty("排序")

+ 5 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/TrialTemperatureDensityParam.java

@@ -4,17 +4,22 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.hibernate.validator.constraints.Length;
 import org.springblade.core.mp.base.BaseEntity;
 
+import javax.validation.constraints.Size;
+
 @Data
 @TableName("m_trial_temperature_density_param")
 @EqualsAndHashCode(callSuper = true)
 public class TrialTemperatureDensityParam extends BaseEntity {
 
     @ApiModelProperty("温度")
+    @Size(max = 5, min = 1, message = "长度必须大于等于1或小于等于5")
     private String temperature;
 
     @ApiModelProperty("水密度")
+    @Size(max = 5, min = 1, message = "长度必须大于等于1或小于等于5")
     private String waterDensity;
 
     @ApiModelProperty("排序")

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

@@ -171,4 +171,7 @@ public class WbsTree extends BaseEntity {
     @ApiModelProperty(value = "配合比试验ids")
     private String mixRatioTestIds;
 
+    @ApiModelProperty(value = "实体表id")
+    private Long initTableId;
+
 }

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

@@ -181,5 +181,23 @@ public class WbsTreePrivate extends BaseEntity {
      */
     private String mixRatioTestIds;
 
+    /**
+     * 是否能预览pdf
+     */
+    @ApiModelProperty(value = "是否能预览pdf 1否 2是")
+    private Integer isTabPdf;
+
+    /**
+     * html路径
+     */
+    @ApiModelProperty(value = "pdf路径")
+    private String pdfUrl;
+
+    /**
+     * 用户端是否隐藏
+     */
+    @ApiModelProperty(value = "客户端户端是否隐藏 ")
+    private Integer isBussShow;
+
 
 }

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

@@ -1,8 +1,11 @@
 package org.springblade.manager.feign;
 
+import com.alibaba.fastjson.JSONObject;
+import org.springblade.core.tool.api.R;
 import org.springblade.manager.entity.ExcelTab;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
@@ -18,4 +21,7 @@ public interface ExcelTabClient {
     @PostMapping(API_PREFIX + "/getById")
     ExcelTab getById(@RequestParam String id);
 
+    @PostMapping(API_PREFIX + "/saveTabData")
+    String saveTabData(@RequestBody JSONObject dataInfo, @RequestParam Integer type, @RequestParam Integer tableType, @RequestParam Long id) throws Exception;
+
 }

+ 12 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreePrivateClient.java

@@ -39,4 +39,16 @@ 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);
+
+    @PostMapping(API_PREFIX + "/removeBussTabInfoById")
+    boolean removeBussTabInfoById(@RequestParam Long pKeyId);
+
+    @PostMapping(API_PREFIX + "/getRawMaterialTree")
+    List<WbsTreePrivateVO> getRawMaterialTree(@RequestParam Long pKeyId);
+
 }

+ 1 - 4
blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java

@@ -6,7 +6,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.alibaba.nacos.common.utils.StringUtils;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.lowagie.text.pdf.BaseFont;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
@@ -21,12 +20,11 @@ import org.springblade.business.feign.OperationLogClient;
 import org.springblade.business.feign.RecycleBinClient;
 import org.springblade.business.service.ImageClassificationShowService;
 import org.springblade.business.utils.FileUtils;
-import org.springblade.business.utils.SystemUtils;
 import org.springblade.business.vo.ImageClassificationShowVO;
 import org.springblade.business.vo.TreeVo;
-import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.common.utils.SystemUtils;
 import org.springblade.common.vo.DataVO;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
@@ -47,7 +45,6 @@ import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.resource.feign.CommonFileClient;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.resource.vo.NewBladeFile;
-import org.springblade.system.cache.ParamCache;
 import org.springblade.system.entity.Dict;
 import org.springblade.system.feign.IDictClient;
 import org.springframework.beans.BeanUtils;

+ 134 - 9
blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java

@@ -5,21 +5,28 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.springblade.business.dto.TrialDetectionDataDTO;
-import org.springblade.business.dto.TrialDetectionDataPageDTO;
+import org.springblade.business.dto.*;
 import org.springblade.business.entity.TrialDetectionData;
 import org.springblade.business.service.ITrialDetectionDataService;
 import org.springblade.business.service.ITrialSampleInfoService;
-import org.springblade.business.vo.TrialSampleInfoVO3;
+import org.springblade.business.service.ITrialSelfInspectionRecordService;
+import org.springblade.business.vo.*;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.manager.feign.WbsTreePrivateClient;
+import org.springblade.manager.vo.WbsTreePrivateVO;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.io.FileNotFoundException;
 import java.util.List;
+import java.util.Map;
+
 
 @RestController
 @AllArgsConstructor
@@ -29,6 +36,9 @@ public class TrialDetectionController extends BladeController {
 
     private ITrialDetectionDataService iTrialDetectionDataService;
     private ITrialSampleInfoService iTrialSampleInfoService;
+    private ITrialSelfInspectionRecordService iTrialSelfInspectionRecordService;
+    private WbsTreePrivateClient wbsTreePrivateClient;
+    private JdbcTemplate jdbcTemplate;
 
     @GetMapping("/data/detail")
     @ApiOperationSupport(order = 1)
@@ -58,19 +68,134 @@ public class TrialDetectionController extends BladeController {
         return R.data(iTrialDetectionDataService.dataPage(Condition.getPage(query), dto));
     }
 
-    @GetMapping("/sample/list-info")
+    @PostMapping("/data/copy")
     @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "外委或三方数据复制", notes = "如果是多条批量复制,就传ids,不传obj;如果是单条复制,就传obj,不传ids")
+    public R<Object> dataCopy(@RequestBody TrialDetectionDataDTO dto) {
+        return R.status(iTrialDetectionDataService.dataCopy(dto));
+    }
+
+    @PostMapping("/self/page")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "自检记录分页查询", notes = "传入TrialSelfInspectionRecordPageDTO")
+    public R<IPage<TrialSelfInspectionRecordVO>> selfPage(@RequestBody Query query, @RequestBody TrialSelfInspectionRecordPageDTO dto) {
+        return R.data(iTrialSelfInspectionRecordService.selfPage(Condition.getPage(query), dto));
+    }
+
+    @GetMapping("/sample/list-info")
+    @ApiOperationSupport(order = 7)
     @ApiOperation(value = "查询关联样品信息列表", notes = "传入节点id")
     public R<List<TrialSampleInfoVO3>> sampleListInfo(Long nodeId) {
         return R.data(iTrialSampleInfoService.sampleListInfo(nodeId));
     }
 
-    @PostMapping("/data/copy")
-    @ApiOperationSupport(order = 6)
-    @ApiOperation(value = "外委或三方数据复制", notes = "如果是多条批量复制,就传ids,不传obj;如果是单条复制,就传obj,不传ids")
-    public R<Object> dataCopy(@RequestBody TrialDetectionDataDTO dto) {
-        return R.status(iTrialDetectionDataService.dataCopy(dto));
+    @GetMapping("/self/sample-list")
+    @ApiOperationSupport(order = 8)
+    @ApiOperation(value = "自检记录样品信息列表", notes = "传入记录id")
+    public R<List<TrialSampleInfoVO>> selfSampleList(@Valid @RequestParam String id) {
+        return R.data(iTrialSelfInspectionRecordService.selfSampleList(id));
+    }
+
+    @GetMapping("/self/ancillary-documents-list")
+    @ApiOperationSupport(order = 9)
+    @ApiOperation(value = "自检记录附件列表", notes = "传入记录id")
+    public R<List<SampleAncillaryDocumentsVO>> selfAncillaryDocumentsList(@Valid @RequestParam String id) {
+        return R.data(iTrialSelfInspectionRecordService.selfAncillaryDocumentsList(id));
+    }
+
+    @PostMapping("/self/update-ancillary-documents")
+    @ApiOperationSupport(order = 10)
+    @ApiOperation(value = "自检记录批量修改附件", notes = "传入List<SampleAncillaryDocumentsVO>集合")
+    public R<Object> selfUpdateAncillaryDocuments(@Valid @RequestBody List<SampleAncillaryDocumentsVO> vo) {
+        return R.status(iTrialSelfInspectionRecordService.selfUpdateAncillaryDocuments(vo));
     }
 
+    @PostMapping("/self/submit")
+    @ApiOperationSupport(order = 11)
+    @ApiOperation(value = "自检记录新增或修改", notes = "传入TrialSelfInspectionRecordDTO")
+    public R<Object> selfSubmit(@Valid @RequestBody TrialSelfInspectionRecordDTO dto) throws Exception {
+        return R.status(iTrialSelfInspectionRecordService.selfSubmit(dto));
+    }
+
+    @PostMapping("/self/copy")
+    @ApiOperationSupport(order = 12)
+    @ApiOperation(value = "自检记录批量复制", notes = "传入ids,字符串逗号分隔")
+    public R<Object> selfCopy(@Valid @RequestParam String ids) {
+        return R.status(iTrialSelfInspectionRecordService.selfCopy(Func.toLongList(ids)));
+    }
+
+    @PostMapping("/self/remove")
+    @ApiOperationSupport(order = 13)
+    @ApiOperation(value = "自检记录批量删除", notes = "传入ids,字符串逗号分隔")
+    public R<Object> selfRemove(@Valid @RequestParam String ids) {
+        return R.status(iTrialSelfInspectionRecordService.deleteLogic(Func.toLongList(ids)));
+    }
+
+    @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));
+    }
+
+    @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));
+    }
+
+    @PostMapping("/self/remove-buss-tabInfo")
+    @ApiOperationSupport(order = 16)
+    @ApiOperation(value = "自检删除复制的表", notes = "传入节点pKeyId")
+    public R<Object> removeBussTabInfo(@RequestParam Long pKeyId) {
+        return R.status(wbsTreePrivateClient.removeBussTabInfoById(pKeyId));
+    }
+
+    @GetMapping("/get-buss-pdf")
+    @ApiOperationSupport(order = 17)
+    @ApiOperation(value = "自检单表PDF预览", notes = "传入pKeyId")
+    public R<Object> getBussPdfById(@RequestParam Long pKeyId) {
+        List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateClient.queryByPKeyIds(Func.toStrList(String.valueOf(pKeyId)));
+        WbsTreePrivate wbsTreePrivate = wbsTreePrivates.stream().findAny().orElse(null);
+        assert wbsTreePrivate != null;
+        return R.data(wbsTreePrivate.getPdfUrl());
+    }
+
+    @GetMapping("/get-buss-pdfs")
+    @ApiOperationSupport(order = 18)
+    @ApiOperation(value = "自检多表PDF预览", notes = "传入nodeId、classify、contractId、projectId")
+    public R<Object> getPDFs(String nodeId, String classify, String contractId, String projectId) {
+        String sql = "select pdf_url, e_visa_pdf_url from u_information_query  where project_id ='" + projectId + "' and classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "' ";
+        Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(sql);
+        Object pdfUrl = stringObjectMap.get("pdf_url");
+        if (stringObjectMap.get("e_visa_pdf_url") != null) {
+            pdfUrl = stringObjectMap.get("e_visa_pdf_url"); //优先使用电签的PDF
+        }
+        return R.data(pdfUrl);
+    }
+
+    @GetMapping("/self/raw-material/tree")
+    @ApiOperationSupport(order = 19)
+    @ApiOperation(value = "获取节点下的原材料配合比节点树", notes = "传入节点pKeyId")
+    public R<List<WbsTreePrivateVO>> getRawMaterialTree(@RequestParam Long pKeyId) {
+        List<WbsTreePrivateVO> wbsTreePrivates = wbsTreePrivateClient.getRawMaterialTree(pKeyId);
+        return R.data(wbsTreePrivates);
+    }
+
+    @GetMapping("/self/raw-material/list")
+    @ApiOperationSupport(order = 20)
+    @ApiOperation(value = "获取原材料节点下的记录信息", notes = "传入节点nodeId、合同段contractId")
+    public R<List<TrialSelfInspectionRecordVO2>> getRawMaterialInfo(@RequestParam String nodeId, @RequestParam String contractId) {
+        List<TrialSelfInspectionRecordVO2> recordVO2s = iTrialSelfInspectionRecordService.getRawMaterialInfo(nodeId, contractId);
+        return R.data(recordVO2s);
+    }
+
+    @PostMapping("/self/raw-material/submit-relation")
+    @ApiOperationSupport(order = 21)
+    @ApiOperation(value = "关联原材检测报告保存或修改", notes = "传入RawMaterialSubmitRelationDTO")
+    public R<Object> rawMaterialSubmitRelation(@RequestBody RawMaterialSubmitRelationDTO dto) throws FileNotFoundException {
+        return R.status(iTrialSelfInspectionRecordService.rawMaterialSubmitRelation(dto));
+    }
 
 }

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

@@ -21,7 +21,7 @@ import java.util.List;
 @RestController
 @AllArgsConstructor
 @RequestMapping("/sieve/pore")
-@Api(value = "试验筛孔", tags = "试验筛孔接口")
+@Api(value = "试验自定义筛孔", tags = "试验自定义筛孔接口")
 public class TrialSievePoreController extends BladeController {
 
     private final ITrialSievePoreClassificationService iTrialSievePoreClassificationService;
@@ -44,8 +44,8 @@ public class TrialSievePoreController extends BladeController {
     @PostMapping("/classification/remove")
     @ApiOperationSupport(order = 3)
     @ApiOperation(value = "筛孔分类删除", notes = "传入id")
-    public R<Object> classificationRemove(@Valid @RequestParam Long id) {
-        return R.status(iTrialSievePoreClassificationService.deleteLogic(Func.toLongList(String.valueOf(id))));
+    public R<Object> classificationRemove(@Valid @RequestParam String id) {
+        return R.status(iTrialSievePoreClassificationService.deleteLogic(Func.toLongList(id)));
     }
 
     @GetMapping("/classification/list")
@@ -71,9 +71,9 @@ public class TrialSievePoreController extends BladeController {
 
     @PostMapping("/data/remove")
     @ApiOperationSupport(order = 7)
-    @ApiOperation(value = "筛孔尺寸数据删除", notes = "传入id")
-    public R<Object> dataRemove(@Valid @RequestParam Long id) {
-        return R.status(iTrialSievePoreClassificationDataService.deleteLogic(Func.toLongList(String.valueOf(id))));
+    @ApiOperation(value = "筛孔尺寸数据删除", notes = "传入ids")
+    public R<Object> dataRemove(@Valid @RequestParam String ids) {
+        return R.status(iTrialSievePoreClassificationDataService.deleteLogic(Func.toLongList(ids)));
     }
 
     @GetMapping("/data/page")

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

@@ -1,6 +1,7 @@
 package org.springblade.business.feignClient;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import org.springblade.business.entity.InformationQuery;
@@ -23,10 +24,10 @@ public class InformationQueryClientImpl implements InformationQueryClient {
     @Override
     public JSONObject queryFirstBusinessDataByFirstId(String firstId) {
         InformationQuery query = this.iInformationQueryService.getById(firstId);
-        if(query != null){
+        if (query != null) {
             JSONObject json = JSONObject.parseObject(JSONObject.toJSONString(query), JSONObject.class);
             InformationQueryFile queryFile = this.informationQueryFileService.getOne(Wrappers.<InformationQueryFile>lambdaQuery().eq(InformationQueryFile::getQueryId, query.getId()));
-            if(queryFile != null){
+            if (queryFile != null) {
                 json.put("uploadFile", queryFile.getPdfUrl());
             }
             return json;
@@ -37,9 +38,31 @@ public class InformationQueryClientImpl implements InformationQueryClient {
 
     @Override
     public String saveOrUpdateInformationQueryData(String wbsId, String tableId,
-                                                 String businessId, String fileName,
-                                                 Integer classify, Integer sourceType,
-                                                 String isFirst, String sourceUrl, String pdfUrl, String firstFileName, List<JSONObject> linkDataList) {
+                                                   String businessId, String fileName,
+                                                   Integer classify, Integer sourceType,
+                                                   String isFirst, String sourceUrl, String pdfUrl, String firstFileName, List<JSONObject> linkDataList) {
         return this.iInformationQueryService.saveOrUpdateInformationQueryData(wbsId, tableId, businessId, fileName, classify, sourceType, isFirst, sourceUrl, pdfUrl, firstFileName, linkDataList);
     }
+
+    @Override
+    public void saveData(String nodeId, String projectId, String contractId, String classify, String link) {
+        InformationQuery obj = new InformationQuery();
+        obj.setWbsId(Long.valueOf(nodeId));
+        obj.setProjectId(Long.valueOf(projectId));
+        obj.setContractId(Long.valueOf(contractId));
+        obj.setClassify(Integer.valueOf(classify));
+        obj.setPdfUrl(link);
+        iInformationQueryService.save(obj);
+    }
+
+    @Override
+    public void updateInformationQuery(String link, String classify, String nodeId, String contractId) {
+        LambdaUpdateWrapper<InformationQuery> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(InformationQuery::getPdfUrl, link);
+        updateWrapper.eq(InformationQuery::getClassify, classify);
+        updateWrapper.eq(InformationQuery::getWbsId, nodeId);
+        updateWrapper.eq(InformationQuery::getContractId, contractId);
+        iInformationQueryService.update(null, updateWrapper);
+    }
+
 }

+ 24 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TrialSelfInspectionRecordClientImpl.java

@@ -0,0 +1,24 @@
+package org.springblade.business.feignClient;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import lombok.AllArgsConstructor;
+import org.springblade.business.entity.TrialSelfInspectionRecord;
+import org.springblade.business.feign.TrialSelfInspectionRecordClient;
+import org.springblade.business.service.impl.TrialSelfInspectionRecordServiceImpl;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@AllArgsConstructor
+public class TrialSelfInspectionRecordClientImpl implements TrialSelfInspectionRecordClient {
+
+    private TrialSelfInspectionRecordServiceImpl inspectionRecordService;
+
+    @Override
+    public void updateURL(String url, String pKeyId) {
+        LambdaUpdateWrapper<TrialSelfInspectionRecord> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(TrialSelfInspectionRecord::getPdfUrl, url);
+        updateWrapper.eq(TrialSelfInspectionRecord::getId, pKeyId);
+        inspectionRecordService.update(null, updateWrapper);
+    }
+}

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

@@ -11,8 +11,10 @@
         <result column="entrust_company" property="entrustCompany"/>
         <result column="material_name" property="materialName"/>
         <result column="specification_number" property="specificationNumber"/>
+        <result column="specification_model" property="specificationModel"/>
         <result column="testing_agency_certificate_no" property="testingAgencyCertificateNo"/>
         <result column="material_count" property="materialCount"/>
+        <result column="trial_type" property="trialType"/>
         <result column="representative_count" property="representativeCount"/>
         <result column="user_name" property="userName"/>
         <result column="witness" property="witness"/>

+ 4 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSampleInfoMapper.java

@@ -3,6 +3,10 @@ package org.springblade.business.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.springblade.business.entity.TrialSampleInfo;
 
+import java.util.List;
+
 public interface TrialSampleInfoMapper extends BaseMapper<TrialSampleInfo> {
 
+    List<Long> selectTrialSelfSample();
+
 }

+ 4 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSampleInfoMapper.xml

@@ -32,5 +32,9 @@
         <result column="is_deleted" property="isDeleted"/>
     </resultMap>
 
+    <select id="selectTrialSelfSample" resultType="java.lang.Long">
+        select sampling_id from u_trial_self_sample
+    </select>
+
 
 </mapper>

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

@@ -0,0 +1,20 @@
+package org.springblade.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.business.entity.TrialSelfInspectionRecord;
+
+import java.util.List;
+
+public interface TrialSelfInspectionRecordMapper extends BaseMapper<TrialSelfInspectionRecord> {
+
+    List<TrialSelfInspectionRecord> selectAll(Long nodeId);
+
+    void saveSelfSample(Long id, Long selfId, String samplingId);
+
+    void delSelfSample(Long id);
+
+    List<String> selectSelfSampleRecord(String id);
+
+    String selectMobilizationRecord(String sampleId);
+
+}

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

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.business.mapper.TrialSelfInspectionRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="ResultEntityMap" type="org.springblade.business.entity.TrialSelfInspectionRecord">
+        <result column="id" property="id"/>
+        <result column="node_id" property="nodeId"/>
+        <result column="record_no" property="recordNo"/>
+        <result column="report_no" property="reportNo"/>
+        <result column="sampling_location" property="samplingLocation"/>
+        <result column="trial_project_name" property="trialProjectName"/>
+        <result column="type" property="type"/>
+        <result column="detection_category" property="detectionCategory"/>
+        <result column="is_upload_certificate" property="isUploadCertificate"/>
+        <result column="contract_id" property="contractId"/>
+        <result column="company" property="company"/>
+        <result column="specification_number" property="specificationNumber"/>
+        <result column="specification_model" property="specificationModel"/>
+        <result column="detection_result" property="detectionResult"/>
+        <result column="project_position" property="projectPosition"/>
+        <result column="report_date" property="reportDate"/>
+        <result column="task_status" property="taskStatus"/>
+        <result column="table_ids" property="tableIds"/>
+        <result column="sort" property="sort"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+    </resultMap>
+
+    <insert id="saveSelfSample">
+        insert into u_trial_self_sample(id,self_id,sampling_id) values(#{id},#{selfId},#{samplingId})
+    </insert>
+
+    <delete id="delSelfSample">
+        delete from u_trial_self_sample where self_id = #{id}
+    </delete>
+
+    <select id="selectAll" resultType="org.springblade.business.entity.TrialSelfInspectionRecord">
+        select * from u_trial_self_inspection_record where node_id = #{nodeId}
+    </select>
+
+    <select id="selectSelfSampleRecord" resultType="java.lang.String">
+        select sampling_id from u_trial_self_sample where self_id = #{id}
+    </select>
+
+    <select id="selectMobilizationRecord" resultType="java.lang.String">
+        select mobilization_id from u_trial_sampling_record where sample_info_id = #{sampleId}
+    </select>
+
+</mapper>

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

@@ -0,0 +1,35 @@
+package org.springblade.business.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.business.dto.RawMaterialSubmitRelationDTO;
+import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
+import org.springblade.business.dto.TrialSelfInspectionRecordPageDTO;
+import org.springblade.business.entity.TrialSelfInspectionRecord;
+import org.springblade.business.vo.SampleAncillaryDocumentsVO;
+import org.springblade.business.vo.TrialSampleInfoVO;
+import org.springblade.business.vo.TrialSelfInspectionRecordVO;
+import org.springblade.business.vo.TrialSelfInspectionRecordVO2;
+import org.springblade.core.mp.base.BaseService;
+
+import java.io.FileNotFoundException;
+import java.util.List;
+
+public interface ITrialSelfInspectionRecordService extends BaseService<TrialSelfInspectionRecord> {
+
+    IPage<TrialSelfInspectionRecordVO> selfPage(IPage<TrialSelfInspectionRecord> page, TrialSelfInspectionRecordPageDTO dto);
+
+    boolean selfSubmit(TrialSelfInspectionRecordDTO dto) throws Exception;
+
+    List<TrialSampleInfoVO> selfSampleList(String id);
+
+    List<SampleAncillaryDocumentsVO> selfAncillaryDocumentsList(String id);
+
+    boolean selfUpdateAncillaryDocuments(List<SampleAncillaryDocumentsVO> vo);
+
+    boolean selfCopy(List<Long> toLongList);
+
+    List<TrialSelfInspectionRecordVO2> getRawMaterialInfo(String nodeId, String contractId);
+
+    boolean rawMaterialSubmitRelation(RawMaterialSubmitRelationDTO dto) throws FileNotFoundException;
+
+}

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

@@ -20,11 +20,11 @@ import org.springblade.business.mapper.TrialDeviceClassificationMapper;
 import org.springblade.business.mapper.TrialDeviceInfoMapper;
 import org.springblade.business.service.ITrialDeviceInfoService;
 import org.springblade.business.utils.PDFUtil;
-import org.springblade.business.utils.SystemUtils;
 import org.springblade.business.vo.TrialDeviceInfoVO;
 import org.springblade.business.vo.TrialDeviceInfoVO3;
 import org.springblade.business.wrapper.TrialDeviceInfoWarpper;
 import org.springblade.common.utils.CommonUtil;
+import org.springblade.common.utils.SystemUtils;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.oss.model.BladeFile;

+ 1 - 4
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDeviceOverhaulServiceImpl.java

@@ -17,18 +17,16 @@ import org.springblade.business.dto.TrialDeviceOverhaulDTO;
 import org.springblade.business.entity.TrialDeviceClassification;
 import org.springblade.business.entity.TrialDeviceInfo;
 import org.springblade.business.entity.TrialDeviceOverhaul;
-import org.springblade.business.entity.TrialDeviceUse;
 import org.springblade.business.excel.TrialDeviceOverhaulExcel;
-import org.springblade.business.excel.TrialDeviceUseExcel;
 import org.springblade.business.mapper.TrialDeviceClassificationMapper;
 import org.springblade.business.mapper.TrialDeviceInfoMapper;
 import org.springblade.business.mapper.TrialDeviceOverhaulMapper;
 import org.springblade.business.service.ITrialDeviceOverhaulService;
 import org.springblade.business.utils.PDFUtil;
-import org.springblade.business.utils.SystemUtils;
 import org.springblade.business.vo.TrialDeviceOverhaulPageVO;
 import org.springblade.business.wrapper.TrialDeviceOverhaulWarpper;
 import org.springblade.common.utils.CommonUtil;
+import org.springblade.common.utils.SystemUtils;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.oss.model.BladeFile;
@@ -36,7 +34,6 @@ import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.DateUtil;
 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.stereotype.Service;
 

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

@@ -20,13 +20,13 @@ import org.springblade.business.excel.TrialDeviceUseExcel;
 import org.springblade.business.mapper.TrialDeviceClassificationMapper;
 import org.springblade.business.mapper.TrialDeviceInfoMapper;
 import org.springblade.business.utils.PDFUtil;
-import org.springblade.business.utils.SystemUtils;
 import org.springblade.business.vo.TrialDeviceUsePageVO;
 import org.springblade.business.entity.TrialDeviceUse;
 import org.springblade.business.mapper.TrialDeviceUseMapper;
 import org.springblade.business.service.ITrialDeviceUseService;
 import org.springblade.business.wrapper.TrialDeviceUseWarpper;
 import org.springblade.common.utils.CommonUtil;
+import org.springblade.common.utils.SystemUtils;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.oss.model.BladeFile;

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

@@ -23,12 +23,12 @@ import org.springblade.business.mapper.TrialSampleInfoMapper;
 import org.springblade.business.mapper.TrialSamplingRecordMapper;
 import org.springblade.business.service.ITrialMaterialMobilizationService;
 import org.springblade.business.utils.PDFUtil;
-import org.springblade.business.utils.SystemUtils;
 import org.springblade.business.vo.TrialMaterialMobilizationVO;
 import org.springblade.business.vo.TrialSamplingRecordVO;
 import org.springblade.business.wrapper.TrialMaterialMobilizationWarpper;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.common.utils.SystemUtils;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Condition;

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

@@ -21,13 +21,14 @@ import org.springblade.business.mapper.TrialSampleInfoMapper;
 import org.springblade.business.mapper.TrialSamplingRecordMapper;
 import org.springblade.business.service.ITrialSampleInfoService;
 import org.springblade.business.utils.PDFUtil;
-import org.springblade.business.utils.SystemUtils;
+import org.springblade.business.utils.StringSPUtils;
 import org.springblade.business.vo.TrialSampleInfoVO;
 import org.springblade.business.vo.TrialSampleInfoVO2;
 import org.springblade.business.vo.TrialSampleInfoVO3;
 import org.springblade.business.wrapper.TrialSampleInfoWarpper;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.common.utils.SystemUtils;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Condition;
@@ -45,6 +46,7 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -94,6 +96,14 @@ public class TrialSampleInfoServiceImpl extends BaseServiceImpl<TrialSampleInfoM
                 }
             }
         }
+        List<Long> ids = baseMapper.selectTrialSelfSample();
+        for (TrialSampleInfoVO3 trialSampleInfoVO3 : list) {
+            for (Long id : ids) {
+                if (trialSampleInfoVO3.getId().equals(id)) {
+                    trialSampleInfoVO3.setIsRelation(1);
+                }
+            }
+        }
         return list;
     }
 
@@ -145,7 +155,11 @@ public class TrialSampleInfoServiceImpl extends BaseServiceImpl<TrialSampleInfoM
             throw new ServiceException("获取用户信息失败");
         }
         obj.setUserId(SecureUtil.getUserId());
-
+        //新增时自动构建样品编号
+        if (ObjectUtil.isEmpty(obj.getId())) {
+            this.buildNumber(obj);
+        }
+        //保存
         this.saveOrUpdate(obj);
 
         //新增或者修改成功后关联样品取样信息
@@ -165,6 +179,42 @@ public class TrialSampleInfoServiceImpl extends BaseServiceImpl<TrialSampleInfoM
         return true;
     }
 
+    private void buildNumber(TrialSampleInfoDTO obj) {
+        StringSPUtils spUtils = new StringSPUtils();
+        //获取当前合同段节点下所有样品信息
+        List<TrialSampleInfo> trialSampleInfos = baseMapper.selectList(Wrappers.<TrialSampleInfo>lambdaQuery().eq(TrialSampleInfo::getContractId, obj.getContractId()).eq(TrialSampleInfo::getNodeId, obj.getNodeId()));
+        //获取记录表最大编号
+        List<String> recordNos = trialSampleInfos.stream().map(TrialSampleInfo::getSpecificationNumber).collect(Collectors.toList());
+        String maxRecordNo;
+        if (recordNos.size() == 0) {
+            maxRecordNo = "0001";
+        } else {
+            List<String> numberRecordNos = new ArrayList<>();
+            for (String recordNo : recordNos) {
+                if (recordNo.contains("YP") && recordNo.contains("-")) {
+                    String[] split = recordNo.split("-");
+                    if (split.length == 3) {
+                        String number = split[2];
+                        numberRecordNos.add(number);
+                    }
+                }
+            }
+            int maxRecordNo1 = Integer.parseInt(Collections.max(numberRecordNos)) + 1;
+            if (maxRecordNo1 < 9999 && maxRecordNo1 > 0) {
+                maxRecordNo = spUtils.buildSerial(maxRecordNo1, 4);
+            } else {
+                throw new ServiceException("当前编号已达到最大值9999,操作失败");
+            }
+        }
+
+        String time = DateUtil.time().substring(2, 8);
+
+        String str1 = "YP" +
+                "-" + time +
+                "-" + maxRecordNo;
+        obj.setSpecificationNumber(str1);
+    }
+
     @Override
     public boolean sampleCopy(List<TrialSampleInfoDTO> dto) {
         long count = dto.stream().map(TrialSampleInfoDTO::getSpecificationNumber).distinct().count();

+ 357 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java

@@ -0,0 +1,357 @@
+package org.springblade.business.service.impl;
+
+import cn.hutool.core.date.LocalDateTimeUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.time.DateUtils;
+import org.springblade.business.dto.RawMaterialSubmitRelationDTO;
+import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
+import org.springblade.business.dto.TrialSelfInspectionRecordPageDTO;
+import org.springblade.business.entity.TrialMaterialMobilization;
+import org.springblade.business.entity.TrialSampleInfo;
+import org.springblade.business.entity.TrialSelfInspectionRecord;
+import org.springblade.business.feign.InformationQueryClient;
+import org.springblade.business.mapper.TrialMaterialMobilizationMapper;
+import org.springblade.business.mapper.TrialSampleInfoMapper;
+import org.springblade.business.mapper.TrialSelfInspectionRecordMapper;
+import org.springblade.business.service.ITrialSelfInspectionRecordService;
+import org.springblade.business.utils.FileUtils;
+import org.springblade.business.utils.StringSPUtils;
+import org.springblade.business.vo.SampleAncillaryDocumentsVO;
+import org.springblade.business.vo.TrialSampleInfoVO;
+import org.springblade.business.vo.TrialSelfInspectionRecordVO;
+import org.springblade.business.vo.TrialSelfInspectionRecordVO2;
+import org.springblade.business.wrapper.TrialSelfInspectionRecordWarpper;
+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;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.oss.model.BladeFile;
+import org.springblade.core.tool.utils.*;
+import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.manager.feign.ContractClient;
+import org.springblade.manager.feign.ExcelTabClient;
+import org.springblade.manager.feign.WbsTreePrivateClient;
+import org.springblade.resource.feign.NewIOSSClient;
+import org.springblade.system.cache.ParamCache;
+import org.springblade.system.entity.Dict;
+import org.springblade.system.feign.IDictClient;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
+public class TrialSelfInspectionRecordServiceImpl
+        extends BaseServiceImpl<TrialSelfInspectionRecordMapper, TrialSelfInspectionRecord>
+        implements ITrialSelfInspectionRecordService {
+
+    private TrialSampleInfoMapper trialSampleInfoMapper;
+    private TrialMaterialMobilizationMapper trialMaterialMobilizationMapper;
+    private IUserClient iUserClient;
+    private ContractClient contractClient;
+    private WbsTreePrivateClient wbsTreePrivateClient;
+    private ExcelTabClient excelTabClient;
+    private IDictClient iDictClient;
+    private JdbcTemplate jdbcTemplate;
+    private NewIOSSClient newIOSSClient;
+    private InformationQueryClient informationQueryClient;
+
+    @Override
+    public IPage<TrialSelfInspectionRecordVO> selfPage(IPage<TrialSelfInspectionRecord> page, TrialSelfInspectionRecordPageDTO dto) {
+        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().orderBy(true, true, TrialSelfInspectionRecord::getCreateTime));
+        IPage<TrialSelfInspectionRecordVO> trialSelfInspectionRecordVOIPage = TrialSelfInspectionRecordWarpper.build().pageVO(pages);
+        List<TrialSelfInspectionRecordVO> records = trialSelfInspectionRecordVOIPage.getRecords();
+        List<Dict> trialDetectionCategory = iDictClient.getList("trial_detection_category").getData();
+        for (TrialSelfInspectionRecordVO record : records) {
+            for (Dict dict : trialDetectionCategory) {
+                if (dict.getDictKey().equals(String.valueOf(record.getDetectionCategory()))) {
+                    record.setDetectionCategoryName(dict.getDictValue());
+                }
+            }
+            record.setIsUploadCertificateName(record.getIsUploadCertificate().equals(1) ? "是" : "否");
+            record.setDetectionResultName(record.getDetectionResult().equals(1) ? "合格" : "不合格");
+            //record.setProjectPositionName(); TODO 工程部位及用途名称
+        }
+        return trialSelfInspectionRecordVOIPage.setRecords(records);
+    }
+
+    @Override
+    public List<SampleAncillaryDocumentsVO> selfAncillaryDocumentsList(String id) {
+        //获取样品ids
+        List<String> sampleIds = baseMapper.selectSelfSampleRecord(id);
+        //获取材料ids
+        List<String> mobilizationIds = new ArrayList<>();
+        for (String sampleId : sampleIds) {
+            String mobilizationId = baseMapper.selectMobilizationRecord(sampleId);
+            mobilizationIds.add(mobilizationId);
+        }
+        //获取材料附件信息
+        List<SampleAncillaryDocumentsVO> result = new ArrayList<>();
+        List<TrialMaterialMobilization> trialMaterialMobilizations = trialMaterialMobilizationMapper.selectBatchIds(mobilizationIds);
+        for (TrialMaterialMobilization trialMaterialMobilization : trialMaterialMobilizations) {
+            SampleAncillaryDocumentsVO obj = new SampleAncillaryDocumentsVO();
+            obj.setId(trialMaterialMobilization.getId());
+            obj.setName(trialMaterialMobilization.getMaterialName());
+            obj.setOtherAccessories(trialMaterialMobilization.getOtherAccessories());
+            obj.setProductionCertificate(trialMaterialMobilization.getProductionCertificate());
+            obj.setQualityInspectionReport(trialMaterialMobilization.getQualityInspectionReport());
+            result.add(obj);
+        }
+        return result;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean selfUpdateAncillaryDocuments(List<SampleAncillaryDocumentsVO> vo) {
+        for (SampleAncillaryDocumentsVO sampleAncillaryDocumentsVO : vo) {
+            TrialMaterialMobilization trialMaterialMobilization = trialMaterialMobilizationMapper.selectById(sampleAncillaryDocumentsVO.getId());
+            if (ObjectUtil.isEmpty(trialMaterialMobilization)) {
+                throw new ServiceException("未获取到对应材料信息,修改失败");
+            }
+            trialMaterialMobilization.setQualityInspectionReport(sampleAncillaryDocumentsVO.getQualityInspectionReport());
+            trialMaterialMobilization.setOtherAccessories(sampleAncillaryDocumentsVO.getOtherAccessories());
+            trialMaterialMobilization.setProductionCertificate(sampleAncillaryDocumentsVO.getProductionCertificate());
+            trialMaterialMobilizationMapper.updateById(trialMaterialMobilization);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean selfCopy(List<Long> ids) {
+        List<TrialSelfInspectionRecord> trialSelfInspectionRecords = baseMapper.selectBatchIds(ids);
+        for (TrialSelfInspectionRecord trialSelfInspectionRecord : trialSelfInspectionRecords) {
+            TrialSelfInspectionRecordDTO trialSelfInspectionRecordDTO = BeanUtil.copyProperties(trialSelfInspectionRecord, TrialSelfInspectionRecordDTO.class);
+            assert trialSelfInspectionRecordDTO != null;
+            trialSelfInspectionRecordDTO.setId(SnowFlakeUtil.getId()); //主键id
+            this.buildNumber(trialSelfInspectionRecordDTO); //重构编号
+            this.save(trialSelfInspectionRecordDTO); //复制新增
+        }
+        return true;
+    }
+
+    @Override
+    public List<TrialSelfInspectionRecordVO2> getRawMaterialInfo(String nodeId, String contractId) {
+        List<TrialSelfInspectionRecord> result = baseMapper.selectList(Wrappers.<TrialSelfInspectionRecord>lambdaQuery().eq(TrialSelfInspectionRecord::getNodeId, nodeId).eq(TrialSelfInspectionRecord::getContractId, contractId).eq(TrialSelfInspectionRecord::getStatus, 1));
+        List<TrialSelfInspectionRecordVO2> recordVO2s = BeanUtil.copyProperties(result, TrialSelfInspectionRecordVO2.class);
+        List<Long> collect = result.stream().map(TrialSelfInspectionRecord::getId).collect(Collectors.toList());
+        String ids = org.apache.commons.lang.StringUtils.join(collect, ",");
+        String sql = "select raw_material_record_id from u_trial_raw_material_self_record where self_record_id in(" + ids + ")";
+        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
+        List<Object> idsRecord = new ArrayList<>();
+        for (Map<String, Object> map : maps) {
+            for (Map.Entry<String, Object> obj : map.entrySet()) {
+                idsRecord.add(obj.getValue());
+            }
+        }
+        for (Object id : idsRecord) {
+            for (TrialSelfInspectionRecordVO2 recordVO2 : recordVO2s) {
+                if (id.equals(recordVO2.getId())) {
+                    recordVO2.setIsRawMaterialRelation(1);
+                }
+            }
+        }
+        return recordVO2s;
+    }
+
+    @Override
+    public boolean rawMaterialSubmitRelation(RawMaterialSubmitRelationDTO dto) throws FileNotFoundException {
+        if (ObjectUtil.isEmpty(dto.getId())) {
+            throw new ServiceException("请先保存填报数据后再关联原材检测报告!");
+        }
+        //删除关系
+        String sql1 = "delete from u_trial_raw_material_self_record where self_record_id ='" + dto.getId() + "'";
+        jdbcTemplate.execute(sql1);
+
+        List<String> strings = Func.toStrList(dto.getIds());
+        //新增关系
+        for (String s : strings) {
+            String sql2 = "insert into u_trial_raw_material_self_record(id,self_record_id,raw_material_record_id) values(" + SnowFlakeUtil.getId() + "," + dto.getId() + "," + s + ")";
+            jdbcTemplate.execute(sql2);
+        }
+
+        //获取ids、id下的PDF
+        List<String> ids = new ArrayList<>(strings);
+        ids.add(dto.getId());
+        List<TrialSelfInspectionRecord> trialSelfInspectionRecords = baseMapper.selectList(Wrappers.<TrialSelfInspectionRecord>lambdaQuery().in(TrialSelfInspectionRecord::getId, ids).eq(TrialSelfInspectionRecord::getStatus, 1));
+        List<String> listPDFURL = trialSelfInspectionRecords.stream().map(TrialSelfInspectionRecord::getPdfUrl).collect(Collectors.toList());
+
+        //合并PDF
+        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(listPDFURL, listPdf);
+        BladeFile bladeFile = this.newIOSSClient.uploadFile(dto.getNodeId() + ".pdf", listPdf);
+
+        if (ObjectUtil.isNotEmpty(bladeFile)) {
+            //修改pdfURL
+            String querySql = "select * from u_information_query where classify='" + dto.getType() + "' and wbs_id='" + dto.getNodeId() + "' and contract_id ='" + dto.getContractId() + "'";
+            List<Map<String, Object>> resultSQL = jdbcTemplate.queryForList(querySql);
+            if (resultSQL.size() > 0) {
+                String sql3 = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "' where classify= '" + dto.getType() + "' and wbs_id='" + dto.getNodeId() + "' and contract_id ='" + dto.getContractId() + "'";
+                jdbcTemplate.execute(sql3);
+            } else {
+                informationQueryClient.saveData(dto.getNodeId(), dto.getProjectId(), dto.getContractId(), String.valueOf(dto.getType()), bladeFile.getLink());
+            }
+            return true;
+        } else {
+            //删除关系
+            jdbcTemplate.execute(sql1);
+            return false;
+        }
+    }
+
+    @Override
+    public List<TrialSampleInfoVO> selfSampleList(String id) {
+        List<String> sampleIds = baseMapper.selectSelfSampleRecord(id);
+        List<TrialSampleInfo> trialSampleInfos = trialSampleInfoMapper.selectBatchIds(sampleIds);
+        List<User> users = iUserClient.selectUserAll();
+        List<TrialSampleInfoVO> result = new ArrayList<>();
+        for (TrialSampleInfo trialSampleInfo : trialSampleInfos) {
+            for (User user : users) {
+                if (trialSampleInfo.getUserId().equals(user.getId())) {
+                    TrialSampleInfoVO trialSampleInfoVO = BeanUtil.copyProperties(trialSampleInfo, TrialSampleInfoVO.class);
+                    if (trialSampleInfoVO != null) {
+                        trialSampleInfoVO.setUserName(ObjectUtil.isNotEmpty(user.getName()) ? user.getName() : user.getRealName());
+                        result.add(trialSampleInfoVO);
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean selfSubmit(TrialSelfInspectionRecordDTO dto) throws Exception {
+        if (ObjectUtil.isEmpty(dto.getId())) { //构建记录表编号、报告单编号
+            this.buildNumber(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);
+        }
+        String tableIdsAll = Func.toStr(tableIds).replaceAll("\\[", "").replaceAll("]", "");
+        dto.setTableIds(tableIdsAll);
+
+        this.saveOrUpdate(dto); //新增或修改
+
+        if (ObjectUtil.isNotEmpty(dto.getId())) { //关联样品
+            List<String> ids = Func.toStrList(dto.getSampleIds());
+            baseMapper.delSelfSample(dto.getId()); //删除关联信息
+            for (String id : ids) {  //新增关联信息
+                baseMapper.saveSelfSample(SnowFlakeUtil.getId(), dto.getId(), id);
+            }
+        }
+
+        //保存实体表数据、记录信息
+        String pdfURL = excelTabClient.saveTabData(dto.getDataInfo(), dto.getType(), dto.getTableType(), dto.getId());
+        if (StringUtils.isNotEmpty(pdfURL)) {
+            LambdaUpdateWrapper<TrialSelfInspectionRecord> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(TrialSelfInspectionRecord::getPdfUrl, pdfURL);
+            updateWrapper.eq(TrialSelfInspectionRecord::getId, dto.getId());
+            this.update(null, updateWrapper);
+        }
+        return true;
+    }
+
+    private void buildNumber(TrialSelfInspectionRecordDTO dto) {
+        StringSPUtils spUtils = new StringSPUtils();
+        List<TrialSelfInspectionRecord> trialSelfInspectionRecords = baseMapper.selectAll(dto.getNodeId());
+        //获取记录表最大编号
+        List<String> recordNos = trialSelfInspectionRecords.stream().map(TrialSelfInspectionRecord::getRecordNo).collect(Collectors.toList());
+        String maxRecordNo;
+        if (recordNos.size() == 0) {
+            maxRecordNo = "0001";
+        } else {
+            List<String> numberRecordNos = new ArrayList<>();
+            for (String recordNo : recordNos) {
+                String number = recordNo.split("-")[4];
+                numberRecordNos.add(number);
+            }
+            int maxRecordNo1 = Integer.parseInt(Collections.max(numberRecordNos)) + 1;
+            if (maxRecordNo1 < 9999 && maxRecordNo1 > 0) {
+                maxRecordNo = spUtils.buildSerial(maxRecordNo1, 4);
+            } else {
+                throw new ServiceException("当前编号已达到最大值9999,操作失败");
+            }
+        }
+
+        //获取报告单最大编号
+        List<String> reportNos = trialSelfInspectionRecords.stream().map(TrialSelfInspectionRecord::getReportNo).collect(Collectors.toList());
+        String maxReportNo;
+        if (reportNos.size() == 0) {
+            maxReportNo = "0001";
+        } else {
+            List<String> numberReportNo = new ArrayList<>();
+            for (String reportNo : reportNos) {
+                String number = reportNo.split("-")[4];
+                numberReportNo.add(number);
+            }
+            int maxReportNo1 = Integer.parseInt(Collections.max(numberReportNo)) + 1;
+            if (maxReportNo1 < 9999 && maxReportNo1 > 0) {
+                maxReportNo = spUtils.buildSerial(maxReportNo1, 4);
+            } else {
+                throw new ServiceException("当前编号已达到最大值9999,操作失败");
+            }
+        }
+
+        List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateClient.queryByPKeyIds(Func.toStrList(String.valueOf(dto.getNodeId())));
+        WbsTreePrivate wbsTreePrivate = wbsTreePrivates.stream().findAny().orElse(null);
+        ContractInfo contract = contractClient.getContractById(dto.getContractId());
+        int year = LocalDateTimeUtil.now().getYear();
+        if (wbsTreePrivate != null) {
+            //记录表
+            String str1 = "JL" +
+                    "-" + contract.getContractNumber() +
+                    "-" + year +
+                    "-" + spUtils.getStringSP(wbsTreePrivate.getNodeName()) +
+                    "-" + maxRecordNo;
+            dto.setRecordNo(str1);
+
+            //报告单
+            String str2 = "BG" +
+                    "-" + contract.getContractNumber() +
+                    "-" + year +
+                    "-" + spUtils.getStringSP(wbsTreePrivate.getNodeName()) +
+                    "-" + maxReportNo;
+            dto.setReportNo(str2);
+        }
+    }
+
+}

+ 134 - 0
blade-service/blade-business/src/main/java/org/springblade/business/utils/StringSPUtils.java

@@ -0,0 +1,134 @@
+package org.springblade.business.utils;
+
+public class StringSPUtils {
+
+    /***
+     * 字母Z使用了两个标签,这里有27个值
+     * i, u, v都不做声母, 跟随前面的字母
+     */
+    private char[] chartable =
+            {
+                    '啊', '芭', '擦', '搭', '蛾', '发', '噶', '哈', '哈',
+                    '击', '喀', '垃', '妈', '拿', '哦', '啪', '期', '然',
+                    '撒', '塌', '塌', '塌', '挖', '昔', '压', '匝', '座'
+            };
+    private char[] alphatable =
+            {
+                    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
+                    'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
+                    'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
+            };
+    private int[] table = new int[27];
+
+    //初始化
+    {
+        for (int i = 0; i < 27; ++i) {
+            table[i] = gbValue(chartable[i]);
+        }
+    }
+
+    public StringSPUtils() {
+    }
+
+    //主函数,输入字符,得到他的声母,
+    //英文字母返回对应的大写字母
+    //其他非简体汉字返回 '0'
+    public char Char2Alpha(char ch) {
+        if (ch >= 'a' && ch <= 'z')
+            return (char) (ch - 'a' + 'A');
+        if (ch >= 'A' && ch <= 'Z')
+            return ch;
+        int gb = gbValue(ch);
+        if (gb < table[0])
+            return '0';
+        int i;
+        for (i = 0; i < 26; ++i) {
+            if (match(i, gb)) break;
+        }
+        if (i >= 26)
+            return '0';
+        else
+            return alphatable[i];
+    }
+
+    //根据一个包含汉字的字符串返回一个汉字拼音首字母的字符串
+    public String getStringSP(String SourceStr) {
+        StringBuilder Result = new StringBuilder();
+        int StrLength = SourceStr.length();
+        int i;
+        try {
+            for (i = 0; i < StrLength; i++) {
+                Result.append(Char2Alpha(SourceStr.charAt(i)));
+            }
+        } catch (Exception e) {
+            Result = new StringBuilder();
+        }
+        return Result.toString();
+    }
+
+    private boolean match(int i, int gb) {
+        if (gb < table[i])
+            return false;
+        int j = i + 1;
+        //字母Z使用了两个标签
+        while (j < 26 && (table[j] == table[i])) ++j;
+        if (j == 26)
+            return gb <= table[j];
+        else
+            return gb < table[j];
+    }
+
+    //取出汉字的编码
+    private int gbValue(char ch) {
+        String str = "";
+        str += ch;
+        try {
+            byte[] bytes = str.getBytes("GB2312");
+            if (bytes.length < 2)
+                return 0;
+            return (bytes[0] << 8 & 0xff00) + (bytes[1] &
+                    0xff);
+        } catch (Exception e) {
+            return 0;
+        }
+    }
+
+    /***
+     * 按格式生成序号,如0001,0002...9999
+     * @param num 数字
+     * @param scale 位数
+     * @return 按位数格式化的序号,如0019
+     */
+    public String buildSerial(int num, int scale) {
+        if (scale <= 0) {
+            throw new IllegalArgumentException("scale:" + scale);
+        }
+        int count = 0;
+        int aIdx = num;
+        while ((aIdx = aIdx / 10) > 0) {
+            count++;
+        }
+        count++;
+        if (count > scale || num <= 0) {
+            throw new IllegalArgumentException("idx:" + num);
+        }
+        StringBuilder buf = new StringBuilder(scale);
+        for (int i = scale - count; --i >= 0; ) {
+            buf.append(0);
+        }
+        buf.append(num);
+        return buf.toString();
+    }
+
+    /*public static void main(String[] args) {
+        StringSPUtils obj1 = new StringSPUtils();
+        System.out.println(obj1.getStringSP("你好"));
+        System.out.println(obj1.getStringSP("欢迎你"));
+        String s = obj1.buildSerial(1, 4);
+        System.out.println(s);
+        String time = DateUtil.time().substring(2, 8);
+        System.out.println(time);
+    }*/
+
+}
+

+ 6 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TrialParamConfigurationController.java

@@ -49,15 +49,15 @@ public class TrialParamConfigurationController extends BladeController {
     @PostMapping("/compaction/submit")
     @ApiOperationSupport(order = 3)
     @ApiOperation(value = "压实度新增或修改", notes = "传入TrialCompactionEvaluationParam")
-    public R<Object> compactionSubmit(@RequestBody TrialCompactionEvaluationParam obj) {
+    public R<Object> compactionSubmit(@Valid @RequestBody TrialCompactionEvaluationParam obj) {
         return R.status(iTrialCompactionEvaluationParamService.compactionSubmit(obj));
     }
 
     @PostMapping("/compaction/remove")
     @ApiOperationSupport(order = 4)
     @ApiOperation(value = "压实度批量删除", notes = "传入ids")
-    public R<Object> compactionRemove(@Valid @RequestParam Long ids) {
-        return R.status(iTrialCompactionEvaluationParamService.deleteLogic(Func.toLongList(String.valueOf(ids))));
+    public R<Object> compactionRemove(@Valid @RequestParam String ids) {
+        return R.status(iTrialCompactionEvaluationParamService.deleteLogic(Func.toLongList(ids)));
     }
 
     @PostMapping("/compaction/import-excel")
@@ -86,15 +86,15 @@ public class TrialParamConfigurationController extends BladeController {
     @PostMapping("/temperature-density/submit")
     @ApiOperationSupport(order = 8)
     @ApiOperation(value = "温度及密度新增或修改", notes = "传入TrialTemperatureDensityParam")
-    public R<Object> temperatureAndDensitySubmit(@RequestBody TrialTemperatureDensityParam obj) {
+    public R<Object> temperatureAndDensitySubmit(@Valid @RequestBody TrialTemperatureDensityParam obj) {
         return R.status(iTrialTemperatureDensityParamService.temperatureAndDensitySubmit(obj));
     }
 
     @PostMapping("/temperature-density/remove")
     @ApiOperationSupport(order = 9)
     @ApiOperation(value = "温度及密度批量删除", notes = "传入ids")
-    public R<Object> temperatureAndDensityRemove(@Valid @RequestParam Long ids) {
-        return R.status(iTrialTemperatureDensityParamService.deleteLogic(Func.toLongList(String.valueOf(ids))));
+    public R<Object> temperatureAndDensityRemove(@Valid @RequestParam String ids) {
+        return R.status(iTrialTemperatureDensityParamService.deleteLogic(Func.toLongList(ids)));
     }
 
     @PostMapping("/temperature-density/import-excel")

+ 22 - 16
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -16,7 +16,6 @@ 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.Func;
 import org.springblade.manager.dto.WbsTreePrivateDTO2;
 import org.springblade.manager.dto.WbsTreePrivateDTO3;
 import org.springblade.manager.entity.ProjectInfo;
@@ -35,7 +34,6 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
 
-import java.io.IOException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -482,10 +480,6 @@ public class WbsTreePrivateController extends BladeController {
         return R.status(wbsTreePrivateService.syncNodeTable(primaryKeyId));
     }
 
-
-
-
-
     /**
      * wbs私有树懒加载获取项目私有节点树形结构--(表单类型划分树)
      */
@@ -499,7 +493,7 @@ public class WbsTreePrivateController extends BladeController {
     })
     public R<IPage<TreeNodeVOByTabType>> tabTypeLazyTree(Long parentId, String projectId, BladeUser bladeUser, String titleName, Query query) {
 
-        IPage<TreeNodeVOByTabType> page= wbsTreePrivateService.tabTypeLazyTree(Condition.getPage(query),parentId, projectId,titleName);
+        IPage<TreeNodeVOByTabType> page = wbsTreePrivateService.tabTypeLazyTree(Condition.getPage(query), parentId, projectId, titleName);
         return R.data(page);
     }
 
@@ -511,8 +505,8 @@ public class WbsTreePrivateController extends BladeController {
             @ApiImplicitParam(name = "primaryKeyIds", value = "表的注解ids(多个以,隔开)", required = true),
             @ApiImplicitParam(name = "contractId", value = "合同段Id", required = true),
     })
-    public R addWbsTreeContractInfo(String nodeId,String primaryKeyIds,long contractId){
-        return wbsTreePrivateService.addWbsTreeContractInfo(nodeId,primaryKeyIds,contractId);
+    public R addWbsTreeContractInfo(String nodeId, String primaryKeyIds, long contractId) {
+        return wbsTreePrivateService.addWbsTreeContractInfo(nodeId, primaryKeyIds, contractId);
     }
 
     /**
@@ -525,8 +519,8 @@ public class WbsTreePrivateController extends BladeController {
             @ApiImplicitParam(name = "parentId", value = "父级id", required = true),
             @ApiImplicitParam(name = "titleName", value = "搜索关键字", required = true)
     })
-    public R<IPage<TreeNodeVOByTabType>> tabTypeLazyTreeAll(Long parentId,BladeUser bladeUser, String titleName, Query query) {
-        IPage<TreeNodeVOByTabType> page= wbsTreePrivateService.tabTypeLazyTreeAll(Condition.getPage(query),parentId,titleName);
+    public R<IPage<TreeNodeVOByTabType>> tabTypeLazyTreeAll(Long parentId, BladeUser bladeUser, String titleName, Query query) {
+        IPage<TreeNodeVOByTabType> page = wbsTreePrivateService.tabTypeLazyTreeAll(Condition.getPage(query), parentId, titleName);
         return R.data(page);
     }
 
@@ -537,8 +531,8 @@ 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){
-        return wbsTreePrivateService.addWbsTreeProjectInfo(primaryKeyIds,projectId);
+    public R addProjectTabInfo(String primaryKeyIds, String projectId) {
+        return wbsTreePrivateService.addWbsTreeProjectInfo(primaryKeyIds, projectId);
     }
 
     @PostMapping("/del-aprojecttab-info")
@@ -548,8 +542,8 @@ public class WbsTreePrivateController extends BladeController {
             @ApiImplicitParam(name = "primaryKeyIds", value = "表的注解ids(多个以,隔开)", required = true),
             @ApiImplicitParam(name = "projectId", value = "项目id", required = true),
     })
-    public R delTabProjectById(String primaryKeyIds,String projectId){
-        return wbsTreePrivateService.delTabProjectById(primaryKeyIds,projectId);
+    public R delTabProjectById(String primaryKeyIds, String projectId) {
+        return wbsTreePrivateService.delTabProjectById(primaryKeyIds, projectId);
     }
 
     @PostMapping("/del-tab-info-all")
@@ -558,9 +552,21 @@ public class WbsTreePrivateController extends BladeController {
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "primaryKeyIds", value = "表的注解ids(多个以,隔开)", required = true)
     })
-    public R delTabInfoAll(String primaryKeyIds){
+    public R delTabInfoAll(String primaryKeyIds) {
 
         return R.success("成功");
     }
 
+    @GetMapping("/search-node-tables")
+    @ApiOperationSupport(order = 22)
+    @ApiOperation(value = "试验-根据所属方查询当前节点表信息", notes = "传入节点primaryKeyId、所属方type=1施工,=2监理 ;表单类型tableType=1记录表,=2报告单; 合同段id、项目id")
+    public R<List<WbsTreePrivate>> searchNodeAllTable(String primaryKeyId, String type, String tableType, String contractId, String projectId) {
+        List<WbsTreePrivate> list = wbsTreePrivateService.searchNodeAllTable(primaryKeyId, type, tableType, contractId, projectId);
+        if (list.size() > 0) {
+            return R.data(list);
+        }
+        return R.fail(200, "未查询到数据");
+    }
+
+
 }

+ 53 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java

@@ -1,10 +1,16 @@
 package org.springblade.manager.feign;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import lombok.AllArgsConstructor;
+import org.springblade.core.tool.api.R;
+import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.entity.ExcelTab;
 import org.springblade.manager.service.IExcelTabService;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 @RestController
 @AllArgsConstructor
 public class ExcelTabClientImpl implements ExcelTabClient {
@@ -15,4 +21,51 @@ public class ExcelTabClientImpl implements ExcelTabClient {
     public ExcelTab getById(String id) {
         return this.excelTabService.getById(id);
     }
+
+    @Override
+    public String saveTabData(JSONObject dataInfo, Integer type, Integer tableType, Long id) throws Exception {
+        JSONArray dataArray = dataInfo.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 = "";
+        if (dataArray.size() == 1) {
+            //单表PDF
+            //保存数据到数据库-试验
+            this.excelTabService.saveOrUpdateInfoTrial(tableInfoList);
+            //公式
+            try {
+                this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeId));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            //单表PDF加载
+            for (TableInfo tableInfo : tableInfoList) {
+                excelTabService.getBussPDFTrial(tableInfo, Long.valueOf(tableInfo.getPkeyId()), contractId);
+            }
+
+        } else if (dataArray.size() > 1) {
+            //多表PDF
+            this.excelTabService.saveOrUpdateInfoTrial(tableInfoList);
+            try {
+                this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeId));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            //合并PDF加载
+            pdfUrl = excelTabService.getBussPDFSTrial(nodeId,
+                    tableType, //tableType = 表类型 1=记录表 2=报告单
+                    String.valueOf(type), //type = 所属方 1=施工质检 2=监理抽检
+                    contractId,
+                    projectId);
+        }
+        return pdfUrl;
+    }
+
 }

+ 119 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreePrivateClientImpl.java

@@ -2,23 +2,32 @@ package org.springblade.manager.feign;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
+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.WbsTreePrivate;
 import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.manager.vo.WbsTreePrivateVO;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @RestController
 @AllArgsConstructor
 public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
 
     private final IWbsTreePrivateService wbsTreePrivateService;
+    private final JdbcTemplate jdbcTemplate;
 
     @Override
     public List<WbsTreePrivate> queryAllNodeByProjectId(String projectId) {
@@ -53,6 +62,114 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
         return null;
     }
 
+    @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));
+
+        List<WbsTreePrivate> wbsTreePrivateList = wbsTreePrivateService.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                .eq(WbsTreePrivate::getId, wbsTreePrivate.getId())
+                .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+                .eq(WbsTreePrivate::getWbsType, wbsTreePrivate.getWbsType())
+                .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                .eq(WbsTreePrivate::getParentId, wbsTreePrivate.getParentId()));
+
+        List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateList.stream().sorted(Comparator.comparing(WbsTreePrivate::getCreateTime).reversed()).collect(Collectors.toList());
+
+        long newPkId = SnowFlakeUtil.getId();
+        wbsTreePrivate.setPKeyId(newPkId);
+        wbsTreePrivate.setCreateTime(new Date());
+        String nodeName = wbsTreePrivates.get(0).getNodeName();
+
+        if (nodeName.contains("__")) {
+            String[] oldName = nodeName.split("__");
+            nodeName = oldName[0] + "__" + (Integer.parseInt(oldName[1]) + 1);
+        } else {
+            nodeName = nodeName + "__" + 1;
+        }
+        wbsTreePrivate.setNodeName(nodeName);
+        wbsTreePrivate.setIsTabPdf(1); // pdf=不能预览
+        wbsTreePrivate.setIsBussShow(1); // 是否隐藏表=否
+        wbsTreePrivate.setPdfUrl("");
+
+        String tabName = wbsTreePrivate.getInitTableName();
+
+        //字段查询 并去掉公式字段
+        String colkeys = "SELECT GROUP_CONCAT(e_key) as colkeys from m_wbs_tree a ,m_wbs_form_element b WHERE a.init_table_name = '" + tabName + "' and a.id=b.f_id and b.id not in(SELECT element_id from m_formula c where c.is_deleted=0) ";
+        Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(colkeys);
+        colkeys = stringObjectMap.get("colkeys") + "";
+        //复制表数据
+        String querySql = "select " + colkeys + " from " + tabName + " where p_key_id=" + pKeyId;
+        List<Map<String, Object>> dataList = jdbcTemplate.queryForList(querySql);
+        if (dataList != null && dataList.size()>=1) {
+            Map<String, Object> dataMap2 = dataList.get(0);
+
+            dataMap2.remove("p_key_id");
+            dataMap2.remove("id");
+
+            //sql组装
+            String sqlInfo = "";
+
+            sqlInfo = "INSERT INTO " + tabName + " ( ";
+
+            String keyStr = "id,p_key_id,";
+            String valStr = SnowFlakeUtil.getId() + "," + wbsTreePrivate.getPKeyId() + ",";
+
+            for (String keys : dataMap2.keySet()) {
+                if (!(dataMap2.get(keys) + "").equals("null")) {
+                    keyStr += keys + ",";
+                    valStr += "'" + dataMap2.get(keys) + "',";
+                }
+            }
+            keyStr = keyStr.substring(0, keyStr.lastIndexOf(","));
+            valStr = valStr.substring(0, valStr.lastIndexOf(","));
+
+            sqlInfo = sqlInfo + keyStr + ") VALUES (" + valStr + ")";
+
+            //huangJN 保存成功后调用生成资料查询列表数据
+            jdbcTemplate.execute(sqlInfo);
+        }
+        wbsTreePrivateService.save(wbsTreePrivate);
+
+        return true;
+    }
+
+    @Override
+    public boolean removeBussTabInfoById(Long pKeyId) {
+        String sql = "delete from m_wbs_tree_private where p_key_id = '"+pKeyId+"'";
+        jdbcTemplate.execute(sql);
+        return true;
+    }
+
+    @Override
+    public List<WbsTreePrivateVO> getRawMaterialTree(Long pKeyId) {
+        WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getBaseMapper().selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, pKeyId));
+        List<Long> ids = Func.toLongList(wbsTreePrivate.getMixRatioTestIds());
+        List<WbsTreePrivate> result = wbsTreePrivateService.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                .in(WbsTreePrivate::getId, ids)
+                .eq(WbsTreePrivate::getProjectId,wbsTreePrivate.getProjectId())
+                .eq(WbsTreePrivate::getWbsId,wbsTreePrivate.getWbsId())
+                .eq(WbsTreePrivate::getWbsType,wbsTreePrivate.getWbsType())
+                .eq(WbsTreePrivate::getStatus,1)
+        );
+        List<WbsTreePrivateVO> wbsTreePrivateVOS = BeanUtil.copyProperties(result, WbsTreePrivateVO.class);
+        return ForestNodeMerger.merge(wbsTreePrivateVOS);
+    }
+
     private void foreachSetChildList(List<WbsTreeContractTreeVOS> vosResult, List<WbsTreePrivateVO> voList){
         voList.forEach(wbsTreePrivateVO -> {
             WbsTreeContractTreeVOS vos = new WbsTreeContractTreeVOS();
@@ -78,6 +195,5 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
     @Override
     public WbsTreePrivate queryPeersNodeByProjectIdAndId(String projectId, Long id) {
         return this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, projectId).eq(WbsTreePrivate::getId, id).eq(WbsTreePrivate::getIsDeleted, 0));
-
     }
 }

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

@@ -65,4 +65,5 @@ public interface ExcelTabMapper extends BaseMapper<ExcelTab> {
 							 @Param("parentId") Long parentId);
 
 	Integer removeBussTabInfoById(@Param("pkeyid") String pkeyid);
+
 }

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

@@ -45,18 +45,18 @@
         <result column="type" property="type"/>
     </resultMap>
 
-
     <select id="selectExcelTabPage" resultMap="excelTabResultMap">
         select x.id,x.create_time,x.name,
-               (SELECT count(1) from m_excel_tab a where  FIND_IN_SET(x.id,a.alias) and a.is_deleted = 0 and a.file_type=3) as tab_cout
-        from m_excel_tab x  where is_deleted = 0 and parent_id =#{param2.parentId}
+        (SELECT count(1) from m_excel_tab a where FIND_IN_SET(x.id,a.alias) and a.is_deleted = 0 and a.file_type=3) as
+        tab_cout
+        from m_excel_tab x where is_deleted = 0 and parent_id =#{param2.parentId}
         <if test="excelTab.name!=null and excelTab.name!=''">
-            AND x.name  like concat(concat('%', #{excelTab.name}),'%')
+            AND x.name like concat(concat('%', #{excelTab.name}),'%')
         </if>
 
     </select>
 
-    <select id="tabLazyTree" resultMap="treeNodeResultMap" >
+    <select id="tabLazyTree" resultMap="treeNodeResultMap">
         SELECT
         dept.id,
         dept.parent_id,
@@ -74,7 +74,7 @@
         FROM
         m_excel_tab dept
         WHERE
-         dept.is_deleted = 0
+        dept.is_deleted = 0
         <if test="param3!=null and param3!=''">
             AND dept.parent_id = #{param3}
         </if>
@@ -90,17 +90,17 @@
 
     <select id="getWbsTypeList" resultMap="wbsResultMap">
         select * from (
-                 SELECT a.project_id                                as id,
-                        CONCAT_WS("_", b.project_name, a.full_name) as wbsName,
-                        2                                           as wbsType
-                 from m_wbs_tree_private a,
-                      m_project_info b
-                 where a.is_deleted = 0
-                   and a.parent_id = 0
-                   and a.project_id = b.id
-                   and b.is_deleted = 0
-                 union ALL
-                 SELECT id, c.wbs_name, 1 as wbsType FROM m_wbs_info c  where c.is_deleted = 0
+        SELECT a.project_id as id,
+        CONCAT_WS("_", b.project_name, a.full_name) as wbsName,
+        2 as wbsType
+        from m_wbs_tree_private a,
+        m_project_info b
+        where a.is_deleted = 0
+        and a.parent_id = 0
+        and a.project_id = b.id
+        and b.is_deleted = 0
+        union ALL
+        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!=''">
             and d.wbsType = #{wbstype}
@@ -131,7 +131,7 @@
             and dept.tenant_id = #{tenantId}
         </if>
         AND dept.project_id = #{wbsId}
-/*        AND dept.type = 1
+        /* AND dept.type = 1
         AND status = 1*/
         ORDER BY dept.sort
     </select>
@@ -160,12 +160,12 @@
             and dept.tenant_id = #{tenantId}
         </if>
         AND dept.project_id = #{wbsId}
-        /*        AND dept.type = 1
+        /* AND dept.type = 1
         AND status = 1*/
         ORDER BY dept.sort
     </select>
 
-    <select id="tabLazyTreeAll" resultMap="treeNodeResultMap" >
+    <select id="tabLazyTreeAll" resultMap="treeNodeResultMap">
         SELECT
         dept.id,
         dept.parent_id,
@@ -182,7 +182,7 @@
         FROM
         m_excel_tab dept
         WHERE
-         dept.is_deleted = 0
+        dept.is_deleted = 0
         <if test="param1!=null and param1!=''">
             and dept.tenant_id = #{param1}
         </if>
@@ -196,7 +196,7 @@
         ORDER BY dept.create_time
     </select>
 
-    <delete id="removeBussTabInfoById" >
+    <delete id="removeBussTabInfoById">
         delete from m_wbs_tree_contract where p_key_id = #{pkeyid}
     </delete>
 

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java

@@ -84,4 +84,7 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
     List<WbsNodeTableVO> selectNodeTabAndParamList(String id, String wbsId, String projectId);
 
     void delTabProjectById(String pKeyId,String projectId);
+
+    List<WbsTreePrivate> selectWbsTreeContractList(List<String> tableOwnerNumbers,String tableType, String projectId, String wbsId, Long parentId, List<String> tableOwnerList);
+
 }

+ 26 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -279,7 +279,8 @@
                 table_type = #{item.tableType},
                 table_owner = #{item.tableOwner},
                 fill_rate = #{item.fillRate},
-                import_matching_info = #{item.importMatchingInfo}
+                import_matching_info = #{item.importMatchingInfo},
+                mix_ratio_test_ids = #{item.mixRatioTestIds}
             </set>
             WHERE id = #{item.id}
             AND project_id = #{item.projectId}
@@ -621,7 +622,31 @@
         </if>
     </select>
 
+    <select id="selectWbsTreeContractList" resultType="org.springblade.manager.entity.WbsTreePrivate">
+        SELECT * FROM
+        m_wbs_tree_private
+        WHERE project_id = #{projectId}
+        AND wbs_id = #{wbsId}
+        AND parent_id = #{parentId}
+        AND table_type = #{tableType}
+        AND table_owner in
+        <foreach item="tableOwnerNumbers" collection="tableOwnerNumbers" open="(" close=")" separator=",">
+            #{tableOwnerNumbers}
+        </foreach>
+        AND type = 2
+        AND status = 1
+        AND is_deleted = 0
+        <if test="tableOwnerList != null and tableOwnerList!= ''">
+            AND table_owner in
+            <foreach item="tableOwnerList" collection="tableOwnerList" open="(" close=")" separator=",">
+                #{tableOwnerList}
+            </foreach>
+        </if>
+        ORDER BY sort,node_name,create_time
+    </select>
+
     <delete id="delTabProjectById">
         delete m_wbs_tree_private WHERE p_key_id = #{pKeyId} and project_id=#{projectId}AND type = 10
     </delete>
+
 </mapper>

+ 69 - 59
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java

@@ -17,8 +17,6 @@
 package org.springblade.manager.service;
 
 import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.api.R;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.entity.ExcelTab;
@@ -42,81 +40,93 @@ import java.util.Map;
  */
 public interface IExcelTabService extends BaseService<ExcelTab> {
 
-	/**
-	 * 自定义分页
-	 *
-	 * @param page
-	 * @param excelTab
-	 * @return
-	 */
-	IPage<ExcelTabVO> selectExcelTabPage(IPage<ExcelTabVO> page, ExcelTabVO excelTab);
+    /**
+     * 自定义分页
+     *
+     * @param page
+     * @param excelTab
+     * @return
+     */
+    IPage<ExcelTabVO> selectExcelTabPage(IPage<ExcelTabVO> page, ExcelTabVO excelTab);
 
 
+    /**
+     * 懒加载树形结构
+     *
+     * @param tenantId
+     * @param modeId
+     * @return
+     */
+    List<ExceTabTreVO> tabLazyTree(String tenantId, Long modeId, Long parentId);
 
-	/**
-	 * 懒加载树形结构
-	 *
-	 * @param tenantId
-	 * @param modeId
-	 * @return
-	 */
-	List<ExceTabTreVO> tabLazyTree(String tenantId, Long modeId,Long parentId);
 
+    List<ExceTabTreVO> tabLazyTreeAll(String tenantId, Long modeId, String name);
 
-	List<ExceTabTreVO> tabLazyTreeAll(String tenantId, Long modeId,String name);
 
+    /**
+     * 获取wbs类型
+     */
+    List<ExcelTabWbsTypeVO> getWbsTypeList(Integer wbstype);
 
-	/**
-	 * 获取wbs类型
-	 */
-	List<ExcelTabWbsTypeVO> getWbsTypeList(Integer wbstype);
+    /**
+     * 懒加载 -- 公有web树
+     */
+    List<WbsTreeVO> lazyTree(String wbsId, String tenantId, Long parentId);
 
-	/**
-	 * 懒加载 -- 公有web树
-	 */
-	List<WbsTreeVO> lazyTree(String wbsId, String tenantId, Long parentId);
 
+    /**
+     * 懒加载 -- 私有项目 wbs 树
+     */
+    List<WbsTreeVO> lazyTreeByPri(String wbsId, String tenantId, Long parentId);
 
-	/**
-	 * 懒加载 -- 私有项目 wbs 树
-	 */
-	List<WbsTreeVO> lazyTreeByPri(String wbsId, String tenantId, Long parentId);
+    boolean removeBussTabInfoById(String pkeyid);
 
-	boolean removeBussTabInfoById(String pkeyid);
 
+    /**
+     * 表格数据封装
+     */
+    List<TableInfo> getTableInfoList(JSONArray dataArray);
 
-	/**
-	 *  表格数据封装
-	 */
-	List<TableInfo>  getTableInfoList(JSONArray dataArray);
-	/**
-	 *  公式填充
-	 */
-	void  formulaFillData(List<TableInfo> tableInfoList,Long nodeId);
-	/**
-	 *  结果信息持久化
-	 */
-	void saveOrUpdateInfo(List<TableInfo> tableInfoList) throws SQLException;
+    /**
+     * 公式填充
+     */
+    void formulaFillData(List<TableInfo> tableInfoList, Long nodeId);
 
-	 Map<String,String> getTablbCols(String pkeyid, String colkey) throws FileNotFoundException;
+    /**
+     * 结果信息持久化
+     */
+    void saveOrUpdateInfo(List<TableInfo> tableInfoList) throws SQLException;
 
-	 // 单个pdf 生成
-	R getBussPdfInfo(Long pkeyId) throws Exception;
+    /**
+     * 结果信息持久化 - 试验
+     */
+    void saveOrUpdateInfoTrial(List<TableInfo> tableInfoList) throws SQLException;
 
-	// 多个pdf 合并
-	void getBussPdfs(String nodeId, String classify, String contractId, String projectId) throws Exception;
+    Map<String, String> getTablbCols(String pkeyid, String colkey) throws FileNotFoundException;
 
-	// 获取用户端 单个表单接口数据
-	R getBussDataInfo(Long pkeyId);
+    // 单个pdf 生成
+    R getBussPdfInfo(Long pkeyId) throws Exception;
 
-	/**
-	 * 保存 首件数据
-	 */
-	String saveOrUpdateFirst(List<TableInfo> tableInfoList);
+    // 多个pdf 合并
+    void getBussPdfs(String nodeId, String classify, String contractId, String projectId) throws Exception;
 
-	/**
-	 * 保存 日志数据
-	 */
-	String saveOrUpdateTheLog(List<TableInfo> tableInfoList);
+    // 单PDF 生成 - 试验
+    String getBussPDFTrial(TableInfo tableInfo, Long pKeyId, String contractId) throws Exception;
+
+    // 多PDF 合并 - 试验
+    String getBussPDFSTrial(String nodeId, Integer tableType, String classify, String contractId, String projectId) throws Exception;
+
+    // 获取用户端 单个表单接口数据
+    R getBussDataInfo(Long pkeyId);
+
+    /**
+     * 保存 首件数据
+     */
+    String saveOrUpdateFirst(List<TableInfo> tableInfoList);
+
+    /**
+     * 保存 日志数据
+     */
+    String saveOrUpdateTheLog(List<TableInfo> tableInfoList);
 
 }

+ 7 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java

@@ -28,7 +28,7 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
     IPage<TreeNodeVOByTabType> tabTypeLazyTree(IPage<TreeNodeVOByTabType> page, Long parentId, String projectId, String titleName);
 
     // 元素
-    IPage<TreeNodeVOByTabType> tabTypeLazyTreeAll(IPage<TreeNodeVOByTabType> page, Long parentId,String titleName);
+    IPage<TreeNodeVOByTabType> tabTypeLazyTreeAll(IPage<TreeNodeVOByTabType> page, Long parentId, String titleName);
 
     List<WbsTreePrivateDTO2> findWbsTreePrivateSameLevel(String projectId, String parentId, String wbsId);
 
@@ -56,10 +56,13 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
 
     boolean syncNodeTable(String primaryKeyId);
 
-    R addWbsTreeContractInfo(String nodeId, String primaryKeyIds,long contractId);
+    R addWbsTreeContractInfo(String nodeId, String primaryKeyIds, long contractId);
 
     // 向项目添加元素
-    R addWbsTreeProjectInfo (String primaryKeyIds,String projectId);
+    R addWbsTreeProjectInfo(String primaryKeyIds, String projectId);
+
+    R delTabProjectById(String primaryKeyIds, String projectId);
+
+    List<WbsTreePrivate> searchNodeAllTable(String primaryKeyId, String classify, String tableType, String contractId, String projectId);
 
-    R delTabProjectById(String primaryKeyIds,String projectId);
 }

+ 353 - 43
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -18,7 +18,6 @@ package org.springblade.manager.service.impl;
 
 import cn.hutool.core.date.StopWatch;
 import cn.hutool.log.StaticLog;
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -34,10 +33,12 @@ import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 import org.springblade.business.feign.ContractLogClient;
 import org.springblade.business.feign.InformationQueryClient;
+import org.springblade.business.feign.TrialSelfInspectionRecordClient;
 import org.springblade.business.vo.SaveContractLogVO;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
@@ -58,19 +59,15 @@ import org.springblade.manager.vo.WbsTreeVO;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.datasource.DataSourceUtils;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.imageio.ImageIO;
-import javax.sql.DataSource;
 import java.awt.*;
 import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.sql.Connection;
+import java.io.*;
 import java.sql.SQLException;
 import java.util.*;
 import java.util.List;
@@ -113,6 +110,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
     private final IProjectInfoService projectInfoService;
 
+    private final TrialSelfInspectionRecordClient inspectionRecordClient;
+
 
     @Override
     public IPage<ExcelTabVO> selectExcelTabPage(IPage<ExcelTabVO> page, ExcelTabVO excelTab) {
@@ -342,7 +341,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 });
                 stopWatch.start("公式处理");
                 List<Formula> formulas = this.formulaService.getFormulaList(keyMappers);
-                WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,nodeId));
+                WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, nodeId));
                 TableElementConverter tec = new TableElementConverter(tableInfoList, keyMappers, formulas, coordinateMap, wtc);
                 if (tec.isPresent()) {
                     tec.before();
@@ -596,6 +595,49 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         }
     }
 
+    @Override
+    @Transactional
+    public void saveOrUpdateInfoTrial(List<TableInfo> tableInfoList) throws SQLException {
+        //试验填报
+        if (ListUtils.isNotEmpty(tableInfoList)) {
+            try {
+                for (TableInfo tableInfo : tableInfoList) {
+                    WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getBaseMapper().selectOne(Wrappers.<WbsTreePrivate>query().lambda()
+                            .eq(WbsTreePrivate::getPKeyId, tableInfo.getPkeyId()));
+                    if (wbsTreePrivate == null) {
+                        continue;
+                    }
+
+                    String tabName = wbsTreePrivate.getInitTableName();
+                    // 判读修改还是 添加
+                    String delSql = "delete from " + tabName + " where p_key_id=" + tableInfo.getPkeyId();
+                    jdbcTemplate.execute(delSql);
+
+                    String sqlInfo = "";
+                    LinkedHashMap<String, String> dataMap2 = tableInfo.getDataMap();
+                    sqlInfo = "INSERT INTO " + tabName + " ( ";
+                    String keyStr = "id,";
+                    String valStr = SnowFlakeUtil.getId() + ",";
+                    for (String keys : dataMap2.keySet()) {
+                        keyStr += keys + ",";
+                        valStr += "'" + dataMap2.get(keys) + "',";
+                    }
+                    keyStr = keyStr.substring(0, keyStr.lastIndexOf(","));
+                    valStr = valStr.substring(0, valStr.lastIndexOf(","));
+                    sqlInfo = sqlInfo + keyStr + ") VALUES (" + valStr + ")";
+
+                    UpdateWrapper<WbsTreePrivate> updateWrapper = new UpdateWrapper<>();
+                    updateWrapper.in("p_key_id", tableInfo.getPkeyId());
+                    updateWrapper.set("is_tab_pdf", 2);
+                    wbsTreePrivateService.update(updateWrapper);
+                    jdbcTemplate.execute(sqlInfo);
+                }
+
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
 
     // 获取用户
     @Override
@@ -874,41 +916,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         return R.data(bladeFile2.getLink());
     }
 
-    @Override
-    public void getBussPdfs(String nodeId, String classify, String contractId, String projectId) throws Exception {
-        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        // 获取有权限的节点信息
-        List<WbsTreeContract> wbsTreeContractList = wbsTreeContractService.searchNodeAllTable(nodeId, classify, contractId, projectId);
-        List<String> data = new ArrayList<>();
-        if (wbsTreeContractList != null && wbsTreeContractList.size() >= 1) {
-            for (WbsTreeContract wbsInfo : wbsTreeContractList) {
-                // 隐藏的不生成pdf
-                if (wbsInfo.getIsBussShow() == null || wbsInfo.getIsBussShow() != 2) { //
-                    if (StringUtils.isNotEmpty(wbsInfo.getPdfUrl())) {
-                        data.add(wbsInfo.getPdfUrl());
-                    } else {
-                        R bussPdfInfo = this.getBussPdfInfo(wbsInfo.getPKeyId());
-                        if (bussPdfInfo.getCode() == 200) {
-                            data.add(bussPdfInfo.getData() + "");
-                        }
-                    }
-                }
-            }
-        }
-
-        String listPdf = file_path + "pdf/" + nodeId + ".pdf";
-        File tabpdf2 = ResourceUtil.getFile(listPdf);
-        if (tabpdf2.exists()) {
-            tabpdf2.delete();
-        }
-        FileUtils.mergePdfPublicMethods(data, listPdf);
-        BladeFile bladeFile = this.newIOSSClient.uploadFile(nodeId + ".pdf", listPdf);
-
-        // 合并pdf集合
-        String sql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "' where classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "' ";
-        jdbcTemplate.execute(sql);
-    }
-
     @Override
     public R getBussDataInfo(Long pkeyId) {
 
@@ -1078,5 +1085,308 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         return R.data(reData);
     }
 
+    @Override
+    public void getBussPdfs(String nodeId, String classify, String contractId, String projectId) throws Exception {
+        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        // 获取有权限的节点信息
+        List<WbsTreeContract> wbsTreeContractList = wbsTreeContractService.searchNodeAllTable(nodeId, classify, contractId, projectId);
+        List<String> data = new ArrayList<>();
+        if (wbsTreeContractList != null && wbsTreeContractList.size() >= 1) {
+            for (WbsTreeContract wbsInfo : wbsTreeContractList) {
+                // 隐藏的不生成pdf
+                if (wbsInfo.getIsBussShow() == null || wbsInfo.getIsBussShow() != 2) { //
+                    if (StringUtils.isNotEmpty(wbsInfo.getPdfUrl())) {
+                        data.add(wbsInfo.getPdfUrl());
+                    } else {
+                        R bussPdfInfo = this.getBussPdfInfo(wbsInfo.getPKeyId());
+                        if (bussPdfInfo.getCode() == 200) {
+                            data.add(bussPdfInfo.getData() + "");
+                        }
+                    }
+                }
+            }
+        }
+
+        String listPdf = file_path + "pdf/" + nodeId + ".pdf";
+        File tabpdf2 = ResourceUtil.getFile(listPdf);
+        if (tabpdf2.exists()) {
+            tabpdf2.delete();
+        }
+        FileUtils.mergePdfPublicMethods(data, listPdf);
+        BladeFile bladeFile = this.newIOSSClient.uploadFile(nodeId + ".pdf", listPdf);
+
+        // 合并pdf集合
+        String sql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "' where classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "' ";
+        jdbcTemplate.execute(sql);
+    }
+
+    @Override
+    public String getBussPDFTrial(TableInfo tableInfo, Long pkeyId, String contractId) throws Exception {
+        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getBaseMapper().selectOne(Wrappers.<WbsTreePrivate>query().lambda()
+                .eq(WbsTreePrivate::getPKeyId, pkeyId));
+        if (wbsTreePrivate == null) {
+            throw new ServiceException("该数据下无此节点!");
+        }
+        if (wbsTreePrivate.getHtmlUrl() == null) {
+            throw new ServiceException("请关联清表!");
+        }
+
+        String pdfPath = file_path + "/pdf//" + pkeyId + ".pdf";
+        String excelPath = file_path + "/pdf//" + pkeyId + ".xlsx";
+        File tabPdf = ResourceUtil.getFile(pdfPath);
+        if (tabPdf.exists()) {
+            tabPdf.delete();
+        }
+
+        //获取清表信息
+        ExcelTab excelTab = this.getById(wbsTreePrivate.getExcelId());
+
+        if (excelTab == null) {
+            throw new ServiceException("操作失败");
+        }
+
+        Map<String, Object> DataInfo = (Map<String, Object>) getBussDataInfo(pkeyId).getData();
+
+        // 获取excel流 和 html流
+        Workbook wb = new Workbook();
+        wb.loadFromMHtml(CommonUtil.getOSSInputStream(excelTab.getFileUrl()));
+        //获取工作表
+        Worksheet sheet = wb.getWorksheets().get(0);
+        //标题添加
+        ProjectInfo projectInfo = projectInfoService.getById(wbsTreePrivate.getProjectId());
+        CellRange[] columns = sheet.getMergedCells();
+        for (CellRange cellRange : columns) {
+            if (cellRange.getStyle().getFont().getSize() >= 17) {
+                cellRange.setText(projectInfo.getProjectName());
+                cellRange.getStyle().getFont().setSize(20);
+                break;
+            }
+        }
+
+        //数据不为空 &&
+        if (StringUtils.isNotEmpty(wbsTreePrivate.getHtmlUrl())) {
+            File htmlFile = ResourceUtil.getFile(wbsTreePrivate.getHtmlUrl());
+            if (htmlFile.exists()) {
+                String htmlString = IoUtil.readToString(new FileInputStream(htmlFile));
+                Document doc = Jsoup.parse(htmlString);
+                Element table = doc.select("table").first();
+                Elements trs = table.select("tr");
+                Elements cols = table.select("col");
+
+                if (ObjectUtil.isNotEmpty(DataInfo)) {
+                    for (String val : DataInfo.keySet()) {
+                        if (val.indexOf("__") >= 0) {
+                            String DataVal[] = val.split("__");
+                            String[] xy = DataVal[1].split("_");
+
+                            Element data = trs.get(Integer.parseInt(xy[0])).select("td").get(Integer.parseInt(xy[1]));
+
+                            if (data.html().indexOf("x1") >= 0 && data.html().indexOf("y1") >= 0) {
+                                int x1 = 0;
+                                int y1 = 0;
+
+                                if (data.html().indexOf("el-tooltip") >= 0) {
+                                    x1 = Integer.parseInt(data.children().get(0).children().get(0).attr("x1"));
+                                    y1 = Integer.parseInt(data.children().get(0).children().get(0).attr("y1"));
+                                } else {
+                                    x1 = Integer.parseInt(data.children().get(0).attr("x1"));
+                                    y1 = Integer.parseInt(data.children().get(0).attr("y1"));
+                                }
+                                if (x1 == 0) {
+                                    x1 = 1;
+                                }
+                                String myData = DataInfo.get(val) + "";
+                                if (myData.indexOf("T") >= 0 && myData.indexOf("-") >= 0) {
+                                    if (myData.indexOf(",") >= 0 && myData.indexOf("]") >= 0) {
+                                        myData = myData.replace("[", "").replace("]", "").replaceAll("'", "");
+                                        String[] dataVal = myData.split(",");
+                                        String Start_dataStr[] = dataVal[0].split("T")[0].split("-");
+                                        String StartDate = StringUtil.format("{}年{}月{}日", new Object[]{Start_dataStr[0], Start_dataStr[1], Integer.parseInt(Start_dataStr[2]) + 1}).trim();
+
+                                        String end_dataStr[] = dataVal[1].split("T")[0].split("-");
+                                        String endDate = StringUtil.format("{}年{}月{}日", new Object[]{end_dataStr[0], end_dataStr[1], Integer.parseInt(end_dataStr[2]) + 1}).trim();
+                                        if (StartDate.equals(endDate)) {
+                                            myData = StartDate;
+                                        } else {
+                                            myData = StartDate + "-" + endDate;
+                                        }
+                                    } else {
+                                        String dataStr[] = myData.split("T")[0].split("-");
+                                        myData = StringUtil.format("{}年{}月{}日", new Object[]{dataStr[0], dataStr[1], Integer.parseInt(dataStr[2]) + 1});
+                                    }
+                                }
+                                //https:bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20220819/b53cb6700db369381e3b03d7737bcdec.jpg__16_1
+                                if (myData.indexOf("https") >= 0 && myData.indexOf("aliyuncs") >= 0) {
+
+                                    BufferedImage image = ImageIO.read(CommonUtil.getOSSInputStream(myData));
+
+                                    int colspan = data.attr("COLSPAN").equals("") ? 0 : Integer.parseInt(data.attr("COLSPAN"));
+                                    int rowspan = data.attr("ROWSPAN").equals("") ? 0 : Integer.parseInt(data.attr("ROWSPAN"));
+                                    int picHeight = 0;
+                                    int picWidth = 0;
+
+                                    if (rowspan == 0) {
+                                        String dataInfo = trs.get(y1).attr("height");
+                                        if (StringUtils.isEmpty(dataInfo)) {
+                                            Element firstTd = trs.get(y1 - 1).children().get(0);
+                                            String heg[] = firstTd.attr("style").split(";");
+                                            for (String str : heg) {
+                                                if (str.indexOf("height:") >= 0) {
+                                                    picHeight = Integer.parseInt(str.split(":")[1].replaceAll("px", ""));
+                                                }
+                                            }
+                                        } else {
+                                            picHeight = Integer.parseInt(dataInfo);
+                                        }
+                                    } else {
+                                        for (int i = y1; i <= (y1 + rowspan); i++) { // 跨列处理
+                                            String dataInfo = trs.get(i).attr("height");
+                                            if (StringUtils.isNotEmpty(dataInfo)) {
+                                                picHeight += Integer.parseInt(dataInfo);
+                                            }
+                                        }
+                                    }
+
+                                    if (colspan >= 1) {
+                                        for (int i = x1 - 1; i < x1 + colspan - 1; i++) {
+                                            String dataInfo = cols.get(i).attr("width").replaceAll("px", "");
+                                            if (StringUtils.isNotEmpty(dataInfo)) {
+                                                picWidth += Integer.parseInt(dataInfo);
+                                            }
+                                        }
+                                    }
+
+                                    ExcelPicture pic = sheet.getPictures().add(y1, x1, image);
+                                    pic.setAutoSize(true);
+                                    pic.setWidth(picWidth - 10);
+
+                                    //System.out.println(sheet.get(y1, x1).getRowHeight());
+                                    //System.out.println(sheet.get(y1, x1).getRows());
+                                    pic.setHeight(picHeight);
+                                    pic.setLeft(5);
+                                } else {
+                                    CellRange cellRange = sheet.getCellRange(y1, x1);
+                                    cellRange.getCellStyle().getExcelFont().setFontName("EUDC");
+                                    cellRange.setText(myData);
+                                    //System.out.println(cellRange.getStyle().getFont().getFontName());
+                                    //System.out.println("后" + cellRange.getText());
+                                }
+                            }
+                        }
+                    }
+                }
+
+                // 组装电签设置
+                QueryWrapper<TextdictInfo> queryWrapper = new QueryWrapper<>();
+                queryWrapper.eq("type", 2);
+                queryWrapper.eq("tab_id", wbsTreePrivate.getPKeyId());
+
+                List<TextdictInfo> textdictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
+                if (textdictInfos != null && !textdictInfos.isEmpty()) {
+                    for (TextdictInfo e : textdictInfos) {
+                        String key = e.getColKey();
+                        String keys[] = key.split("__");
+                        String[] trtd = keys[1].split("_");
+                        Element data = trs.get(Integer.parseInt(trtd[0])).select("td").get(Integer.parseInt(trtd[1]));
+                        int x1 = Integer.parseInt(data.children().get(0).attr("x1"));
+                        if (x1 == 0) {
+                            x1 = 1;
+                        }
+                        int y1 = Integer.parseInt(data.children().get(0).attr("y1"));
+
+                        final CellRange cellRange = sheet.getCellRange(y1, x1);
+                        cellRange.setText(e.getId() + "");
+                        cellRange.getCellStyle().getFont().setColor(Color.white);
+                    }
+                }
+            }
+        }
+
+        wb.saveToFile(excelPath, ExcelVersion.Version2010);
+        FileUtils.excelToPdf(excelPath, pdfPath);
+        BladeFile bladeFile = newIOSSClient.uploadFile(pkeyId + ".pdf", pdfPath);
+        TableFile tableFile1 = tableFileService.getBaseMapper().selectOne(Wrappers.<TableFile>query().lambda()
+                .eq(TableFile::getTabId, pkeyId + "").eq(TableFile::getType, 1));
+        if (tableFile1 != null) {
+            tableFile1.setDomainPdfUrl(bladeFile.getLink());
+            tableFileService.saveOrUpdate(tableFile1);
+        } else {
+            TableFile tableFile = new TableFile();
+            String fileExtension = FileUtil.getFileExtension(wbsTreePrivate.getFullName() + ".pdf");
+            tableFile.setTabId(pkeyId + "");
+            tableFile.setName(wbsTreePrivate.getFullName() + ".pdf");
+            tableFile.setType(1);
+            tableFile.setDomainUrl(bladeFile.getLink());
+            tableFile.setIsDeleted(0);
+            tableFile.setExtension(fileExtension);
+            tableFile.setDomainPdfUrl(bladeFile.getLink());
+            tableFileService.saveOrUpdate(tableFile);
+        }
+
+        List<TableFile> tableFileList = tableFileService.getBaseMapper().selectList(Wrappers.<TableFile>query().lambda().eq(TableFile::getTabId, pkeyId + "").eq(TableFile::getIsDeleted, 0));
+        tableFileList.sort(Comparator.comparing(TableFile::getType));
+
+        List<String> dataListPdf = tableFileList.stream().filter(tableFile -> tableFile.getDomainPdfUrl() != null && (tableFile.getType() == 1 || tableFile.getType() == 2)).map(TableFile::getDomainPdfUrl).collect(Collectors.toList());
+
+        String pdfPath2 = file_path + "/pdf//" + pkeyId + "_2.pdf";
+
+        File tabPdf2 = ResourceUtil.getFile(pdfPath2);
+        if (tabPdf2.exists()) {
+            tabPdf2.delete();
+        }
+        FileUtils.mergePdfPublicMethods(dataListPdf, pdfPath2);
+
+        BladeFile bladeFile2 = newIOSSClient.uploadFile(pkeyId + "2.pdf", pdfPath2);
+
+        UpdateWrapper<WbsTreePrivate> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.in("p_key_id", pkeyId + "");
+        updateWrapper.set("pdf_url", bladeFile2.getLink());
+        wbsTreePrivateService.update(updateWrapper);
+        wb.dispose();
+        return bladeFile2.getLink();
+    }
+
+    @Override
+    public String getBussPDFSTrial(String nodeId, Integer tableType, String classify, String contractId, String projectId) throws Exception {
+        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        //获取有权限的节点信息
+        List<WbsTreePrivate> wbsTreePrivateList = wbsTreePrivateService.searchNodeAllTable(nodeId, classify, String.valueOf(tableType), contractId, projectId);
+
+        List<String> data = new ArrayList<>();
+        if (wbsTreePrivateList != null && wbsTreePrivateList.size() >= 1) {
+            for (WbsTreePrivate wbsInfo : wbsTreePrivateList) {
+                //隐藏的不生成pdf
+                if (wbsInfo.getIsBussShow() == null || wbsInfo.getIsBussShow() != 2) { //
+                    if (StringUtils.isNotEmpty(wbsInfo.getPdfUrl())) {
+                        data.add(wbsInfo.getPdfUrl());
+                    } else {
+                        String bussPdfInfo = this.getBussPDFTrial(null, wbsInfo.getPKeyId(), contractId);
+                        if (StringUtils.isNotEmpty(bussPdfInfo)) {
+                            data.add(bussPdfInfo + "");
+                        }
+                    }
+                }
+            }
+        }
+
+        String listPdf = file_path + "/pdf/" + nodeId + ".pdf";
+        File tabPdf2 = ResourceUtil.getFile(listPdf);
+        if (tabPdf2.exists()) {
+            tabPdf2.delete();
+        }
+        FileUtils.mergePdfPublicMethods(data, listPdf);
+        BladeFile bladeFile = this.newIOSSClient.uploadFile(nodeId + ".pdf", listPdf);
+
+        //合并PDF集合
+        String querySql = "select * from u_information_query where classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "'";
+        List<Map<String, Object>> resultSQL = jdbcTemplate.queryForList(querySql);
+        if (resultSQL.size() > 0) {
+            informationQueryClient.updateInformationQuery(bladeFile.getLink(), classify, nodeId, contractId);
+        } else {
+            informationQueryClient.saveData(nodeId, projectId, contractId, classify, bladeFile.getLink());
+        }
+        return bladeFile.getLink();
+    }
 
 }

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java

@@ -215,7 +215,7 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
 
         } catch (Exception e) {
             baseMapper.deleteElement(wbsFormElement);
-            throw new ServiceException("未获取到对应实体表信息,新增失败");
+            throw new ServiceException("同步元素字段异常,操作失败");
         }
         return wbsFormElement;
     }

+ 565 - 238
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -10,6 +10,7 @@ import lombok.AllArgsConstructor;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.BeanUtil;
@@ -350,6 +351,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                 || (ObjectUtils.isNotEmpty(wbsTree.getTableType()) && !wbsTree.getTableType().equals(wbsTreePrivate.getTableType()))
                                 || (ObjectUtils.isNotEmpty(wbsTree.getTableOwner()) && !wbsTree.getTableOwner().equals(wbsTreePrivate.getTableOwner()))
                                 || (ObjectUtils.isNotEmpty(wbsTree.getImportMatchingInfo()) && !wbsTree.getImportMatchingInfo().equals(wbsTreePrivate.getImportMatchingInfo()))
+                                || (ObjectUtils.isNotEmpty(wbsTree.getMixRatioTestIds()) && !wbsTree.getMixRatioTestIds().equals(wbsTreePrivate.getMixRatioTestIds()))
                         )) {
                     //修改项目wbs信息
                     WbsTreePrivate wbsPrivate = BeanUtil.copyProperties(wbsTree, WbsTreePrivate.class);
@@ -396,6 +398,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                 || (ObjectUtils.isNotEmpty(wbsTreePrivate.getTableType()) && !wbsTreePrivate.getTableType().equals(treePrivateNow.getTableType()))
                                 || (ObjectUtils.isNotEmpty(wbsTreePrivate.getTableOwner()) && !wbsTreePrivate.getTableOwner().equals(treePrivateNow.getTableOwner()))
                                 || (ObjectUtils.isNotEmpty(wbsTreePrivate.getImportMatchingInfo()) && !wbsTreePrivate.getImportMatchingInfo().equals(treePrivateNow.getImportMatchingInfo()))
+                                || (ObjectUtils.isNotEmpty(wbsTreePrivate.getMixRatioTestIds()) && !wbsTreePrivate.getMixRatioTestIds().equals(treePrivateNow.getMixRatioTestIds()))
                         )) {
                     //修改项目wbs信息
                     WbsTreePrivate wbsPrivate = BeanUtil.copyProperties(wbsTreePrivate, WbsTreePrivate.class);
@@ -586,140 +589,282 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             List<WbsTreePrivate> insertDataPrivateList = new ArrayList<>();
             List<WbsTreeContract> insertDataContractList = new ArrayList<>();
 
-            if (("public").equals(projectInfo.getReferenceWbsTemplateType())) {
-                /*TODO-------------------------------------公有引用同步--------------------------------------------*/
-                //获取当前节点对应的公有引用树下的元素表
-                WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>query().lambda()
-                        .eq(WbsTree::getId, wbsTreePrivate.getId())
-                );
-                List<WbsTree> wbsTreesPublicTables;
-                if (wbsTree.getAncestors().equals("0")) {
-                    //根节点
-                    wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
-                            .eq(WbsTree::getWbsId, wbsTree.getWbsId())
-                            .eq(WbsTree::getType, 2)
-                            .eq(WbsTree::getStatus, 1)
+            if (("1").equals(wbsTreePrivate.getWbsType())) {
+                if (("public").equals(projectInfo.getReferenceWbsTemplateType())) {
+                    /*TODO-------------------------------------公有引用同步--------------------------------------------*/
+                    //获取当前节点对应的公有引用树下的元素表
+                    WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>query().lambda()
+                            .eq(WbsTree::getId, wbsTreePrivate.getId())
                     );
-                } else {
-                    wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
-                            .eq(WbsTree::getWbsId, wbsTree.getWbsId())
-                            .eq(WbsTree::getType, 2)
-                            .eq(WbsTree::getStatus, 1)
-                            .like(WbsTree::getAncestors, wbsTree.getId())
+                    List<WbsTree> wbsTreesPublicTables;
+                    if (wbsTree.getAncestors().equals("0")) {
+                        //根节点
+                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+                                .eq(WbsTree::getWbsId, wbsTree.getWbsId())
+                                .eq(WbsTree::getType, 2)
+                                .eq(WbsTree::getStatus, 1)
+                        );
+                    } else {
+                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+                                .eq(WbsTree::getWbsId, wbsTree.getWbsId())
+                                .eq(WbsTree::getType, 2)
+                                .eq(WbsTree::getStatus, 1)
+                                .like(WbsTree::getAncestors, wbsTree.getId())
+                        );
+                    }
+
+                    //获取当前项目树下的元素表 节点
+                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                            .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                            .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+                            .eq(WbsTreePrivate::getStatus, 1)
                     );
-                }
+                    List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
+
+                    List<WbsTreePrivate> wbsTreePrivatesProjectTables;
+                    if (wbsTreePrivate.getAncestors().equals("0")) {
+                        //根节点
+                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
+                    } else {
+                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestors().contains(String.valueOf(wbsTreePrivate.getId()))).collect(Collectors.toList());
+                    }
 
-                //获取当前项目树下的元素表 节点
-                List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
-                        .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
-                        .eq(WbsTreePrivate::getStatus, 1)
-                );
-                List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
+                    //获取新增的公有元素表addPublicTable
+                    List<WbsTree> addPublicTable = wbsTreesPublicTables.stream().filter(f ->
+                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId()))
+                            .collect(Collectors.toList());
 
-                List<WbsTreePrivate> wbsTreePrivatesProjectTables;
-                if (wbsTreePrivate.getAncestors().equals("0")) {
-                    //根节点
-                    wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
-                } else {
-                    wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestors().contains(String.valueOf(wbsTreePrivate.getId()))).collect(Collectors.toList());
-                }
+                    //判断当前新增的表在项目的wbs树中是否存在上级节点,存在表示可以新增,不存在表示不新增
+                    List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
+                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())
+                    ).collect(Collectors.toList());
 
-                //获取新增的公有元素表addPublicTable
-                List<WbsTree> addPublicTable = wbsTreesPublicTables.stream().filter(f ->
-                        !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId()))
-                        .collect(Collectors.toList());
+                    //获取当前项目下所有施工合同段id
+                    List<ContractInfo> contractInfos = contractInfoMapper.selectList(Wrappers.<ContractInfo>query().lambda().eq(ContractInfo::getPId, wbsTreePrivate.getProjectId()));
 
-                //判断当前新增的表在项目的wbs树中是否存在上级节点,存在表示可以新增,不存在表示不新增
-                List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
-                        wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())
-                ).collect(Collectors.toList());
+                    //获取当前项目下所有合同段树
+                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
+                            .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
+                            .eq(WbsTreeContract::getStatus, 1)
+                    );
+                    List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
+                    List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
+
+                    //构造
+                    for (WbsTree tree : addPublicTables) {
+                        WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+                        if (dataPrivate != null) {
+                            Long idPrivate = SnowFlakeUtil.getId();
+                            dataPrivate.setPKeyId(idPrivate);
+                            dataPrivate.setWbsType(wbsTreePrivate.getWbsType());
+                            dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
+                            dataPrivate.setFullName(dataPrivate.getNodeName());
+                            //新增
+                            insertDataPrivateList.add(dataPrivate);
+
+                            /*同步到该项目下所有合同段*/
+                            //找到当前新增成功的元素表
+                            for (ContractInfo contractInfo : contractInfos) {
+                                WbsTreeContract dataContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
+                                if (dataContract != null) {
+                                    Long idContract = SnowFlakeUtil.getId();
+                                    dataContract.setPKeyId(idContract);
+                                    dataContract.setContractType(contractInfo.getContractType());
+                                    dataContract.setWbsType(Integer.valueOf(dataPrivate.getWbsType()));
+                                    dataContract.setWbsId(dataPrivate.getWbsId());
+                                    dataContract.setContractId(String.valueOf(contractInfo.getId()));
+                                    dataContract.setFullName(dataContract.getNodeName());
+                                    dataContract.setIsBussShow(1);
+                                    if (dataPrivate.getType() == 2) {
+                                        dataContract.setIsTypePrivatePid(dataPrivate.getPKeyId());
+                                    }
 
-                //获取当前项目下所有施工合同段id
-                List<ContractInfo> contractInfos = contractInfoMapper.selectList(Wrappers.<ContractInfo>query().lambda().eq(ContractInfo::getPId, wbsTreePrivate.getProjectId()));
+                                    //判断元素表是否存在合同段,存在则不新增;不存在则表示没被引用,新增
+                                    WbsTreeContract resultTreeContract = treeContractListAllTables.stream().filter(f ->
+                                            f.getId().equals(dataContract.getId())
+                                                    && f.getNodeName().equals(dataContract.getNodeName())
+                                                    && f.getWbsId().equals(dataContract.getWbsId())
+                                                    && f.getProjectId().equals(wbsTreePrivate.getProjectId())
+                                                    && f.getContractId().equals(String.valueOf(contractInfo.getId()))
+                                                    && f.getStatus().equals(1)
+                                    ).findAny().orElse(null);
+                                    if (resultTreeContract != null) {
+                                        continue;
+                                    }
 
-                //获取当前项目下所有合同段树
-                List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
-                        .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
-                        .eq(WbsTreeContract::getStatus, 1)
-                );
-                List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
-                List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
-
-                //构造
-                for (WbsTree tree : addPublicTables) {
-                    WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
-                    if (dataPrivate != null) {
-                        Long idPrivate = SnowFlakeUtil.getId();
-                        dataPrivate.setPKeyId(idPrivate);
-                        dataPrivate.setWbsType(wbsTreePrivate.getWbsType());
-                        dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
-                        dataPrivate.setFullName(dataPrivate.getNodeName());
-                        //新增
-                        insertDataPrivateList.add(dataPrivate);
-
-                        /*同步到该项目下所有合同段*/
-                        //找到当前新增成功的元素表
-                        for (ContractInfo contractInfo : contractInfos) {
-                            WbsTreeContract dataContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
-                            if (dataContract != null) {
-                                Long idContract = SnowFlakeUtil.getId();
-                                dataContract.setPKeyId(idContract);
-                                dataContract.setContractType(contractInfo.getContractType());
-                                dataContract.setWbsType(Integer.valueOf(dataPrivate.getWbsType()));
-                                dataContract.setWbsId(dataPrivate.getWbsId());
-                                dataContract.setContractId(String.valueOf(contractInfo.getId()));
-                                dataContract.setFullName(dataContract.getNodeName());
-                                dataContract.setIsBussShow(1);
-                                if (dataPrivate.getType() == 2) {
-                                    dataContract.setIsTypePrivatePid(dataPrivate.getPKeyId());
+                                    //判断元素表在合同段wbs树中是否存在上级节点,存在则新增;不存在则不新增
+                                    WbsTreeContract dataContractParent = treeContractListAllNodes.stream().filter(f ->
+                                            f.getContractId().equals(String.valueOf(contractInfo.getId()))
+                                                    && f.getProjectId().equals(dataContract.getProjectId())
+                                                    && f.getStatus().equals(1)
+                                                    && f.getType().equals(1)
+                                                    && f.getId().equals(dataContract.getParentId())
+                                    ).findAny().orElse(null);
+
+                                    if (dataContractParent != null) {
+                                        //新增
+                                        insertDataContractList.add(dataContract);
+
+                                        //获取上级父级节点同级别的复制或新增节点
+                                        List<WbsTreeContract> dataContractEquallyNodes = treeContractListAllNodes.stream().filter(f ->
+                                                (ObjectUtils.isNotEmpty(f.getOldId()) && f.getOldId().equals(String.valueOf(dataContractParent.getId())))
+                                                        && f.getContractId().equals(String.valueOf(contractInfo.getId()))
+                                                        && f.getWbsId().equals(dataContractParent.getWbsId())
+                                                        && f.getProjectId().equals(dataContractParent.getProjectId())
+                                                        && f.getStatus().equals(1)
+                                                        && f.getType().equals(1)
+                                        ).collect(Collectors.toList());
+
+                                        if (dataContractEquallyNodes.size() > 0) {
+                                            //将表单同步到复制或新增的节点下
+                                            for (WbsTreeContract treeContractCopy : dataContractEquallyNodes) {
+                                                WbsTreeContract dataContractCopyOrAdd = BeanUtil.copyProperties(dataContract, WbsTreeContract.class);
+                                                if (dataContractCopyOrAdd != null) {
+                                                    dataContractCopyOrAdd.setPKeyId(SnowFlakeUtil.getId());
+                                                    dataContractCopyOrAdd.setParentId(treeContractCopy.getId());
+
+                                                    insertDataContractList.add(dataContractCopyOrAdd);
+                                                }
+                                            }
+                                        }
+                                    }
                                 }
+                            }
+                        }
+                    }
 
-                                //判断元素表是否存在合同段,存在则不新增;不存在则表示没被引用,新增
-                                WbsTreeContract resultTreeContract = treeContractListAllTables.stream().filter(f ->
-                                        f.getId().equals(dataContract.getId())
-                                                && f.getNodeName().equals(dataContract.getNodeName())
-                                                && f.getWbsId().equals(dataContract.getWbsId())
-                                                && f.getProjectId().equals(wbsTreePrivate.getProjectId())
-                                                && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                && f.getStatus().equals(1)
-                                ).findAny().orElse(null);
-                                if (resultTreeContract != null) {
-                                    continue;
-                                }
+                } else if (("private").equals(projectInfo.getReferenceWbsTemplateType())) {
+                    /*TODO-------------------------------------私有引用同步--------------------------------------------*/
+                    //根据wbsTreePrivate的wbsId=私有引用的pKeyId来获取引用树根节点
+                    WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
+                    //获取当前私有引用树的元素表信息
+                    List<WbsTreePrivate> wbsTreePrivateRootTables;
+                    if (wbsTreePrivate.getAncestors().equals("0")) {
+                        //根节点
+                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                                .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
+                                .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId())
+                                .eq(WbsTreePrivate::getType, 2)
+                                .eq(WbsTreePrivate::getStatus, 1)
+                        );
+                    } else {
+                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                                .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
+                                .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId())
+                                .eq(WbsTreePrivate::getType, 2)
+                                .eq(WbsTreePrivate::getStatus, 1)
+                                .like(WbsTreePrivate::getAncestors, wbsTreePrivate.getId())
+                        );
+                    }
+
+                    //获取当前项目选择的节点下的所有元素表 节点
+                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                            .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                            .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+                            .eq(WbsTreePrivate::getStatus, 1)
+                    );
+
+                    List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
+                    List<WbsTreePrivate> wbsTreePrivatesProjectTables;
+                    if (wbsTreePrivate.getAncestors().equals("0")) {
+                        //根节点
+                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
+                    } else {
+                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestors().contains(String.valueOf(wbsTreePrivate.getId()))).collect(Collectors.toList());
+                    }
+
+                    //获取新增的私有元素表addPrivateTable
+                    List<WbsTreePrivate> addPrivateTable = wbsTreePrivateRootTables.stream().filter(f ->
+                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId()))
+                            .collect(Collectors.toList());
+
+                    //获取当前项目下所有施工合同段id
+                    List<ContractInfo> contractInfos = contractInfoMapper.selectContractIdByProjectId(wbsTreePrivate.getProjectId());
 
-                                //判断元素表在合同段wbs树中是否存在上级节点,存在则新增;不存在则不新增
-                                WbsTreeContract dataContractParent = treeContractListAllNodes.stream().filter(f ->
-                                        f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                && f.getProjectId().equals(dataContract.getProjectId())
-                                                && f.getStatus().equals(1)
-                                                && f.getType().equals(1)
-                                                && f.getId().equals(dataContract.getParentId())
-                                ).findAny().orElse(null);
-
-                                if (dataContractParent != null) {
-                                    //新增
-                                    insertDataContractList.add(dataContract);
-
-                                    //获取上级父级节点同级别的复制或新增节点
-                                    List<WbsTreeContract> dataContractEquallyNodes = treeContractListAllNodes.stream().filter(f ->
-                                            (ObjectUtils.isNotEmpty(f.getOldId()) && f.getOldId().equals(String.valueOf(dataContractParent.getId())))
+                    //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
+                    List<WbsTreePrivate> addPrivateTables = addPrivateTable.stream().filter(node ->
+                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())
+                    ).collect(Collectors.toList());
+
+                    //获取当前项目下所有合同段树
+                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
+                            .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
+                            .eq(WbsTreeContract::getStatus, 1)
+                    );
+                    List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
+                    List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
+
+                    //构造
+                    for (WbsTreePrivate tree : addPrivateTables) {
+                        WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+                        if (dataPrivate != null) {
+                            dataPrivate.setPKeyId(SnowFlakeUtil.getId());
+                            dataPrivate.setWbsId(wbsTreePrivate.getWbsId());
+                            dataPrivate.setWbsType(tree.getWbsType());
+                            dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
+                            insertDataPrivateList.add(dataPrivate);
+
+                            //同步到该项目下的所有合同段
+                            for (ContractInfo contractInfo : contractInfos) {
+                                WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
+                                if (wbsTreeContract != null) {
+                                    wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
+                                    wbsTreeContract.setWbsId(dataPrivate.getWbsId());
+                                    wbsTreeContract.setWbsType(Integer.valueOf(dataPrivate.getWbsType()));
+                                    wbsTreeContract.setProjectId(wbsTreePrivate.getProjectId());
+                                    wbsTreeContract.setContractType(contractInfo.getContractType());
+                                    wbsTreeContract.setContractId(String.valueOf(contractInfo.getId()));
+                                    wbsTreeContract.setIsBussShow(1);
+                                    if (dataPrivate.getType() == 2) {
+                                        wbsTreeContract.setIsTypePrivatePid(dataPrivate.getPKeyId());
+                                    }
+
+                                    //判断元素表是否存在合同段,存在则不新增;不存在则新增
+                                    WbsTreeContract resultTreeContract = treeContractListAllTables.stream().filter(f ->
+                                            f.getId().equals(wbsTreeContract.getId())
+                                                    && f.getNodeName().equals(wbsTreeContract.getNodeName())
+                                                    && f.getWbsId().equals(wbsTreeContract.getWbsId())
+                                                    && f.getProjectId().equals(wbsTreePrivate.getProjectId())
                                                     && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                    && f.getWbsId().equals(dataContractParent.getWbsId())
-                                                    && f.getProjectId().equals(dataContractParent.getProjectId())
                                                     && f.getStatus().equals(1)
-                                                    && f.getType().equals(1)
-                                    ).collect(Collectors.toList());
-
-                                    if (dataContractEquallyNodes.size() > 0) {
-                                        //将表单同步到复制或新增的节点下
-                                        for (WbsTreeContract treeContractCopy : dataContractEquallyNodes) {
-                                            WbsTreeContract dataContractCopyOrAdd = BeanUtil.copyProperties(dataContract, WbsTreeContract.class);
-                                            if (dataContractCopyOrAdd != null) {
-                                                dataContractCopyOrAdd.setPKeyId(SnowFlakeUtil.getId());
-                                                dataContractCopyOrAdd.setParentId(treeContractCopy.getId());
+                                    ).findAny().orElse(null);
+                                    if (resultTreeContract != null) {
+                                        continue;
+                                    }
 
-                                                insertDataContractList.add(dataContractCopyOrAdd);
+                                    //判断元素表是否存在上级节点,存在则新增;不存在则表示没被引用,不新增
+                                    WbsTreeContract wbsTreeContract1 = treeContractListAllNodes.stream().filter(f ->
+                                            f.getContractId().equals(wbsTreeContract.getContractId())
+                                                    && f.getProjectId().equals(wbsTreeContract.getProjectId())
+                                                    && f.getWbsId().equals(wbsTreeContract.getWbsId())
+                                                    && f.getStatus().equals(1)
+                                                    && f.getType().equals(1)
+                                                    && f.getId().equals(wbsTreeContract.getParentId())
+                                    ).findAny().orElse(null);
+
+                                    if (wbsTreeContract1 != null) {
+                                        insertDataContractList.add(wbsTreeContract);
+
+                                        //获取上级父级节点同级别的复制或新增节点
+                                        List<WbsTreeContract> wbsTreeContracts2 = treeContractListAllNodes.stream().filter(f ->
+                                                (ObjectUtils.isNotEmpty(f.getOldId()) && f.getOldId().equals(String.valueOf(wbsTreeContract1.getId())))
+                                                        && f.getContractId().equals(String.valueOf(contractInfo.getId()))
+                                                        && f.getWbsId().equals(wbsTreePrivate.getWbsId())
+                                                        && f.getProjectId().equals(wbsTreePrivate.getProjectId())
+                                                        && f.getStatus().equals(1)
+                                                        && f.getType().equals(1)
+                                        ).collect(Collectors.toList());
+
+                                        if (wbsTreeContracts2.size() > 0) {
+                                            //将表单同步到复制或新增的节点下
+                                            for (WbsTreeContract treeContract : wbsTreeContracts2) {
+                                                WbsTreeContract wbsTreeContract2 = BeanUtil.copyProperties(wbsTreeContract, WbsTreeContract.class);
+                                                if (wbsTreeContract2 != null) {
+                                                    wbsTreeContract2.setPKeyId(SnowFlakeUtil.getId());
+                                                    wbsTreeContract2.setParentId(treeContract.getId());
+
+                                                    insertDataContractList.add(wbsTreeContract2);
+                                                }
                                             }
                                         }
                                     }
@@ -728,138 +873,283 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                         }
                     }
                 }
-
-            } else if (("private").equals(projectInfo.getReferenceWbsTemplateType())) {
-                /*TODO-------------------------------------私有引用同步--------------------------------------------*/
-                //根据wbsTreePrivate的wbsId=私有引用的pKeyId来获取引用树根节点
-                WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
-                //获取当前私有引用树的元素表信息
-                List<WbsTreePrivate> wbsTreePrivateRootTables;
-                if (wbsTreePrivate.getAncestors().equals("0")) {
-                    //根节点
-                    wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                            .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
-                            .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId())
-                            .eq(WbsTreePrivate::getType, 2)
-                            .eq(WbsTreePrivate::getStatus, 1)
+            }
+            if (("2").equals(wbsTreePrivate.getWbsType())) {
+                if (("public").equals(projectInfo.getReferenceWbsTemplateTypeTrial())) {
+                    /*TODO-------------------------------------公有引用同步--------------------------------------------*/
+                    //获取当前节点对应的公有引用树下的元素表
+                    WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>query().lambda()
+                            .eq(WbsTree::getId, wbsTreePrivate.getId())
                     );
-                } else {
-                    wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                            .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
-                            .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId())
-                            .eq(WbsTreePrivate::getType, 2)
+                    List<WbsTree> wbsTreesPublicTables;
+                    if (wbsTree.getAncestors().equals("0")) {
+                        //根节点
+                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+                                .eq(WbsTree::getWbsId, wbsTree.getWbsId())
+                                .eq(WbsTree::getType, 2)
+                                .eq(WbsTree::getStatus, 1)
+                        );
+                    } else {
+                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+                                .eq(WbsTree::getWbsId, wbsTree.getWbsId())
+                                .eq(WbsTree::getType, 2)
+                                .eq(WbsTree::getStatus, 1)
+                                .like(WbsTree::getAncestors, wbsTree.getId())
+                        );
+                    }
+
+                    //获取当前项目树下的元素表 节点
+                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                            .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                            .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
                             .eq(WbsTreePrivate::getStatus, 1)
-                            .like(WbsTreePrivate::getAncestors, wbsTreePrivate.getId())
                     );
-                }
+                    List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
+
+                    List<WbsTreePrivate> wbsTreePrivatesProjectTables;
+                    if (wbsTreePrivate.getAncestors().equals("0")) {
+                        //根节点
+                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
+                    } else {
+                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestors().contains(String.valueOf(wbsTreePrivate.getId()))).collect(Collectors.toList());
+                    }
 
-                //获取当前项目选择的节点下的所有元素表 节点
-                List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
-                        .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
-                        .eq(WbsTreePrivate::getStatus, 1)
-                );
+                    //获取新增的公有元素表addPublicTable
+                    List<WbsTree> addPublicTable = wbsTreesPublicTables.stream().filter(f ->
+                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId()))
+                            .collect(Collectors.toList());
 
-                List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
-                List<WbsTreePrivate> wbsTreePrivatesProjectTables;
-                if (wbsTreePrivate.getAncestors().equals("0")) {
-                    //根节点
-                    wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
-                } else {
-                    wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestors().contains(String.valueOf(wbsTreePrivate.getId()))).collect(Collectors.toList());
-                }
+                    //判断当前新增的表在项目的wbs树中是否存在上级节点,存在表示可以新增,不存在表示不新增
+                    List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
+                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())
+                    ).collect(Collectors.toList());
 
-                //获取新增的私有元素表addPrivateTable
-                List<WbsTreePrivate> addPrivateTable = wbsTreePrivateRootTables.stream().filter(f ->
-                        !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId()))
-                        .collect(Collectors.toList());
+                    //获取当前项目下所有施工合同段id
+                    List<ContractInfo> contractInfos = contractInfoMapper.selectList(Wrappers.<ContractInfo>query().lambda().eq(ContractInfo::getPId, wbsTreePrivate.getProjectId()));
 
-                //获取当前项目下所有施工合同段id
-                List<ContractInfo> contractInfos = contractInfoMapper.selectContractIdByProjectId(wbsTreePrivate.getProjectId());
+                    //获取当前项目下所有合同段树
+                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
+                            .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
+                            .eq(WbsTreeContract::getStatus, 1)
+                    );
+                    List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
+                    List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
+
+                    //构造
+                    for (WbsTree tree : addPublicTables) {
+                        WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+                        if (dataPrivate != null) {
+                            Long idPrivate = SnowFlakeUtil.getId();
+                            dataPrivate.setPKeyId(idPrivate);
+                            dataPrivate.setWbsType(wbsTreePrivate.getWbsType());
+                            dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
+                            dataPrivate.setFullName(dataPrivate.getNodeName());
+                            //新增
+                            insertDataPrivateList.add(dataPrivate);
+
+                            /*同步到该项目下所有合同段*/
+                            //找到当前新增成功的元素表
+                            for (ContractInfo contractInfo : contractInfos) {
+                                WbsTreeContract dataContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
+                                if (dataContract != null) {
+                                    Long idContract = SnowFlakeUtil.getId();
+                                    dataContract.setPKeyId(idContract);
+                                    dataContract.setContractType(contractInfo.getContractType());
+                                    dataContract.setWbsType(Integer.valueOf(dataPrivate.getWbsType()));
+                                    dataContract.setWbsId(dataPrivate.getWbsId());
+                                    dataContract.setContractId(String.valueOf(contractInfo.getId()));
+                                    dataContract.setFullName(dataContract.getNodeName());
+                                    dataContract.setIsBussShow(1);
+                                    if (dataPrivate.getType() == 2) {
+                                        dataContract.setIsTypePrivatePid(dataPrivate.getPKeyId());
+                                    }
 
-                //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
-                List<WbsTreePrivate> addPrivateTables = addPrivateTable.stream().filter(node ->
-                        wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())
-                ).collect(Collectors.toList());
+                                    //判断元素表是否存在合同段,存在则不新增;不存在则表示没被引用,新增
+                                    WbsTreeContract resultTreeContract = treeContractListAllTables.stream().filter(f ->
+                                            f.getId().equals(dataContract.getId())
+                                                    && f.getNodeName().equals(dataContract.getNodeName())
+                                                    && f.getWbsId().equals(dataContract.getWbsId())
+                                                    && f.getProjectId().equals(wbsTreePrivate.getProjectId())
+                                                    && f.getContractId().equals(String.valueOf(contractInfo.getId()))
+                                                    && f.getStatus().equals(1)
+                                    ).findAny().orElse(null);
+                                    if (resultTreeContract != null) {
+                                        continue;
+                                    }
 
-                //获取当前项目下所有合同段树
-                List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
-                        .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
-                        .eq(WbsTreeContract::getStatus, 1)
-                );
-                List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
-                List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
-
-                //构造
-                for (WbsTreePrivate tree : addPrivateTables) {
-                    WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
-                    if (dataPrivate != null) {
-                        dataPrivate.setPKeyId(SnowFlakeUtil.getId());
-                        dataPrivate.setWbsId(wbsTreePrivate.getWbsId());
-                        dataPrivate.setWbsType(tree.getWbsType());
-                        dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
-                        insertDataPrivateList.add(dataPrivate);
-
-                        //同步到该项目下的所有合同段
-                        for (ContractInfo contractInfo : contractInfos) {
-                            WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
-                            if (wbsTreeContract != null) {
-                                wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
-                                wbsTreeContract.setWbsId(dataPrivate.getWbsId());
-                                wbsTreeContract.setWbsType(Integer.valueOf(dataPrivate.getWbsType()));
-                                wbsTreeContract.setProjectId(wbsTreePrivate.getProjectId());
-                                wbsTreeContract.setContractType(contractInfo.getContractType());
-                                wbsTreeContract.setContractId(String.valueOf(contractInfo.getId()));
-                                wbsTreeContract.setIsBussShow(1);
-                                if (dataPrivate.getType() == 2) {
-                                    wbsTreeContract.setIsTypePrivatePid(dataPrivate.getPKeyId());
+                                    //判断元素表在合同段wbs树中是否存在上级节点,存在则新增;不存在则不新增
+                                    WbsTreeContract dataContractParent = treeContractListAllNodes.stream().filter(f ->
+                                            f.getContractId().equals(String.valueOf(contractInfo.getId()))
+                                                    && f.getProjectId().equals(dataContract.getProjectId())
+                                                    && f.getStatus().equals(1)
+                                                    && f.getType().equals(1)
+                                                    && f.getId().equals(dataContract.getParentId())
+                                    ).findAny().orElse(null);
+
+                                    if (dataContractParent != null) {
+                                        //新增
+                                        insertDataContractList.add(dataContract);
+
+                                        //获取上级父级节点同级别的复制或新增节点
+                                        List<WbsTreeContract> dataContractEquallyNodes = treeContractListAllNodes.stream().filter(f ->
+                                                (ObjectUtils.isNotEmpty(f.getOldId()) && f.getOldId().equals(String.valueOf(dataContractParent.getId())))
+                                                        && f.getContractId().equals(String.valueOf(contractInfo.getId()))
+                                                        && f.getWbsId().equals(dataContractParent.getWbsId())
+                                                        && f.getProjectId().equals(dataContractParent.getProjectId())
+                                                        && f.getStatus().equals(1)
+                                                        && f.getType().equals(1)
+                                        ).collect(Collectors.toList());
+
+                                        if (dataContractEquallyNodes.size() > 0) {
+                                            //将表单同步到复制或新增的节点下
+                                            for (WbsTreeContract treeContractCopy : dataContractEquallyNodes) {
+                                                WbsTreeContract dataContractCopyOrAdd = BeanUtil.copyProperties(dataContract, WbsTreeContract.class);
+                                                if (dataContractCopyOrAdd != null) {
+                                                    dataContractCopyOrAdd.setPKeyId(SnowFlakeUtil.getId());
+                                                    dataContractCopyOrAdd.setParentId(treeContractCopy.getId());
+
+                                                    insertDataContractList.add(dataContractCopyOrAdd);
+                                                }
+                                            }
+                                        }
+                                    }
                                 }
+                            }
+                        }
+                    }
 
-                                //判断元素表是否存在合同段,存在则不新增;不存在则新增
-                                WbsTreeContract resultTreeContract = treeContractListAllTables.stream().filter(f ->
-                                        f.getId().equals(wbsTreeContract.getId())
-                                                && f.getNodeName().equals(wbsTreeContract.getNodeName())
-                                                && f.getWbsId().equals(wbsTreeContract.getWbsId())
-                                                && f.getProjectId().equals(wbsTreePrivate.getProjectId())
-                                                && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                && f.getStatus().equals(1)
-                                ).findAny().orElse(null);
-                                if (resultTreeContract != null) {
-                                    continue;
-                                }
+                } else if (("private").equals(projectInfo.getReferenceWbsTemplateTypeTrial())) {
+                    /*TODO-------------------------------------私有引用同步--------------------------------------------*/
+                    //根据wbsTreePrivate的wbsId=私有引用的pKeyId来获取引用树根节点
+                    WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
+                    //获取当前私有引用树的元素表信息
+                    List<WbsTreePrivate> wbsTreePrivateRootTables;
+                    if (wbsTreePrivate.getAncestors().equals("0")) {
+                        //根节点
+                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                                .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
+                                .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId())
+                                .eq(WbsTreePrivate::getType, 2)
+                                .eq(WbsTreePrivate::getStatus, 1)
+                        );
+                    } else {
+                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                                .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
+                                .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId())
+                                .eq(WbsTreePrivate::getType, 2)
+                                .eq(WbsTreePrivate::getStatus, 1)
+                                .like(WbsTreePrivate::getAncestors, wbsTreePrivate.getId())
+                        );
+                    }
 
-                                //判断元素表是否存在上级节点,存在则新增;不存在则表示没被引用,不新增
-                                WbsTreeContract wbsTreeContract1 = treeContractListAllNodes.stream().filter(f ->
-                                        f.getContractId().equals(wbsTreeContract.getContractId())
-                                                && f.getProjectId().equals(wbsTreeContract.getProjectId())
-                                                && f.getWbsId().equals(wbsTreeContract.getWbsId())
-                                                && f.getStatus().equals(1)
-                                                && f.getType().equals(1)
-                                                && f.getId().equals(wbsTreeContract.getParentId())
-                                ).findAny().orElse(null);
-
-                                if (wbsTreeContract1 != null) {
-                                    insertDataContractList.add(wbsTreeContract);
-
-                                    //获取上级父级节点同级别的复制或新增节点
-                                    List<WbsTreeContract> wbsTreeContracts2 = treeContractListAllNodes.stream().filter(f ->
-                                            (ObjectUtils.isNotEmpty(f.getOldId()) && f.getOldId().equals(String.valueOf(wbsTreeContract1.getId())))
-                                                    && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                    && f.getWbsId().equals(wbsTreePrivate.getWbsId())
+                    //获取当前项目选择的节点下的所有元素表 节点
+                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                            .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                            .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+                            .eq(WbsTreePrivate::getStatus, 1)
+                    );
+
+                    List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
+                    List<WbsTreePrivate> wbsTreePrivatesProjectTables;
+                    if (wbsTreePrivate.getAncestors().equals("0")) {
+                        //根节点
+                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
+                    } else {
+                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestors().contains(String.valueOf(wbsTreePrivate.getId()))).collect(Collectors.toList());
+                    }
+
+                    //获取新增的私有元素表addPrivateTable
+                    List<WbsTreePrivate> addPrivateTable = wbsTreePrivateRootTables.stream().filter(f ->
+                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId()))
+                            .collect(Collectors.toList());
+
+                    //获取当前项目下所有施工合同段id
+                    List<ContractInfo> contractInfos = contractInfoMapper.selectContractIdByProjectId(wbsTreePrivate.getProjectId());
+
+                    //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
+                    List<WbsTreePrivate> addPrivateTables = addPrivateTable.stream().filter(node ->
+                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())
+                    ).collect(Collectors.toList());
+
+                    //获取当前项目下所有合同段树
+                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
+                            .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
+                            .eq(WbsTreeContract::getStatus, 1)
+                    );
+                    List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
+                    List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
+
+                    //构造
+                    for (WbsTreePrivate tree : addPrivateTables) {
+                        WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+                        if (dataPrivate != null) {
+                            dataPrivate.setPKeyId(SnowFlakeUtil.getId());
+                            dataPrivate.setWbsId(wbsTreePrivate.getWbsId());
+                            dataPrivate.setWbsType(tree.getWbsType());
+                            dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
+                            insertDataPrivateList.add(dataPrivate);
+
+                            //同步到该项目下的所有合同段
+                            for (ContractInfo contractInfo : contractInfos) {
+                                WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
+                                if (wbsTreeContract != null) {
+                                    wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
+                                    wbsTreeContract.setWbsId(dataPrivate.getWbsId());
+                                    wbsTreeContract.setWbsType(Integer.valueOf(dataPrivate.getWbsType()));
+                                    wbsTreeContract.setProjectId(wbsTreePrivate.getProjectId());
+                                    wbsTreeContract.setContractType(contractInfo.getContractType());
+                                    wbsTreeContract.setContractId(String.valueOf(contractInfo.getId()));
+                                    wbsTreeContract.setIsBussShow(1);
+                                    if (dataPrivate.getType() == 2) {
+                                        wbsTreeContract.setIsTypePrivatePid(dataPrivate.getPKeyId());
+                                    }
+
+                                    //判断元素表是否存在合同段,存在则不新增;不存在则新增
+                                    WbsTreeContract resultTreeContract = treeContractListAllTables.stream().filter(f ->
+                                            f.getId().equals(wbsTreeContract.getId())
+                                                    && f.getNodeName().equals(wbsTreeContract.getNodeName())
+                                                    && f.getWbsId().equals(wbsTreeContract.getWbsId())
                                                     && f.getProjectId().equals(wbsTreePrivate.getProjectId())
+                                                    && f.getContractId().equals(String.valueOf(contractInfo.getId()))
                                                     && f.getStatus().equals(1)
-                                                    && f.getType().equals(1)
-                                    ).collect(Collectors.toList());
-
-                                    if (wbsTreeContracts2.size() > 0) {
-                                        //将表单同步到复制或新增的节点下
-                                        for (WbsTreeContract treeContract : wbsTreeContracts2) {
-                                            WbsTreeContract wbsTreeContract2 = BeanUtil.copyProperties(wbsTreeContract, WbsTreeContract.class);
-                                            if (wbsTreeContract2 != null) {
-                                                wbsTreeContract2.setPKeyId(SnowFlakeUtil.getId());
-                                                wbsTreeContract2.setParentId(treeContract.getId());
+                                    ).findAny().orElse(null);
+                                    if (resultTreeContract != null) {
+                                        continue;
+                                    }
 
-                                                insertDataContractList.add(wbsTreeContract2);
+                                    //判断元素表是否存在上级节点,存在则新增;不存在则表示没被引用,不新增
+                                    WbsTreeContract wbsTreeContract1 = treeContractListAllNodes.stream().filter(f ->
+                                            f.getContractId().equals(wbsTreeContract.getContractId())
+                                                    && f.getProjectId().equals(wbsTreeContract.getProjectId())
+                                                    && f.getWbsId().equals(wbsTreeContract.getWbsId())
+                                                    && f.getStatus().equals(1)
+                                                    && f.getType().equals(1)
+                                                    && f.getId().equals(wbsTreeContract.getParentId())
+                                    ).findAny().orElse(null);
+
+                                    if (wbsTreeContract1 != null) {
+                                        insertDataContractList.add(wbsTreeContract);
+
+                                        //获取上级父级节点同级别的复制或新增节点
+                                        List<WbsTreeContract> wbsTreeContracts2 = treeContractListAllNodes.stream().filter(f ->
+                                                (ObjectUtils.isNotEmpty(f.getOldId()) && f.getOldId().equals(String.valueOf(wbsTreeContract1.getId())))
+                                                        && f.getContractId().equals(String.valueOf(contractInfo.getId()))
+                                                        && f.getWbsId().equals(wbsTreePrivate.getWbsId())
+                                                        && f.getProjectId().equals(wbsTreePrivate.getProjectId())
+                                                        && f.getStatus().equals(1)
+                                                        && f.getType().equals(1)
+                                        ).collect(Collectors.toList());
+
+                                        if (wbsTreeContracts2.size() > 0) {
+                                            //将表单同步到复制或新增的节点下
+                                            for (WbsTreeContract treeContract : wbsTreeContracts2) {
+                                                WbsTreeContract wbsTreeContract2 = BeanUtil.copyProperties(wbsTreeContract, WbsTreeContract.class);
+                                                if (wbsTreeContract2 != null) {
+                                                    wbsTreeContract2.setPKeyId(SnowFlakeUtil.getId());
+                                                    wbsTreeContract2.setParentId(treeContract.getId());
+
+                                                    insertDataContractList.add(wbsTreeContract2);
+                                                }
                                             }
                                         }
                                     }
@@ -869,7 +1159,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     }
                 }
             }
-
             //新增
             if (insertDataPrivateList.size() > 0) {
                 this.insertBatch(insertDataPrivateList, 1000);
@@ -937,6 +1226,44 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return R.success("添加成功");
     }
 
+    @Override
+    public List<WbsTreePrivate> searchNodeAllTable(String primaryKeyId, String tableOwner, String tableType, String contractId, String projectId) {
+        WbsTreePrivate wbsTreePrivate = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
+                .eq(WbsTreePrivate::getPKeyId, primaryKeyId));
+        if (wbsTreePrivate == null) {
+            return Collections.emptyList();
+        }
+
+        //当前项目合同段只会存在一个角色roleId
+        SaveUserInfoByProject userInfo = wbsTreeContractMapper.selectRoleInfo(AuthUtil.getUserId(), contractId, projectId);
+        if (userInfo == null) {
+            throw new ServiceException("请先分配当前用户对该合同段的角色信息");
+        }
+        String roleId = userInfo.getRoleId();
+
+        //获取当前用户角色与表单所属方关系信息
+        List<WbsTableOwnerRole> wbsTableOwnerRoleList = wbsTreeContractMapper.selectWbsTableOwnerRoleList(roleId);
+        if (wbsTableOwnerRoleList.size() == 0) {
+            throw new ServiceException("当前用户角色未授权,请先分配角色查看元素表相对应的权限");
+        }
+
+        List<String> tableOwnerNumbers = wbsTableOwnerRoleList.stream().map(WbsTableOwnerRole::getTableOwnerNumber).collect(Collectors.toList());
+
+        List<String> tableOwnerList = null;
+        if (org.apache.commons.lang.StringUtils.isNotEmpty(tableOwner)) {
+            String tableOwners = "";
+            //此处加载字典owner_type 固定写死 施工质检1= 1 2 3 , 监理抽检2= 4 5 6
+            if (tableOwner.equals("1")) {
+                tableOwners = "1,2,3";
+            } else if (tableOwner.equals("2")) {
+                tableOwners = "4,5,6";
+            }
+            tableOwnerList = Func.toStrList(tableOwners);
+        }
+
+        return baseMapper.selectWbsTreeContractList(tableOwnerNumbers, tableType, wbsTreePrivate.getProjectId(), wbsTreePrivate.getWbsId(), wbsTreePrivate.getId(), tableOwnerList);
+    }
+
     @Transactional(rollbackFor = Exception.class)
     public boolean insertBatch(Collection<WbsTreePrivate> entityList, int batchSize) {
         try {