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 @@ + + 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 max; private ModelParamValue min; @@ -46,4 +48,12 @@ public class DataValueRangeChecker implements DataValueChecker { && this.max.getValue() != null && this.min.getValue() != null; } + + public void setMax(ModelParamValue max) { + this.max = max; + } + + public void setMin(ModelParamValue 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 getSystem(); + + /** 获取萧山资源目录下拉信息接口 */ + @GET("cat/product") + Call getCatProduct(); } diff --git a/src/test/java/me/hekr/iotos/api/IotClientTest.java b/src/test/java/me/hekr/iotos/api/IotClientTest.java index f55c7b148c412a37916715e7cc77d64e78f106b3..7202547d8c944616be5ff02a63207a74c46831f1 100644 --- a/src/test/java/me/hekr/iotos/api/IotClientTest.java +++ b/src/test/java/me/hekr/iotos/api/IotClientTest.java @@ -1,16 +1,12 @@ package me.hekr.iotos.api; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import me.hekr.iotos.api.dto.DevIdListReq; -import me.hekr.iotos.api.dto.DeviceAddReq; -import me.hekr.iotos.api.dto.DeviceApiDTO; -import me.hekr.iotos.api.dto.DeviceUpdateNameReq; +import java.util.*; + +import me.hekr.iotos.api.dto.*; 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.enums.*; +import me.hekr.iotos.api.util.Pagec; import org.junit.BeforeClass; import org.junit.Test; @@ -24,9 +20,9 @@ public class IotClientTest { client = IotClient.builder() - .host("http://10.1.1.200:7003/") - .ak("kuQrzR2GowzdSXGULwSvABY9") - .as("ERKp4JwzTQv3RUCVTBtITzNfFkAMog") + .host("http://202.101.162.69:5679/console-api/") + .ak("MO1jqqQrKZq4EXssDiBOE3hG") + .as("6dYCX0xsn6eQZaf3dozV9gJjubGByO") .build(); } @@ -57,6 +53,73 @@ public class IotClientTest { System.out.println(client.getProduct(page, size)); } + @Test + public void adminGetSnapshot() { + System.out.println( + client.adminGetDeviceSnapshot("409127b74d2c4b3b9b86a5e6c08b72cc", "DTUMB20210423001101")); + } + + @Test + public void adminDelSub() { + DeviceDTO deviceDTO = new DeviceDTO(); + deviceDTO.setPk("982cbe11ae2848a7b4ae493739240300"); + deviceDTO.setDevId("sub002"); + System.out.println( + client.adminDelTopo("0a584188ac614cb089eec5778d0f5308", "gateway002", deviceDTO)); + } + + @Test + public void adminAddSub() { + DeviceDTO deviceDTO = new DeviceDTO(); + deviceDTO.setPk("982cbe11ae2848a7b4ae493739240300"); + deviceDTO.setDevId("sub002"); + System.out.println( + client.adminAddTopo("0a584188ac614cb089eec5778d0f5308", "gateway002", deviceDTO)); + } + + @Test + public void adminGetDevicePackets() { + System.out.println( + client.adminGetDevicePackage( + "12ff59f46d2d4e2796443c9b919e6a32", + "330109010002", + 1660492800000L, + 1660665599999L, + "", + 0, + 10)); + } + + @Test + public void adminDeviceInfo() { + String pk = "6faa0966c5564dbabdd55d350df7c076"; + String devId = "2001090604"; + DeviceApiDTO deviceApiDTO = client.getAdminDevice(pk, devId); + System.out.println(deviceApiDTO.toString()); + } + + @Test + public void adminAddDevice() { + DeviceAddReq reqDto = new DeviceAddReq(); + reqDto.setDevId("ttttttt"); + reqDto.setName("ceshi"); + reqDto.setAddress("ceshi"); + reqDto.setTown("ceshi"); + reqDto.setLocation(new Double[]{123.2,123.3}); + reqDto.setZaxis("12"); + reqDto.setVillage("ceshi"); + reqDto.setPk("6faa0966c5564dbabdd55d350df7c076"); + System.out.println(client.adminAddDevice(reqDto)); + } + + @Test + public void getAdminProduct() { + int page = 0; + int size = 100; + Pagec adminProduct = client.getAdminProduct(page, size); + System.out.println(adminProduct); + } + @Test public void getBatchDevices() { String pk = "c33d447799e343f4bb2237390b82604d"; @@ -107,15 +170,89 @@ public class IotClientTest { System.out.println(client.batchAddDevices(devIdListReq)); } + @Test + public void creatProduct() { + ConsoleProductReq consoleProductReq = new ConsoleProductReq(); + consoleProductReq.setName("测试对接设备"); + consoleProductReq.setCid("619352cdf871e0001534d638"); + consoleProductReq.setDataFormat(DataFormat.KLINK); + consoleProductReq.setTransferType(TransferType.HTTP); + consoleProductReq.setDeviceType(DeviceType.GENERAL); + consoleProductReq.setDeviceLinkType(DeviceLinkType.OTHER); + consoleProductReq.setDataCheckMode(DataCheckMode.LOOSE); + consoleProductReq.setHide(true); + consoleProductReq.setDept("414051780"); + ProductDTO product = client.createProduct(consoleProductReq); + System.out.println(product); + } + + @Test + public void creatPotocol() { + ModelProtocolDTO modelProtocolDTO = new ModelProtocolDTO(); + List param = new ArrayList<>(); + ModelParamDTO modelParamDTO = new ModelParamDTO(); + modelParamDTO.setParam("test"); + modelParamDTO.setUnit("v"); + modelParamDTO.setName("ceshi"); + + modelParamDTO.setCheckType(new DataValueNoneChecker()); + modelParamDTO.setDataType(DataType.STRING); + modelParamDTO.setFrameType(FrameType.DEV_UP); + param.add(modelParamDTO); + modelProtocolDTO.setParams(param); + ModelProtocolDTO res = + client.adminCreateModel("ec3bfc5273bc46d9a675453fd08f8cd8", modelProtocolDTO); + System.out.println(res); + } + + @Test + public void editProduct() { + ConsoleUpdateProductReq consoleProductReq = new ConsoleUpdateProductReq(); + consoleProductReq.setName("测试对接设备"); + consoleProductReq.setCid("619352cdf871e0001534d638"); + consoleProductReq.setPk("3256d8be6d4640fc8fd46fae6c10b4d9"); + consoleProductReq.setHide(true); + consoleProductReq.setDept("414051780"); + ProductDTO product = client.editProduct(consoleProductReq); + System.out.println(product); + } + @Test public void getDeviceList() { String pk = "646bce17f2834b0b83a21948c747b91e"; - String keyword = "gate"; + String keyWord = "gate"; int page = 0; DeviceType deviceType = DeviceType.GATEWAY; Boolean online = true; int size = 10; - System.out.println(client.getDeviceList(pk, keyword, page, deviceType, online, size)); + System.out.println(client.getDeviceList(pk, keyWord, page, deviceType, online, size)); + } + + @Test + public void getAdminDeviceList() { + String pk = "7d78997e466a497d92c4966d79ba5644"; + String keyWord = null; + int page = 0; + Boolean online = null; + int size = 10; + System.out.println(client.getAdminDeviceList(pk, keyWord, page, online, size)); + } + + @Test + public void getAdminProductInfoListByPks() { + Set set = new HashSet<>(); + set.add("eed55fcd2f974b94b5806142125bd825"); + set.add("a86771fc156949b299d216358a8de631"); + List list = client.getAdminProductInfoListByPks(set); + System.out.println(list); + } + + @Test + public void getModelByPks() { + Set set = new HashSet<>(); + set.add("47f6381c245b4ddb9ec0b5da0ba783e2"); + set.add("6390e0e3d59143f8a0c339013ca037ca"); + System.out.println(client.getAdminModelByPks(set)); } @Test @@ -169,6 +306,20 @@ public class IotClientTest { System.out.println(client.deviceCloudSend(pk, devId, data)); } + @Test + public void adminDeviceCloudSend() { + String pk = "a34ce5b3111d4849b6cf7b54c4240bf5"; + String devId = "mqtt"; + ModelData data = new ModelData(); + + data.setCmd("set"); + Map map = new HashMap<>(); + map.put("value", 0); + + data.setParams(map); + System.out.println(client.adminDeviceCloudSend(pk, devId, data)); + } + @Test public void cloudSendMsgInfo() { String messageId = "1"; @@ -205,4 +356,14 @@ public class IotClientTest { sub.setPk("c33d447799e343f4bb2237390b82604d"); System.out.println(client.delTopo(pk, devId, sub)); } + + @Test + public void getSystem() { + System.out.println(client.getSystem()); + } + + @Test + public void getCatProduct() { + System.out.println(client.getCatProduct()); + } }