From fc92cebe4aea4ae2e37119c1c4298351e9481d5d Mon Sep 17 00:00:00 2001
From: squallzhjch <zhangjingchao@navinfo.com>
Date: Mon, 9 Oct 2023 10:44:42 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=BC=E6=B5=81=E5=8C=BA?=
 =?UTF-8?q?=E8=AF=A6=E6=83=85=E5=B1=95=E7=A4=BA=20=E4=BF=AE=E6=94=B9?=
 =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=20?=
 =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=95=B0=E6=8D=AE=E4=B8=8A=E4=BC=A0=E7=8A=B6?=
 =?UTF-8?q?=E6=80=81=E5=8A=A8=E6=80=81=E5=8F=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/navinfo/omqs/db/RealmOperateHelper.kt |  46 +++--
 .../omqs/ui/activity/map/MainViewModel.kt     |  34 ++--
 .../EvaluationResultViewModel.kt              |   5 +-
 .../personalcenter/PersonalCenterViewModel.kt |   6 +-
 .../omqs/ui/fragment/tasklist/TaskFragment.kt |   6 +
 .../ui/fragment/tasklist/TaskListAdapter.kt   |  21 +-
 .../ui/fragment/tasklist/TaskViewModel.kt     | 184 ++++++++----------
 .../java/com/navinfo/omqs/util/SignUtil.kt    |  22 +++
 8 files changed, 170 insertions(+), 154 deletions(-)

diff --git a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt
index ad64e48f..b00471db 100644
--- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt
@@ -39,6 +39,7 @@ class RealmOperateHelper() {
      * */
     @RequiresApi(Build.VERSION_CODES.N)
     suspend fun queryLink(
+        realm: Realm,
         point: GeoPoint,
         buffer: Double = DEFAULT_BUFFER,
         bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE,
@@ -63,9 +64,9 @@ class RealmOperateHelper() {
         val yStart = tileYSet.stream().min(Comparator.naturalOrder()).orElse(null)
         val yEnd = tileYSet.stream().max(Comparator.naturalOrder()).orElse(null)
         // 查询realm中对应tile号的数据
-        val realm = getSelectTaskRealmInstance()
+//        val realm = getSelectTaskRealmInstance()
         val realmList =
-            getSelectTaskRealmTools(RenderEntity::class.java, false)
+            getSelectTaskRealmTools(realm, RenderEntity::class.java, false)
                 .equalTo("table", DataCodeEnum.OMDB_LINK_DIRECT.name)
                 .greaterThanOrEqualTo("tileX", xStart)
                 .lessThanOrEqualTo("tileX", xEnd)
@@ -74,7 +75,7 @@ class RealmOperateHelper() {
                 .findAll()
         // 将获取到的数据和查询的polygon做相交,只返回相交的数据
         val dataList = realm.copyFromRealm(realmList)
-        realm.close()
+//        realm.close()
 
         val queryResult = dataList?.stream()?.filter {
             polygon.intersects(it.wkt)
@@ -132,7 +133,7 @@ class RealmOperateHelper() {
         val yEnd = tileYSet.stream().max(Comparator.naturalOrder()).orElse(null)
         // 查询realm中对应tile号的数据
         val realm = getSelectTaskRealmInstance()
-        val realmList = getSelectTaskRealmTools(RenderEntity::class.java, true)
+        val realmList = getSelectTaskRealmTools(realm, RenderEntity::class.java, true)
             .equalTo("table", table)
             .greaterThanOrEqualTo("tileX", xStart)
             .lessThanOrEqualTo("tileX", xEnd)
@@ -228,12 +229,14 @@ class RealmOperateHelper() {
         return qsRecordBean
     }
 
-    suspend fun queryLinkToMutableRenderEntityList(linkPid: String): MutableList<RenderEntity>? {
+    suspend fun queryLinkToMutableRenderEntityList(
+        realm: Realm,
+        linkPid: String
+    ): MutableList<RenderEntity>? {
         val resultList = mutableListOf<RenderEntity>()
+//        val realm = getSelectTaskRealmInstance()
 
-        val realm = getSelectTaskRealmInstance()
-
-        val realmR = getSelectTaskRealmTools(RenderEntity::class.java, true)
+        val realmR = getSelectTaskRealmTools(realm, RenderEntity::class.java, true)
             .equalTo("properties['${LinkTable.linkPid}']", linkPid).findAll()
 
         val dataList = realm.copyFromRealm(realmR)
@@ -242,7 +245,7 @@ class RealmOperateHelper() {
             resultList.add(it)
         }
 
-        realm.close()
+//        realm.close()
         return resultList
     }
 
@@ -280,7 +283,7 @@ class RealmOperateHelper() {
         val yEnd = tileYSet.stream().max(Comparator.naturalOrder()).orElse(null)
         val realm = getSelectTaskRealmInstance()
         var realmList = mutableListOf<RenderEntity>()
-        val realmQuery = getSelectTaskRealmTools(RenderEntity::class.java, false)
+        val realmQuery = getSelectTaskRealmTools(realm, RenderEntity::class.java, false)
             .greaterThanOrEqualTo("tileX", xStart)
             .lessThanOrEqualTo("tileX", xEnd)
             .greaterThanOrEqualTo("tileY", yStart)
@@ -299,10 +302,12 @@ class RealmOperateHelper() {
         }
         // 将获取到的数据和查询的polygon做相交,只返回相交的数据
         val queryResult = realmList?.stream()?.filter {
-            if(Constant.MapCatchLine){
-                polygon.intersects(it.wkt) && it.wkt?.geometryType?.uppercase().equals("LINESTRING")||it.wkt?.geometryType?.uppercase().equals("POLYGON")
-            }else{
-                polygon.intersects(it.wkt) && it.wkt?.geometryType?.uppercase().equals("POINT")||it.wkt?.geometryType?.uppercase().equals("POLYGON")
+            if (Constant.MapCatchLine) {
+                polygon.intersects(it.wkt) && it.wkt?.geometryType?.uppercase()
+                    .equals("LINESTRING") || it.wkt?.geometryType?.uppercase().equals("POLYGON")
+            } else {
+                polygon.intersects(it.wkt) && it.wkt?.geometryType?.uppercase()
+                    .equals("POINT") || it.wkt?.geometryType?.uppercase().equals("POLYGON")
             }
         }?.toList()
         queryResult?.let {
@@ -323,15 +328,13 @@ class RealmOperateHelper() {
      * @param bufferType 点位外扩距离的单位: 米-Meter,像素-PIXEL
      * @param sort 是否需要排序
      * */
-    suspend fun queryLinkByLinkPid(linkPid: String): MutableList<RenderEntity> {
+    suspend fun queryLinkByLinkPid(realm: Realm,linkPid: String): MutableList<RenderEntity> {
         val result = mutableListOf<RenderEntity>()
-        val realm = getSelectTaskRealmInstance()
-        val realmList = getSelectTaskRealmTools(RenderEntity::class.java, false)
+        val realmList = getSelectTaskRealmTools(realm, RenderEntity::class.java, false)
             .notEqualTo("table", DataCodeEnum.OMDB_RD_LINK.name)
             .equalTo("properties['${LinkTable.linkPid}']", linkPid)
             .findAll()
         result.addAll(realm.copyFromRealm(realmList))
-        realm.close()
         return result
     }
 
@@ -426,19 +429,20 @@ class RealmOperateHelper() {
 
 
     fun <E : RealmModel> getSelectTaskRealmTools(
+        realm: Realm,
         clazz: Class<E>,
         enableSql: Boolean
     ): RealmQuery<E> {
-        var realmQuery = getSelectTaskRealmInstance().where(clazz)
+        val realmQuery = realm.where(clazz)
         if (MapParamUtils.getDataLayerEnum() != null) {
             if (enableSql) {
                 var sql =
                     " enable${MapParamUtils.getDataLayerEnum().sql}"
-                getSelectTaskRealmInstance().where(clazz).rawPredicate(sql)
+                realm.where(clazz).rawPredicate(sql)
             }
 
         }
-        if(clazz.name==RenderEntity::class.jvmName){
+        if (clazz.name == RenderEntity::class.jvmName) {
             // 筛选不显示的数据
             if (com.navinfo.collect.library.system.Constant.HAD_LAYER_INVISIABLE_ARRAY != null && com.navinfo.collect.library.system.Constant.HAD_LAYER_INVISIABLE_ARRAY.size > 0) {
                 realmQuery.beginGroup()
diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt
index 9eb1a23e..13195a8a 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt
@@ -50,17 +50,11 @@ import io.realm.Realm
 import io.realm.RealmConfiguration
 import io.realm.RealmSet
 import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.collectLatest
-import kotlinx.coroutines.flow.flow
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.sync.Mutex
 import kotlinx.coroutines.withContext
-import org.locationtech.jts.geom.Envelope
 import org.locationtech.jts.geom.Geometry
-import org.locationtech.jts.geom.LineString
-import org.locationtech.spatial4j.shape.Rectangle
 import org.oscim.core.GeoPoint
 import org.oscim.core.MapPosition
 import org.oscim.map.Map
@@ -637,7 +631,7 @@ class MainViewModel @Inject constructor(
     private suspend fun captureItem(point: GeoPoint) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             var buffer = 3.2
-            if(mapController.mMapView.mapLevel>=18){
+            if (mapController.mMapView.mapLevel >= 18) {
                 buffer = 2.0
             }
             val itemList = realmOperateHelper.queryElement(
@@ -677,9 +671,9 @@ class MainViewModel @Inject constructor(
                 val topSignList = mutableListOf<SignBean>()
                 mapController.lineHandler.linksLayer.clear()
                 if (linkIdCache != route.linkId) {
-
+                    val realm = realmOperateHelper.getSelectTaskRealmInstance()
                     mapController.lineHandler.showLine(route.pointList)
-                    var elementList = realmOperateHelper.queryLinkByLinkPid(route.linkId)
+                    val elementList = realmOperateHelper.queryLinkByLinkPid(realm, route.linkId)
                     for (element in elementList) {
 
                         when (element.code) {
@@ -749,6 +743,7 @@ class MainViewModel @Inject constructor(
                         speakMode?.speakText(speechText)
                     }
                     linkIdCache = route.linkId ?: ""
+                    realm.close()
                 }
             }
         } catch (e: Exception) {
@@ -769,8 +764,8 @@ class MainViewModel @Inject constructor(
             captureLinkState = true
 
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-
-                val linkList = realmOperateHelper.queryLink(point = point)
+                val realm = realmOperateHelper.getSelectTaskRealmInstance()
+                val linkList = realmOperateHelper.queryLink(realm, point = point)
 
                 var hisRoadName = false
 
@@ -807,7 +802,8 @@ class MainViewModel @Inject constructor(
 
                         val newLineString = GeometryTools.createLineString(linePoints)
                         linkId?.let {
-                            var elementList = realmOperateHelper.queryLinkByLinkPid(it)
+                            val elementList = realmOperateHelper.queryLinkByLinkPid(realm, it)
+                            Log.e("jingo", "捕捉到数据 ${elementList.size} 个")
                             for (element in elementList) {
                                 if (element.code == DataCodeEnum.OMDB_LINK_NAME.code) {
                                     hisRoadName = true
@@ -824,7 +820,10 @@ class MainViewModel @Inject constructor(
                                     newLineString,
                                     element
                                 )
-//                                Log.e("jingo", "捕捉到的数据code ${element.code}")
+                                Log.e(
+                                    "jingo",
+                                    "捕捉到的数据code ${DataCodeEnum.findTableNameByCode(element.code)}"
+                                )
                                 when (element.code) {
                                     DataCodeEnum.OMDB_MULTI_DIGITIZED.code,//上下线分离
                                     DataCodeEnum.OMDB_CON_ACCESS.code,//全封闭
@@ -887,10 +886,10 @@ class MainViewModel @Inject constructor(
 
                             }
 
-                            val realm = realmOperateHelper.getSelectTaskRealmInstance()
+//                            val realm = realmOperateHelper.getSelectTaskRealmInstance()
 
                             val entityList = realmOperateHelper.getSelectTaskRealmTools(
-                                RenderEntity::class.java, true
+                                realm, RenderEntity::class.java, true
                             ).and().equalTo("table", DataCodeEnum.OMDB_RESTRICTION.name).and()
                                 .equalTo(
                                     "properties['linkIn']", it
@@ -901,7 +900,7 @@ class MainViewModel @Inject constructor(
                                     val outLink = outList[i].properties["linkOut"]
                                     val linkOutEntity =
                                         realmOperateHelper.getSelectTaskRealmTools(
-                                            RenderEntity::class.java,
+                                            realm, RenderEntity::class.java,
                                             true
                                         )
                                             .equalTo("table", DataCodeEnum.OMDB_RD_LINK_KIND.name)
@@ -919,8 +918,8 @@ class MainViewModel @Inject constructor(
                                 mapController.lineHandler.linksLayer.addLine(
                                     link.geometry, Color.BLUE
                                 )
-                                realm.close()
                             }
+
                         }
 
                         liveDataTopSignList.postValue(topSignList.distinctBy { it.name }
@@ -941,6 +940,7 @@ class MainViewModel @Inject constructor(
                 if (!hisRoadName) {
                     liveDataRoadName.postValue(null)
                 }
+                realm.close()
             }
         } catch (e: Exception) {
 
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt
index c084c50a..260884fb 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt
@@ -218,7 +218,7 @@ class EvaluationResultViewModel @Inject constructor(
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             liveDataQsRecordBean.value?.let {
-
+                val realm = realmOperateHelper.getSelectTaskRealmInstance()
                 val taskLink =
                     realmOperateHelper.captureTaskLink(point)
                 if (taskLink != null) {
@@ -226,7 +226,7 @@ class EvaluationResultViewModel @Inject constructor(
                     mapController.lineHandler.showLine(taskLink.geometry)
                     return
                 } else {
-                    val linkList = realmOperateHelper.queryLink(point = point)
+                    val linkList = realmOperateHelper.queryLink(realm,point = point)
                     if (linkList.isNotEmpty()) {
                         it.linkId = linkList[0].properties[LinkTable.linkPid] ?: ""
                         mapController.lineHandler.showLine(linkList[0].geometry)
@@ -235,6 +235,7 @@ class EvaluationResultViewModel @Inject constructor(
                 }
                 it.linkId = ""
                 mapController.lineHandler.removeLine()
+                realm.close()
             }
         }
     }
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterViewModel.kt
index 25138031..1c8c0a26 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterViewModel.kt
@@ -275,7 +275,7 @@ class PersonalCenterViewModel @Inject constructor(
                     liveDataMessage.postValue("元数据表导入成功")
                     roomAppDatabase.getScRootCauseAnalysisDao().insertOrUpdateList(list2)
                 }
-                if(list3.isNotEmpty()){
+                if (list3.isNotEmpty()) {
                     liveDataMessage.postValue("标牌对照表导入成功")
                     roomAppDatabase.getScWarningCodeDao().insertList(list3)
                 }
@@ -295,7 +295,9 @@ class PersonalCenterViewModel @Inject constructor(
     fun readRealmData() {
         viewModelScope.launch(Dispatchers.IO) {
 //            val result = realmOperateHelper.queryLink(GeometryTools.createPoint(115.685817,28.62759))
-            val result = realmOperateHelper.queryLinkByLinkPid("84206617008217069")
+            val realm = realmOperateHelper.getSelectTaskRealmInstance()
+            val result = realmOperateHelper.queryLinkByLinkPid(realm, "84206617008217069")
+            realm.close()
             Log.d("xiaoyan", result.toString())
         }
     }
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt
index 08a0ddb7..34bf24f0 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt
@@ -76,6 +76,11 @@ class TaskFragment : BaseFragment() {
             binding.taskAddLink.isSelected = it
         }
 
+        viewModel.liveDataAddLinkDialog.observe(viewLifecycleOwner){
+            viewModel.addTaskLink(requireContext(),it)
+        }
+
+
         //注意:使用滑动菜单不能开启滑动删除,否则只有滑动删除没有滑动菜单
         val mSwipeMenuCreator = SwipeMenuCreator { _, rightMenu, _ ->
             //添加菜单自动添加至尾部
@@ -110,6 +115,7 @@ class TaskFragment : BaseFragment() {
         viewModel.liveDataTaskLinks.observe(viewLifecycleOwner) {
             adapter.resetSelect()
             adapter.refreshData(it)
+//            adapter.setSelectTag(it.last().linkPid)
         }
         viewModel.getTaskList(requireContext())
         binding.taskSearch.addTextChangedListener(object : TextWatcher {
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt
index fc2024b3..5a8e1e91 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt
@@ -128,21 +128,29 @@ class TaskListAdapter(
         holder.addObserver(object : OnLifecycleStateListener {
             override fun onState(tag: String, state: Lifecycle.State) {
                 when (state) {
-                    Lifecycle.State.STARTED ->
+                    Lifecycle.State.STARTED -> {
+                        uploadManager.observer(
+                            taskBean.id,
+                            holder,
+                            UploadObserver(taskBean.id, binding)
+                        )
                         downloadManager.observer(
                             taskBean.id,
                             holder,
                             DownloadObserver(taskBean.id, holder)
                         )
-                    Lifecycle.State.DESTROYED ->
+                    }
+                    Lifecycle.State.DESTROYED -> {
                         downloadManager.removeObserver(tag.toInt())
+                        uploadManager.removeObserver(tag.toInt())
+                    }
                     else -> {}
                 }
             }
         })
         downloadManager.addTask(taskBean)
         uploadManager.addTask(taskBean)
-        uploadManager.observer(taskBean.id, holder, UploadObserver(taskBean.id, binding))
+//        uploadManager.observer(taskBean.id, holder, UploadObserver(taskBean.id, binding))
         if (taskBean.status == FileDownloadStatus.NONE) {
             binding.taskDownloadBtn.setBackgroundColor(Color.WHITE)
             binding.taskDownloadBtn.setTextColor(Color.parseColor("#888FB3"))
@@ -187,7 +195,6 @@ class TaskListAdapter(
             }
         }
 
-
     }
 
 
@@ -226,8 +233,8 @@ class TaskListAdapter(
                 binding.taskUploadBtn.stopAnimator()
                 binding.taskUploadBtn.setText("重新同步")
                 binding.taskUploadBtn.setProgress(100)
-                if(!TextUtils.isEmpty(taskBean.errMsg)){
-                    Toast.makeText(binding.root.context,taskBean.errMsg,Toast.LENGTH_LONG).show()
+                if (!TextUtils.isEmpty(taskBean.errMsg)) {
+                    Toast.makeText(binding.root.context, taskBean.errMsg, Toast.LENGTH_LONG).show()
                 }
             }
 
@@ -357,7 +364,7 @@ class TaskListAdapter(
         refreshData(list)
     }
 
-    fun getSelectTaskPosition():Int{
+    fun getSelectTaskPosition(): Int {
         return selectPosition
     }
 
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
index 5b30d286..b019f26f 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
@@ -88,7 +88,12 @@ class TaskViewModel @Inject constructor(
     /**
      * 是否开启了道路选择
      */
-    var liveDataSelectNewLink = MutableLiveData(false)
+    val liveDataSelectNewLink = MutableLiveData(false)
+
+    /**
+     * 选中link
+     */
+    val liveDataAddLinkDialog = MutableLiveData<RenderEntity>()
 
     init {
         sharedPreferences.registerOnSharedPreferenceChangeListener(this)
@@ -98,10 +103,11 @@ class TaskViewModel @Inject constructor(
                 if (tag == TAG) {
                     if (liveDataSelectNewLink.value == true) {
                         viewModelScope.launch(Dispatchers.Default) {
+                            val realm = realmOperateHelper.getSelectTaskRealmInstance()
                             if (currentSelectTaskBean == null) {
                                 liveDataToastMessage.postValue("还没有开启任何任务")
                             } else {
-                                val links = realmOperateHelper.queryLink(
+                                val links = realmOperateHelper.queryLink(realm,
                                     point = point,
                                 )
                                 if (links.isNotEmpty()) {
@@ -111,43 +117,15 @@ class TaskViewModel @Inject constructor(
                                             return@launch
                                         }
                                     }
-                                    val hadLinkDvoBean = HadLinkDvoBean(
-                                        taskId = currentSelectTaskBean!!.id,
-                                        linkPid = l.properties["linkPid"]!!,
-                                        geometry = l.geometry,
-                                        linkStatus = 2
-                                    )
-                                    currentSelectTaskBean!!.hadLinkDvoList.add(
-                                        hadLinkDvoBean
-                                    )
-                                    val realm = Realm.getDefaultInstance()
-                                    realm.executeTransaction { r ->
-                                        r.copyToRealmOrUpdate(hadLinkDvoBean)
-                                        r.copyToRealmOrUpdate(currentSelectTaskBean!!)
-                                    }
-                                    //根据Link数据查询对应数据上要素,对要素进行显示重置
-                                    l.properties["linkPid"]?.let {
-                                        realmOperateHelper.queryLinkToMutableRenderEntityList(it)
-                                            ?.forEach { renderEntity ->
-                                                if (renderEntity.enable != 1) {
-                                                    renderEntity.enable = 1
-                                                    realm.executeTransaction { r ->
-                                                        r.copyToRealmOrUpdate(renderEntity)
-                                                    }
-                                                }
-                                            }
-                                    }
-                                    liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList)
-                                    mapController.lineHandler.addTaskLink(hadLinkDvoBean)
-                                    mapController.layerManagerHandler.updateOMDBVectorTileLayer()
-                                    mapController.mMapView.vtmMap.updateMap(true)
-                                    realm.close()
+                                    liveDataAddLinkDialog.postValue(l)
                                 }
                             }
+                            realm.close()
                         }
                     } else {
                         viewModelScope.launch(Dispatchers.IO) {
-                            val links = realmOperateHelper.queryLink(
+                            val realm = realmOperateHelper.getSelectTaskRealmInstance()
+                            val links = realmOperateHelper.queryLink(realm,
                                 point = point,
                             )
                             if (links.isNotEmpty()) {
@@ -160,6 +138,7 @@ class TaskViewModel @Inject constructor(
                                     }
                                 }
                             }
+                            realm.close()
                         }
                     }
                 }
@@ -282,7 +261,7 @@ class TaskViewModel @Inject constructor(
      * 设置当前选择的任务,并高亮当前任务的所有link
      */
 
-    fun setSelectTaskBean( taskBean: TaskBean) {
+    fun setSelectTaskBean(taskBean: TaskBean) {
 
         sharedPreferences.edit().putInt(Constant.SELECT_TASK_ID, taskBean.id).apply()
 
@@ -291,15 +270,17 @@ class TaskViewModel @Inject constructor(
         liveDataTaskLinks.value = taskBean.hadLinkDvoList
         showTaskLinks(taskBean)
         MapParamUtils.setTaskId(taskBean.id)
-        Constant.currentSelectTaskFolder =  File(Constant.USER_DATA_PATH +"/${taskBean.id}")
-        Constant.currentSelectTaskConfig = RealmConfiguration.Builder().directory(Constant.currentSelectTaskFolder).name("OMQS.realm").encryptionKey(Constant.PASSWORD).allowQueriesOnUiThread(true).schemaVersion(2).build()
+        Constant.currentSelectTaskFolder = File(Constant.USER_DATA_PATH + "/${taskBean.id}")
+        Constant.currentSelectTaskConfig =
+            RealmConfiguration.Builder().directory(Constant.currentSelectTaskFolder)
+                .name("OMQS.realm").encryptionKey(Constant.PASSWORD).allowQueriesOnUiThread(true)
+                .schemaVersion(2).build()
         MapParamUtils.setTaskConfig(Constant.currentSelectTaskConfig)
         mapController.layerManagerHandler.updateOMDBVectorTileLayer()
         mapController.mMapView.updateMap(true)
     }
 
 
-
     private fun showTaskLinks(taskBean: TaskBean) {
 
         mapController.lineHandler.removeAllTaskLine()
@@ -494,17 +475,17 @@ class TaskViewModel @Inject constructor(
                     realm.where(QsRecordBean::class.java).equalTo("linkId", hadLinkDvoBean.linkPid)
                         .and().equalTo("taskId", hadLinkDvoBean.taskId).findAll()
                 if (objects.isEmpty() && hadLinkDvoBean.reason.isEmpty()) {
-                    if(hadLinkDvoBean.linkStatus==3){
+                    if (hadLinkDvoBean.linkStatus == 3) {
                         result = 1
                         realm.close()
                         return@forEach
-                    }else{
+                    } else {
                         result = 2
                     }
                 }
             }
             realm.close()
-            if(result==1){
+            if (result == 1) {
                 liveDataTaskUpload.postValue(map)
                 withContext(Dispatchers.Main) {
                     val mDialog = FirstDialog(context)
@@ -518,7 +499,7 @@ class TaskViewModel @Inject constructor(
                     mDialog.setCancelVisibility(View.GONE)
                     mDialog.show()
                 }
-            }else if(result==2){
+            } else if (result == 2) {
                 liveDataTaskUpload.postValue(map)
                 withContext(Dispatchers.Main) {
                     val mDialog = FirstDialog(context)
@@ -536,7 +517,7 @@ class TaskViewModel @Inject constructor(
                     ) { _, _ -> mDialog.dismiss() }
                     mDialog.show()
                 }
-            }else{
+            } else {
                 map[taskBean] = true
                 liveDataTaskUpload.postValue(map)
             }
@@ -559,69 +540,62 @@ class TaskViewModel @Inject constructor(
      */
     fun setSelectLink(selected: Boolean) {
         liveDataSelectNewLink.value = selected
-//        //开始捕捉
-//        if (selected) {
-//            mapController.mMapView.addOnNIMapClickListener(TAG, object : OnGeoPointClickListener {
-//                override fun onMapClick(tag: String, point: GeoPoint) {
-//                    if (tag == TAG) {
-//                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-//                            viewModelScope.launch(Dispatchers.Default) {
-//                                if (currentSelectTaskBean == null) {
-//                                    liveDataToastMessage.postValue("还没有开启任何任务")
-//                                } else {
-//                                    val links = realmOperateHelper.queryLink(
-//                                        point = point,
-//                                    )
-//                                    if (links.isNotEmpty()) {
-//                                        val l = links[0]
-//                                        for (link in currentSelectTaskBean!!.hadLinkDvoList) {
-//                                            if (link.linkPid == l.properties["linkPid"]) {
-//                                                return@launch
-//                                            }
-//                                        }
-//                                        val hadLinkDvoBean = HadLinkDvoBean(
-//                                            taskId = currentSelectTaskBean!!.id,
-//                                            linkPid = l.properties["linkPid"]!!,
-//                                            geometry = l.geometry,
-//                                            linkStatus = 2
-//                                        )
-//                                        currentSelectTaskBean!!.hadLinkDvoList.add(
-//                                            hadLinkDvoBean
-//                                        )
-//                                        val realm = Realm.getDefaultInstance()
-//                                        realm.executeTransaction { r ->
-//                                            r.copyToRealmOrUpdate(hadLinkDvoBean)
-//                                            r.copyToRealmOrUpdate(currentSelectTaskBean!!)
-//                                        }
-//                                        //根据Link数据查询对应数据上要素,对要素进行显示重置
-//                                        l.properties["linkPid"]?.let {
-//                                            realmOperateHelper.queryLinkToMutableRenderEntityList(it)
-//                                                ?.forEach { renderEntity ->
-//                                                    if (renderEntity.enable != 1) {
-//                                                        renderEntity.enable = 1
-//                                                        realm.executeTransaction { r ->
-//                                                            r.copyToRealmOrUpdate(renderEntity)
-//                                                        }
-//                                                    }
-//                                                }
-//                                        }
-//                                        liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList)
-//                                        mapController.lineHandler.addTaskLink(hadLinkDvoBean)
-//                                        mapController.layerManagerHandler.updateOMDBVectorTileLayer()
-//                                        mapController.mMapView.vtmMap.updateMap(true)
-//                                    }
-//                                }
-//                            }
-//                        }
-//                    }
-//                }
-//            })
-//        } else {
-//            mapController.mMapView.removeOnNIMapClickListener(TAG)
-//            mapController.lineHandler.removeLine()
-//        }
     }
 
+    /**
+     * 添加link
+     */
+    fun addTaskLink(context: Context, data: RenderEntity) {
+        val mDialog = FirstDialog(context)
+        mDialog.setTitle("提示")
+        mDialog.setMessage("是否添加当前link")
+        mDialog.setPositiveButton(
+            "确定"
+        ) { dialog, _ ->
+            dialog.dismiss()
+            viewModelScope.launch(Dispatchers.IO) {
+                val hadLinkDvoBean = HadLinkDvoBean(
+                    taskId = currentSelectTaskBean!!.id,
+                    linkPid = data.properties["linkPid"]!!,
+                    geometry = data.geometry,
+                    linkStatus = 2
+                )
+                currentSelectTaskBean!!.hadLinkDvoList.add(
+                    hadLinkDvoBean
+                )
+                val realm = Realm.getDefaultInstance()
+                realm.executeTransaction { r ->
+                    r.copyToRealmOrUpdate(hadLinkDvoBean)
+                    r.copyToRealmOrUpdate(currentSelectTaskBean!!)
+                }
+                //根据Link数据查询对应数据上要素,对要素进行显示重置
+                data.properties["linkPid"]?.let {
+                    realmOperateHelper.queryLinkToMutableRenderEntityList(realm,it)
+                        ?.forEach { renderEntity ->
+                            if (renderEntity.enable != 1) {
+                                renderEntity.enable = 1
+                                realm.executeTransaction { r ->
+                                    r.copyToRealmOrUpdate(renderEntity)
+                                }
+                            }
+                        }
+                }
+                liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList)
+                mapController.lineHandler.addTaskLink(hadLinkDvoBean)
+                mapController.layerManagerHandler.updateOMDBVectorTileLayer()
+                mapController.mMapView.vtmMap.updateMap(true)
+                realm.close()
+            }
+        }
+        mDialog.setNegativeButton(
+            "取消"
+        ) { _, _ ->
+            mDialog.dismiss()
+        }
+        mDialog.show()
+    }
+
+
     /**
      * 删除评测link
      */
@@ -651,7 +625,7 @@ class TaskViewModel @Inject constructor(
 
                     //重置数据为隐藏
                     if (hadLinkDvoBean.linkStatus == 2) {
-                        realmOperateHelper.queryLinkToMutableRenderEntityList(hadLinkDvoBean.linkPid)
+                        realmOperateHelper.queryLinkToMutableRenderEntityList(realm,hadLinkDvoBean.linkPid)
                             ?.forEach { renderEntity ->
                                 if (renderEntity.enable == 1) {
                                     renderEntity.enable = 0
diff --git a/app/src/main/java/com/navinfo/omqs/util/SignUtil.kt b/app/src/main/java/com/navinfo/omqs/util/SignUtil.kt
index 1aefbd52..4d45c49b 100644
--- a/app/src/main/java/com/navinfo/omqs/util/SignUtil.kt
+++ b/app/src/main/java/com/navinfo/omqs/util/SignUtil.kt
@@ -707,6 +707,28 @@ class SignUtil {
                         )
                     )
                 }
+                DataCodeEnum.OMDB_FILL_AREA.code->{
+                    list.add(
+                        TwoItemAdapterItem(
+                            title = "对象号码",
+                            text = "${data.properties["objectPid"]}"
+                        )
+                    )
+                    list.add(
+                        TwoItemAdapterItem(
+                            title = "符合高精", text = when (data.properties["compliant"]) {
+                                "0" -> "否"
+                                "1" -> "是"
+                                else -> ""
+                            }
+                        )
+                    )
+                    list.add(
+                        TwoItemAdapterItem(
+                            title = "关联车道组", text = "${data.properties["lgList"]}"
+                        )
+                    )
+                }
             }
             adapter.data = list
             return adapter