diff --git a/pom.xml b/pom.xml
index 832920e0..c51fcd9f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -63,7 +63,11 @@
commons-beanutils
1.9.4
-
+
+ io.github.openfeign
+ feign-core
+ 13.2.1
+
org.lionsoul
diff --git a/src/main/java/cn/lihongjie/coal/emDevice/DustClientConfiguration.java b/src/main/java/cn/lihongjie/coal/emDevice/DustClientConfiguration.java
new file mode 100644
index 00000000..32efacd6
--- /dev/null
+++ b/src/main/java/cn/lihongjie/coal/emDevice/DustClientConfiguration.java
@@ -0,0 +1,27 @@
+package cn.lihongjie.coal.emDevice;
+
+import cn.lihongjie.coal.emDevice.client.DustApi;
+
+import feign.Feign;
+
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Slf4j
+@Configuration public class DustClientConfiguration {
+
+ @Autowired
+ DustConfig dustConfig;
+
+ @Bean
+ DustApi dustApi(){
+
+ DustApi target = Feign.builder().target(DustApi.class, dustConfig.getUrl());
+ log.info("dust api url: {}", dustConfig.getUrl());
+ return target;
+ }
+
+}
diff --git a/src/main/java/cn/lihongjie/coal/emDevice/DustConfig.java b/src/main/java/cn/lihongjie/coal/emDevice/DustConfig.java
new file mode 100644
index 00000000..e5f2e611
--- /dev/null
+++ b/src/main/java/cn/lihongjie/coal/emDevice/DustConfig.java
@@ -0,0 +1,20 @@
+package cn.lihongjie.coal.emDevice;
+
+import lombok.Data;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+@Component
+@ConfigurationProperties(prefix = "dust")
+@Data
+public class DustConfig {
+
+ private String url;
+
+ private Long tokenExpireMinutes;
+
+
+}
diff --git a/src/main/java/cn/lihongjie/coal/emDevice/client/DustApi.java b/src/main/java/cn/lihongjie/coal/emDevice/client/DustApi.java
new file mode 100644
index 00000000..17fdeb84
--- /dev/null
+++ b/src/main/java/cn/lihongjie/coal/emDevice/client/DustApi.java
@@ -0,0 +1,72 @@
+package cn.lihongjie.coal.emDevice.client;
+
+import feign.Headers;
+import feign.Param;
+import feign.RequestLine;
+
+import java.util.*;
+
+public interface DustApi {
+
+ @RequestLine("GET /api/getTokenByAcc?loginName={loginName}&password={password}")
+ GetTokenResponse getToken(
+ @Param("loginName") String loginName, @Param("password") String password);
+
+ @RequestLine("GET /api/data/getRealtimeData?deviceIds={deviceIds}")
+ @Headers("token: {token}")
+ GetRealtimeDataResponse getRealtimeData(@Param("token") String token, @Param("deviceIds") String deviceId);
+
+ @RequestLine("GET /api/data/getHistoryData?deviceId={deviceId}&beginTime={beginTime}&endTime={endTime}")
+ @Headers("token: {token}")
+
+ GetRealtimeDataResponse getHistoryData(@Param("token") String token, @Param("deviceId") String deviceId, @Param("beginTime") String beginTime, @Param("endTime") String endTime);
+
+ record BaseResponse(String code, String message) {}
+
+ record GetTokenData(String token, String expiration) {}
+
+ /**
+ * { "deviceId": "22005373", "status": "offline", "pm25": null, "pm10": null, "noise": null,
+ * "tem": null, "hum": null, "wp": null, "ws": null, "wd8": null, "wd360": null, "tsp": null,
+ * "atm": null, "lux": null, "co": null, "so2": null, "no2": null, "o3": null, "r1": 0, "r2": 0,
+ * "r3": 0, "r4": 0, "r5": 0, "r6": 0, "r7": 0, "r8": 0, "alarmInfos": [] }
+ */
+ record DeviceData(
+ String deviceId,
+ String status,
+ Double pm25,
+ Double pm10,
+ Double noise,
+ Double tem,
+ Double hum,
+ Double wp,
+ Double ws,
+ Double wd8,
+ Double wd360,
+ Double tsp,
+ Double atm,
+ Double lux,
+ Double co,
+ Double so2,
+ Double no2,
+ Double o3,
+ Integer r1,
+ Integer r2,
+ Integer r3,
+ Integer r4,
+ Integer r5,
+ Integer r6,
+ Integer r7,
+ Integer r8,
+ String recordId,
+ String recordTime,
+ String strtime
+
+
+ ) {}
+
+ record GetTokenResponse(String code, String message, GetTokenData data) {}
+
+ record GetRealtimeDataResponse(String code, String message, List data) {}
+
+}
diff --git a/src/main/java/cn/lihongjie/coal/emDevice/service/EmDeviceService.java b/src/main/java/cn/lihongjie/coal/emDevice/service/EmDeviceService.java
index 3aad3bb2..10f029a3 100644
--- a/src/main/java/cn/lihongjie/coal/emDevice/service/EmDeviceService.java
+++ b/src/main/java/cn/lihongjie/coal/emDevice/service/EmDeviceService.java
@@ -2,19 +2,27 @@ package cn.lihongjie.coal.emDevice.service;
import cn.lihongjie.coal.base.dto.CommonQuery;
import cn.lihongjie.coal.base.dto.IdRequest;
+import cn.lihongjie.coal.base.entity.CommonEntity;
import cn.lihongjie.coal.base.service.BaseService;
import cn.lihongjie.coal.common.ArchiveUtils;
import cn.lihongjie.coal.dbFunctions.DbFunctionService;
+import cn.lihongjie.coal.emDevice.client.DustApi;
import cn.lihongjie.coal.emDevice.dto.CreateEmDeviceDto;
import cn.lihongjie.coal.emDevice.dto.EmDeviceDto;
import cn.lihongjie.coal.emDevice.dto.UpdateEmDeviceDto;
import cn.lihongjie.coal.emDevice.entity.EmDeviceEntity;
import cn.lihongjie.coal.emDevice.mapper.EmDeviceMapper;
import cn.lihongjie.coal.emDevice.repository.EmDeviceRepository;
+import cn.lihongjie.coal.emDeviceData.entity.EmDeviceDataEntity;
+import cn.lihongjie.coal.emDeviceData.mapper.EmDeviceDataMapper;
+import cn.lihongjie.coal.emDeviceData.service.EmDeviceDataService;
import cn.lihongjie.coal.exception.BizException;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.ConversionService;
import org.springframework.data.domain.Page;
@@ -23,6 +31,11 @@ import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
@Service
@Slf4j
@Transactional
@@ -117,4 +130,85 @@ public class EmDeviceService extends BaseService x.setArchiveStatus("0"))
.forEach(this.repository::save);
}
+
+ @Autowired DustApi dustApi;
+
+ @Autowired EmDeviceDataService emDeviceDataService;
+
+ @Autowired
+ EmDeviceDataMapper emDeviceDataMapper;
+ public void queryRealtimeData() {
+
+ List all = this.repository.findAll();
+
+ Map> groupByAccount =
+ all.stream()
+ .filter(x -> x.getThirdAccount() != null)
+ .filter(x -> StringUtils.isNotEmpty(x.getCode()))
+ .collect(Collectors.groupingBy(d -> d.getThirdAccount().getId()));
+
+ Map codeMap = all.stream().collect(Collectors.toMap(e -> e.getCode(), e -> e));
+
+ for (List devices : groupByAccount.values()) {
+
+ DustApi.GetRealtimeDataResponse realtimeData;
+ String deviceIds = devices.stream().map(CommonEntity::getCode).collect(Collectors.joining(","));
+
+ try {
+
+ realtimeData = dustApi.getRealtimeData(devices.get(0).getThirdAccount().getToken() ,deviceIds);
+
+ } catch (Exception e) {
+ log.error("get realtime data error {} ", deviceIds, e);
+ continue;
+ }
+
+ String code = realtimeData.code();
+ if (ObjectUtils.notEqual(code, "1000")) {
+ log.error(
+ "get realtime data error {} {} {}",
+ realtimeData.code(),
+ realtimeData.message(),
+ realtimeData.data());
+ continue;
+ }
+
+ List data = realtimeData.data();
+
+ if (CollectionUtils.isEmpty(data)) {
+ log.error(
+ "get realtime data empty {} {} {}",
+ realtimeData.code(),
+ realtimeData.message(),
+ realtimeData.data());
+ continue;
+ }
+
+ if (data.size() != devices.size()){
+
+ List realTimeCode = data.stream().map(DustApi.DeviceData::deviceId).collect(Collectors.toList());
+ List deviceCode = devices.stream().map(CommonEntity::getCode).collect(Collectors.toList());
+
+ log.info("device code not match {} - {} = {}",deviceCode, realTimeCode, CollectionUtils.removeAll(deviceCode, realTimeCode));
+ }
+
+ List collect = data.stream().map(x -> {
+
+
+ EmDeviceDataEntity emDeviceData = new EmDeviceDataEntity();
+ emDeviceData.setDeviceId(codeMap.get(x.deviceId()).getId());
+ emDeviceData.setOrganizationId(codeMap.get(x.deviceId()).getOrganizationId());
+ emDeviceData.setTime(LocalDateTime.now());
+ emDeviceDataMapper.updateEntity(emDeviceData, x);
+
+
+ return emDeviceData;
+
+ }).collect(Collectors.toList());
+
+ emDeviceDataService.saveAll(collect);
+
+ log.info("get realtime data success {} ", deviceIds);
+ }
+ }
}
diff --git a/src/main/java/cn/lihongjie/coal/emDeviceData/mapper/EmDeviceDataMapper.java b/src/main/java/cn/lihongjie/coal/emDeviceData/mapper/EmDeviceDataMapper.java
index 14686f31..7cee93f1 100644
--- a/src/main/java/cn/lihongjie/coal/emDeviceData/mapper/EmDeviceDataMapper.java
+++ b/src/main/java/cn/lihongjie/coal/emDeviceData/mapper/EmDeviceDataMapper.java
@@ -3,12 +3,16 @@ package cn.lihongjie.coal.emDeviceData.mapper;
import cn.lihongjie.coal.base.mapper.BaseMapper;
import cn.lihongjie.coal.base.mapper.CommonEntityMapper;
import cn.lihongjie.coal.base.mapper.CommonMapper;
+import cn.lihongjie.coal.emDevice.client.DustApi;
import cn.lihongjie.coal.emDeviceData.dto.CreateEmDeviceDataDto;
import cn.lihongjie.coal.emDeviceData.dto.EmDeviceDataDto;
import cn.lihongjie.coal.emDeviceData.dto.UpdateEmDeviceDataDto;
import cn.lihongjie.coal.emDeviceData.entity.EmDeviceDataEntity;
import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.MappingTarget;
+import org.mapstruct.Mappings;
import org.mapstruct.control.DeepClone;
@Mapper(
@@ -20,4 +24,10 @@ public interface EmDeviceDataMapper
EmDeviceDataEntity,
EmDeviceDataDto,
CreateEmDeviceDataDto,
- UpdateEmDeviceDataDto> {}
+ UpdateEmDeviceDataDto> {
+ @Mappings(
+ { @Mapping(target = "status", ignore = true),
+ @Mapping(target = "deviceId", ignore = true)}
+ )
+ void updateEntity(@MappingTarget EmDeviceDataEntity emDeviceData, DustApi.DeviceData x);
+}
diff --git a/src/main/java/cn/lihongjie/coal/thirdAccount/service/ThirdAccountService.java b/src/main/java/cn/lihongjie/coal/thirdAccount/service/ThirdAccountService.java
index f28c2dbb..ed5491b1 100644
--- a/src/main/java/cn/lihongjie/coal/thirdAccount/service/ThirdAccountService.java
+++ b/src/main/java/cn/lihongjie/coal/thirdAccount/service/ThirdAccountService.java
@@ -4,6 +4,7 @@ import cn.lihongjie.coal.base.dto.CommonQuery;
import cn.lihongjie.coal.base.dto.IdRequest;
import cn.lihongjie.coal.base.service.BaseService;
import cn.lihongjie.coal.dbFunctions.DbFunctionService;
+import cn.lihongjie.coal.emDevice.client.DustApi;
import cn.lihongjie.coal.organization.entity.OrganizationEntity;
import cn.lihongjie.coal.organization.service.OrganizationService;
import cn.lihongjie.coal.thirdAccount.dto.CreateThirdAccountDto;
@@ -25,6 +26,7 @@ import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import java.time.LocalDateTime;
import java.util.List;
@Service
@@ -87,6 +89,8 @@ public class ThirdAccountService extends BaseService