瀏覽代碼

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

lvy 1 周之前
父節點
當前提交
67814f85c5
共有 54 個文件被更改,包括 2796 次插入371 次删除
  1. 1 1
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java
  2. 59 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyAccessories.java
  3. 137 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyFinishTestReport.java
  4. 50 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyTestType.java
  5. 273 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyThirdReport.java
  6. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/EntrustInfoVO.java
  7. 29 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialCyThirdReportQueryVo.java
  8. 84 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/APIWbsContractSubdivisionVo.java
  9. 5 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TreeNodeVOByTabType.java
  10. 4 0
      blade-service/blade-business/pom.xml
  11. 10 67
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  12. 85 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialCyController.java
  13. 3 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/EntrustInfoMapper.xml
  14. 18 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyAccessoriesMapper.java
  15. 19 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyAccessoriesMapper.xml
  16. 18 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyFinishTestReportMapper.java
  17. 6 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyFinishTestReportMapper.xml
  18. 18 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyTestTypeMapper.java
  19. 6 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyTestTypeMapper.xml
  20. 18 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyThirdReportMapper.java
  21. 6 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyThirdReportMapper.xml
  22. 628 0
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/ChenYuTestScheduled.java
  23. 462 0
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/ChenYuTestScheduled01.java
  24. 57 0
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/vo/GetFinishTestReport.java
  25. 57 0
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/vo/GetThirdReport.java
  26. 25 0
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/vo/Result.java
  27. 25 0
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/vo/ResultPost.java
  28. 28 0
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/vo/ThirdLogin.java
  29. 13 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyAccessoriesService.java
  30. 13 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyFinishTestReportService.java
  31. 22 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyService.java
  32. 13 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyTestTypeService.java
  33. 13 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyThirdReportService.java
  34. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  35. 22 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyAccessoriesServiceImpl.java
  36. 22 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyFinishTestReportServiceImpl.java
  37. 90 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyServiceImpl.java
  38. 22 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyTestTypeServiceImpl.java
  39. 22 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyThirdReportServiceImpl.java
  40. 13 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/APIController.java
  41. 2 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  42. 15 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  43. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  44. 16 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.java
  45. 48 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  46. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java
  47. 55 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  48. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
  49. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java
  50. 8 14
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  51. 13 35
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  52. 11 30
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java
  53. 212 217
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  54. 8 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

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

@@ -98,7 +98,7 @@ public class OssBuilder {
                 oss.setEndpoint("https://xinan1.zos.ctyun.cn");
                 oss.setEndpoint("https://xinan1.zos.ctyun.cn");
             }
             }
         }
         }
-		oss.setEndpoint("https://xinan1.zos.ctyun.cn");
+		//oss.setEndpoint("https://xinan1.zos.ctyun.cn");
 		System.out.println("oss111="+oss.getEndpoint());
 		System.out.println("oss111="+oss.getEndpoint());
 		Oss ossCached = ossPool.get(tenantId);
 		Oss ossCached = ossPool.get(tenantId);
 		OssTemplate template = templatePool.get(tenantId);
 		OssTemplate template = templatePool.get(tenantId);

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

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

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

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

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

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

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

@@ -0,0 +1,273 @@
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 获取已上传的外委检测报告/第三方检测报告/上传报告 接受对象
+ *
+ * @author LHB
+ */
+@TableName("u_trial_cy_third_report")
+@Data
+public class TrialCyThirdReport {
+    @ApiModelProperty("唯一id")
+    @TableId(type = IdType.INPUT)
+    private Long pKeyId;
+    /**
+     * 合同id
+     */
+    @ApiModelProperty("合同id")
+    private Long contractId;
+    /**
+     * ID
+     */
+    @ApiModelProperty("成渝的id")
+    @TableField("id")
+    public String ID;
+    /**
+     * 报告类型(0:外委检测,1:第三方检测,2:扫描上传报告)
+     */
+    @ApiModelProperty("报告类型(0:外委检测,1:第三方检测,2:扫描上传报告)")
+    public Integer thirdType;
+    /**
+     * 委托编号
+     */
+    @ApiModelProperty("委托编号")
+    @TableField("consign_no")
+    public String ConsignNo;
+    /**
+     * 报告编号
+     */
+    @ApiModelProperty("报告编号")
+    @TableField("report_no")
+    public String ReportNo;
+    /**
+     * 取样时间 格式如:“2022-06-21”
+     */
+    @ApiModelProperty("取样时间 格式如:“2022-06-21”")
+    @TableField("take_sampling_date")
+    public String TakeSamplingDate;
+    /**
+     * 送样时间 格式如:“2022-06-21”
+     */
+    @ApiModelProperty("送样时间 格式如:“2022-06-21”")
+    @TableField("send_sample_date")
+    public String SendSampleDate;
+    /**
+     * 检测时间 格式如:“2022-06-21”
+     */
+    @ApiModelProperty("检测时间 格式如:“2022-06-21”")
+    @TableField("test_date")
+    public String TestDate;
+    /**
+     * 报告时间 格式如:“2022-06-21”
+     */
+    @ApiModelProperty("报告时间 格式如:“2022-06-21”")
+    @TableField("report_date")
+    public String ReportDate;
+    /**
+     * 委托单位
+     */
+    @ApiModelProperty("委托单位")
+    @TableField("consign_unit")
+    public String ConsignUnit;
+    /**
+     * 检测机构
+     */
+    @ApiModelProperty("检测机构")
+    @TableField("accept_test_unit")
+    public String AcceptTestUnit;
+    /**
+     * 送样人
+     */
+    @ApiModelProperty("送样人")
+    @TableField("send_sample_person")
+    public String SendSamplePerson;
+    /**
+     * 接样人
+     */
+    @ApiModelProperty("接样人")
+    @TableField("witness_person")
+    public String WitnessPerson;
+    /**
+     * 工程部位
+     */
+    @ApiModelProperty("工程部位")
+    @TableField("project_part")
+    public String ProjectPart;
+    /**
+     * 取样地点
+     */
+    @ApiModelProperty("取样地点")
+    @TableField("sampling_place")
+    public String SamplingPlace;
+    /**
+     * 样品名称
+     */
+    @ApiModelProperty("样品名称")
+    @TableField("sample_name")
+    public String SampleName;
+    /**
+     * 委托单文件下载地址
+     */
+    @ApiModelProperty("委托单文件下载地址")
+    @TableField("consign_doc_file_path")
+    public String ConsignDocFilePath;
+    /**
+     * 记录单文件下载地址
+     */
+    @ApiModelProperty("记录单文件下载地址")
+    @TableField("record_doc_file_path")
+    public String RecordDocFilePath;
+    /**
+     * 报告单文件下载地址
+     */
+    @ApiModelProperty("报告单文件下载地址")
+    @TableField("report_doc_file_path")
+    public String ReportDocFilePath;
+    /**
+     * 检测依据
+     */
+    @ApiModelProperty("检测依据")
+    @TableField("test_standard")
+    public String TestStandard;
+    /**
+     * 评定标准
+     */
+    @ApiModelProperty("评定标准")
+    @TableField("assess_standard")
+    public String AssessStandard;
+    /**
+     * 检测结论
+     */
+    @ApiModelProperty("检测结论")
+    @TableField("test_conclusion")
+    public String TestConclusion;
+    /**
+     * 备注
+     */
+    @ApiModelProperty("备注")
+    @TableField("memo")
+    public String Memo;
+    /**
+     * 期数
+     */
+    @ApiModelProperty("期数")
+    @TableField("period_num")
+    public String PeriodNum;
+    /**
+     * 是否合格
+     */
+    @ApiModelProperty("是否合格:1 合格, 0 不合格")
+    @TableField("is_qualified")
+    public String IsQualified;
+    /**
+     * 样品编号
+     */
+    @ApiModelProperty("样品编号")
+    @TableField("sample_code")
+    public String SampleCode;
+    /**
+     * 规格型号
+     */
+    @ApiModelProperty("规格型号")
+    @TableField("gui_ge_xing_hao")
+    public String GuiGeXingHao;
+    /**
+     * 生产厂家
+     */
+    @ApiModelProperty("生产厂家")
+    @TableField("sheng_chan_cj")
+    public String ShengChanCJ;
+    /**
+     * 产地
+     */
+    @ApiModelProperty("产地")
+    @TableField("chan_di")
+    public String ChanDi;
+    /**
+     * 样品数量
+     */
+    @ApiModelProperty("样品数量")
+    @TableField("sample_num")
+    public String SampleNum;
+    /**
+     * 检测机构资质证书编号
+     */
+    @ApiModelProperty("检测机构资质证书编号")
+    @TableField("consign_unit_ability")
+    public String ConsignUnitAbility;
+    /**
+     * 批号
+     */
+    @ApiModelProperty("批号")
+    @TableField("batch_num")
+    public String BatchNum;
+    /**
+     * 代表数量
+     */
+    @ApiModelProperty("代表数量")
+    @TableField("quantity")
+    public String Quantity;
+    /**
+     * 单位
+     */
+    @ApiModelProperty("单位")
+    @TableField("unit")
+    public String Unit;
+    /**
+     * 类型ID
+     */
+    @ApiModelProperty("类型ID")
+    @TableField("consign_test_cls_id")
+    public String ConsignTestClsID;
+    /**
+     * 结论
+     */
+    @ApiModelProperty("结论")
+    @TableField("result")
+    public String Result;
+    /**
+     * 是否已删除
+     * Null:未删除
+     * 0:未删除
+     * 1:已删除
+     */
+    @ApiModelProperty("是否已删除 0:未删除 1:已删除")
+    @TableField("is_deleted")
+    public String IsDeleted;
+    /**
+     * 删除时间
+     */
+    @ApiModelProperty("删除时间")
+    @TableField("delete_time")
+    public String DeleteTime;
+    /**
+     * 快报/正式报告
+     * 1 快报
+     * 2 正式报告
+     */
+    @ApiModelProperty("快报/ 正式报告 1 快报 2 正式报告")
+    @TableField("report_type")
+    public Integer ReportType;
+    /**
+     * 创建时间 格式如:“2022-06-21 13:44:33 235”
+     */
+    @ApiModelProperty("创建时间 格式如:“2022-06-21 13:44:33 235”")
+    @TableField("create_time")
+    public String CreateTime;
+
+    /**
+     * 附件
+     */
+    @ApiModelProperty("附件")
+    @TableField(exist = false)
+    private List<TrialCyAccessories> Accessories;
+}

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

@@ -53,4 +53,7 @@ public class EntrustInfoVO extends EntrustInfo {
     @ApiModelProperty("任务Id")
     @ApiModelProperty("任务Id")
     private String taskId;
     private String taskId;
 
 
+	@ApiModelProperty("委托单编号")
+	private String entrustNo;
+
 }
 }

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

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

+ 84 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/APIWbsContractSubdivisionVo.java

@@ -0,0 +1,84 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+import org.springblade.manager.entity.WbsTreeContract;
+
+/**
+ * 合同段分部分项划分节点试图
+ * 包含各个状态
+ * | 01   | 交工证书     | 所有子节点存在一个的major_data_type = 3   值为 true     |
+ * | 02   | 7天强度报告  | 所有最小节点中在m_table_file 中type = 11  存在一个true  |
+ * | 03   | 28天强度报告 | 所有最小节点中在m_table_file 中type = 12   存在一个true |
+ * | 04   | 监理收验资料 | 监理 major_data_type = 4  全部已审批                    |
+ * | 05   | 桩检报告     | 所有最小节点中在m_table_file 中type = 13   存在一个true |
+ * | 06   | 质检资料     | 质检 major_data_type = 4  全部已审批                    |
+ * | 07   | 评定资料     | major_data_type = 2  全部已审批                         |
+ * @author LHB
+ */
+@Data
+public class APIWbsContractSubdivisionVo {
+    /**
+     * 主键
+     */
+    private Long id;
+    /**
+     * 编码 空
+     */
+    private String code;
+    /**
+     * 节点名称
+     */
+    private String name;
+    /**
+     * 桩号
+     */
+    private String stake;
+    /**
+     * 父节点id
+     */
+    private Long pid;
+    /**
+     * 1表示单位工程 2表示分部工程 3表示分项工程
+     */
+    private Integer nodeType;
+    /**
+     * 层级编码 空
+     */
+    private String levelCode;
+    /**
+     * 专业工程id
+     */
+    private String partitionCatagID;
+    /**
+     * 专业工程名称
+     */
+    private String partitionCatagName;
+    /**
+     * 交工证书
+     */
+    private Boolean completionCertificate = false;
+    /**
+     * 7天强度报告
+     */
+    private Boolean strengthReportSeven = false;
+    /**
+     * 28天强度报告
+     */
+    private Boolean strengthReportTwentyEight = false;
+    /**
+     * 监理资料
+     */
+    private Boolean supervisionData = false;
+    /**
+     * 桩检报告
+     */
+    private Boolean pileInspectionReport = false;
+    /**
+     * 质检资料
+     */
+    private Boolean qualityInspectionData = false;
+    /**
+     * 评定资料
+     */
+    private Boolean evaluationData = false;
+}

+ 5 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TreeNodeVOByTabType.java

@@ -13,6 +13,7 @@ public class TreeNodeVOByTabType extends BaseNode<TreeNode> {
     private static final long serialVersionUID = 1L;
     private static final long serialVersionUID = 1L;
     private String title;
     private String title;
     private String primaryKeyId;
     private String primaryKeyId;
+    private Long pkeyId;
     private String tabType;
     private String tabType;
     private String tabOwner;
     private String tabOwner;
     private String elementTotal;
     private String elementTotal;
@@ -20,5 +21,9 @@ public class TreeNodeVOByTabType extends BaseNode<TreeNode> {
     private String initTableId;
     private String initTableId;
     private String initTableName;
     private String initTableName;
     private String excelIds;
     private String excelIds;
+    private String excelId;
+
+    private String tableType;
+    private String tableOwner;
 
 
 }
 }

+ 4 - 0
blade-service/blade-business/pom.xml

@@ -31,6 +31,10 @@
             <groupId>org.springblade</groupId>
             <groupId>org.springblade</groupId>
             <artifactId>blade-core-boot</artifactId>
             <artifactId>blade-core-boot</artifactId>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-core-test</artifactId>
+        </dependency>
         <dependency>
         <dependency>
             <groupId>org.springblade</groupId>
             <groupId>org.springblade</groupId>
             <artifactId>blade-starter-swagger</artifactId>
             <artifactId>blade-starter-swagger</artifactId>

+ 10 - 67
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -1217,48 +1217,8 @@ public class InformationWriteQueryController extends BladeController {
                 return R.data(300, false, "未查询到填报信息,上报失败");
                 return R.data(300, false, "未查询到填报信息,上报失败");
             }
             }
         } else { //质检
         } else { //质检
-            //记录选中节点的所有表单旧html
-            List<Long> list = Arrays.stream(startTaskVO.getIds().split(",")).map(Long::parseLong).collect(Collectors.toList());
-            List<WbsTreeContract> wbsTreeContracts =  wbsTreeContractClient.queryListByPIds(list);
-
-
             businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, startTaskVO.getIds().replaceAll(",", "")).eq(InformationQuery::getClassify, startTaskVO.getClassify().toString()).eq(InformationQuery::getType, 1).last("order by id desc limit 1"));
             businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, startTaskVO.getIds().replaceAll(",", "")).eq(InformationQuery::getClassify, startTaskVO.getClassify().toString()).eq(InformationQuery::getType, 1).last("order by id desc limit 1"));
             if (businessData != null) {
             if (businessData != null) {
-
-                //处理html 复制之后记录在新表中w
-                if (CollectionUtils.isNotEmpty(wbsTreeContracts)) {
-                    List<WbsTreeContractOldHtml> data = new ArrayList<>();
-                    try {
-                        for (WbsTreeContract wbsTreeContract : wbsTreeContracts) {
-                            ExcelTab byId = excelTabClient.getById(String.valueOf(wbsTreeContract.getExcelId()));
-                            WbsTreeContractOldHtml oldHtml = new WbsTreeContractOldHtml();
-                            oldHtml.setId(SnowFlakeUtil.getId());
-                            oldHtml.setCreateUser(getUser().getUserId());
-                            String htmlUrl = wbsTreeContract.getHtmlUrl();
-                            // 获取或下载文件
-                            Path sourcePath = FileUtils.getOrDownloadFile(htmlUrl);
-                            // 生成副本路径
-                            Path copyPath = FileUtils.generateCopyPath(sourcePath,wbsTreeContract.getPKeyId());
-                            // 执行复制操作(覆盖已存在的文件)
-                            Files.copy(sourcePath, copyPath, StandardCopyOption.REPLACE_EXISTING);
-
-                            oldHtml.setContractFormId(wbsTreeContract.getPKeyId());
-                            oldHtml.setOldHtmlUrl(copyPath.toFile().getAbsolutePath());
-                            //记录历史excel路径
-                            oldHtml.setOldExcelUrl(byId.getFileUrl());
-                            data.add(oldHtml);
-                        }
-                        List<Long> collect = data.stream().map(WbsTreeContractOldHtml::getContractFormId).collect(Collectors.toList());
-                        //删除旧记录
-                        wbsTreeContractOldHtmlClient.deleteByContractFormIds(collect);
-
-                        wbsTreeContractOldHtmlClient.save(data);
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                        throw new ServiceException(e.getMessage());
-                    }
-                }
-
                 //设置业务数据ID
                 //设置业务数据ID
                 startTaskVO.setIds(businessData.getId().toString());
                 startTaskVO.setIds(businessData.getId().toString());
                 return this.batchTask(startTaskVO);
                 return this.batchTask(startTaskVO);
@@ -2208,17 +2168,7 @@ public R<Boolean> copyContractTreeNode(@RequestBody CopyContractTreeNodeVO vo) {
             //TODO 20250414-lhb-新增 添加祖级字段 ancestorsPId
             //TODO 20250414-lhb-新增 添加祖级字段 ancestorsPId
             //因为复制选中节点,所以要查询出选中节点的父节点信息 来组装祖级节点
             //因为复制选中节点,所以要查询出选中节点的父节点信息 来组装祖级节点
             if(needCopyNode != null){
             if(needCopyNode != null){
-                Long parentPKeyId = null;
-                String ancestorsPId = null;
-                if(needCopyNode.getPId() == 0L){
-                    ancestorsPId = "0";
-                    parentPKeyId = 0L;
-                }else{
-                    WbsTreeContract parentNode = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(String.valueOf(needCopyNode.getPId()));
-                    ancestorsPId = parentNode.getAncestorsPId();
-                    parentPKeyId = parentNode.getPKeyId();
-                }
-                attachNodesToTarget(saveList,parentPKeyId,ancestorsPId);
+                attachNodesToTarget(saveList);
             }
             }
         }
         }
         needCopyNode.setNodeName(vo.getNeedCopyNodeName());
         needCopyNode.setNodeName(vo.getNeedCopyNodeName());
@@ -2395,17 +2345,7 @@ public R<Boolean> copyContractTreeNode(@RequestBody CopyContractTreeNodeVO vo) {
                             resultAll.addAll(addTabList);
                             resultAll.addAll(addTabList);
                             //因为复制选中节点,所以要查询出选中节点的父节点信息 来组装祖级节点
                             //因为复制选中节点,所以要查询出选中节点的父节点信息 来组装祖级节点
                             if(needCopyNode != null && CollectionUtil.isNotEmpty(resultAll)){
                             if(needCopyNode != null && CollectionUtil.isNotEmpty(resultAll)){
-                                Long parentPKeyId = null;
-                                String ancestorsPId = null;
-                                if(needCopyNode.getPId() == 0L){
-                                    ancestorsPId = "0";
-                                    parentPKeyId = 0L;
-                                }else{
-                                    WbsTreeContract parentNode = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(String.valueOf(toCopyVO.getPrimaryKeyId()));
-                                    ancestorsPId = parentNode.getAncestorsPId();
-                                    parentPKeyId = parentNode.getPKeyId();
-                                }
-                                attachNodesToTarget(resultAll,parentPKeyId,ancestorsPId);
+                                attachNodesToTarget(resultAll);
                             }
                             }
                         }
                         }
                     }
                     }
@@ -4257,7 +4197,7 @@ public R<Boolean> saveContractTreeNode(@RequestBody AddContractTreeNodeVO vo) {
             }
             }
         }
         }
         //TODO 20250414-lhb-新增 添加ancestorsPId字段
         //TODO 20250414-lhb-新增 添加ancestorsPId字段
-        attachNodesToTarget(saveList,treeContract.getPKeyId(),treeContract.getAncestorsPId());
+        attachNodesToTarget(saveList);
 
 
         R<Boolean> booleanR = this.saveOrCopyNodeTree(saveList, saveLedger, 2, treeContract);
         R<Boolean> booleanR = this.saveOrCopyNodeTree(saveList, saveLedger, 2, treeContract);
 
 
@@ -5173,15 +5113,18 @@ public R<Object> customAddContractNode(@RequestBody CustomAddContractNodeDTO dto
         }
         }
     }
     }
 
 
-    public void attachNodesToTarget(List<WbsTreeContract> newNodes, Long targetId, String targetAncestors) {
+    public void attachNodesToTarget(List<WbsTreeContract> newNodes) {
         // 1. 找到新数据中的顶层节点(新树的根节点)
         // 1. 找到新数据中的顶层节点(新树的根节点)
         List<WbsTreeContract> newRoot = findRootNode(newNodes);
         List<WbsTreeContract> newRoot = findRootNode(newNodes);
 
 
         // 2. 将新树的根节点绑定到目标节点
         // 2. 将新树的根节点绑定到目标节点
         newRoot.forEach(f -> {
         newRoot.forEach(f -> {
-            f.setPId(targetId);
-            f.setAncestorsPId(calculateAncestors(targetAncestors, targetId));
-
+            WbsTreeContract parentNode = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(String.valueOf(f.getPId()));
+            if(parentNode ==  null){
+                f.setAncestorsPId("0");
+            }else{
+                f.setAncestorsPId(calculateAncestors(parentNode.getAncestorsPId(), f.getPId()));
+            }
 
 
             // 3. 构建映射关系
             // 3. 构建映射关系
             Map<Long, WbsTreeContract> nodeMap = new HashMap<>();
             Map<Long, WbsTreeContract> nodeMap = new HashMap<>();

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

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

+ 3 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/EntrustInfoMapper.xml

@@ -71,6 +71,9 @@
         <if test="param2.entrustName != null and param2.entrustName != ''">
         <if test="param2.entrustName != null and param2.entrustName != ''">
             AND ( a.entrust_name like CONCAT(CONCAT('%', #{param2.entrustName}), '%') or a.entrust_no like CONCAT(CONCAT('%', #{param2.entrustName}), '%') or b.material_name like CONCAT(CONCAT('%', #{param2.entrustName}), '%'))
             AND ( a.entrust_name like CONCAT(CONCAT('%', #{param2.entrustName}), '%') or a.entrust_no like CONCAT(CONCAT('%', #{param2.entrustName}), '%') or b.material_name like CONCAT(CONCAT('%', #{param2.entrustName}), '%'))
         </if>
         </if>
+        <if test="param2.entrustNo != null and param2.entrustNo != ''">
+            AND a.entrust_no like CONCAT(CONCAT('%', #{param2.entrustNo}), '%')
+        </if>
     </select>
     </select>
 
 
     <select id="getReportDetail" resultType="org.springblade.business.vo.EntrustDataInfoVO">
     <select id="getReportDetail" resultType="org.springblade.business.vo.EntrustDataInfoVO">

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

@@ -0,0 +1,18 @@
+package org.springblade.business.mapper;
+
+import org.springblade.business.entity.TrialCyAccessories;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author LHB
+* @description 针对表【u_trial_cy_accessories(成渝-附件信息)】的数据库操作Mapper
+* @createDate 2025-08-04 14:39:16
+* @Entity generator.domain.UTrialCyAccessories
+*/
+public interface TrialCyAccessoriesMapper extends BaseMapper<TrialCyAccessories> {
+
+}
+
+
+
+

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

@@ -0,0 +1,19 @@
+<?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.TrialCyAccessoriesMapper">
+
+    <resultMap id="BaseResultMap" type="org.springblade.business.entity.TrialCyAccessories">
+            <id property="id" column="id" />
+            <result property="reportId" column="report_id" />
+            <result property="accId" column="acc_id" />
+            <result property="accType" column="acc_type" />
+            <result property="fileName" column="file_name" />
+            <result property="filePath" column="file_path" />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,report_id,acc_id,acc_type,file_name,file_path
+    </sql>
+</mapper>

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

@@ -0,0 +1,18 @@
+package org.springblade.business.mapper;
+
+import org.springblade.business.entity.TrialCyFinishTestReport;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author LHB
+* @description 针对表【u_trial_cy_finish_test_report(成渝-获取标段已完成(已签章完成)的检测报告)】的数据库操作Mapper
+* @createDate 2025-08-01 09:05:03
+* @Entity generator.domain.UTrialCyFinishTestReport
+*/
+public interface TrialCyFinishTestReportMapper extends BaseMapper<TrialCyFinishTestReport> {
+
+}
+
+
+
+

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

@@ -0,0 +1,6 @@
+<?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.TrialCyFinishTestReportMapper">
+</mapper>

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

@@ -0,0 +1,18 @@
+package org.springblade.business.mapper;
+
+import org.springblade.business.entity.TrialCyTestType;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author LHB
+* @description 针对表【u_trial_cy_test_type(成渝-试验检测树)】的数据库操作Mapper
+* @createDate 2025-08-01 09:05:07
+* @Entity generator.domain.UTrialCyTestType
+*/
+public interface TrialCyTestTypeMapper extends BaseMapper<TrialCyTestType> {
+
+}
+
+
+
+

+ 6 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyTestTypeMapper.xml

@@ -0,0 +1,6 @@
+<?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.TrialCyTestTypeMapper">
+</mapper>

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

@@ -0,0 +1,18 @@
+package org.springblade.business.mapper;
+
+import org.springblade.business.entity.TrialCyThirdReport;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author LHB
+* @description 针对表【u_trial_cy_third_report(成渝-已上传的外委检测报告/第三方检测报告/上传报告)】的数据库操作Mapper
+* @createDate 2025-08-01 09:05:10
+* @Entity generator.domain.UTrialCyThirdReport
+*/
+public interface TrialCyThirdReportMapper extends BaseMapper<TrialCyThirdReport> {
+
+}
+
+
+
+

+ 6 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyThirdReportMapper.xml

@@ -0,0 +1,6 @@
+<?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.TrialCyThirdReportMapper">
+</mapper>

+ 628 - 0
blade-service/blade-business/src/main/java/org/springblade/business/scheduled/ChenYuTestScheduled.java

@@ -0,0 +1,628 @@
+package org.springblade.business.scheduled;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.common.utils.MD5Utils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.Consts;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.springblade.business.entity.TrialCyAccessories;
+import org.springblade.business.entity.TrialCyFinishTestReport;
+import org.springblade.business.entity.TrialCyTestType;
+import org.springblade.business.entity.TrialCyThirdReport;
+import org.springblade.business.scheduled.vo.*;
+import org.springblade.business.service.TrialCyAccessoriesService;
+import org.springblade.business.service.TrialCyFinishTestReportService;
+import org.springblade.business.service.TrialCyTestTypeService;
+import org.springblade.business.service.TrialCyThirdReportService;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.common.utils.SystemUtils;
+import org.springblade.core.redis.cache.BladeRedis;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.CollectionUtil;
+import org.springblade.core.tool.utils.DigestUtil;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.ProjectInfo;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.annotation.Resource;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+/**
+ * 成渝试验第三方接口获取数据
+ * 定时任务
+ *
+ * @author LHB
+ */
+@Component
+@Slf4j
+public class ChenYuTestScheduled {
+
+    // 接口URL常量
+    private static final String THIRD_LOGIN_URL = "/api/ThirdSystem/ThirdLogin";
+    private static final String CONTRACT_SECT_URL = "/api/CQHCZC/MesureSystem/GetContractSectByProjCode";
+    private static final String FINISH_TEST_REPORT_URL = "/open/TestReport/GetFinishTestReport";
+    private static final String THIRD_REPORT_URL = "/open/ThirdReport/GetThirdReport";
+    private static final String ALL_TEST_TYPE_URL = "/open/ThirdReport/GetAllTestType";
+
+    // SQL常量
+    private static final String PROJECT_ID_SQL = "select id from m_project_info where project_number = ? and is_deleted = 0 limit 1";
+    private static final String APP_KEY_SQL = "select param_value from blade_param where param_key = 'cy.trial.appKey' and is_deleted = 0";
+    private static final String APP_SECRET_SQL = "select param_value from blade_param where param_key = 'cy.trial.appSecret' and is_deleted = 0";
+
+    @Resource
+    private JdbcTemplate jdbcTemplate;
+
+    @Resource
+    private BladeRedis bladeRedis;
+
+    @Resource
+    private TrialCyFinishTestReportService trialCyFinishTestReportService;
+
+    @Resource
+    private TrialCyTestTypeService trialCyTestTypeService;
+
+    @Resource
+    private TrialCyThirdReportService trialCyThirdReportService;
+
+    @Resource
+    private TrialCyAccessoriesService trialCyAccessoriesService;
+
+    private CloseableHttpClient httpClient;
+    private static final String TOKEN_REDIS_KEY = "blade:cqcy:token";
+    private static final String PROJECT_CODE = "cqcyfx";
+    private static Long PROJECT_ID = null;
+    private static final String BASE_URL = "https://apicqcyfx.qdm123.com";
+    private final Map<String, Long> contractCodeMap = new ConcurrentHashMap<>();
+
+    @PostConstruct
+    public void init() {
+        this.httpClient = HttpClientBuilder.create().build();
+    }
+
+    @PreDestroy
+    public void destroy() {
+        if (httpClient != null) {
+            try {
+                httpClient.close();
+                log.info("HTTP client closed successfully");
+            } catch (IOException e) {
+                log.error("Error closing HTTP client", e);
+            }
+        }
+    }
+
+    /**
+     * 确保项目ID已初始化
+     */
+    private synchronized void ensureProjectIdInitialized() {
+        if (PROJECT_ID != null) return;
+
+        try {
+            List<ProjectInfo> projectList = jdbcTemplate.query(
+                    PROJECT_ID_SQL,
+                    new Object[]{PROJECT_CODE},
+                    new BeanPropertyRowMapper<>(ProjectInfo.class)
+            );
+
+            if (projectList != null && !projectList.isEmpty()) {
+                PROJECT_ID = projectList.get(0).getId();
+                log.info("Project ID initialized: {}", PROJECT_ID);
+            } else {
+                log.error("Project not found for code: {}", PROJECT_CODE);
+            }
+        } catch (Exception e) {
+            log.error("Error initializing project ID", e);
+        }
+    }
+
+    /**
+     * 获取有效的Token
+     */
+    private String getToken() {
+        String token = bladeRedis.get(TOKEN_REDIS_KEY);
+        if (token != null) {
+            return token;
+        }
+        return thirdLogin();
+    }
+
+    /**
+     * 登录获取Token
+     */
+    private String thirdLogin() {
+        ensureProjectIdInitialized();
+        if (PROJECT_ID == null) {
+            log.error("Project ID not available for login");
+            return null;
+        }
+
+        try {
+            String appKey = jdbcTemplate.queryForObject(APP_KEY_SQL, String.class);
+            String appSecret = jdbcTemplate.queryForObject(APP_SECRET_SQL, String.class);
+
+            if (StringUtil.isBlank(appKey) || StringUtil.isBlank(appSecret)) {
+                log.error("Missing appKey or appSecret configuration");
+                return null;
+            }
+
+            Long time = System.currentTimeMillis();
+            String md5Hex = MD5Utils.md5Hex(time + appKey + appSecret, "UTF-8");
+
+            ThirdLogin thirdLogin = new ThirdLogin();
+            thirdLogin.setAppKey(appKey);
+            thirdLogin.setTimestamp(time);
+            thirdLogin.setSecret(md5Hex);
+
+            Result result = postToken(BASE_URL + THIRD_LOGIN_URL, thirdLogin);
+            if (result == null || result.getState() != 1) {
+                log.error("Login failed: {}", result != null ? result.getMessage() : "No response");
+                return null;
+            }
+
+            JSONObject data = (JSONObject) result.getData();
+            String newToken = data.getString("token");
+            long expire = data.getLong("expireSecond") - 60;
+            bladeRedis.setEx(TOKEN_REDIS_KEY, newToken, expire);
+            return newToken;
+        } catch (Exception e) {
+            log.error("Login process failed", e);
+            return null;
+        }
+    }
+
+    /**
+     * 获取合同段列表
+     */
+    @Scheduled(cron = "0 0 * * * ?")
+    public void getContractSectByProjCode() {
+        if (!SystemUtils.isLinux()) {
+            return;
+        }
+
+        contractCodeMap.clear();
+        String token = getToken();
+        ensureProjectIdInitialized();
+
+        if (token == null || PROJECT_ID == null) {
+            log.error("Invalid token or project ID");
+            return;
+        }
+
+        try {
+            //获取合同段列表接口
+            Result result = getContractList();
+            if (result == null || result.getState() != 1) {
+                log.error("Failed to get contract sections: {}",
+                        result != null ? result.getMessage() : "No response");
+                return;
+            }
+
+            JSONArray data = (JSONArray) result.getData();
+            if (CollectionUtil.isEmpty(data)) {
+                log.warn("No contract sections found");
+                return;
+            }
+
+            List<String> codes = new ArrayList<>();
+            for (int i = 0; i < data.size(); i++) {
+                JSONObject obj = data.getJSONObject(i);
+                String name = obj.getString("Name");
+                if (StringUtil.isNotBlank(name)) {
+                    codes.add(name);
+                }
+            }
+
+            if (CollectionUtil.isEmpty(codes)) {
+                log.info("No valid contract codes found");
+                return;
+            }
+
+            // 构建参数化查询
+            String placeholders = String.join(",", Collections.nCopies(codes.size(), "?"));
+            String sql = "SELECT * FROM m_contract_info WHERE contract_number IN (" + placeholders + ")";
+
+            List<ContractInfo> contracts = jdbcTemplate.query(
+                    sql,
+                    codes.toArray(),
+                    new BeanPropertyRowMapper<>(ContractInfo.class)
+            );
+
+            for (ContractInfo contract : contracts) {
+                contractCodeMap.put(contract.getContractNumber(), contract.getId());
+            }
+
+            log.info("Loaded {} contract mappings", contractCodeMap.size());
+        } catch (Exception e) {
+            log.error("Error processing contract sections", e);
+        }
+    }
+
+    /**
+     * 获取已完成的检测报告
+     */
+    @Scheduled(cron = "0 0 * * * ?")
+    public void getFinishTestReport() {
+        if (!SystemUtils.isLinux()) {
+            return;
+        }
+
+        String token = getToken();
+        ensureProjectIdInitialized();
+
+        if (token == null || PROJECT_ID == null || contractCodeMap.isEmpty()) {
+            log.error("Preconditions not met for finish test report");
+            return;
+        }
+
+        for (Map.Entry<String, Long> entry : contractCodeMap.entrySet()) {
+            String contractCode = entry.getKey();
+            Long contractId = entry.getValue();
+
+            //查询旧数据
+            List<TrialCyFinishTestReport> list = trialCyFinishTestReportService.list(Wrappers.<TrialCyFinishTestReport>lambdaQuery()
+                    .eq(TrialCyFinishTestReport::getContractId, contractId));
+            //等会准备删除的历史数据
+            List<Long> ids = list.stream().map(TrialCyFinishTestReport::getId).collect(Collectors.toList());
+
+            int pageIndex = 0;
+            final int pageSize = 100;
+            boolean hasMore = true;
+
+            while (hasMore) {
+                try {
+                    List<NameValuePair> params = new ArrayList<NameValuePair>();
+                    params.add(new BasicNameValuePair("ProjectCode", PROJECT_CODE));
+                    params.add(new BasicNameValuePair("ContractsectCode", contractCode));
+                    //这些参数未找到传递的值
+                    if (false) {
+                        params.add(new BasicNameValuePair("BeginTime", null));
+                        params.add(new BasicNameValuePair("EndTime", null));
+                        params.add(new BasicNameValuePair("FinishBeginTime", null));
+                        params.add(new BasicNameValuePair("FinishEndTime", null));
+                    }
+                    params.add(new BasicNameValuePair("PageIndex", String.valueOf(pageIndex)));
+                    params.add(new BasicNameValuePair("PageSize", String.valueOf(pageSize)));
+
+                    ResultPost result = post(BASE_URL + FINISH_TEST_REPORT_URL, params);
+
+                    if (result == null) {
+                        log.error("Request failed for contract: {}", contractCode);
+                        break;
+                    }
+
+                    if (result.getCode() != 200) {
+                        log.error("API error for contract {}: {}", contractCode, result.getMsg());
+                        break;
+                    }
+
+                    JSONArray data = (JSONArray) result.getResult();
+                    if (CollectionUtil.isEmpty(data)) {
+                        break;
+                    }
+
+                    List<TrialCyFinishTestReport> reports = data.toJavaList(TrialCyFinishTestReport.class);
+                    for (TrialCyFinishTestReport report : reports) {
+                        Long id = SnowFlakeUtil.getId();
+                        report.setId(id);
+                        report.setContractId(contractId);
+                        //处理boolean值
+                        report.setExperimentResult(String.valueOf(report.getExperimentResult() == null ? 0 : "True".equals(report.getExperimentResult()) ? 1 : 0));
+
+                        //处理附件
+                        List<TrialCyAccessories> accessories = report.getAccessories();
+                        if (CollectionUtil.isNotEmpty(accessories)) {
+                            accessories.forEach(f -> {
+                                f.setId(SnowFlakeUtil.getId());
+                                f.setReportId(id);
+                            });
+
+                            if (CollectionUtil.isNotEmpty(ids)) {
+                                trialCyAccessoriesService.remove(Wrappers.<TrialCyAccessories>lambdaQuery()
+                                        .in(TrialCyAccessories::getReportId, ids));
+                            }
+
+                            trialCyAccessoriesService.saveBatch(accessories);
+                        }
+                    }
+                    if (CollectionUtil.isNotEmpty(ids)) {
+                        trialCyFinishTestReportService.removeBatchByIds(ids);
+                    }
+
+                    trialCyFinishTestReportService.saveBatch(reports);
+                    hasMore = reports.size() >= pageSize;
+                    pageIndex++;
+                } catch (Exception e) {
+                    log.error("Error processing contract {} page {}", contractCode, pageIndex, e);
+                    break;
+                }
+            }
+        }
+    }
+
+    /**
+     * 获取第三方报告
+     */
+    @Scheduled(cron = "0 0 * * * ?")
+    public void getThirdReport() {
+        if (!SystemUtils.isLinux()) {
+            return;
+        }
+
+        Integer[] thirdTypes = {0,1,2};
+
+        String token = getToken();
+        ensureProjectIdInitialized();
+
+        if (token == null || PROJECT_ID == null || contractCodeMap.isEmpty()) {
+            log.error("Preconditions not met for third report");
+            return;
+        }
+
+        for (Map.Entry<String, Long> entry : contractCodeMap.entrySet()) {
+            String contractCode = entry.getKey();
+            Long contractId = entry.getValue();
+
+
+            //获取旧id
+            List<TrialCyThirdReport> list = trialCyThirdReportService.list(Wrappers.<TrialCyThirdReport>lambdaQuery()
+                    .eq(TrialCyThirdReport::getContractId, contractId));
+            //等会要删除的id
+            List<Long> ids = list.stream().map(TrialCyThirdReport::getPKeyId).collect(Collectors.toList());
+
+
+            int pageIndex = 0;
+            final int pageSize = 100;
+            boolean hasMore = true;
+
+            for (Integer thirdType : thirdTypes) {
+                while (hasMore) {
+                    try {
+                        List<NameValuePair> params = new ArrayList<NameValuePair>();
+                        params.add(new BasicNameValuePair("ProjectCode", PROJECT_CODE));
+                        params.add(new BasicNameValuePair("ContractsectCode", contractCode));
+                        params.add(new BasicNameValuePair("ThirdType", String.valueOf(thirdType)));
+                        //这些参数为找到传递值
+                        if (false) {
+                            params.add(new BasicNameValuePair("BeginTime", null));
+                            params.add(new BasicNameValuePair("EndTime", null));
+                        }
+                        params.add(new BasicNameValuePair("PageIndex", String.valueOf(pageIndex)));
+                        params.add(new BasicNameValuePair("PageSize", String.valueOf(pageSize)));
+
+
+                        ResultPost result = post(BASE_URL + THIRD_REPORT_URL, params);
+
+                        if (result == null) {
+                            log.error("Request failed for contract: {}", contractCode);
+                            break;
+                        }
+
+                        if (result.getCode() != 200) {
+                            log.error("API error for contract {}: {}", contractCode, result.getMsg());
+                            break;
+                        }
+
+                        JSONArray data = (JSONArray) result.getResult();
+                        if (CollectionUtil.isEmpty(data)) {
+                            break;
+                        }
+
+                        List<TrialCyThirdReport> reports = data.toJavaList(TrialCyThirdReport.class);
+                        for (TrialCyThirdReport report : reports) {
+                            Long id = SnowFlakeUtil.getId();
+                            report.setPKeyId(id);
+                            report.setContractId(contractId);
+                            //报告类型
+                            report.setThirdType(thirdType);
+                            //处理boolean值
+                            report.setIsDeleted(String.valueOf(report.getIsDeleted() == null ? '1' : "True".equals(report.getIsDeleted()) ? '1' : '0'));
+                            report.setIsQualified(String.valueOf(report.getIsQualified() == null ? '0' : "True".equals(report.getIsQualified()) ? '1' : '0'));
+
+                            //处理附件
+                            List<TrialCyAccessories> accessories = report.getAccessories();
+                            if (CollectionUtil.isNotEmpty(accessories)) {
+                                accessories.forEach(f -> {
+                                    f.setId(SnowFlakeUtil.getId());
+                                    f.setReportId(id);
+                                });
+                                //删除旧数据
+                                if (CollectionUtil.isNotEmpty(ids)) {
+                                    trialCyAccessoriesService.remove(Wrappers.<TrialCyAccessories>lambdaQuery()
+                                            .in(TrialCyAccessories::getReportId, ids));
+                                }
+                                //添加新数据
+                                trialCyAccessoriesService.saveBatch(accessories);
+                            }
+                        }
+                        //删除旧数据
+                        if (CollectionUtil.isNotEmpty(ids)) {
+                            trialCyThirdReportService.removeBatchByIds(ids);
+                        }
+
+                        //添加新数据
+                        trialCyThirdReportService.saveBatch(reports);
+                        hasMore = reports.size() >= pageSize;
+                        pageIndex++;
+                    } catch (Exception e) {
+                        log.error("Error processing contract {} page {}", contractCode, pageIndex, e);
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 获取检测项目树  TODO 第三方接口未开发完(待调试)
+     */
+    @Scheduled(cron = "0 0 * * * ?")
+    public void getAllTestType() {
+        if (!SystemUtils.isLinux()) {
+            return;
+        }
+
+        try {
+            String token = getToken();
+            ensureProjectIdInitialized();
+
+            if (token == null || PROJECT_ID == null) {
+                log.error("Invalid token or project ID");
+                return;
+            }
+
+            List<NameValuePair> params = new ArrayList<NameValuePair>();
+            params.add(new BasicNameValuePair("ProjectCode", PROJECT_CODE));
+
+            ResultPost result = post(BASE_URL + ALL_TEST_TYPE_URL, params);
+            if (result == null || result.getCode() != 200) {
+                log.error("Failed to get test types: {}",
+                        result != null ? result.getMsg() : "No response");
+                return;
+            }
+
+            JSONArray data = (JSONArray) result.getResult();
+            if (CollectionUtil.isEmpty(data)) {
+                log.info("No test types found");
+                return;
+            }
+
+            List<TrialCyTestType> testTypes = data.toJavaList(TrialCyTestType.class);
+            for (TrialCyTestType type : testTypes) {
+                type.setPKeyId(SnowFlakeUtil.getId());
+                type.setProjectId(PROJECT_ID);
+                type.setFatherID(type.getFatherID() == null || type.getFatherID().isEmpty() ? "0" : type.getFatherID());
+            }
+            //先删除旧数据
+            trialCyTestTypeService.remove(Wrappers.<TrialCyTestType>lambdaQuery()
+                    .eq(TrialCyTestType::getProjectId, PROJECT_ID));
+            trialCyTestTypeService.saveOrUpdateBatch(testTypes);
+            log.info("Saved {} test types", testTypes.size());
+        } catch (Exception e) {
+            log.error("Error processing test types", e);
+        }
+    }
+
+    /**
+     * HTTP POST请求 获取token
+     */
+    private Result postToken(String url, ThirdLogin payload) {
+        HttpPost httpPost = new HttpPost(url);
+        httpPost.setHeader("Content-Type", "application/json");
+        try {
+            httpPost.setEntity(new StringEntity(JSON.toJSONString(payload), StandardCharsets.UTF_8));
+        } catch (Exception e) {
+            log.error("Failed to set request entity", e);
+            return null;
+        }
+
+        try (ByteArrayOutputStream output = new ByteArrayOutputStream()) {
+            HttpResponse response = httpClient.execute(httpPost);
+            int status = response.getStatusLine().getStatusCode();
+
+            if (status != 200) {
+                log.warn("HTTP error: {} - {}", status, response.getStatusLine().getReasonPhrase());
+                return null;
+            }
+
+            try (InputStream input = response.getEntity().getContent()) {
+                byte[] buffer = new byte[1024];
+                int bytesRead;
+                while ((bytesRead = input.read(buffer)) != -1) {
+                    output.write(buffer, 0, bytesRead);
+                }
+            }
+
+            String responseString = new String(output.toByteArray(), StandardCharsets.UTF_8);
+            return JSON.parseObject(responseString, Result.class);
+        } catch (Exception e) {
+            log.error("HTTP request failed: {}", url, e);
+            return null;
+        }
+    }
+
+    /**
+     * HTTP POST请求
+     */
+    private ResultPost post(String url, List<NameValuePair> params) {
+        HttpPost httpPost = new HttpPost(url);
+        httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
+        httpPost.setHeader("token", getToken());
+        try {
+            httpPost.setEntity(new UrlEncodedFormEntity(params, Consts.UTF_8));
+        } catch (Exception e) {
+            log.error("Failed to set request entity", e);
+            return null;
+        }
+
+        try (ByteArrayOutputStream output = new ByteArrayOutputStream()) {
+            HttpResponse response = httpClient.execute(httpPost);
+            int status = response.getStatusLine().getStatusCode();
+
+            if (status != 200) {
+                log.warn("HTTP error: {} - {}", status, response.getStatusLine().getReasonPhrase());
+                return null;
+            }
+
+            try (InputStream input = response.getEntity().getContent()) {
+                byte[] buffer = new byte[1024];
+                int bytesRead;
+                while ((bytesRead = input.read(buffer)) != -1) {
+                    output.write(buffer, 0, bytesRead);
+                }
+            }
+
+            String responseString = new String(output.toByteArray(), StandardCharsets.UTF_8);
+            return JSON.parseObject(responseString, ResultPost.class);
+        } catch (Exception e) {
+            log.error("HTTP request failed: {}", url, e);
+            return null;
+        }
+    }
+
+    /**
+     * HTTP get 请求 获取合同段数据
+     */
+    private Result getContractList() {
+        try {
+            CloseableHttpClient client = HttpClients.createDefault();
+            HttpGet httpGet = new HttpGet(BASE_URL + CONTRACT_SECT_URL + "?token=" + getToken() + "&ProjectCode=" + PROJECT_CODE);
+            CloseableHttpResponse response = client.execute(httpGet);
+
+            //5、获取实体
+            HttpEntity entity = response.getEntity();
+            //将实体装成字符串
+            String string = EntityUtils.toString(entity);
+            return JSON.parseObject(string, Result.class);
+        } catch (IOException e) {
+            log.error("HTTP request failed: {}", BASE_URL + CONTRACT_SECT_URL, e);
+            return null;
+        }
+    }
+}

+ 462 - 0
blade-service/blade-business/src/main/java/org/springblade/business/scheduled/ChenYuTestScheduled01.java

@@ -0,0 +1,462 @@
+package org.springblade.business.scheduled;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.common.utils.MD5Utils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.springblade.business.entity.TrialCyFinishTestReport;
+import org.springblade.business.entity.TrialCyTestType;
+import org.springblade.business.entity.TrialCyThirdReport;
+import org.springblade.business.scheduled.vo.GetFinishTestReport;
+import org.springblade.business.scheduled.vo.GetThirdReport;
+import org.springblade.business.scheduled.vo.Result;
+import org.springblade.business.scheduled.vo.ThirdLogin;
+import org.springblade.business.service.TrialCyFinishTestReportService;
+import org.springblade.business.service.TrialCyTestTypeService;
+import org.springblade.business.service.TrialCyThirdReportService;
+import org.springblade.common.utils.SystemUtils;
+import org.springblade.core.redis.cache.BladeRedis;
+import org.springblade.core.tool.utils.CollectionUtil;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.ProjectInfo;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 成渝试验第三方接口获取数据
+ * 定时任务
+ *
+ * @author LHB
+ */
+@Component
+@Slf4j
+public class ChenYuTestScheduled01 {
+
+    @Resource
+    private JdbcTemplate jdbcTemplate;
+
+    @Resource
+    private BladeRedis bladeRedis;
+    /**
+     * 成渝-获取标段已完成(已签章完成)的检测报告
+     */
+    @Resource
+    private TrialCyFinishTestReportService trialCyFinishTestReportService;
+    /**
+     * 成渝-试验检测树
+     */
+    @Resource
+    private TrialCyTestTypeService trialCyTestTypeService;
+    /**
+     * 成渝-已上传的外委检测报告/ 第三方检测报告/ 上传报告
+     */
+    @Resource
+    private TrialCyThirdReportService trialCyThirdReportService;
+
+    // HTTP客户端复用
+    private CloseableHttpClient httpClient;
+
+    @PostConstruct
+    public void init() {
+        this.httpClient = HttpClientBuilder.create().build();
+    }
+
+    //token缓存key
+    private static final String TOKEN_REDIS_KEY = "blade:cqcy:token";
+
+    //项目编码
+    private static final String PROJECT_CODE = "cqcyfx";
+
+    //项目id
+    private static Long PROJECT_ID = null;
+
+    //接口域名
+    private final String URL = "https://apicqcyfx.qdm123.com";
+
+    //合同编码缓存
+    private final Map<String, Long> contractCodeMap = new ConcurrentHashMap<>();
+
+    /**
+     * 登录 获取token
+     */
+
+    public String thirdLogin() {
+        //TODO 从后台管理的配置中心获取
+        String url = "/api/ThirdSystem/ThirdLogin";
+
+
+        //获取项目id
+        String sql = "select id from m_project_info where project_number = ? and is_deleted = 0 limit 1";
+        ProjectInfo projectInfo = jdbcTemplate.queryForObject(sql, ProjectInfo.class, PROJECT_CODE);
+        PROJECT_ID = projectInfo.getId();
+
+
+        String getAppKeySql = "select param_value from blade_param where param_key = 'cy.trial.appKey' and is_deleted = 0";
+        String getAppSecretSql = "select param_value from blade_param where param_key = 'cy.trial.appSecret' and is_deleted = 0";
+        //后管配置 appKey
+        String appKey = jdbcTemplate.queryForObject(getAppKeySql, String.class);
+        //后管配置 appSecret
+        String appSecret = jdbcTemplate.queryForObject(getAppSecretSql, String.class);
+        if (StringUtil.isBlank(appKey) || StringUtil.isBlank(appSecret)) {
+            log.error("---------#后管未配置成渝-试验-授权码或私钥");
+            return null;
+        }
+        //当前时间戳
+        Long time = System.currentTimeMillis();
+
+        //加密
+        String md5Hex = MD5Utils.md5Hex(time + appKey + appSecret, "UTF-8");
+
+        ThirdLogin thirdLogin = new ThirdLogin();
+        thirdLogin.setAppKey(appKey);
+        thirdLogin.setTimestamp(time);
+        thirdLogin.setSecret(md5Hex);
+
+
+        Result post = this.post(URL + url, thirdLogin);
+        if (post == null) {
+            log.error("---------#成渝第三方接口访问失败");
+            return null;
+        }
+        Integer state = post.getState();
+        //成功
+        if (state == 1) {
+            JSONObject data = (JSONObject) post.getData();
+            bladeRedis.setEx(TOKEN_REDIS_KEY, data.getString("token"), data.getLong("expireSecond") - 60);
+            return data.getString("token");
+        } else {
+            log.error("---------#成渝第三方接口访问失败:" + post.getMessage());
+            return null;
+        }
+    }
+
+
+    /**
+     * 获取合同段列表接口
+     */
+    @Scheduled(cron = "0 0 * * * ?")
+    public void getContractSectByProjCode()     {
+        if(!SystemUtils.isLinux()){
+            return;
+        }
+        //清空缓存
+        contractCodeMap.clear();
+
+        String url = "/api/CQHCZC/MesureSystem/GetContractSectByProjCode";
+
+        String token = bladeRedis.get(TOKEN_REDIS_KEY);
+        if (token == null) {
+            token = thirdLogin();
+        }
+        if (token == null) {
+            log.error("---------#成渝第三方接口访问失败:token为空");
+            return;
+        }
+        if (PROJECT_ID == null) {
+            log.error("---------#成渝第三方接口访问失败:项目不存在");
+            return;
+        }
+
+
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("token", token);
+        jsonObject.put("ProjectCode", PROJECT_CODE);
+
+        Result post = this.post(URL + url, jsonObject);
+
+        if (post == null) {
+            log.error("---------#成渝第三方接口访问失败");
+            return;
+        }
+        Integer state = post.getState();
+        //成功
+        if (state == 1) {
+            //合同段列表数据
+            JSONArray data = (JSONArray) post.getData();
+
+            List<String> codes = new ArrayList<>();
+
+            //返回的数据不能为空
+            if (CollectionUtil.isNotEmpty(data)) {
+                for (Object datum : data) {
+                    JSONObject jsonObject1 = (JSONObject) datum;
+                    String code = jsonObject1.getString("Code");
+                    //编码不能为空
+                    if (StringUtil.isNotBlank(code)) {
+                        codes.add(code);
+                    }
+                }
+            }
+            //封装需要查询的合同段
+            if (CollectionUtil.isNotEmpty(codes)) {
+                //使用参数化查询防止SQL注入
+                StringBuilder sqlBuilder = new StringBuilder("select * from m_contract_info where contract_number in (");
+                for (int i = 0; i < codes.size(); i++) {
+                    sqlBuilder.append(i == 0 ? "?" : ",?");
+                }
+                sqlBuilder.append(")");
+
+                //查询数据
+                List<ContractInfo> contractInfoList = jdbcTemplate.queryForList(sqlBuilder.toString(), ContractInfo.class, codes.toArray());
+                contractInfoList.forEach(f -> {
+                    contractCodeMap.put(f.getContractNumber(), f.getId());
+                });
+            }
+        } else {
+            log.error("---------#成渝第三方接口访问失败:" + post.getMessage());
+        }
+    }
+
+    /**
+     * 获取标段已完成(已签章完成)的检测报告
+     */
+    @Scheduled(cron = "0 0 * * * ?")
+    public void getFinishTestReport() {
+        if(!SystemUtils.isLinux()){
+            return;
+        }
+        String url = "/open/TestReport/GetFinishTestReport";
+
+        String token = bladeRedis.get(TOKEN_REDIS_KEY);
+        if (token == null) {
+            token = thirdLogin();
+        }
+        if (token == null) {
+            log.error("---------#成渝第三方接口访问失败:token为空");
+            return;
+        }
+        if (PROJECT_ID == null) {
+            log.error("---------#成渝第三方接口访问失败:项目不存在");
+            return;
+        }
+        //获取需要同步的合同段信息
+        Set<String> contractCodes = contractCodeMap.keySet();
+        if (CollectionUtil.isEmpty(contractCodes)) {
+            log.error("---------#成渝第三方接口访问失败:合同段编码无数据");
+            return;
+        }
+        for (String contractCode : contractCodes) {
+            GetFinishTestReport getFinishTestReport = new GetFinishTestReport(token, PROJECT_CODE, contractCode);
+
+            Integer pageIndex = 0;
+            Integer pageSize = 100;
+
+            do {
+                getFinishTestReport.setPageIndex(pageIndex);
+                getFinishTestReport.setPageSize(pageSize);
+
+                Result post = this.post(URL + url, getFinishTestReport);
+                if (post == null) {
+                    log.error("---------#成渝第三方接口访问失败:接口访问失败, contractCode: {}", contractCode);
+                    break; // 继续处理下一个合同段
+                }
+                Integer state = post.getState();
+                //成功
+                if (state == 1) {
+                    //检测报告列表
+                    JSONArray data = (JSONArray) post.getData();
+                    List<TrialCyFinishTestReport> list = data.toJavaList(TrialCyFinishTestReport.class);
+                    //退出循环
+                    if (CollectionUtil.isEmpty(list)) {
+                        break;
+                    }
+                    list.forEach(f -> f.setContractId(contractCodeMap.get(contractCode)));
+                    //处理数据
+                    trialCyFinishTestReportService.saveBatch(list);
+                    if (list.size() < pageSize) {
+                        break;
+                    }
+                    pageIndex++;
+                } else {
+                    log.error("---------#成渝第三方接口访问失败:{}, contractCode: {}", post.getMessage(), contractCode);
+                    break; // 继续处理下一个合同段
+                }
+            } while (true);
+        }
+    }
+
+    /**
+     * 获取已上传的外委检测报告/第三方检测报告/上传报告
+     */
+    @Scheduled(cron = "0 0 * * * ?")
+    public void getThirdReport() {
+        if(!SystemUtils.isLinux()){
+            return;
+        }
+        String url = "/open/ThirdReport/GetThirdReport";
+
+        String token = bladeRedis.get(TOKEN_REDIS_KEY);
+        if (token == null) {
+            token = thirdLogin();
+        }
+        if (token == null) {
+            log.error("---------#成渝第三方接口访问失败:token为空");
+            return;
+        }
+        if (PROJECT_ID == null) {
+            log.error("---------#成渝第三方接口访问失败:项目不存在");
+            return;
+        }
+        //获取需要同步的合同段信息
+        Set<String> contractCodes = contractCodeMap.keySet();
+        if (CollectionUtil.isEmpty(contractCodes)) {
+            log.error("---------#成渝第三方接口访问失败:合同段编码无数据");
+            return;
+        }
+        for (String contractCode : contractCodes) {
+            GetThirdReport getThirdReport = new GetThirdReport(token, PROJECT_CODE, contractCode);
+
+            Integer pageIndex = 0;
+            int pageSize = 100;
+
+            do {
+                getThirdReport.setPageIndex(pageIndex);
+                getThirdReport.setPageSize(pageSize);
+
+                Result post = this.post(URL + url, getThirdReport);
+                if (post == null) {
+                    log.error("---------#成渝第三方接口访问失败:接口访问失败, contractCode: {}", contractCode);
+                    break; // 继续处理下一个合同段
+                }
+                Integer state = post.getState();
+                //成功
+                if (state == 1) {
+                    //已上传的外委检测报告/第三方检测报告/上传报告
+                    JSONArray data = (JSONArray) post.getData();
+                    List<TrialCyThirdReport> list = data.toJavaList(TrialCyThirdReport.class);
+                    //退出循环
+                    if (CollectionUtil.isEmpty(list)) {
+                        break;
+                    }
+                    list.forEach(f -> f.setContractId(contractCodeMap.get(contractCode)));
+                    //处理数据
+                    trialCyThirdReportService.saveBatch(list);
+
+                    if (list.size() < pageSize) {
+                        break;
+                    }
+
+                    pageIndex++;
+                } else {
+                    log.error("---------#成渝第三方接口访问失败:{}, contractCode: {}", post.getMessage(), contractCode);
+                    break; // 继续处理下一个合同段
+                }
+            } while (true);
+        }
+    }
+
+    /**
+     * 获取检测项目树(包括自建试验、外委、第三方、上传报告)
+     */
+    @Scheduled(cron = "0 0 * * * ?")
+    public void getAllTestType() {
+        if(!SystemUtils.isLinux()){
+            return;
+        }
+
+        String url = "/open/ThirdReport/GetAllTestType";
+        String token = bladeRedis.get(TOKEN_REDIS_KEY);
+        if (token == null) {
+            token = thirdLogin();
+        }
+        if (token == null) {
+            log.error("---------#成渝第三方接口访问失败:token为空");
+            return;
+        }
+        if (PROJECT_ID == null) {
+            log.error("---------#成渝第三方接口访问失败:项目不存在");
+            return;
+        }
+
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("token", token);
+        jsonObject.put("ProjectCode", PROJECT_CODE);
+
+        Result post = this.post(URL + url, jsonObject);
+
+        if (post == null) {
+            log.error("---------#成渝第三方接口访问失败:接口访问失败");
+            return;
+        }
+
+
+        Integer state = post.getState();
+        //成功
+        if (state == 1) {
+            //合同段列表数据
+            JSONArray data = (JSONArray) post.getData();
+            List<TrialCyTestType> list = data.toJavaList(TrialCyTestType.class);
+            //退出循环
+            if (CollectionUtil.isEmpty(list)) {
+                return;
+            }
+            list.forEach(f -> f.setProjectId(PROJECT_ID));
+            //处理数据
+            trialCyTestTypeService.saveOrUpdateBatch(list);
+        } else {
+            log.error("---------#成渝第三方接口访问失败:" + post.getMessage());
+        }
+    }
+
+
+    /**
+     * 封装请求参数
+     */
+    public Result post(String url, Object object) {
+        HttpPost httpPost = new HttpPost(url);
+        httpPost.setHeader("Content-Type", "application/json");
+
+        // 对象转json
+        StringEntity json = new StringEntity(JSON.toJSONString(object), "utf-8");
+        httpPost.setEntity(json);
+
+        try {
+            HttpResponse httpResponse = httpClient.execute(httpPost);
+
+            // 检查响应状态码
+            int statusCode = httpResponse.getStatusLine().getStatusCode();
+            if (statusCode != 200) {
+                log.warn("HTTP request failed with status code: {}", statusCode);
+                // 可以根据具体业务需求调整错误处理方式
+                return null;
+            }
+
+            try (InputStream inputStream = httpResponse.getEntity().getContent();
+                 ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
+
+                byte[] buffer = new byte[1024];
+                int index = 0;
+                while ((index = inputStream.read(buffer)) != -1) {
+                    outputStream.write(buffer, 0, index);
+                }
+                // 响应参数 - 指定明确的字符编码
+                Result result = JSON.parseObject(outputStream.toString("utf-8"), Result.class);
+                return result;
+            }
+        } catch (IOException e) {
+            log.error("HTTP request failed: ", e);
+            // 返回错误结果或抛出异常,根据业务需求决定
+            return null;
+        }
+    }
+
+}

+ 57 - 0
blade-service/blade-business/src/main/java/org/springblade/business/scheduled/vo/GetFinishTestReport.java

@@ -0,0 +1,57 @@
+package org.springblade.business.scheduled.vo;
+
+import lombok.Data;
+
+/**
+ * 获取标段已完成(已签章完成)的检测报告的接口实体类
+ *
+ * @author LHB
+ */
+@Data
+public class GetFinishTestReport {
+    /**
+     * 登录接口返回的token
+     */
+    private String token;
+    /**
+     * 工程项目编码,数据约定具体见附件
+     */
+    private String ProjectCode;
+    /**
+     * 合同段/工区编码,数据约定具体见附件
+     */
+    private String ContractsectCode;
+    /**
+     * 报告起始时间
+     */
+    private String BeginTime;
+    /**
+     * 报告截止时间,注意:此字段实际执行时间包含传入时间当天,截止至当天24:00
+     */
+    private String EndTime;
+    /**
+     * 签章完成时间范围-起
+     */
+    private String FinishBeginTime;
+    /**
+     * 签章完成时间范围-止,截止至当天24:00
+     */
+    private String FinishEndTime;
+    /**
+     * 页码,默认为0
+     */
+    private Integer PageIndex;
+    /**
+     * 获取数据条数,不大于1000
+     */
+    private Integer PageSize;
+
+    public GetFinishTestReport(String token, String projectCode, String contractsectCode) {
+        this.token = token;
+        ProjectCode = projectCode;
+        ContractsectCode = contractsectCode;
+    }
+
+    public GetFinishTestReport() {
+    }
+}

+ 57 - 0
blade-service/blade-business/src/main/java/org/springblade/business/scheduled/vo/GetThirdReport.java

@@ -0,0 +1,57 @@
+package org.springblade.business.scheduled.vo;
+
+import lombok.Data;
+
+/**
+ * 获取已上传的外委检测报告/第三方检测报告/上传报告的请求参数对象
+ *
+ * @author LHB
+ */
+@Data
+public class GetThirdReport {
+    /**
+     * 登录接口返回的token
+     */
+    private String token;
+    /**
+     * 工程项目编码,数据约定具体见附件
+     */
+    private String ProjectCode;
+    /**
+     * 合同段/工区编码,数据约定具体见附件
+     */
+    private String ContractsectCode;
+    /**
+     * 0:外委检测
+     * 1:第三方检测
+     * 2:扫描上传报告
+     */
+    private Integer ThirdType;
+    /**
+     * 上传起始时间
+     * 注意:此字段实际执行时间为当天0点
+     */
+    private String BeginTime;
+    /**
+     * 上传截止时间,注意:此字段实际执行时间为当天24:00
+     */
+    private String EndTime;
+    /**
+     * 页码,默认为0
+     */
+    private Integer PageIndex;
+    /**
+     * 获取数据条数,不大于100
+     */
+    private Integer PageSize;
+
+
+    public GetThirdReport(String token, String projectCode, String contractsectCode) {
+        this.token = token;
+        ProjectCode = projectCode;
+        ContractsectCode = contractsectCode;
+    }
+
+    public GetThirdReport() {
+    }
+}

+ 25 - 0
blade-service/blade-business/src/main/java/org/springblade/business/scheduled/vo/Result.java

@@ -0,0 +1,25 @@
+package org.springblade.business.scheduled.vo;
+
+import lombok.Data;
+
+/**
+ * 成渝第三方接口响应结构
+ * @author LHB
+ */
+@Data
+public class Result {
+    /**
+     * 请求结果
+     * 0:请求失败
+     * 1:请求成功
+     */
+    private Integer state;
+    /**
+     * 操作提示信息;
+     */
+    private String message;
+    /**
+     * 接口返回的数据对象包体,由每个接口根据业务逻辑决定,可为JSON对象或JSON数组对象。
+     */
+    private Object data;
+}

+ 25 - 0
blade-service/blade-business/src/main/java/org/springblade/business/scheduled/vo/ResultPost.java

@@ -0,0 +1,25 @@
+package org.springblade.business.scheduled.vo;
+
+import lombok.Data;
+
+/**
+ * 成渝第三方接口响应结构
+ * @author LHB
+ */
+@Data
+public class ResultPost {
+    /**
+     * 请求结果
+     * 0:请求失败
+     * 1:请求成功
+     */
+    private Integer code;
+    /**
+     * 操作提示信息;
+     */
+    private String msg;
+    /**
+     * 接口返回的数据对象包体,由每个接口根据业务逻辑决定,可为JSON对象或JSON数组对象。
+     */
+    private Object result;
+}

+ 28 - 0
blade-service/blade-business/src/main/java/org/springblade/business/scheduled/vo/ThirdLogin.java

@@ -0,0 +1,28 @@
+package org.springblade.business.scheduled.vo;
+
+import lombok.Data;
+
+/**
+ * 成渝获取token接口参数
+ *
+ * @author LHB
+ */
+@Data
+public class ThirdLogin {
+    /**
+     * 授权第三方KEY(成渝那边提供)
+     */
+    private String appKey;
+    /**
+     * 空
+     */
+    private String account;
+    /**
+     * 时间截(1970-01-01至当前时间的总毫秒数)
+     */
+    private Long timestamp;
+    /**
+     * MD5(timestamp + appKey + account + appSecret)
+     */
+    private String secret;
+}

+ 13 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyAccessoriesService.java

@@ -0,0 +1,13 @@
+package org.springblade.business.service;
+
+import org.springblade.business.entity.TrialCyAccessories;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author LHB
+* @description 针对表【u_trial_cy_accessories(成渝-附件信息)】的数据库操作Service
+* @createDate 2025-08-04 14:39:16
+*/
+public interface TrialCyAccessoriesService extends IService<TrialCyAccessories> {
+
+}

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

@@ -0,0 +1,13 @@
+package org.springblade.business.service;
+
+import org.springblade.business.entity.TrialCyFinishTestReport;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author LHB
+* @description 针对表【u_trial_cy_finish_test_report(成渝-获取标段已完成(已签章完成)的检测报告)】的数据库操作Service
+* @createDate 2025-08-01 09:05:03
+*/
+public interface TrialCyFinishTestReportService extends IService<TrialCyFinishTestReport> {
+
+}

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

@@ -0,0 +1,22 @@
+package org.springblade.business.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springblade.business.entity.TrialCyFinishTestReport;
+import org.springblade.business.entity.TrialCyTestType;
+import org.springblade.business.entity.TrialCyThirdReport;
+import org.springblade.business.vo.TrialCyThirdReportQueryVo;
+
+import java.util.List;
+
+/**
+ * @author LHB
+ */
+public interface TrialCyService {
+    Boolean isCyAndTestModule(Long projectId, Long contractId);
+
+    List<TrialCyTestType> getTree(Long projectId, String parentId);
+
+    Page<TrialCyFinishTestReport> getTrialDetectionReport(TrialCyThirdReportQueryVo queryVo);
+
+    Page<TrialCyThirdReport> getThirdReport(TrialCyThirdReportQueryVo queryVo);
+}

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

@@ -0,0 +1,13 @@
+package org.springblade.business.service;
+
+import org.springblade.business.entity.TrialCyTestType;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author LHB
+* @description 针对表【u_trial_cy_test_type(成渝-试验检测树)】的数据库操作Service
+* @createDate 2025-08-01 09:05:07
+*/
+public interface TrialCyTestTypeService extends IService<TrialCyTestType> {
+
+}

+ 13 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyThirdReportService.java

@@ -0,0 +1,13 @@
+package org.springblade.business.service;
+
+import org.springblade.business.entity.TrialCyThirdReport;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author LHB
+* @description 针对表【u_trial_cy_third_report(成渝-已上传的外委检测报告/第三方检测报告/上传报告)】的数据库操作Service
+* @createDate 2025-08-01 09:05:10
+*/
+public interface TrialCyThirdReportService extends IService<TrialCyThirdReport> {
+
+}

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

@@ -392,7 +392,7 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
             if(type>=3 || type<=0){
             if(type>=3 || type<=0){
                 type = 1;
                 type = 1;
             }
             }
-            if (DistributedRedisLock.acquire("saveOrUpdateInformationQueryData:" + primaryKeyId + ":" + contractTree.getContractId() + ":" + classify + ":" + type,5)) {
+            if (DistributedRedisLock.acquire("saveOrUpdateInformationQueryData:" + primaryKeyId + ":" + contractTree.getContractId() + ":" + classify + ":" + type,20)) {
                 try {
                 try {
                     //判断当前填报节点下是否已经存在相应数据
                     //判断当前填报节点下是否已经存在相应数据
                     InformationQuery oldData = this.baseMapper.getInformationQueryByWbsId(contractTree.getPKeyId(), classify,contractTree.getContractId());
                     InformationQuery oldData = this.baseMapper.getInformationQueryByWbsId(contractTree.getPKeyId(), classify,contractTree.getContractId());
@@ -1071,7 +1071,7 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
         List<InformationQuery> informationQueries = this.getBaseMapper().selectBatchIds(ids);
         List<InformationQuery> informationQueries = this.getBaseMapper().selectBatchIds(ids);
         if (informationQueries != null && !informationQueries.isEmpty()) {
         if (informationQueries != null && !informationQueries.isEmpty()) {
             for (InformationQuery informationQuery : informationQueries) {
             for (InformationQuery informationQuery : informationQueries) {
-                if (DistributedRedisLock.acquire("informationQueryLock_" + informationQuery.getWbsId() + "_" + informationQuery.getContractId() + "_" + informationQuery.getClassify() + "_" + informationQuery.getType(),5)) {
+                if (DistributedRedisLock.acquire("informationQueryLock_" + informationQuery.getWbsId() + "_" + informationQuery.getContractId() + "_" + informationQuery.getClassify() + "_" + informationQuery.getType(),20)) {
                     try {
                     try {
                         List<InformationQuery> queryList = this.list(Wrappers.<InformationQuery>lambdaQuery().select(InformationQuery::getId, InformationQuery::getStatus)
                         List<InformationQuery> queryList = this.list(Wrappers.<InformationQuery>lambdaQuery().select(InformationQuery::getId, InformationQuery::getStatus)
                                 .eq(InformationQuery::getWbsId, informationQuery.getWbsId())
                                 .eq(InformationQuery::getWbsId, informationQuery.getWbsId())

+ 22 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyAccessoriesServiceImpl.java

@@ -0,0 +1,22 @@
+package org.springblade.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.business.entity.TrialCyAccessories;
+import org.springblade.business.service.TrialCyAccessoriesService;
+import org.springblade.business.mapper.TrialCyAccessoriesMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author LHB
+* @description 针对表【u_trial_cy_accessories(成渝-附件信息)】的数据库操作Service实现
+* @createDate 2025-08-04 14:39:16
+*/
+@Service
+public class TrialCyAccessoriesServiceImpl extends ServiceImpl<TrialCyAccessoriesMapper, TrialCyAccessories>
+    implements TrialCyAccessoriesService {
+
+}
+
+
+
+

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

@@ -0,0 +1,22 @@
+package org.springblade.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.business.entity.TrialCyFinishTestReport;
+import org.springblade.business.service.TrialCyFinishTestReportService;
+import org.springblade.business.mapper.TrialCyFinishTestReportMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author LHB
+* @description 针对表【u_trial_cy_finish_test_report(成渝-获取标段已完成(已签章完成)的检测报告)】的数据库操作Service实现
+* @createDate 2025-08-01 09:05:03
+*/
+@Service
+public class TrialCyFinishTestReportServiceImpl extends ServiceImpl<TrialCyFinishTestReportMapper, TrialCyFinishTestReport>
+    implements TrialCyFinishTestReportService {
+
+}
+
+
+
+

+ 90 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyServiceImpl.java

@@ -0,0 +1,90 @@
+package org.springblade.business.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springblade.business.entity.TrialCyFinishTestReport;
+import org.springblade.business.entity.TrialCyTestType;
+import org.springblade.business.entity.TrialCyThirdReport;
+import org.springblade.business.service.*;
+import org.springblade.business.vo.TrialCyThirdReportQueryVo;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.ProjectInfo;
+import org.springblade.manager.feign.ContractClient;
+import org.springblade.manager.feign.ProjectClient;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 成渝数据获取
+ *
+ * @author LHB
+ */
+@Service
+public class TrialCyServiceImpl implements TrialCyService {
+    @Resource
+    private TrialCyAccessoriesService trialCyAccessoriesService;
+    @Resource
+    private TrialCyFinishTestReportService trialCyFinishTestReportService;
+    @Resource
+    private TrialCyTestTypeService trialCyTestTypeService;
+    @Resource
+    private TrialCyThirdReportService trialCyThirdReportService;
+
+    @Resource
+    private ProjectClient projectClient;
+    @Resource
+    private ContractClient contractClient;
+
+    @Override
+    public Boolean isCyAndTestModule(Long projectId, Long contractId) {
+        ProjectInfo byId = projectClient.getById(String.valueOf(projectId));
+        if (!"cqcyfx".equals(byId.getProjectNumber())) {
+            return false;
+        }
+        ContractInfo contractById = contractClient.getContractById(contractId);
+        return contractById.getIsTestModule() == 0;
+    }
+
+    @Override
+    public List<TrialCyTestType> getTree(Long projectId, String parentId) {
+        List<TrialCyTestType> list = trialCyTestTypeService.list(Wrappers.<TrialCyTestType>lambdaQuery()
+                .eq(TrialCyTestType::getProjectId, projectId)
+                .eq(TrialCyTestType::getFatherID, parentId)
+                .orderByAsc(TrialCyTestType::getOrderIndex)
+        );
+        return list;
+    }
+
+    @Override
+    public Page<TrialCyFinishTestReport> getTrialDetectionReport(TrialCyThirdReportQueryVo queryVo) {
+        TrialCyTestType byId = trialCyTestTypeService.getById(queryVo.getNodeId());
+        if(byId == null){
+            return new Page<>();
+        }
+        Page<TrialCyFinishTestReport> page = trialCyFinishTestReportService.page(new Page<>(queryVo.getCurrent(), queryVo.getSize()), Wrappers.<TrialCyFinishTestReport>lambdaQuery()
+                .eq(TrialCyFinishTestReport::getContractId, queryVo.getContractId())
+                .ge(StringUtil.isNotBlank(queryVo.getStartTime()), TrialCyFinishTestReport::getReportDate, queryVo.getStartTime())
+                .le(StringUtil.isNotBlank(queryVo.getEndTime()), TrialCyFinishTestReport::getReportDate, queryVo.getEndTime())
+                .eq(TrialCyFinishTestReport::getProcessName, byId.getName()));
+        return page;
+    }
+
+    @Override
+    public Page<TrialCyThirdReport> getThirdReport(TrialCyThirdReportQueryVo queryVo) {
+        TrialCyTestType byId = trialCyTestTypeService.getById(queryVo.getNodeId());
+        if(byId == null){
+            return new Page<>();
+        }
+        Page<TrialCyThirdReport> page = trialCyThirdReportService.page(new Page<>(queryVo.getCurrent(), queryVo.getSize()), Wrappers.<TrialCyThirdReport>lambdaQuery()
+                .eq(TrialCyThirdReport::getContractId, queryVo.getContractId())
+                .eq(queryVo.getType() != null, TrialCyThirdReport::getThirdType, queryVo.getType())
+                .ge(StringUtil.isNotBlank(queryVo.getStartTime()), TrialCyThirdReport::getReportDate, queryVo.getStartTime())
+                .le(StringUtil.isNotBlank(queryVo.getEndTime()), TrialCyThirdReport::getReportDate, queryVo.getEndTime())
+                .eq(TrialCyThirdReport::getSampleName, byId.getName()));
+        return page;
+    }
+}

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

@@ -0,0 +1,22 @@
+package org.springblade.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.business.entity.TrialCyTestType;
+import org.springblade.business.service.TrialCyTestTypeService;
+import org.springblade.business.mapper.TrialCyTestTypeMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author LHB
+* @description 针对表【u_trial_cy_test_type(成渝-试验检测树)】的数据库操作Service实现
+* @createDate 2025-08-01 09:05:07
+*/
+@Service
+public class TrialCyTestTypeServiceImpl extends ServiceImpl<TrialCyTestTypeMapper, TrialCyTestType>
+    implements TrialCyTestTypeService {
+
+}
+
+
+
+

+ 22 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyThirdReportServiceImpl.java

@@ -0,0 +1,22 @@
+package org.springblade.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.business.entity.TrialCyThirdReport;
+import org.springblade.business.service.TrialCyThirdReportService;
+import org.springblade.business.mapper.TrialCyThirdReportMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author LHB
+* @description 针对表【u_trial_cy_third_report(成渝-已上传的外委检测报告/第三方检测报告/上传报告)】的数据库操作Service实现
+* @createDate 2025-08-01 09:05:10
+*/
+@Service
+public class TrialCyThirdReportServiceImpl extends ServiceImpl<TrialCyThirdReportMapper, TrialCyThirdReport>
+    implements TrialCyThirdReportService {
+
+}
+
+
+
+

+ 13 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/APIController.java

@@ -13,6 +13,7 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.service.IWbsTreeContractService;
 import org.springblade.manager.service.IWbsTreeContractService;
 import org.springblade.manager.vo.APIWbsContractNodeHzrcVo;
 import org.springblade.manager.vo.APIWbsContractNodeHzrcVo;
 import org.springblade.manager.vo.APIWbsContractNodeVo;
 import org.springblade.manager.vo.APIWbsContractNodeVo;
+import org.springblade.manager.vo.APIWbsContractSubdivisionVo;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
@@ -93,4 +94,16 @@ public class APIController extends BladeController {
         }
         }
         return R.fail(200, "未查询到信息");
         return R.fail(200, "未查询到信息");
     }
     }
+
+    /**
+     * 获取某一合同段的分部分项划分
+     */
+    @GetMapping("/getWbsContractSubdivision")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "获取某一合同段的分部分项划分", notes = "合同")
+    @ApiImplicitParam(name = "sectionId", value = "合同段Id", required = true)
+    public R<List<APIWbsContractSubdivisionVo>> getWbsContractSubdivision(String sectionId){
+        List<APIWbsContractSubdivisionVo> list = iWbsTreeContractService.getWbsContractSubdivision(sectionId);
+        return R.data(list);
+    }
 }
 }

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

@@ -1709,7 +1709,7 @@ public class ExcelTabController extends BladeController {
         wbsTreeContract.setTabGroupId(tabGroupId);
         wbsTreeContract.setTabGroupId(tabGroupId);
         wbsTreeContract.setCopyPkId(wbsInfo.getCopyPkId() == null ? pkeyId + "" : wbsInfo.getCopyPkId());
         wbsTreeContract.setCopyPkId(wbsInfo.getCopyPkId() == null ? pkeyId + "" : wbsInfo.getCopyPkId());
         String nodeName;
         String nodeName;
-        nodeName = wbsTreeContractList2.isEmpty() ? wbsInfo.getNodeName() :wbsTreeContractList2.get(wbsTreeContractList2.size() - 1).getNodeName();
+        nodeName = wbsTreeContractList2.get(wbsTreeContractList2.size() - 1).getNodeName();
         if (nodeName.indexOf("__") >= 0) {
         if (nodeName.indexOf("__") >= 0) {
             String[] oldName = nodeName.split("__");
             String[] oldName = nodeName.split("__");
             nodeName = oldName[0] + "__" + (Integer.parseInt(oldName[1]) + 1);
             nodeName = oldName[0] + "__" + (Integer.parseInt(oldName[1]) + 1);
@@ -2089,7 +2089,7 @@ public class ExcelTabController extends BladeController {
         }
         }
         executionTime.info("----数据合并前----");
         executionTime.info("----数据合并前----");
         List<String> errorPKeyIds = new ArrayList<>();
         List<String> errorPKeyIds = new ArrayList<>();
-        //单个pdf加载
+        //单个pdf加载F
         tableInfoList = (List<TableInfo>) result.getData();
         tableInfoList = (List<TableInfo>) result.getData();
         if (tableInfoList != null) {
         if (tableInfoList != null) {
             String finalSingnType = singnType;
             String finalSingnType = singnType;
@@ -4736,7 +4736,6 @@ public class ExcelTabController extends BladeController {
                 js2.put("orderList", array);
                 js2.put("orderList", array);
                 js.put("dataInfo", js2);
                 js.put("dataInfo", js2);
                 js.put("signType", "1");
                 js.put("signType", "1");
-                js.put("isNotDelOldHtml", 1);
                 /*if(infoB!=null && (infoB.getStatus()==1 || infoB.getStatus()==2)){
                 /*if(infoB!=null && (infoB.getStatus()==1 || infoB.getStatus()==2)){
                     js.put("signType", "1");
                     js.put("signType", "1");
                 }*/
                 }*/

+ 15 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -1016,4 +1016,19 @@ public class WbsTreePrivateController extends BladeController {
             .collect(Collectors.joining(","));
             .collect(Collectors.joining(","));
     }
     }
 
 
+    /**
+     * wbs私有树懒加载获取项目私有节点树形结构--(表单类型划分树)
+     */
+    @GetMapping("/tab-Type-lazy-tree-project")
+    @ApiOperationSupport(order = 40)
+    @ApiOperation(value = "项目级懒加载节点树形结构-表单类型划分树", notes = "传入项目Id和父Id")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "parentId", value = "父级id", required = true),
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+            @ApiImplicitParam(name = "titleName", value = "搜索关键字", required = true)
+    })
+    public R<IPage<TreeNodeVOByTabType>> tabTypeLazyTreeByProject(Long parentId, String projectId, String titleName, Query query) {
+        IPage<TreeNodeVOByTabType> page = wbsTreePrivateService.tabTypeLazyTreeByProject(Condition.getPage(query), parentId, projectId, titleName);
+        return R.data(page);
+    }
 }
 }

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

@@ -343,7 +343,7 @@
         and a.project_id = #{projectId}
         and a.project_id = #{projectId}
         <choose>
         <choose>
             <when test="extType != null and extType == 1">
             <when test="extType != null and extType == 1">
-                and (b.node_id in( select id from  m_archive_tree_contract where FIND_IN_SET(#{id},ancestors) or a.id = #{id}) OR
+                and ( 	b.node_id in( select id from  m_archive_tree_contract where FIND_IN_SET(#{id},ancestors) or a.id = #{id}) OR
                 b.node_ext_id in(  select id from  m_archive_tree_contract where FIND_IN_SET(#{id},ancestors) or a.id = #{id}))
                 b.node_ext_id in(  select id from  m_archive_tree_contract where FIND_IN_SET(#{id},ancestors) or a.id = #{id}))
             </when>
             </when>
             <otherwise>
             <otherwise>

+ 16 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.java

@@ -7,6 +7,7 @@ import org.springblade.manager.entity.*;
 import org.springblade.manager.injector.EasyBaseMapper;
 import org.springblade.manager.injector.EasyBaseMapper;
 import org.springblade.manager.vo.*;
 import org.springblade.manager.vo.*;
 
 
+import java.util.HashSet;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.Set;
 import java.util.Set;
@@ -159,4 +160,19 @@ public interface WbsTreeContractMapper extends EasyBaseMapper<WbsTreeContract> {
     List<WbsTreeContract> selectListForcheckAllNodeDate(@Param("projectId") Long projectId, @Param("contractId") Long contractId);
     List<WbsTreeContract> selectListForcheckAllNodeDate(@Param("projectId") Long projectId, @Param("contractId") Long contractId);
 
 
     Integer findIsExistTreeNode(List<String> ids);
     Integer findIsExistTreeNode(List<String> ids);
+
+    /**
+     * 获取只当合同段下的分部分项划分节点
+     * @param contractId
+     * @return
+     */
+    List<APIWbsContractSubdivisionVo> getWbsContractSubdivision(@Param("contractId") String contractId);
+
+    /**
+     * 获取只当合同段下的分部分项划分节点的祖级节点
+     * @param ids
+     * @return
+     */
+    List<APIWbsContractSubdivisionVo> getWbsContractSubdivisionParentNode(@Param("contractId") String contractId,
+                                                                          @Param("ids") Set<Long> ids);
 }
 }

+ 48 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml

@@ -993,5 +993,53 @@
         and is_deleted=0 and is_buss_show !=2 and init_table_name is not null and html_url is not null and LENGTH(init_table_name) > 10 and LENGTH(html_url) > 10
         and is_deleted=0 and is_buss_show !=2 and init_table_name is not null and html_url is not null and LENGTH(init_table_name) > 10 and LENGTH(html_url) > 10
         and p_id is not null and type=2
         and p_id is not null and type=2
     </select>
     </select>
+    <select id="getWbsContractSubdivision" resultType="org.springblade.manager.vo.APIWbsContractSubdivisionVo">
+        SELECT
+            p_key_id id,
+            p_key_id code,
+            node_name name,
+            null stake,
+            p_id pid,
+            CASE
+                WHEN node_type = 18 THEN 1
+                WHEN node_type = 2 THEN 2
+                ELSE 3
+                END nodeType,
+            null levelCode,
+            null partitionCatagID,
+            null partitionCatagName
+        FROM
+            `m_wbs_tree_contract`
+        WHERE
+            node_type IN ( 2, 4, 18 )
+          AND is_deleted = 0
+          AND status = 1
+          AND contract_id = #{contractId}
+    </select>
+    <select id="getWbsContractSubdivisionParentNode"
+            resultType="org.springblade.manager.vo.APIWbsContractSubdivisionVo">
+        SELECT p_key_id       id,
+               p_key_id       code,
+               node_name      name,
+               null           stake,
+               p_id           pid,
+               CASE
+                   WHEN node_type = 18 THEN 1
+                   WHEN node_type = 2 THEN 2
+                   ELSE 3
+                   END        nodeType,
+               null           levelCode,
+               null           partitionCatagID,
+               null           partitionCatagName
+        FROM `m_wbs_tree_contract`
+        WHERE is_deleted = 0
+          AND status = 1
+          AND contract_id = #{contractId}
+          AND p_key_id in
+          <foreach item="id" collection="ids" separator="," close=")" open="(" index="index">
+              #{id}
+          </foreach>
+
+    </select>
 
 
 </mapper>
 </mapper>

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

@@ -43,6 +43,8 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
 
 
     List<TreeNodeVOByTabType> tabTypeLazyTree(IPage page, Long parentId, String projectId, String titleName);
     List<TreeNodeVOByTabType> tabTypeLazyTree(IPage page, Long parentId, String projectId, String titleName);
 
 
+    List<TreeNodeVOByTabType> tabTypeLazyTreeByProject(IPage page, Long parentId, String projectId, String titleName);
+
     List<TreeNodeVOByTabType> tabTypeLazyTreeAll(Long parentId, String titleName);
     List<TreeNodeVOByTabType> tabTypeLazyTreeAll(Long parentId, String titleName);
 
 
     int updateByPKeyId(@Param("pKeyId") Long pKeyId, @Param("wbsTP") WbsTreePrivate wbsTP);
     int updateByPKeyId(@Param("pKeyId") Long pKeyId, @Param("wbsTP") WbsTreePrivate wbsTP);

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

@@ -97,12 +97,17 @@
         <result column="title" property="title"/>
         <result column="title" property="title"/>
         <result column="has_children" property="hasChildren"/>
         <result column="has_children" property="hasChildren"/>
         <result column="primaryKeyId" property="primaryKeyId"/>
         <result column="primaryKeyId" property="primaryKeyId"/>
+        <result column="pkeyId" property="pkeyId"/>
         <result column="tabOwner" property="tabOwner"/>
         <result column="tabOwner" property="tabOwner"/>
         <result column="tabType" property="tabType"/>
         <result column="tabType" property="tabType"/>
         <result column="elementTotal" property="elementTotal"/>
         <result column="elementTotal" property="elementTotal"/>
         <result column="fillRate" property="fillRate"/>
         <result column="fillRate" property="fillRate"/>
         <result column="initTableId" property="initTableId"/>
         <result column="initTableId" property="initTableId"/>
+        <result column="initTableName" property="initTableName"/>
         <result column="excelIds" property="excelIds"/>
         <result column="excelIds" property="excelIds"/>
+        <result column="excelId" property="excelId"/>
+        <result column="table_type" property="tableType"/>
+        <result column="table_owner" property="tableOwner"/>
     </resultMap>
     </resultMap>
 
 
 
 
@@ -875,7 +880,7 @@
         delete
         delete
         from m_wbs_tree_private
         from m_wbs_tree_private
         WHERE p_key_id = #{pKeyId}
         WHERE p_key_id = #{pKeyId}
-          and project_id = #{projectId}AND type = 10
+          and project_id = #{projectId} AND type in(2, 10)
     </delete>
     </delete>
 
 
     <delete id="delTableById">
     <delete id="delTableById">
@@ -958,4 +963,53 @@
         from u_contract_log ucl
         from u_contract_log ucl
         where contract_id = #{contractId} and is_deleted = 0 and pdf_url IS NOT NULL order by record_time
         where contract_id = #{contractId} and is_deleted = 0 and pdf_url IS NOT NULL order by record_time
     </select>
     </select>
+
+
+    <!-- 项目级 表单类型分类 wbs树 -->
+    <select id="tabTypeLazyTreeByProject" resultMap="treeNodeResultMapTabType">
+        SELECT a.exceIds AS excelIds,initTableName,a.exceIds as excelId,table_type, table_owner,
+        p_key_id as id,p_key_id as primaryKeyId,title,parent_id,fill_rate as fillRate,initTableId,p_key_id as pkeyId,
+        (SELECT dict_value from blade_dict where code='table_type' and dict_key not in(-1,0) and dict_key=table_type )
+        as tabType,
+        (SELECT count(1) FROM m_wbs_form_element WHERE f_id = initTableId and is_deleted=0) AS "elementTotal",
+        (SELECT dict_value from blade_dict where code='owner_type' and dict_key not in(-1,0) and dict_key=table_owner )
+        as tabOwner,
+        /*排序*/
+        -- (SELECT sort FROM m_wbs_node_sort c WHERE a.p_key_id = c.p_key_id) AS sort,
+        (
+        SELECT
+        CASE WHEN count(1) > 0 THEN 1 ELSE 0 END
+        FROM
+        (
+        SELECT '12345678910' as p_key_id , '表单类型' as node_name, 0 as parent_id
+        union all
+        SELECT dict_key as p_key_id ,dict_value as node_name,'12345678910' as parent_id from blade_dict where
+        code='table_type' and dict_key not in(-1,0)
+        union all
+        SELECT p_key_id,node_name,table_type as parent_id from m_wbs_tree_private WHERE project_id=#{projectId} and
+        is_deleted=0 and type in(2,10) and table_type is not NULL GROUP BY node_name
+        ) b
+        WHERE
+        b.parent_id = a.p_key_id
+        ) AS "has_children"
+        from (
+        SELECT '12345678910' as p_key_id , '表单类型' as title, 0 as parent_id,0 as table_type,0 as fill_rate,0 as
+        table_owner,0 as initTableId,0 as exceIds,0 as initTableName
+        union all
+        SELECT dict_key as p_key_id ,dict_value as title,'12345678910' as parent_id,0 as table_type,0 as fill_rate,0 as
+        table_owner,0 as initTableId,0 as exceIsd,0 as initTableName from blade_dict where code='table_type' and dict_key not in(-1,0)
+        union all
+        SELECT p_key_id,node_name as title,table_type as parent_id,table_type,fill_rate,table_owner,init_table_id as initTableId,excel_id AS excelIds,init_table_name as  initTableName
+        from m_wbs_tree_private WHERE project_id=#{projectId} and type in(2,10) and
+        is_deleted=0 and table_type is not NULL GROUP BY node_name
+        ) a where 1=1
+        <if test="parentId != null and parentId != ''">
+            and a.parent_id = #{parentId}
+        </if>
+        <if test="titleName != null and titleName != ''">
+            and a.title like concat('%',#{titleName},'%') and LENGTH(a.p_key_id)>11
+        </if>
+        /*排序*/
+        -- order by sort,title
+    </select>
 </mapper>
 </mapper>

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java

@@ -94,4 +94,6 @@ public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
     Integer findIsExistTreeNode(List<String> ids);
     Integer findIsExistTreeNode(List<String> ids);
 
 
     List<WbsTreeContract> queryListByPIds(List<Long> pIds);
     List<WbsTreeContract> queryListByPIds(List<Long> pIds);
+
+    List<APIWbsContractSubdivisionVo> getWbsContractSubdivision(String contractId);
 }
 }

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

@@ -31,6 +31,8 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
     // 项目级 表单类型划分
     // 项目级 表单类型划分
     IPage<TreeNodeVOByTabType> tabTypeLazyTree(IPage<TreeNodeVOByTabType> page, Long parentId, String projectId, String titleName);
     IPage<TreeNodeVOByTabType> tabTypeLazyTree(IPage<TreeNodeVOByTabType> page, Long parentId, String projectId, String titleName);
 
 
+    IPage<TreeNodeVOByTabType> tabTypeLazyTreeByProject(IPage<TreeNodeVOByTabType> page, Long parentId, String projectId, String titleName);
+
     // 元素
     // 元素
     IPage<TreeNodeVOByTabType> tabTypeLazyTreeAll(IPage<TreeNodeVOByTabType> page, Long parentId, String titleName,Boolean hasPartFormula);
     IPage<TreeNodeVOByTabType> tabTypeLazyTreeAll(IPage<TreeNodeVOByTabType> page, Long parentId, String titleName,Boolean hasPartFormula);
 
 

+ 8 - 14
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -1241,9 +1241,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     String delSql = "delete from " + tabName + " where p_key_id=" + tableInfo.getPkeyId();
                     String delSql = "delete from " + tabName + " where p_key_id=" + tableInfo.getPkeyId();
                     String sqlInfo = "";
                     String sqlInfo = "";
                     LinkedHashMap<String, String> dataMap2 = tableInfo.getDataMap();
                     LinkedHashMap<String, String> dataMap2 = tableInfo.getDataMap();
-                    if (!updateFieldLength(tabName, dataMap2)) {
-                        throw new ServiceException("字段长度超出限制, 系统无法进行自增,请前往后台管理系统手动设置");
-                    }
+                    updateFieldLength(tabName, dataMap2);
                     /*检查发现有p_key_id缺失的情况,导致表单数据丢失,所以强制覆盖*/
                     /*检查发现有p_key_id缺失的情况,导致表单数据丢失,所以强制覆盖*/
                     dataMap2.put("p_key_id", tableInfo.getPkeyId());
                     dataMap2.put("p_key_id", tableInfo.getPkeyId());
                     //统计保存的字段
                     //统计保存的字段
@@ -1354,17 +1352,14 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
        // return R.success(fileName1);
        // return R.success(fileName1);
     }
     }
 
 
-    public boolean updateFieldLength(String tableName, Map<String, String> fieldNameAndLengthMap) {
+    public void updateFieldLength(String tableName, Map<String, String> fieldNameAndLengthMap) {
         if (fieldNameAndLengthMap == null || fieldNameAndLengthMap.isEmpty()) {
         if (fieldNameAndLengthMap == null || fieldNameAndLengthMap.isEmpty()) {
-            return true;
+            return;
         }
         }
-        fieldNameAndLengthMap.remove("id");
-        fieldNameAndLengthMap.remove("p_key_id");
-        fieldNameAndLengthMap.remove("group_id");
-        if (fieldNameAndLengthMap.isEmpty()) {
-            return true;
+        String fields = fieldNameAndLengthMap.keySet().stream().filter(key -> !key.equals("id") && !key.equals("p_key_id") && !key.equals("group_id")).map(key -> "'" + key + "'").collect(Collectors.joining(","));
+        if (fields.isEmpty()) {
+            return;
         }
         }
-        String fields = fieldNameAndLengthMap.keySet().stream().map(key -> "'" + key + "'").collect(Collectors.joining(","));
         List<Map<String, Object>> fieldMap = jdbcTemplate.queryForList("select distinct COLUMN_NAME as fieldName, CHARACTER_MAXIMUM_LENGTH as fieldLength from information_schema.COLUMNS where  TABLE_NAME = '" + tableName +
         List<Map<String, Object>> fieldMap = jdbcTemplate.queryForList("select distinct COLUMN_NAME as fieldName, CHARACTER_MAXIMUM_LENGTH as fieldLength from information_schema.COLUMNS where  TABLE_NAME = '" + tableName +
                 "' and COLUMN_NAME in (" + fields + ")");
                 "' and COLUMN_NAME in (" + fields + ")");
         Map<String, Integer> map = fieldMap.stream().collect(toMap(k -> k.get("fieldName") + "", v -> {
         Map<String, Integer> map = fieldMap.stream().collect(toMap(k -> k.get("fieldName") + "", v -> {
@@ -1405,10 +1400,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             } catch (Exception e) {
             } catch (Exception e) {
                 transactionManager1.rollback(transactionStatus);
                 transactionManager1.rollback(transactionStatus);
                 log.error("更新字段长度失败, error: " + e.getMessage());
                 log.error("更新字段长度失败, error: " + e.getMessage());
-                return false;
+                throw new ServiceException("字段长度超出限制, 系统无法进行扩容,请尝试缩小字段长度或者联系系统管理员处理");
             }
             }
         }
         }
-        return true;
     }
     }
 
 
     public String reason(String log) {
     public String reason(String log) {
@@ -2387,7 +2381,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                     anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
                                     anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
                                     // 插入图片
                                     // 插入图片
                                     Picture pict = drawing.createPicture(anchor, pictureIdx); // 调整图片占单元格百分比的大小,1.0就是100%
                                     Picture pict = drawing.createPicture(anchor, pictureIdx); // 调整图片占单元格百分比的大小,1.0就是100%
-                                    pict.resize(1, 1);
+                                    pict.resize(0.9, 0.9);
                                     FileUtils.imageOrientation(sheet, anchor, new DataVO(x1 - 1, y1 - 1));
                                     FileUtils.imageOrientation(sheet, anchor, new DataVO(x1 - 1, y1 - 1));
                                 }
                                 }
 
 

+ 13 - 35
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -2501,7 +2501,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         String sql = "Select * from s_contract_meter_period where contract_id=" + contractId + " and is_deleted=0" + " order by start_date";
         String sql = "Select * from s_contract_meter_period where contract_id=" + contractId + " and is_deleted=0" + " order by start_date";
         List<ContractMeterPeriod> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ContractMeterPeriod.class));
         List<ContractMeterPeriod> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ContractMeterPeriod.class));
         //获取所有excel报表源数据
         //获取所有excel报表源数据
-        String sqlForExcel = "SELECT p.p_key_id,e.name,e.id,p.html_url,e.file_url,p.init_table_name as tabName FROM m_wbs_tree_private as p LEFT JOIN m_excel_tab as e on p.excel_id=e.id where p.wbs_type=3 AND p.is_deleted=0 AND p.type=2" + " and p.project_id=" + projectId;
+        String sqlForExcel = "SELECT p.p_key_id,e.name,e.id,p.html_url,e.file_url FROM m_wbs_tree_private as p LEFT JOIN m_excel_tab as e on p.excel_id=e.id where p.wbs_type=3 AND p.is_deleted=0 AND p.type=2" + " and p.project_id=" + projectId;
         List<ExcelTabVo1> excelTabs = jdbcTemplate.query(sqlForExcel, new BeanPropertyRowMapper<>(ExcelTabVo1.class));
         List<ExcelTabVo1> excelTabs = jdbcTemplate.query(sqlForExcel, new BeanPropertyRowMapper<>(ExcelTabVo1.class));
         ArrayList<ReportResult> reportResults = new ArrayList<>();
         ArrayList<ReportResult> reportResults = new ArrayList<>();
         //中期支付报表封面
         //中期支付报表封面
@@ -2547,25 +2547,25 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         String htmlUrl6 = excel6.get().getHtmlUrl();
         String htmlUrl6 = excel6.get().getHtmlUrl();
         Long pKeyId6 = excel6.get().getPKeyId();
         Long pKeyId6 = excel6.get().getPKeyId();
         // 获取中期支付报表封面的pdfurl
         // 获取中期支付报表封面的pdfurl
-        ReportResult CoverOfMidtermPaymentReportPDF = getCoverOfMidtermPaymentReportPDF(url, contractId, periodId, htmlUrl, projectName, list, pKeyId, excel.get().getTabName());
+        ReportResult CoverOfMidtermPaymentReportPDF = getCoverOfMidtermPaymentReportPDF(url, contractId, periodId, htmlUrl, projectName, list, pKeyId);
 
 
         //获取中间支付审核表的pdfurl
         //获取中间支付审核表的pdfurl
-        ReportResult intermediatePaymentPDF = getIntermediatePaymentPDF(url1, contractId, periodId, list, redisId, htmlUrl1, blReserveFundsRatioNew, projectName, changeMoneyNew, pKeyId1, excel1.get().getTabName());
+        ReportResult intermediatePaymentPDF = getIntermediatePaymentPDF(url1, contractId, periodId, list, redisId, htmlUrl1, blReserveFundsRatioNew, projectName, changeMoneyNew, pKeyId1);
 
 
         //获取补助款申请支付审核表pdfUrl
         //获取补助款申请支付审核表pdfUrl
-        ReportResult subsidyApplicationPaymentReviewPDF = getSubsidyApplicationPaymentReviewPDF(url2, contractId, periodId, list, htmlUrl2, blReserveFundsRatioNew, projectName, projectId, reportId, pKeyId2,excel2.get().getTabName());
+        ReportResult subsidyApplicationPaymentReviewPDF = getSubsidyApplicationPaymentReviewPDF(url2, contractId, periodId, list, htmlUrl2, blReserveFundsRatioNew, projectName, projectId, reportId, pKeyId2);
 
 
         //获取中间计量支付证书pdfUrl
         //获取中间计量支付证书pdfUrl
-        ReportResult intermediateMeasurementPaymentCertificatePDF = getIntermediateMeasurementPaymentCertificatePDF(url3, contractId, periodId, list, htmlUrl3, blReserveFundsRatioNew, projectName, pKeyId3,excel3.get().getTabName());
+        ReportResult intermediateMeasurementPaymentCertificatePDF = getIntermediateMeasurementPaymentCertificatePDF(url3, contractId, periodId, list, htmlUrl3, blReserveFundsRatioNew, projectName, pKeyId3);
 
 
         //获取清单支付报表PDF
         //获取清单支付报表PDF
-        ReportResult inventoryPayReportPDF = getInventoryPayReportPDF(url6, contractId, periodId, projectId, list, redisId, htmlUrl6, pKeyId6, excel6.get().getTabName());
+        ReportResult inventoryPayReportPDF = getInventoryPayReportPDF(url6, contractId, periodId, projectId, list, redisId, htmlUrl6, pKeyId6);
 
 
         //获取工程支付月报pdfUrl
         //获取工程支付月报pdfUrl
-        ReportResult monthlyReportPDF = getMonthlyReportPDF(url5, reportId, contractId, periodId, projectId, list, redisId, htmlUrl5, pKeyId5, excel5.get().getTabName());
+        ReportResult monthlyReportPDF = getMonthlyReportPDF(url5, reportId, contractId, periodId, projectId, list, redisId, htmlUrl5, pKeyId5);
 
 
         //获取中间支付申请表pdfUrl
         //获取中间支付申请表pdfUrl
-        ReportResult intermediateApplyPDF = getIntermediateApplyPDF(url4, periodId, projectId, htmlUrl4, projectName, contractId, pKeyId4, excel4.get().getTabName());
+        ReportResult intermediateApplyPDF = getIntermediateApplyPDF(url4, periodId, projectId, htmlUrl4, projectName, contractId, pKeyId4);
 
 
         reportResults.add(CoverOfMidtermPaymentReportPDF);
         reportResults.add(CoverOfMidtermPaymentReportPDF);
         reportResults.add(intermediatePaymentPDF);
         reportResults.add(intermediatePaymentPDF);
@@ -2583,7 +2583,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     /**
     /**
      * 中期支付报表封面
      * 中期支付报表封面
      */
      */
-    private ReportResult getCoverOfMidtermPaymentReportPDF(String url, Long contractId, Long periodId, String htmlUrl, String projectName, List<ContractMeterPeriod> list, Long pkeyId, String tabName) {
+    private ReportResult getCoverOfMidtermPaymentReportPDF(String url, Long contractId, Long periodId, String htmlUrl, String projectName, List<ContractMeterPeriod> list, Long pkeyId) {
 
 
         //获取本期计量期
         //获取本期计量期
         String sqlForMeterPeriodById = "SELECT id,period_number,start_date,end_date FROM s_contract_meter_period WHERE id=" + periodId + " and is_deleted = 0 ";
         String sqlForMeterPeriodById = "SELECT id,period_number,start_date,end_date FROM s_contract_meter_period WHERE id=" + periodId + " and is_deleted = 0 ";
@@ -2634,7 +2634,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 Cell c10 = getCellByAddress(sheet, "C10");
                 Cell c10 = getCellByAddress(sheet, "C10");
                 c10.setCellValue(contractInfo.getSupervisionUnitName());
                 c10.setCellValue(contractInfo.getSupervisionUnitName());
             }
             }
-            dianqian(htmlUrl, sheet, workbook, tabName);
+            dianqian(htmlUrl, sheet, workbook);
             if (!periodId.equals(1867838908899852290L)) {
             if (!periodId.equals(1867838908899852290L)) {
                 dianqianTime(htmlUrl, sheet, workbook, pkeyId, periodId, contractId);
                 dianqianTime(htmlUrl, sheet, workbook, pkeyId, periodId, contractId);
             }
             }
@@ -2670,7 +2670,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     }
     }
 
 
     /*设置电签ID*/
     /*设置电签ID*/
-    public void dianqian(String htmlUrl, Sheet sheet, Workbook workbook, String tabName) {
+    public void dianqian(String htmlUrl, Sheet sheet, Workbook workbook) {
         try {
         try {
             InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(htmlUrl);
             InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(htmlUrl);
             String htmlString = IoUtil.readToString(inputStreamByUrl);
             String htmlString = IoUtil.readToString(inputStreamByUrl);
@@ -2678,30 +2678,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             Element table = doc.select("table").first();
             Element table = doc.select("table").first();
             // 组装电签设置
             // 组装电签设置
             Elements dqids = table.getElementsByAttribute("dqid");
             Elements dqids = table.getElementsByAttribute("dqid");
-            // 电签组装2
-            String dqSql = "select e_key,GROUP_CONCAT(DISTINCT concat('*✹',id)) ids from u_sign_key_role_info where tab_en_name='" + tabName + "' GROUP BY e_key";
-            List<Map<String, Object>> mapList = jdbcTemplate.queryForList(dqSql);
-            if(mapList!=null && mapList.size()>0){
-                for(Map<String, Object> map : mapList) {
-                    Elements elementsBy = table.getElementsByAttributeValueStarting("keyname", map.get("e_key") + "_");
-                    if(elementsBy!=null && elementsBy.size()>0){
-                        for(Element element : elementsBy){
-                            String dqIds = (String) map.get("ids");
-                            dqIds = dqIds.replace(",","");
-                            dqIds = dqIds.substring(1);
-                            element.attr("sign_type", dqIds);
-                            dqids.add(element);
-                        }
-                    }
-                }
-            }
             for (Element element : dqids) {
             for (Element element : dqids) {
-                String dqid="";
-                if(element.hasAttr("sign_type")){
-                    dqid = element.attr("sign_type");
-                }else{
-                    dqid = element.attr("dqid");
-                }
+                String dqid = element.attr("dqid");
 
 
                 int x1 = 0;
                 int x1 = 0;
                 int y1 = 0;
                 int y1 = 0;
@@ -3508,7 +3486,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             //顶部项目名称
             //顶部项目名称
             Cell a1 = getCellByAddress(sheet, "A1");
             Cell a1 = getCellByAddress(sheet, "A1");
             a1.setCellValue(projectName);
             a1.setCellValue(projectName);
-            dianqian(htmlUrl, sheet, workbook, tabName);
+            dianqian(htmlUrl, sheet, workbook);
             if (!periodId.equals(1867838908899852290L)) {
             if (!periodId.equals(1867838908899852290L)) {
                 dianqianTime(htmlUrl, sheet, workbook, pkeyId, periodId, contractId);
                 dianqianTime(htmlUrl, sheet, workbook, pkeyId, periodId, contractId);
             }
             }

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

@@ -323,22 +323,6 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
         //修改元素基础信息
         //修改元素基础信息
         wbsFormElementList.forEach(obj -> obj.setStatus(1));
         wbsFormElementList.forEach(obj -> obj.setStatus(1));
         boolean b = this.updateBatchById(wbsFormElementList);
         boolean b = this.updateBatchById(wbsFormElementList);
-
-
-        //当前设置的字段总长度
-        Integer nowTotalLength = 0;
-        for (WbsFormElement wbsFormElement : wbsFormElementList) {
-            // + 10 预留字段长度,用来保存在excel中的位置信息,比如:xx_^_12_12, 不适合一个字段存储多个位置
-            nowTotalLength += wbsFormElement.getELength() + 10;
-        }
-        //当前表总字段长度
-        int sumLength = baseMapper.selectSumColumnLength(jdbcTemplate.queryForObject("SELECT DATABASE()", String.class), initTableName);
-        if (nowTotalLength > MYSQL_MAX_COLUMN_LENGTH) {
-            //修改元素字段长度
-            throw new ServiceException("无法添加字段,可用长度:" + (MYSQL_MAX_COLUMN_LENGTH - sumLength));
-        }
-
-
         //修改实体表信息
         //修改实体表信息
         if (b) {
         if (b) {
             String fId = "";
             String fId = "";
@@ -377,21 +361,18 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
 //                } else if (eLength >= 0 && eLength <= 65) {
 //                } else if (eLength >= 0 && eLength <= 65) {
 //                    eLength = DEFAULT_ELEMENT_LENGTH_NUMBER;
 //                    eLength = DEFAULT_ELEMENT_LENGTH_NUMBER;
 //                }
 //                }
-
-                //判断是否存在该Key字段
-                int row1 = wbsTreeMapper.isThereAField(initTableName, eKey);
-                if (row1 > 0) {
-                    try {
-                        // + 10 预留字段长度,用来保存在excel中的位置信息,比如:xx_^_12_12, 不适合一个字段存储多个位置
-                        baseMapper.updateFiledType(initTableName, eKey, "varchar", eLength + 10);
-                    } catch (Exception e) {
-                        // 数据库字段长度大于修改长度,则忽略
-                        if (e.getMessage().contains("Data truncated for column '" + eKey + "' at row 1")) {
-                            continue;
+                Integer length = eLengthMap.get(wbsFormElement.getId());
+                if (length == null || !length.equals(eLength)) {
+                    //判断是否存在该Key字段
+                    int row1 = wbsTreeMapper.isThereAField(initTableName, eKey);
+                    if (row1 > 0) {
+                        try {
+                            baseMapper.updateFiledType(initTableName, eKey, "varchar", eLength);
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                            this.updateBatchById(beforeUpdateWbsFormElements);
+                            return R.fail(eName + "长度范围超出总最大限制,请尝试缩小当前字段与其他字段长度或者联系系统管理员处理");
                         }
                         }
-                        e.printStackTrace();
-                        this.updateBatchById(beforeUpdateWbsFormElements);
-                        throw new RuntimeException("字段长度范围超出总最大限制,请尝试缩小当前字段长度或其他字段长度");
                     }
                     }
                 }
                 }
             }
             }

文件差異過大導致無法顯示
+ 212 - 217
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java


+ 8 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -295,6 +295,14 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return page.setRecords(baseMapper.tabTypeLazyTree(page, parentId, projectId, titleName));
         return page.setRecords(baseMapper.tabTypeLazyTree(page, parentId, projectId, titleName));
     }
     }
 
 
+    @Override
+    public IPage<TreeNodeVOByTabType> tabTypeLazyTreeByProject(IPage<TreeNodeVOByTabType> page, Long parentId, String projectId, String titleName) {
+        if ((parentId + "").equals("12345678910")) {
+            page.setSize(100);
+        }
+        return page.setRecords(baseMapper.tabTypeLazyTreeByProject(page, parentId, projectId, titleName));
+    }
+
     @Override
     @Override
     public IPage<TreeNodeVOByTabType> tabTypeLazyTreeAll(IPage<TreeNodeVOByTabType> page, Long parentId, String titleName, Boolean hasPartFormula) {
     public IPage<TreeNodeVOByTabType> tabTypeLazyTreeAll(IPage<TreeNodeVOByTabType> page, Long parentId, String titleName, Boolean hasPartFormula) {
         if (parentId == null) {
         if (parentId == null) {

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