Explorar o código

试验-成渝高速接口数据爬取开发

LHB hai 2 meses
pai
achega
100e5077ec
Modificáronse 20 ficheiros con 1166 adicións e 0 borrados
  1. 113 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/FinishTestReport.java
  2. 43 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TestType.java
  3. 222 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ThirdReport.java
  4. 18 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyFinishTestReportMapper.java
  5. 6 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyFinishTestReportMapper.xml
  6. 18 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyTestTypeMapper.java
  7. 6 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyTestTypeMapper.xml
  8. 18 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyThirdReportMapper.java
  9. 6 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyThirdReportMapper.xml
  10. 444 0
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/ChenYuTestScheduled.java
  11. 57 0
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/vo/GetFinishTestReport.java
  12. 57 0
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/vo/GetThirdReport.java
  13. 25 0
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/vo/Result.java
  14. 28 0
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/vo/ThirdLogin.java
  15. 13 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyFinishTestReportService.java
  16. 13 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyTestTypeService.java
  17. 13 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyThirdReportService.java
  18. 22 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyFinishTestReportServiceImpl.java
  19. 22 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyTestTypeServiceImpl.java
  20. 22 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyThirdReportServiceImpl.java

+ 113 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/FinishTestReport.java

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

+ 43 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TestType.java

@@ -0,0 +1,43 @@
+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 lombok.Data;
+
+/**
+ * 获取检测项目树(包括自建试验、外委、第三方、上传报告) 接受对象
+ *
+ * @author LHB
+ */
+@TableName("u_trial_cy_test_type")
+@Data
+public class TestType {
+    @TableId(type = IdType.INPUT)
+    private Long id;
+    /**
+     * 项目id
+     */
+    private Long projectId;
+    /**
+     * ID唯一标识
+     */
+    @TableField("c_id")
+    private String ID;
+    /**
+     * 名称
+     */
+    @TableField("name")
+    private String Name;
+    /**
+     * 父级ID
+     */
+    @TableField("father_id")
+    private String FatherID;
+    /**
+     * 顺序号
+     */
+    @TableField("order_index")
+    private String OrderIndex;
+}

+ 222 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ThirdReport.java

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

+ 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.FinishTestReport;
+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<FinishTestReport> {
+
+}
+
+
+
+

+ 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.TestType;
+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<TestType> {
+
+}
+
+
+
+

+ 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.ThirdReport;
+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<ThirdReport> {
+
+}
+
+
+
+

+ 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>

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

@@ -0,0 +1,444 @@
+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.FinishTestReport;
+import org.springblade.business.entity.TestType;
+import org.springblade.business.entity.ThirdReport;
+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.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.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.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 成渝试验第三方接口获取数据
+ * 定时任务
+ *
+ * @author LHB
+ */
+@Component
+@Slf4j
+public class ChenYuTestScheduled {
+
+    @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"));
+            return data.getString("token");
+        } else {
+            log.error("---------#成渝第三方接口访问失败:" + post.getMessage());
+            return null;
+        }
+    }
+
+
+    /**
+     * 获取合同段列表接口
+     */
+    public void getContractSectByProjCode() {
+        //清空缓存
+        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());
+        }
+    }
+
+    /**
+     * 获取标段已完成(已签章完成)的检测报告
+     */
+    public void getFinishTestReport() {
+        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<FinishTestReport> list = data.toJavaList(FinishTestReport.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);
+        }
+    }
+
+    /**
+     * 获取已上传的外委检测报告/第三方检测报告/上传报告
+     */
+    public void getThirdReport() {
+        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<ThirdReport> list = data.toJavaList(ThirdReport.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);
+        }
+    }
+
+    /**
+     * 获取检测项目树(包括自建试验、外委、第三方、上传报告)
+     */
+    public void GetAllTestType() {
+        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<TestType> list = data.toJavaList(TestType.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;
+}

+ 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/TrialCyFinishTestReportService.java

@@ -0,0 +1,13 @@
+package org.springblade.business.service;
+
+import org.springblade.business.entity.FinishTestReport;
+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<FinishTestReport> {
+
+}

+ 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.TestType;
+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<TestType> {
+
+}

+ 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.ThirdReport;
+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<ThirdReport> {
+
+}

+ 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.FinishTestReport;
+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, FinishTestReport>
+    implements TrialCyFinishTestReportService {
+
+}
+
+
+
+

+ 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.TestType;
+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, TestType>
+    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.ThirdReport;
+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, ThirdReport>
+    implements TrialCyThirdReportService {
+
+}
+
+
+
+