diff --git a/.gitignore b/.gitignore
index 6f99a4ea978002160b28e8dfe34b2ebaf08bcdd8..0695f856c37caf0a7da42a6838b19b85c31d687d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,219 +1,220 @@
-# Compiled class file
-*.class
-
-# Log file
-*.log
-
-# BlueJ files
-*.ctxt
-
-# Mobile Tools for Java (J2ME)
-.mtj.tmp/
-
-# Package Files #
-*.jar
-*.war
-*.nar
-*.ear
-*.zip
-*.tar.gz
-*.rar
-
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
-hs_err_pid*
-### Java template
-# Compiled class file
-
-# Log file
-
-# BlueJ files
-
-# Mobile Tools for Java (J2ME)
-
-# Package Files #
-
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
-
-### JetBrains template
-# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
-# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
-
-# User-specific stuff
-.idea/**/workspace.xml
-.idea/**/tasks.xml
-.idea/**/usage.statistics.xml
-.idea/**/dictionaries
-.idea/**/shelf
-
-# Generated files
-.idea/**/contentModel.xml
-
-# Sensitive or high-churn files
-.idea/**/dataSources/
-.idea/**/dataSources.ids
-.idea/**/dataSources.local.xml
-.idea/**/sqlDataSources.xml
-.idea/**/dynamic.xml
-.idea/**/uiDesigner.xml
-.idea/**/dbnavigator.xml
-
-# Gradle
-.idea/**/gradle.xml
-.idea/**/libraries
-
-# Gradle and Maven with auto-import
-# When using Gradle or Maven with auto-import, you should exclude module files,
-# since they will be recreated, and may cause churn. Uncomment if using
-# auto-import.
-# .idea/artifacts
-# .idea/compiler.xml
-# .idea/jarRepositories.xml
-# .idea/modules.xml
-# .idea/*.iml
-# .idea/modules
-# *.iml
-# *.ipr
-
-# CMake
-cmake-build-*/
-
-# Mongo Explorer plugin
-.idea/**/mongoSettings.xml
-
-# File-based project format
-*.iws
-
-# IntelliJ
-out/
-
-# mpeltonen/sbt-idea plugin
-.idea_modules/
-
-# JIRA plugin
-atlassian-ide-plugin.xml
-
-# Cursive Clojure plugin
-.idea/replstate.xml
-
-# Crashlytics plugin (for Android Studio and IntelliJ)
-com_crashlytics_export_strings.xml
-crashlytics.properties
-crashlytics-build.properties
-fabric.properties
-
-# Editor-based Rest Client
-.idea/httpRequests
-
-# Android studio 3.1+ serialized cache file
-.idea/caches/build_file_checksums.ser
-### Java template
-# Compiled class file
-*.class
-
-# Log file
-*.log
-
-# BlueJ files
-*.ctxt
-
-# Mobile Tools for Java (J2ME)
-.mtj.tmp/
-
-# Package Files #
-*.jar
-*.war
-*.nar
-*.ear
-*.zip
-*.tar.gz
-*.rar
-
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
-hs_err_pid*
-
-### Maven template
-target/
-pom.xml.tag
-pom.xml.releaseBackup
-pom.xml.versionsBackup
-pom.xml.next
-release.properties
-dependency-reduced-pom.xml
-buildNumber.properties
-.mvn/timing.properties
-# https://github.com/takari/maven-wrapper#usage-without-binary-jar
-.mvn/wrapper/maven-wrapper.jar
-
-### JetBrains template
-# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
-# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
-
-# User-specific stuff
-.idea/**/workspace.xml
-.idea/**/tasks.xml
-.idea/**/usage.statistics.xml
-.idea/**/dictionaries
-.idea/**/shelf
-
-# Generated files
-.idea/**/contentModel.xml
-
-# Sensitive or high-churn files
-.idea/**/dataSources/
-.idea/**/dataSources.ids
-.idea/**/dataSources.local.xml
-.idea/**/sqlDataSources.xml
-.idea/**/dynamic.xml
-.idea/**/uiDesigner.xml
-.idea/**/dbnavigator.xml
-
-# Gradle
-.idea/**/gradle.xml
-.idea/**/libraries
-
-# Gradle and Maven with auto-import
-# When using Gradle or Maven with auto-import, you should exclude module files,
-# since they will be recreated, and may cause churn. Uncomment if using
-# auto-import.
-# .idea/artifacts
-# .idea/compiler.xml
-# .idea/jarRepositories.xml
-# .idea/modules.xml
-# .idea/*.iml
-# .idea/modules
-# *.iml
-# *.ipr
-
-# CMake
-cmake-build-*/
-
-# Mongo Explorer plugin
-.idea/**/mongoSettings.xml
-
-# File-based project format
-*.iws
-
-# IntelliJ
-out/
-
-# mpeltonen/sbt-idea plugin
-.idea_modules/
-
-# JIRA plugin
-atlassian-ide-plugin.xml
-
-# Cursive Clojure plugin
-.idea/replstate.xml
-
-# Crashlytics plugin (for Android Studio and IntelliJ)
-com_crashlytics_export_strings.xml
-crashlytics.properties
-crashlytics-build.properties
-fabric.properties
-
-# Editor-based Rest Client
-.idea/httpRequests
-
-# Android studio 3.1+ serialized cache file
-.idea/caches/build_file_checksums.ser
-
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+### Java template
+# Compiled class file
+
+# Log file
+
+# BlueJ files
+
+# Mobile Tools for Java (J2ME)
+
+# Package Files #
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+
+### JetBrains template
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+### Maven template
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+# https://github.com/takari/maven-wrapper#usage-without-binary-jar
+.mvn/wrapper/maven-wrapper.jar
+
+### JetBrains template
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+.history
\ No newline at end of file
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 49f7b87ba65686d69e18d0200d1b7468ea5b7aaf..3cdc6aeda67c078c6c71aa3a7ab1db0e1e6cd724 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -24,29 +24,5 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index c0ffa7837a894d874ad3382c047a6b942ee8df19..d372e12820157e916d986328dcef3486ed4ade5a 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -33,6 +33,9 @@
+
+
+
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
deleted file mode 100644
index 797acea53eb091cf5b30518802c3073f544adeed..0000000000000000000000000000000000000000
--- a/.idea/runConfigurations.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/README.md b/README.md
index 23ad7eec14b01d84b4d353c4906c316c755f15eb..29bbe73ed773ffc1ffcbf7d8be4741b57441d7b4 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,7 @@
```xml
me.hekr.iotos
- iotos-api-sdk
+ sx-iotos-api-sdk
1.0.0-SNAPSHOT
```
diff --git a/deploy.sh b/deploy.sh
index 35bf767bd4499dae774df31a53a409fead8288f5..3d5d004ab479d011f7820fd01835ec86cd73a1c9 100755
--- a/deploy.sh
+++ b/deploy.sh
@@ -1,9 +1,9 @@
#!/bin/bash
-VERSION="1.0.10"
+VERSION="1.0.11"
echo "版本号:$VERSION"
./mvnw clean
./mvnw versions:set -DnewVersion=$VERSION
./mvnw versions:commit
./mvnw versions:update-child-modules
./mvnw clean install -P deploy -DskipTests=true
-#./mvnw clean deploy -P deploy -DskipTests=true
+./mvnw clean deploy -P deploy -DskipTests=true
diff --git a/iotos-api-sdk.iml b/iotos-api-sdk.iml
index 5cb0cc0e5aa08923048e14e970120a489bda38ec..472beaf8b3b8aa2a3b5e7f780530b964b724e1bf 100644
--- a/iotos-api-sdk.iml
+++ b/iotos-api-sdk.iml
@@ -22,10 +22,19 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index bc834deb6a7185fdb47b57f84d098b52a0b3a873..60e98ed638f77d269a1e4a7c0b44e1f718992fe6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -110,13 +110,13 @@
com.squareup.okhttp3
okhttp
- 3.13.1
+ 4.10.0
com.squareup.okhttp3
logging-interceptor
- 3.13.1
+ 4.10.0
@@ -126,6 +126,11 @@
4.13.2
test
+
+ org.springframework
+ spring-web
+ 5.3.20
+
diff --git a/src/main/java/me/hekr/iotos/api/IotClient.java b/src/main/java/me/hekr/iotos/api/IotClient.java
index ea16c7fe8b0f9517e63b9e21db4a7130505e905b..12a74149ed6f54275081d36662a47328dd4c90e4 100644
--- a/src/main/java/me/hekr/iotos/api/IotClient.java
+++ b/src/main/java/me/hekr/iotos/api/IotClient.java
@@ -2,11 +2,14 @@ package me.hekr.iotos.api;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
import java.util.concurrent.TimeUnit;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
@@ -16,21 +19,30 @@ import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import me.hekr.iotos.api.dto.AggDataQuery;
import me.hekr.iotos.api.dto.CloudSendMsgDTO;
+import me.hekr.iotos.api.dto.ConsoleProductReq;
+import me.hekr.iotos.api.dto.ConsoleUpdateProductReq;
+import me.hekr.iotos.api.dto.DataShapeScriptDTO;
import me.hekr.iotos.api.dto.DelTopoResp;
import me.hekr.iotos.api.dto.DevIdListReq;
import me.hekr.iotos.api.dto.DeviceAddReq;
import me.hekr.iotos.api.dto.DeviceAggPacketResp;
import me.hekr.iotos.api.dto.DeviceApiDTO;
+import me.hekr.iotos.api.dto.DeviceDTO;
+import me.hekr.iotos.api.dto.DevicePacketMeasurement;
import me.hekr.iotos.api.dto.DevicePacketResp;
import me.hekr.iotos.api.dto.DeviceStatusRes;
import me.hekr.iotos.api.dto.DeviceUpdateNameReq;
+import me.hekr.iotos.api.dto.DeviceUpgradeReq;
import me.hekr.iotos.api.dto.LoginRsp;
import me.hekr.iotos.api.dto.ModelProtocolDTO;
import me.hekr.iotos.api.dto.ParamValue;
import me.hekr.iotos.api.dto.ParamValueQuery;
import me.hekr.iotos.api.dto.ProductDTO;
import me.hekr.iotos.api.dto.Snapshot;
+import me.hekr.iotos.api.dto.UpgradeTaskDTO;
+import me.hekr.iotos.api.dto.UploadResult;
import me.hekr.iotos.api.dto.klink.AddTopoResp;
+import me.hekr.iotos.api.dto.klink.BatchAddTopoResp;
import me.hekr.iotos.api.dto.klink.KlinkResp;
import me.hekr.iotos.api.dto.klink.ModelData;
import me.hekr.iotos.api.dto.klink.TopoSub;
@@ -40,15 +52,23 @@ import me.hekr.iotos.api.exception.IotException;
import me.hekr.iotos.api.service.RetrofitIotService;
import me.hekr.iotos.api.util.JsonUtil;
import me.hekr.iotos.api.util.Pagec;
+import okhttp3.MediaType;
+import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
+import okhttp3.RequestBody;
import okhttp3.logging.HttpLoggingInterceptor;
import okhttp3.logging.HttpLoggingInterceptor.Level;
import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
import retrofit2.Call;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.jackson.JacksonConverterFactory;
+import retrofit2.http.Body;
+import retrofit2.http.POST;
+import retrofit2.http.Path;
+import retrofit2.http.Query;
@Slf4j
public class IotClient {
@@ -101,7 +121,9 @@ public class IotClient {
if (response.code() != 500) {
IotErrorResponse result = JsonUtil.fromJson(respStr, IotErrorResponse.class);
// 设备已经存在
- throw new IotException(result.getCode(), "IoTOS 接口调用失败," + msg);
+ IotException iotException = new IotException(result.getCode(), "IoTOS 接口调用失败," + msg);
+ iotException.setInnerErrorResp(result);
+ throw iotException;
}
}
@@ -146,6 +168,57 @@ public class IotClient {
return execute(retrofitIotService.getProtocol(pk));
}
+ public List adminGetDevicePackage(
+ String pk, String devId, Long startTime, Long endTime, String action, int page, int size) {
+ return execute(
+ retrofitIotService.adminGetDevicePackage(
+ pk, devId, startTime, endTime, action, page, size));
+ }
+
+ public Snapshot adminGetDeviceSnapshot(String pk, String devId) {
+ return execute(retrofitIotService.adminGetDeviceSnapshot(pk, devId));
+ }
+
+ public Pagec adminGetDeviceTopo(
+ String parentPk, String parentDevId, int page, int size) {
+ return execute(retrofitIotService.adminGetDeviceTopo(parentPk, parentDevId, page, size));
+ }
+
+ public AddTopoResp adminAddTopo(String pk, String devId, DeviceDTO sub) {
+ return execute(retrofitIotService.adminAddTopo(pk, devId, sub));
+ }
+
+ public DelTopoResp adminDelTopo(String pk, String devId, DeviceDTO sub) {
+ return execute(retrofitIotService.adminDelTopo(pk, devId, sub));
+ }
+
+ public BatchAddTopoResp adminBatchAddTopo(
+ String pk, String devId, boolean overwrite, MultipartFile file) {
+ try {
+ return execute(
+ retrofitIotService.adminBatchAddTopo(
+ pk,
+ devId,
+ overwrite,
+ MultipartBody.Part.createFormData(
+ "file",
+ file.getOriginalFilename(),
+ RequestBody.create(
+ MediaType.get(Objects.requireNonNull(file.getContentType())),
+ file.getBytes()))));
+ } catch (IOException e) {
+ throw new IotException(ErrorCode.FILE_ERROR.getCode(), "IoTOS 接口调用失败, 找不到文件");
+ }
+ }
+
+ public ModelProtocolDTO getAdminProtocol(String pk) {
+ return execute(retrofitIotService.getAdminProtocol(pk));
+ }
+
+ public ModelProtocolDTO adminCreateModel(String pk, ModelProtocolDTO modelProtocol) {
+ return execute(retrofitIotService.adminCreateModel(pk, modelProtocol));
+ }
+
@SneakyThrows
private Retrofit createRetrofit() {
String baseUrl = builder.host;
@@ -279,6 +352,95 @@ public class IotClient {
return execute(retrofitIotService.getProduct(page, size));
}
+ public Pagec getAdminProduct(int page, int size) {
+ return execute(retrofitIotService.getAdminProduct(page, size));
+ }
+
+ public DataShapeScriptDTO getAdminDataShape(String pk) {
+ return execute(retrofitIotService.getAdminDataShape(pk));
+ }
+
+ public DataShapeScriptDTO adminCreateOrUpdateDataShape(String pk, DataShapeScriptDTO script) {
+ return execute(retrofitIotService.adminCreateOrUpdateDataShape(pk, script));
+ }
+
+ public DeviceApiDTO getAdminDevice(String pk, String devId) {
+ return execute(retrofitIotService.getAdminDevice(pk, devId));
+ }
+
+ public DeviceApiDTO adminAddDevice(DeviceAddReq reqDto) {
+ return execute(retrofitIotService.adminAddDevice(reqDto));
+ }
+
+ public DeviceAggPacketResp adminGetDeviceStatAggLog(
+ String pk,
+ @Path("devId") String devId,
+ @Query(value = "startTime") Long startTime,
+ @Query(value = "endTime") Long endTime,
+ @Query(value = "key") String key,
+ @Query(value = "span") String span) {
+ return execute(
+ retrofitIotService.adminGetDeviceStatAggLog(pk, devId, startTime, endTime, key, span));
+ }
+
+ public List adminGetDeviceStatVersion(
+ String pk,
+ @Path("devId") String devId,
+ @Query(value = "startTime") long startTime,
+ @Query(value = "endTime") long endTime,
+ @Query(value = "key") String key) {
+ return execute(
+ retrofitIotService.adminGetDeviceStatVersion(pk, devId, startTime, endTime, key));
+ }
+
+ public UploadResult adminAddUpgradeFile(MultipartFile file) {
+ try {
+ return execute(
+ retrofitIotService.adminAddUpgradeFile(
+ MultipartBody.Part.createFormData(
+ "file",
+ file.getOriginalFilename(),
+ RequestBody.create(
+ MediaType.get(Objects.requireNonNull(file.getContentType())),
+ file.getBytes()))));
+ } catch (IOException e) {
+ throw new IotException(ErrorCode.FILE_ERROR.getCode(), "IoTOS 接口调用失败, 找不到文件");
+ }
+ }
+
+ public void adminAddUpgrade(DeviceUpgradeReq reqDto) {
+ execute(retrofitIotService.adminAddUpgrade(reqDto));
+ }
+
+ public void adminDeleteUpgrade(String pk, String id) {
+ execute(retrofitIotService.adminDeleteUpgrade(pk, id));
+ }
+
+ public void adminDisableUpgrade(String pk, String id) {
+ execute(retrofitIotService.adminDisableUpgrade(pk, id));
+ }
+
+ public void adminEnableUpgrade(String pk, String id) {
+ execute(retrofitIotService.adminEnableUpgrade(pk, id));
+ }
+
+ public Pagec adminGetUpgradeList(
+ List pkList, String type, Integer page, Integer size) {
+ return execute(retrofitIotService.adminGetUpgradeList(pkList, type, page, size));
+ }
+
+ public List getAdminProductInfoListByPks(@Query("pks") Set pks) {
+ return execute(retrofitIotService.getAdminProductInfoListByPks(pks));
+ }
+
+ public Void adminDeleteProduct(String pk) {
+ return execute(retrofitIotService.adminDeleteProduct(pk));
+ }
+
+ public List getAdminModelByPks(@Query("pks") Set pks) {
+ return execute(retrofitIotService.getAdminModelByPks(pks));
+ }
+
/**
* 获取批次下所有设备
*
@@ -293,6 +455,14 @@ public class IotClient {
return execute(retrofitIotService.getBatchDevices(pk, batchName));
}
+ public ProductDTO createProduct(ConsoleProductReq consoleProductReq) {
+ return execute(retrofitIotService.createProduct(consoleProductReq));
+ }
+
+ public ProductDTO editProduct(ConsoleUpdateProductReq consoleUpdateProductReq) {
+ return execute(retrofitIotService.editProduct(consoleUpdateProductReq));
+ }
+
/**
* 更改设备名称
*
@@ -318,6 +488,10 @@ public class IotClient {
return execute(retrofitIotService.getDeviceStatus(req));
}
+ public KlinkResp adminDeviceCloudSend(String pk, String devId, ModelData data) {
+ return execute(retrofitIotService.adminDeviceCloudSend(pk, devId, data));
+ }
+
/**
* 查询设备指标趋势
*
@@ -376,6 +550,12 @@ public class IotClient {
return execute(retrofitIotService.getDeviceList(pk, keyword, page, deviceType, online, size));
}
+ /** 超管权限获取设备列表 */
+ public Pagec getAdminDeviceList(
+ String pk, String keyword, int page, Boolean online, int size) {
+ return execute(retrofitIotService.getAdminDeviceList(pk, keyword, page, online, size));
+ }
+
/**
* 查询设备详情
*
@@ -540,6 +720,15 @@ public class IotClient {
return execute(retrofitIotService.getDeviceAggData(query.getPk(), query.getDevId(), params));
}
+ /** 获取萧山资源目录系统资源列表接口 */
+ public Object getSystem() {
+ return execute(retrofitIotService.getSystem());
+ }
+
+ /** 获取萧山资源目录下拉信息接口 */
+ public Object getCatProduct() {
+ return execute(retrofitIotService.getCatProduct());
+ }
/** */
@Data
public static class Builder {
diff --git a/src/main/java/me/hekr/iotos/api/dto/ConsoleProductReq.java b/src/main/java/me/hekr/iotos/api/dto/ConsoleProductReq.java
new file mode 100644
index 0000000000000000000000000000000000000000..e8dc8d8686edc64ce5c4d1fd6337f29c5ce6e9c4
--- /dev/null
+++ b/src/main/java/me/hekr/iotos/api/dto/ConsoleProductReq.java
@@ -0,0 +1,88 @@
+package me.hekr.iotos.api.dto;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.Size;
+import lombok.Getter;
+import lombok.Setter;
+import me.hekr.iotos.api.enums.DataCheckMode;
+import me.hekr.iotos.api.enums.DataFormat;
+import me.hekr.iotos.api.enums.DeviceLinkType;
+import me.hekr.iotos.api.enums.TransferType;
+
+@Getter
+@Setter
+public class ConsoleProductReq extends ProductDTO {
+
+ @NotBlank(message = "名称不能为空")
+ @Size(min = 2, max = 24, message = "名称长度限定2-24个字符")
+ private String name;
+
+ @NotBlank(message = "品类不能为空")
+ private String cid;
+
+ /** 联网方式 */
+ @NotEmpty
+ private DeviceLinkType deviceLinkType;
+
+ /** 数据传输类型 */
+ @NotEmpty
+ private TransferType transferType;
+
+ /** payload 业务数据格式 */
+ @NotEmpty
+ private DataFormat dataFormat;
+
+ /** 协议参数校验模式 */
+ @NotEmpty
+ private DataCheckMode dataCheckMode;
+
+ @Size(max = 24, message = "型号限定最多24个字符")
+ private String model;
+
+ @Size(max = 24, message = "品牌限定最多24个字符")
+ private String brand;
+
+ /** 是否公开 */
+ private boolean open;
+
+ private boolean hide;
+
+ private String remark;
+
+ /** 数据来源部门 */
+ private String dept;
+
+ /** 省主题 */
+ private String provinceTopic;
+
+ /** 区主题 */
+ private String districtTopic;
+
+ /** 行业分类 */
+ private String industry;
+
+ /** 数据级别 */
+ private String dataLevel;
+
+ /** 共享属性 */
+ private String shareProp;
+
+ /** 开放属性 */
+ private String openProp;
+
+ /** 资源范围描述 */
+ private String scopeDesc;
+
+ /** 信息资源描述 */
+ private String desc;
+
+ /** 周期 */
+ private String period;
+
+ /** 更新时间 */
+ private String updateTime;
+
+ /** 所属业务系统 */
+ private String businessSys;
+}
diff --git a/src/main/java/me/hekr/iotos/api/dto/ConsoleUpdateProductReq.java b/src/main/java/me/hekr/iotos/api/dto/ConsoleUpdateProductReq.java
new file mode 100644
index 0000000000000000000000000000000000000000..07db4f58f28b0d69492cc4a276bd0f405dd77a81
--- /dev/null
+++ b/src/main/java/me/hekr/iotos/api/dto/ConsoleUpdateProductReq.java
@@ -0,0 +1,80 @@
+package me.hekr.iotos.api.dto;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author: zeyang.li
+ * @create: 2019-09-05 修改产品仅支持名称和品类
+ */
+@Getter
+@Setter
+public class ConsoleUpdateProductReq {
+
+ @NotBlank(message = "PK不能为空")
+ private String pk;
+
+ @NotBlank(message = "名称不能为空")
+ @Size(min = 2, max = 24, message = "名称长度限定2-24个字符")
+ private String name;
+
+ @NotBlank(message = "品类不能为空")
+ private String cid;
+
+ @Size(max = 24, message = "型号限定最多24个字符")
+ private String model;
+
+ @Size(max = 24, message = "品牌限定最多24个字符")
+ private String brand;
+
+ /** true 公开(可以被其他账户看到并克隆产品属性),false 私有 */
+ private boolean open;
+
+ private boolean hide;
+
+ private String remark;
+
+ /** 数据来源部门 */
+ private String dept;
+
+ /** 省主题 */
+ private String provinceTopic;
+
+ /** 区主题 */
+ private String districtTopic;
+
+ /** 行业分类 */
+ private String industry;
+
+ /** 数据级别 */
+ private String dataLevel;
+
+ /** 共享属性 */
+ private String shareProp;
+
+ /** 资源领域 */
+ private String scope;
+
+ /** 开放属性 */
+ private String openProp;
+
+ /** 资源范围描述 */
+ private String scopeDesc;
+
+ /** 信息资源描述 */
+ private String desc;
+
+ /** 周期 */
+ private String period;
+
+ /** 更新时间 */
+ private String updateTime;
+
+ /** 业务系统编码 */
+ private String businessCode;
+
+ /** 所属业务系统 */
+ private String businessSys;
+}
diff --git a/src/main/java/me/hekr/iotos/api/dto/DataShapeScriptDTO.java b/src/main/java/me/hekr/iotos/api/dto/DataShapeScriptDTO.java
new file mode 100644
index 0000000000000000000000000000000000000000..dc517164d983d6c2abbc9668980dd8937834fa19
--- /dev/null
+++ b/src/main/java/me/hekr/iotos/api/dto/DataShapeScriptDTO.java
@@ -0,0 +1,23 @@
+package me.hekr.iotos.api.dto;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import java.util.Date;
+
+@Data
+@NoArgsConstructor
+public class DataShapeScriptDTO {
+
+ /** 对应的产品,必填 */
+ protected String pk;
+
+ @NotBlank protected String script;
+ /** 创建时间 */
+ protected Date createdDate;
+ /** 更新时间 */
+ protected Date updatedDate;
+
+ protected boolean enable;
+}
diff --git a/src/main/java/me/hekr/iotos/api/dto/DataValueRangeChecker.java b/src/main/java/me/hekr/iotos/api/dto/DataValueRangeChecker.java
index 0acca26258ed38f31a998f12b5761d57a29b8089..819ae74b00a3bcb283970e988acd3bb22494bc04 100644
--- a/src/main/java/me/hekr/iotos/api/dto/DataValueRangeChecker.java
+++ b/src/main/java/me/hekr/iotos/api/dto/DataValueRangeChecker.java
@@ -3,11 +3,13 @@ package me.hekr.iotos.api.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonTypeName;
+import lombok.Data;
import me.hekr.iotos.api.enums.CheckType;
import me.hekr.iotos.api.enums.DataType;
@JsonTypeName("RANGE")
@JsonInclude(Include.NON_NULL)
+@Data
public class DataValueRangeChecker implements DataValueChecker {
private ModelParamValue extends Number> max;
private ModelParamValue extends Number> min;
@@ -46,4 +48,12 @@ public class DataValueRangeChecker implements DataValueChecker {
&& this.max.getValue() != null
&& this.min.getValue() != null;
}
+
+ public void setMax(ModelParamValue extends Number> max) {
+ this.max = max;
+ }
+
+ public void setMin(ModelParamValue extends Number> min) {
+ this.min = min;
+ }
}
diff --git a/src/main/java/me/hekr/iotos/api/dto/DeviceAddReq.java b/src/main/java/me/hekr/iotos/api/dto/DeviceAddReq.java
index f52dc6f31bf61e8b9bb5949b85ac6d352495652a..5d0b5422ee3e1d260ae98966a72f5bc1abd201ae 100644
--- a/src/main/java/me/hekr/iotos/api/dto/DeviceAddReq.java
+++ b/src/main/java/me/hekr/iotos/api/dto/DeviceAddReq.java
@@ -2,6 +2,8 @@ package me.hekr.iotos.api.dto;
import lombok.Data;
+import javax.validation.constraints.NotEmpty;
+
/** 添加设备请求 */
@Data
public class DeviceAddReq {
@@ -12,4 +14,24 @@ public class DeviceAddReq {
private String pk;
/** 设备ID 必填 */
private String devId;
+
+ /** 设备地址 */
+ @NotEmpty(message = "设备地址不能为空")
+ private String address;
+
+ /** 所属镇街 */
+ @NotEmpty(message = "所属镇街不能为空")
+ private String town;
+
+ /** 所属村社 */
+ @NotEmpty(message = "所属村社不能为空")
+ private String village;
+
+ /** 经纬度 */
+ @NotEmpty(message = "经纬度不能为空")
+ private Double[] location;
+
+ /** z轴 */
+ @NotEmpty(message = "z轴不能为空")
+ private String zaxis;
}
diff --git a/src/main/java/me/hekr/iotos/api/dto/DeviceApiDTO.java b/src/main/java/me/hekr/iotos/api/dto/DeviceApiDTO.java
index b653d6753a84bef47f3edaa2c01487f80dfee5b5..55e537cac6233cf7aa97b14278d35d74db4006bb 100644
--- a/src/main/java/me/hekr/iotos/api/dto/DeviceApiDTO.java
+++ b/src/main/java/me/hekr/iotos/api/dto/DeviceApiDTO.java
@@ -89,6 +89,25 @@ public class DeviceApiDTO implements Serializable {
/** 产品型号 */
private String model;
+ /** 设备地址 */
+ private String address;
+
+ /**位置信息类别,1-楼宇 2-电梯 3-车库 4-室外*/
+ private Integer orgCode;
+
+ /** 所属镇街 */
+ private String town;
+
+ /** 所属村社 */
+ private String village;
+
+ /** 经纬度 */
+ private Double[] location;
+
+ /** z轴 */
+ private String zaxis;
+
+
/**
* 设备是否被启用
*
diff --git a/src/main/java/me/hekr/iotos/api/dto/DeviceDTO.java b/src/main/java/me/hekr/iotos/api/dto/DeviceDTO.java
index 1cfd0fe60ecf4dc0dde2076262d644161c43d61e..7e924e7dd8c4e02ec7cf7e9bbb01f68ab93b4a43 100644
--- a/src/main/java/me/hekr/iotos/api/dto/DeviceDTO.java
+++ b/src/main/java/me/hekr/iotos/api/dto/DeviceDTO.java
@@ -52,6 +52,17 @@ public class DeviceDTO implements Serializable {
protected String batchName;
protected String imei;
+ /** 直接子设备数量 */
+ private long subCount;
+
+ public long getSubCount() {
+ return subCount;
+ }
+
+ public void setSubCount(long subCount) {
+ this.subCount = subCount;
+ }
+
@JsonInclude(Include.NON_NULL)
protected Boolean gatewayOnline;
diff --git a/src/main/java/me/hekr/iotos/api/dto/DevicePacketMeasurement.java b/src/main/java/me/hekr/iotos/api/dto/DevicePacketMeasurement.java
new file mode 100644
index 0000000000000000000000000000000000000000..43d022fb94073c289190c2c23675c3fa25999a88
--- /dev/null
+++ b/src/main/java/me/hekr/iotos/api/dto/DevicePacketMeasurement.java
@@ -0,0 +1,14 @@
+package me.hekr.iotos.api.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class DevicePacketMeasurement {
+ private String pk;
+ private String devId;
+ private String key;
+ private float value;
+ private long timestamp;
+}
diff --git a/src/main/java/me/hekr/iotos/api/dto/DeviceUpgradeReq.java b/src/main/java/me/hekr/iotos/api/dto/DeviceUpgradeReq.java
new file mode 100644
index 0000000000000000000000000000000000000000..52026f94f91387f02ed9d94ba7a400de4246bf2a
--- /dev/null
+++ b/src/main/java/me/hekr/iotos/api/dto/DeviceUpgradeReq.java
@@ -0,0 +1,42 @@
+package me.hekr.iotos.api.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import me.hekr.iotos.api.enums.UpgradeType;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+@Setter
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class DeviceUpgradeReq {
+
+ @NotEmpty(message = "pk不能为空")
+ private String pk;
+
+ private UpgradeType upgradeType;
+ private String desc;
+ private String fromVersion;
+ /** (要升级到的)目标版本,必填 */
+ private String toVersion;
+
+ private String md5;
+ private String url;
+
+ /** 是不是任务版本,如果true,则代表是从任意版本都可以升级到指定版本,fromVersion失效 */
+ private boolean fromAnyVersion;
+
+ /** 是否要升级所有设备 */
+ private boolean upgradeAll;
+
+ /**
+ * 要升级的设备
+ *
+ * @see #upgradeAll 如果为true则忽略此项;否则 devIdList 不能为空
+ */
+ private List devIdList;
+}
diff --git a/src/main/java/me/hekr/iotos/api/dto/ModelCmdDTO.java b/src/main/java/me/hekr/iotos/api/dto/ModelCmdDTO.java
index 362a98ae8e372e4fb172c4aab58e81ee1b0b460d..a84bcc47b3cf1a4af630159320a28499fb1d305c 100644
--- a/src/main/java/me/hekr/iotos/api/dto/ModelCmdDTO.java
+++ b/src/main/java/me/hekr/iotos/api/dto/ModelCmdDTO.java
@@ -4,66 +4,19 @@ import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import java.io.Serializable;
import java.util.TreeSet;
+import lombok.Data;
+import lombok.NoArgsConstructor;
import me.hekr.iotos.api.enums.FrameType;
+@Data
@JsonInclude(Include.NON_NULL)
+@NoArgsConstructor
public class ModelCmdDTO implements Serializable {
private static final long serialVersionUID = -6040947199844685210L;
protected String name;
protected String cmd;
- protected String unit;
protected FrameType frameType;
protected TreeSet params;
protected String desc;
protected TreeSet tags;
-
- public TreeSet getParams() {
- return this.params == null ? new TreeSet() : this.params;
- }
-
- public ModelCmdDTO() {}
-
- public String getName() {
- return this.name;
- }
-
- public String getCmd() {
- return this.cmd;
- }
-
- public FrameType getFrameType() {
- return this.frameType;
- }
-
- public String getDesc() {
- return this.desc;
- }
-
- public TreeSet getTags() {
- return this.tags;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public void setCmd(String cmd) {
- this.cmd = cmd;
- }
-
- public void setFrameType(FrameType frameType) {
- this.frameType = frameType;
- }
-
- public void setParams(TreeSet params) {
- this.params = params;
- }
-
- public void setDesc(String desc) {
- this.desc = desc;
- }
-
- public void setTags(TreeSet tags) {
- this.tags = tags;
- }
}
diff --git a/src/main/java/me/hekr/iotos/api/dto/ModelParamDTO.java b/src/main/java/me/hekr/iotos/api/dto/ModelParamDTO.java
index d08f5b487aed5b81f51434675962b522770f69c3..83dbcac23a41d917cf19799a9ded901bd1d23130 100644
--- a/src/main/java/me/hekr/iotos/api/dto/ModelParamDTO.java
+++ b/src/main/java/me/hekr/iotos/api/dto/ModelParamDTO.java
@@ -4,89 +4,28 @@ import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import java.io.Serializable;
import java.util.TreeSet;
+import lombok.Data;
+import lombok.NoArgsConstructor;
import me.hekr.iotos.api.enums.DataType;
import me.hekr.iotos.api.enums.FrameType;
+@Data
@JsonInclude(Include.NON_NULL)
+@NoArgsConstructor
public class ModelParamDTO implements Serializable {
private static final long serialVersionUID = 5644859178187540679L;
protected String name;
protected String param;
- protected String unit;
protected DataType dataType;
protected FrameType frameType;
protected DataValueChecker checkType;
- protected String desc;
-
- protected TreeSet tags;
-
- public ModelParamDTO() {}
-
- public String getUnit() {
- return unit;
- }
-
- public void setUnit(String unit) {
- this.unit = unit;
- }
-
- public String getName() {
- return this.name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getParam() {
- return this.param;
- }
-
- public void setParam(String param) {
- this.param = param;
- }
- public DataType getDataType() {
- return this.dataType;
- }
-
- public void setDataType(DataType dataType) {
- this.dataType = dataType;
- }
-
- public FrameType getFrameType() {
- return this.frameType;
- }
-
- public void setFrameType(FrameType frameType) {
- this.frameType = frameType;
- }
-
- public DataValueChecker getCheckType() {
- return this.checkType;
- }
-
- public void setCheckType(DataValueChecker checkType) {
- this.checkType = checkType;
- }
-
- public String getDesc() {
- return this.desc;
- }
-
- public void setDesc(String desc) {
- this.desc = desc;
- }
-
- public TreeSet getTags() {
- return this.tags;
- }
+ protected String unit;
- public void setTags(TreeSet tags) {
- this.tags = tags;
- }
+ protected String desc;
+ protected TreeSet tags;
}
diff --git a/src/main/java/me/hekr/iotos/api/dto/ProductDTO.java b/src/main/java/me/hekr/iotos/api/dto/ProductDTO.java
index 039105af4f771531f237acf78580dd37f789a8c8..97e8dddc82de9929aece114744c6012595f6c17e 100644
--- a/src/main/java/me/hekr/iotos/api/dto/ProductDTO.java
+++ b/src/main/java/me/hekr/iotos/api/dto/ProductDTO.java
@@ -43,9 +43,54 @@ public class ProductDTO implements Serializable {
private String remark;
private boolean open;
+
+ /** 不可见产品将被隐藏 */
+ private boolean hide;
/** 来自哪个pk的拷贝 */
private String copyFromPk;
+ /** 数据来源部门 */
+ private String dept;
+
+ /** 省主题 */
+ private String provinceTopic;
+
+ /** 区主题 */
+ private String districtTopic;
+
+ /** 行业分类 */
+ private String industry;
+
+ /** 数据级别 */
+ private String dataLevel;
+
+ /** 共享属性 */
+ private String shareProp;
+
+ /** 开放属性 */
+ private String openProp;
+
+ /** 资源领域 */
+ private String scope;
+
+ /** 资源范围描述 */
+ private String scopeDesc;
+
+ /** 信息资源描述 */
+ private String desc;
+
+ /** 周期 */
+ private String period;
+
+ /** 更新时间 */
+ private String updateTime;
+
+ /** 业务系统编码 */
+ private String businessCode;
+
+ /** 所属业务系统 */
+ private String businessSys;
+
public DataFormat getDataFormat() {
return this.dataFormat == null ? DataFormat.KLINK : this.dataFormat;
}
diff --git a/src/main/java/me/hekr/iotos/api/dto/Tag.java b/src/main/java/me/hekr/iotos/api/dto/Tag.java
index d549cdc84c7f65368737e163aad4708c8541b27e..8805cb7d02095047931e19e56dc5484c15629abe 100644
--- a/src/main/java/me/hekr/iotos/api/dto/Tag.java
+++ b/src/main/java/me/hekr/iotos/api/dto/Tag.java
@@ -1,36 +1,45 @@
-package me.hekr.iotos.api.dto;
-
-import java.io.Serializable;
-
-public class Tag implements Serializable {
- private static final long serialVersionUID = -2216750312738203195L;
- private String key;
- private String value;
-
- public static Tag of(String key, String value) {
- return new Tag(key, value);
- }
-
- public String getKey() {
- return this.key;
- }
-
- public String getValue() {
- return this.value;
- }
-
- public void setKey(String key) {
- this.key = key;
- }
-
- public void setValue(String value) {
- this.value = value;
- }
-
- public Tag(String key, String value) {
- this.key = key;
- this.value = value;
- }
-
- public Tag() {}
-}
+package me.hekr.iotos.api.dto;
+
+import java.io.Serializable;
+import org.jetbrains.annotations.NotNull;
+
+public class Tag implements Serializable, Comparable {
+ private static final long serialVersionUID = -2216750312738203195L;
+ private String key;
+ private String value;
+
+ public static Tag of(String key, String value) {
+ return new Tag(key, value);
+ }
+
+ public String getKey() {
+ return this.key;
+ }
+
+ public String getValue() {
+ return this.value;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public Tag(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public Tag() {}
+
+ @Override
+ public int compareTo(@NotNull Tag o) {
+ if (this.key == null || o.key == null) {
+ return 0;
+ }
+ return this.key.compareTo(o.key);
+ }
+}
diff --git a/src/main/java/me/hekr/iotos/api/dto/UpgradeTaskDTO.java b/src/main/java/me/hekr/iotos/api/dto/UpgradeTaskDTO.java
new file mode 100644
index 0000000000000000000000000000000000000000..b781069bbf986c3c31d8bba14d5c817c4fbf0fce
--- /dev/null
+++ b/src/main/java/me/hekr/iotos/api/dto/UpgradeTaskDTO.java
@@ -0,0 +1,60 @@
+package me.hekr.iotos.api.dto;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import lombok.Data;
+import me.hekr.iotos.api.enums.UpgradeType;
+
+/**
+ * @author du
+ */
+@Data
+public class UpgradeTaskDTO implements Serializable {
+
+ protected String id;
+ protected String pk;
+ /** 要升级的版本,可以为空 ,空代表从无版本号的升级到目标版本 */
+ protected String fromVersion;
+
+ /** 是不是任务版本,如果true,则代表是从任意版本都可以升级到指定版本,fromVersion失效 */
+ protected boolean fromAnyVersion;
+
+ /** (要升级到的)目标版本,必填 */
+ protected String toVersion;
+
+ /** 是否要升级所有设备 */
+ protected boolean upgradeAll;
+
+ /**
+ * 要升级的设备
+ *
+ * @see #upgradeAll 如果为true则忽略此项;否则 devIdList 不能为空
+ */
+ protected List devIdList;
+
+ protected Date createdDate;
+
+ protected Date updatedDate;
+
+ /** true 启用,设备符合升级条件就要进行处理;禁用false,即使符合也不做升级处理 */
+ protected boolean enable;
+
+ /** 删除标记 */
+ protected boolean deleted;
+
+ /** 文件md5 */
+ protected String md5;
+ /** 下载地址,http(s) */
+ protected String url;
+ /** 描述 */
+ protected String desc;
+
+ /** 内容,可以为空,建议填写,可以直接查看内容 */
+ protected String content;
+
+ protected UpgradeType type;
+
+ /** 仅仅用于获取远程配置的devId,软硬件升级使用 devIdList */
+ private String devId;
+}
diff --git a/src/main/java/me/hekr/iotos/api/dto/UploadResult.java b/src/main/java/me/hekr/iotos/api/dto/UploadResult.java
new file mode 100644
index 0000000000000000000000000000000000000000..f9827ba81a2f2db99525224124ff9cf0a5ad5d2b
--- /dev/null
+++ b/src/main/java/me/hekr/iotos/api/dto/UploadResult.java
@@ -0,0 +1,14 @@
+package me.hekr.iotos.api.dto;
+
+import lombok.Data;
+
+@Data
+public class UploadResult {
+ protected String url;
+ protected String filename;
+ protected String md5;
+ /** 文件大小 */
+ protected long bytes;
+
+ protected String path;
+}
diff --git a/src/main/java/me/hekr/iotos/api/dto/klink/BatchAddTopoResp.java b/src/main/java/me/hekr/iotos/api/dto/klink/BatchAddTopoResp.java
new file mode 100644
index 0000000000000000000000000000000000000000..5b5d023b4c0ac261c241fdbf720f4512cbdfecef
--- /dev/null
+++ b/src/main/java/me/hekr/iotos/api/dto/klink/BatchAddTopoResp.java
@@ -0,0 +1,30 @@
+package me.hekr.iotos.api.dto.klink;
+
+import lombok.*;
+import me.hekr.iotos.api.enums.Action;
+import me.hekr.iotos.api.enums.ErrorCode;
+
+import java.util.List;
+
+@Getter
+@Setter
+@ToString(callSuper = true)
+@NoArgsConstructor
+public class BatchAddTopoResp extends KlinkResp {
+
+ /** 添加错误的子设备信息,如果code为0,这个为空 */
+ private List errSubs;
+
+ public BatchAddTopoResp(ErrorCode errorCode, String desc) {
+ super(errorCode, desc);
+ }
+
+ public BatchAddTopoResp(ErrorCode errorCode) {
+ super(errorCode);
+ }
+
+ @Override
+ public String getAction() {
+ return Action.BATCH_ADD_TOPO_RESP.getAction();
+ }
+}
diff --git a/src/main/java/me/hekr/iotos/api/enums/Action.java b/src/main/java/me/hekr/iotos/api/enums/Action.java
index a57097b443fda587b98ce63f23b08aab2682eed1..3d46aa09164ce863dadc06f1b0a20913d211431f 100644
--- a/src/main/java/me/hekr/iotos/api/enums/Action.java
+++ b/src/main/java/me/hekr/iotos/api/enums/Action.java
@@ -36,6 +36,9 @@ public enum Action {
DEV_SEND_RESP("devSendResp", FrameType.DEV_DOWN),
BATCH_DEV_SEND("batchDevSend", FrameType.DEV_UP, BatchDevSend.class),
BATCH_DEV_SEND_RESP("batchDevSendResp", FrameType.DEV_DOWN),
+
+ BATCH_ADD_TOPO_RESP("batchAddTopoResp", FrameType.DEV_DOWN),
+
DEV_LOGIN("devLogin", FrameType.DEV_UP, DevLogin.class),
DEV_LOGIN_RESP("devLoginResp", FrameType.DEV_DOWN),
DEV_LOGOUT("devLogout", FrameType.DEV_UP, DevLogout.class),
diff --git a/src/main/java/me/hekr/iotos/api/enums/ErrorCode.java b/src/main/java/me/hekr/iotos/api/enums/ErrorCode.java
index e811749ab0f5581cebb65f23814bb842823dc581..58c324a4a28dbadf7b9068d285c3aa8d12c6b1d8 100644
--- a/src/main/java/me/hekr/iotos/api/enums/ErrorCode.java
+++ b/src/main/java/me/hekr/iotos/api/enums/ErrorCode.java
@@ -61,6 +61,7 @@ public enum ErrorCode {
REMOTE_CONFIG_MULTI_DEVICE(1142, "remote config devices count max is one"),
REMOTE_CONFIG_NOT_EXIST(1143, "remote config not exist"),
PRODUCT_EXIST(1144, "product exist"),
+ FILE_ERROR(1145, "file error"),
INTERNAL_ERROR(500, "internal error");
private static final Map ERROR_CODE_MAP =
diff --git a/src/main/java/me/hekr/iotos/api/enums/UpgradeType.java b/src/main/java/me/hekr/iotos/api/enums/UpgradeType.java
new file mode 100644
index 0000000000000000000000000000000000000000..60f4dd1e1c0880d668e6352dd56253be0bfd2424
--- /dev/null
+++ b/src/main/java/me/hekr/iotos/api/enums/UpgradeType.java
@@ -0,0 +1,35 @@
+package me.hekr.iotos.api.enums;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import lombok.Getter;
+
+public enum UpgradeType {
+ /** 模组 */
+ MODULE("module"),
+ /** mcu */
+ MCU("mcu"),
+
+ /** 远程配置 */
+ CONFIG("config");
+
+ public static final Map MAP;
+
+ static {
+ MAP =
+ Arrays.stream(UpgradeType.values())
+ .collect(Collectors.toMap(t -> t.type, Function.identity()));
+ }
+
+ @Getter private final String type;
+
+ UpgradeType(String type) {
+ this.type = type;
+ }
+
+ public static UpgradeType of(String type) {
+ return MAP.get(type);
+ }
+}
diff --git a/src/main/java/me/hekr/iotos/api/exception/IotException.java b/src/main/java/me/hekr/iotos/api/exception/IotException.java
index 344e6950ce059a2399a239cbff7f793deef38bd4..584f3b87d44949e72561e5b1380c121df4af4c48 100644
--- a/src/main/java/me/hekr/iotos/api/exception/IotException.java
+++ b/src/main/java/me/hekr/iotos/api/exception/IotException.java
@@ -2,12 +2,14 @@ package me.hekr.iotos.api.exception;
import lombok.Getter;
import lombok.Setter;
+import me.hekr.iotos.api.IotErrorResponse;
@Getter
@Setter
public class IotException extends RuntimeException {
private int code = 400;
+ private IotErrorResponse innerErrorResp;
public IotException() {
super();
diff --git a/src/main/java/me/hekr/iotos/api/service/RetrofitIotService.java b/src/main/java/me/hekr/iotos/api/service/RetrofitIotService.java
index 77740360943358a1bd19923237ec0828b8d0630e..2717a902ec822db16dbcef1afa125785dc983831 100644
--- a/src/main/java/me/hekr/iotos/api/service/RetrofitIotService.java
+++ b/src/main/java/me/hekr/iotos/api/service/RetrofitIotService.java
@@ -2,36 +2,30 @@ package me.hekr.iotos.api.service;
import java.util.List;
import java.util.Map;
-import me.hekr.iotos.api.dto.CloudSendMsgDTO;
-import me.hekr.iotos.api.dto.DelTopoResp;
-import me.hekr.iotos.api.dto.DevIdListReq;
-import me.hekr.iotos.api.dto.DeviceAddReq;
-import me.hekr.iotos.api.dto.DeviceAggPacketResp;
-import me.hekr.iotos.api.dto.DeviceApiDTO;
-import me.hekr.iotos.api.dto.DevicePacketResp;
-import me.hekr.iotos.api.dto.DeviceStatusRes;
-import me.hekr.iotos.api.dto.DeviceUpdateNameReq;
-import me.hekr.iotos.api.dto.LoginRsp;
-import me.hekr.iotos.api.dto.ModelProtocolDTO;
-import me.hekr.iotos.api.dto.ParamValue;
-import me.hekr.iotos.api.dto.ParamValueQuery;
-import me.hekr.iotos.api.dto.ProductDTO;
-import me.hekr.iotos.api.dto.Snapshot;
+import java.util.Set;
+
+import me.hekr.iotos.api.dto.*;
import me.hekr.iotos.api.dto.klink.AddTopoResp;
+import me.hekr.iotos.api.dto.klink.BatchAddTopoResp;
import me.hekr.iotos.api.dto.klink.KlinkResp;
import me.hekr.iotos.api.dto.klink.ModelData;
import me.hekr.iotos.api.dto.klink.TopoSub;
import me.hekr.iotos.api.enums.DeviceType;
import me.hekr.iotos.api.util.Pagec;
import okhttp3.HttpUrl;
+import okhttp3.MultipartBody;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.GET;
+import retrofit2.http.HTTP;
+import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
+import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
@@ -57,6 +51,84 @@ public interface RetrofitIotService {
@GET("product")
Call> getProduct(@Query("page") int page, @Query("size") int size);
+ /** 超级管理员可获取全局产品 */
+ @GET("admin/productList")
+ Call> getAdminProduct(@Query("page") int page, @Query("size") int size);
+
+ @GET("admin/dataShapeScript/{pk}")
+ Call getAdminDataShape(@Path("pk") String pk);
+
+ @PUT("admin/dataShapeScript/{pk}")
+ Call adminCreateOrUpdateDataShape(
+ @Path("pk") String pk, @Body DataShapeScriptDTO script);
+
+ @GET("admin/deviceInfo/{pk}/{devId}")
+ Call getAdminDevice(@Path("pk") String pk, @Path("devId") String devId);
+
+ @POST("admin/addDevice")
+ Call adminAddDevice(@Body DeviceAddReq reqDto);
+
+ /** 超级管理员获取聚合 */
+ @GET("admin/deviceStat/agglog/{pk}/{devId}")
+ Call adminGetDeviceStatAggLog(
+ @Path("pk") String pk,
+ @Path("devId") String devId,
+ @Query(value = "startTime") Long startTime,
+ @Query(value = "endTime") Long endTime,
+ @Query(value = "key") String key,
+ @Query(value = "span") String span);
+
+ @GET("admin/deviceStat/kvlog/{pk}/{devId}")
+ Call> adminGetDeviceStatVersion(
+ @Path("pk") String pk,
+ @Path("devId") String devId,
+ @Query(value = "startTime") long startTime,
+ @Query(value = "endTime") long endTime,
+ @Query(value = "key") String key);
+
+ @Multipart
+ @POST("admin/addUpgradeFile")
+ Call adminAddUpgradeFile(@Part MultipartBody.Part file);
+
+ @POST("admin/addUpgrade")
+ Call adminAddUpgrade(@Body DeviceUpgradeReq reqDto);
+
+ @DELETE("admin/delete/{pk}/{id}")
+ Call adminDeleteUpgrade(@Path("pk") String pk, @Path("id") String id);
+
+ @POST("admin/disable/{pk}/{id}")
+ Call adminDisableUpgrade(@Path("pk") String pk, @Path("id") String id);
+
+ @POST("admin/enable/{pk}/{id}")
+ Call adminEnableUpgrade(@Path("pk") String pk, @Path("id") String id);
+
+ @GET("admin/upgradeList")
+ Call> adminGetUpgradeList(
+ @Query(value = "pk") List pkList,
+ @Query(value = "type") String type,
+ @Query(value = "page") Integer page,
+ @Query(value = "size") Integer size);
+
+ /** 超级管理员按pk列表获取产品 */
+ @GET("admin/productList/pks")
+ Call> getAdminProductInfoListByPks(@Query("pks") Set pks);
+
+ /** 超管删除产品 */
+ @DELETE("admin/product/{pk}")
+ Call adminDeleteProduct(@Path("pk") String pk);
+
+ /** 超级管理员按pk列表获取产品物模型 */
+ @GET("admin/model/protocolByPks")
+ Call> getAdminModelByPks(@Query("pks") Set pks);
+
+ /** 创建产品 */
+ @POST("product")
+ Call createProduct(@Body ConsoleProductReq consoleProductReq);
+
+ /** 修改产品 */
+ @PUT("product")
+ Call editProduct(@Body ConsoleUpdateProductReq consoleUpdateProductReq);
+
/**
* 获取产品物模型
*
@@ -69,6 +141,79 @@ public interface RetrofitIotService {
@GET("model/protocol/{pk}")
Call getProtocol(@Path("pk") String pk);
+ /** 超管获取上下行 */
+ @GET("admin/getDevicePackage/{pk}/{devId}")
+ Call> adminGetDevicePackage(
+ @Path("pk") String pk,
+ @Path("devId") String devId,
+ @Query("startTime") Long startTime,
+ @Query("endTime") Long endTime,
+ @Query("action") String action,
+ @Query("page") int page,
+ @Query("size") int size);
+
+ /** 超管获取设备快照 */
+ @GET("admin/getSnapshot")
+ Call adminGetDeviceSnapshot(@Query("pk") String pk, @Query("devId") String devId);
+
+ /** 超管获取拓扑设备 */
+ @GET("admin/topo")
+ Call> adminGetDeviceTopo(
+ @Query("pk") String parentPk,
+ @Query("devId") String parentDevId,
+ @Query("page") int page,
+ @Query("size") int size);
+
+ /** 超管新增拓扑关系 */
+ @PUT("admin/addTopo/{pk}/{devId}")
+ Call adminAddTopo(
+ @Path("pk") String pk, @Path("devId") String devId, @Body DeviceDTO sub);
+
+ @HTTP(method = "DELETE", path = "admin/delTopo/{pk}/{devId}", hasBody = true)
+ Call adminDelTopo(
+ @Path("pk") String pk, @Path("devId") String devId, @Body DeviceDTO sub);
+
+ @Multipart
+ @PUT("admin/batchAddTopo/{pk}/{devId}")
+ Call adminBatchAddTopo(
+ @Path("pk") String pk,
+ @Path("devId") String devId,
+ @Query("overwrite") boolean overwrite,
+ @Part MultipartBody.Part file);
+
+ /** 超级管理员可获取全局物模型 */
+ @GET("admin/model/protocol/{pk}")
+ Call getAdminProtocol(@Path("pk") String pk);
+
+ /** 超级管理员创建物模型 */
+ @POST("admin/model/protocol/{pk}")
+ Call adminCreateModel(
+ @Path("pk") String pk, @Body ModelProtocolDTO modelProtocol);
+
+ /** 超管新增物模型参数 */
+ @POST("admin/model/protocol/{pk}/param")
+ Call adminAddModelParam(
+ @Path("pk") String pk, @Body ModelParamDTO modelParamDTO);
+ /** 超管修改物模型参数 */
+ @PUT("admin/model/protocol/{pk}/param")
+ Call adminUpdateModelParam(
+ @Path("pk") String pk, @Body ModelParamDTO modelParamDTO);
+
+ /** 删除物模型参数 */
+ @DELETE("admin/model/protocol/{pk}/param/{param}")
+ Call adminDeleteModelParam(@Path("pk") String pk, @Path("param") String param);
+
+ /** 超管新增物模型命令 */
+ @POST("admin/model/protocol/{pk}/cmd")
+ Call adminAddModelCmd(@Path("pk") String pk, @Body ModelCmdDTO modelCmdDTO);
+ /** 超管修改物模型命令 */
+ @PUT("admin/model/protocol/{pk}/cmd")
+ Call adminUpdateModelCmd(@Path("pk") String pk, @Body ModelCmdDTO modelCmdDTO);
+
+ /** 删除物模型命令 */
+ @DELETE("admin/model/protocol/{pk}/cmd/{cmd}")
+ Call adminDeleteModelCmd(@Path("pk") String pk, @Path("cmd") String cmd);
+
/**
* 新增设备
*
@@ -132,6 +277,10 @@ public interface RetrofitIotService {
@POST("api/device/getDeviceStatus")
Call> getDeviceStatus(@Body DevIdListReq req);
+ @POST("admin/cloudSend/{pk}/{devId}")
+ Call adminDeviceCloudSend(
+ @Path("pk") String pk, @Path("devId") String devId, @Body ModelData data);
+
/**
* 查询设备指标趋势
*
@@ -205,6 +354,14 @@ public interface RetrofitIotService {
@Query("online") Boolean online,
@Query("size") int size);
+ @GET("admin/getDeviceList")
+ Call> getAdminDeviceList(
+ @Query("pk") String pk,
+ @Query("keyword") String keyword,
+ @Query("page") int page,
+ @Query("online") Boolean online,
+ @Query("size") int size);
+
/**
* 查询设备详情
*
@@ -363,4 +520,12 @@ public interface RetrofitIotService {
@GET("api/deviceStat/agglog/{pk}/{devId}")
Call getDeviceAggData(
@Path("pk") String pk, @Path("devId") String devId, @QueryMap Map params);
+
+ /** 获取萧山资源目录系统资源列表接口 */
+ @GET("cat/system")
+ Call