diff --git a/pom.xml b/pom.xml
index 766d675..303ae36 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,6 +13,7 @@
1.82
2.0.60
3.5.9
+ 1.12.2
@@ -120,6 +121,13 @@
spring-boot-starter-aop
+
+
+ com.deepoove
+ poi-tl
+ ${poi-tl-version}
+
+
org.springframework.boot
diff --git a/src/main/java/com/gis/xian/config/AlgorithmClient.java b/src/main/java/com/gis/xian/config/AlgorithmClient.java
new file mode 100644
index 0000000..5a597ca
--- /dev/null
+++ b/src/main/java/com/gis/xian/config/AlgorithmClient.java
@@ -0,0 +1,182 @@
+package com.gis.xian.config;
+
+import com.alibaba.fastjson2.JSON;
+import com.gis.xian.domain.ApiResponse;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StreamUtils;
+import org.springframework.web.client.RestClient;
+
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Map;
+
+/**
+ * 算法服务 HTTP 客户端
+ *
+ * 两种使用方式:
+ * 1. Controller 透传前端请求:{@link #proxyRequest(HttpServletRequest, HttpMethod)}
+ * 2. Service 直接调用:{@link #get(String, Class)} / {@link #post(String, Object, Class)}
+ */
+@Slf4j
+@Component
+public class AlgorithmClient {
+
+ @Resource
+ private AlgorithmServerProperties props;
+
+ private RestClient restClient;
+
+ @PostConstruct
+ public void init() {
+ SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
+ factory.setConnectTimeout(props.getConnectTimeout() * 1000);
+ factory.setReadTimeout(props.getReadTimeout() * 1000);
+ this.restClient = RestClient.builder().requestFactory(factory).build();
+ log.info("AlgorithmClient 初始化: url={}, connectTimeout={}s, readTimeout={}s",
+ props.getUrl(), props.getConnectTimeout(), props.getReadTimeout());
+ }
+
+ // ================================================================
+ // 前端透传:完整代理 HTTP 请求
+ // ================================================================
+
+ public ApiResponse