diff --git a/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/config/HttpClientConfig.java b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/config/HttpClientConfig.java deleted file mode 100644 index 5652f4f..0000000 --- a/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/config/HttpClientConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.jeelowcode.module.biz.config; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -/** - * HttpClient配置类 - * - * @author lingma - */ -@Configuration -public class HttpClientConfig { - - @Bean - @ConditionalOnMissingBean - public RestTemplate restTemplate() { - return new RestTemplate(); - } - -} \ No newline at end of file diff --git a/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvAccessTokenDataDTO.java b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvAccessTokenDataDTO.java new file mode 100644 index 0000000..55d14c5 --- /dev/null +++ b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvAccessTokenDataDTO.java @@ -0,0 +1,32 @@ +package com.jeelowcode.module.biz.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 动环系统访问令牌数据DTO + * + * @author yangchenjj + */ +@Data +@Accessors(chain = true) +@Schema(description = "动环系统访问令牌数据DTO") +public class PowerEnvAccessTokenDataDTO { + + /** + * 访问令牌 + */ + @JsonProperty("access_token") + @Schema(description = "访问令牌") + private String accessToken; + + /** + * 访问令牌过期时间 + */ + @JsonProperty("expires_in") + @Schema(description = "访问令牌过期时间") + private Long expiresIn; + +} diff --git a/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvBuildingDataDTO.java b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvBuildingDataDTO.java new file mode 100644 index 0000000..dd92d95 --- /dev/null +++ b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvBuildingDataDTO.java @@ -0,0 +1,7 @@ +package com.jeelowcode.module.biz.dto; + +// todo 待完善 +public class PowerEnvBuildingDataDTO { + + +} diff --git a/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvBuildingParamsDTO.java b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvBuildingParamsDTO.java new file mode 100644 index 0000000..2a0548c --- /dev/null +++ b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvBuildingParamsDTO.java @@ -0,0 +1,47 @@ +package com.jeelowcode.module.biz.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 动环系统建筑请求参数DTO + * + * @author yangchenjj + */ +@Data +@Accessors(chain = true) +@Schema(description = "动环系统建筑请求参数DTO") +public class PowerEnvBuildingParamsDTO { + + /** + * 每页数量 + */ + @Schema(description = "每页数量") + private String pageSize; + + /** + * 页码 + */ + @Schema(description = "页码") + private String page; + + /** + * 园区编号 + */ + @Schema(description = "园区编号") + private String campusId; + + /** + * 关键字 + */ + @Schema(description = "关键字") + private String key; + + /** + * 状态(0:停用,1:启用) + */ + @Schema(description = "状态(0:停用,1:启用)") + private String status; + +} diff --git a/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvCampusDataDTO.java b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvCampusDataDTO.java new file mode 100644 index 0000000..a7ec56a --- /dev/null +++ b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvCampusDataDTO.java @@ -0,0 +1,9 @@ +package com.jeelowcode.module.biz.dto; + +import lombok.Data; + +// todo 待完善 +@Data +public class PowerEnvCampusDataDTO { + +} diff --git a/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvCampusParamsDTO.java b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvCampusParamsDTO.java new file mode 100644 index 0000000..875ca7a --- /dev/null +++ b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvCampusParamsDTO.java @@ -0,0 +1,41 @@ +package com.jeelowcode.module.biz.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 动环系统园区请求参数DTO + * + * @author yangchenjj + */ +@Data +@Accessors(chain = true) +@Schema(description = "动环系统园区请求参数DTO") +public class PowerEnvCampusParamsDTO { + + /** + * 每页数量 + */ + @Schema(description = "每页数量") + private String pageSize; + + /** + * 页码 + */ + @Schema(description = "页码") + private String page; + + /** + * 关键字 + */ + @Schema(description = "关键字") + private String key; + + /** + * 状态(0:停用,1:启用) + */ + @Schema(description = "状态(0:停用,1:启用)") + private String status; + +} diff --git a/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvDeviceDataDTO.java b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvDeviceDataDTO.java new file mode 100644 index 0000000..ec0f4d3 --- /dev/null +++ b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvDeviceDataDTO.java @@ -0,0 +1,31 @@ +package com.jeelowcode.module.biz.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 动环系统设备信息数据 + * + * @author yangchenjj + */ +@Data +@Accessors(chain = true) +@Schema(description = "动环系统设备信息数据") +public class PowerEnvDeviceDataDTO { + + /** + * 设备唯一标识 + */ + @Schema(description = "设备唯一标识") + private String deviceUid; + + /** + * 设备运行数据列表 + */ + @Schema(description = "设备运行数据列表") + private List propertyRunDataList; + +} diff --git a/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvDeviceMetricDataDTO.java b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvDeviceMetricDataDTO.java new file mode 100644 index 0000000..c1ea2f8 --- /dev/null +++ b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvDeviceMetricDataDTO.java @@ -0,0 +1,74 @@ +package com.jeelowcode.module.biz.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 动环系统设备运行数据DTO + * + * @author yangchenjj + */ +@Data +@Accessors(chain = true) +@Schema(description = "动环系统设备运行数据DTO") +public class PowerEnvDeviceMetricDataDTO { + + /** + * 设备运行数据ID + */ + @Schema(description = "设备运行数据ID") + private String metadataUid; + + /** + * 设备运行数据编码 + */ + @Schema(description = "设备运行数据编码") + private String metadataCode; + /** + * 设备运行数据名称 + */ + @Schema(description = "设备运行数据名称") + private String metadataName; + /** + * 设备运行数据属性编码 + */ + @Schema(description = "设备运行数据属性编码") + private String propertyCode; + /** + * 设备运行数据属性名称 + */ + @Schema(description = "设备运行数据属性名称") + private String propertyName; + /** + * 设备运行数据单位编码 + */ + @Schema(description = "设备运行数据单位编码") + private String unitCode; + /** + * 设备运行数据值类型 + */ + @Schema(description = "设备运行数据值类型") + private Integer valueType; + /** + * 设备运行数据更新时间 + */ + @Schema(description = "设备运行数据更新时间") + private Long updateTime; + /** + * 设备运行点位类型 + */ + @Schema(description = "设备运行点位类型") + private Integer type; + /** + * 设备运行数据值 + */ + @Schema(description = "设备运行数据值") + private String value; + /** + * 设备运行数据控制枚举值 + */ + @Schema(description = "设备运行数据控制枚举值") + private String controlEnumValue; + +} diff --git a/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvRequestParamsDTO.java b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvRequestParamsDTO.java new file mode 100644 index 0000000..ee6f1cd --- /dev/null +++ b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvRequestParamsDTO.java @@ -0,0 +1,89 @@ +package com.jeelowcode.module.biz.dto; + +import com.google.common.collect.Lists; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 动环请求参数 + * + * @param

参数值 + */ +@Data +@Accessors(chain = true) +@Schema(description = "动环系统请求参数DTO") +public class PowerEnvRequestParamsDTO

{ + + /** + * 获取校区列表接口地址 + */ + private final static String API_LIST_CAMPUS = "/space/campus/list"; + + /** + * 获取楼栋列表接口地址 + */ + private final static String API_LIST_BUILDING = "/space/building/list"; + + /** + * 获取设备运行数据接口地址 + */ + private final static String API_LIST_DEVICE_RUN_DATA = "/device/device/getDeviceRunData"; + + /** + * 接口地址 + */ + @Schema(description = "接口地址") + private String api; + + /** + * 请求参数 + */ + @Schema(description = "参数值") + private List

params; + + /** + * 构建请求参数对象 + * + * @param api 接口地址 + * @param param 请求参数 + * @param

参数类型 + * @return PowerEnvRequestParamsDTO

请求参数对象 + */ + public static

PowerEnvRequestParamsDTO

buildRequestParams(String api, P param) { + return new PowerEnvRequestParamsDTO

().setApi(api).setParams(Lists.newArrayList(param)); + } + + /** + * 构建获取校区列表的请求参数对象 + * + * @param param 校区参数 + * @return PowerEnvRequestParamsDTO 请求参数对象 + */ + public static PowerEnvRequestParamsDTO buildCampusRequestParams(PowerEnvCampusParamsDTO param) { + return buildRequestParams(API_LIST_CAMPUS, param); + } + + /** + * 构建获取楼栋列表的请求参数对象 + * + * @param param 楼栋参数 + * @return PowerEnvRequestParamsDTO 请求参数对象 + */ + public static PowerEnvRequestParamsDTO buildBuildingRequestParams(PowerEnvBuildingParamsDTO param) { + return buildRequestParams(API_LIST_BUILDING, param); + } + + /** + * 构建获取设备运行数据的请求参数对象 + * + * @param param 设备运行数据参数 + * @return PowerEnvRequestParamsDTO 请求参数对象 + */ + public static PowerEnvRequestParamsDTO buildDeviceRunDataRequestParams(String param) { + return buildRequestParams(API_LIST_DEVICE_RUN_DATA, param); + } + +} diff --git a/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvResponseDataDTO.java b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvResponseDataDTO.java new file mode 100644 index 0000000..449083d --- /dev/null +++ b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/dto/PowerEnvResponseDataDTO.java @@ -0,0 +1,45 @@ +package com.jeelowcode.module.biz.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 动环系统接口响应体 + * + * @author yangchenjj + */ +@Data +@Accessors(chain = true) +@Schema(description = "动环系统接口响应体") +public class PowerEnvResponseDataDTO { + + /** + * 响应消息 + */ + @Schema(description = "响应消息") + private String msg; + /** + * 响应码 + */ + @Schema(description = "响应码") + private String code; + /** + * 请求ID + */ + @Schema(description = "请求ID") + private String requestId; + /** + * 是否成功 + */ + @Schema(description = "是否成功") + private Boolean success; + /** + * 响应内容 + */ + @Schema(description = "响应内容") + private List content; + +} diff --git a/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/http/RetryableHttpClient.java b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/http/RetryableHttpClient.java index 3209468..5158b48 100644 --- a/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/http/RetryableHttpClient.java +++ b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/http/RetryableHttpClient.java @@ -1,9 +1,14 @@ package com.jeelowcode.module.biz.http; import cn.hutool.core.convert.Convert; +import com.jeelowcode.module.biz.dto.PowerEnvRequestParamsDTO; +import com.jeelowcode.module.biz.dto.PowerEnvResponseDataDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.HttpClientErrorException; @@ -20,23 +25,24 @@ import java.util.concurrent.locks.ReentrantLock; */ @Slf4j @Component -@ConditionalOnProperty( - name = "jeelowcode.powerenv.baseurl", matchIfMissing = true) +@ConditionalOnProperty(name = "jeelowcode.powerenv.baseurl") public class RetryableHttpClient { @Value("${jeelowcode.powerenv.baseurl}") private String baseUrl; + @Value("${jeelowcode.powerenv.appKey:campusT0Yoh1U6tXD3ZVXy}") + private String appKey; + + @Value("${jeelowcode.powerenv.appSecret:3d4d89b5-8a14-4b83-a9aa-715bdc8264a1}") + private String appSecret; + // 访问令牌URL private static final String ACCESS_TOKEN_URL = "/_campus/open/accessToken.json"; // API接口URL private static final String API_URL = "/_campus/open/api/invoked.json"; - // 应用凭证 - private static final String APP_KEY = "campusT0Yoh1U6tXD3ZVXy"; - private static final String APP_SECRET = "3d4d89b5-8a14-4b83-a9aa-715bdc8264a1"; - // 存储访问令牌及相关信息 private volatile String accessToken; private volatile long tokenExpireTime; @@ -44,7 +50,6 @@ public class RetryableHttpClient { // 用于保护令牌更新操作的锁 private final ReentrantLock tokenLock = new ReentrantLock(); - // RestTemplate实例 @Resource private RestTemplate restTemplate; @@ -55,28 +60,32 @@ public class RetryableHttpClient { } /** - * 获取API数据 + * 发送GET请求并获取响应数据 * - * @return ResponseEntity 响应结果 + * @param apiPath API接口路径 + * @param requestParams 请求参数 + * @return 响应数据 */ - public ResponseEntity getApiData() { + public ResponseEntity> getData( + String apiPath, PowerEnvRequestParamsDTO requestParams) { // 检查令牌是否过期,如果过期则刷新 if (isTokenExpired()) { refreshAccessToken(); } - // 构建带access_token参数的URL - String url = API_URL + "?access_token=" + accessToken; - + String url = baseUrl + API_URL + "?access_token=" + accessToken; try { - // 尝试请求API - return restTemplate.getForEntity(url, String.class); + return restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(requestParams), + new ParameterizedTypeReference>() { + }); } catch (HttpClientErrorException.Unauthorized e) { log.warn("API请求未授权,尝试刷新访问令牌后重试"); // 如果是401未授权错误,则刷新令牌后重试 refreshAccessToken(); - url = API_URL + "?access_token=" + accessToken; - return restTemplate.getForEntity(url, String.class); + url = baseUrl + API_URL + "?access_token=" + accessToken; + return restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(requestParams), + new ParameterizedTypeReference>() { + }); } catch (Exception e) { log.error("请求API时发生异常", e); throw e; @@ -97,7 +106,7 @@ public class RetryableHttpClient { log.info("开始刷新访问令牌"); // 构造获取令牌的参数 - String tokenUrl = baseUrl + ACCESS_TOKEN_URL + "?appKey=" + APP_KEY + "&" + APP_SECRET; + String tokenUrl = baseUrl + ACCESS_TOKEN_URL + "?appKey=" + appKey + "&" + appSecret; try { // 请求访问令牌 diff --git a/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/service/IBizHttpClientService.java b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/service/IBizHttpClientService.java index db25ecb..d7b44ba 100644 --- a/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/service/IBizHttpClientService.java +++ b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/service/IBizHttpClientService.java @@ -1,7 +1,5 @@ package com.jeelowcode.module.biz.service; -import org.springframework.http.ResponseEntity; - /** * 业务HTTP客户端服务接口 * @@ -9,10 +7,5 @@ import org.springframework.http.ResponseEntity; */ public interface IBizHttpClientService { - /** - * 获取API数据 - * - * @return ResponseEntity 响应结果 - */ - ResponseEntity getApiData(); + } \ No newline at end of file diff --git a/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/service/impl/BizHttpClientServiceImpl.java b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/service/impl/BizHttpClientServiceImpl.java index 58345d0..3e2a9c1 100644 --- a/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/service/impl/BizHttpClientServiceImpl.java +++ b/jeelowcode-module/jeelowcode-module-biz/src/main/java/com/jeelowcode/module/biz/service/impl/BizHttpClientServiceImpl.java @@ -2,7 +2,7 @@ package com.jeelowcode.module.biz.service.impl; import com.jeelowcode.module.biz.http.RetryableHttpClient; import com.jeelowcode.module.biz.service.IBizHttpClientService; -import org.springframework.http.ResponseEntity; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -13,14 +13,10 @@ import javax.annotation.Resource; * @author lingma */ @Service +@ConditionalOnProperty(name = "jeelowcode.powerenv.baseurl") public class BizHttpClientServiceImpl implements IBizHttpClientService { @Resource private RetryableHttpClient retryableHttpClient; - @Override - public ResponseEntity getApiData() { - return retryableHttpClient.getApiData(); - } - } \ No newline at end of file