Przeglądaj źródła

试验-接入成渝第三方接口开发
1、获取token(成功)
2、获取合同段列表(成功) 但是数据待确认
3、获取已完成的检测报告(成功)
4、获取第三方报告(成功)
5、获取检测项目树(接口未开发完)

LHB 1 tydzień temu
rodzic
commit
2182c3e69f
20 zmienionych plików z 1116 dodań i 332 usunięć
  1. 52 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyAccessories.java
  2. 9 7
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyFinishTestReport.java
  3. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyTestType.java
  4. 15 7
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyThirdReport.java
  5. 18 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyAccessoriesMapper.java
  6. 19 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyAccessoriesMapper.xml
  7. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyFinishTestReportMapper.java
  8. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyTestTypeMapper.java
  9. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyThirdReportMapper.java
  10. 462 299
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/ChenYuTestScheduled.java
  11. 462 0
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/ChenYuTestScheduled01.java
  12. 25 0
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/vo/ResultPost.java
  13. 13 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyAccessoriesService.java
  14. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyFinishTestReportService.java
  15. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyTestTypeService.java
  16. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyThirdReportService.java
  17. 22 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyAccessoriesServiceImpl.java
  18. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyFinishTestReportServiceImpl.java
  19. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyTestTypeServiceImpl.java
  20. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyThirdReportServiceImpl.java

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

@@ -0,0 +1,52 @@
+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_accessories
+ */
+@TableName(value ="u_trial_cy_accessories")
+@Data
+public class TrialCyAccessories {
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.INPUT)
+    private Long id;
+
+    /**
+     * 报告id,已签章的报告/是第三方检测报告/外委检测报告/上传报告
+     */
+    private Long reportId;
+
+    /**
+     * 成渝接口返回的id
+     */
+    @TableField("acc_id")
+    private String AccID;
+
+    /**
+     * 类型名称
+     */
+
+    @TableField("acc_type")
+    private String AccType;
+
+    /**
+     * 文件名称
+     */
+    @TableField("file_name")
+    private String FileName;
+
+    /**
+     * 文件路径
+     */
+    @TableField("file_path")
+    private String FilePath;
+}

+ 9 - 7
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/FinishTestReport.java → blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyFinishTestReport.java

@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * 已完成(已签章完成)的检测报告接受对象
  *
@@ -13,15 +15,10 @@ import lombok.Data;
  */
 @TableName("u_trial_cy_finish_test_report")
 @Data
-public class FinishTestReport {
+public class TrialCyFinishTestReport {
 
     @TableId(type = IdType.INPUT)
     private Long id;
-    /**
-     * 项目ID
-     */
-    @TableField("project_id")
-    private Long projectId;
     /**
      * 合同ID
      */
@@ -90,7 +87,7 @@ public class FinishTestReport {
     /**
      * 是否合格 True 合格,False不合格
      */
-    private Boolean experimentResult;
+    private String experimentResult;
     /**
      * 报告人
      */
@@ -110,4 +107,9 @@ public class FinishTestReport {
      */
     @TableField("record_file_path")
     private String RecordFilePath;
+    /**
+     * 附件
+     */
+    @TableField(exist = false)
+    private List<TrialCyAccessories> Accessories;
 }

+ 1 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TestType.java → blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyTestType.java

@@ -13,7 +13,7 @@ import lombok.Data;
  */
 @TableName("u_trial_cy_test_type")
 @Data
-public class TestType {
+public class TrialCyTestType {
     @TableId(type = IdType.INPUT)
     private Long id;
     /**

+ 15 - 7
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ThirdReport.java → blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyThirdReport.java

@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * 获取已上传的外委检测报告/第三方检测报告/上传报告 接受对象
  *
@@ -13,13 +15,9 @@ import lombok.Data;
  */
 @TableName("u_trial_cy_third_report")
 @Data
-public class ThirdReport {
+public class TrialCyThirdReport {
     @TableId(type = IdType.INPUT)
-    private Long id;
-    /**
-     * 项目id
-     */
-    private Long projectId;
+    private Long pKeyId;
     /**
      * 合同id
      */
@@ -27,8 +25,12 @@ public class ThirdReport {
     /**
      * ID
      */
-    @TableField("c_id")
+    @TableField("id")
     public String ID;
+    /**
+     * 报告类型(0:外委检测,1:第三方检测,2:扫描上传报告)
+     */
+    public Integer thirdType;
     /**
      * 委托编号
      */
@@ -219,4 +221,10 @@ public class ThirdReport {
      */
     @TableField("create_time")
     public String CreateTime;
+
+    /**
+     * 附件
+     */
+    @TableField(exist = false)
+    private List<TrialCyAccessories> Accessories;
 }

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

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

@@ -1,6 +1,6 @@
 package org.springblade.business.mapper;
 
-import org.springblade.business.entity.FinishTestReport;
+import org.springblade.business.entity.TrialCyFinishTestReport;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 /**
@@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 * @createDate 2025-08-01 09:05:03
 * @Entity generator.domain.UTrialCyFinishTestReport
 */
-public interface TrialCyFinishTestReportMapper extends BaseMapper<FinishTestReport> {
+public interface TrialCyFinishTestReportMapper extends BaseMapper<TrialCyFinishTestReport> {
 
 }
 

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

@@ -1,6 +1,6 @@
 package org.springblade.business.mapper;
 
-import org.springblade.business.entity.TestType;
+import org.springblade.business.entity.TrialCyTestType;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 /**
@@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 * @createDate 2025-08-01 09:05:07
 * @Entity generator.domain.UTrialCyTestType
 */
-public interface TrialCyTestTypeMapper extends BaseMapper<TestType> {
+public interface TrialCyTestTypeMapper extends BaseMapper<TrialCyTestType> {
 
 }
 

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

@@ -1,6 +1,6 @@
 package org.springblade.business.mapper;
 
-import org.springblade.business.entity.ThirdReport;
+import org.springblade.business.entity.TrialCyThirdReport;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 /**
@@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 * @createDate 2025-08-01 09:05:10
 * @Entity generator.domain.UTrialCyThirdReport
 */
-public interface TrialCyThirdReportMapper extends BaseMapper<ThirdReport> {
+public interface TrialCyThirdReportMapper extends BaseMapper<TrialCyThirdReport> {
 
 }
 

+ 462 - 299
blade-service/blade-business/src/main/java/org/springblade/business/scheduled/ChenYuTestScheduled.java

@@ -4,43 +4,55 @@ 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.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.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.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
 
 /**
  * 成渝试验第三方接口获取数据
@@ -52,412 +64,563 @@ import java.util.concurrent.ConcurrentHashMap;
 @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;
 
-    // HTTP客户端复用
+    @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();
     }
 
-    //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<>();
+    @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);
+            }
+        }
+    }
 
     /**
-     * 登录 获取token
+     * 确保项目ID已初始化
      */
+    private synchronized void ensureProjectIdInitialized() {
+        if (PROJECT_ID != null) return;
 
-    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();
+        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();
+    }
 
-        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("---------#后管未配置成渝-试验-授权码或私钥");
+    /**
+     * 登录获取Token
+     */
+    private String thirdLogin() {
+        ensureProjectIdInitialized();
+        if (PROJECT_ID == null) {
+            log.error("Project ID not available for login");
             return null;
         }
-        //当前时间戳
-        Long time = System.currentTimeMillis();
 
-        //加密
-        String md5Hex = MD5Utils.md5Hex(time + appKey + appSecret, "UTF-8");
+        try {
+            String appKey = jdbcTemplate.queryForObject(APP_KEY_SQL, String.class);
+            String appSecret = jdbcTemplate.queryForObject(APP_SECRET_SQL, String.class);
 
-        ThirdLogin thirdLogin = new ThirdLogin();
-        thirdLogin.setAppKey(appKey);
-        thirdLogin.setTimestamp(time);
-        thirdLogin.setSecret(md5Hex);
+            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");
 
-        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());
+            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;
         }
     }
 
-
     /**
-     * 获取合同段列表接口
+     * 获取合同段列表 TODO 接口数据待确认
      */
-    @Scheduled(cron = "0 0 * * * ?")
+//    @Scheduled(cron = "0 0 * * * ?")
+    @Scheduled(fixedDelay = 20000)
     public void getContractSectByProjCode() {
-        if(!SystemUtils.isLinux()){
-            return;
-        }
-        //清空缓存
-        contractCodeMap.clear();
+//        if (!SystemUtils.isLinux()) {
+//            return;
+//        }
 
-        String url = "/api/CQHCZC/MesureSystem/GetContractSectByProjCode";
+        contractCodeMap.clear();
+        String token = getToken();
+        ensureProjectIdInitialized();
 
-        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("---------#成渝第三方接口访问失败:项目不存在");
+        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;
+            }
 
-        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();
+            JSONArray data = (JSONArray) result.getData();
+            if (CollectionUtil.isEmpty(data)) {
+                log.warn("No contract sections found");
+                return;
+            }
 
             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);
-                    }
-                }
+            for (int i = 0; i < data.size(); i++) {
+                JSONObject obj = data.getJSONObject(i);
+                String code = obj.getString("Code");
+                String name = obj.getString("Name");
+//                if (StringUtil.isNotBlank(code)) {
+//                    codes.add(code);
+//                }
+                contractCodeMap.put(name, Long.valueOf(i));
             }
-            //封装需要查询的合同段
-            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());
+//            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()){
+        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("---------#成渝第三方接口访问失败:合同段编码无数据");
+        String token = getToken();
+        ensureProjectIdInitialized();
+
+        if (token == null || PROJECT_ID == null || contractCodeMap.isEmpty()) {
+            log.error("Preconditions not met for finish test report");
             return;
         }
-        for (String contractCode : contractCodes) {
-            GetFinishTestReport getFinishTestReport = new GetFinishTestReport(token, PROJECT_CODE, contractCode);
 
-            Integer pageIndex = 0;
-            Integer pageSize = 100;
+        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)));
 
-            do {
-                getFinishTestReport.setPageIndex(pageIndex);
-                getFinishTestReport.setPageSize(pageSize);
+                    ResultPost result = post(BASE_URL + FINISH_TEST_REPORT_URL, params);
 
-                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)) {
+                    if (result == null) {
+                        log.error("Request failed for contract: {}", contractCode);
                         break;
                     }
-                    list.forEach(f -> f.setContractId(contractCodeMap.get(contractCode)));
-                    //处理数据
-                    trialCyFinishTestReportService.saveBatch(list);
-                    if (list.size() < pageSize) {
+
+                    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++;
-                } else {
-                    log.error("---------#成渝第三方接口访问失败:{}, contractCode: {}", post.getMessage(), contractCode);
-                    break; // 继续处理下一个合同段
+                } catch (Exception e) {
+                    log.error("Error processing contract {} page {}", contractCode, pageIndex, e);
+                    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("---------#成渝第三方接口访问失败:项目不存在");
+        if (!SystemUtils.isLinux()) {
             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;
+        Integer[] thirdTypes = {0,1,2};
 
-            do {
-                getThirdReport.setPageIndex(pageIndex);
-                getThirdReport.setPageSize(pageSize);
+        String token = getToken();
+        ensureProjectIdInitialized();
 
-                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 (token == null || PROJECT_ID == null || contractCodeMap.isEmpty()) {
+            log.error("Preconditions not met for third report");
+            return;
+        }
 
-                    if (list.size() < pageSize) {
+        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;
                     }
-
-                    pageIndex++;
-                } else {
-                    log.error("---------#成渝第三方接口访问失败:{}, contractCode: {}", post.getMessage(), contractCode);
-                    break; // 继续处理下一个合同段
                 }
-            } while (true);
+            }
         }
     }
 
     /**
-     * 获取检测项目树(包括自建试验、外委、第三方、上传报告)
+     * 获取检测项目树  TODO 第三方接口未开发完(待调试
      */
     @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("---------#成渝第三方接口访问失败:项目不存在");
+        if (!SystemUtils.isLinux()) {
             return;
         }
 
-        JSONObject jsonObject = new JSONObject();
-        jsonObject.put("token", token);
-        jsonObject.put("ProjectCode", PROJECT_CODE);
+        try {
+            String token = getToken();
+            ensureProjectIdInitialized();
 
-        Result post = this.post(URL + url, jsonObject);
+            if (token == null || PROJECT_ID == null) {
+                log.error("Invalid token or project ID");
+                return;
+            }
 
-        if (post == null) {
-            log.error("---------#成渝第三方接口访问失败:接口访问失败");
-            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;
+            }
 
-        Integer state = post.getState();
-        //成功
-        if (state == 1) {
-            //合同段列表数据
-            JSONArray data = (JSONArray) post.getData();
-            List<TestType> list = data.toJavaList(TestType.class);
-            //退出循环
-            if (CollectionUtil.isEmpty(list)) {
+            JSONArray data = (JSONArray) result.getResult();
+            if (CollectionUtil.isEmpty(data)) {
+                log.info("No test types found");
                 return;
             }
-            list.forEach(f -> f.setProjectId(PROJECT_ID));
-            //处理数据
-            trialCyTestTypeService.saveOrUpdateBatch(list);
-        } else {
-            log.error("---------#成渝第三方接口访问失败:" + post.getMessage());
+
+            List<TrialCyTestType> testTypes = data.toJavaList(TrialCyTestType.class);
+            for (TrialCyTestType type : testTypes) {
+                type.setProjectId(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
      */
-    public Result post(String url, Object object) {
+    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);
+                }
+            }
 
-        // 对象转json
-        StringEntity json = new StringEntity(JSON.toJSONString(object), "utf-8");
-        httpPost.setEntity(json);
+            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 {
-            HttpResponse httpResponse = httpClient.execute(httpPost);
+            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();
 
-            // 检查响应状态码
-            int statusCode = httpResponse.getStatusLine().getStatusCode();
-            if (statusCode != 200) {
-                log.warn("HTTP request failed with status code: {}", statusCode);
-                // 可以根据具体业务需求调整错误处理方式
+            if (status != 200) {
+                log.warn("HTTP error: {} - {}", status, response.getStatusLine().getReasonPhrase());
                 return null;
             }
 
-            try (InputStream inputStream = httpResponse.getEntity().getContent();
-                 ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
-
+            try (InputStream input = response.getEntity().getContent()) {
                 byte[] buffer = new byte[1024];
-                int index = 0;
-                while ((index = inputStream.read(buffer)) != -1) {
-                    outputStream.write(buffer, 0, index);
+                int bytesRead;
+                while ((bytesRead = input.read(buffer)) != -1) {
+                    output.write(buffer, 0, bytesRead);
                 }
-                // 响应参数 - 指定明确的字符编码
-                Result result = JSON.parseObject(outputStream.toString("utf-8"), Result.class);
-                return result;
             }
-        } catch (IOException e) {
-            log.error("HTTP request failed: ", e);
-            // 返回错误结果或抛出异常,根据业务需求决定
+
+            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;
+        }
+    }
+
+}

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

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

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

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

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

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

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

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

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

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

@@ -1,7 +1,7 @@
 package org.springblade.business.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springblade.business.entity.FinishTestReport;
+import org.springblade.business.entity.TrialCyFinishTestReport;
 import org.springblade.business.service.TrialCyFinishTestReportService;
 import org.springblade.business.mapper.TrialCyFinishTestReportMapper;
 import org.springframework.stereotype.Service;
@@ -12,7 +12,7 @@ import org.springframework.stereotype.Service;
 * @createDate 2025-08-01 09:05:03
 */
 @Service
-public class TrialCyFinishTestReportServiceImpl extends ServiceImpl<TrialCyFinishTestReportMapper, FinishTestReport>
+public class TrialCyFinishTestReportServiceImpl extends ServiceImpl<TrialCyFinishTestReportMapper, TrialCyFinishTestReport>
     implements TrialCyFinishTestReportService {
 
 }

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

@@ -1,7 +1,7 @@
 package org.springblade.business.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springblade.business.entity.TestType;
+import org.springblade.business.entity.TrialCyTestType;
 import org.springblade.business.service.TrialCyTestTypeService;
 import org.springblade.business.mapper.TrialCyTestTypeMapper;
 import org.springframework.stereotype.Service;
@@ -12,7 +12,7 @@ import org.springframework.stereotype.Service;
 * @createDate 2025-08-01 09:05:07
 */
 @Service
-public class TrialCyTestTypeServiceImpl extends ServiceImpl<TrialCyTestTypeMapper, TestType>
+public class TrialCyTestTypeServiceImpl extends ServiceImpl<TrialCyTestTypeMapper, TrialCyTestType>
     implements TrialCyTestTypeService {
 
 }

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

@@ -1,7 +1,7 @@
 package org.springblade.business.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springblade.business.entity.ThirdReport;
+import org.springblade.business.entity.TrialCyThirdReport;
 import org.springblade.business.service.TrialCyThirdReportService;
 import org.springblade.business.mapper.TrialCyThirdReportMapper;
 import org.springframework.stereotype.Service;
@@ -12,7 +12,7 @@ import org.springframework.stereotype.Service;
 * @createDate 2025-08-01 09:05:10
 */
 @Service
-public class TrialCyThirdReportServiceImpl extends ServiceImpl<TrialCyThirdReportMapper, ThirdReport>
+public class TrialCyThirdReportServiceImpl extends ServiceImpl<TrialCyThirdReportMapper, TrialCyThirdReport>
     implements TrialCyThirdReportService {
 
 }