From 8157457de3fefb6cd82e2cacf439926c004daac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=BE=E5=AF=8C=E6=96=8C?= Date: Sat, 27 Sep 2025 20:01:18 +0800 Subject: [PATCH] =?UTF-8?q?feat=20(farm):=20=E5=BE=AE=E4=BF=A1=E7=AB=AF-?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=88=97=E8=A1=A8=20,=20PC=E7=AB=AF=E6=89=AB?= =?UTF-8?q?=E6=8F=8F=E4=BA=8C=E7=BB=B4=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - --- .../controller/admin/wx/WxController.java | 6 +- .../admin/wx/vo/DeviceInfoRespVO.java | 1 + .../devices/soil/BaseTokenCacheService.java | 204 ------------------ .../manager/devices/soil/SoilService.java | 186 ---------------- .../soil/dto/HistoryDataListPageReqVO.java | 109 ---------- .../soil/dto/HistoryDataListPageRespVO.java | 62 ------ .../devices/soil/dto/RealTimeDataReqVO.java | 23 -- .../devices/soil/dto/RealTimeDataRespVO.java | 68 ------ .../devices/soil/dto/SysUserDeviceReqVO.java | 24 --- .../devices/soil/dto/SysUserDeviceRespVO.java | 45 ---- .../devices/soil/dto/UserLoginReqVO.java | 18 -- .../devices/soil/dto/UserLoginRespVO.java | 32 --- .../devices/wf/dto/DevicePageReqVO.java | 24 --- .../devices/wf/dto/DevicePageRespVO.java | 51 ----- .../manager/devices/wf/dto/LoginReqVO.java | 18 -- .../manager/devices/wf/dto/LoginRespVO.java | 19 -- .../wf/dto/RealTimeDeviceDataRespVO.java | 35 --- .../wf/dto/UpdateDeviceStatusRespVO.java | 18 -- .../dto/soil}/DeviceAllInfoReqVO.java | 2 +- .../dto/soil}/DeviceAllInfoRespVO.java | 2 +- .../dto/soil}/UpdateDeviceReqVO.java | 2 +- .../dto/soil}/UpdateNodeInfoReqVO.java | 2 +- .../soil/notice}/AlarmNoticeRecordReqVO.java | 2 +- .../soil/notice}/AlarmNoticeRecordRespVO.java | 2 +- .../utils/HttpClientUtils.java | 118 ++++++++++ 25 files changed, 128 insertions(+), 945 deletions(-) delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/BaseTokenCacheService.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/SoilService.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/HistoryDataListPageReqVO.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/HistoryDataListPageRespVO.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/RealTimeDataReqVO.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/RealTimeDataRespVO.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/SysUserDeviceReqVO.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/SysUserDeviceRespVO.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/UserLoginReqVO.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/UserLoginRespVO.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/DevicePageReqVO.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/DevicePageRespVO.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/LoginReqVO.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/LoginRespVO.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/RealTimeDeviceDataRespVO.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/UpdateDeviceStatusRespVO.java rename yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/{devices/soil/dto => equipmentproducer/dto/soil}/DeviceAllInfoReqVO.java (85%) rename yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/{devices/soil/dto => equipmentproducer/dto/soil}/DeviceAllInfoRespVO.java (97%) rename yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/{devices/soil/dto => equipmentproducer/dto/soil}/UpdateDeviceReqVO.java (89%) rename yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/{devices/soil/dto => equipmentproducer/dto/soil}/UpdateNodeInfoReqVO.java (96%) rename yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/{devices/soil/dto => equipmentproducer/dto/soil/notice}/AlarmNoticeRecordReqVO.java (93%) rename yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/{devices/soil/dto => equipmentproducer/dto/soil/notice}/AlarmNoticeRecordRespVO.java (91%) create mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/utils/HttpClientUtils.java diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/wx/WxController.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/wx/WxController.java index 4aa7ca7a..06c47535 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/wx/WxController.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/wx/WxController.java @@ -155,9 +155,9 @@ public class WxController { target.setBindingStateName(BINDING_STATE_MAP.get(e.getBindingState())); target.setDevicePoint(e.getPoint()); // TODO: 2025/9/26 接入真实数据 - target.setRealData(Arrays.asList(new DeviceInfoRespVO.DeviceRealData("剩余电量", 100), - new DeviceInfoRespVO.DeviceRealData("大气湿度", 0), - new DeviceInfoRespVO.DeviceRealData("大气温度", 0) + target.setRealData(Arrays.asList(new DeviceInfoRespVO.DeviceRealData("剩余电量", 100,"%"), + new DeviceInfoRespVO.DeviceRealData("大气湿度", 0, "%HR"), + new DeviceInfoRespVO.DeviceRealData("大气温度", 0, "℃") )); return target; }).toList(); diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/wx/vo/DeviceInfoRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/wx/vo/DeviceInfoRespVO.java index 393dc663..5c40f6a3 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/wx/vo/DeviceInfoRespVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/wx/vo/DeviceInfoRespVO.java @@ -90,6 +90,7 @@ public class DeviceInfoRespVO { public static class DeviceRealData{ private String k1; private Integer v1; + private String u1; } } diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/BaseTokenCacheService.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/BaseTokenCacheService.java deleted file mode 100644 index ef0a6f6f..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/BaseTokenCacheService.java +++ /dev/null @@ -1,204 +0,0 @@ -package cn.iocoder.yudao.module.farm.manager.devices.soil; - -import cn.iocoder.yudao.module.farm.manager.devices.soil.dto.UserLoginRespVO; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - - -/** - * @description: 缓存token - * @author: binda - * @date: 2025/9/17 14:33 - */ -@Slf4j -public abstract class BaseTokenCacheService { - - // 使用ConcurrentHashMap存储token信息,key: tenantId, value: token - private final Map tokenCache = new ConcurrentHashMap<>(); - // 存储token详细信息,key: token, value: UserLoginRespVO - private final Map tokenDetailCache = new ConcurrentHashMap<>(); - - /** - * 每30分钟清理一次过期token - */ - @Scheduled(fixedRate = 30 * 60 * 1000) // 30分钟,单位毫秒 - public void cleanExpiredTokens() { - long currentTime = System.currentTimeMillis() / 1000; - int initialTokenCount = tokenDetailCache.size(); - int initialTenantCount = tokenCache.size(); - - // 清理过期的token详情 - tokenDetailCache.entrySet().removeIf(entry -> - entry.getValue() != null && entry.getValue().expDate <= currentTime - ); - - // 同步清理租户ID映射 - tokenCache.entrySet().removeIf(entry -> { - String token = entry.getValue(); - UserLoginRespVO tokenInfo = tokenDetailCache.get(token); - return tokenInfo == null || tokenInfo.expDate <= currentTime; - }); - - int finalTokenCount = tokenDetailCache.size(); - int finalTenantCount = tokenCache.size(); - int removedTokenCount = initialTokenCount - finalTokenCount; - int removedTenantCount = initialTenantCount - finalTenantCount; - - log.info("Token缓存清理完成: 清理前 {} 个token({} 租户), 清理后 {} 个token({} 租户), 移除 {} 个过期token({} 租户)", - initialTokenCount, initialTenantCount, - finalTokenCount, finalTenantCount, - removedTokenCount, removedTenantCount); - } - - /** - * 缓存token(基于租户ID) - */ - protected void cacheToken(String tenantId, UserLoginRespVO loginRespVO) { - if (tenantId != null && loginRespVO != null && loginRespVO.token != null) { - // 存储租户ID到token的映射 - tokenCache.put(tenantId, loginRespVO.token); - // 存储token详细信息 - tokenDetailCache.put(loginRespVO.token, loginRespVO); - log.debug("租户 {} 的Token已缓存: {}", tenantId, loginRespVO.token); - } - } - - protected void cacheToken(String tenantId, String token) { - tokenCache.put(tenantId, token); - } - - /** - * 根据租户ID获取token - */ - protected String getTokenByTenantId(String tenantId) { - String token = tokenCache.get(tenantId); - if (token != null && isTokenValid(token)) { - log.debug("获取租户 {} 的Token: {}", tenantId, token); - return token; - } - // 如果token过期,移除映射 - if (token != null) { - tokenCache.remove(tenantId); - tokenDetailCache.remove(token); - log.debug("租户 {} 的Token已过期,已移除", tenantId); - } - return null; - } - - /** - * 根据租户ID获取token详细信息 - */ - protected UserLoginRespVO getTokenInfoByTenantId(String tenantId) { - String token = getTokenByTenantId(tenantId); - if (token != null) { - return tokenDetailCache.get(token); - } - return null; - } - - /** - * 根据token获取详细信息 - */ - protected UserLoginRespVO getTokenInfo(String token) { - UserLoginRespVO tokenInfo = tokenDetailCache.get(token); - if (tokenInfo != null && isTokenValid(tokenInfo)) { - return tokenInfo; - } - // 如果token过期,移除 - if (tokenInfo != null) { - removeTokenByValue(token); - } - return null; - } - - /** - * 检查租户的token是否有效 - */ - protected boolean isTokenValidByTenantId(String tenantId) { - String token = tokenCache.get(tenantId); - boolean isValid = token != null && isTokenValid(token); - log.debug("租户 {} 的Token验证结果: {}", tenantId, isValid ? "有效" : "无效"); - return isValid; - } - - /** - * 检查token是否有效 - */ - protected boolean isTokenValid(String token) { - UserLoginRespVO tokenInfo = tokenDetailCache.get(token); - boolean isValid = tokenInfo != null && isTokenValid(tokenInfo); - log.debug("Token验证结果: {} -> {}", token, isValid ? "有效" : "无效"); - return isValid; - } - - /** - * 检查token是否有效(内部方法) - */ - private boolean isTokenValid(UserLoginRespVO tokenInfo) { - long currentTime = System.currentTimeMillis() / 1000; - return tokenInfo.expDate > currentTime; - } - - /** - * 根据租户ID移除token - */ - protected void removeTokenByTenantId(String tenantId) { - String token = tokenCache.remove(tenantId); - if (token != null) { - tokenDetailCache.remove(token); - log.debug("租户 {} 的Token已移除: {}", tenantId, token); - } - } - - /** - * 根据token值移除 - */ - protected void removeTokenByValue(String token) { - // 需要找到对应的租户ID - tokenDetailCache.remove(token); - tokenCache.entrySet().removeIf(entry -> entry.getValue().equals(token)); - log.debug("Token已移除: {}", token); - } - - /** - * 获取所有租户的token数量 - */ - protected int getTenantTokenCount() { - return tokenCache.size(); - } - - /** - * 获取所有token的数量 - */ - protected int getTotalTokenCount() { - return tokenDetailCache.size(); - } - - /** - * 清理所有token - */ - protected void clearAllTokens() { - int tenantCount = tokenCache.size(); - int tokenCount = tokenDetailCache.size(); - tokenCache.clear(); - tokenDetailCache.clear(); - log.info("所有Token已清除,共清除 {} 个租户的 {} 个token", tenantCount, tokenCount); - } - - /** - * 获取租户ID列表 - */ - protected java.util.Set getAllTenantIds() { - return new java.util.HashSet<>(tokenCache.keySet()); - } - - /** - * 获取所有token信息(调试用) - */ - protected Map getTokenCache() { - return new ConcurrentHashMap<>(tokenCache); - } -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/SoilService.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/SoilService.java deleted file mode 100644 index 6f4e0d95..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/SoilService.java +++ /dev/null @@ -1,186 +0,0 @@ -package cn.iocoder.yudao.module.farm.manager.devices.soil; - -/** - * @description: 土壤墒情 - * @author: binda - * @date: 2025/9/17 10:57 - */ -//@Service -public class SoilService extends BaseTokenCacheService { -// -// private final DeviceConf deviceConf; -// private final HttpClientUtils httpClientUtils; -// -// public SoilService(DeviceConf deviceConf, HttpClientUtils httpClientUtils) { -// this.deviceConf = deviceConf; -// this.httpClientUtils = httpClientUtils; -// } -// -// private final String SOIL = "soil_"; -// -// public void userLogin() { -// String username = deviceConf.getFourSituations().getUsername(); -// String password = deviceConf.getFourSituations().getPassword(); -// -// this.userLogin(new UserLoginReqVO(username,password)); -// } -// -// /** -// * 登录获取token -// * -// * @param req -// * @return -// */ -// public UserLoginRespVO userLogin(UserLoginReqVO req) { -// String tenantId = getLoginUser().getTenantId().toString(); -// String hosts = deviceConf.getFourSituations().getHosts(); -// String userLoginURL = deviceConf.getFourSituations().getGlobal().getUrl21(); -// -// try { -// ApiResponse response = httpClientUtils.postRequest(hosts, userLoginURL, req, null, UserLoginRespVO.class); -// -// if (response.isSuccess()) { -// UserLoginRespVO data = response.getData(); -// // TODO: 2025/9/17 持久化 -// cacheToken(SOIL+tenantId, data); -// } -// -// return response.getData(); -// } catch (Exception e) { -// log.error("租户 {} 登录失败: {}", tenantId, e.getMessage(), e); -// throw exception(DEVICE_INFO_NOT_EXISTS_FOR_USER_LOGIN); -// } -// } -// -// /** -// * 验证租户token有效性 -// */ -// public boolean validateUserToken(String tenantId) { -// log.debug("验证租户 {} 的Token", tenantId); -// return isTokenValidByTenantId(SOIL+tenantId); -// } -// -// /** -// * 获取用户设备 -// */ -// public List getSysUserDevice(SysUserDeviceReqVO req) { -// -// String tenantId = getLoginUser().getTenantId().toString(); -// String token = getTokenByTenantId(tenantId); -// String hosts = deviceConf.getFourSituations().getHosts(); -// String getSysUserDeviceURL = deviceConf.getFourSituations().getGlobal().getUrl26(); -// -// Map headers = new HashMap<>(); -// headers.put("token", token); -// -// Map params = new HashMap<>(); -// params.put("groupId", StringUtils.defaultString(req.getGroupId())); -// params.put("deviceType", StringUtils.defaultString(req.getDeviceType())); -// -// try { -// -// ApiResponse> response = httpClientUtils.getRequestAsList(hosts, getSysUserDeviceURL, params, headers, SysUserDeviceRespVO.class); -// if (!response.isSuccess()) { -// throw exception(DEVICE_INFO_NOT_EXISTS_FOR_USER_DEVICE); -// } -// return response.getData(); -// } catch (Exception e) { -// e.printStackTrace(); -// throw exception(DEVICE_INFO_NOT_EXISTS_FOR_USER_DEVICE); -// } -// -// } -// -// /** -// * 获取设备实时数据 -// */ -// public List getRealTimeData(RealTimeDataReqVO req) { -// String tenantId = getLoginUser().getTenantId().toString(); -// String token = getTokenByTenantId(tenantId); -// String hosts = deviceConf.getFourSituations().getHosts(); -// String getSysUserDeviceURL = deviceConf.getFourSituations().getGlobal().getUrl27(); -// -// Map headers = new HashMap<>(); -// headers.put("token", token); -// Map params = new HashMap<>(); -// params.put("deviceAddrs", req.getDeviceAddrs()); -// -// try { -// ApiResponse> response = httpClientUtils.getRequestAsList(hosts, getSysUserDeviceURL, params, headers, RealTimeDataRespVO.class); -// if (!response.isSuccess()) { -// throw exception(DEVICE_INFO_NOT_EXISTS_FOR_REAL_TIME_DATA); -// } -// return response.getData(); -// } catch (Exception e) { -// e.printStackTrace(); -// throw exception(DEVICE_INFO_NOT_EXISTS_FOR_REAL_TIME_DATA); -// } -// -// } -// -// /** -// * 设备报警通知记录 -// */ -// public List getAlarmNoticeRecord(AlarmNoticeRecordReqVO req) { -// -// String tenantId = getLoginUser().getTenantId().toString(); -// String token = getTokenByTenantId(tenantId); -// String hosts = deviceConf.getFourSituations().getHosts(); -// String getAlarmNoticeRecord = deviceConf.getFourSituations().getGlobal().getUrl24(); -// -// Map headers = new HashMap<>(); -// headers.put("token", token); -// Map params = req.toFieldValueMap(); -// -// try { -// ApiResponse> response = httpClientUtils.getRequestAsList(hosts, getAlarmNoticeRecord, params, headers, AlarmNoticeRecordRespVO.class); -// if (!response.isSuccess()) { -// throw exception(DEVICE_INFO_NOT_EXISTS_FOR_ALARM_NOTICE_RECORD); -// } -// return response.getData(); -// } catch (Exception e) { -// e.printStackTrace(); -// throw exception(DEVICE_INFO_NOT_EXISTS_FOR_ALARM_NOTICE_RECORD); -// } -// -// } -// -// /** -// * 墒情设备, 获取设备全部信息 -// */ -// public List getDeviceAllInfo(DeviceAllInfoReqVO req) { -// -// -// return null; -// } -// -// /** -// * 墒情设备, 更新设备信息 -// */ -// public Boolean updateDevice(UpdateDeviceReqVO req) { -// -// -// return false; -// } -// -// /** -// * 墒情设备, 更新节点信息 -// */ -// public Boolean updateNodeInfo(UpdateNodeInfoReqVO req) { -// -// -// return false; -// } -// -// /** -// * 墒情设备, 获取历史数据 -// */ -// public HistoryDataListPageRespVO getHistoryDataList(HistoryDataListPageReqVO req) { -// -// -// -// return null; -// } - - -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/HistoryDataListPageReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/HistoryDataListPageReqVO.java deleted file mode 100644 index 210182a4..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/HistoryDataListPageReqVO.java +++ /dev/null @@ -1,109 +0,0 @@ -package cn.iocoder.yudao.module.farm.manager.devices.soil.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; - -/** - * @description: 墒情设备, 获取历史数据 请求实体 - * @author: binda - * @date: 2025/9/17 20:53 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class HistoryDataListPageReqVO { - /** - * 必选 - * 开始时间 (时间戳) - */ - private String beginTime; - /** - * 必选 - * 结束时间 (时间戳) - */ - private String endTime; - /** - * 必选 - * 设备地址 - */ - private String deviceAddr; - /** - * 非必选 - * 节点ID - */ - private String nodeId; - /** - * 必选 - * 页码 - */ - private Integer pages; - /** - * 必选 - * 每页数量 - */ - private Integer limit; - - public HistoryDataListPageReqVO(String beginTime, String endTime) { - this.beginTime = beginTime; - this.endTime = endTime; - } - - - public static class HistoryDataTimeRangeUtil { - - /** - * 获取近12小时的时间范围 - */ - public static HistoryDataListPageReqVO getLast12Hours() { - LocalDateTime endTime = LocalDateTime.now(); - LocalDateTime startTime = endTime.minusHours(12); - - return buildRequestVO(startTime, endTime); - } - - /** - * 获取近一天的时间范围 - */ - public static HistoryDataListPageReqVO getLast24Hours() { - LocalDateTime endTime = LocalDateTime.now(); - LocalDateTime startTime = endTime.minusDays(1); - - return buildRequestVO(startTime, endTime); - } - - /** - * 获取近三天的时间范围 - */ - public static HistoryDataListPageReqVO getLast3Days() { - LocalDateTime endTime = LocalDateTime.now(); - LocalDateTime startTime = endTime.minusDays(3); - - return buildRequestVO(startTime, endTime); - } - - /** - * 获取近七天的时间范围 - */ - public static HistoryDataListPageReqVO getLast7Days() { - LocalDateTime endTime = LocalDateTime.now(); - LocalDateTime startTime = endTime.minusDays(7); - - return buildRequestVO(startTime, endTime); - } - - /** - * 构建请求VO对象 - */ - private static HistoryDataListPageReqVO buildRequestVO(LocalDateTime startTime, LocalDateTime endTime) { - String beginTimeStamp = String.valueOf(startTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()); - String endTimeStamp = String.valueOf(endTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()); - - return new HistoryDataListPageReqVO(beginTimeStamp, endTimeStamp); - } - } -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/HistoryDataListPageRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/HistoryDataListPageRespVO.java deleted file mode 100644 index 3e4a582a..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/HistoryDataListPageRespVO.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.iocoder.yudao.module.farm.manager.devices.soil.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -/** - * @description: 墒情设备, 获取历史数据 响应实体 - * @author: binda - * @date: 2025/9/17 20:53 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class HistoryDataListPageRespVO { - /** - * 页码,每页数量,总页数,总条数 - */ - private Integer pages; - private Integer limit; - private Integer totalPages; - private Integer total; - private List rows; - - @Data - @AllArgsConstructor - @NoArgsConstructor - public static class Row{ - /** - * 记录表 id - */ - private Integer historyId; - /** - * 节点编号 - */ - private Integer nodeId; - /** - * 设备地址 - */ - private String deviceAddress; - /** - * 模拟量 1 - */ - private String temStr; - private Double temValue; - /** - * 模拟狼 2 - */ - private String humStr; - private Double humValue; - /** - * 是否是报警数据 0:正常 1:报警 - */ - private Integer alarmStatus; - /** - * 保存时间(时间戳) - */ - private Long recordTime; - } -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/RealTimeDataReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/RealTimeDataReqVO.java deleted file mode 100644 index 1ae60224..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/RealTimeDataReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.yudao.module.farm.manager.devices.soil.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -/** - * @description: 设备实时数据 请求实体 - * @author: binda - * @date: 2025/9/17 19:02 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class RealTimeDataReqVO { - /** - * 设备地址 非必定 - * tips: 多个用英文逗号分隔,空为获取当前用户下的所有设备 - */ - private String deviceAddrs; -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/RealTimeDataRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/RealTimeDataRespVO.java deleted file mode 100644 index eaaec0e8..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/RealTimeDataRespVO.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.iocoder.yudao.module.farm.manager.devices.soil.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -/** - * @description: 设备实时数据 相应试题 - * @author: binda - * @date: 2025/9/17 19:01 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class RealTimeDataRespVO { - /** - * 设备地址 - */ - private String deviceAddr; - /** - * 设备名称 - */ - private String deviceName; - /** - * 经度 - */ - private Double lat; - /** - * 维度 - */ - private Double lng; - /** - * 设备状态 - */ - private String status; - /** - * 设备类型 - */ - private String deviceType; - - private List data; - - @Data - @AllArgsConstructor - @NoArgsConstructor - public static class RealTimeData { - // 节点编号 - private Integer nodeId; - // 节点名称 - private String nodeName; - // 节点类型 - private Integer nodeType; - // 模拟量1 名称,单位,原值,显示值,报警等级 - private String temName; - private String temUnit; - private Double temValue; - private String temValueStr; - private Integer temAlarmStatus; - // 模拟量2 名称,单位,原值,显示值,报警等级 - private String humName; - private String humUnit; - private String humValue; - private String humValueStr; - private String humAlarmStatus; - } -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/SysUserDeviceReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/SysUserDeviceReqVO.java deleted file mode 100644 index b9054816..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/SysUserDeviceReqVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.yudao.module.farm.manager.devices.soil.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * @description: 获取用户设备 请求实体 - * @author: binda - * @date: 2025/9/17 15:28 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class SysUserDeviceReqVO { - /** - * 区域ID 非必填 - */ - private String groupId; - /** - * 设备类型 非必填 - */ - private String deviceType; -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/SysUserDeviceRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/SysUserDeviceRespVO.java deleted file mode 100644 index 8166901f..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/SysUserDeviceRespVO.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.iocoder.yudao.module.farm.manager.devices.soil.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * @description: 获取用户设备 响应实体 - * @author: binda - * @date: 2025/9/17 15:31 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class SysUserDeviceRespVO { - /** - * 设备地址 - */ - public String deviceAddr; - /** - * 区域ID - */ - public String groupId; - /** - * 设备类型 - */ - public String deviceType; - /** - * 设备名称 - */ - public String deviceName; - /** - * 设备的经度 - */ - public String deviceLng; - /** - * 设备的维度 - */ - public String deviceLat; - /** - * 设备iccid - */ - public String deviceIccId; - -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/UserLoginReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/UserLoginReqVO.java deleted file mode 100644 index 6550372f..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/UserLoginReqVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.iocoder.yudao.module.farm.manager.devices.soil.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * @description: 登录请求实体 - * @author: binda - * @date: 2025/9/17 13:46 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class UserLoginReqVO { - public String loginName; - public String loginPwd; -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/UserLoginRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/UserLoginRespVO.java deleted file mode 100644 index 1062527d..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/UserLoginRespVO.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.iocoder.yudao.module.farm.manager.devices.soil.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * @description: 登录响应实体 - * @author: binda - * @date: 2025/9/17 13:46 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class UserLoginRespVO { - /** - * 登录标识 - */ - public String loginSign; - /** - * token 生成时间 - */ - public long currDate; - /** - * 过期时间 - */ - public long expDate; - /** - * 令牌 - */ - public String token; -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/DevicePageReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/DevicePageReqVO.java deleted file mode 100644 index b0a47734..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/DevicePageReqVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.yudao.module.farm.manager.devices.wf.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * @description: - * @author: binda - * @date: 2025/9/25 23:07 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class DevicePageReqVO { - /** - * 令牌 必填 - */ - private String token; - /** - * 用户名 - */ - private String userCode; -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/DevicePageRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/DevicePageRespVO.java deleted file mode 100644 index 85b10775..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/DevicePageRespVO.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.iocoder.yudao.module.farm.manager.devices.wf.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.Date; -import java.util.List; - -/** - * @description: 获取设备列表 分页响应实体 - * @author: binda - * @date: 2025/9/18 14:30 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class DevicePageRespVO { - private Integer code; - private String msg; - private Integer total; - private List rows; - - @Data - @AllArgsConstructor - @NoArgsConstructor - public static class Row{ - private Long deviceId; - private Long deptId; - private String productCode; - private String productName; - private String modelCode; - private String deviceCode; - private String code; // 设备编号 - private String name; - private String farmland; - private String modelName; - private String userCode; - private Double lng; - private Double lat; - private Long farmlandId; - private String delFlag; - private String loginIp; - private Date loginDate; - private String createBy; - private Date createTime; - private String updateBy; - private Date updateTime; - private String remark; - } -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/LoginReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/LoginReqVO.java deleted file mode 100644 index 46e135eb..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/LoginReqVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.iocoder.yudao.module.farm.manager.devices.wf.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * @description: 获取公钥 请求实体 - * @author: binda - * @date: 2025/9/18 14:19 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class LoginReqVO { - private String username; - private String password; -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/LoginRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/LoginRespVO.java deleted file mode 100644 index 7646a1d3..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/LoginRespVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.module.farm.manager.devices.wf.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * @description: 获取公钥 响应实体 - * @author: binda - * @date: 2025/9/18 14:26 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class LoginRespVO { - private Integer code; - private String msg; - private String token; -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/RealTimeDeviceDataRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/RealTimeDeviceDataRespVO.java deleted file mode 100644 index 223ed3f0..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/RealTimeDeviceDataRespVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.iocoder.yudao.module.farm.manager.devices.wf.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -/** - * @description: 设备实时数据 - * @author: binda - * @date: 2025/9/18 14:38 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class RealTimeDeviceDataRespVO { - private String deviceId; - private String name; - private String stateText; // 是否在线 中文 - private String stateValue; // 是否在线 编码 online - private List controlProperties; - - @Data - @AllArgsConstructor - @NoArgsConstructor - public static class ControlProperty { - private String id; // 开关标识 - private String name; - private String operateType; // 设备类型 - private String operateValue; - private String value; - private String formatValue; - } -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/UpdateDeviceStatusRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/UpdateDeviceStatusRespVO.java deleted file mode 100644 index 9ad6e88c..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/wf/dto/UpdateDeviceStatusRespVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.iocoder.yudao.module.farm.manager.devices.wf.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * @description: 更改设备属性 响应实体 - * @author: binda - * @date: 2025/9/18 14:45 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class UpdateDeviceStatusRespVO { - private Integer code; - private String msg; -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/DeviceAllInfoReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/DeviceAllInfoReqVO.java similarity index 85% rename from yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/DeviceAllInfoReqVO.java rename to yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/DeviceAllInfoReqVO.java index 14e082ad..7e276b98 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/DeviceAllInfoReqVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/DeviceAllInfoReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.farm.manager.devices.soil.dto; +package cn.iocoder.yudao.module.farm.manager.equipmentproducer.dto.soil; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/DeviceAllInfoRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/DeviceAllInfoRespVO.java similarity index 97% rename from yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/DeviceAllInfoRespVO.java rename to yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/DeviceAllInfoRespVO.java index f7d71dd2..51106d09 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/DeviceAllInfoRespVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/DeviceAllInfoRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.farm.manager.devices.soil.dto; +package cn.iocoder.yudao.module.farm.manager.equipmentproducer.dto.soil; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/UpdateDeviceReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/UpdateDeviceReqVO.java similarity index 89% rename from yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/UpdateDeviceReqVO.java rename to yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/UpdateDeviceReqVO.java index ad4c0ea1..9a28f038 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/UpdateDeviceReqVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/UpdateDeviceReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.farm.manager.devices.soil.dto; +package cn.iocoder.yudao.module.farm.manager.equipmentproducer.dto.soil; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/UpdateNodeInfoReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/UpdateNodeInfoReqVO.java similarity index 96% rename from yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/UpdateNodeInfoReqVO.java rename to yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/UpdateNodeInfoReqVO.java index ea449b6e..7734d9a1 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/UpdateNodeInfoReqVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/UpdateNodeInfoReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.farm.manager.devices.soil.dto; +package cn.iocoder.yudao.module.farm.manager.equipmentproducer.dto.soil; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/AlarmNoticeRecordReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/notice/AlarmNoticeRecordReqVO.java similarity index 93% rename from yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/AlarmNoticeRecordReqVO.java rename to yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/notice/AlarmNoticeRecordReqVO.java index 08173b9d..4f4f1b72 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/AlarmNoticeRecordReqVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/notice/AlarmNoticeRecordReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.farm.manager.devices.soil.dto; +package cn.iocoder.yudao.module.farm.manager.equipmentproducer.dto.soil.notice; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/AlarmNoticeRecordRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/notice/AlarmNoticeRecordRespVO.java similarity index 91% rename from yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/AlarmNoticeRecordRespVO.java rename to yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/notice/AlarmNoticeRecordRespVO.java index db1c90f4..ddefffed 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/soil/dto/AlarmNoticeRecordRespVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/dto/soil/notice/AlarmNoticeRecordRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.farm.manager.devices.soil.dto; +package cn.iocoder.yudao.module.farm.manager.equipmentproducer.dto.soil.notice; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/utils/HttpClientUtils.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/utils/HttpClientUtils.java new file mode 100644 index 00000000..34944456 --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/equipmentproducer/utils/HttpClientUtils.java @@ -0,0 +1,118 @@ +package cn.iocoder.yudao.module.farm.manager.equipmentproducer.utils; + +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.*; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import java.util.Map; + +/** + * @description: + * @author: binda + * @date: 2025/9/27 19:38 + */ +@Component +public class HttpClientUtils { + + private final RestTemplate restTemplate; + + public HttpClientUtils(RestTemplateBuilder restTemplateBuilder) { + this.restTemplate = restTemplateBuilder.build(); + } + + /** + * GET请求 + */ + public T doGet(String url, Map headers, Map params, Class responseType) { + try { + // 设置请求头 + HttpHeaders httpHeaders = new HttpHeaders(); + if (headers != null) { + headers.forEach(httpHeaders::set); + } + + // 构建查询参数 + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url); + if (params != null) { + params.forEach((key, value) -> { + if (value != null) { + builder.queryParam(key, value.toString()); + } + }); + } + + HttpEntity entity = new HttpEntity<>(httpHeaders); + ResponseEntity response = restTemplate.exchange( + builder.build().toUri(), + HttpMethod.GET, + entity, + responseType + ); + + return response.getBody(); + } catch (Exception e) { + throw new RuntimeException("HTTP GET请求失败: " + e.getMessage(), e); + } + } + + /** + * POST请求 - JSON格式 + */ + public T doPost(String url, Map headers, Object requestBody, Class responseType) { + try { + // 设置请求头 + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON); + if (headers != null) { + headers.forEach(httpHeaders::set); + } + + HttpEntity entity = new HttpEntity<>(requestBody, httpHeaders); + ResponseEntity response = restTemplate.exchange( + url, + HttpMethod.POST, + entity, + responseType + ); + + return response.getBody(); + } catch (Exception e) { + throw new RuntimeException("HTTP POST请求失败: " + e.getMessage(), e); + } + } + + /** + * POST请求 - 表单格式 + */ + public T doPostForm(String url, Map headers, Map formData, Class responseType) { + try { + // 设置请求头 + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + if (headers != null) { + headers.forEach(httpHeaders::set); + } + + MultiValueMap body = new LinkedMultiValueMap<>(); + if (formData != null) { + formData.forEach(body::add); + } + + HttpEntity> entity = new HttpEntity<>(body, httpHeaders); + ResponseEntity response = restTemplate.exchange( + url, + HttpMethod.POST, + entity, + responseType + ); + + return response.getBody(); + } catch (Exception e) { + throw new RuntimeException("HTTP POST表单请求失败: " + e.getMessage(), e); + } + } +}