From 7d39e9de67f0ba73d3093632496578a919d5381f Mon Sep 17 00:00:00 2001 From: xjf <378266566@qq.com> Date: Wed, 10 Dec 2025 12:04:06 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E9=80=82=E9=85=8Dexa=E6=8E=A5=E5=8F=A3-?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=BB=84=E5=90=8D=E5=AD=97=E6=AE=B5=E5=8F=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/exa/EXAController.java | 6 +- .../admin/exa/vo/EXAGroupRespVO.java | 26 +++++ .../controller/admin/exa/vo/EXAResult.java | 2 + .../alert/controller/admin/exa/vo/Point.java | 4 +- .../module/alert/service/exa/EXAService.java | 2 +- .../alert/service/exa/EXAServiceImpl.java | 7 +- .../yudao/module/alert/utils/EXAUtils.java | 110 +++++++++++------- .../system/enums/ErrorCodeConstants.java | 2 + 8 files changed, 112 insertions(+), 47 deletions(-) create mode 100644 yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/vo/EXAGroupRespVO.java diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/EXAController.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/EXAController.java index dd82886..a4282bd 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/EXAController.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/EXAController.java @@ -89,8 +89,8 @@ public class EXAController { @GetMapping("/group") @Operation(summary = "获取EXA所有组名") @PreAuthorize("@ss.hasPermission('alert:exa:query')") - public CommonResult> getEXAGroupInfo() throws URISyntaxException, IOException { - List groupList=exaService.getEXAGroupInfo(); + public CommonResult>> getEXAGroupInfo() throws URISyntaxException, IOException { + List> groupList=exaService.getEXAGroupInfo(); return success(groupList); } @@ -132,7 +132,7 @@ public class EXAController { @PreAuthorize("@ss.hasPermission('system:user:import')") public CommonResult importExcel(@RequestParam("file") MultipartFile file, @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { - System.out.println(file); + System.out.println(file.getInputStream()); List list = ExcelUtils.readCSV(file, Point.class); return success(exaService.importPointList(list, updateSupport)); } diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/vo/EXAGroupRespVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/vo/EXAGroupRespVO.java new file mode 100644 index 0000000..f5fc81f --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/vo/EXAGroupRespVO.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.alert.controller.admin.exa.vo; + +import com.alibaba.fastjson.annotation.JSONField; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Schema(description = "EXA - 获取组名 Response VO") +@Data +@NoArgsConstructor // 添加无参构造器 +@AllArgsConstructor // 添加全参构造器,与@Builder兼容 +public class EXAGroupRespVO { + /** + * 组名 + */ + @JSONField(name="GroupsJson") + private String GroupsJson; + + /** + * 返回值 + */ + @JSONField(name="ReturnValue") + private Long ReturnValue; +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/vo/EXAResult.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/vo/EXAResult.java index 4f05aac..6b85368 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/vo/EXAResult.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/vo/EXAResult.java @@ -1,7 +1,9 @@ package cn.iocoder.yudao.module.alert.controller.admin.exa.vo; import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +@Data public class EXAResult { @JSONField(name="ReturnValue") public Long ReturnValue; diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/vo/Point.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/vo/Point.java index cb0df87..dd03725 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/vo/Point.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/vo/Point.java @@ -15,8 +15,8 @@ import lombok.experimental.Accessors; @NoArgsConstructor @Accessors(chain = false) // 设置 chain = false,避免用户导入有问题 public class Point { - @Schema(description = "", example = "芋道") - public String AssetCode; +// @Schema(description = "", example = "芋道") +// public String AssetCode; @ExcelProperty("点号名称") @Schema(description = "点号", example = "芋道") diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/exa/EXAService.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/exa/EXAService.java index 8cb9a76..0aec5c0 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/exa/EXAService.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/exa/EXAService.java @@ -34,7 +34,7 @@ public interface EXAService { String createPoint(Point pointVo) throws IOException; - public List getEXAGroupInfo() throws URISyntaxException, IOException; + public List> getEXAGroupInfo() throws URISyntaxException, IOException; public String deletePoint(String ItemName); EXAPointImportRespVO importPointList(List importPoints, boolean isUpdateSupport); diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/exa/EXAServiceImpl.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/exa/EXAServiceImpl.java index 29926b6..25d163c 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/exa/EXAServiceImpl.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/exa/EXAServiceImpl.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.alert.controller.admin.exa.vo.*; import cn.iocoder.yudao.module.alert.controller.admin.system.vo.PointOptionItemVO; import cn.iocoder.yudao.module.alert.utils.EXAUtils; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -129,7 +130,7 @@ public class EXAServiceImpl implements EXAService { * @return 分页结果 */ @Override - public List getEXAGroupInfo() throws URISyntaxException, IOException { + public List> getEXAGroupInfo() throws URISyntaxException, IOException { return exaUtils.getGroup(EXA_IP); } /** @@ -164,7 +165,9 @@ public class EXAServiceImpl implements EXAService { importPoints.forEach(importUser -> { try { String createResult=createPoint(importUser); - if(createResult.equals("1")){ + EXAResult vo = JSON.parseObject(createResult, EXAResult.class); + + if(vo.ReturnValue.equals(1L)){ respVO.getCreateNames().add(importUser.getItemName()); } diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/utils/EXAUtils.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/utils/EXAUtils.java index 439dd2e..ee71aa7 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/utils/EXAUtils.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/utils/EXAUtils.java @@ -276,53 +276,85 @@ public class EXAUtils { return result; } - public List getGroup(String EXA_IP) throws URISyntaxException, IOException { - List result = new ArrayList<>(); - try { - // 目标 RPC 服务的 URL - String url = "http://" + EXA_IP + ":9000/exawebapi/exagroup/getgroups"; - //创建HttpClient对象 - CloseableHttpClient httpClient = HttpClients.createDefault(); - /* - * 由于GET请求的参数都是拼装在URL地址后方,所以我们要构建一个URL,带参数 - */ - URIBuilder uriBuilder = new URIBuilder(url); - - /** 添加参数 */ -// uriBuilder.addParameter("ItemNames", itemNames); - //创建请求对象 - HttpGet httpGet = new HttpGet(uriBuilder.build()); + public List> getGroup(String EXA_IP) throws IOException { + String requestPathAddItem = "http://" + EXA_IP + ":9000/exawebapi/EXAItem/GetAllGroups"; + String result = Request.Post(requestPathAddItem) + .addHeader("Content-type", "application/json") + .execute().returnContent().asString(Charset.forName("utf-8")); + // Add validation for empty or null response + if (result == null || result.isEmpty()) { + return new ArrayList<>(); + } - // 传输的类型 - httpGet.addHeader("Content-Type", "application/json"); - //发送请求,请求响应结果 - CloseableHttpResponse response = httpClient.execute(httpGet); - //获取服务器返回的状态码 - int statusCode = response.getStatusLine().getStatusCode(); - System.out.println("服务端返回成功的状态码为:" + statusCode); - HttpEntity entity = response.getEntity(); - String body = EntityUtils.toString(entity).replaceAll("\\\\", ""); - System.out.println("服务端返回的数据为:" + body); - if (body.startsWith("\"") && body.endsWith("\"")) { - // 步骤3:去掉双引号 - body = body.substring(1, body.length() - 1); // 去掉首尾的双引号 + try { + // Handle potential escaped quotes in response + if (result.startsWith("\"") && result.endsWith("\"")) { + result = result.substring(1, result.length() - 1).replace("\\\"", "\"").replace("\\\\", "\\"); } - Gson gson = new GsonBuilder().serializeNulls().setPrettyPrinting().create(); - Type listType = new TypeToken>() { - }.getType(); - result = gson.fromJson(body, listType); - - //关闭资源 - response.close(); - httpClient.close(); + EXAGroupRespVO vo = JSON.parseObject(result, EXAGroupRespVO.class); + List> jsonResult = new ArrayList<>(); + if(vo.getReturnValue().equals(1L)){ + jsonResult = JSON.parseObject(vo.getGroupsJson(), new com.alibaba.fastjson.TypeReference>>() {}); + } + return jsonResult; } catch (Exception e) { - + System.err.println("Failed to parse group data: " + e.getMessage()); + System.err.println("Response was: " + result); + // Return empty list instead of null to prevent NullPointerException + return new ArrayList<>(); } - return result; + } +// public List getGroup(String EXA_IP) throws URISyntaxException, IOException { +// List result = new ArrayList<>(); +// try { +// // 目标 RPC 服务的 URL +// String url = "http://" + EXA_IP + ":9000/exawebapi/EXAItem/GetAllGroups"; +// //创建HttpClient对象 +// CloseableHttpClient httpClient = HttpClients.createDefault(); +// /* +// * 由于GET请求的参数都是拼装在URL地址后方,所以我们要构建一个URL,带参数 +// */ +// URIBuilder uriBuilder = new URIBuilder(url); +// +// /** 添加参数 */ +//// uriBuilder.addParameter("ItemNames", itemNames); +// +// //创建请求对象 +// HttpGet httpGet = new HttpGet(uriBuilder.build()); +// +// // 传输的类型 +// httpGet.addHeader("Content-Type", "application/json"); +// //发送请求,请求响应结果 +// CloseableHttpResponse response = httpClient.execute(httpGet); +// //获取服务器返回的状态码 +// int statusCode = response.getStatusLine().getStatusCode(); +// System.out.println("服务端返回成功的状态码为:" + statusCode); +// HttpEntity entity = response.getEntity(); +// String body = EntityUtils.toString(entity).replaceAll("\\\\", ""); +// System.out.println("服务端返回的数据为:" + body); +// if (body.startsWith("\"") && body.endsWith("\"")) { +// // 步骤3:去掉双引号 +// body = body.substring(1, body.length() - 1); // 去掉首尾的双引号 +// } +// +// Gson gson = new GsonBuilder().serializeNulls().setPrettyPrinting().create(); +// Type listType = new TypeToken>() { +// }.getType(); +// result = gson.fromJson(body, listType); +// +// //关闭资源 +// response.close(); +// httpClient.close(); +// } catch (Exception e) { +// +// } +// return result; +// } + public String deletePoint(String EXA_IP, String ItemName) { String requestPathDeleteItem = "http://" + EXA_IP + ":9000/exawebapi/exaitem/DeleteItem?ItemName=" + ItemName; // 创建HttpClient diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 76cf672..46ee4df 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -190,4 +190,6 @@ public interface ErrorCodeConstants { ErrorCode SYSTEM_CONFIG_NOT_EXISTS = new ErrorCode(1_002_033_000, "系统配置不存在"); ErrorCode SYSTEM_CONFIG_NAME_DUPLICATE = new ErrorCode(1_002_033_001, "已经存在该名字的系统配置"); + // ========== Excel 导入导出 1-002-034-000 ========== + ErrorCode EXCEL_FILE_EMPTY = new ErrorCode(1_002_034_000, "Excel 文件为空"); }