增加评测link功能

This commit is contained in:
squallzhjch 2023-07-13 16:36:43 +08:00
parent 23a3490c20
commit 43b62f9947
6 changed files with 168 additions and 120 deletions

View File

@ -131,6 +131,8 @@ dependencies {
// //
implementation 'com.github.bumptech.glide:glide:4.15.1' implementation 'com.github.bumptech.glide:glide:4.15.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1' annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1'
// implementation "io.realm:realm-kotlin-extensions:6.1.0"
} }
// //
kapt { kapt {

View File

@ -94,6 +94,8 @@ class Constant {
const val EVENT_LAYER_MANAGER_CHANGE = "EVENT_LAYER_MANAGER_CHANGE" // 图层管理中的配置修改 const val EVENT_LAYER_MANAGER_CHANGE = "EVENT_LAYER_MANAGER_CHANGE" // 图层管理中的配置修改
const val SELECT_TASK_ID = "select_task_id" //选中的任务ID const val SELECT_TASK_ID = "select_task_id" //选中的任务ID
const val SHARED_SYNC_TASK_LINK_ID = "shared_sync_task_link_id"//利用shared通知任务页面更新
} }

View File

@ -3,6 +3,7 @@ package com.navinfo.omqs.ui.activity.map
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.content.DialogInterface import android.content.DialogInterface
import android.content.SharedPreferences
import android.graphics.drawable.AnimationDrawable import android.graphics.drawable.AnimationDrawable
import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.BitmapDrawable
import android.os.Build import android.os.Build
@ -64,6 +65,7 @@ class MainViewModel @Inject constructor(
private val mapController: NIMapController, private val mapController: NIMapController,
private val traceDataBase: TraceDataBase, private val traceDataBase: TraceDataBase,
private val realmOperateHelper: RealmOperateHelper, private val realmOperateHelper: RealmOperateHelper,
private val sharedPreferences: SharedPreferences
) : ViewModel() { ) : ViewModel() {
private var mCameraDialog: CommonDialog? = null private var mCameraDialog: CommonDialog? = null
@ -152,30 +154,19 @@ class MainViewModel @Inject constructor(
} }
/** /**
* 初始任务高亮高亮 * 初始化选中的任务高亮高亮
*/ */
private fun initTaskData() { private fun initTaskData() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
viewModelScope.launch { viewModelScope.launch(Dispatchers.IO) {
val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1)
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
val results = realm.where(TaskBean::class.java).findAll() val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst()
val list = realm.copyFromRealm(results) if (res != null) {
results.addChangeListener { changes -> val taskBean = realm.copyFromRealm(res)
val list2 = realm.copyFromRealm(changes) mapController.lineHandler.omdbTaskLinkLayer.addLineList(taskBean.hadLinkDvoList)
mapController.lineHandler.omdbTaskLinkLayer.removeAll()
for (item in list2) {
mapController.lineHandler.omdbTaskLinkLayer.addLineList(item.hadLinkDvoList)
} }
} }
mapController.lineHandler.omdbTaskLinkLayer.removeAll()
for (item in list) {
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// mapController.lineHandler.omdbTaskLinkLayer.setLineColor(Color.valueOf(item.color))
// }
mapController.lineHandler.omdbTaskLinkLayer.addLineList(item.hadLinkDvoList)
}
}
// realm.close()
} }
} }

View File

@ -6,7 +6,6 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.fragment.app.viewModels
import androidx.navigation.findNavController import androidx.navigation.findNavController
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.NIMapController
@ -14,7 +13,6 @@ import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.FragmentTaskLinkBinding import com.navinfo.omqs.databinding.FragmentTaskLinkBinding
import com.navinfo.omqs.ui.activity.map.MainActivity import com.navinfo.omqs.ui.activity.map.MainActivity
import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.fragment.BaseFragment
import com.navinfo.omqs.ui.other.BaseToast
import com.navinfo.omqs.ui.other.shareViewModels import com.navinfo.omqs.ui.other.shareViewModels
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject import javax.inject.Inject
@ -144,10 +142,12 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener {
onBackPressed() onBackPressed()
} }
binding.taskLinkBarSave -> { binding.taskLinkBarSave -> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
viewModel.saveData() viewModel.saveData()
} }
} }
} }
}
/** /**
* 显示中间面板 * 显示中间面板

View File

@ -2,12 +2,14 @@ package com.navinfo.omqs.ui.fragment.tasklink
import android.content.SharedPreferences import android.content.SharedPreferences
import android.os.Build import android.os.Build
import androidx.annotation.RequiresApi
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.navinfo.collect.library.data.entity.HadLinkDvoBean import com.navinfo.collect.library.data.entity.HadLinkDvoBean
import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.data.entity.TaskBean
import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import io.realm.Realm import io.realm.Realm
@ -22,14 +24,14 @@ import javax.inject.Inject
@HiltViewModel @HiltViewModel
class TaskLinkViewModel @Inject constructor( class TaskLinkViewModel @Inject constructor(
val mapController: NIMapController, private val mapController: NIMapController,
val sharedPreferences: SharedPreferences private val sharedPreferences: SharedPreferences
) : ViewModel(), SharedPreferences.OnSharedPreferenceChangeListener { ) : ViewModel(), SharedPreferences.OnSharedPreferenceChangeListener {
/** /**
* 种别 * 种别
*/ */
private val kindList = listOf<TaskLinkInfoAdapterItem>( private val kindList = listOf(
TaskLinkInfoAdapterItem("高速道路", "1"), TaskLinkInfoAdapterItem("高速道路", "1"),
TaskLinkInfoAdapterItem("城市高速", "2"), TaskLinkInfoAdapterItem("城市高速", "2"),
TaskLinkInfoAdapterItem("国道", "3"), TaskLinkInfoAdapterItem("国道", "3"),
@ -47,7 +49,7 @@ class TaskLinkViewModel @Inject constructor(
/** /**
* FunctionGrade 功能等级 * FunctionGrade 功能等级
*/ */
private val functionLevelList = listOf<TaskLinkInfoAdapterItem>( private val functionLevelList = listOf(
TaskLinkInfoAdapterItem("等级1", "1"), TaskLinkInfoAdapterItem("等级1", "1"),
TaskLinkInfoAdapterItem("等级2", "2"), TaskLinkInfoAdapterItem("等级2", "2"),
TaskLinkInfoAdapterItem("等级3", "3"), TaskLinkInfoAdapterItem("等级3", "3"),
@ -58,7 +60,7 @@ class TaskLinkViewModel @Inject constructor(
/** /**
* 数据级别 * 数据级别
*/ */
private val dataLevelList = listOf<TaskLinkInfoAdapterItem>( private val dataLevelList = listOf(
TaskLinkInfoAdapterItem("Pro lane model(有高精车道模型覆盖的高速和城高link)", "1"), TaskLinkInfoAdapterItem("Pro lane model(有高精车道模型覆盖的高速和城高link)", "1"),
TaskLinkInfoAdapterItem("Lite lane model(有高精车道模型覆盖的普通路link)", "2"), TaskLinkInfoAdapterItem("Lite lane model(有高精车道模型覆盖的普通路link)", "2"),
TaskLinkInfoAdapterItem("Standard road model(其他link)", "3"), TaskLinkInfoAdapterItem("Standard road model(其他link)", "3"),
@ -115,7 +117,7 @@ class TaskLinkViewModel @Inject constructor(
val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1)
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst() val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst()
liveDataTaskBean.postValue(realm.copyFromRealm(res)) liveDataTaskBean.postValue(res?.let { realm.copyFromRealm(it) })
} }
} }
@ -162,19 +164,18 @@ class TaskLinkViewModel @Inject constructor(
/** /**
* 保存数据 * 保存数据
*/ */
@RequiresApi(Build.VERSION_CODES.M)
fun saveData() { fun saveData() {
viewModelScope.launch(Dispatchers.Default) { viewModelScope.launch(Dispatchers.Default) {
if (liveDataTaskBean.value == null) { if (liveDataTaskBean.value == null) {
liveDataToastMessage.postValue("还没有选择任何一条任务!") liveDataToastMessage.postValue("还没有选择任何一条任务!")
return@launch return@launch
} }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (mapController.measureLayerHandler.mPathLayer.points.size < 2) { if (mapController.measureLayerHandler.mPathLayer.points.size < 2) {
liveDataToastMessage.postValue("道路点少于2个") liveDataToastMessage.postValue("道路点少于2个")
return@launch return@launch
} }
}
if (liveDataSelectKind.value == null) { if (liveDataSelectKind.value == null) {
liveDataToastMessage.postValue("请选择种别!") liveDataToastMessage.postValue("请选择种别!")
return@launch return@launch
@ -187,7 +188,21 @@ class TaskLinkViewModel @Inject constructor(
liveDataToastMessage.postValue("请选择数据等级!") liveDataToastMessage.postValue("请选择数据等级!")
return@launch return@launch
} }
val linkBean = HadLinkDvoBean(linkPid = UUID.randomUUID().toString()) val linkBean = HadLinkDvoBean(
linkPid = UUID.randomUUID().toString(),
linkStatus = 3,
geometry = GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points),
linkLength = mapController.measureLayerHandler.lineLenghtLiveData.value!!,
)
val task: TaskBean = liveDataTaskBean.value!!
task.hadLinkDvoList.add(linkBean)
val realm = Realm.getDefaultInstance()
realm.executeTransaction {
it.copyToRealmOrUpdate(task)
}
sharedPreferences.edit().putString(Constant.SHARED_SYNC_TASK_LINK_ID, linkBean.linkPid)
.apply()
liveDataFinish.postValue(true)
} }
} }

View File

@ -1,9 +1,8 @@
package com.navinfo.omqs.ui.fragment.tasklist package com.navinfo.omqs.ui.fragment.tasklist
import android.app.Dialog
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import android.graphics.Color import android.content.SharedPreferences.OnSharedPreferenceChangeListener
import android.os.Build import android.os.Build
import android.widget.Toast import android.widget.Toast
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
@ -32,7 +31,7 @@ class TaskViewModel @Inject constructor(
private val networkService: NetworkService, private val networkService: NetworkService,
private val mapController: NIMapController, private val mapController: NIMapController,
private val sharedPreferences: SharedPreferences private val sharedPreferences: SharedPreferences
) : ViewModel() { ) : ViewModel(), OnSharedPreferenceChangeListener {
/** /**
* 用来更新任务列表 * 用来更新任务列表
@ -49,8 +48,8 @@ class TaskViewModel @Inject constructor(
*/ */
val liveDataTaskUpload = MutableLiveData<Map<TaskBean, Boolean>>() val liveDataTaskUpload = MutableLiveData<Map<TaskBean, Boolean>>()
private val colors = // private val colors =
arrayOf(Color.RED, Color.YELLOW, Color.BLUE, Color.MAGENTA, Color.GREEN, Color.CYAN) // arrayOf(Color.RED, Color.YELLOW, Color.BLUE, Color.MAGENTA, Color.GREEN, Color.CYAN)
/** /**
* 当前选中的任务 * 当前选中的任务
@ -65,13 +64,16 @@ class TaskViewModel @Inject constructor(
private var filterTaskJob: Job? = null private var filterTaskJob: Job? = null
init {
sharedPreferences.registerOnSharedPreferenceChangeListener(this)
}
/** /**
* 下载任务列表 * 下载任务列表
*/ */
fun getTaskList(context: Context) { fun getTaskList(context: Context) {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
var taskList: List<TaskBean> = mutableListOf()
when (val result = networkService.getTaskList(Constant.USER_ID)) { when (val result = networkService.getTaskList(Constant.USER_ID)) {
is NetResult.Success -> { is NetResult.Success -> {
if (result.data != null) { if (result.data != null) {
@ -87,6 +89,7 @@ class TaskViewModel @Inject constructor(
task.fileSize = item.fileSize task.fileSize = item.fileSize
task.status = item.status task.status = item.status
task.currentSize = item.currentSize task.currentSize = item.currentSize
task.hadLinkDvoList = item.hadLinkDvoList
//已上传后不在更新操作时间 //已上传后不在更新操作时间
if (task.syncStatus != FileManager.Companion.FileUploadStatus.DONE) { if (task.syncStatus != FileManager.Companion.FileUploadStatus.DONE) {
//赋值时间,用于查询过滤 //赋值时间,用于查询过滤
@ -120,28 +123,41 @@ class TaskViewModel @Inject constructor(
is NetResult.Loading -> {} is NetResult.Loading -> {}
} }
getLocalTaskList()
}
}
/**
* 获取任务列表
*/
private suspend fun getLocalTaskList() {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
//过滤掉已上传的超过90天的数据 //过滤掉已上传的超过90天的数据
var nowTime: Long = DateTimeUtil.getNowDate().time val nowTime: Long = DateTimeUtil.getNowDate().time
var beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L val beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L
var syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE val syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE
val objects = val objects =
realm.where(TaskBean::class.java).notEqualTo("syncStatus", syncUpload).or() realm.where(TaskBean::class.java).notEqualTo("syncStatus", syncUpload).or()
.between("operationTime", beginNowTime, nowTime) .between("operationTime", beginNowTime, nowTime)
.equalTo("syncStatus", syncUpload).findAll() .equalTo("syncStatus", syncUpload).findAll()
taskList = realm.copyFromRealm(objects) val taskList = realm.copyFromRealm(objects)
for (item in taskList) { for (item in taskList) {
FileManager.checkOMDBFileInfo(item) FileManager.checkOMDBFileInfo(item)
} }
liveDataTaskList.postValue(taskList) liveDataTaskList.postValue(taskList)
val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1)
if (id > -1) { if (id > -1) {
for(item in taskList){ for (item in taskList) {
if(item.id == id){ if (item.id == id) {
currentSelectTaskBean = item currentSelectTaskBean = item
liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList) liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList)
withContext(Dispatchers.Main) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
showTaskLinks(currentSelectTaskBean!!)
} }
} }
break
}
} }
} }
} }
@ -149,14 +165,21 @@ class TaskViewModel @Inject constructor(
/** /**
* 设置当前选择的任务并高亮当前任务的所有link * 设置当前选择的任务并高亮当前任务的所有link
*/ */
@RequiresApi(Build.VERSION_CODES.M)
fun setSelectTaskBean(taskBean: TaskBean) { fun setSelectTaskBean(taskBean: TaskBean) {
sharedPreferences.edit().putInt(Constant.SELECT_TASK_ID, taskBean.id).commit() sharedPreferences.edit().putInt(Constant.SELECT_TASK_ID, taskBean.id).apply()
currentSelectTaskBean = taskBean currentSelectTaskBean = taskBean
liveDataTaskLinks.value = taskBean.hadLinkDvoList liveDataTaskLinks.value = taskBean.hadLinkDvoList
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
showTaskLinks(taskBean)
}
}
@RequiresApi(Build.VERSION_CODES.M)
private fun showTaskLinks(taskBean: TaskBean) {
mapController.lineHandler.omdbTaskLinkLayer.removeAll() mapController.lineHandler.omdbTaskLinkLayer.removeAll()
if (taskBean.hadLinkDvoList.isNotEmpty()) { if (taskBean.hadLinkDvoList.isNotEmpty()) {
@ -215,10 +238,13 @@ class TaskViewModel @Inject constructor(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mapController.lineHandler.omdbTaskLinkLayer.clearSelectLine() mapController.lineHandler.omdbTaskLinkLayer.clearSelectLine()
} }
sharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
super.onCleared() super.onCleared()
} }
/**
* 保存link补作业原因
*/
suspend fun saveLinkReason(bean: HadLinkDvoBean, text: String) { suspend fun saveLinkReason(bean: HadLinkDvoBean, text: String) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
currentSelectTaskBean?.let { currentSelectTaskBean?.let {
@ -227,12 +253,13 @@ class TaskViewModel @Inject constructor(
item.reason = text item.reason = text
} }
} }
}
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
realm.executeTransaction { realm.executeTransaction { r ->
realm.copyToRealmOrUpdate(currentSelectTaskBean) r.copyToRealmOrUpdate(it)
} }
} }
}
} }
/** /**
@ -255,6 +282,9 @@ class TaskViewModel @Inject constructor(
} }
} }
/**
* 筛选link
*/
fun filterTask(pidKey: String) { fun filterTask(pidKey: String) {
if (currentSelectTaskBean == null) if (currentSelectTaskBean == null)
return return
@ -272,13 +302,16 @@ class TaskViewModel @Inject constructor(
} }
} }
/**
* 关闭任务
*/
fun removeTask(context: Context, taskBean: TaskBean) { fun removeTask(context: Context, taskBean: TaskBean) {
if (taskBean != null) {
val mDialog = FirstDialog(context) val mDialog = FirstDialog(context)
mDialog.setTitle("提示?") mDialog.setTitle("提示?")
mDialog.setMessage("是否关闭,请确认!") mDialog.setMessage("是否关闭,请确认!")
mDialog.setPositiveButton("确定", object : FirstDialog.OnClickListener { mDialog.setPositiveButton(
override fun onClick(dialog: Dialog?, which: Int) { "确定"
) { _, _ ->
mDialog.dismiss() mDialog.dismiss()
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
@ -301,9 +334,9 @@ class TaskViewModel @Inject constructor(
} }
} }
//过滤掉已上传的超过90天的数据 //过滤掉已上传的超过90天的数据
var nowTime: Long = DateTimeUtil.getNowDate().time val nowTime: Long = DateTimeUtil.getNowDate().time
var beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L val beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L
var syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE val syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE
val objects = realm.where(TaskBean::class.java) val objects = realm.where(TaskBean::class.java)
.notEqualTo("syncStatus", syncUpload).or() .notEqualTo("syncStatus", syncUpload).or()
.between("operationTime", beginNowTime, nowTime) .between("operationTime", beginNowTime, nowTime)
@ -315,11 +348,9 @@ class TaskViewModel @Inject constructor(
liveDataTaskList.postValue(taskList) liveDataTaskList.postValue(taskList)
} }
} }
})
mDialog.setNegativeButton("取消", null) mDialog.setNegativeButton("取消", null)
mDialog.show() mDialog.show()
} }
}
fun checkUploadTask(context: Context, taskBean: TaskBean) { fun checkUploadTask(context: Context, taskBean: TaskBean) {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
@ -335,19 +366,15 @@ class TaskViewModel @Inject constructor(
mDialog.setTitle("提示?") mDialog.setTitle("提示?")
mDialog.setMessage("此任务中存在未测评link请确认") mDialog.setMessage("此任务中存在未测评link请确认")
mDialog.setPositiveButton( mDialog.setPositiveButton(
"确定", "确定"
object : FirstDialog.OnClickListener { ) { _, _ ->
override fun onClick(dialog: Dialog?, which: Int) {
mDialog.dismiss() mDialog.dismiss()
map[taskBean] = true map[taskBean] = true
liveDataTaskUpload.postValue(map) liveDataTaskUpload.postValue(map)
} }
}) mDialog.setNegativeButton(
mDialog.setNegativeButton("取消", object : FirstDialog.OnClickListener { "取消"
override fun onClick(dialog: Dialog?, which: Int) { ) { _, _ -> mDialog.dismiss() }
mDialog.dismiss()
}
})
mDialog.show() mDialog.show()
} }
return@launch return@launch
@ -357,4 +384,15 @@ class TaskViewModel @Inject constructor(
} }
} }
} }
/**
* 监听新增的评测link
*/
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
if (key == Constant.SHARED_SYNC_TASK_LINK_ID) {
viewModelScope.launch(Dispatchers.IO) {
getLocalTaskList()
}
}
}
} }