iailab-plat-sdk/src/main/java/com/iailab/sdk/auth/client/IailabAuthClient.java
@@ -3,7 +3,12 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper; import com.iailab.sdk.auth.client.dto.ApiDataQueryDTO; import com.iailab.sdk.auth.client.common.exception.enums.GlobalErrorCodeConstants; import com.iailab.sdk.auth.client.common.pojo.CommonResult; import com.iailab.sdk.auth.client.common.pojo.PageResult; import com.iailab.sdk.auth.client.dto.ApiPointsValueQueryDTO; import com.iailab.sdk.auth.client.dto.StAlarmAndSuggestPageReqDTO; import com.iailab.sdk.auth.client.dto.StAlarmAndSuggestRespDTO; import com.iailab.sdk.auth.client.dto.TokenDTO; import com.iailab.sdk.auth.config.SdkAutoConfiguration; import com.iailab.sdk.auth.constants.SdkErrorCodeConstants; @@ -70,6 +75,7 @@ public static Long expireTime; private static final String RESP_CODE = "code"; private static final String RESP_MSG = "msg"; private static final String RESP_DATA = "data"; /** @@ -98,17 +104,17 @@ Assert.isTrue(exchange.getStatusCode().is2xxSuccessful(), "响应必须是 200 成功"); Map<String, Object> authMap = exchange.getBody(); Object code = authMap.get("code"); if(SdkErrorCodeConstants.AUTH_BAD_CREDENTIALS.getCode().equals(code)) { if (SdkErrorCodeConstants.AUTH_BAD_CREDENTIALS.getCode().equals(code)) { throw exception(SdkErrorCodeConstants.AUTH_BAD_CREDENTIALS); } else if(SdkErrorCodeConstants.AUTH_LOGIN_BAD_CREDENTIALS.getCode().equals(code)) { } else if (SdkErrorCodeConstants.AUTH_LOGIN_BAD_CREDENTIALS.getCode().equals(code)) { throw exception(SdkErrorCodeConstants.AUTH_LOGIN_BAD_CREDENTIALS); } else if(SdkErrorCodeConstants.OAUTH2_CLIENT_REDIRECT_URI_NOT_MATCH.getCode().equals(code)) { } else if (SdkErrorCodeConstants.OAUTH2_CLIENT_REDIRECT_URI_NOT_MATCH.getCode().equals(code)) { throw exception(SdkErrorCodeConstants.OAUTH2_CLIENT_REDIRECT_URI_NOT_MATCH); } else if(SdkErrorCodeConstants.OAUTH2_CLIENT_CLIENT_SECRET_ERROR.getCode().equals(code)) { } else if (SdkErrorCodeConstants.OAUTH2_CLIENT_CLIENT_SECRET_ERROR.getCode().equals(code)) { throw exception(SdkErrorCodeConstants.OAUTH2_CLIENT_CLIENT_SECRET_ERROR); } else if(SdkErrorCodeConstants.OAUTH2_CLIENT_NOT_EXISTS.getCode().equals(code)) { } else if (SdkErrorCodeConstants.OAUTH2_CLIENT_NOT_EXISTS.getCode().equals(code)) { throw exception(SdkErrorCodeConstants.OAUTH2_CLIENT_NOT_EXISTS); } else if(SdkErrorCodeConstants.OAUTH2_CLIENT_DISABLE.getCode().equals(code)) { } else if (SdkErrorCodeConstants.OAUTH2_CLIENT_DISABLE.getCode().equals(code)) { throw exception(SdkErrorCodeConstants.OAUTH2_CLIENT_DISABLE); } accessToken = authMap.get("access_token").toString(); @@ -150,6 +156,7 @@ /** * 平台http请求封装 * * @param method * @param url * @param params @@ -159,9 +166,9 @@ public static String doHttp(String method, String url, Map<String, Object> params) throws Exception { String response = null; String upperMethod = method.toUpperCase(); if("GET".equals(upperMethod)) { if ("GET".equals(upperMethod)) { response = IailabHttpUtils.doGet(url, params, CHARSET); } else if("POST".equals(upperMethod)) { } else if ("POST".equals(upperMethod)) { ObjectMapper objectMapper = new ObjectMapper(); response = IailabHttpUtils.doPost(url, objectMapper.writeValueAsString(params), CHARSET); } @@ -177,35 +184,22 @@ headers.set("tenant-id", TENANT_ID.toString()); } // 统一处理响应 /** * 统一处理响应 * * @param response * @param <T> * @return */ private static <T> TokenDTO handleResponse(ResponseEntity<T> response) { Assert.isTrue(response.getStatusCode().is2xxSuccessful(), "响应必须是 200 成功"); System.out.println(response); TokenDTO authTokenDTO = new TokenDTO(); Map<String, Object> authMap = (Map<String, Object>)response.getBody(); Map<String, Object> authMap = (Map<String, Object>) response.getBody(); authTokenDTO.setAccessToken(authMap.get("access_token").toString()); authTokenDTO.setRefreshToken(authMap.get("refresh_token").toString()); authTokenDTO.setExpiresTime(Long.valueOf(authMap.get("expires_time").toString())); return authTokenDTO; } /** * 查询计划chart (测试用) * @param apiDataQueryDTO * @return * @throws Exception */ public Map<String, Object> queryPlanChart(ApiDataQueryDTO apiDataQueryDTO) throws Exception { Map<String, Object> data = new HashMap<>(); ObjectMapper objectMapper = new ObjectMapper(); String jsonString = objectMapper.writeValueAsString(apiDataQueryDTO); String resp = IailabHttpUtils.doPost(BASE_URL + "/data/api/query-plans/chart", jsonString, "utf-8"); if (StringUtils.isEmpty(resp)) { return data; } JSONObject jsonObject = JSON.parseObject(resp); data = jsonObject.getJSONObject(RESP_DATA).toJavaObject(Map.class); return data; } /** @@ -214,16 +208,77 @@ * @param pointNos * @return */ public Map<String, Object> queryPointsRealValue(List<String> pointNos) throws Exception { public CommonResult<Map<String, Object>> queryPointsRealValue(List<String> pointNos) { Map<String, Object> data = new HashMap<>(); String url = BASE_URL + "/data/api/query-points/real-value"; String resp = IailabHttpUtils.doPost(url, JSON.toJSONString(pointNos), "UTF-8"); if (StringUtils.isEmpty(resp)) { return data; try { String url = BASE_URL + "/data/api/query-points/real-value"; String resp = IailabHttpUtils.doPost(url, JSON.toJSONString(pointNos), "UTF-8"); if (StringUtils.isEmpty(resp)) { return CommonResult.error(GlobalErrorCodeConstants.EMPTY_RESP); } JSONObject jsonObject = JSON.parseObject(resp); Integer respCode = jsonObject.getInteger(RESP_CODE); if (!GlobalErrorCodeConstants.SUCCESS.getCode().equals(respCode)) { CommonResult.error(respCode, jsonObject.getString(RESP_MSG)); } data = jsonObject.getJSONObject(RESP_DATA).toJavaObject(Map.class); } catch (Exception ex) { return CommonResult.error(GlobalErrorCodeConstants.UNKNOWN.getCode(), ex.getMessage()); } JSONObject jsonObject = JSON.parseObject(resp); data = jsonObject.getJSONObject(RESP_DATA).toJavaObject(Map.class); return data; return CommonResult.success(data); } /** * 查询多个测点历史值 * * @param queryDto * @return */ public CommonResult<Map<String, List<Map<String, Object>>>> queryPointsHistoryValue(ApiPointsValueQueryDTO queryDto) { Map<String, List<Map<String, Object>>> data = new HashMap<>(); try { String url = BASE_URL + "/data/api/query-points/history-value"; String resp = IailabHttpUtils.doPost(url, JSON.toJSONString(queryDto), "UTF-8"); if (StringUtils.isEmpty(resp)) { return CommonResult.error(GlobalErrorCodeConstants.EMPTY_RESP); } JSONObject jsonObject = JSON.parseObject(resp); Integer respCode = jsonObject.getInteger(RESP_CODE); if (!GlobalErrorCodeConstants.SUCCESS.getCode().equals(respCode)) { CommonResult.error(respCode, jsonObject.getString(RESP_MSG)); } data = jsonObject.getJSONObject(RESP_DATA).toJavaObject(Map.class); } catch (Exception ex) { return CommonResult.error(GlobalErrorCodeConstants.UNKNOWN.getCode(), ex.getMessage()); } return CommonResult.success(data); } /** * 获取预警信息和调度建议分页列表 * * @param reqVO * @return */ public CommonResult<PageResult<StAlarmAndSuggestRespDTO>> getAlarmAndSuggestPage(StAlarmAndSuggestPageReqDTO reqVO) { PageResult<StAlarmAndSuggestRespDTO> data = new PageResult<>(); try { String url = BASE_URL + "/model/api/mcs/alarm-suggest/page"; String resp = IailabHttpUtils.doPost(url, JSON.toJSONString(reqVO), "UTF-8"); if (StringUtils.isEmpty(resp)) { return CommonResult.error(GlobalErrorCodeConstants.EMPTY_RESP); } JSONObject jsonObject = JSON.parseObject(resp); Integer respCode = jsonObject.getInteger(RESP_CODE); if (!GlobalErrorCodeConstants.SUCCESS.getCode().equals(respCode)) { CommonResult.error(respCode, jsonObject.getString(RESP_MSG)); } Long total = Long.parseLong(jsonObject.getJSONObject(RESP_DATA).get("total").toString()); List<StAlarmAndSuggestRespDTO> list = jsonObject.getJSONObject(RESP_DATA).getJSONArray("list").toJavaList(StAlarmAndSuggestRespDTO.class); data = new PageResult<>(list, total); } catch (Exception ex) { return CommonResult.error(GlobalErrorCodeConstants.UNKNOWN.getCode(), ex.getMessage()); } return CommonResult.success(data); } } iailab-plat-sdk/src/main/java/com/iailab/sdk/auth/client/common/exception/ErrorCode.java
对比新文件 @@ -0,0 +1,28 @@ package com.iailab.sdk.auth.client.common.exception; import lombok.Data; /** * 错误码对象 * * * TODO 错误码设计成对象的原因,为未来的 i18 国际化做准备 */ @Data public class ErrorCode { /** * 错误码 */ private final Integer code; /** * 错误提示 */ private final String msg; public ErrorCode(Integer code, String message) { this.code = code; this.msg = message; } } iailab-plat-sdk/src/main/java/com/iailab/sdk/auth/client/common/exception/enums/GlobalErrorCodeConstants.java
对比新文件 @@ -0,0 +1,44 @@ package com.iailab.sdk.auth.client.common.exception.enums; import com.iailab.sdk.auth.client.common.exception.ErrorCode; /** * 全局错误码枚举 * 0-999 系统异常编码保留 * * 一般情况下,使用 HTTP 响应状态码 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status * 虽然说,HTTP 响应状态码作为业务使用表达能力偏弱,但是使用在系统层面还是非常不错的 * 比较特殊的是,因为之前一直使用 0 作为成功,就不使用 200 啦。 * * @author iailab */ public interface GlobalErrorCodeConstants { ErrorCode SUCCESS = new ErrorCode(0, "成功"); // ========== 客户端错误段 ========== ErrorCode BAD_REQUEST = new ErrorCode(400, "请求参数不正确"); ErrorCode UNAUTHORIZED = new ErrorCode(401, "账号未登录"); ErrorCode FORBIDDEN = new ErrorCode(403, "没有该操作权限"); ErrorCode NOT_FOUND = new ErrorCode(404, "请求未找到"); ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确"); ErrorCode DATA_REPETITION = new ErrorCode(406, "数据库存在重复数据"); ErrorCode LOCKED = new ErrorCode(423, "请求失败,请稍后重试"); // 并发请求,不允许 ErrorCode TOO_MANY_REQUESTS = new ErrorCode(429, "请求过于频繁,请稍后重试"); // ========== 服务端错误段 ========== ErrorCode INTERNAL_SERVER_ERROR = new ErrorCode(500, "系统异常"); ErrorCode NOT_IMPLEMENTED = new ErrorCode(501, "功能未实现/未开启"); ErrorCode ERROR_CONFIGURATION = new ErrorCode(502, "错误的配置项"); // ========== 自定义错误段 ========== ErrorCode REPEATED_REQUESTS = new ErrorCode(900, "重复请求,请稍后重试"); // 重复请求 ErrorCode DEMO_DENY = new ErrorCode(901, "演示模式,禁止写操作"); ErrorCode EMPTY_RESP = new ErrorCode(992, "结果为空"); ErrorCode UNKNOWN = new ErrorCode(999, "未知错误"); } iailab-plat-sdk/src/main/java/com/iailab/sdk/auth/client/common/exception/package-info.java
对比新文件 @@ -0,0 +1 @@ package com.iailab.sdk.auth.client.common.exception; iailab-plat-sdk/src/main/java/com/iailab/sdk/auth/client/common/package-info.java
对比新文件 @@ -0,0 +1 @@ package com.iailab.sdk.auth.client.common; iailab-plat-sdk/src/main/java/com/iailab/sdk/auth/client/common/pojo/CommonResult.java
对比新文件 @@ -0,0 +1,55 @@ package com.iailab.sdk.auth.client.common.pojo; import com.iailab.sdk.auth.client.common.exception.ErrorCode; import com.iailab.sdk.auth.client.common.exception.enums.GlobalErrorCodeConstants; import lombok.Data; import java.io.Serializable; /** * 通用返回 * * @param <T> 数据泛型 */ @Data public class CommonResult<T> implements Serializable { /** * 错误码 * * @see ErrorCode#getCode() */ private Integer code; /** * 返回数据 */ private T data; /** * 错误提示,用户可阅读 * * @see ErrorCode#getMsg() () */ private String msg; public static <T> CommonResult<T> error(Integer code, String message) { CommonResult<T> result = new CommonResult<>(); result.code = code; result.msg = message; return result; } public static <T> CommonResult<T> error(ErrorCode errorCode) { return error(errorCode.getCode(), errorCode.getMsg()); } public static <T> CommonResult<T> success(T data) { CommonResult<T> result = new CommonResult<>(); result.code = GlobalErrorCodeConstants.SUCCESS.getCode(); result.data = data; result.msg = ""; return result; } } iailab-plat-sdk/src/main/java/com/iailab/sdk/auth/client/common/pojo/PageParam.java
对比新文件 @@ -0,0 +1,39 @@ package com.iailab.sdk.auth.client.common.pojo; import java.io.Serializable; /** * 分页参数 */ public class PageParam implements Serializable { private static final Integer PAGE_NO = 1; private static final Integer PAGE_SIZE = 10; /** * 每页条数 - 不分页 * * 例如说,导出接口,可以设置 {@link #pageSize} 为 -1 不分页,查询所有数据。 */ public static final Integer PAGE_SIZE_NONE = -1; private Integer pageNo = PAGE_NO; private Integer pageSize = PAGE_SIZE; public Integer getPageNo() { return pageNo; } public void setPageNo(Integer pageNo) { this.pageNo = pageNo; } public Integer getPageSize() { return pageSize; } public void setPageSize(Integer pageSize) { this.pageSize = pageSize; } } iailab-plat-sdk/src/main/java/com/iailab/sdk/auth/client/common/pojo/PageResult.java
对比新文件 @@ -0,0 +1,49 @@ package com.iailab.sdk.auth.client.common.pojo; import java.io.Serializable; import java.util.ArrayList; import java.util.List; public final class PageResult<T> implements Serializable { private List<T> list; private Long total; public PageResult() { } public PageResult(List<T> list, Long total) { this.list = list; this.total = total; } public PageResult(Long total) { this.list = new ArrayList<>(); this.total = total; } public static <T> PageResult<T> empty() { return new PageResult<>(0L); } public static <T> PageResult<T> empty(Long total) { return new PageResult<>(total); } public List<T> getList() { return list; } public void setList(List<T> list) { this.list = list; } public Long getTotal() { return total; } public void setTotal(Long total) { this.total = total; } } iailab-plat-sdk/src/main/java/com/iailab/sdk/auth/client/dto/ApiPointsValueQueryDTO.java
对比新文件 @@ -0,0 +1,48 @@ package com.iailab.sdk.auth.client.dto; import com.fasterxml.jackson.annotation.JsonFormat; import java.io.Serializable; import java.util.Date; import java.util.List; /** * @author PanZhibao * @Description * @createTime 2024年11月24日 */ public class ApiPointsValueQueryDTO implements Serializable { private static final long serialVersionUID = 1L; private List<String> pointNos; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date start; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date end; public List<String> getPointNos() { return pointNos; } public void setPointNos(List<String> pointNos) { this.pointNos = pointNos; } public Date getStart() { return start; } public void setStart(Date start) { this.start = start; } public Date getEnd() { return end; } public void setEnd(Date end) { this.end = end; } } iailab-plat-sdk/src/main/java/com/iailab/sdk/auth/client/dto/StAlarmAndSuggestPageReqDTO.java
对比新文件 @@ -0,0 +1,83 @@ package com.iailab.sdk.auth.client.dto; import com.iailab.sdk.auth.client.common.pojo.PageParam; import java.util.List; /** * @author PanZhibao * @Description * @createTime 2025年01月07日 */ public class StAlarmAndSuggestPageReqDTO extends PageParam { private static final long serialVersionUID = 1L; /** * 查询对象 */ private String obj; /** * 查询对象列表 */ private List<String> objList; /** * 类型(alarm:预警,suggest:建议) */ private String type; /** * 开始时间 * yyyy-MM-dd HH:mm:ss */ private String startTime; /** * 结束时间 * yyyy-MM-dd HH:mm:ss */ private String endTime; public String getObj() { return obj; } public void setObj(String obj) { this.obj = obj; } public List<String> getObjList() { return objList; } public void setObjList(List<String> objList) { this.objList = objList; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getStartTime() { return startTime; } public void setStartTime(String startTime) { this.startTime = startTime; } public String getEndTime() { return endTime; } public void setEndTime(String endTime) { this.endTime = endTime; } } iailab-plat-sdk/src/main/java/com/iailab/sdk/auth/client/dto/StAlarmAndSuggestRespDTO.java
对比新文件 @@ -0,0 +1,81 @@ package com.iailab.sdk.auth.client.dto; import com.fasterxml.jackson.annotation.JsonFormat; import java.io.Serializable; import java.util.Date; /** * @author PanZhibao * @Description * @createTime 2025年01月07日 */ public class StAlarmAndSuggestRespDTO implements Serializable { private static final long serialVersionUID = 1L; /** * 类型(预警:alarm,建议:suggest) */ private String type; /** * 标题 */ private String title; /** * 内容 */ private String content; /** * 对象 */ private String obj; /** * 时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date time; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getObj() { return obj; } public void setObj(String obj) { this.obj = obj; } public Date getTime() { return time; } public void setTime(Date time) { this.time = time; } } iailab-plat-sdk/src/test/java/com/iailab/sdk/IailabClientTest.java
@@ -1,6 +1,7 @@ package com.iailab.sdk; import com.iailab.sdk.auth.client.IailabAuthClient; import com.iailab.sdk.auth.client.common.pojo.CommonResult; import com.iailab.sdk.auth.client.dto.ApiDataQueryDTO; import org.junit.Test; import org.junit.runner.RunWith; @@ -48,23 +49,10 @@ } @Test public void testQueryPlanChart() throws Exception { ApiDataQueryDTO apiDataQueryDTO = new ApiDataQueryDTO(); List<String> itemNos = new ArrayList<>(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); apiDataQueryDTO.setStart(sdf.parse("2024-06-11 07:24:00")); apiDataQueryDTO.setEnd(sdf.parse("2024-06-13 00:00:00")); itemNos.add("P0000100010"); apiDataQueryDTO.setItemNos(itemNos); Map<String, Object> stringObjectMap = IailabAuthClient.getInstance().queryPlanChart(apiDataQueryDTO); System.out.println(stringObjectMap); } @Test public void testQueryPointsRealValue() throws Exception { public void testQueryPointsRealValue() { List<String> pointNos = new ArrayList<>(); pointNos.add("111"); Map<String, Object> stringObjectMap = IailabAuthClient.getInstance().queryPointsRealValue(pointNos); CommonResult<Map<String, Object>> stringObjectMap = IailabAuthClient.getInstance().queryPointsRealValue(pointNos); System.out.println(stringObjectMap); }