diff --git a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java index 034a92f..d08cc9e 100644 --- a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java +++ b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java @@ -61,6 +61,7 @@ private String vastCode; private String workerId; private String workerName; + private String gasTime; public boolean getAlarmFlag() { return alarmFlag; @@ -213,5 +214,13 @@ public void setWorkerName(String workerName) { this.workerName = workerName; } + + public String getGasTime() { + return gasTime; + } + + public void setGasTime(String gasTime) { + this.gasTime = gasTime; + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java index 034a92f..d08cc9e 100644 --- a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java +++ b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java @@ -61,6 +61,7 @@ private String vastCode; private String workerId; private String workerName; + private String gasTime; public boolean getAlarmFlag() { return alarmFlag; @@ -213,5 +214,13 @@ public void setWorkerName(String workerName) { this.workerName = workerName; } + + public String getGasTime() { + return gasTime; + } + + public void setGasTime(String gasTime) { + this.gasTime = gasTime; + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index 3a83a6e..07a4d94 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -133,12 +133,21 @@ suspend fun getAlarmDetail(@Header("token") token: String, @Query("id") id: String): String /** - * 声光报警开关 + * 切换场景阶段 */ @POST("/setPhase") suspend fun setCurrentPhase(@Body requestBody: RequestBody): String /** + * 提交场景下的数据 + */ + @POST("/prepare/upload") + suspend fun uploadPhaseData( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 声光报警开关 */ @POST("/setAlarmState") diff --git a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java index 034a92f..d08cc9e 100644 --- a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java +++ b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java @@ -61,6 +61,7 @@ private String vastCode; private String workerId; private String workerName; + private String gasTime; public boolean getAlarmFlag() { return alarmFlag; @@ -213,5 +214,13 @@ public void setWorkerName(String workerName) { this.workerName = workerName; } + + public String getGasTime() { + return gasTime; + } + + public void setGasTime(String gasTime) { + this.gasTime = gasTime; + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index 3a83a6e..07a4d94 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -133,12 +133,21 @@ suspend fun getAlarmDetail(@Header("token") token: String, @Query("id") id: String): String /** - * 声光报警开关 + * 切换场景阶段 */ @POST("/setPhase") suspend fun setCurrentPhase(@Body requestBody: RequestBody): String /** + * 提交场景下的数据 + */ + @POST("/prepare/upload") + suspend fun uploadPhaseData( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 声光报警开关 */ @POST("/setAlarmState") diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 36f79ca..395aa7e 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,7 @@ import com.casic.br.operationsite.model.ImageModel import com.casic.br.operationsite.utils.AuthenticationHelper import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RuntimeCache import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.reflect.TypeToken @@ -244,6 +245,29 @@ } /** + * 提交场景下的数据 + */ + suspend fun uploadPhaseData( + phase: String, imageList: ArrayList, base64List: ArrayList + ): String { + val param = JsonObject() + param.addProperty("projectId", RuntimeCache.projectId) + param.addProperty("phase", phase) + + val typeToken = object : TypeToken>() {}.type + param.add( + "pathList", gson.toJsonTree(imageList, typeToken).asJsonArray + ) + param.add("base64List", gson.toJsonTree(base64List, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return api.uploadPhaseData(AuthenticationHelper.token!!, requestBody) + } + + /** * 设置声光报警开关 */ suspend fun changeAlarmState(state: String): String { diff --git a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java index 034a92f..d08cc9e 100644 --- a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java +++ b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java @@ -61,6 +61,7 @@ private String vastCode; private String workerId; private String workerName; + private String gasTime; public boolean getAlarmFlag() { return alarmFlag; @@ -213,5 +214,13 @@ public void setWorkerName(String workerName) { this.workerName = workerName; } + + public String getGasTime() { + return gasTime; + } + + public void setGasTime(String gasTime) { + this.gasTime = gasTime; + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index 3a83a6e..07a4d94 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -133,12 +133,21 @@ suspend fun getAlarmDetail(@Header("token") token: String, @Query("id") id: String): String /** - * 声光报警开关 + * 切换场景阶段 */ @POST("/setPhase") suspend fun setCurrentPhase(@Body requestBody: RequestBody): String /** + * 提交场景下的数据 + */ + @POST("/prepare/upload") + suspend fun uploadPhaseData( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 声光报警开关 */ @POST("/setAlarmState") diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 36f79ca..395aa7e 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,7 @@ import com.casic.br.operationsite.model.ImageModel import com.casic.br.operationsite.utils.AuthenticationHelper import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RuntimeCache import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.reflect.TypeToken @@ -244,6 +245,29 @@ } /** + * 提交场景下的数据 + */ + suspend fun uploadPhaseData( + phase: String, imageList: ArrayList, base64List: ArrayList + ): String { + val param = JsonObject() + param.addProperty("projectId", RuntimeCache.projectId) + param.addProperty("phase", phase) + + val typeToken = object : TypeToken>() {}.type + param.add( + "pathList", gson.toJsonTree(imageList, typeToken).asJsonArray + ) + param.add("base64List", gson.toJsonTree(base64List, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return api.uploadPhaseData(AuthenticationHelper.token!!, requestBody) + } + + /** * 设置声光报警开关 */ suspend fun changeAlarmState(state: String): String { diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index e73f60e..9abce0f 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -84,6 +84,8 @@ //作业前检测 val START_ENV_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x06, 0x00, 0x9A.toByte()) + val CONFIRM_BLOWER_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x08, 0x00, 0x9C.toByte()) val END_ENV_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x09, 0x00, 0x9D.toByte()) @@ -92,4 +94,8 @@ byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x0A, 0x00, 0x9E.toByte()) val START_VIDEO_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x11, 0x00, 0xA5.toByte()) + + //甲烷阈值报警 + val GAS_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x14, 0x00, 0xA8.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java index 034a92f..d08cc9e 100644 --- a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java +++ b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java @@ -61,6 +61,7 @@ private String vastCode; private String workerId; private String workerName; + private String gasTime; public boolean getAlarmFlag() { return alarmFlag; @@ -213,5 +214,13 @@ public void setWorkerName(String workerName) { this.workerName = workerName; } + + public String getGasTime() { + return gasTime; + } + + public void setGasTime(String gasTime) { + this.gasTime = gasTime; + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index 3a83a6e..07a4d94 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -133,12 +133,21 @@ suspend fun getAlarmDetail(@Header("token") token: String, @Query("id") id: String): String /** - * 声光报警开关 + * 切换场景阶段 */ @POST("/setPhase") suspend fun setCurrentPhase(@Body requestBody: RequestBody): String /** + * 提交场景下的数据 + */ + @POST("/prepare/upload") + suspend fun uploadPhaseData( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 声光报警开关 */ @POST("/setAlarmState") diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 36f79ca..395aa7e 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,7 @@ import com.casic.br.operationsite.model.ImageModel import com.casic.br.operationsite.utils.AuthenticationHelper import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RuntimeCache import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.reflect.TypeToken @@ -244,6 +245,29 @@ } /** + * 提交场景下的数据 + */ + suspend fun uploadPhaseData( + phase: String, imageList: ArrayList, base64List: ArrayList + ): String { + val param = JsonObject() + param.addProperty("projectId", RuntimeCache.projectId) + param.addProperty("phase", phase) + + val typeToken = object : TypeToken>() {}.type + param.add( + "pathList", gson.toJsonTree(imageList, typeToken).asJsonArray + ) + param.add("base64List", gson.toJsonTree(base64List, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return api.uploadPhaseData(AuthenticationHelper.token!!, requestBody) + } + + /** * 设置声光报警开关 */ suspend fun changeAlarmState(state: String): String { diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index e73f60e..9abce0f 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -84,6 +84,8 @@ //作业前检测 val START_ENV_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x06, 0x00, 0x9A.toByte()) + val CONFIRM_BLOWER_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x08, 0x00, 0x9C.toByte()) val END_ENV_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x09, 0x00, 0x9D.toByte()) @@ -92,4 +94,8 @@ byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x0A, 0x00, 0x9E.toByte()) val START_VIDEO_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x11, 0x00, 0xA5.toByte()) + + //甲烷阈值报警 + val GAS_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x14, 0x00, 0xA8.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt index 3628b8b..e513c9d 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt @@ -28,6 +28,7 @@ import com.casic.br.operationsite.utils.tcp.ISocketListener import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.common.util.concurrent.ListenableFuture import com.luck.picture.lib.basic.PictureSelector @@ -75,6 +76,7 @@ private lateinit var imageAnalysis: ImageAnalysis private lateinit var uploadFileViewModel: UploadFileViewModel private lateinit var imageAdapter: EditableImageAdapter + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 private var isStart = false @@ -151,6 +153,7 @@ } //发送指令 SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) +// constructionCheckViewModel.uploadPhaseData(this, "brief", imagePaths, arrayListOf()) navigatePageTo() } } @@ -190,6 +193,13 @@ } } } + +// constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] +// constructionCheckViewModel.uploadDataResult.observe(this) { +// if (it) { +// navigatePageTo() +// } +// } } private fun bindPreview(cameraProvider: ProcessCameraProvider) { @@ -310,6 +320,13 @@ else -> LoadingDialogHub.dismiss() } } + +// constructionCheckViewModel.loadState.observe(this) { +// when (it) { +// LoadState.Loading -> LoadingDialogHub.show(this, "数据提交中,请稍后...") +// else -> LoadingDialogHub.dismiss() +// } +// } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java index 034a92f..d08cc9e 100644 --- a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java +++ b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java @@ -61,6 +61,7 @@ private String vastCode; private String workerId; private String workerName; + private String gasTime; public boolean getAlarmFlag() { return alarmFlag; @@ -213,5 +214,13 @@ public void setWorkerName(String workerName) { this.workerName = workerName; } + + public String getGasTime() { + return gasTime; + } + + public void setGasTime(String gasTime) { + this.gasTime = gasTime; + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index 3a83a6e..07a4d94 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -133,12 +133,21 @@ suspend fun getAlarmDetail(@Header("token") token: String, @Query("id") id: String): String /** - * 声光报警开关 + * 切换场景阶段 */ @POST("/setPhase") suspend fun setCurrentPhase(@Body requestBody: RequestBody): String /** + * 提交场景下的数据 + */ + @POST("/prepare/upload") + suspend fun uploadPhaseData( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 声光报警开关 */ @POST("/setAlarmState") diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 36f79ca..395aa7e 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,7 @@ import com.casic.br.operationsite.model.ImageModel import com.casic.br.operationsite.utils.AuthenticationHelper import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RuntimeCache import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.reflect.TypeToken @@ -244,6 +245,29 @@ } /** + * 提交场景下的数据 + */ + suspend fun uploadPhaseData( + phase: String, imageList: ArrayList, base64List: ArrayList + ): String { + val param = JsonObject() + param.addProperty("projectId", RuntimeCache.projectId) + param.addProperty("phase", phase) + + val typeToken = object : TypeToken>() {}.type + param.add( + "pathList", gson.toJsonTree(imageList, typeToken).asJsonArray + ) + param.add("base64List", gson.toJsonTree(base64List, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return api.uploadPhaseData(AuthenticationHelper.token!!, requestBody) + } + + /** * 设置声光报警开关 */ suspend fun changeAlarmState(state: String): String { diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index e73f60e..9abce0f 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -84,6 +84,8 @@ //作业前检测 val START_ENV_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x06, 0x00, 0x9A.toByte()) + val CONFIRM_BLOWER_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x08, 0x00, 0x9C.toByte()) val END_ENV_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x09, 0x00, 0x9D.toByte()) @@ -92,4 +94,8 @@ byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x0A, 0x00, 0x9E.toByte()) val START_VIDEO_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x11, 0x00, 0xA5.toByte()) + + //甲烷阈值报警 + val GAS_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x14, 0x00, 0xA8.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt index 3628b8b..e513c9d 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt @@ -28,6 +28,7 @@ import com.casic.br.operationsite.utils.tcp.ISocketListener import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.common.util.concurrent.ListenableFuture import com.luck.picture.lib.basic.PictureSelector @@ -75,6 +76,7 @@ private lateinit var imageAnalysis: ImageAnalysis private lateinit var uploadFileViewModel: UploadFileViewModel private lateinit var imageAdapter: EditableImageAdapter + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 private var isStart = false @@ -151,6 +153,7 @@ } //发送指令 SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) +// constructionCheckViewModel.uploadPhaseData(this, "brief", imagePaths, arrayListOf()) navigatePageTo() } } @@ -190,6 +193,13 @@ } } } + +// constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] +// constructionCheckViewModel.uploadDataResult.observe(this) { +// if (it) { +// navigatePageTo() +// } +// } } private fun bindPreview(cameraProvider: ProcessCameraProvider) { @@ -310,6 +320,13 @@ else -> LoadingDialogHub.dismiss() } } + +// constructionCheckViewModel.loadState.observe(this) { +// when (it) { +// LoadState.Loading -> LoadingDialogHub.show(this, "数据提交中,请稍后...") +// else -> LoadingDialogHub.dismiss() +// } +// } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt index e099389..7dfb554 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt @@ -16,6 +16,7 @@ import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.RuntimeCache import com.casic.br.operationsite.utils.VideoPlayerManager +import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.view.WorkTaskActivity @@ -32,6 +33,8 @@ import com.pengxh.kt.lite.extensions.saveImage import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -91,7 +94,7 @@ } binding.startVideoCheckButton.setOnClickListener { - constructionCheckViewModel.setCurrentPhase("in_operation") + constructionCheckViewModel.setCurrentPhase(this, "in_operation") } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { @@ -179,17 +182,20 @@ initWebSocket() } } - }, 0, 5000) + }, 0, 2000) workSiteViewModel.workerResult.observe(this) { if (it.code == 200) { - it.data.forEach { worker -> - if (worker.lat.isNotBlank() && worker.lng.isNotBlank()) { - binding.heartRateView.text = "心率:${worker.heartRate}bpm" - binding.bloodOxygenView.text = "血氧:${worker.bloodOxygen}%" - binding.coValueView.text = "一氧化碳:${worker.co}ppm" - binding.gasValueView.text = "甲烷:${worker.gas}ppm" - binding.h2sValueView.text = "硫化氢:${worker.co}ppm" - binding.o2ValueView.text = "氧气:${worker.o2}%VOL" + it.data.first().apply { + binding.heartRateView.text = "心率:${heartRate}bpm" + binding.bloodOxygenView.text = "血氧:${bloodOxygen}%" + binding.coValueView.text = "一氧化碳:${co}ppm" + binding.gasValueView.text = "甲烷:${gas}ppm" + binding.h2sValueView.text = "硫化氢:${co}ppm" + binding.o2ValueView.text = "氧气:${o2}%VOL" + binding.valueUpdateView.text = "更新时间:${gasTime}" + + if (gas.toInt() >= 20) { + SocketManager.get.send(LocaleConstant.GAS_COMMAND) } } } @@ -267,7 +273,25 @@ } override fun observeRequestState() { + constructionCheckViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "数据提交中,请稍后...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + ActivityStackManager.finishAllActivity() + navigatePageTo() + finish() + } + + else -> { + "数据提交失败,请重试...".show(this) + LoadingDialogHub.dismiss() + } + } + } } override fun setupTopBarLayout() { @@ -289,11 +313,7 @@ .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { - constructionCheckViewModel.setCurrentPhase("stop") - - ActivityStackManager.finishAllActivity() - navigatePageTo() - finish() + constructionCheckViewModel.setCurrentPhase(context, "stop") } override fun onCancelClick() {} diff --git a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java index 034a92f..d08cc9e 100644 --- a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java +++ b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java @@ -61,6 +61,7 @@ private String vastCode; private String workerId; private String workerName; + private String gasTime; public boolean getAlarmFlag() { return alarmFlag; @@ -213,5 +214,13 @@ public void setWorkerName(String workerName) { this.workerName = workerName; } + + public String getGasTime() { + return gasTime; + } + + public void setGasTime(String gasTime) { + this.gasTime = gasTime; + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index 3a83a6e..07a4d94 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -133,12 +133,21 @@ suspend fun getAlarmDetail(@Header("token") token: String, @Query("id") id: String): String /** - * 声光报警开关 + * 切换场景阶段 */ @POST("/setPhase") suspend fun setCurrentPhase(@Body requestBody: RequestBody): String /** + * 提交场景下的数据 + */ + @POST("/prepare/upload") + suspend fun uploadPhaseData( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 声光报警开关 */ @POST("/setAlarmState") diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 36f79ca..395aa7e 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,7 @@ import com.casic.br.operationsite.model.ImageModel import com.casic.br.operationsite.utils.AuthenticationHelper import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RuntimeCache import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.reflect.TypeToken @@ -244,6 +245,29 @@ } /** + * 提交场景下的数据 + */ + suspend fun uploadPhaseData( + phase: String, imageList: ArrayList, base64List: ArrayList + ): String { + val param = JsonObject() + param.addProperty("projectId", RuntimeCache.projectId) + param.addProperty("phase", phase) + + val typeToken = object : TypeToken>() {}.type + param.add( + "pathList", gson.toJsonTree(imageList, typeToken).asJsonArray + ) + param.add("base64List", gson.toJsonTree(base64List, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return api.uploadPhaseData(AuthenticationHelper.token!!, requestBody) + } + + /** * 设置声光报警开关 */ suspend fun changeAlarmState(state: String): String { diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index e73f60e..9abce0f 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -84,6 +84,8 @@ //作业前检测 val START_ENV_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x06, 0x00, 0x9A.toByte()) + val CONFIRM_BLOWER_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x08, 0x00, 0x9C.toByte()) val END_ENV_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x09, 0x00, 0x9D.toByte()) @@ -92,4 +94,8 @@ byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x0A, 0x00, 0x9E.toByte()) val START_VIDEO_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x11, 0x00, 0xA5.toByte()) + + //甲烷阈值报警 + val GAS_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x14, 0x00, 0xA8.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt index 3628b8b..e513c9d 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt @@ -28,6 +28,7 @@ import com.casic.br.operationsite.utils.tcp.ISocketListener import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.common.util.concurrent.ListenableFuture import com.luck.picture.lib.basic.PictureSelector @@ -75,6 +76,7 @@ private lateinit var imageAnalysis: ImageAnalysis private lateinit var uploadFileViewModel: UploadFileViewModel private lateinit var imageAdapter: EditableImageAdapter + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 private var isStart = false @@ -151,6 +153,7 @@ } //发送指令 SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) +// constructionCheckViewModel.uploadPhaseData(this, "brief", imagePaths, arrayListOf()) navigatePageTo() } } @@ -190,6 +193,13 @@ } } } + +// constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] +// constructionCheckViewModel.uploadDataResult.observe(this) { +// if (it) { +// navigatePageTo() +// } +// } } private fun bindPreview(cameraProvider: ProcessCameraProvider) { @@ -310,6 +320,13 @@ else -> LoadingDialogHub.dismiss() } } + +// constructionCheckViewModel.loadState.observe(this) { +// when (it) { +// LoadState.Loading -> LoadingDialogHub.show(this, "数据提交中,请稍后...") +// else -> LoadingDialogHub.dismiss() +// } +// } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt index e099389..7dfb554 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt @@ -16,6 +16,7 @@ import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.RuntimeCache import com.casic.br.operationsite.utils.VideoPlayerManager +import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.view.WorkTaskActivity @@ -32,6 +33,8 @@ import com.pengxh.kt.lite.extensions.saveImage import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -91,7 +94,7 @@ } binding.startVideoCheckButton.setOnClickListener { - constructionCheckViewModel.setCurrentPhase("in_operation") + constructionCheckViewModel.setCurrentPhase(this, "in_operation") } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { @@ -179,17 +182,20 @@ initWebSocket() } } - }, 0, 5000) + }, 0, 2000) workSiteViewModel.workerResult.observe(this) { if (it.code == 200) { - it.data.forEach { worker -> - if (worker.lat.isNotBlank() && worker.lng.isNotBlank()) { - binding.heartRateView.text = "心率:${worker.heartRate}bpm" - binding.bloodOxygenView.text = "血氧:${worker.bloodOxygen}%" - binding.coValueView.text = "一氧化碳:${worker.co}ppm" - binding.gasValueView.text = "甲烷:${worker.gas}ppm" - binding.h2sValueView.text = "硫化氢:${worker.co}ppm" - binding.o2ValueView.text = "氧气:${worker.o2}%VOL" + it.data.first().apply { + binding.heartRateView.text = "心率:${heartRate}bpm" + binding.bloodOxygenView.text = "血氧:${bloodOxygen}%" + binding.coValueView.text = "一氧化碳:${co}ppm" + binding.gasValueView.text = "甲烷:${gas}ppm" + binding.h2sValueView.text = "硫化氢:${co}ppm" + binding.o2ValueView.text = "氧气:${o2}%VOL" + binding.valueUpdateView.text = "更新时间:${gasTime}" + + if (gas.toInt() >= 20) { + SocketManager.get.send(LocaleConstant.GAS_COMMAND) } } } @@ -267,7 +273,25 @@ } override fun observeRequestState() { + constructionCheckViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "数据提交中,请稍后...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + ActivityStackManager.finishAllActivity() + navigatePageTo() + finish() + } + + else -> { + "数据提交失败,请重试...".show(this) + LoadingDialogHub.dismiss() + } + } + } } override fun setupTopBarLayout() { @@ -289,11 +313,7 @@ .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { - constructionCheckViewModel.setCurrentPhase("stop") - - ActivityStackManager.finishAllActivity() - navigatePageTo() - finish() + constructionCheckViewModel.setCurrentPhase(context, "stop") } override fun onCancelClick() {} diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt index bffdc12..0591a59 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.operationsite.view.check -import android.content.Intent import android.graphics.BitmapFactory import android.os.Bundle import android.os.Handler @@ -20,7 +19,6 @@ import com.casic.br.operationsite.utils.tcp.ISocketListener import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity -import com.casic.br.operationsite.view.HelmetVideoActivity import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -37,7 +35,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.shuyu.gsyvideoplayer.GSYVideoManager import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response @@ -63,6 +63,7 @@ private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } private val marginOffset by lazy { 1.dp2px(this) } private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 + private val base64Array: ArrayList = ArrayList() override fun initEvent() { binding.startSuppliesCheckButton.setOnClickListener { @@ -70,12 +71,19 @@ "指令发送失败,请确认是否处于同一网段".show(this) return@setOnClickListener } - SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + lifecycleScope.launch(Dispatchers.IO) { + SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + delay(2000) + constructionCheckViewModel.setCurrentPhase(context, "before_operation_protection") + withContext(Dispatchers.Main) { + binding.stepView.text = "稍后开始检查第一项:四合一,请准备" + } + } } - binding.startVideoCheckButton.setOnClickListener { - startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) - } +// binding.startVideoCheckButton.setOnClickListener { +// startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) +// } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { @@ -97,15 +105,15 @@ }) binding.skipSuppliesCheckButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("温馨提示") - .setMessage("请确认施工前劳保用品是否已经准备完毕?") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("温馨提示") + .setMessage("请确认施工前劳保用品是否已经准备完毕?").setNegativeButton("取消") + .setPositiveButton("确定").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { +// constructionCheckViewModel.uploadPhaseData( +// context, "before_operation_protection", arrayListOf(), base64Array +// ) + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) navigatePageTo() } @@ -116,22 +124,19 @@ } } + //TODO 效果不好,暂时去掉 private val startVideoLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { Log.d(kTag, "startVideoLauncher: ") - SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - constructionCheckViewModel.setCurrentPhase("before_operation_protection") + constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") binding.stepView.text = "稍后开始检查第一项:四合一,请准备" } private fun initWebSocket() { //初始化WebSocket - val httpClient = OkHttpClient.Builder() - .connectTimeout(10, TimeUnit.SECONDS) - .readTimeout(10, TimeUnit.SECONDS) - .writeTimeout(10, TimeUnit.SECONDS) - .build() + val httpClient = OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS) + .readTimeout(10, TimeUnit.SECONDS).writeTimeout(10, TimeUnit.SECONDS).build() lifecycleScope.launch(Dispatchers.IO) { val request = Request.Builder().url("ws://${LocaleConstant.AI_BASE_IP}:8765").build() httpClient.newWebSocket(request, object : WebSocketListener() { @@ -170,8 +175,13 @@ ActivityStackManager.addActivity(this) weakReferenceHandler = WeakReferenceHandler(this) - constructionCheckViewModel = - ViewModelProvider(this)[ConstructionCheckViewModel::class.java] + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] +// constructionCheckViewModel.uploadDataResult.observe(this) { +// if (it) { +// SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) +// navigatePageTo() +// } +// } //动态设置rtspPlayerView宽高 val params = binding.rtspPlayerView.layoutParams as LinearLayout.LayoutParams @@ -189,7 +199,7 @@ initWebSocket() } } - }, 0, 5000) + }, 0, 2000) //左右边距 imageAdapter = EditableImageAdapter(this, recyclerViewImages, videoWidth, 6, 3) @@ -205,10 +215,11 @@ LocaleConstant.WEBSOCKET_MESSAGE_CODE -> { try { - val bitmapArray = Base64.decode((msg.obj as String), Base64.DEFAULT) + val base64 = msg.obj as String + base64Array.add(base64) + val bitmapArray = Base64.decode(base64, Base64.DEFAULT) val bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.size) - val imagePath = - "/${createImageFileDir()}/IMG${timeFormat.format(Date())}.png" + val imagePath = "/${createImageFileDir()}/IMG${timeFormat.format(Date())}.png" Log.d(kTag, "imagePath: $imagePath") bitmap.saveImage(imagePath) recyclerViewImages.add(imagePath) @@ -221,20 +232,22 @@ 4 -> binding.stepView.text = "稍后开始检第五项:鼓风机,请准备" 5 -> binding.stepView.text = "稍后开始检第六项:三脚架,请准备" 6 -> { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("温馨提示") + AlertControlDialog.Builder().setContext(this).setTitle("温馨提示") .setMessage("检测到施工前劳保用品准备完毕,是否开始施工?") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { +// constructionCheckViewModel.uploadPhaseData( +// context, "before_operation_protection", +// arrayListOf(), base64Array +// ) + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) navigatePageTo() } override fun onCancelClick() { - binding.skipSuppliesCheckButton.visibility = View.VISIBLE + } }).build().show() } @@ -254,7 +267,12 @@ } override fun observeRequestState() { - +// constructionCheckViewModel.loadState.observe(this) { +// when (it) { +// LoadState.Loading -> LoadingDialogHub.show(this, "数据提交中,请稍后...") +// else -> LoadingDialogHub.dismiss() +// } +// } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java index 034a92f..d08cc9e 100644 --- a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java +++ b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java @@ -61,6 +61,7 @@ private String vastCode; private String workerId; private String workerName; + private String gasTime; public boolean getAlarmFlag() { return alarmFlag; @@ -213,5 +214,13 @@ public void setWorkerName(String workerName) { this.workerName = workerName; } + + public String getGasTime() { + return gasTime; + } + + public void setGasTime(String gasTime) { + this.gasTime = gasTime; + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index 3a83a6e..07a4d94 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -133,12 +133,21 @@ suspend fun getAlarmDetail(@Header("token") token: String, @Query("id") id: String): String /** - * 声光报警开关 + * 切换场景阶段 */ @POST("/setPhase") suspend fun setCurrentPhase(@Body requestBody: RequestBody): String /** + * 提交场景下的数据 + */ + @POST("/prepare/upload") + suspend fun uploadPhaseData( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 声光报警开关 */ @POST("/setAlarmState") diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 36f79ca..395aa7e 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,7 @@ import com.casic.br.operationsite.model.ImageModel import com.casic.br.operationsite.utils.AuthenticationHelper import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RuntimeCache import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.reflect.TypeToken @@ -244,6 +245,29 @@ } /** + * 提交场景下的数据 + */ + suspend fun uploadPhaseData( + phase: String, imageList: ArrayList, base64List: ArrayList + ): String { + val param = JsonObject() + param.addProperty("projectId", RuntimeCache.projectId) + param.addProperty("phase", phase) + + val typeToken = object : TypeToken>() {}.type + param.add( + "pathList", gson.toJsonTree(imageList, typeToken).asJsonArray + ) + param.add("base64List", gson.toJsonTree(base64List, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return api.uploadPhaseData(AuthenticationHelper.token!!, requestBody) + } + + /** * 设置声光报警开关 */ suspend fun changeAlarmState(state: String): String { diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index e73f60e..9abce0f 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -84,6 +84,8 @@ //作业前检测 val START_ENV_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x06, 0x00, 0x9A.toByte()) + val CONFIRM_BLOWER_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x08, 0x00, 0x9C.toByte()) val END_ENV_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x09, 0x00, 0x9D.toByte()) @@ -92,4 +94,8 @@ byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x0A, 0x00, 0x9E.toByte()) val START_VIDEO_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x11, 0x00, 0xA5.toByte()) + + //甲烷阈值报警 + val GAS_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x14, 0x00, 0xA8.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt index 3628b8b..e513c9d 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt @@ -28,6 +28,7 @@ import com.casic.br.operationsite.utils.tcp.ISocketListener import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.common.util.concurrent.ListenableFuture import com.luck.picture.lib.basic.PictureSelector @@ -75,6 +76,7 @@ private lateinit var imageAnalysis: ImageAnalysis private lateinit var uploadFileViewModel: UploadFileViewModel private lateinit var imageAdapter: EditableImageAdapter + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 private var isStart = false @@ -151,6 +153,7 @@ } //发送指令 SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) +// constructionCheckViewModel.uploadPhaseData(this, "brief", imagePaths, arrayListOf()) navigatePageTo() } } @@ -190,6 +193,13 @@ } } } + +// constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] +// constructionCheckViewModel.uploadDataResult.observe(this) { +// if (it) { +// navigatePageTo() +// } +// } } private fun bindPreview(cameraProvider: ProcessCameraProvider) { @@ -310,6 +320,13 @@ else -> LoadingDialogHub.dismiss() } } + +// constructionCheckViewModel.loadState.observe(this) { +// when (it) { +// LoadState.Loading -> LoadingDialogHub.show(this, "数据提交中,请稍后...") +// else -> LoadingDialogHub.dismiss() +// } +// } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt index e099389..7dfb554 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt @@ -16,6 +16,7 @@ import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.RuntimeCache import com.casic.br.operationsite.utils.VideoPlayerManager +import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.view.WorkTaskActivity @@ -32,6 +33,8 @@ import com.pengxh.kt.lite.extensions.saveImage import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -91,7 +94,7 @@ } binding.startVideoCheckButton.setOnClickListener { - constructionCheckViewModel.setCurrentPhase("in_operation") + constructionCheckViewModel.setCurrentPhase(this, "in_operation") } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { @@ -179,17 +182,20 @@ initWebSocket() } } - }, 0, 5000) + }, 0, 2000) workSiteViewModel.workerResult.observe(this) { if (it.code == 200) { - it.data.forEach { worker -> - if (worker.lat.isNotBlank() && worker.lng.isNotBlank()) { - binding.heartRateView.text = "心率:${worker.heartRate}bpm" - binding.bloodOxygenView.text = "血氧:${worker.bloodOxygen}%" - binding.coValueView.text = "一氧化碳:${worker.co}ppm" - binding.gasValueView.text = "甲烷:${worker.gas}ppm" - binding.h2sValueView.text = "硫化氢:${worker.co}ppm" - binding.o2ValueView.text = "氧气:${worker.o2}%VOL" + it.data.first().apply { + binding.heartRateView.text = "心率:${heartRate}bpm" + binding.bloodOxygenView.text = "血氧:${bloodOxygen}%" + binding.coValueView.text = "一氧化碳:${co}ppm" + binding.gasValueView.text = "甲烷:${gas}ppm" + binding.h2sValueView.text = "硫化氢:${co}ppm" + binding.o2ValueView.text = "氧气:${o2}%VOL" + binding.valueUpdateView.text = "更新时间:${gasTime}" + + if (gas.toInt() >= 20) { + SocketManager.get.send(LocaleConstant.GAS_COMMAND) } } } @@ -267,7 +273,25 @@ } override fun observeRequestState() { + constructionCheckViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "数据提交中,请稍后...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + ActivityStackManager.finishAllActivity() + navigatePageTo() + finish() + } + + else -> { + "数据提交失败,请重试...".show(this) + LoadingDialogHub.dismiss() + } + } + } } override fun setupTopBarLayout() { @@ -289,11 +313,7 @@ .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { - constructionCheckViewModel.setCurrentPhase("stop") - - ActivityStackManager.finishAllActivity() - navigatePageTo() - finish() + constructionCheckViewModel.setCurrentPhase(context, "stop") } override fun onCancelClick() {} diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt index bffdc12..0591a59 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.operationsite.view.check -import android.content.Intent import android.graphics.BitmapFactory import android.os.Bundle import android.os.Handler @@ -20,7 +19,6 @@ import com.casic.br.operationsite.utils.tcp.ISocketListener import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity -import com.casic.br.operationsite.view.HelmetVideoActivity import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -37,7 +35,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.shuyu.gsyvideoplayer.GSYVideoManager import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response @@ -63,6 +63,7 @@ private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } private val marginOffset by lazy { 1.dp2px(this) } private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 + private val base64Array: ArrayList = ArrayList() override fun initEvent() { binding.startSuppliesCheckButton.setOnClickListener { @@ -70,12 +71,19 @@ "指令发送失败,请确认是否处于同一网段".show(this) return@setOnClickListener } - SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + lifecycleScope.launch(Dispatchers.IO) { + SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + delay(2000) + constructionCheckViewModel.setCurrentPhase(context, "before_operation_protection") + withContext(Dispatchers.Main) { + binding.stepView.text = "稍后开始检查第一项:四合一,请准备" + } + } } - binding.startVideoCheckButton.setOnClickListener { - startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) - } +// binding.startVideoCheckButton.setOnClickListener { +// startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) +// } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { @@ -97,15 +105,15 @@ }) binding.skipSuppliesCheckButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("温馨提示") - .setMessage("请确认施工前劳保用品是否已经准备完毕?") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("温馨提示") + .setMessage("请确认施工前劳保用品是否已经准备完毕?").setNegativeButton("取消") + .setPositiveButton("确定").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { +// constructionCheckViewModel.uploadPhaseData( +// context, "before_operation_protection", arrayListOf(), base64Array +// ) + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) navigatePageTo() } @@ -116,22 +124,19 @@ } } + //TODO 效果不好,暂时去掉 private val startVideoLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { Log.d(kTag, "startVideoLauncher: ") - SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - constructionCheckViewModel.setCurrentPhase("before_operation_protection") + constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") binding.stepView.text = "稍后开始检查第一项:四合一,请准备" } private fun initWebSocket() { //初始化WebSocket - val httpClient = OkHttpClient.Builder() - .connectTimeout(10, TimeUnit.SECONDS) - .readTimeout(10, TimeUnit.SECONDS) - .writeTimeout(10, TimeUnit.SECONDS) - .build() + val httpClient = OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS) + .readTimeout(10, TimeUnit.SECONDS).writeTimeout(10, TimeUnit.SECONDS).build() lifecycleScope.launch(Dispatchers.IO) { val request = Request.Builder().url("ws://${LocaleConstant.AI_BASE_IP}:8765").build() httpClient.newWebSocket(request, object : WebSocketListener() { @@ -170,8 +175,13 @@ ActivityStackManager.addActivity(this) weakReferenceHandler = WeakReferenceHandler(this) - constructionCheckViewModel = - ViewModelProvider(this)[ConstructionCheckViewModel::class.java] + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] +// constructionCheckViewModel.uploadDataResult.observe(this) { +// if (it) { +// SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) +// navigatePageTo() +// } +// } //动态设置rtspPlayerView宽高 val params = binding.rtspPlayerView.layoutParams as LinearLayout.LayoutParams @@ -189,7 +199,7 @@ initWebSocket() } } - }, 0, 5000) + }, 0, 2000) //左右边距 imageAdapter = EditableImageAdapter(this, recyclerViewImages, videoWidth, 6, 3) @@ -205,10 +215,11 @@ LocaleConstant.WEBSOCKET_MESSAGE_CODE -> { try { - val bitmapArray = Base64.decode((msg.obj as String), Base64.DEFAULT) + val base64 = msg.obj as String + base64Array.add(base64) + val bitmapArray = Base64.decode(base64, Base64.DEFAULT) val bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.size) - val imagePath = - "/${createImageFileDir()}/IMG${timeFormat.format(Date())}.png" + val imagePath = "/${createImageFileDir()}/IMG${timeFormat.format(Date())}.png" Log.d(kTag, "imagePath: $imagePath") bitmap.saveImage(imagePath) recyclerViewImages.add(imagePath) @@ -221,20 +232,22 @@ 4 -> binding.stepView.text = "稍后开始检第五项:鼓风机,请准备" 5 -> binding.stepView.text = "稍后开始检第六项:三脚架,请准备" 6 -> { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("温馨提示") + AlertControlDialog.Builder().setContext(this).setTitle("温馨提示") .setMessage("检测到施工前劳保用品准备完毕,是否开始施工?") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { +// constructionCheckViewModel.uploadPhaseData( +// context, "before_operation_protection", +// arrayListOf(), base64Array +// ) + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) navigatePageTo() } override fun onCancelClick() { - binding.skipSuppliesCheckButton.visibility = View.VISIBLE + } }).build().show() } @@ -254,7 +267,12 @@ } override fun observeRequestState() { - +// constructionCheckViewModel.loadState.observe(this) { +// when (it) { +// LoadState.Loading -> LoadingDialogHub.show(this, "数据提交中,请稍后...") +// else -> LoadingDialogHub.dismiss() +// } +// } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt index c448bfa..5bbb8ca 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt @@ -1,15 +1,20 @@ package com.casic.br.operationsite.vm +import android.content.Context import androidx.lifecycle.MutableLiveData import com.casic.br.operationsite.extensions.getResponseCode +import com.casic.br.operationsite.extensions.getResponseMessage import com.casic.br.operationsite.retrofit.RetrofitServiceManager import com.pengxh.kt.lite.base.BaseViewModel import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadState class ConstructionCheckViewModel : BaseViewModel() { val setCurrentPhaseResult = MutableLiveData() val setVideoRegionResult = MutableLiveData() + val uploadDataResult = MutableLiveData() fun setVideoRegion(position: ArrayList) = launch({ val response = RetrofitServiceManager.setVideoRegion(position) @@ -18,10 +23,43 @@ it.printStackTrace() }) - fun setCurrentPhase(phase: String) = launch({ + fun setCurrentPhase(context: Context, phase: String) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.setCurrentPhase(phase) + when (response.getResponseCode()) { + 200 -> { + loadState.value = LoadState.Success + } + + else -> { + loadState.value = LoadState.Fail + response.getResponseMessage().show(context) + } + } setCurrentPhaseResult.value = response.getResponseCode() == 200 }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun uploadPhaseData( + context: Context, phase: String, imageList: ArrayList, base64List: ArrayList + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.uploadPhaseData(phase, imageList, base64List) + when (response.getResponseCode()) { + 200 -> { + loadState.value = LoadState.Success + } + + else -> { + loadState.value = LoadState.Fail + response.getResponseMessage().show(context) + } + } + uploadDataResult.value = response.getResponseCode() == 200 + }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java index 034a92f..d08cc9e 100644 --- a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java +++ b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java @@ -61,6 +61,7 @@ private String vastCode; private String workerId; private String workerName; + private String gasTime; public boolean getAlarmFlag() { return alarmFlag; @@ -213,5 +214,13 @@ public void setWorkerName(String workerName) { this.workerName = workerName; } + + public String getGasTime() { + return gasTime; + } + + public void setGasTime(String gasTime) { + this.gasTime = gasTime; + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index 3a83a6e..07a4d94 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -133,12 +133,21 @@ suspend fun getAlarmDetail(@Header("token") token: String, @Query("id") id: String): String /** - * 声光报警开关 + * 切换场景阶段 */ @POST("/setPhase") suspend fun setCurrentPhase(@Body requestBody: RequestBody): String /** + * 提交场景下的数据 + */ + @POST("/prepare/upload") + suspend fun uploadPhaseData( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 声光报警开关 */ @POST("/setAlarmState") diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 36f79ca..395aa7e 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,7 @@ import com.casic.br.operationsite.model.ImageModel import com.casic.br.operationsite.utils.AuthenticationHelper import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RuntimeCache import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.reflect.TypeToken @@ -244,6 +245,29 @@ } /** + * 提交场景下的数据 + */ + suspend fun uploadPhaseData( + phase: String, imageList: ArrayList, base64List: ArrayList + ): String { + val param = JsonObject() + param.addProperty("projectId", RuntimeCache.projectId) + param.addProperty("phase", phase) + + val typeToken = object : TypeToken>() {}.type + param.add( + "pathList", gson.toJsonTree(imageList, typeToken).asJsonArray + ) + param.add("base64List", gson.toJsonTree(base64List, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return api.uploadPhaseData(AuthenticationHelper.token!!, requestBody) + } + + /** * 设置声光报警开关 */ suspend fun changeAlarmState(state: String): String { diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index e73f60e..9abce0f 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -84,6 +84,8 @@ //作业前检测 val START_ENV_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x06, 0x00, 0x9A.toByte()) + val CONFIRM_BLOWER_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x08, 0x00, 0x9C.toByte()) val END_ENV_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x09, 0x00, 0x9D.toByte()) @@ -92,4 +94,8 @@ byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x0A, 0x00, 0x9E.toByte()) val START_VIDEO_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x11, 0x00, 0xA5.toByte()) + + //甲烷阈值报警 + val GAS_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x14, 0x00, 0xA8.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt index 3628b8b..e513c9d 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt @@ -28,6 +28,7 @@ import com.casic.br.operationsite.utils.tcp.ISocketListener import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.common.util.concurrent.ListenableFuture import com.luck.picture.lib.basic.PictureSelector @@ -75,6 +76,7 @@ private lateinit var imageAnalysis: ImageAnalysis private lateinit var uploadFileViewModel: UploadFileViewModel private lateinit var imageAdapter: EditableImageAdapter + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 private var isStart = false @@ -151,6 +153,7 @@ } //发送指令 SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) +// constructionCheckViewModel.uploadPhaseData(this, "brief", imagePaths, arrayListOf()) navigatePageTo() } } @@ -190,6 +193,13 @@ } } } + +// constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] +// constructionCheckViewModel.uploadDataResult.observe(this) { +// if (it) { +// navigatePageTo() +// } +// } } private fun bindPreview(cameraProvider: ProcessCameraProvider) { @@ -310,6 +320,13 @@ else -> LoadingDialogHub.dismiss() } } + +// constructionCheckViewModel.loadState.observe(this) { +// when (it) { +// LoadState.Loading -> LoadingDialogHub.show(this, "数据提交中,请稍后...") +// else -> LoadingDialogHub.dismiss() +// } +// } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt index e099389..7dfb554 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt @@ -16,6 +16,7 @@ import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.RuntimeCache import com.casic.br.operationsite.utils.VideoPlayerManager +import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.view.WorkTaskActivity @@ -32,6 +33,8 @@ import com.pengxh.kt.lite.extensions.saveImage import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -91,7 +94,7 @@ } binding.startVideoCheckButton.setOnClickListener { - constructionCheckViewModel.setCurrentPhase("in_operation") + constructionCheckViewModel.setCurrentPhase(this, "in_operation") } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { @@ -179,17 +182,20 @@ initWebSocket() } } - }, 0, 5000) + }, 0, 2000) workSiteViewModel.workerResult.observe(this) { if (it.code == 200) { - it.data.forEach { worker -> - if (worker.lat.isNotBlank() && worker.lng.isNotBlank()) { - binding.heartRateView.text = "心率:${worker.heartRate}bpm" - binding.bloodOxygenView.text = "血氧:${worker.bloodOxygen}%" - binding.coValueView.text = "一氧化碳:${worker.co}ppm" - binding.gasValueView.text = "甲烷:${worker.gas}ppm" - binding.h2sValueView.text = "硫化氢:${worker.co}ppm" - binding.o2ValueView.text = "氧气:${worker.o2}%VOL" + it.data.first().apply { + binding.heartRateView.text = "心率:${heartRate}bpm" + binding.bloodOxygenView.text = "血氧:${bloodOxygen}%" + binding.coValueView.text = "一氧化碳:${co}ppm" + binding.gasValueView.text = "甲烷:${gas}ppm" + binding.h2sValueView.text = "硫化氢:${co}ppm" + binding.o2ValueView.text = "氧气:${o2}%VOL" + binding.valueUpdateView.text = "更新时间:${gasTime}" + + if (gas.toInt() >= 20) { + SocketManager.get.send(LocaleConstant.GAS_COMMAND) } } } @@ -267,7 +273,25 @@ } override fun observeRequestState() { + constructionCheckViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "数据提交中,请稍后...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + ActivityStackManager.finishAllActivity() + navigatePageTo() + finish() + } + + else -> { + "数据提交失败,请重试...".show(this) + LoadingDialogHub.dismiss() + } + } + } } override fun setupTopBarLayout() { @@ -289,11 +313,7 @@ .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { - constructionCheckViewModel.setCurrentPhase("stop") - - ActivityStackManager.finishAllActivity() - navigatePageTo() - finish() + constructionCheckViewModel.setCurrentPhase(context, "stop") } override fun onCancelClick() {} diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt index bffdc12..0591a59 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.operationsite.view.check -import android.content.Intent import android.graphics.BitmapFactory import android.os.Bundle import android.os.Handler @@ -20,7 +19,6 @@ import com.casic.br.operationsite.utils.tcp.ISocketListener import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity -import com.casic.br.operationsite.view.HelmetVideoActivity import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -37,7 +35,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.shuyu.gsyvideoplayer.GSYVideoManager import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response @@ -63,6 +63,7 @@ private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } private val marginOffset by lazy { 1.dp2px(this) } private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 + private val base64Array: ArrayList = ArrayList() override fun initEvent() { binding.startSuppliesCheckButton.setOnClickListener { @@ -70,12 +71,19 @@ "指令发送失败,请确认是否处于同一网段".show(this) return@setOnClickListener } - SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + lifecycleScope.launch(Dispatchers.IO) { + SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + delay(2000) + constructionCheckViewModel.setCurrentPhase(context, "before_operation_protection") + withContext(Dispatchers.Main) { + binding.stepView.text = "稍后开始检查第一项:四合一,请准备" + } + } } - binding.startVideoCheckButton.setOnClickListener { - startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) - } +// binding.startVideoCheckButton.setOnClickListener { +// startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) +// } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { @@ -97,15 +105,15 @@ }) binding.skipSuppliesCheckButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("温馨提示") - .setMessage("请确认施工前劳保用品是否已经准备完毕?") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("温馨提示") + .setMessage("请确认施工前劳保用品是否已经准备完毕?").setNegativeButton("取消") + .setPositiveButton("确定").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { +// constructionCheckViewModel.uploadPhaseData( +// context, "before_operation_protection", arrayListOf(), base64Array +// ) + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) navigatePageTo() } @@ -116,22 +124,19 @@ } } + //TODO 效果不好,暂时去掉 private val startVideoLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { Log.d(kTag, "startVideoLauncher: ") - SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - constructionCheckViewModel.setCurrentPhase("before_operation_protection") + constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") binding.stepView.text = "稍后开始检查第一项:四合一,请准备" } private fun initWebSocket() { //初始化WebSocket - val httpClient = OkHttpClient.Builder() - .connectTimeout(10, TimeUnit.SECONDS) - .readTimeout(10, TimeUnit.SECONDS) - .writeTimeout(10, TimeUnit.SECONDS) - .build() + val httpClient = OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS) + .readTimeout(10, TimeUnit.SECONDS).writeTimeout(10, TimeUnit.SECONDS).build() lifecycleScope.launch(Dispatchers.IO) { val request = Request.Builder().url("ws://${LocaleConstant.AI_BASE_IP}:8765").build() httpClient.newWebSocket(request, object : WebSocketListener() { @@ -170,8 +175,13 @@ ActivityStackManager.addActivity(this) weakReferenceHandler = WeakReferenceHandler(this) - constructionCheckViewModel = - ViewModelProvider(this)[ConstructionCheckViewModel::class.java] + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] +// constructionCheckViewModel.uploadDataResult.observe(this) { +// if (it) { +// SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) +// navigatePageTo() +// } +// } //动态设置rtspPlayerView宽高 val params = binding.rtspPlayerView.layoutParams as LinearLayout.LayoutParams @@ -189,7 +199,7 @@ initWebSocket() } } - }, 0, 5000) + }, 0, 2000) //左右边距 imageAdapter = EditableImageAdapter(this, recyclerViewImages, videoWidth, 6, 3) @@ -205,10 +215,11 @@ LocaleConstant.WEBSOCKET_MESSAGE_CODE -> { try { - val bitmapArray = Base64.decode((msg.obj as String), Base64.DEFAULT) + val base64 = msg.obj as String + base64Array.add(base64) + val bitmapArray = Base64.decode(base64, Base64.DEFAULT) val bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.size) - val imagePath = - "/${createImageFileDir()}/IMG${timeFormat.format(Date())}.png" + val imagePath = "/${createImageFileDir()}/IMG${timeFormat.format(Date())}.png" Log.d(kTag, "imagePath: $imagePath") bitmap.saveImage(imagePath) recyclerViewImages.add(imagePath) @@ -221,20 +232,22 @@ 4 -> binding.stepView.text = "稍后开始检第五项:鼓风机,请准备" 5 -> binding.stepView.text = "稍后开始检第六项:三脚架,请准备" 6 -> { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("温馨提示") + AlertControlDialog.Builder().setContext(this).setTitle("温馨提示") .setMessage("检测到施工前劳保用品准备完毕,是否开始施工?") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { +// constructionCheckViewModel.uploadPhaseData( +// context, "before_operation_protection", +// arrayListOf(), base64Array +// ) + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) navigatePageTo() } override fun onCancelClick() { - binding.skipSuppliesCheckButton.visibility = View.VISIBLE + } }).build().show() } @@ -254,7 +267,12 @@ } override fun observeRequestState() { - +// constructionCheckViewModel.loadState.observe(this) { +// when (it) { +// LoadState.Loading -> LoadingDialogHub.show(this, "数据提交中,请稍后...") +// else -> LoadingDialogHub.dismiss() +// } +// } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt index c448bfa..5bbb8ca 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt @@ -1,15 +1,20 @@ package com.casic.br.operationsite.vm +import android.content.Context import androidx.lifecycle.MutableLiveData import com.casic.br.operationsite.extensions.getResponseCode +import com.casic.br.operationsite.extensions.getResponseMessage import com.casic.br.operationsite.retrofit.RetrofitServiceManager import com.pengxh.kt.lite.base.BaseViewModel import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadState class ConstructionCheckViewModel : BaseViewModel() { val setCurrentPhaseResult = MutableLiveData() val setVideoRegionResult = MutableLiveData() + val uploadDataResult = MutableLiveData() fun setVideoRegion(position: ArrayList) = launch({ val response = RetrofitServiceManager.setVideoRegion(position) @@ -18,10 +23,43 @@ it.printStackTrace() }) - fun setCurrentPhase(phase: String) = launch({ + fun setCurrentPhase(context: Context, phase: String) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.setCurrentPhase(phase) + when (response.getResponseCode()) { + 200 -> { + loadState.value = LoadState.Success + } + + else -> { + loadState.value = LoadState.Fail + response.getResponseMessage().show(context) + } + } setCurrentPhaseResult.value = response.getResponseCode() == 200 }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun uploadPhaseData( + context: Context, phase: String, imageList: ArrayList, base64List: ArrayList + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.uploadPhaseData(phase, imageList, base64List) + when (response.getResponseCode()) { + 200 -> { + loadState.value = LoadState.Success + } + + else -> { + loadState.value = LoadState.Fail + response.getResponseMessage().show(context) + } + } + uploadDataResult.value = response.getResponseCode() == 200 + }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_environment.xml b/app/src/main/res/layout/activity_environment.xml index a53da8a..cc235ab 100644 --- a/app/src/main/res/layout/activity_environment.xml +++ b/app/src/main/res/layout/activity_environment.xml @@ -332,6 +332,7 @@ android:layout_height="wrap_content" android:layout_marginVertical="@dimen/dp_15" android:background="@drawable/button_check_selector" + android:enabled="false" android:text="确认现场气体环境正常" android:textColor="@color/black" /> diff --git a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java index 034a92f..d08cc9e 100644 --- a/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java +++ b/app/src/main/java/com/casic/br/operationsite/model/WorkerModel.java @@ -61,6 +61,7 @@ private String vastCode; private String workerId; private String workerName; + private String gasTime; public boolean getAlarmFlag() { return alarmFlag; @@ -213,5 +214,13 @@ public void setWorkerName(String workerName) { this.workerName = workerName; } + + public String getGasTime() { + return gasTime; + } + + public void setGasTime(String gasTime) { + this.gasTime = gasTime; + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index 3a83a6e..07a4d94 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -133,12 +133,21 @@ suspend fun getAlarmDetail(@Header("token") token: String, @Query("id") id: String): String /** - * 声光报警开关 + * 切换场景阶段 */ @POST("/setPhase") suspend fun setCurrentPhase(@Body requestBody: RequestBody): String /** + * 提交场景下的数据 + */ + @POST("/prepare/upload") + suspend fun uploadPhaseData( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 声光报警开关 */ @POST("/setAlarmState") diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 36f79ca..395aa7e 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,7 @@ import com.casic.br.operationsite.model.ImageModel import com.casic.br.operationsite.utils.AuthenticationHelper import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RuntimeCache import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.reflect.TypeToken @@ -244,6 +245,29 @@ } /** + * 提交场景下的数据 + */ + suspend fun uploadPhaseData( + phase: String, imageList: ArrayList, base64List: ArrayList + ): String { + val param = JsonObject() + param.addProperty("projectId", RuntimeCache.projectId) + param.addProperty("phase", phase) + + val typeToken = object : TypeToken>() {}.type + param.add( + "pathList", gson.toJsonTree(imageList, typeToken).asJsonArray + ) + param.add("base64List", gson.toJsonTree(base64List, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return api.uploadPhaseData(AuthenticationHelper.token!!, requestBody) + } + + /** * 设置声光报警开关 */ suspend fun changeAlarmState(state: String): String { diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index e73f60e..9abce0f 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -84,6 +84,8 @@ //作业前检测 val START_ENV_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x06, 0x00, 0x9A.toByte()) + val CONFIRM_BLOWER_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x08, 0x00, 0x9C.toByte()) val END_ENV_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x09, 0x00, 0x9D.toByte()) @@ -92,4 +94,8 @@ byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x0A, 0x00, 0x9E.toByte()) val START_VIDEO_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x11, 0x00, 0xA5.toByte()) + + //甲烷阈值报警 + val GAS_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x14, 0x00, 0xA8.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt index 3628b8b..e513c9d 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt @@ -28,6 +28,7 @@ import com.casic.br.operationsite.utils.tcp.ISocketListener import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.common.util.concurrent.ListenableFuture import com.luck.picture.lib.basic.PictureSelector @@ -75,6 +76,7 @@ private lateinit var imageAnalysis: ImageAnalysis private lateinit var uploadFileViewModel: UploadFileViewModel private lateinit var imageAdapter: EditableImageAdapter + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 private var isStart = false @@ -151,6 +153,7 @@ } //发送指令 SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) +// constructionCheckViewModel.uploadPhaseData(this, "brief", imagePaths, arrayListOf()) navigatePageTo() } } @@ -190,6 +193,13 @@ } } } + +// constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] +// constructionCheckViewModel.uploadDataResult.observe(this) { +// if (it) { +// navigatePageTo() +// } +// } } private fun bindPreview(cameraProvider: ProcessCameraProvider) { @@ -310,6 +320,13 @@ else -> LoadingDialogHub.dismiss() } } + +// constructionCheckViewModel.loadState.observe(this) { +// when (it) { +// LoadState.Loading -> LoadingDialogHub.show(this, "数据提交中,请稍后...") +// else -> LoadingDialogHub.dismiss() +// } +// } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt index e099389..7dfb554 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt @@ -16,6 +16,7 @@ import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.RuntimeCache import com.casic.br.operationsite.utils.VideoPlayerManager +import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.view.WorkTaskActivity @@ -32,6 +33,8 @@ import com.pengxh.kt.lite.extensions.saveImage import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -91,7 +94,7 @@ } binding.startVideoCheckButton.setOnClickListener { - constructionCheckViewModel.setCurrentPhase("in_operation") + constructionCheckViewModel.setCurrentPhase(this, "in_operation") } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { @@ -179,17 +182,20 @@ initWebSocket() } } - }, 0, 5000) + }, 0, 2000) workSiteViewModel.workerResult.observe(this) { if (it.code == 200) { - it.data.forEach { worker -> - if (worker.lat.isNotBlank() && worker.lng.isNotBlank()) { - binding.heartRateView.text = "心率:${worker.heartRate}bpm" - binding.bloodOxygenView.text = "血氧:${worker.bloodOxygen}%" - binding.coValueView.text = "一氧化碳:${worker.co}ppm" - binding.gasValueView.text = "甲烷:${worker.gas}ppm" - binding.h2sValueView.text = "硫化氢:${worker.co}ppm" - binding.o2ValueView.text = "氧气:${worker.o2}%VOL" + it.data.first().apply { + binding.heartRateView.text = "心率:${heartRate}bpm" + binding.bloodOxygenView.text = "血氧:${bloodOxygen}%" + binding.coValueView.text = "一氧化碳:${co}ppm" + binding.gasValueView.text = "甲烷:${gas}ppm" + binding.h2sValueView.text = "硫化氢:${co}ppm" + binding.o2ValueView.text = "氧气:${o2}%VOL" + binding.valueUpdateView.text = "更新时间:${gasTime}" + + if (gas.toInt() >= 20) { + SocketManager.get.send(LocaleConstant.GAS_COMMAND) } } } @@ -267,7 +273,25 @@ } override fun observeRequestState() { + constructionCheckViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "数据提交中,请稍后...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + ActivityStackManager.finishAllActivity() + navigatePageTo() + finish() + } + + else -> { + "数据提交失败,请重试...".show(this) + LoadingDialogHub.dismiss() + } + } + } } override fun setupTopBarLayout() { @@ -289,11 +313,7 @@ .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { - constructionCheckViewModel.setCurrentPhase("stop") - - ActivityStackManager.finishAllActivity() - navigatePageTo() - finish() + constructionCheckViewModel.setCurrentPhase(context, "stop") } override fun onCancelClick() {} diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt index bffdc12..0591a59 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.operationsite.view.check -import android.content.Intent import android.graphics.BitmapFactory import android.os.Bundle import android.os.Handler @@ -20,7 +19,6 @@ import com.casic.br.operationsite.utils.tcp.ISocketListener import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity -import com.casic.br.operationsite.view.HelmetVideoActivity import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -37,7 +35,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.shuyu.gsyvideoplayer.GSYVideoManager import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response @@ -63,6 +63,7 @@ private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } private val marginOffset by lazy { 1.dp2px(this) } private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 + private val base64Array: ArrayList = ArrayList() override fun initEvent() { binding.startSuppliesCheckButton.setOnClickListener { @@ -70,12 +71,19 @@ "指令发送失败,请确认是否处于同一网段".show(this) return@setOnClickListener } - SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + lifecycleScope.launch(Dispatchers.IO) { + SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + delay(2000) + constructionCheckViewModel.setCurrentPhase(context, "before_operation_protection") + withContext(Dispatchers.Main) { + binding.stepView.text = "稍后开始检查第一项:四合一,请准备" + } + } } - binding.startVideoCheckButton.setOnClickListener { - startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) - } +// binding.startVideoCheckButton.setOnClickListener { +// startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) +// } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { @@ -97,15 +105,15 @@ }) binding.skipSuppliesCheckButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("温馨提示") - .setMessage("请确认施工前劳保用品是否已经准备完毕?") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("温馨提示") + .setMessage("请确认施工前劳保用品是否已经准备完毕?").setNegativeButton("取消") + .setPositiveButton("确定").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { +// constructionCheckViewModel.uploadPhaseData( +// context, "before_operation_protection", arrayListOf(), base64Array +// ) + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) navigatePageTo() } @@ -116,22 +124,19 @@ } } + //TODO 效果不好,暂时去掉 private val startVideoLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { Log.d(kTag, "startVideoLauncher: ") - SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - constructionCheckViewModel.setCurrentPhase("before_operation_protection") + constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") binding.stepView.text = "稍后开始检查第一项:四合一,请准备" } private fun initWebSocket() { //初始化WebSocket - val httpClient = OkHttpClient.Builder() - .connectTimeout(10, TimeUnit.SECONDS) - .readTimeout(10, TimeUnit.SECONDS) - .writeTimeout(10, TimeUnit.SECONDS) - .build() + val httpClient = OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS) + .readTimeout(10, TimeUnit.SECONDS).writeTimeout(10, TimeUnit.SECONDS).build() lifecycleScope.launch(Dispatchers.IO) { val request = Request.Builder().url("ws://${LocaleConstant.AI_BASE_IP}:8765").build() httpClient.newWebSocket(request, object : WebSocketListener() { @@ -170,8 +175,13 @@ ActivityStackManager.addActivity(this) weakReferenceHandler = WeakReferenceHandler(this) - constructionCheckViewModel = - ViewModelProvider(this)[ConstructionCheckViewModel::class.java] + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] +// constructionCheckViewModel.uploadDataResult.observe(this) { +// if (it) { +// SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) +// navigatePageTo() +// } +// } //动态设置rtspPlayerView宽高 val params = binding.rtspPlayerView.layoutParams as LinearLayout.LayoutParams @@ -189,7 +199,7 @@ initWebSocket() } } - }, 0, 5000) + }, 0, 2000) //左右边距 imageAdapter = EditableImageAdapter(this, recyclerViewImages, videoWidth, 6, 3) @@ -205,10 +215,11 @@ LocaleConstant.WEBSOCKET_MESSAGE_CODE -> { try { - val bitmapArray = Base64.decode((msg.obj as String), Base64.DEFAULT) + val base64 = msg.obj as String + base64Array.add(base64) + val bitmapArray = Base64.decode(base64, Base64.DEFAULT) val bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.size) - val imagePath = - "/${createImageFileDir()}/IMG${timeFormat.format(Date())}.png" + val imagePath = "/${createImageFileDir()}/IMG${timeFormat.format(Date())}.png" Log.d(kTag, "imagePath: $imagePath") bitmap.saveImage(imagePath) recyclerViewImages.add(imagePath) @@ -221,20 +232,22 @@ 4 -> binding.stepView.text = "稍后开始检第五项:鼓风机,请准备" 5 -> binding.stepView.text = "稍后开始检第六项:三脚架,请准备" 6 -> { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("温馨提示") + AlertControlDialog.Builder().setContext(this).setTitle("温馨提示") .setMessage("检测到施工前劳保用品准备完毕,是否开始施工?") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { +// constructionCheckViewModel.uploadPhaseData( +// context, "before_operation_protection", +// arrayListOf(), base64Array +// ) + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) navigatePageTo() } override fun onCancelClick() { - binding.skipSuppliesCheckButton.visibility = View.VISIBLE + } }).build().show() } @@ -254,7 +267,12 @@ } override fun observeRequestState() { - +// constructionCheckViewModel.loadState.observe(this) { +// when (it) { +// LoadState.Loading -> LoadingDialogHub.show(this, "数据提交中,请稍后...") +// else -> LoadingDialogHub.dismiss() +// } +// } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt index c448bfa..5bbb8ca 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt @@ -1,15 +1,20 @@ package com.casic.br.operationsite.vm +import android.content.Context import androidx.lifecycle.MutableLiveData import com.casic.br.operationsite.extensions.getResponseCode +import com.casic.br.operationsite.extensions.getResponseMessage import com.casic.br.operationsite.retrofit.RetrofitServiceManager import com.pengxh.kt.lite.base.BaseViewModel import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadState class ConstructionCheckViewModel : BaseViewModel() { val setCurrentPhaseResult = MutableLiveData() val setVideoRegionResult = MutableLiveData() + val uploadDataResult = MutableLiveData() fun setVideoRegion(position: ArrayList) = launch({ val response = RetrofitServiceManager.setVideoRegion(position) @@ -18,10 +23,43 @@ it.printStackTrace() }) - fun setCurrentPhase(phase: String) = launch({ + fun setCurrentPhase(context: Context, phase: String) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.setCurrentPhase(phase) + when (response.getResponseCode()) { + 200 -> { + loadState.value = LoadState.Success + } + + else -> { + loadState.value = LoadState.Fail + response.getResponseMessage().show(context) + } + } setCurrentPhaseResult.value = response.getResponseCode() == 200 }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun uploadPhaseData( + context: Context, phase: String, imageList: ArrayList, base64List: ArrayList + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.uploadPhaseData(phase, imageList, base64List) + when (response.getResponseCode()) { + 200 -> { + loadState.value = LoadState.Success + } + + else -> { + loadState.value = LoadState.Fail + response.getResponseMessage().show(context) + } + } + uploadDataResult.value = response.getResponseCode() == 200 + }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_environment.xml b/app/src/main/res/layout/activity_environment.xml index a53da8a..cc235ab 100644 --- a/app/src/main/res/layout/activity_environment.xml +++ b/app/src/main/res/layout/activity_environment.xml @@ -332,6 +332,7 @@ android:layout_height="wrap_content" android:layout_marginVertical="@dimen/dp_15" android:background="@drawable/button_check_selector" + android:enabled="false" android:text="确认现场气体环境正常" android:textColor="@color/black" /> diff --git a/app/src/main/res/layout/activity_guardians.xml b/app/src/main/res/layout/activity_guardians.xml index 7980f6a..80534bc 100644 --- a/app/src/main/res/layout/activity_guardians.xml +++ b/app/src/main/res/layout/activity_guardians.xml @@ -150,7 +150,7 @@ + + , base64List: ArrayList + ): String { + val param = JsonObject() + param.addProperty("projectId", RuntimeCache.projectId) + param.addProperty("phase", phase) + + val typeToken = object : TypeToken>() {}.type + param.add( + "pathList", gson.toJsonTree(imageList, typeToken).asJsonArray + ) + param.add("base64List", gson.toJsonTree(base64List, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return api.uploadPhaseData(AuthenticationHelper.token!!, requestBody) + } + + /** * 设置声光报警开关 */ suspend fun changeAlarmState(state: String): String { diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index e73f60e..9abce0f 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -84,6 +84,8 @@ //作业前检测 val START_ENV_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x06, 0x00, 0x9A.toByte()) + val CONFIRM_BLOWER_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x08, 0x00, 0x9C.toByte()) val END_ENV_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x09, 0x00, 0x9D.toByte()) @@ -92,4 +94,8 @@ byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x0A, 0x00, 0x9E.toByte()) val START_VIDEO_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x11, 0x00, 0xA5.toByte()) + + //甲烷阈值报警 + val GAS_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x93.toByte(), 0x14, 0x00, 0xA8.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt index 3628b8b..e513c9d 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/DisclosureActivity.kt @@ -28,6 +28,7 @@ import com.casic.br.operationsite.utils.tcp.ISocketListener import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.common.util.concurrent.ListenableFuture import com.luck.picture.lib.basic.PictureSelector @@ -75,6 +76,7 @@ private lateinit var imageAnalysis: ImageAnalysis private lateinit var uploadFileViewModel: UploadFileViewModel private lateinit var imageAdapter: EditableImageAdapter + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 private var isStart = false @@ -151,6 +153,7 @@ } //发送指令 SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) +// constructionCheckViewModel.uploadPhaseData(this, "brief", imagePaths, arrayListOf()) navigatePageTo() } } @@ -190,6 +193,13 @@ } } } + +// constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] +// constructionCheckViewModel.uploadDataResult.observe(this) { +// if (it) { +// navigatePageTo() +// } +// } } private fun bindPreview(cameraProvider: ProcessCameraProvider) { @@ -310,6 +320,13 @@ else -> LoadingDialogHub.dismiss() } } + +// constructionCheckViewModel.loadState.observe(this) { +// when (it) { +// LoadState.Loading -> LoadingDialogHub.show(this, "数据提交中,请稍后...") +// else -> LoadingDialogHub.dismiss() +// } +// } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt index e099389..7dfb554 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt @@ -16,6 +16,7 @@ import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.RuntimeCache import com.casic.br.operationsite.utils.VideoPlayerManager +import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.view.WorkTaskActivity @@ -32,6 +33,8 @@ import com.pengxh.kt.lite.extensions.saveImage import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -91,7 +94,7 @@ } binding.startVideoCheckButton.setOnClickListener { - constructionCheckViewModel.setCurrentPhase("in_operation") + constructionCheckViewModel.setCurrentPhase(this, "in_operation") } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { @@ -179,17 +182,20 @@ initWebSocket() } } - }, 0, 5000) + }, 0, 2000) workSiteViewModel.workerResult.observe(this) { if (it.code == 200) { - it.data.forEach { worker -> - if (worker.lat.isNotBlank() && worker.lng.isNotBlank()) { - binding.heartRateView.text = "心率:${worker.heartRate}bpm" - binding.bloodOxygenView.text = "血氧:${worker.bloodOxygen}%" - binding.coValueView.text = "一氧化碳:${worker.co}ppm" - binding.gasValueView.text = "甲烷:${worker.gas}ppm" - binding.h2sValueView.text = "硫化氢:${worker.co}ppm" - binding.o2ValueView.text = "氧气:${worker.o2}%VOL" + it.data.first().apply { + binding.heartRateView.text = "心率:${heartRate}bpm" + binding.bloodOxygenView.text = "血氧:${bloodOxygen}%" + binding.coValueView.text = "一氧化碳:${co}ppm" + binding.gasValueView.text = "甲烷:${gas}ppm" + binding.h2sValueView.text = "硫化氢:${co}ppm" + binding.o2ValueView.text = "氧气:${o2}%VOL" + binding.valueUpdateView.text = "更新时间:${gasTime}" + + if (gas.toInt() >= 20) { + SocketManager.get.send(LocaleConstant.GAS_COMMAND) } } } @@ -267,7 +273,25 @@ } override fun observeRequestState() { + constructionCheckViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "数据提交中,请稍后...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + ActivityStackManager.finishAllActivity() + navigatePageTo() + finish() + } + + else -> { + "数据提交失败,请重试...".show(this) + LoadingDialogHub.dismiss() + } + } + } } override fun setupTopBarLayout() { @@ -289,11 +313,7 @@ .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { - constructionCheckViewModel.setCurrentPhase("stop") - - ActivityStackManager.finishAllActivity() - navigatePageTo() - finish() + constructionCheckViewModel.setCurrentPhase(context, "stop") } override fun onCancelClick() {} diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt index bffdc12..0591a59 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.operationsite.view.check -import android.content.Intent import android.graphics.BitmapFactory import android.os.Bundle import android.os.Handler @@ -20,7 +19,6 @@ import com.casic.br.operationsite.utils.tcp.ISocketListener import com.casic.br.operationsite.utils.tcp.SocketManager import com.casic.br.operationsite.view.BigImageActivity -import com.casic.br.operationsite.view.HelmetVideoActivity import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -37,7 +35,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.shuyu.gsyvideoplayer.GSYVideoManager import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response @@ -63,6 +63,7 @@ private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } private val marginOffset by lazy { 1.dp2px(this) } private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 + private val base64Array: ArrayList = ArrayList() override fun initEvent() { binding.startSuppliesCheckButton.setOnClickListener { @@ -70,12 +71,19 @@ "指令发送失败,请确认是否处于同一网段".show(this) return@setOnClickListener } - SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + lifecycleScope.launch(Dispatchers.IO) { + SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + delay(2000) + constructionCheckViewModel.setCurrentPhase(context, "before_operation_protection") + withContext(Dispatchers.Main) { + binding.stepView.text = "稍后开始检查第一项:四合一,请准备" + } + } } - binding.startVideoCheckButton.setOnClickListener { - startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) - } +// binding.startVideoCheckButton.setOnClickListener { +// startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) +// } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { @@ -97,15 +105,15 @@ }) binding.skipSuppliesCheckButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("温馨提示") - .setMessage("请确认施工前劳保用品是否已经准备完毕?") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("温馨提示") + .setMessage("请确认施工前劳保用品是否已经准备完毕?").setNegativeButton("取消") + .setPositiveButton("确定").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { +// constructionCheckViewModel.uploadPhaseData( +// context, "before_operation_protection", arrayListOf(), base64Array +// ) + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) navigatePageTo() } @@ -116,22 +124,19 @@ } } + //TODO 效果不好,暂时去掉 private val startVideoLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { Log.d(kTag, "startVideoLauncher: ") - SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - constructionCheckViewModel.setCurrentPhase("before_operation_protection") + constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") binding.stepView.text = "稍后开始检查第一项:四合一,请准备" } private fun initWebSocket() { //初始化WebSocket - val httpClient = OkHttpClient.Builder() - .connectTimeout(10, TimeUnit.SECONDS) - .readTimeout(10, TimeUnit.SECONDS) - .writeTimeout(10, TimeUnit.SECONDS) - .build() + val httpClient = OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS) + .readTimeout(10, TimeUnit.SECONDS).writeTimeout(10, TimeUnit.SECONDS).build() lifecycleScope.launch(Dispatchers.IO) { val request = Request.Builder().url("ws://${LocaleConstant.AI_BASE_IP}:8765").build() httpClient.newWebSocket(request, object : WebSocketListener() { @@ -170,8 +175,13 @@ ActivityStackManager.addActivity(this) weakReferenceHandler = WeakReferenceHandler(this) - constructionCheckViewModel = - ViewModelProvider(this)[ConstructionCheckViewModel::class.java] + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] +// constructionCheckViewModel.uploadDataResult.observe(this) { +// if (it) { +// SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) +// navigatePageTo() +// } +// } //动态设置rtspPlayerView宽高 val params = binding.rtspPlayerView.layoutParams as LinearLayout.LayoutParams @@ -189,7 +199,7 @@ initWebSocket() } } - }, 0, 5000) + }, 0, 2000) //左右边距 imageAdapter = EditableImageAdapter(this, recyclerViewImages, videoWidth, 6, 3) @@ -205,10 +215,11 @@ LocaleConstant.WEBSOCKET_MESSAGE_CODE -> { try { - val bitmapArray = Base64.decode((msg.obj as String), Base64.DEFAULT) + val base64 = msg.obj as String + base64Array.add(base64) + val bitmapArray = Base64.decode(base64, Base64.DEFAULT) val bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.size) - val imagePath = - "/${createImageFileDir()}/IMG${timeFormat.format(Date())}.png" + val imagePath = "/${createImageFileDir()}/IMG${timeFormat.format(Date())}.png" Log.d(kTag, "imagePath: $imagePath") bitmap.saveImage(imagePath) recyclerViewImages.add(imagePath) @@ -221,20 +232,22 @@ 4 -> binding.stepView.text = "稍后开始检第五项:鼓风机,请准备" 5 -> binding.stepView.text = "稍后开始检第六项:三脚架,请准备" 6 -> { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("温馨提示") + AlertControlDialog.Builder().setContext(this).setTitle("温馨提示") .setMessage("检测到施工前劳保用品准备完毕,是否开始施工?") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { +// constructionCheckViewModel.uploadPhaseData( +// context, "before_operation_protection", +// arrayListOf(), base64Array +// ) + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) navigatePageTo() } override fun onCancelClick() { - binding.skipSuppliesCheckButton.visibility = View.VISIBLE + } }).build().show() } @@ -254,7 +267,12 @@ } override fun observeRequestState() { - +// constructionCheckViewModel.loadState.observe(this) { +// when (it) { +// LoadState.Loading -> LoadingDialogHub.show(this, "数据提交中,请稍后...") +// else -> LoadingDialogHub.dismiss() +// } +// } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt index c448bfa..5bbb8ca 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt @@ -1,15 +1,20 @@ package com.casic.br.operationsite.vm +import android.content.Context import androidx.lifecycle.MutableLiveData import com.casic.br.operationsite.extensions.getResponseCode +import com.casic.br.operationsite.extensions.getResponseMessage import com.casic.br.operationsite.retrofit.RetrofitServiceManager import com.pengxh.kt.lite.base.BaseViewModel import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadState class ConstructionCheckViewModel : BaseViewModel() { val setCurrentPhaseResult = MutableLiveData() val setVideoRegionResult = MutableLiveData() + val uploadDataResult = MutableLiveData() fun setVideoRegion(position: ArrayList) = launch({ val response = RetrofitServiceManager.setVideoRegion(position) @@ -18,10 +23,43 @@ it.printStackTrace() }) - fun setCurrentPhase(phase: String) = launch({ + fun setCurrentPhase(context: Context, phase: String) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.setCurrentPhase(phase) + when (response.getResponseCode()) { + 200 -> { + loadState.value = LoadState.Success + } + + else -> { + loadState.value = LoadState.Fail + response.getResponseMessage().show(context) + } + } setCurrentPhaseResult.value = response.getResponseCode() == 200 }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun uploadPhaseData( + context: Context, phase: String, imageList: ArrayList, base64List: ArrayList + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.uploadPhaseData(phase, imageList, base64List) + when (response.getResponseCode()) { + 200 -> { + loadState.value = LoadState.Success + } + + else -> { + loadState.value = LoadState.Fail + response.getResponseMessage().show(context) + } + } + uploadDataResult.value = response.getResponseCode() == 200 + }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_environment.xml b/app/src/main/res/layout/activity_environment.xml index a53da8a..cc235ab 100644 --- a/app/src/main/res/layout/activity_environment.xml +++ b/app/src/main/res/layout/activity_environment.xml @@ -332,6 +332,7 @@ android:layout_height="wrap_content" android:layout_marginVertical="@dimen/dp_15" android:background="@drawable/button_check_selector" + android:enabled="false" android:text="确认现场气体环境正常" android:textColor="@color/black" /> diff --git a/app/src/main/res/layout/activity_guardians.xml b/app/src/main/res/layout/activity_guardians.xml index 7980f6a..80534bc 100644 --- a/app/src/main/res/layout/activity_guardians.xml +++ b/app/src/main/res/layout/activity_guardians.xml @@ -150,7 +150,7 @@ + + + android:textColor="@color/black" + android:visibility="gone" /> + android:layout_height="220dp" /> @@ -63,7 +64,6 @@ android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginVertical="@dimen/dp_15" android:layout_weight="1" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" app:spanCount="3" /> @@ -72,10 +72,9 @@ android:id="@+id/skipSuppliesCheckButton" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/dp_15" + android:layout_marginVertical="@dimen/dp_15" android:background="@drawable/button_check_selector" android:text="跳过劳保用品检测" - android:textColor="@color/black" - android:visibility="gone" /> + android:textColor="@color/black" /> \ No newline at end of file