diff --git a/app/src/main/java/com/casic/br/ktd/extensions/String.kt b/app/src/main/java/com/casic/br/ktd/extensions/String.kt index 6efd1a3..ee2db04 100644 --- a/app/src/main/java/com/casic/br/ktd/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ktd/extensions/String.kt @@ -2,11 +2,13 @@ import android.content.Context import com.casic.br.ktd.model.ErrorMessageModel +import com.casic.br.ktd.utils.LocaleConstant import com.casic.br.ktd.utils.OnImageCompressListener import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.dateToTimestamp +import com.pengxh.kt.lite.utils.SaveKeyValues import org.json.JSONObject import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener @@ -50,6 +52,16 @@ return dateFormat.format(Date(timestamp)) } +//拼接图片地址 +fun String.combineImagePath(): String { + if (this.isEmpty()) return this + val defaultValue = SaveKeyValues.getValue( + LocaleConstant.DEFAULT_SERVER_CONFIG, LocaleConstant.SERVER_BASE_URL + ) as String + //http://111.198.10.15:11646/static/2023-07/0fcc24a707cb4c53a9a85102e1578e91.jpg + return "$defaultValue/static/${this.replace("\\", "/")}" +} + fun String.compressImage(context: Context, listener: OnImageCompressListener) { Luban.with(context) .load(this) diff --git a/app/src/main/java/com/casic/br/ktd/extensions/String.kt b/app/src/main/java/com/casic/br/ktd/extensions/String.kt index 6efd1a3..ee2db04 100644 --- a/app/src/main/java/com/casic/br/ktd/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ktd/extensions/String.kt @@ -2,11 +2,13 @@ import android.content.Context import com.casic.br.ktd.model.ErrorMessageModel +import com.casic.br.ktd.utils.LocaleConstant import com.casic.br.ktd.utils.OnImageCompressListener import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.dateToTimestamp +import com.pengxh.kt.lite.utils.SaveKeyValues import org.json.JSONObject import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener @@ -50,6 +52,16 @@ return dateFormat.format(Date(timestamp)) } +//拼接图片地址 +fun String.combineImagePath(): String { + if (this.isEmpty()) return this + val defaultValue = SaveKeyValues.getValue( + LocaleConstant.DEFAULT_SERVER_CONFIG, LocaleConstant.SERVER_BASE_URL + ) as String + //http://111.198.10.15:11646/static/2023-07/0fcc24a707cb4c53a9a85102e1578e91.jpg + return "$defaultValue/static/${this.replace("\\", "/")}" +} + fun String.compressImage(context: Context, listener: OnImageCompressListener) { Luban.with(context) .load(this) diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt index 50bdc7c..e965fd5 100644 --- a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt +++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt @@ -73,13 +73,13 @@ } } } - getTasksByPage(true) alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun onResume() { super.onResume() + getTasksByPage(true) //fragment切换时候重置侧滑按钮 swipeAction.clear() deviceId = SaveKeyValues.getValue(LocaleConstant.YT_DEVICE_ID, "") as String diff --git a/app/src/main/java/com/casic/br/ktd/extensions/String.kt b/app/src/main/java/com/casic/br/ktd/extensions/String.kt index 6efd1a3..ee2db04 100644 --- a/app/src/main/java/com/casic/br/ktd/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ktd/extensions/String.kt @@ -2,11 +2,13 @@ import android.content.Context import com.casic.br.ktd.model.ErrorMessageModel +import com.casic.br.ktd.utils.LocaleConstant import com.casic.br.ktd.utils.OnImageCompressListener import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.dateToTimestamp +import com.pengxh.kt.lite.utils.SaveKeyValues import org.json.JSONObject import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener @@ -50,6 +52,16 @@ return dateFormat.format(Date(timestamp)) } +//拼接图片地址 +fun String.combineImagePath(): String { + if (this.isEmpty()) return this + val defaultValue = SaveKeyValues.getValue( + LocaleConstant.DEFAULT_SERVER_CONFIG, LocaleConstant.SERVER_BASE_URL + ) as String + //http://111.198.10.15:11646/static/2023-07/0fcc24a707cb4c53a9a85102e1578e91.jpg + return "$defaultValue/static/${this.replace("\\", "/")}" +} + fun String.compressImage(context: Context, listener: OnImageCompressListener) { Luban.with(context) .load(this) diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt index 50bdc7c..e965fd5 100644 --- a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt +++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt @@ -73,13 +73,13 @@ } } } - getTasksByPage(true) alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun onResume() { super.onResume() + getTasksByPage(true) //fragment切换时候重置侧滑按钮 swipeAction.clear() deviceId = SaveKeyValues.getValue(LocaleConstant.YT_DEVICE_ID, "") as String diff --git a/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt b/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt new file mode 100644 index 0000000..06a74c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt @@ -0,0 +1,18 @@ +package com.casic.br.ktd.model + +/** + * 报警记录上传的参数 + * */ +data class AlarmParam( + var alarmContent: String, + var alarmLongitude: String, + var alarmLatitude: String, + var alarmTime: String, + var alarmThresh: String, + var alarmPicture: String, + var deviceId: String, + var alarmStatus: String, + var alarmType: String, + var alarmVideo: String, + var alarmValue: String +) diff --git a/app/src/main/java/com/casic/br/ktd/extensions/String.kt b/app/src/main/java/com/casic/br/ktd/extensions/String.kt index 6efd1a3..ee2db04 100644 --- a/app/src/main/java/com/casic/br/ktd/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ktd/extensions/String.kt @@ -2,11 +2,13 @@ import android.content.Context import com.casic.br.ktd.model.ErrorMessageModel +import com.casic.br.ktd.utils.LocaleConstant import com.casic.br.ktd.utils.OnImageCompressListener import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.dateToTimestamp +import com.pengxh.kt.lite.utils.SaveKeyValues import org.json.JSONObject import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener @@ -50,6 +52,16 @@ return dateFormat.format(Date(timestamp)) } +//拼接图片地址 +fun String.combineImagePath(): String { + if (this.isEmpty()) return this + val defaultValue = SaveKeyValues.getValue( + LocaleConstant.DEFAULT_SERVER_CONFIG, LocaleConstant.SERVER_BASE_URL + ) as String + //http://111.198.10.15:11646/static/2023-07/0fcc24a707cb4c53a9a85102e1578e91.jpg + return "$defaultValue/static/${this.replace("\\", "/")}" +} + fun String.compressImage(context: Context, listener: OnImageCompressListener) { Luban.with(context) .load(this) diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt index 50bdc7c..e965fd5 100644 --- a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt +++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt @@ -73,13 +73,13 @@ } } } - getTasksByPage(true) alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun onResume() { super.onResume() + getTasksByPage(true) //fragment切换时候重置侧滑按钮 swipeAction.clear() deviceId = SaveKeyValues.getValue(LocaleConstant.YT_DEVICE_ID, "") as String diff --git a/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt b/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt new file mode 100644 index 0000000..06a74c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt @@ -0,0 +1,18 @@ +package com.casic.br.ktd.model + +/** + * 报警记录上传的参数 + * */ +data class AlarmParam( + var alarmContent: String, + var alarmLongitude: String, + var alarmLatitude: String, + var alarmTime: String, + var alarmThresh: String, + var alarmPicture: String, + var deviceId: String, + var alarmStatus: String, + var alarmType: String, + var alarmVideo: String, + var alarmValue: String +) diff --git a/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java b/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java new file mode 100644 index 0000000..819a760 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class UploadResultModel { + + private int code; + private String data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/extensions/String.kt b/app/src/main/java/com/casic/br/ktd/extensions/String.kt index 6efd1a3..ee2db04 100644 --- a/app/src/main/java/com/casic/br/ktd/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ktd/extensions/String.kt @@ -2,11 +2,13 @@ import android.content.Context import com.casic.br.ktd.model.ErrorMessageModel +import com.casic.br.ktd.utils.LocaleConstant import com.casic.br.ktd.utils.OnImageCompressListener import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.dateToTimestamp +import com.pengxh.kt.lite.utils.SaveKeyValues import org.json.JSONObject import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener @@ -50,6 +52,16 @@ return dateFormat.format(Date(timestamp)) } +//拼接图片地址 +fun String.combineImagePath(): String { + if (this.isEmpty()) return this + val defaultValue = SaveKeyValues.getValue( + LocaleConstant.DEFAULT_SERVER_CONFIG, LocaleConstant.SERVER_BASE_URL + ) as String + //http://111.198.10.15:11646/static/2023-07/0fcc24a707cb4c53a9a85102e1578e91.jpg + return "$defaultValue/static/${this.replace("\\", "/")}" +} + fun String.compressImage(context: Context, listener: OnImageCompressListener) { Luban.with(context) .load(this) diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt index 50bdc7c..e965fd5 100644 --- a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt +++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt @@ -73,13 +73,13 @@ } } } - getTasksByPage(true) alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun onResume() { super.onResume() + getTasksByPage(true) //fragment切换时候重置侧滑按钮 swipeAction.clear() deviceId = SaveKeyValues.getValue(LocaleConstant.YT_DEVICE_ID, "") as String diff --git a/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt b/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt new file mode 100644 index 0000000..06a74c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt @@ -0,0 +1,18 @@ +package com.casic.br.ktd.model + +/** + * 报警记录上传的参数 + * */ +data class AlarmParam( + var alarmContent: String, + var alarmLongitude: String, + var alarmLatitude: String, + var alarmTime: String, + var alarmThresh: String, + var alarmPicture: String, + var deviceId: String, + var alarmStatus: String, + var alarmType: String, + var alarmVideo: String, + var alarmValue: String +) diff --git a/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java b/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java new file mode 100644 index 0000000..819a760 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class UploadResultModel { + + private int code; + private String data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt index ced6d54..1b0a093 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt @@ -1,5 +1,6 @@ package com.casic.br.ktd.retrofit +import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.* @@ -97,4 +98,23 @@ @QueryMap limit: Map, @QueryMap offset: Map, ): String + + /** + * 上传文件 + */ + @Multipart + @POST("/alarm/savePictures") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 新增报警记录 + */ + @POST("/alarm/add") + suspend fun addAlarm( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/extensions/String.kt b/app/src/main/java/com/casic/br/ktd/extensions/String.kt index 6efd1a3..ee2db04 100644 --- a/app/src/main/java/com/casic/br/ktd/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ktd/extensions/String.kt @@ -2,11 +2,13 @@ import android.content.Context import com.casic.br.ktd.model.ErrorMessageModel +import com.casic.br.ktd.utils.LocaleConstant import com.casic.br.ktd.utils.OnImageCompressListener import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.dateToTimestamp +import com.pengxh.kt.lite.utils.SaveKeyValues import org.json.JSONObject import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener @@ -50,6 +52,16 @@ return dateFormat.format(Date(timestamp)) } +//拼接图片地址 +fun String.combineImagePath(): String { + if (this.isEmpty()) return this + val defaultValue = SaveKeyValues.getValue( + LocaleConstant.DEFAULT_SERVER_CONFIG, LocaleConstant.SERVER_BASE_URL + ) as String + //http://111.198.10.15:11646/static/2023-07/0fcc24a707cb4c53a9a85102e1578e91.jpg + return "$defaultValue/static/${this.replace("\\", "/")}" +} + fun String.compressImage(context: Context, listener: OnImageCompressListener) { Luban.with(context) .load(this) diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt index 50bdc7c..e965fd5 100644 --- a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt +++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt @@ -73,13 +73,13 @@ } } } - getTasksByPage(true) alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun onResume() { super.onResume() + getTasksByPage(true) //fragment切换时候重置侧滑按钮 swipeAction.clear() deviceId = SaveKeyValues.getValue(LocaleConstant.YT_DEVICE_ID, "") as String diff --git a/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt b/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt new file mode 100644 index 0000000..06a74c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt @@ -0,0 +1,18 @@ +package com.casic.br.ktd.model + +/** + * 报警记录上传的参数 + * */ +data class AlarmParam( + var alarmContent: String, + var alarmLongitude: String, + var alarmLatitude: String, + var alarmTime: String, + var alarmThresh: String, + var alarmPicture: String, + var deviceId: String, + var alarmStatus: String, + var alarmType: String, + var alarmVideo: String, + var alarmValue: String +) diff --git a/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java b/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java new file mode 100644 index 0000000..819a760 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class UploadResultModel { + + private int code; + private String data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt index ced6d54..1b0a093 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt @@ -1,5 +1,6 @@ package com.casic.br.ktd.retrofit +import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.* @@ -97,4 +98,23 @@ @QueryMap limit: Map, @QueryMap offset: Map, ): String + + /** + * 上传文件 + */ + @Multipart + @POST("/alarm/savePictures") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 新增报警记录 + */ + @POST("/alarm/add") + suspend fun addAlarm( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt index 82e55ae..6646fd0 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt @@ -1,14 +1,20 @@ package com.casic.br.ktd.retrofit +import com.casic.br.ktd.model.AlarmParam import com.casic.br.ktd.model.TaskParam import com.casic.br.ktd.utils.AuthenticationHelper +import com.casic.br.ktd.utils.FileType import com.casic.br.ktd.utils.LocaleConstant import com.google.gson.JsonObject import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import org.json.JSONObject +import java.io.File object RetrofitServiceManager { private val api by lazy { @@ -179,4 +185,38 @@ offsetMap["offset"] = 1 return api.getAlarmRules(AuthenticationHelper.token, limitMap, offsetMap) } + + /** + * 上传文件 + */ + suspend fun uploadFile(file: File, type: FileType): String { + val requestBody = when (type) { + FileType.IMAGE -> file.asRequestBody("image/png".toMediaTypeOrNull()) + else -> file.asRequestBody("video/mp4".toMediaTypeOrNull()) + } + val filePart = MultipartBody.Part.createFormData("multipartFile", file.name, requestBody) + return api.uploadFile(AuthenticationHelper.token, filePart) + } + + /** + * 新增报警记录 + */ + suspend fun addAlarm(alarmParam: AlarmParam): String { + val param = JsonObject() + param.addProperty("alarmContent", alarmParam.alarmContent) + param.addProperty("alarmLongitude", alarmParam.alarmLongitude) + param.addProperty("alarmLatitude", alarmParam.alarmLatitude) + param.addProperty("alarmTime", alarmParam.alarmTime) + param.addProperty("alarmThresh", alarmParam.alarmThresh) + param.addProperty("alarmPicture", alarmParam.alarmPicture) + param.addProperty("deviceId", alarmParam.deviceId) + param.addProperty("alarmStatus", alarmParam.alarmStatus) + param.addProperty("alarmType", alarmParam.alarmType) + param.addProperty("alarmVideo", alarmParam.alarmVideo) + param.addProperty("alarmValue", alarmParam.alarmValue) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addAlarm(AuthenticationHelper.token, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/extensions/String.kt b/app/src/main/java/com/casic/br/ktd/extensions/String.kt index 6efd1a3..ee2db04 100644 --- a/app/src/main/java/com/casic/br/ktd/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ktd/extensions/String.kt @@ -2,11 +2,13 @@ import android.content.Context import com.casic.br.ktd.model.ErrorMessageModel +import com.casic.br.ktd.utils.LocaleConstant import com.casic.br.ktd.utils.OnImageCompressListener import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.dateToTimestamp +import com.pengxh.kt.lite.utils.SaveKeyValues import org.json.JSONObject import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener @@ -50,6 +52,16 @@ return dateFormat.format(Date(timestamp)) } +//拼接图片地址 +fun String.combineImagePath(): String { + if (this.isEmpty()) return this + val defaultValue = SaveKeyValues.getValue( + LocaleConstant.DEFAULT_SERVER_CONFIG, LocaleConstant.SERVER_BASE_URL + ) as String + //http://111.198.10.15:11646/static/2023-07/0fcc24a707cb4c53a9a85102e1578e91.jpg + return "$defaultValue/static/${this.replace("\\", "/")}" +} + fun String.compressImage(context: Context, listener: OnImageCompressListener) { Luban.with(context) .load(this) diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt index 50bdc7c..e965fd5 100644 --- a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt +++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt @@ -73,13 +73,13 @@ } } } - getTasksByPage(true) alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun onResume() { super.onResume() + getTasksByPage(true) //fragment切换时候重置侧滑按钮 swipeAction.clear() deviceId = SaveKeyValues.getValue(LocaleConstant.YT_DEVICE_ID, "") as String diff --git a/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt b/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt new file mode 100644 index 0000000..06a74c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt @@ -0,0 +1,18 @@ +package com.casic.br.ktd.model + +/** + * 报警记录上传的参数 + * */ +data class AlarmParam( + var alarmContent: String, + var alarmLongitude: String, + var alarmLatitude: String, + var alarmTime: String, + var alarmThresh: String, + var alarmPicture: String, + var deviceId: String, + var alarmStatus: String, + var alarmType: String, + var alarmVideo: String, + var alarmValue: String +) diff --git a/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java b/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java new file mode 100644 index 0000000..819a760 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class UploadResultModel { + + private int code; + private String data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt index ced6d54..1b0a093 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt @@ -1,5 +1,6 @@ package com.casic.br.ktd.retrofit +import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.* @@ -97,4 +98,23 @@ @QueryMap limit: Map, @QueryMap offset: Map, ): String + + /** + * 上传文件 + */ + @Multipart + @POST("/alarm/savePictures") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 新增报警记录 + */ + @POST("/alarm/add") + suspend fun addAlarm( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt index 82e55ae..6646fd0 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt @@ -1,14 +1,20 @@ package com.casic.br.ktd.retrofit +import com.casic.br.ktd.model.AlarmParam import com.casic.br.ktd.model.TaskParam import com.casic.br.ktd.utils.AuthenticationHelper +import com.casic.br.ktd.utils.FileType import com.casic.br.ktd.utils.LocaleConstant import com.google.gson.JsonObject import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import org.json.JSONObject +import java.io.File object RetrofitServiceManager { private val api by lazy { @@ -179,4 +185,38 @@ offsetMap["offset"] = 1 return api.getAlarmRules(AuthenticationHelper.token, limitMap, offsetMap) } + + /** + * 上传文件 + */ + suspend fun uploadFile(file: File, type: FileType): String { + val requestBody = when (type) { + FileType.IMAGE -> file.asRequestBody("image/png".toMediaTypeOrNull()) + else -> file.asRequestBody("video/mp4".toMediaTypeOrNull()) + } + val filePart = MultipartBody.Part.createFormData("multipartFile", file.name, requestBody) + return api.uploadFile(AuthenticationHelper.token, filePart) + } + + /** + * 新增报警记录 + */ + suspend fun addAlarm(alarmParam: AlarmParam): String { + val param = JsonObject() + param.addProperty("alarmContent", alarmParam.alarmContent) + param.addProperty("alarmLongitude", alarmParam.alarmLongitude) + param.addProperty("alarmLatitude", alarmParam.alarmLatitude) + param.addProperty("alarmTime", alarmParam.alarmTime) + param.addProperty("alarmThresh", alarmParam.alarmThresh) + param.addProperty("alarmPicture", alarmParam.alarmPicture) + param.addProperty("deviceId", alarmParam.deviceId) + param.addProperty("alarmStatus", alarmParam.alarmStatus) + param.addProperty("alarmType", alarmParam.alarmType) + param.addProperty("alarmVideo", alarmParam.alarmVideo) + param.addProperty("alarmValue", alarmParam.alarmValue) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addAlarm(AuthenticationHelper.token, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/utils/FileType.kt b/app/src/main/java/com/casic/br/ktd/utils/FileType.kt new file mode 100644 index 0000000..e72e22b --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/utils/FileType.kt @@ -0,0 +1,13 @@ +package com.casic.br.ktd.utils + +sealed class FileType { + /** + * 视频文件 + */ + object VIDEO : FileType() + + /** + * IMAGE图片 + */ + object IMAGE : FileType() +} diff --git a/app/src/main/java/com/casic/br/ktd/extensions/String.kt b/app/src/main/java/com/casic/br/ktd/extensions/String.kt index 6efd1a3..ee2db04 100644 --- a/app/src/main/java/com/casic/br/ktd/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ktd/extensions/String.kt @@ -2,11 +2,13 @@ import android.content.Context import com.casic.br.ktd.model.ErrorMessageModel +import com.casic.br.ktd.utils.LocaleConstant import com.casic.br.ktd.utils.OnImageCompressListener import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.dateToTimestamp +import com.pengxh.kt.lite.utils.SaveKeyValues import org.json.JSONObject import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener @@ -50,6 +52,16 @@ return dateFormat.format(Date(timestamp)) } +//拼接图片地址 +fun String.combineImagePath(): String { + if (this.isEmpty()) return this + val defaultValue = SaveKeyValues.getValue( + LocaleConstant.DEFAULT_SERVER_CONFIG, LocaleConstant.SERVER_BASE_URL + ) as String + //http://111.198.10.15:11646/static/2023-07/0fcc24a707cb4c53a9a85102e1578e91.jpg + return "$defaultValue/static/${this.replace("\\", "/")}" +} + fun String.compressImage(context: Context, listener: OnImageCompressListener) { Luban.with(context) .load(this) diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt index 50bdc7c..e965fd5 100644 --- a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt +++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt @@ -73,13 +73,13 @@ } } } - getTasksByPage(true) alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun onResume() { super.onResume() + getTasksByPage(true) //fragment切换时候重置侧滑按钮 swipeAction.clear() deviceId = SaveKeyValues.getValue(LocaleConstant.YT_DEVICE_ID, "") as String diff --git a/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt b/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt new file mode 100644 index 0000000..06a74c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt @@ -0,0 +1,18 @@ +package com.casic.br.ktd.model + +/** + * 报警记录上传的参数 + * */ +data class AlarmParam( + var alarmContent: String, + var alarmLongitude: String, + var alarmLatitude: String, + var alarmTime: String, + var alarmThresh: String, + var alarmPicture: String, + var deviceId: String, + var alarmStatus: String, + var alarmType: String, + var alarmVideo: String, + var alarmValue: String +) diff --git a/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java b/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java new file mode 100644 index 0000000..819a760 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class UploadResultModel { + + private int code; + private String data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt index ced6d54..1b0a093 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt @@ -1,5 +1,6 @@ package com.casic.br.ktd.retrofit +import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.* @@ -97,4 +98,23 @@ @QueryMap limit: Map, @QueryMap offset: Map, ): String + + /** + * 上传文件 + */ + @Multipart + @POST("/alarm/savePictures") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 新增报警记录 + */ + @POST("/alarm/add") + suspend fun addAlarm( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt index 82e55ae..6646fd0 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt @@ -1,14 +1,20 @@ package com.casic.br.ktd.retrofit +import com.casic.br.ktd.model.AlarmParam import com.casic.br.ktd.model.TaskParam import com.casic.br.ktd.utils.AuthenticationHelper +import com.casic.br.ktd.utils.FileType import com.casic.br.ktd.utils.LocaleConstant import com.google.gson.JsonObject import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import org.json.JSONObject +import java.io.File object RetrofitServiceManager { private val api by lazy { @@ -179,4 +185,38 @@ offsetMap["offset"] = 1 return api.getAlarmRules(AuthenticationHelper.token, limitMap, offsetMap) } + + /** + * 上传文件 + */ + suspend fun uploadFile(file: File, type: FileType): String { + val requestBody = when (type) { + FileType.IMAGE -> file.asRequestBody("image/png".toMediaTypeOrNull()) + else -> file.asRequestBody("video/mp4".toMediaTypeOrNull()) + } + val filePart = MultipartBody.Part.createFormData("multipartFile", file.name, requestBody) + return api.uploadFile(AuthenticationHelper.token, filePart) + } + + /** + * 新增报警记录 + */ + suspend fun addAlarm(alarmParam: AlarmParam): String { + val param = JsonObject() + param.addProperty("alarmContent", alarmParam.alarmContent) + param.addProperty("alarmLongitude", alarmParam.alarmLongitude) + param.addProperty("alarmLatitude", alarmParam.alarmLatitude) + param.addProperty("alarmTime", alarmParam.alarmTime) + param.addProperty("alarmThresh", alarmParam.alarmThresh) + param.addProperty("alarmPicture", alarmParam.alarmPicture) + param.addProperty("deviceId", alarmParam.deviceId) + param.addProperty("alarmStatus", alarmParam.alarmStatus) + param.addProperty("alarmType", alarmParam.alarmType) + param.addProperty("alarmVideo", alarmParam.alarmVideo) + param.addProperty("alarmValue", alarmParam.alarmValue) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addAlarm(AuthenticationHelper.token, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/utils/FileType.kt b/app/src/main/java/com/casic/br/ktd/utils/FileType.kt new file mode 100644 index 0000000..e72e22b --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/utils/FileType.kt @@ -0,0 +1,13 @@ +package com.casic.br.ktd.utils + +sealed class FileType { + /** + * 视频文件 + */ + object VIDEO : FileType() + + /** + * IMAGE图片 + */ + object IMAGE : FileType() +} diff --git a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt index d4f312e..531575d 100644 --- a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt @@ -26,15 +26,15 @@ import com.amap.api.maps.model.PolylineOptions import com.casic.br.ktd.R import com.casic.br.ktd.extensions.* -import com.casic.br.ktd.model.ChartPointModel -import com.casic.br.ktd.model.RouteModel -import com.casic.br.ktd.model.SensorDataModel -import com.casic.br.ktd.model.TaskParam +import com.casic.br.ktd.model.* import com.casic.br.ktd.netty.tcp.SocketManager import com.casic.br.ktd.netty.udp.UdpClient +import com.casic.br.ktd.utils.FileType import com.casic.br.ktd.utils.LoadingDialogHub import com.casic.br.ktd.utils.LocaleConstant import com.casic.br.ktd.utils.LocationHelper +import com.casic.br.ktd.vm.AlarmViewModel +import com.casic.br.ktd.vm.FileViewModel import com.casic.br.ktd.vm.PointViewModel import com.casic.br.ktd.vm.TaskViewModel import com.casic.br.ktd.widgets.AlertControlDialog @@ -61,6 +61,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import java.io.File import java.text.DecimalFormat import java.text.SimpleDateFormat import java.util.* @@ -116,8 +117,12 @@ private lateinit var uiSettings: UiSettings private lateinit var taskViewModel: TaskViewModel private lateinit var pointViewModel: PointViewModel + private lateinit var fileViewModel: FileViewModel + private lateinit var alarmViewModel: AlarmViewModel private lateinit var taskParam: TaskParam + private lateinit var alarmParam: AlarmParam private var carId = "" + private var deviceId = "" private var taskTitle = "" private var beginDate = "" private var dataModel: SensorDataModel? = null @@ -162,10 +167,22 @@ weakReferenceHandler = WeakReferenceHandler(this) taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] pointViewModel = ViewModelProvider(this)[PointViewModel::class.java] + fileViewModel = ViewModelProvider(this)[FileViewModel::class.java] + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] taskTitle = intent.getStringExtra(Constant.INTENT_PARAM).toString() carId = SaveKeyValues.getValue(LocaleConstant.CAR_ID, "") as String gasAlarmRule = SaveKeyValues.getValue(LocaleConstant.ALARM_RULE, 1000) as Int + deviceId = SaveKeyValues.getValue(LocaleConstant.YT_DEVICE_ID, "") as String + + fileViewModel.resultModel.observe(this) { + if (it.code == 200) { + if (alarmParam.alarmLongitude.isNotEmpty() && alarmParam.alarmLatitude.isNotEmpty()) { + alarmParam.alarmPicture = it.data + alarmViewModel.addAlarm(alarmParam) + } + } + } /** * 配置云台设备 @@ -183,50 +200,6 @@ setMapConfig(savedInstanceState) /** - * 手机GPS定位 - * */ -// val converter = CoordinateConverter(this) -// LocationHelper.get.obtainLocation(this, object : LocationHelper.ILocationListener { -// override fun onLocationGet(location: Location?) { -// if (location == null) { -// "当前信号弱,无法定位".show(context) -// return -// } -// -// //发送位置信息给UDP服务端 -// udpClient.send("${location.longitude}, ${location.latitude}") -// Log.d(kTag, "onLocationGet => 速度:${location.speed}") -// -// //WGS-84要转为高德坐标系 -// converter.from(CoordinateConverter.CoordType.GPS) -// converter.coord(LatLng(location.latitude, location.longitude)) -// val latLng = converter.convert() -// latlngs.add(latLng) -// -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(latLng, 13f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// -// //绘制线 -// aMap.addPolyline( -// PolylineOptions().addAll(latlngs).width(12f).color(Color.RED) -// ) -// -// if (isStartInspect) { -// val route = LinkedList() -// latlngs.forEach { -// route.add(RouteModel(it.latitude, it.longitude)) -// } -// } -// } -// -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// -// } -// }) - - /** * 高德定位 * */ LocationHelper.get.obtainLocationByGD(this, object : LocationHelper.ILocationListener { @@ -240,8 +213,16 @@ return } + val longitude = aMapLocation.longitude.toString() + val latitude = aMapLocation.latitude.toString() + //发送位置信息给UDP服务端 - udpClient.send("${aMapLocation.longitude}, ${aMapLocation.latitude}") + udpClient.send("$longitude, $latitude") + + //设置报警点的经纬度 + alarmParam.alarmLatitude = latitude + alarmParam.alarmLongitude = longitude + //上传经纬度以及甲烷浓度 val deviceStatus = if (dataModel?.methaneState == "正常") { "1" @@ -250,14 +231,14 @@ } pointViewModel.uploadPointDetail( isAlarm, - aMapLocation.latitude.toString(), + latitude, dataModel?.methane.toString(), dataModel?.vertical.toString(), "", aMapLocation.speed.toString(), deviceStatus, dataModel?.horizontal.toString(), - aMapLocation.longitude.toString(), + longitude, System.currentTimeMillis().timestampToCompleteDate() ) @@ -265,7 +246,7 @@ speed = decimalFormat.format(aMapLocation.speed * 3.6).toFloat() carSpeedView.text = String.format("${speed}Km/h") - val latLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) + val latLng = LatLng(latitude.toDouble(), longitude.toDouble()) latlngs.add(latLng) //移动到指定经纬度 @@ -728,7 +709,7 @@ if (!isAutoCapture) { "画面抓取成功".show(this) } else { - //TODO 上传 + fileViewModel.uploadFile(File(imagePath), FileType.IMAGE) } } } @@ -803,10 +784,25 @@ verticalDegreeView.text = String.format("${dataModel!!.vertical}$degree") gasConcentrationView.text = String.format("${dataModel!!.methane}ppm·m") - //TODO 报警图片、视频 + //TODO 报警视频 if (dataModel!!.methane >= gasAlarmRule) { isAlarm = "1" + //初始化alarmParam + alarmParam = AlarmParam( + "甲烷浓度超过阈值", + "", + "", + System.currentTimeMillis().timestampToCompleteDate(), + gasAlarmRule.toString(), + "", + deviceId, + "0", + "1", + "", + dataModel!!.methane.toString() + ) + captureImage(true) //抓取报警时候的视频并上传 diff --git a/app/src/main/java/com/casic/br/ktd/extensions/String.kt b/app/src/main/java/com/casic/br/ktd/extensions/String.kt index 6efd1a3..ee2db04 100644 --- a/app/src/main/java/com/casic/br/ktd/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ktd/extensions/String.kt @@ -2,11 +2,13 @@ import android.content.Context import com.casic.br.ktd.model.ErrorMessageModel +import com.casic.br.ktd.utils.LocaleConstant import com.casic.br.ktd.utils.OnImageCompressListener import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.dateToTimestamp +import com.pengxh.kt.lite.utils.SaveKeyValues import org.json.JSONObject import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener @@ -50,6 +52,16 @@ return dateFormat.format(Date(timestamp)) } +//拼接图片地址 +fun String.combineImagePath(): String { + if (this.isEmpty()) return this + val defaultValue = SaveKeyValues.getValue( + LocaleConstant.DEFAULT_SERVER_CONFIG, LocaleConstant.SERVER_BASE_URL + ) as String + //http://111.198.10.15:11646/static/2023-07/0fcc24a707cb4c53a9a85102e1578e91.jpg + return "$defaultValue/static/${this.replace("\\", "/")}" +} + fun String.compressImage(context: Context, listener: OnImageCompressListener) { Luban.with(context) .load(this) diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt index 50bdc7c..e965fd5 100644 --- a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt +++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt @@ -73,13 +73,13 @@ } } } - getTasksByPage(true) alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun onResume() { super.onResume() + getTasksByPage(true) //fragment切换时候重置侧滑按钮 swipeAction.clear() deviceId = SaveKeyValues.getValue(LocaleConstant.YT_DEVICE_ID, "") as String diff --git a/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt b/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt new file mode 100644 index 0000000..06a74c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt @@ -0,0 +1,18 @@ +package com.casic.br.ktd.model + +/** + * 报警记录上传的参数 + * */ +data class AlarmParam( + var alarmContent: String, + var alarmLongitude: String, + var alarmLatitude: String, + var alarmTime: String, + var alarmThresh: String, + var alarmPicture: String, + var deviceId: String, + var alarmStatus: String, + var alarmType: String, + var alarmVideo: String, + var alarmValue: String +) diff --git a/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java b/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java new file mode 100644 index 0000000..819a760 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class UploadResultModel { + + private int code; + private String data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt index ced6d54..1b0a093 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt @@ -1,5 +1,6 @@ package com.casic.br.ktd.retrofit +import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.* @@ -97,4 +98,23 @@ @QueryMap limit: Map, @QueryMap offset: Map, ): String + + /** + * 上传文件 + */ + @Multipart + @POST("/alarm/savePictures") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 新增报警记录 + */ + @POST("/alarm/add") + suspend fun addAlarm( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt index 82e55ae..6646fd0 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt @@ -1,14 +1,20 @@ package com.casic.br.ktd.retrofit +import com.casic.br.ktd.model.AlarmParam import com.casic.br.ktd.model.TaskParam import com.casic.br.ktd.utils.AuthenticationHelper +import com.casic.br.ktd.utils.FileType import com.casic.br.ktd.utils.LocaleConstant import com.google.gson.JsonObject import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import org.json.JSONObject +import java.io.File object RetrofitServiceManager { private val api by lazy { @@ -179,4 +185,38 @@ offsetMap["offset"] = 1 return api.getAlarmRules(AuthenticationHelper.token, limitMap, offsetMap) } + + /** + * 上传文件 + */ + suspend fun uploadFile(file: File, type: FileType): String { + val requestBody = when (type) { + FileType.IMAGE -> file.asRequestBody("image/png".toMediaTypeOrNull()) + else -> file.asRequestBody("video/mp4".toMediaTypeOrNull()) + } + val filePart = MultipartBody.Part.createFormData("multipartFile", file.name, requestBody) + return api.uploadFile(AuthenticationHelper.token, filePart) + } + + /** + * 新增报警记录 + */ + suspend fun addAlarm(alarmParam: AlarmParam): String { + val param = JsonObject() + param.addProperty("alarmContent", alarmParam.alarmContent) + param.addProperty("alarmLongitude", alarmParam.alarmLongitude) + param.addProperty("alarmLatitude", alarmParam.alarmLatitude) + param.addProperty("alarmTime", alarmParam.alarmTime) + param.addProperty("alarmThresh", alarmParam.alarmThresh) + param.addProperty("alarmPicture", alarmParam.alarmPicture) + param.addProperty("deviceId", alarmParam.deviceId) + param.addProperty("alarmStatus", alarmParam.alarmStatus) + param.addProperty("alarmType", alarmParam.alarmType) + param.addProperty("alarmVideo", alarmParam.alarmVideo) + param.addProperty("alarmValue", alarmParam.alarmValue) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addAlarm(AuthenticationHelper.token, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/utils/FileType.kt b/app/src/main/java/com/casic/br/ktd/utils/FileType.kt new file mode 100644 index 0000000..e72e22b --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/utils/FileType.kt @@ -0,0 +1,13 @@ +package com.casic.br.ktd.utils + +sealed class FileType { + /** + * 视频文件 + */ + object VIDEO : FileType() + + /** + * IMAGE图片 + */ + object IMAGE : FileType() +} diff --git a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt index d4f312e..531575d 100644 --- a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt @@ -26,15 +26,15 @@ import com.amap.api.maps.model.PolylineOptions import com.casic.br.ktd.R import com.casic.br.ktd.extensions.* -import com.casic.br.ktd.model.ChartPointModel -import com.casic.br.ktd.model.RouteModel -import com.casic.br.ktd.model.SensorDataModel -import com.casic.br.ktd.model.TaskParam +import com.casic.br.ktd.model.* import com.casic.br.ktd.netty.tcp.SocketManager import com.casic.br.ktd.netty.udp.UdpClient +import com.casic.br.ktd.utils.FileType import com.casic.br.ktd.utils.LoadingDialogHub import com.casic.br.ktd.utils.LocaleConstant import com.casic.br.ktd.utils.LocationHelper +import com.casic.br.ktd.vm.AlarmViewModel +import com.casic.br.ktd.vm.FileViewModel import com.casic.br.ktd.vm.PointViewModel import com.casic.br.ktd.vm.TaskViewModel import com.casic.br.ktd.widgets.AlertControlDialog @@ -61,6 +61,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import java.io.File import java.text.DecimalFormat import java.text.SimpleDateFormat import java.util.* @@ -116,8 +117,12 @@ private lateinit var uiSettings: UiSettings private lateinit var taskViewModel: TaskViewModel private lateinit var pointViewModel: PointViewModel + private lateinit var fileViewModel: FileViewModel + private lateinit var alarmViewModel: AlarmViewModel private lateinit var taskParam: TaskParam + private lateinit var alarmParam: AlarmParam private var carId = "" + private var deviceId = "" private var taskTitle = "" private var beginDate = "" private var dataModel: SensorDataModel? = null @@ -162,10 +167,22 @@ weakReferenceHandler = WeakReferenceHandler(this) taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] pointViewModel = ViewModelProvider(this)[PointViewModel::class.java] + fileViewModel = ViewModelProvider(this)[FileViewModel::class.java] + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] taskTitle = intent.getStringExtra(Constant.INTENT_PARAM).toString() carId = SaveKeyValues.getValue(LocaleConstant.CAR_ID, "") as String gasAlarmRule = SaveKeyValues.getValue(LocaleConstant.ALARM_RULE, 1000) as Int + deviceId = SaveKeyValues.getValue(LocaleConstant.YT_DEVICE_ID, "") as String + + fileViewModel.resultModel.observe(this) { + if (it.code == 200) { + if (alarmParam.alarmLongitude.isNotEmpty() && alarmParam.alarmLatitude.isNotEmpty()) { + alarmParam.alarmPicture = it.data + alarmViewModel.addAlarm(alarmParam) + } + } + } /** * 配置云台设备 @@ -183,50 +200,6 @@ setMapConfig(savedInstanceState) /** - * 手机GPS定位 - * */ -// val converter = CoordinateConverter(this) -// LocationHelper.get.obtainLocation(this, object : LocationHelper.ILocationListener { -// override fun onLocationGet(location: Location?) { -// if (location == null) { -// "当前信号弱,无法定位".show(context) -// return -// } -// -// //发送位置信息给UDP服务端 -// udpClient.send("${location.longitude}, ${location.latitude}") -// Log.d(kTag, "onLocationGet => 速度:${location.speed}") -// -// //WGS-84要转为高德坐标系 -// converter.from(CoordinateConverter.CoordType.GPS) -// converter.coord(LatLng(location.latitude, location.longitude)) -// val latLng = converter.convert() -// latlngs.add(latLng) -// -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(latLng, 13f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// -// //绘制线 -// aMap.addPolyline( -// PolylineOptions().addAll(latlngs).width(12f).color(Color.RED) -// ) -// -// if (isStartInspect) { -// val route = LinkedList() -// latlngs.forEach { -// route.add(RouteModel(it.latitude, it.longitude)) -// } -// } -// } -// -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// -// } -// }) - - /** * 高德定位 * */ LocationHelper.get.obtainLocationByGD(this, object : LocationHelper.ILocationListener { @@ -240,8 +213,16 @@ return } + val longitude = aMapLocation.longitude.toString() + val latitude = aMapLocation.latitude.toString() + //发送位置信息给UDP服务端 - udpClient.send("${aMapLocation.longitude}, ${aMapLocation.latitude}") + udpClient.send("$longitude, $latitude") + + //设置报警点的经纬度 + alarmParam.alarmLatitude = latitude + alarmParam.alarmLongitude = longitude + //上传经纬度以及甲烷浓度 val deviceStatus = if (dataModel?.methaneState == "正常") { "1" @@ -250,14 +231,14 @@ } pointViewModel.uploadPointDetail( isAlarm, - aMapLocation.latitude.toString(), + latitude, dataModel?.methane.toString(), dataModel?.vertical.toString(), "", aMapLocation.speed.toString(), deviceStatus, dataModel?.horizontal.toString(), - aMapLocation.longitude.toString(), + longitude, System.currentTimeMillis().timestampToCompleteDate() ) @@ -265,7 +246,7 @@ speed = decimalFormat.format(aMapLocation.speed * 3.6).toFloat() carSpeedView.text = String.format("${speed}Km/h") - val latLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) + val latLng = LatLng(latitude.toDouble(), longitude.toDouble()) latlngs.add(latLng) //移动到指定经纬度 @@ -728,7 +709,7 @@ if (!isAutoCapture) { "画面抓取成功".show(this) } else { - //TODO 上传 + fileViewModel.uploadFile(File(imagePath), FileType.IMAGE) } } } @@ -803,10 +784,25 @@ verticalDegreeView.text = String.format("${dataModel!!.vertical}$degree") gasConcentrationView.text = String.format("${dataModel!!.methane}ppm·m") - //TODO 报警图片、视频 + //TODO 报警视频 if (dataModel!!.methane >= gasAlarmRule) { isAlarm = "1" + //初始化alarmParam + alarmParam = AlarmParam( + "甲烷浓度超过阈值", + "", + "", + System.currentTimeMillis().timestampToCompleteDate(), + gasAlarmRule.toString(), + "", + deviceId, + "0", + "1", + "", + dataModel!!.methane.toString() + ) + captureImage(true) //抓取报警时候的视频并上传 diff --git a/app/src/main/java/com/casic/br/ktd/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/ktd/vm/AlarmViewModel.kt index 3b8117a..dc834ea 100644 --- a/app/src/main/java/com/casic/br/ktd/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/ktd/vm/AlarmViewModel.kt @@ -4,6 +4,7 @@ import com.casic.br.ktd.base.BaseApplication import com.casic.br.ktd.extensions.separateResponseCode import com.casic.br.ktd.extensions.toErrorMessage +import com.casic.br.ktd.model.AlarmParam import com.casic.br.ktd.model.AlarmRuleListModel import com.casic.br.ktd.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -47,4 +48,10 @@ }, { it.printStackTrace() }) + + fun addAlarm(alarmParam: AlarmParam) = launch({ + RetrofitServiceManager.addAlarm(alarmParam) + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/extensions/String.kt b/app/src/main/java/com/casic/br/ktd/extensions/String.kt index 6efd1a3..ee2db04 100644 --- a/app/src/main/java/com/casic/br/ktd/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ktd/extensions/String.kt @@ -2,11 +2,13 @@ import android.content.Context import com.casic.br.ktd.model.ErrorMessageModel +import com.casic.br.ktd.utils.LocaleConstant import com.casic.br.ktd.utils.OnImageCompressListener import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.dateToTimestamp +import com.pengxh.kt.lite.utils.SaveKeyValues import org.json.JSONObject import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener @@ -50,6 +52,16 @@ return dateFormat.format(Date(timestamp)) } +//拼接图片地址 +fun String.combineImagePath(): String { + if (this.isEmpty()) return this + val defaultValue = SaveKeyValues.getValue( + LocaleConstant.DEFAULT_SERVER_CONFIG, LocaleConstant.SERVER_BASE_URL + ) as String + //http://111.198.10.15:11646/static/2023-07/0fcc24a707cb4c53a9a85102e1578e91.jpg + return "$defaultValue/static/${this.replace("\\", "/")}" +} + fun String.compressImage(context: Context, listener: OnImageCompressListener) { Luban.with(context) .load(this) diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt index 50bdc7c..e965fd5 100644 --- a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt +++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt @@ -73,13 +73,13 @@ } } } - getTasksByPage(true) alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun onResume() { super.onResume() + getTasksByPage(true) //fragment切换时候重置侧滑按钮 swipeAction.clear() deviceId = SaveKeyValues.getValue(LocaleConstant.YT_DEVICE_ID, "") as String diff --git a/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt b/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt new file mode 100644 index 0000000..06a74c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/AlarmParam.kt @@ -0,0 +1,18 @@ +package com.casic.br.ktd.model + +/** + * 报警记录上传的参数 + * */ +data class AlarmParam( + var alarmContent: String, + var alarmLongitude: String, + var alarmLatitude: String, + var alarmTime: String, + var alarmThresh: String, + var alarmPicture: String, + var deviceId: String, + var alarmStatus: String, + var alarmType: String, + var alarmVideo: String, + var alarmValue: String +) diff --git a/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java b/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java new file mode 100644 index 0000000..819a760 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/UploadResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class UploadResultModel { + + private int code; + private String data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt index ced6d54..1b0a093 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt @@ -1,5 +1,6 @@ package com.casic.br.ktd.retrofit +import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.* @@ -97,4 +98,23 @@ @QueryMap limit: Map, @QueryMap offset: Map, ): String + + /** + * 上传文件 + */ + @Multipart + @POST("/alarm/savePictures") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 新增报警记录 + */ + @POST("/alarm/add") + suspend fun addAlarm( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt index 82e55ae..6646fd0 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt @@ -1,14 +1,20 @@ package com.casic.br.ktd.retrofit +import com.casic.br.ktd.model.AlarmParam import com.casic.br.ktd.model.TaskParam import com.casic.br.ktd.utils.AuthenticationHelper +import com.casic.br.ktd.utils.FileType import com.casic.br.ktd.utils.LocaleConstant import com.google.gson.JsonObject import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import org.json.JSONObject +import java.io.File object RetrofitServiceManager { private val api by lazy { @@ -179,4 +185,38 @@ offsetMap["offset"] = 1 return api.getAlarmRules(AuthenticationHelper.token, limitMap, offsetMap) } + + /** + * 上传文件 + */ + suspend fun uploadFile(file: File, type: FileType): String { + val requestBody = when (type) { + FileType.IMAGE -> file.asRequestBody("image/png".toMediaTypeOrNull()) + else -> file.asRequestBody("video/mp4".toMediaTypeOrNull()) + } + val filePart = MultipartBody.Part.createFormData("multipartFile", file.name, requestBody) + return api.uploadFile(AuthenticationHelper.token, filePart) + } + + /** + * 新增报警记录 + */ + suspend fun addAlarm(alarmParam: AlarmParam): String { + val param = JsonObject() + param.addProperty("alarmContent", alarmParam.alarmContent) + param.addProperty("alarmLongitude", alarmParam.alarmLongitude) + param.addProperty("alarmLatitude", alarmParam.alarmLatitude) + param.addProperty("alarmTime", alarmParam.alarmTime) + param.addProperty("alarmThresh", alarmParam.alarmThresh) + param.addProperty("alarmPicture", alarmParam.alarmPicture) + param.addProperty("deviceId", alarmParam.deviceId) + param.addProperty("alarmStatus", alarmParam.alarmStatus) + param.addProperty("alarmType", alarmParam.alarmType) + param.addProperty("alarmVideo", alarmParam.alarmVideo) + param.addProperty("alarmValue", alarmParam.alarmValue) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addAlarm(AuthenticationHelper.token, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/utils/FileType.kt b/app/src/main/java/com/casic/br/ktd/utils/FileType.kt new file mode 100644 index 0000000..e72e22b --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/utils/FileType.kt @@ -0,0 +1,13 @@ +package com.casic.br.ktd.utils + +sealed class FileType { + /** + * 视频文件 + */ + object VIDEO : FileType() + + /** + * IMAGE图片 + */ + object IMAGE : FileType() +} diff --git a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt index d4f312e..531575d 100644 --- a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt @@ -26,15 +26,15 @@ import com.amap.api.maps.model.PolylineOptions import com.casic.br.ktd.R import com.casic.br.ktd.extensions.* -import com.casic.br.ktd.model.ChartPointModel -import com.casic.br.ktd.model.RouteModel -import com.casic.br.ktd.model.SensorDataModel -import com.casic.br.ktd.model.TaskParam +import com.casic.br.ktd.model.* import com.casic.br.ktd.netty.tcp.SocketManager import com.casic.br.ktd.netty.udp.UdpClient +import com.casic.br.ktd.utils.FileType import com.casic.br.ktd.utils.LoadingDialogHub import com.casic.br.ktd.utils.LocaleConstant import com.casic.br.ktd.utils.LocationHelper +import com.casic.br.ktd.vm.AlarmViewModel +import com.casic.br.ktd.vm.FileViewModel import com.casic.br.ktd.vm.PointViewModel import com.casic.br.ktd.vm.TaskViewModel import com.casic.br.ktd.widgets.AlertControlDialog @@ -61,6 +61,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import java.io.File import java.text.DecimalFormat import java.text.SimpleDateFormat import java.util.* @@ -116,8 +117,12 @@ private lateinit var uiSettings: UiSettings private lateinit var taskViewModel: TaskViewModel private lateinit var pointViewModel: PointViewModel + private lateinit var fileViewModel: FileViewModel + private lateinit var alarmViewModel: AlarmViewModel private lateinit var taskParam: TaskParam + private lateinit var alarmParam: AlarmParam private var carId = "" + private var deviceId = "" private var taskTitle = "" private var beginDate = "" private var dataModel: SensorDataModel? = null @@ -162,10 +167,22 @@ weakReferenceHandler = WeakReferenceHandler(this) taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] pointViewModel = ViewModelProvider(this)[PointViewModel::class.java] + fileViewModel = ViewModelProvider(this)[FileViewModel::class.java] + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] taskTitle = intent.getStringExtra(Constant.INTENT_PARAM).toString() carId = SaveKeyValues.getValue(LocaleConstant.CAR_ID, "") as String gasAlarmRule = SaveKeyValues.getValue(LocaleConstant.ALARM_RULE, 1000) as Int + deviceId = SaveKeyValues.getValue(LocaleConstant.YT_DEVICE_ID, "") as String + + fileViewModel.resultModel.observe(this) { + if (it.code == 200) { + if (alarmParam.alarmLongitude.isNotEmpty() && alarmParam.alarmLatitude.isNotEmpty()) { + alarmParam.alarmPicture = it.data + alarmViewModel.addAlarm(alarmParam) + } + } + } /** * 配置云台设备 @@ -183,50 +200,6 @@ setMapConfig(savedInstanceState) /** - * 手机GPS定位 - * */ -// val converter = CoordinateConverter(this) -// LocationHelper.get.obtainLocation(this, object : LocationHelper.ILocationListener { -// override fun onLocationGet(location: Location?) { -// if (location == null) { -// "当前信号弱,无法定位".show(context) -// return -// } -// -// //发送位置信息给UDP服务端 -// udpClient.send("${location.longitude}, ${location.latitude}") -// Log.d(kTag, "onLocationGet => 速度:${location.speed}") -// -// //WGS-84要转为高德坐标系 -// converter.from(CoordinateConverter.CoordType.GPS) -// converter.coord(LatLng(location.latitude, location.longitude)) -// val latLng = converter.convert() -// latlngs.add(latLng) -// -// //移动到指定经纬度 -// val cameraPosition = CameraPosition(latLng, 13f, 0f, 0f) -// val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) -// -// //绘制线 -// aMap.addPolyline( -// PolylineOptions().addAll(latlngs).width(12f).color(Color.RED) -// ) -// -// if (isStartInspect) { -// val route = LinkedList() -// latlngs.forEach { -// route.add(RouteModel(it.latitude, it.longitude)) -// } -// } -// } -// -// override fun onAMapLocationGet(aMapLocation: AMapLocation?) { -// -// } -// }) - - /** * 高德定位 * */ LocationHelper.get.obtainLocationByGD(this, object : LocationHelper.ILocationListener { @@ -240,8 +213,16 @@ return } + val longitude = aMapLocation.longitude.toString() + val latitude = aMapLocation.latitude.toString() + //发送位置信息给UDP服务端 - udpClient.send("${aMapLocation.longitude}, ${aMapLocation.latitude}") + udpClient.send("$longitude, $latitude") + + //设置报警点的经纬度 + alarmParam.alarmLatitude = latitude + alarmParam.alarmLongitude = longitude + //上传经纬度以及甲烷浓度 val deviceStatus = if (dataModel?.methaneState == "正常") { "1" @@ -250,14 +231,14 @@ } pointViewModel.uploadPointDetail( isAlarm, - aMapLocation.latitude.toString(), + latitude, dataModel?.methane.toString(), dataModel?.vertical.toString(), "", aMapLocation.speed.toString(), deviceStatus, dataModel?.horizontal.toString(), - aMapLocation.longitude.toString(), + longitude, System.currentTimeMillis().timestampToCompleteDate() ) @@ -265,7 +246,7 @@ speed = decimalFormat.format(aMapLocation.speed * 3.6).toFloat() carSpeedView.text = String.format("${speed}Km/h") - val latLng = LatLng(aMapLocation.latitude, aMapLocation.longitude) + val latLng = LatLng(latitude.toDouble(), longitude.toDouble()) latlngs.add(latLng) //移动到指定经纬度 @@ -728,7 +709,7 @@ if (!isAutoCapture) { "画面抓取成功".show(this) } else { - //TODO 上传 + fileViewModel.uploadFile(File(imagePath), FileType.IMAGE) } } } @@ -803,10 +784,25 @@ verticalDegreeView.text = String.format("${dataModel!!.vertical}$degree") gasConcentrationView.text = String.format("${dataModel!!.methane}ppm·m") - //TODO 报警图片、视频 + //TODO 报警视频 if (dataModel!!.methane >= gasAlarmRule) { isAlarm = "1" + //初始化alarmParam + alarmParam = AlarmParam( + "甲烷浓度超过阈值", + "", + "", + System.currentTimeMillis().timestampToCompleteDate(), + gasAlarmRule.toString(), + "", + deviceId, + "0", + "1", + "", + dataModel!!.methane.toString() + ) + captureImage(true) //抓取报警时候的视频并上传 diff --git a/app/src/main/java/com/casic/br/ktd/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/ktd/vm/AlarmViewModel.kt index 3b8117a..dc834ea 100644 --- a/app/src/main/java/com/casic/br/ktd/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/ktd/vm/AlarmViewModel.kt @@ -4,6 +4,7 @@ import com.casic.br.ktd.base.BaseApplication import com.casic.br.ktd.extensions.separateResponseCode import com.casic.br.ktd.extensions.toErrorMessage +import com.casic.br.ktd.model.AlarmParam import com.casic.br.ktd.model.AlarmRuleListModel import com.casic.br.ktd.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -47,4 +48,10 @@ }, { it.printStackTrace() }) + + fun addAlarm(alarmParam: AlarmParam) = launch({ + RetrofitServiceManager.addAlarm(alarmParam) + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/vm/FileViewModel.kt b/app/src/main/java/com/casic/br/ktd/vm/FileViewModel.kt new file mode 100644 index 0000000..7cce544 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/vm/FileViewModel.kt @@ -0,0 +1,30 @@ +package com.casic.br.ktd.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.br.ktd.extensions.separateResponseCode +import com.casic.br.ktd.model.UploadResultModel +import com.casic.br.ktd.retrofit.RetrofitServiceManager +import com.casic.br.ktd.utils.FileType +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel +import java.io.File + +class FileViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val resultModel = MutableLiveData() + + fun uploadFile(file: File, type: FileType) = launch({ + val response = RetrofitServiceManager.uploadFile(file, type) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file