From 1a836f94801451060793813fd90ab92b9235ba79 Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Fri, 29 Aug 2025 10:48:23 +0800 Subject: [PATCH] ifs HttpUtils --- .../com/gaotao/common/utils/HttpUtils.java | 132 ++++++++++++++++++ .../modules/po/controller/PoController.java | 3 +- .../gaotao/modules/po/service/PoService.java | 3 +- .../po/service/impl/PoServiceImpl.java | 55 ++++---- 4 files changed, 164 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/gaotao/common/utils/HttpUtils.java diff --git a/src/main/java/com/gaotao/common/utils/HttpUtils.java b/src/main/java/com/gaotao/common/utils/HttpUtils.java new file mode 100644 index 0000000..a0f3071 --- /dev/null +++ b/src/main/java/com/gaotao/common/utils/HttpUtils.java @@ -0,0 +1,132 @@ +package com.gaotao.common.utils; + +import java.io.IOException; +import java.net.URI; +import java.net.URLEncoder; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.Map; + +public class HttpUtils { + + private static final HttpClient client = HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(30)) + .build(); + + /** + * 发送 GET 请求,支持 Query 参数 + * + * @param url 请求 URL + * @param params 查询参数(可为 null) + * @param headers 请求头(可为 null) + * @return 响应字符串 + */ + public static String doGet(String url, Map params, Map headers) { + try { + if (params != null && !params.isEmpty()) { + String query = buildQueryString(params); + url = url + "?" + query; + } + + HttpRequest.Builder builder = HttpRequest.newBuilder() + .uri(URI.create(url)) + .timeout(Duration.ofSeconds(60)) + .GET(); + + if (headers != null) { + headers.forEach(builder::header); + } + + HttpResponse response = client.send(builder.build(), HttpResponse.BodyHandlers.ofString()); + return handleResponse(response); + } catch (IOException | InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException("GET 请求失败: " + e.getMessage(), e); + } + } + + /** + * 发送 GET 请求,携带 JSON Body(非标准,谨慎使用) + * + * @param url 请求 URL + * @param jsonBody JSON 字符串 + * @param headers 请求头(可为 null) + * @return 响应字符串 + */ + public static String doGetWithBody(String url, String jsonBody, Map headers) { + try { + HttpRequest.Builder builder = HttpRequest.newBuilder() + .uri(URI.create(url)) + .timeout(Duration.ofSeconds(60)) + .method("GET", HttpRequest.BodyPublishers.ofString(jsonBody)) + .header("Content-Type", "application/json"); + + if (headers != null) { + headers.forEach(builder::header); + } + + HttpResponse response = client.send(builder.build(), HttpResponse.BodyHandlers.ofString()); + return handleResponse(response); + } catch (IOException | InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException("GET (JSON Body) 请求失败: " + e.getMessage(), e); + } + } + + /** + * 发送 POST 请求,JSON Body + * + * @param url 请求 URL + * @param jsonBody JSON 字符串 + * @param headers 请求头(可为 null) + * @return 响应字符串 + */ + public static String doPost(String url, String jsonBody, Map headers) { + try { + HttpRequest.Builder builder = HttpRequest.newBuilder() + .uri(URI.create(url)) + .timeout(Duration.ofSeconds(60)) + .POST(HttpRequest.BodyPublishers.ofString(jsonBody)) + .header("Content-Type", "application/json"); + + if (headers != null) { + headers.forEach(builder::header); + } + + HttpResponse response = client.send(builder.build(), HttpResponse.BodyHandlers.ofString()); + return handleResponse(response); + } catch (IOException | InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException("POST 请求失败: " + e.getMessage(), e); + } + } + + /** 构建查询参数字符串 */ + private static String buildQueryString(Map params) { + StringBuilder sb = new StringBuilder(); + for (Map.Entry entry : params.entrySet()) { + sb.append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8)) + .append("=") + .append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8)) + .append("&"); + } + if (!params.isEmpty()) { + sb.deleteCharAt(sb.length() - 1); // 去掉最后一个 "&" + } + return sb.toString(); + } + + /** 统一处理响应 */ + private static String handleResponse(HttpResponse response) { + int statusCode = response.statusCode(); + if (statusCode == 200) { + return response.body(); + } else { + throw new RuntimeException("HTTP 错误: " + statusCode + ", 响应: " + response.body()); + } + } +} + diff --git a/src/main/java/com/gaotao/modules/po/controller/PoController.java b/src/main/java/com/gaotao/modules/po/controller/PoController.java index 1a5f89d..43d0f54 100644 --- a/src/main/java/com/gaotao/modules/po/controller/PoController.java +++ b/src/main/java/com/gaotao/modules/po/controller/PoController.java @@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Map; @RequestMapping("po") @RestController @@ -23,7 +24,7 @@ public class PoController extends AbstractController { @PostMapping("getPoList") public R getPoList(@RequestBody PurchaseOrderDto purchaseOrder){ - List list = poService.getPoList(purchaseOrder); + List> list = poService.getPoList(purchaseOrder); return R.ok().put("rows",list); } diff --git a/src/main/java/com/gaotao/modules/po/service/PoService.java b/src/main/java/com/gaotao/modules/po/service/PoService.java index 55bc139..116aa83 100644 --- a/src/main/java/com/gaotao/modules/po/service/PoService.java +++ b/src/main/java/com/gaotao/modules/po/service/PoService.java @@ -6,10 +6,11 @@ import com.gaotao.modules.po.entity.PurchaseOrderDto; import com.gaotao.modules.trans.entity.TransDetailDto; import java.util.List; +import java.util.Map; public interface PoService extends IService { - List getPoList(PurchaseOrderDto accessSite); + List> getPoList(PurchaseOrderDto accessSite); public void saveTrans(TransDetailDto indata); diff --git a/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java b/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java index 95b751f..95431a1 100644 --- a/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java +++ b/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java @@ -2,11 +2,10 @@ package com.gaotao.modules.po.service.impl; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import com.gaotao.common.exception.XJException; -import com.gaotao.common.utils.AgvClientUtil; -import com.gaotao.common.utils.HttpClientUtil; -import com.gaotao.common.utils.IfsClientUtil; -import com.gaotao.common.utils.ResponseData; +import com.gaotao.common.utils.*; import lombok.extern.slf4j.Slf4j; import java.util.Map; @@ -66,33 +65,35 @@ public class PoServiceImpl extends ServiceImpl implemen private String wcsUrl; @Override - public List getPoList(PurchaseOrderDto purchaseOrder) { + public List> getPoList(PurchaseOrderDto purchaseOrder) { try { - // 调用IFS接口获取PO数据 - JSONObject ifsRequest = new JSONObject(); - ifsRequest.put("ifsDBName", "IFSTEST"); - ifsRequest.put("domainUserID", "CCL_WMS"); - ifsRequest.put("ifsSiteID", "55"); - ifsRequest.put("poNumber", purchaseOrder.getPoNumber()); - ifsRequest.put("partNo", purchaseOrder.getPartNo()); - ifsRequest.put("status", "RELEASED"); // 只获取已发布的PO - - log.info("调用IFS获取PO数据,请求参数: {}", ifsRequest); - // 使用IfsClientUtil获取PO数据 // 注意:这里应该根据实际的IFS接口调用方式进行调整 // 如果需要获取多行数据,可能需要先获取PO头,再获取行数据 - //ResponseData ifsResponse = ifsClientUtil.getPurchaseOrder("po00001"); - - ResponseData ifsResponse = testIfsClientUtil(); // 测试用,实际使用时替换为上面的调用 - if (ifsResponse != null && "SUCCESS".equals(ifsResponse.getCode())) { - // 解析IFS返回的PO数据 - return parseIFSPOData(ifsResponse.getObj()); - } else { - log.error("从IFS获取PO数据失败: {}", ifsResponse); - throw new XJException("从IFS获取PO数据失败"); - } - + Map params = Map.of( + "ifsDBName", "UPD24", + "domainUserID", "CCL_WMS", + "ifsSiteID", "55", + "ifsPurchaseOrderNo", purchaseOrder.getPoNumber() + ); + ObjectMapper objectMapper = new ObjectMapper(); + String jsonBody = objectMapper.writeValueAsString(params); + String ifsResponse = HttpUtils.doGetWithBody("https://cclifswebservice.ccldesign.com/api/v1/PurchaseOrderLine",jsonBody,null); + ObjectMapper mapper = new ObjectMapper(); + + /*Map params2 = Map.of( + "ifsDBName", "UPD24", + "domainUserID", "CCL_WMS", + "ifsSiteID", "55", + "partNo", "80900095-1DF", + "qtyToIssue", 10, + "locationNo", "DF1FT0101", + "destLocationNo", "DF1RS0202", + "lotBatchNo", "2883779-*-*-1" + ); + String jsonBody2 = objectMapper.writeValueAsString(params2); + String ifsResponse2 = HttpUtils.doPost("https://cclifswebservice.ccldesign.com/api/v1/MoveInventoryPart",jsonBody2,null);*/ + return mapper.readValue(ifsResponse, new TypeReference>>() {}); } catch (Exception e) { log.error("获取PO列表异常: {}", e.getMessage()); throw new XJException("获取PO列表失败: " + e.getMessage());