From 1d3dcb1a2aee49125fc21848d229b58715c348fe Mon Sep 17 00:00:00 2001 From: xiaoyan <xiaoyan159@163.com> Date: Mon, 22 May 2023 10:16:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=A2=84=E5=A4=84=E7=90=86=E7=8E=AF=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 3 + app/src/main/assets/omdb.config | 44 ---------- app/src/main/assets/omdb_config.json | 88 +++++++++++++++++++ .../main/java/com/navinfo/omqs/Constant.kt | 4 +- .../com/navinfo/omqs/bean/ImportConfig.kt | 68 +++++++++++++- .../com/navinfo/omqs/db/ImportOMDBHelper.kt | 24 ++--- .../com/navinfo/omqs/db/ImportPreProcess.kt | 14 +++ .../java/com/navinfo/omqs/rule/LeftPanel.kt | 5 ++ .../omqs/ui/activity/map/MainViewModel.kt | 7 +- .../LayerManagerExpandableListAdapter.kt | 10 +-- .../main/res/menu/personal_center_menu.xml | 1 - .../src/main/assets/editormarker.xml | 4 +- 12 files changed, 205 insertions(+), 67 deletions(-) delete mode 100644 app/src/main/assets/omdb.config create mode 100644 app/src/main/assets/omdb_config.json create mode 100644 app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt create mode 100644 app/src/main/java/com/navinfo/omqs/rule/LeftPanel.kt diff --git a/app/build.gradle b/app/build.gradle index 76d8b80b..9c3cc744 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -106,6 +106,9 @@ dependencies { implementation 'com.github.sevar83:android-spatialite:2.0.1' //fragment 传递数据 implementation "androidx.navigation:navigation-ui-ktx:2.5.3" + //kotlin反射 + implementation "org.jetbrains.kotlin:kotlin-stdlib:1.7.0" + implementation "org.jetbrains.kotlin:kotlin-reflect:1.7.0" } //允许引用生成的代码 kapt { diff --git a/app/src/main/assets/omdb.config b/app/src/main/assets/omdb.config deleted file mode 100644 index 70d64cd9..00000000 --- a/app/src/main/assets/omdb.config +++ /dev/null @@ -1,44 +0,0 @@ -{ - "tables" : [ - { - "table": "OMDB_RD_LINK", - "code": 2001, - "name": "道路线" - }, - { - "table": "OMDB_RD_LINK_KIND", - "code": 2008, - "name": "道路种别" - }, - { - "table": "OMDB_LINK_DIRECT", - "code": 2010, - "name": "道路方向" - }, - { - "table": "OMDB_SPEEDLIMIT", - "code": 4002, - "name": "常规点限速" - }, - { - "table": "OMDB_SPEEDLIMIT_COND", - "code": 4003, - "name": "条件点限速" - }, - { - "table": "OMDB_SPEEDLIMIT_VAR", - "code": 4004, - "name": "可变点限速" - }, - { - "table": "OMDB_LANE_LINK_LG", - "code": 5001, - "name": "车道中心线" - }, - { - "table": "OMDB_LANE_NUM", - "code": 2041, - "name": "车道数" - } - ] -} \ No newline at end of file diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json new file mode 100644 index 00000000..411acf54 --- /dev/null +++ b/app/src/main/assets/omdb_config.json @@ -0,0 +1,88 @@ +{ + "tableMap" : { + "2001": { + "table": "OMDB_RD_LINK", + "code": 2001, + "name": "道路线" + }, + "2008": { + "table": "OMDB_RD_LINK_KIND", + "code": 2008, + "name": "道路种别" + }, + "2010": { + "table": "OMDB_LINK_DIRECT", + "code": 2010, + "name": "道路方向" + }, + "4002": { + "table": "OMDB_SPEEDLIMIT", + "code": 4002, + "name": "常规点限速", + "transformer": [ + { + "k": "maxSpeed", + "v": "0", + "klib": "maxSpeed", + "vlib": "限" + } + ] + }, + "4003":{ + "table": "OMDB_SPEEDLIMIT_COND", + "code": 4003, + "name": "条件点限速", + "transformer": [ + { + "k": "maxSpeed", + "v": "0|", + "klib": "maxSpeed", + "vlib": "限" + } + ] + }, + "4004":{ + "table": "OMDB_SPEEDLIMIT_VAR", + "code": 4004, + "name": "可变点限速", + "transformer": [ + { + "k": "location", + "v": "1", + "klib": "location", + "vlib": "左" + }, + { + "k": "location", + "v": "2", + "klib": "locationlib", + "vlib": "右" + }, + { + "k": "location", + "v": "3", + "klib": "location", + "vlib": "上" + } + ] + }, + "5001":{ + "table": "OMDB_LANE_LINK_LG", + "code": 5001, + "name": "车道中心线" + }, + "2041":{ + "table": "OMDB_LANE_NUM", + "code": 2041, + "name": "车道数", + "transformer": [ + { + "k": "laneS2e", + "v": "~", + "klib": "left_00", + "vlib": "laneNumLeft00()" + } + ] + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index b42d0537..da0dca8c 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -1,7 +1,5 @@ package com.navinfo.omqs -import io.realm.Realm - class Constant { companion object { /** @@ -76,7 +74,7 @@ class Constant { //选择拍照或者录像 const val SELECT_TAKEPHOTO_OR_RECORD = "select_takephoto_or_record" - const val OMDB_CONFIG = "omdb.config" + const val OMDB_CONFIG = "omdb_config.json" const val OTHER_CONFIG = "other.config" val OMDB_LAYER_VISIBLE_LIST: MutableList<String> = mutableListOf() // 记录OMDB数据显示的图层名称列表 diff --git a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt index c3273281..ed5ba35a 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt @@ -1,10 +1,68 @@ package com.navinfo.omqs.bean +import com.navinfo.collect.library.data.entity.RenderEntity +import com.navinfo.omqs.db.ImportPreProcess +import kotlin.reflect.full.declaredMemberFunctions + class ImportConfig { - var tables: MutableList<TableInfo> = mutableListOf() + var tableMap: MutableMap<String, TableInfo> = mutableMapOf() val tableGroupName: String = "OMDB数据" var checked : Boolean = true + val preProcess: ImportPreProcess = ImportPreProcess() + + fun transformProperties(renderEntity: RenderEntity): RenderEntity { + val transformList = tableMap[renderEntity.code.toString()]?.transformer + if (transformList.isNullOrEmpty()) { + return renderEntity + } + for (transform in transformList) { + // 开始执行转换 + val key:String = transform.k + val value = transform.v + val keylib = transform.klib + val valuelib = transform.vlib + // 如果key是以_开头的,则预处理时忽略 + if (key.startsWith("_")) { + continue + } + // 如果key和value都为空,说明当前数据需要增加一个新字段 + if (key.isNullOrEmpty()&&value.isNullOrEmpty()&&!renderEntity.properties.containsKey(keylib)) { + renderEntity.properties[keylib] = valuelib + } + // 开始解析key和value,并对数据进行匹配 + m@ for (k in processKeyOrValue(key)) { + for (v in processKeyOrValue(value)) { + if ("~" == v &&renderEntity.properties.containsKey(k)) { // ~符可以匹配任意元素 + if (valuelib.endsWith("()")) { // 以()结尾,说明该value配置是一个function,需要通过反射调用指定方法 + val method = preProcess::class.declaredMemberFunctions.first { it.name == valuelib.replace("()", "") } + method.call(preProcess, renderEntity) + } else { + renderEntity.properties[keylib] = valuelib + } + break@m + } else if (renderEntity.properties[k] == v) { + if (valuelib.endsWith("()")) { // 以()结尾,说明该value配置是一个function,需要通过反射调用指定方法 + val method = preProcess::class.declaredMemberFunctions.first { it.name == valuelib.replace("()", "") } + method.call(preProcess, renderEntity) + } else { + renderEntity.properties[keylib] = valuelib + } + break@m + } + } + } + } + return renderEntity + } + + /** + * 处理配置的key + */ + private fun processKeyOrValue(key: String): List<String> { + val keys = key.split("|").filter { it.isNotBlank() } + return keys + } } class TableInfo { @@ -12,4 +70,12 @@ class TableInfo { val code: Int = 0 val name: String = "" var checked : Boolean = true + var transformer: MutableList<Transform> = mutableListOf() +} + +class Transform { + var k: String = "" + var v: String = "" + var klib: String = "" + var vlib: String = "" } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt index d7151419..ae976c3c 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -2,7 +2,9 @@ package com.navinfo.omqs.db import android.content.Context import android.database.Cursor.* +import android.os.Build import android.util.Log +import androidx.annotation.RequiresApi import androidx.core.database.getBlobOrNull import androidx.core.database.getFloatOrNull import androidx.core.database.getIntOrNull @@ -14,6 +16,7 @@ import com.google.gson.reflect.TypeToken import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.omqs.Constant import com.navinfo.omqs.bean.ImportConfig +import com.navinfo.omqs.bean.Transform import com.navinfo.omqs.hilt.ImportOMDBHiltFactory import com.navinfo.omqs.hilt.OMDBDataBaseHiltFactory import dagger.assisted.Assisted @@ -50,6 +53,10 @@ class ImportOMDBHelper @AssistedInject constructor( private val configFile: File = File("${Constant.USER_DATA_PATH}", Constant.OMDB_CONFIG) + private val importConfig by lazy { + openConfigFile() + } + /** * 读取config的配置文件 * */ @@ -61,6 +68,7 @@ class ImportOMDBHelper @AssistedInject constructor( /** * 读取指定数据表的数据集 * */ + @RequiresApi(Build.VERSION_CODES.N) suspend fun getOMDBTableData(table: String): Flow<List<Map<String, Any>>> = withContext(Dispatchers.IO) { val listResult: MutableList<Map<String, Any>> = mutableListOf() @@ -120,7 +128,6 @@ class ImportOMDBHelper @AssistedInject constructor( * @param configFile 对应的配置文件 * */ suspend fun importOmdbZipFile(omdbZipFile: File): Flow<String> = withContext(Dispatchers.IO) { - val importConfig = openConfigFile() val unZipFolder = File(omdbZipFile.parentFile, "result") flow { if (unZipFolder.exists()) { @@ -133,7 +140,8 @@ class ImportOMDBHelper @AssistedInject constructor( try { Realm.getDefaultInstance().beginTransaction() // 遍历解压后的文件,读取该数据返回 - for ((index, currentConfig) in importConfig.tables.withIndex()) { + for ((index, currentEntry) in importConfig.tableMap.entries.withIndex()) { + val currentConfig = currentEntry.value val txtFile = unZipFiles.find { it.name == currentConfig.table } @@ -150,7 +158,7 @@ class ImportOMDBHelper @AssistedInject constructor( .toMutableMap() map["qi_table"] = currentConfig.table map["qi_name"] = currentConfig.name - map["qi_code"] = currentConfig.code + map["qi_code"] = if (currentConfig.code == 0) currentConfig.code else currentEntry.key listResult.add(map) } } @@ -172,10 +180,12 @@ class ImportOMDBHelper @AssistedInject constructor( else -> renderEntity.properties.put(key, value.toString()) } } + // 对renderEntity做预处理后再保存 + importConfig.transformProperties(renderEntity) Realm.getDefaultInstance().copyToRealm(renderEntity) } // 1个文件发送一次flow流 - emit("${index + 1}/${importConfig.tables.size}") + emit("${index + 1}/${importConfig.tableMap.size}") } Realm.getDefaultInstance().commitTransaction() } catch (e: Exception) { @@ -217,10 +227,4 @@ class ImportOMDBHelper @AssistedInject constructor( cursor.close() return columns } - - /** - * 预处理渲染要素,某些要素需要对数据做二次处理 - * */ - fun performRenderEntity(renderEntity: RenderEntity) { - } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt new file mode 100644 index 00000000..ba4a91d7 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -0,0 +1,14 @@ +package com.navinfo.omqs.db + +import com.navinfo.collect.library.data.entity.RenderEntity + +class ImportPreProcess { + /** + * 预处理所需要的函数 + * */ + fun foo(renderEntity: RenderEntity): RenderEntity { + println("foo") + renderEntity.properties["foo"] = "bar" + return renderEntity + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/rule/LeftPanel.kt b/app/src/main/java/com/navinfo/omqs/rule/LeftPanel.kt new file mode 100644 index 00000000..e4214c05 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/rule/LeftPanel.kt @@ -0,0 +1,5 @@ +package com.navinfo.omqs.rule + +class LeftPanel { + +} \ No newline at end of file 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 63df1784..f919651d 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 @@ -373,9 +373,12 @@ class MainViewModel @Inject constructor( if (layerConfigList != null && !layerConfigList.isEmpty()) { val omdbVisibleList = layerConfigList.filter { importConfig -> importConfig.tableGroupName == "OMDB数据" - }.first().tables.filter { tableInfo -> + }.first().tableMap.filter { + entry -> + val tableInfo = entry.value !tableInfo.checked - }.map { tableInfo -> + }.map { entry -> + val tableInfo = entry.value tableInfo.table }.toList() com.navinfo.collect.library.system.Constant.HAD_LAYER_INVISIABLE_ARRAY = diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerExpandableListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerExpandableListAdapter.kt index 9e6c267a..3d71ca39 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerExpandableListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerExpandableListAdapter.kt @@ -17,7 +17,7 @@ class LayerManagerExpandableListAdapter(private val context: Context, val parent } override fun getChildrenCount(groupPosition: Int): Int { - return parentItems[groupPosition].tables.size + return parentItems[groupPosition].tableMap.size } @@ -25,8 +25,8 @@ class LayerManagerExpandableListAdapter(private val context: Context, val parent return parentItems[groupPosition] } - override fun getChild(groupPosition: Int, childPosition: Int): Any { - return parentItems[groupPosition].tables[childPosition] + override fun getChild(groupPosition: Int, childPosition: Int): TableInfo? { + return parentItems[groupPosition].tableMap[parentItems[groupPosition].tableMap.keys.elementAt(childPosition)] } override fun getGroupId(groupPosition: Int): Long = groupPosition.toLong() @@ -58,7 +58,7 @@ class LayerManagerExpandableListAdapter(private val context: Context, val parent viewHolder.parentCheckBox.isChecked = parentItem.checked viewHolder.parentCheckBox.setOnClickListener { parentItem.checked = !parentItem.checked - parentItem.tables.forEach { it.checked = parentItem.checked } + parentItem.tableMap.forEach { it.value.checked = parentItem.checked } notifyDataSetChanged() } if (isExpanded) { @@ -93,7 +93,7 @@ class LayerManagerExpandableListAdapter(private val context: Context, val parent viewHolder.childCheckBox.isChecked = childItem.checked viewHolder.childCheckBox.setOnClickListener { childItem.checked = !childItem.checked - parentItems[groupPosition].checked = parentItems[groupPosition].tables.all { it.checked } + parentItems[groupPosition].checked = parentItems[groupPosition].tableMap.all { it.value.checked } notifyDataSetChanged() } diff --git a/app/src/main/res/menu/personal_center_menu.xml b/app/src/main/res/menu/personal_center_menu.xml index bfbf7214..5e94c85c 100644 --- a/app/src/main/res/menu/personal_center_menu.xml +++ b/app/src/main/res/menu/personal_center_menu.xml @@ -18,7 +18,6 @@ <item android:id="@+id/personal_center_menu_import_data" android:icon="@drawable/ic_baseline_import_export_24" - android:visible="false" android:title="导入数据" /> <item android:id="@+id/personal_center_menu_import_yuan_data" diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index b08c869b..065193c8 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1859,9 +1859,11 @@ <m v="OMDB_LINK_DIRECT"> <m k="direct"> <m v="2"> - <lineSymbol src="assets:omdb/oneway_right.svg"></lineSymbol> +<!-- <lineSymbol src="assets:omdb/oneway_right.svg"></lineSymbol>--> + <symbol src="assets:omdb/oneway_right.svg" repeat-start="99.9" repeat="false" ></symbol> </m> <m v="3"> +<!-- <lineSymbol src="assets:omdb/oneway_left.svg"></lineSymbol>--> <lineSymbol src="assets:omdb/oneway_left.svg"></lineSymbol> </m> </m>