diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index de6ab8b..e36bd39 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,6 +50,9 @@ + + + + , + @PartMap jsonMarker: Map, + @Part fileBuffer1: MultipartBody.Part?, + @Part fileBuffer2: MultipartBody.Part?, + @Part fileBuffer3: MultipartBody.Part? + ): String } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index de6ab8b..e36bd39 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,6 +50,9 @@ + , + @PartMap jsonMarker: Map, + @Part fileBuffer1: MultipartBody.Part?, + @Part fileBuffer2: MultipartBody.Part?, + @Part fileBuffer3: MultipartBody.Part? + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt index 6e6f1ae..ab92452 100644 --- a/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt @@ -160,4 +160,44 @@ } } } + + /** + * 上报事件 + * Multipart上传图片,文件,带多参数上传 + */ + suspend fun uploadEvent(taskId: String, event: String, realPaths: ArrayList): String { + val taskIdMap = HashMap() + taskIdMap["taskId"] = taskId.toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val eventMap = HashMap() + eventMap["data"] = event.toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val multiParts = ArrayList() + realPaths.forEachIndexed { index, s -> + val file = File(s) + val fileMultipart = MultipartBody.Part.createFormData( + "fileBuffer${index + 1}", file.name, file.asRequestBody("image/png".toMediaType()) + ) + multiParts.add(fileMultipart) + } + + return when (multiParts.size) { + 3 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], multiParts[1], multiParts[2]) + } + 2 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], multiParts[1], null) + } + 1 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], null, null) + } + else -> { + api.uploadEvent(taskIdMap, eventMap, null, null, null) + } + } + } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index de6ab8b..e36bd39 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,6 +50,9 @@ + , + @PartMap jsonMarker: Map, + @Part fileBuffer1: MultipartBody.Part?, + @Part fileBuffer2: MultipartBody.Part?, + @Part fileBuffer3: MultipartBody.Part? + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt index 6e6f1ae..ab92452 100644 --- a/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt @@ -160,4 +160,44 @@ } } } + + /** + * 上报事件 + * Multipart上传图片,文件,带多参数上传 + */ + suspend fun uploadEvent(taskId: String, event: String, realPaths: ArrayList): String { + val taskIdMap = HashMap() + taskIdMap["taskId"] = taskId.toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val eventMap = HashMap() + eventMap["data"] = event.toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val multiParts = ArrayList() + realPaths.forEachIndexed { index, s -> + val file = File(s) + val fileMultipart = MultipartBody.Part.createFormData( + "fileBuffer${index + 1}", file.name, file.asRequestBody("image/png".toMediaType()) + ) + multiParts.add(fileMultipart) + } + + return when (multiParts.size) { + 3 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], multiParts[1], multiParts[2]) + } + 2 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], multiParts[1], null) + } + 1 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], null, null) + } + else -> { + api.uploadEvent(taskIdMap, eventMap, null, null, null) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt index 02b455f..ee56adf 100644 --- a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt +++ b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt @@ -414,6 +414,7 @@ labelBean.lat = latView.text.toString() labelBean.color = colorSelectedItem.toColor() labelBean.remark = remarkView.text.toString() + labelBean.imagePath = realPaths.toJson() DataBaseManager.get.insertTaskLabel(labelBean) } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index de6ab8b..e36bd39 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,6 +50,9 @@ + , + @PartMap jsonMarker: Map, + @Part fileBuffer1: MultipartBody.Part?, + @Part fileBuffer2: MultipartBody.Part?, + @Part fileBuffer3: MultipartBody.Part? + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt index 6e6f1ae..ab92452 100644 --- a/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt @@ -160,4 +160,44 @@ } } } + + /** + * 上报事件 + * Multipart上传图片,文件,带多参数上传 + */ + suspend fun uploadEvent(taskId: String, event: String, realPaths: ArrayList): String { + val taskIdMap = HashMap() + taskIdMap["taskId"] = taskId.toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val eventMap = HashMap() + eventMap["data"] = event.toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val multiParts = ArrayList() + realPaths.forEachIndexed { index, s -> + val file = File(s) + val fileMultipart = MultipartBody.Part.createFormData( + "fileBuffer${index + 1}", file.name, file.asRequestBody("image/png".toMediaType()) + ) + multiParts.add(fileMultipart) + } + + return when (multiParts.size) { + 3 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], multiParts[1], multiParts[2]) + } + 2 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], multiParts[1], null) + } + 1 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], null, null) + } + else -> { + api.uploadEvent(taskIdMap, eventMap, null, null, null) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt index 02b455f..ee56adf 100644 --- a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt +++ b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt @@ -414,6 +414,7 @@ labelBean.lat = latView.text.toString() labelBean.color = colorSelectedItem.toColor() labelBean.remark = remarkView.text.toString() + labelBean.imagePath = realPaths.toJson() DataBaseManager.get.insertTaskLabel(labelBean) } diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt index 9b791e9..8c5a880 100644 --- a/app/src/main/java/com/casic/detector/view/MainActivity.kt +++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt @@ -40,6 +40,8 @@ import com.casic.detector.vm.VersionViewModel import com.casic.detector.widgets.QueryMarkerDialog import com.casic.detector.widgets.SamplePopupWindow +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* @@ -77,6 +79,7 @@ private val powerManager by lazy { getSystemService() } private var wakeLock: PowerManager.WakeLock? = null private var taskBean: TaskBean? = null + private val gson by lazy { Gson() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -524,15 +527,14 @@ } } - //TODO //事件上报 private fun uploadEvent() { if (latitude != 0.0 && longitude != 0.0) { -// if () { -// -// } else { -// -// } + if (true) { + navigatePageTo() + } else { + "请点击[巡检]并选择执行工单!".show(this) + } } else { "定位中,请稍后再试...".show(this) } @@ -545,6 +547,11 @@ if (labelBeans.isNotEmpty()) { LoadingDialogHub.show(this, "标识器补全中,请稍后...") labelBeans.forEach { labelBean -> + val imagePaths = gson.fromJson>( + labelBean.imagePath, + object : TypeToken>() {}.type + ) + taskViewModel.installLabel( companyId, labelBean.objectType, @@ -572,7 +579,7 @@ labelBean.lat, labelBean.color, labelBean.remark, - arrayListOf() + imagePaths ) } LoadingDialogHub.dismiss() diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index de6ab8b..e36bd39 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,6 +50,9 @@ + , + @PartMap jsonMarker: Map, + @Part fileBuffer1: MultipartBody.Part?, + @Part fileBuffer2: MultipartBody.Part?, + @Part fileBuffer3: MultipartBody.Part? + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt index 6e6f1ae..ab92452 100644 --- a/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt @@ -160,4 +160,44 @@ } } } + + /** + * 上报事件 + * Multipart上传图片,文件,带多参数上传 + */ + suspend fun uploadEvent(taskId: String, event: String, realPaths: ArrayList): String { + val taskIdMap = HashMap() + taskIdMap["taskId"] = taskId.toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val eventMap = HashMap() + eventMap["data"] = event.toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val multiParts = ArrayList() + realPaths.forEachIndexed { index, s -> + val file = File(s) + val fileMultipart = MultipartBody.Part.createFormData( + "fileBuffer${index + 1}", file.name, file.asRequestBody("image/png".toMediaType()) + ) + multiParts.add(fileMultipart) + } + + return when (multiParts.size) { + 3 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], multiParts[1], multiParts[2]) + } + 2 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], multiParts[1], null) + } + 1 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], null, null) + } + else -> { + api.uploadEvent(taskIdMap, eventMap, null, null, null) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt index 02b455f..ee56adf 100644 --- a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt +++ b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt @@ -414,6 +414,7 @@ labelBean.lat = latView.text.toString() labelBean.color = colorSelectedItem.toColor() labelBean.remark = remarkView.text.toString() + labelBean.imagePath = realPaths.toJson() DataBaseManager.get.insertTaskLabel(labelBean) } diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt index 9b791e9..8c5a880 100644 --- a/app/src/main/java/com/casic/detector/view/MainActivity.kt +++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt @@ -40,6 +40,8 @@ import com.casic.detector.vm.VersionViewModel import com.casic.detector.widgets.QueryMarkerDialog import com.casic.detector.widgets.SamplePopupWindow +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* @@ -77,6 +79,7 @@ private val powerManager by lazy { getSystemService() } private var wakeLock: PowerManager.WakeLock? = null private var taskBean: TaskBean? = null + private val gson by lazy { Gson() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -524,15 +527,14 @@ } } - //TODO //事件上报 private fun uploadEvent() { if (latitude != 0.0 && longitude != 0.0) { -// if () { -// -// } else { -// -// } + if (true) { + navigatePageTo() + } else { + "请点击[巡检]并选择执行工单!".show(this) + } } else { "定位中,请稍后再试...".show(this) } @@ -545,6 +547,11 @@ if (labelBeans.isNotEmpty()) { LoadingDialogHub.show(this, "标识器补全中,请稍后...") labelBeans.forEach { labelBean -> + val imagePaths = gson.fromJson>( + labelBean.imagePath, + object : TypeToken>() {}.type + ) + taskViewModel.installLabel( companyId, labelBean.objectType, @@ -572,7 +579,7 @@ labelBean.lat, labelBean.color, labelBean.remark, - arrayListOf() + imagePaths ) } LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/detector/view/UploadEventActivity.kt b/app/src/main/java/com/casic/detector/view/UploadEventActivity.kt new file mode 100644 index 0000000..cf8d46b --- /dev/null +++ b/app/src/main/java/com/casic/detector/view/UploadEventActivity.kt @@ -0,0 +1,150 @@ +package com.casic.detector.view + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.Gravity +import android.view.View +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation +import com.casic.detector.R +import com.casic.detector.adapter.EditableImageAdapter +import com.casic.detector.callback.ILocationListener +import com.casic.detector.callback.OnImageCompressListener +import com.casic.detector.extensions.compressImage +import com.casic.detector.model.EventModel +import com.casic.detector.utils.LoadingDialogHub +import com.casic.detector.utils.LocaleConstant +import com.casic.detector.utils.LocationHub +import com.casic.detector.vm.TaskViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.pengxh.kt.lite.extensions.* +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_upload_event.* +import kotlinx.android.synthetic.main.include_install_label_open_camera.* +import java.io.File + +@SuppressLint("SetTextI18n") +class UploadEventActivity : AppCompatActivity() { + + private val context: Context = this@UploadEventActivity + private lateinit var imageAdapter: EditableImageAdapter + private val realPaths: ArrayList = ArrayList() //真实图片路径 + private lateinit var taskViewModel: TaskViewModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_upload_event) + + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.CENTER) + val params = window.attributes + params.width = ((getScreenWidth() * 0.9).toInt()) + params.height = ((getScreenHeight() * 0.7).toInt()) + window.attributes = params + + val userName = SaveKeyValues.getValue(LocaleConstant.USER_NAME, "") as String + userNameView.text = userName + + uploadTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + + LocationHub.getCurrentLocation(this, object : ILocationListener { + override fun onAMapLocationGet(location: AMapLocation?) { + if (location != null) { + lngView.text = "${location.longitude}" + latView.text = "${location.latitude}" + } else { + "当前位置信号差,无法获取定位".show(context) + } + } + }) + + imageAdapter = EditableImageAdapter(this, 3, 3f) + addImageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + takePicture() + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isEmpty()) { + "图片加载失败,无法查看大图".show(context) + } else { + context.navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imageAdapter.deleteImage(position) + } + }) + + cancelButton.setOnClickListener { finish() } + + taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] + taskViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "事件上报中,请稍后...") + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + } + uploadEventButton.setOnClickListener { + if (eventDescriptionView.text.isNullOrBlank()) { + "请输入事件描述!".show(this) + return@setOnClickListener + } + + val eventModel = EventModel() + eventModel.description = eventDescriptionView.text.toString() + eventModel.createTime = uploadTimeView.text.toString() + + eventModel.latitude = lngView.text.toString().toDouble() + eventModel.longitude = latView.text.toString().toDouble() + + taskViewModel.uploadEvent("", eventModel.toJson(), realPaths) + } + } + + private fun takePicture() { + PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(context) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + realPaths.add(file.absolutePath) + imageAdapter.setupImage(realPaths) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index de6ab8b..e36bd39 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,6 +50,9 @@ + , + @PartMap jsonMarker: Map, + @Part fileBuffer1: MultipartBody.Part?, + @Part fileBuffer2: MultipartBody.Part?, + @Part fileBuffer3: MultipartBody.Part? + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt index 6e6f1ae..ab92452 100644 --- a/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt @@ -160,4 +160,44 @@ } } } + + /** + * 上报事件 + * Multipart上传图片,文件,带多参数上传 + */ + suspend fun uploadEvent(taskId: String, event: String, realPaths: ArrayList): String { + val taskIdMap = HashMap() + taskIdMap["taskId"] = taskId.toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val eventMap = HashMap() + eventMap["data"] = event.toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val multiParts = ArrayList() + realPaths.forEachIndexed { index, s -> + val file = File(s) + val fileMultipart = MultipartBody.Part.createFormData( + "fileBuffer${index + 1}", file.name, file.asRequestBody("image/png".toMediaType()) + ) + multiParts.add(fileMultipart) + } + + return when (multiParts.size) { + 3 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], multiParts[1], multiParts[2]) + } + 2 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], multiParts[1], null) + } + 1 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], null, null) + } + else -> { + api.uploadEvent(taskIdMap, eventMap, null, null, null) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt index 02b455f..ee56adf 100644 --- a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt +++ b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt @@ -414,6 +414,7 @@ labelBean.lat = latView.text.toString() labelBean.color = colorSelectedItem.toColor() labelBean.remark = remarkView.text.toString() + labelBean.imagePath = realPaths.toJson() DataBaseManager.get.insertTaskLabel(labelBean) } diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt index 9b791e9..8c5a880 100644 --- a/app/src/main/java/com/casic/detector/view/MainActivity.kt +++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt @@ -40,6 +40,8 @@ import com.casic.detector.vm.VersionViewModel import com.casic.detector.widgets.QueryMarkerDialog import com.casic.detector.widgets.SamplePopupWindow +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* @@ -77,6 +79,7 @@ private val powerManager by lazy { getSystemService() } private var wakeLock: PowerManager.WakeLock? = null private var taskBean: TaskBean? = null + private val gson by lazy { Gson() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -524,15 +527,14 @@ } } - //TODO //事件上报 private fun uploadEvent() { if (latitude != 0.0 && longitude != 0.0) { -// if () { -// -// } else { -// -// } + if (true) { + navigatePageTo() + } else { + "请点击[巡检]并选择执行工单!".show(this) + } } else { "定位中,请稍后再试...".show(this) } @@ -545,6 +547,11 @@ if (labelBeans.isNotEmpty()) { LoadingDialogHub.show(this, "标识器补全中,请稍后...") labelBeans.forEach { labelBean -> + val imagePaths = gson.fromJson>( + labelBean.imagePath, + object : TypeToken>() {}.type + ) + taskViewModel.installLabel( companyId, labelBean.objectType, @@ -572,7 +579,7 @@ labelBean.lat, labelBean.color, labelBean.remark, - arrayListOf() + imagePaths ) } LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/detector/view/UploadEventActivity.kt b/app/src/main/java/com/casic/detector/view/UploadEventActivity.kt new file mode 100644 index 0000000..cf8d46b --- /dev/null +++ b/app/src/main/java/com/casic/detector/view/UploadEventActivity.kt @@ -0,0 +1,150 @@ +package com.casic.detector.view + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.Gravity +import android.view.View +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation +import com.casic.detector.R +import com.casic.detector.adapter.EditableImageAdapter +import com.casic.detector.callback.ILocationListener +import com.casic.detector.callback.OnImageCompressListener +import com.casic.detector.extensions.compressImage +import com.casic.detector.model.EventModel +import com.casic.detector.utils.LoadingDialogHub +import com.casic.detector.utils.LocaleConstant +import com.casic.detector.utils.LocationHub +import com.casic.detector.vm.TaskViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.pengxh.kt.lite.extensions.* +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_upload_event.* +import kotlinx.android.synthetic.main.include_install_label_open_camera.* +import java.io.File + +@SuppressLint("SetTextI18n") +class UploadEventActivity : AppCompatActivity() { + + private val context: Context = this@UploadEventActivity + private lateinit var imageAdapter: EditableImageAdapter + private val realPaths: ArrayList = ArrayList() //真实图片路径 + private lateinit var taskViewModel: TaskViewModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_upload_event) + + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.CENTER) + val params = window.attributes + params.width = ((getScreenWidth() * 0.9).toInt()) + params.height = ((getScreenHeight() * 0.7).toInt()) + window.attributes = params + + val userName = SaveKeyValues.getValue(LocaleConstant.USER_NAME, "") as String + userNameView.text = userName + + uploadTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + + LocationHub.getCurrentLocation(this, object : ILocationListener { + override fun onAMapLocationGet(location: AMapLocation?) { + if (location != null) { + lngView.text = "${location.longitude}" + latView.text = "${location.latitude}" + } else { + "当前位置信号差,无法获取定位".show(context) + } + } + }) + + imageAdapter = EditableImageAdapter(this, 3, 3f) + addImageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + takePicture() + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isEmpty()) { + "图片加载失败,无法查看大图".show(context) + } else { + context.navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imageAdapter.deleteImage(position) + } + }) + + cancelButton.setOnClickListener { finish() } + + taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] + taskViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "事件上报中,请稍后...") + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + } + uploadEventButton.setOnClickListener { + if (eventDescriptionView.text.isNullOrBlank()) { + "请输入事件描述!".show(this) + return@setOnClickListener + } + + val eventModel = EventModel() + eventModel.description = eventDescriptionView.text.toString() + eventModel.createTime = uploadTimeView.text.toString() + + eventModel.latitude = lngView.text.toString().toDouble() + eventModel.longitude = latView.text.toString().toDouble() + + taskViewModel.uploadEvent("", eventModel.toJson(), realPaths) + } + } + + private fun takePicture() { + PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(context) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + realPaths.add(file.absolutePath) + imageAdapter.setupImage(realPaths) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/vm/TaskViewModel.kt b/app/src/main/java/com/casic/detector/vm/TaskViewModel.kt index 2475f0d..e22fef1 100644 --- a/app/src/main/java/com/casic/detector/vm/TaskViewModel.kt +++ b/app/src/main/java/com/casic/detector/vm/TaskViewModel.kt @@ -148,4 +148,18 @@ loadState.value = LoadState.Fail it.convertChinese().show(BaseApplication.get()) }) + + fun uploadEvent(taskId: String, event: String, realPaths: ArrayList) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.uploadEvent(taskId, event, realPaths) + if (response.separateResponseState()) { + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.convertChinese().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index de6ab8b..e36bd39 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,6 +50,9 @@ + , + @PartMap jsonMarker: Map, + @Part fileBuffer1: MultipartBody.Part?, + @Part fileBuffer2: MultipartBody.Part?, + @Part fileBuffer3: MultipartBody.Part? + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt index 6e6f1ae..ab92452 100644 --- a/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/detector/retrofit/RetrofitServiceManager.kt @@ -160,4 +160,44 @@ } } } + + /** + * 上报事件 + * Multipart上传图片,文件,带多参数上传 + */ + suspend fun uploadEvent(taskId: String, event: String, realPaths: ArrayList): String { + val taskIdMap = HashMap() + taskIdMap["taskId"] = taskId.toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val eventMap = HashMap() + eventMap["data"] = event.toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val multiParts = ArrayList() + realPaths.forEachIndexed { index, s -> + val file = File(s) + val fileMultipart = MultipartBody.Part.createFormData( + "fileBuffer${index + 1}", file.name, file.asRequestBody("image/png".toMediaType()) + ) + multiParts.add(fileMultipart) + } + + return when (multiParts.size) { + 3 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], multiParts[1], multiParts[2]) + } + 2 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], multiParts[1], null) + } + 1 -> { + api.uploadEvent(taskIdMap, eventMap, multiParts[0], null, null) + } + else -> { + api.uploadEvent(taskIdMap, eventMap, null, null, null) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt index 02b455f..ee56adf 100644 --- a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt +++ b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt @@ -414,6 +414,7 @@ labelBean.lat = latView.text.toString() labelBean.color = colorSelectedItem.toColor() labelBean.remark = remarkView.text.toString() + labelBean.imagePath = realPaths.toJson() DataBaseManager.get.insertTaskLabel(labelBean) } diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt index 9b791e9..8c5a880 100644 --- a/app/src/main/java/com/casic/detector/view/MainActivity.kt +++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt @@ -40,6 +40,8 @@ import com.casic.detector.vm.VersionViewModel import com.casic.detector.widgets.QueryMarkerDialog import com.casic.detector.widgets.SamplePopupWindow +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* @@ -77,6 +79,7 @@ private val powerManager by lazy { getSystemService() } private var wakeLock: PowerManager.WakeLock? = null private var taskBean: TaskBean? = null + private val gson by lazy { Gson() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -524,15 +527,14 @@ } } - //TODO //事件上报 private fun uploadEvent() { if (latitude != 0.0 && longitude != 0.0) { -// if () { -// -// } else { -// -// } + if (true) { + navigatePageTo() + } else { + "请点击[巡检]并选择执行工单!".show(this) + } } else { "定位中,请稍后再试...".show(this) } @@ -545,6 +547,11 @@ if (labelBeans.isNotEmpty()) { LoadingDialogHub.show(this, "标识器补全中,请稍后...") labelBeans.forEach { labelBean -> + val imagePaths = gson.fromJson>( + labelBean.imagePath, + object : TypeToken>() {}.type + ) + taskViewModel.installLabel( companyId, labelBean.objectType, @@ -572,7 +579,7 @@ labelBean.lat, labelBean.color, labelBean.remark, - arrayListOf() + imagePaths ) } LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/detector/view/UploadEventActivity.kt b/app/src/main/java/com/casic/detector/view/UploadEventActivity.kt new file mode 100644 index 0000000..cf8d46b --- /dev/null +++ b/app/src/main/java/com/casic/detector/view/UploadEventActivity.kt @@ -0,0 +1,150 @@ +package com.casic.detector.view + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.Gravity +import android.view.View +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation +import com.casic.detector.R +import com.casic.detector.adapter.EditableImageAdapter +import com.casic.detector.callback.ILocationListener +import com.casic.detector.callback.OnImageCompressListener +import com.casic.detector.extensions.compressImage +import com.casic.detector.model.EventModel +import com.casic.detector.utils.LoadingDialogHub +import com.casic.detector.utils.LocaleConstant +import com.casic.detector.utils.LocationHub +import com.casic.detector.vm.TaskViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.pengxh.kt.lite.extensions.* +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_upload_event.* +import kotlinx.android.synthetic.main.include_install_label_open_camera.* +import java.io.File + +@SuppressLint("SetTextI18n") +class UploadEventActivity : AppCompatActivity() { + + private val context: Context = this@UploadEventActivity + private lateinit var imageAdapter: EditableImageAdapter + private val realPaths: ArrayList = ArrayList() //真实图片路径 + private lateinit var taskViewModel: TaskViewModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_upload_event) + + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.CENTER) + val params = window.attributes + params.width = ((getScreenWidth() * 0.9).toInt()) + params.height = ((getScreenHeight() * 0.7).toInt()) + window.attributes = params + + val userName = SaveKeyValues.getValue(LocaleConstant.USER_NAME, "") as String + userNameView.text = userName + + uploadTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + + LocationHub.getCurrentLocation(this, object : ILocationListener { + override fun onAMapLocationGet(location: AMapLocation?) { + if (location != null) { + lngView.text = "${location.longitude}" + latView.text = "${location.latitude}" + } else { + "当前位置信号差,无法获取定位".show(context) + } + } + }) + + imageAdapter = EditableImageAdapter(this, 3, 3f) + addImageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + takePicture() + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isEmpty()) { + "图片加载失败,无法查看大图".show(context) + } else { + context.navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imageAdapter.deleteImage(position) + } + }) + + cancelButton.setOnClickListener { finish() } + + taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] + taskViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "事件上报中,请稍后...") + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + } + uploadEventButton.setOnClickListener { + if (eventDescriptionView.text.isNullOrBlank()) { + "请输入事件描述!".show(this) + return@setOnClickListener + } + + val eventModel = EventModel() + eventModel.description = eventDescriptionView.text.toString() + eventModel.createTime = uploadTimeView.text.toString() + + eventModel.latitude = lngView.text.toString().toDouble() + eventModel.longitude = latView.text.toString().toDouble() + + taskViewModel.uploadEvent("", eventModel.toJson(), realPaths) + } + } + + private fun takePicture() { + PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(context) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + realPaths.add(file.absolutePath) + imageAdapter.setupImage(realPaths) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/vm/TaskViewModel.kt b/app/src/main/java/com/casic/detector/vm/TaskViewModel.kt index 2475f0d..e22fef1 100644 --- a/app/src/main/java/com/casic/detector/vm/TaskViewModel.kt +++ b/app/src/main/java/com/casic/detector/vm/TaskViewModel.kt @@ -148,4 +148,18 @@ loadState.value = LoadState.Fail it.convertChinese().show(BaseApplication.get()) }) + + fun uploadEvent(taskId: String, event: String, realPaths: ArrayList) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.uploadEvent(taskId, event, realPaths) + if (response.separateResponseState()) { + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.convertChinese().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_install_label.xml b/app/src/main/res/layout/activity_install_label.xml index e191ec8..5b459eb 100644 --- a/app/src/main/res/layout/activity_install_label.xml +++ b/app/src/main/res/layout/activity_install_label.xml @@ -45,7 +45,6 @@ android:background="#BFBFBF" />