From 0f97c08b44a0d3a7a31fd357b5819b21db926aa3 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Tue, 31 Oct 2023 15:02:21 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E6=95=88=E7=8E=87=EF=BC=8C=E6=9B=B4=E6=8D=A2?= =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 14 +++--- .../com/navinfo/omqs/db/ImportOMDBHelper.kt | 18 +++++--- .../com/navinfo/omqs/db/ImportPreProcess.kt | 41 ++++++++++------- .../omqs/ui/activity/map/MainViewModel.kt | 2 +- .../library/data/entity/RenderEntity.kt | 1 + .../library/map/source/OMDBDataDecoder.java | 12 ++++- .../collect/library/utils/DeflaterUtil.java | 44 +++++++++++++------ 7 files changed, 86 insertions(+), 46 deletions(-) diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index 20ecfd56..7d532f4a 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -150,7 +150,7 @@ "code": 2092, "name": "车道类型", "catch": true, - "isDependOnOtherTable": true, + "isDependOnOtherTable": false, "zoomMin": 18, "zoomMax": 20, "transformer": [ @@ -173,7 +173,7 @@ "name": "桥", "catch": true, "existSubCode": true, - "isDependOnOtherTable": true, + "isDependOnOtherTable": false, "zoomMin": 15, "zoomMax": 20, "transformer": [ @@ -350,7 +350,7 @@ "code": 4001, "name": "路口", "zoomMin": 15, - "isDependOnOtherTable": true, + "isDependOnOtherTable": false, "zoomMax": 17, "catch": true, "transformer": [ @@ -452,7 +452,7 @@ "zoomMin": 15, "zoomMax": 17, "filterData": true, - "isDependOnOtherTable": true, + "isDependOnOtherTable": false, "catch": true, "transformer": [ { @@ -492,7 +492,7 @@ "code": 4009, "name": "警示信息", "catch": true, - "isDependOnOtherTable": true, + "isDependOnOtherTable": false, "zoomMin": 15, "zoomMax": 20, "transformer": [ @@ -581,7 +581,7 @@ "code": 4601, "name": "车信", "catch": true, - "isDependOnOtherTable": true, + "isDependOnOtherTable": false, "zoomMin": 15, "zoomMax": 17, "transformer": [ @@ -610,7 +610,7 @@ "code": 5001, "name": "车道中心线", "catch": false, - "isDependOnOtherTable": true, + "isDependOnOtherTable": false, "checkLinkId": false, "zoomMin": 18, "zoomMax": 20, 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 003ea649..c2c556ab 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -247,11 +247,11 @@ class ImportOMDBHelper @AssistedInject constructor( CMLog.writeLogtoFile(ImportOMDBHelper::class.java.name, "数据安装", "安装结束") + Constant.INSTALL_DATA = false + } catch (e: Exception) { Log.e("jingo", "安装报错1 ${e.message}") return false - }finally { - Constant.INSTALL_DATA = false } return true } @@ -294,12 +294,15 @@ class ImportOMDBHelper @AssistedInject constructor( continue } newTime = System.currentTimeMillis() - Log.e( - "jingo", - "安装数据 ${currentConfig.table} $elementIndex ${listRenderEntity.size} ${newTime - time}" - ) + + if(elementIndex%50==0){ + Log.e("jingo", "安装数据 ${currentConfig.table} $elementIndex ${listRenderEntity.size} ${newTime - time}") + } + time = newTime + elementIndex += 1 + val map = gson.fromJson>( line, object : TypeToken>() {}.type ).toMutableMap() @@ -488,6 +491,8 @@ class ImportOMDBHelper @AssistedInject constructor( // 对renderEntity做预处理后再保存 val resultEntity = importConfig.transformProperties(renderEntity, realm) + + //车道中心线不在主表写入 if (resultEntity != null) { //对code编码需要特殊处理 存在多个属性值时,渲染优先级:SA>PA,存在多个属性值时,渲染优先级:FRONTAGE>MAIN_SIDE_A CCESS @@ -697,6 +702,7 @@ class ImportOMDBHelper @AssistedInject constructor( renderEntity.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(renderEntity.properties)) listRenderEntity.add(renderEntity) + } if (listRenderEntity.size > 20000) { diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index 5ece1286..cb5b22c3 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -242,8 +242,9 @@ class ImportPreProcess { startEndReference.properties["type"] = "s_2_e" val listResult = mutableListOf() startEndReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(startEndReference.properties)) - listResult.add(startEndReference) - insertData(listResult) + renderEntity.referenceEntitys?.add(startEndReference) + //listResult.add(startEndReference) + //insertData(listResult) } /** @@ -292,9 +293,9 @@ class ImportPreProcess { endReference.properties["qi_table"] = renderEntity.table endReference.properties["type"] = "e_2_p" endReference.properties["geometry"] = endReference.geometry - - listResult.add(endReference) - insertData(listResult) + renderEntity.referenceEntitys?.add(endReference) + //listResult.add(endReference) + //insertData(listResult) } } @@ -379,9 +380,10 @@ class ImportPreProcess { } endReference.properties["geometry"] = endReference.geometry endReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(endReference.properties)) - listResult.add(endReference) + renderEntity.referenceEntitys?.add(endReference) + //listResult.add(endReference) Log.e("qj", "generateS2EReferencePoint===4") - insertData(listResult) + //insertData(listResult) } /** @@ -477,9 +479,10 @@ class ImportPreProcess { angleReference.properties["qi_table"] = renderEntity.table angleReference.properties["type"] = "angle" angleReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(angleReference.properties)) - listResult.add(angleReference) + renderEntity.referenceEntitys?.add(angleReference) + //listResult.add(angleReference) } - insertData(listResult) + //insertData(listResult) } fun addAngleFromGeometry(renderEntity: RenderEntity): String { @@ -634,9 +637,10 @@ class ImportPreProcess { "assets:omdb/4601/${type}/1301_${referenceEntity.properties["currentDirect"]}.svg" Log.d("unpackingLaneInfo", referenceEntity.properties["symbol"].toString()) referenceEntity.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(referenceEntity.properties)) - listResult.add(referenceEntity) + renderEntity.referenceEntitys?.add(referenceEntity) + //listResult.add(referenceEntity) } - insertData(listResult) + //insertData(listResult) } } } @@ -744,8 +748,9 @@ class ImportPreProcess { angleReference.enable = renderEntity.enable val listResult = mutableListOf() angleReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(angleReference.properties)) - listResult.add(angleReference) - insertData(listResult) + renderEntity.referenceEntitys?.add(angleReference) + //listResult.add(angleReference) + //insertData(listResult) } @@ -775,9 +780,10 @@ class ImportPreProcess { intersectionReference.properties["qi_table"] = renderEntity.table intersectionReference.properties["type"] = "node" intersectionReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(intersectionReference.properties)) - listResult.add(intersectionReference) + renderEntity.referenceEntitys?.add(intersectionReference) + //listResult.add(intersectionReference) } - insertData(listResult) + //insertData(listResult) } } @@ -944,9 +950,10 @@ class ImportPreProcess { val code = renderEntity.properties[codeName] dynamicSrcReference.properties["src"] = "${prefix}${code}${suffix}" dynamicSrcReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(dynamicSrcReference.properties)) - listResult.add(dynamicSrcReference) + renderEntity.referenceEntitys?.add(dynamicSrcReference) + //listResult.add(dynamicSrcReference) } - insertData(listResult) + //insertData(listResult) } private fun insertData(list: List) { 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 e7b7b478..2454546b 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 @@ -854,7 +854,7 @@ class MainViewModel @Inject constructor( */ private suspend fun captureLink(point: GeoPoint) { - if (captureLinkState) { + if (captureLinkState||Constant.INSTALL_DATA) { return } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt index 75516708..44a5940e 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt @@ -108,6 +108,7 @@ open class RenderEntity() : RealmObject(), Parcelable { @Index var linkPid: String = "" // RenderEntity关联的linkPid集合(可能会关联多个) var linkRelation: LinkRelation? = null + var referenceEntitys: RealmSet? = RealmSet()// constructor(name: String) : this() { this.name = name diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java index 7c0b4d75..95b92fc2 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java @@ -4,10 +4,13 @@ import static org.oscim.core.MercatorProjection.latitudeToY; import static org.oscim.core.MercatorProjection.longitudeToX; import android.os.Build; +import android.util.Log; import androidx.annotation.RequiresApi; import com.navinfo.collect.library.data.entity.RenderEntity; +import com.navinfo.collect.library.enums.DataCodeEnum; +import com.navinfo.collect.library.utils.GeometryTools; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; @@ -103,7 +106,14 @@ public class OMDBDataDecoder extends TileDecoder { processCoordinateArray(multiPoint.getGeometryN(i).getCoordinates(), false); } } else if (geometry instanceof LineString) { - processLineString((LineString) geometry); + //将车道中心进行转化面渲染 + if(layerName!=null&&layerName.equals(DataCodeEnum.OMDB_LANE_LINK_LG.name())){ + Log.e("qj","车道中心线转化开始"); + processPolygon((Polygon) GeometryTools.createGeometry(GeometryTools.computeLine(0.000035,0.000035,geometry.toString()))); + Log.e("qj","车道中心线转化结束"); + }else{ + processLineString((LineString) geometry); + } } else if (geometry instanceof MultiLineString) { MultiLineString multiLineString = (MultiLineString) geometry; for (int i = 0; i < multiLineString.getNumGeometries(); i++) { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/utils/DeflaterUtil.java b/collect-library/src/main/java/com/navinfo/collect/library/utils/DeflaterUtil.java index eebbc008..b5d17cf7 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/utils/DeflaterUtil.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/utils/DeflaterUtil.java @@ -71,25 +71,35 @@ public class DeflaterUtil{ deflater.finish(); - final byte[] bytes = new byte[256]; + final byte[] bytes = new byte[512]; - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(256); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(512); - while (!deflater.finished()) { + try { - //压缩输入数据并用压缩数据填充指定的缓冲区。 + while (!deflater.finished()) { - int length = deflater.deflate(bytes); + //压缩输入数据并用压缩数据填充指定的缓冲区。 - outputStream.write(bytes, 0, length); + int length = deflater.deflate(bytes); + outputStream.write(bytes, 0, length); + + } + + deflater.end(); + + return Base64.encodeBase64String(outputStream.toByteArray()); + + }catch (Exception e){ + return null; + }finally { + try { + outputStream.close(); + }catch (Exception e){ + + } } - - deflater.end(); - - return Base64.encodeBase64String(outputStream.toByteArray()); - - } /** @@ -108,9 +118,9 @@ public class DeflaterUtil{ inflater.setInput(decode); - final byte[] bytes = new byte[256]; + final byte[] bytes = new byte[512]; - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(256); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(512); try { @@ -150,6 +160,12 @@ public class DeflaterUtil{ return null; + }finally { + try { + outputStream.close(); + }catch (Exception e){ + + } } } From 00c37a8996814d4d9a4ef1a0e18b9f684cd18fb9 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Fri, 3 Nov 2023 17:21:22 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AE=89=E8=A3=85?= =?UTF-8?q?=E8=BF=9B=E5=BA=A6=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 4 +- .../com/navinfo/omqs/db/ImportOMDBHelper.kt | 207 ++++++++++++++---- .../com/navinfo/omqs/db/ImportPreProcess.kt | 8 +- .../http/taskdownload/TaskDownloadScope.kt | 60 +++-- .../personalcenter/PersonalCenterViewModel.kt | 30 ++- .../ui/fragment/tasklist/TaskListAdapter.kt | 7 +- 6 files changed, 246 insertions(+), 70 deletions(-) diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index 7d532f4a..46d82ecc 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -452,7 +452,7 @@ "zoomMin": 15, "zoomMax": 17, "filterData": true, - "isDependOnOtherTable": false, + "isDependOnOtherTable": true, "catch": true, "transformer": [ { @@ -609,7 +609,7 @@ "table": "OMDB_LANE_LINK_LG", "code": 5001, "name": "车道中心线", - "catch": false, + "catch": true, "isDependOnOtherTable": false, "checkLinkId": false, "zoomMin": 18, 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 c2c556ab..dbe16498 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -10,7 +10,6 @@ import com.google.gson.reflect.TypeToken import com.navinfo.collect.library.data.entity.* import com.navinfo.collect.library.enums.DataCodeEnum import com.navinfo.collect.library.utils.DeflaterUtil -import com.navinfo.collect.library.utils.StrZipUtil import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant.Companion.currentInstallTaskConfig import com.navinfo.omqs.Constant.Companion.currentInstallTaskFolder @@ -26,19 +25,34 @@ import io.realm.Realm import io.realm.RealmConfiguration import kotlinx.coroutines.* import kotlinx.coroutines.channels.Channel -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.FlowCollector -import kotlinx.coroutines.flow.channelFlow -import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.sync.Mutex -import org.spatialite.database.SQLiteDatabase -import sun.misc.BASE64Encoder +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.channels.trySendBlocking +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.conflate import java.io.BufferedReader import java.io.File import java.io.FileReader import java.util.* import javax.inject.Inject + +//定义一个接口 +sealed interface Event +class OnProgress(val value:Int):Event +class OnError(val t:Throwable):Event +class OnResult(val value:T):Event +object OnComplete:Event + +interface MultiPathsCallback{ + fun onProgress(value: Int) + + fun onResult(value: T) + + fun onError(t:Throwable) + + fun onComplete() +} + /** * 导入omdb数据的帮助类 * */ @@ -150,8 +164,9 @@ class ImportOMDBHelper @AssistedInject constructor( * @param configFile 对应的配置文件 * */ suspend fun importOmdbZipFile( - omdbZipFile: File, task: TaskBean, scope: CoroutineScope - ): Boolean { + omdbZipFile: File, task: TaskBean, scope: CoroutineScope,callback: MultiPathsCallback + ) { + val channel = Channel>(Channel.RENDEZVOUS) installTaskid = task.id.toString() @@ -193,9 +208,11 @@ class ImportOMDBHelper @AssistedInject constructor( mutableMapOf, ImportConfig>() //协程池 val listJob = mutableListOf() + try { CMLog.writeLogtoFile(ImportOMDBHelper::class.java.name, "数据安装", "开始安装数据") Constant.INSTALL_DATA = true + for (importConfig in importConfigList) { for ((index, currentEntry) in importConfig.tableMap.entries.withIndex()) { if (currentEntry.value.isDependOnOtherTable) { @@ -203,14 +220,64 @@ class ImportOMDBHelper @AssistedInject constructor( continue } val job = scope.launch(Dispatchers.IO) { - importData( + startTaskAsFlow( channel, unZipFiles, currentEntry, task, importConfig, - hashMap - ) + hashMap, + true).collect{ + when(it){ + OnComplete->{ + processIndex ++ + callback.onResult("$processIndex|$tableNum") + Log.e("jingo", "安装==$processIndex===$tableNum") + if(tableNum-processIndex==listDependOnEntry.size){ + for ((currentEntry, importConfig) in listDependOnEntry) { + processIndex++ + if(processIndex==tableNum){ + importData( + channel, + unZipFiles, + currentEntry, + task, + importConfig, + hashMap, + false, callback + ) + }else{ + callback.onResult("$processIndex|$tableNum") + importData( + channel, + unZipFiles, + currentEntry, + task, + importConfig, + hashMap, + false, null) + } + } + Log.e("jingo", "安装结束") + + CMLog.writeLogtoFile(ImportOMDBHelper::class.java.name, "数据安装", "安装结束") + + Constant.INSTALL_DATA = false + } + } + is OnProgress->{ + callback.onProgress(it.value) + Log.e("qj","progress==${it.value}") + } + is OnResult<*>->{ + callback.onResult(it.value.toString()) + } + is OnError->{ + callback.onError(it.t) + } + + } + } } listJob.add(job) } @@ -225,36 +292,49 @@ class ImportOMDBHelper @AssistedInject constructor( } realm.close() } - } - listJob.joinAll() channel.close() channelJob.join() - Log.e("jingo", "channel close 等待结束") - for ((currentEntry, importConfig) in listDependOnEntry) { - importData( - channel, - unZipFiles, - currentEntry, - task, - importConfig, - hashMap, - false - ) - } - Log.e("jingo", "安装结束") - - CMLog.writeLogtoFile(ImportOMDBHelper::class.java.name, "数据安装", "安装结束") - - Constant.INSTALL_DATA = false - } catch (e: Exception) { Log.e("jingo", "安装报错1 ${e.message}") - return false + + callback.onError(e) + + Constant.INSTALL_DATA = false } - return true } + private fun startTaskAsFlow( + f: Channel>, + unZipFiles: List, + currentEntry: MutableMap.MutableEntry, + task: TaskBean, + importConfig: ImportConfig, + hashMap: HashMap, + isEmit: Boolean = true) = callbackFlow { + val cancellable= importData(f,unZipFiles,currentEntry,task,importConfig,hashMap,isEmit,object :MultiPathsCallback{ + override fun onProgress(value: Int) { + trySendBlocking(OnProgress(value)) + Log.e("jingo","=====$value") + } + + override fun onError(t: Throwable) { + trySendBlocking(OnError(t)) + } + + override fun onComplete() { + trySendBlocking(OnComplete) + } + + override fun onResult(value: String) { + trySendBlocking(OnResult(value)) + } + }) + + awaitClose { + + } + }.conflate() private suspend fun importData( f: Channel>, @@ -263,15 +343,19 @@ class ImportOMDBHelper @AssistedInject constructor( task: TaskBean, importConfig: ImportConfig, hashMap: HashMap, - isEmit: Boolean = true - ) { + isEmit: Boolean = true, callback: MultiPathsCallback? + ):NonCancellable { val resHashMap: HashMap = HashMap() //define empty hashmap var listRenderEntity = mutableListOf() //单个表要素统计 var elementIndex = 0 val currentConfig = currentEntry.value - CMLog.writeLogtoFile(ImportOMDBHelper::class.java.name, "importOmdbZipFile", "${currentConfig.table}开始") + CMLog.writeLogtoFile( + ImportOMDBHelper::class.java.name, + "importOmdbZipFile", + "${currentConfig.table}开始" + ) try { var realm: Realm? = null @@ -295,8 +379,11 @@ class ImportOMDBHelper @AssistedInject constructor( } newTime = System.currentTimeMillis() - if(elementIndex%50==0){ - Log.e("jingo", "安装数据 ${currentConfig.table} $elementIndex ${listRenderEntity.size} ${newTime - time}") + if (elementIndex % 50 == 0) { + Log.e( + "jingo", + "安装数据 ${currentConfig.table} $elementIndex ${listRenderEntity.size} ${newTime - time}" + ) } time = newTime @@ -539,6 +626,7 @@ class ImportOMDBHelper @AssistedInject constructor( when (renderEntity.properties["bridgeType"]) { "1" -> renderEntity.code = DataCodeEnum.OMDB_BRIDGE_1.code + "2" -> renderEntity.code = DataCodeEnum.OMDB_BRIDGE_2.code // "3" -> renderEntity.code = DataCodeEnum.OMDB_BRIDGE_3.code @@ -682,6 +770,21 @@ class ImportOMDBHelper @AssistedInject constructor( renderEntity.properties.remove("linkPid") } + //去掉暂用控件较大的字段多余属性字段 + if (renderEntity.properties.containsKey("shapeList")) { + renderEntity.properties.remove("shapeList") + } + + //只保留link表相关的pid + if (currentConfig.code != DataCodeEnum.OMDB_RD_LINK.code.toInt() && currentConfig.code != DataCodeEnum.OMDB_RD_LINK_KIND.code.toInt() && renderEntity.properties.containsKey( + "linkPid" + ) + ) { + if (renderEntity.properties.containsKey("mesh")) { + renderEntity.properties.remove("mesh") + } + } + // 如果当前解析的是OMDB_RD_LINK数据,将其缓存在预处理类中,以便后续处理其他要素时使用 if (currentConfig.code == DataCodeEnum.OMDB_RD_LINK.code.toInt()) { if (renderEntity.linkRelation == null) { @@ -694,12 +797,8 @@ class ImportOMDBHelper @AssistedInject constructor( renderEntity.properties["enodePid"] } - //去掉暂用控件较大的字段多余属性字段 - if (renderEntity.properties.containsKey("shapeList")) { - renderEntity.properties.remove("shapeList") - } - - renderEntity.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(renderEntity.properties)) + renderEntity.propertiesDb = + DeflaterUtil.zipString(JSON.toJSONString(renderEntity.properties)) listRenderEntity.add(renderEntity) @@ -713,12 +812,14 @@ class ImportOMDBHelper @AssistedInject constructor( if (isEmit) { f.send(listRenderEntity) delay(20) + callback?.onProgress(elementIndex) } else { realm!!.copyToRealm(listRenderEntity) realm!!.commitTransaction() realm!!.close() realm = Realm.getInstance(currentInstallTaskConfig) realm.beginTransaction() + callback?.onProgress(elementIndex) } listRenderEntity = mutableListOf() // @@ -726,16 +827,21 @@ class ImportOMDBHelper @AssistedInject constructor( line = bufferedReader.readLine() } - CMLog.writeLogtoFile(ImportOMDBHelper::class.java.name, "importOmdbZipFile", "${currentConfig.table}结束===总量$elementIndex") + CMLog.writeLogtoFile( + ImportOMDBHelper::class.java.name, + "importOmdbZipFile", + "${currentConfig.table}结束===总量$elementIndex" + ) if (isEmit) { f.send(listRenderEntity) delay(20) - + callback?.onProgress(elementIndex) } else { bufferedReader.close() realm!!.copyToRealm(listRenderEntity) realm!!.commitTransaction() + callback?.onProgress(elementIndex) } } if (!isEmit) { @@ -745,7 +851,12 @@ class ImportOMDBHelper @AssistedInject constructor( Log.e("jingo", "安装报错 ${currentConfig.table} ${elementIndex} ${e.message}") throw e } + Log.e("jingo", "完成 ${currentConfig.table}") + + callback?.onComplete() + + return NonCancellable } diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index cb5b22c3..57ba6e93 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -231,6 +231,7 @@ class ImportPreProcess { // startEndReference.renderEntityId = renderEntity.id startEndReference.name = "${renderEntity.name}参考线" startEndReference.table = renderEntity.table + startEndReference.code = renderEntity.code startEndReference.zoomMin = renderEntity.zoomMin startEndReference.zoomMax = renderEntity.zoomMax startEndReference.taskId = renderEntity.taskId @@ -469,6 +470,7 @@ class ImportPreProcess { // angleReference.renderEntityId = renderEntity.id angleReference.name = "${renderEntity.name}参考方向" angleReference.table = renderEntity.table + angleReference.code = renderEntity.code angleReference.zoomMin = renderEntity.zoomMin angleReference.zoomMax = renderEntity.zoomMax angleReference.taskId = renderEntity.taskId @@ -736,9 +738,10 @@ class ImportPreProcess { // angleReference.renderEntityId = renderEntity.id angleReference.name = "${renderEntity.name}车道中线面" angleReference.table = renderEntity.table + angleReference.code = renderEntity.code Log.e("jingo", "几何转换开始") - angleReference.geometry = renderEntity.geometry - //GeometryTools.createGeometry(renderEntity.geometry).buffer(0.000035).toString()//GeometryTools.computeLine(0.000035,0.000035,renderEntity.geometry) + //angleReference.geometry = renderEntity.geometry + angleReference.geometry = GeometryTools.computeLine(0.000035,0.000035,renderEntity.geometry) Log.e("jingo", "几何转换结束") angleReference.properties["qi_table"] = renderEntity.table angleReference.properties["widthProperties"] = "3" @@ -938,6 +941,7 @@ class ImportPreProcess { // dynamicSrcReference.renderEntityId = renderEntity.id dynamicSrcReference.name = "${renderEntity.name}动态icon" dynamicSrcReference.table = renderEntity.table + dynamicSrcReference.code = renderEntity.code dynamicSrcReference.zoomMin = renderEntity.zoomMin dynamicSrcReference.zoomMax = renderEntity.zoomMax dynamicSrcReference.taskId = renderEntity.taskId diff --git a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt index e93e47fa..8a30d42c 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt @@ -1,14 +1,18 @@ package com.navinfo.omqs.http.taskdownload +import android.os.Handler +import android.os.Message import android.util.Log import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Observer +import androidx.lifecycle.viewmodel.viewModelFactory import com.blankj.utilcode.util.MapUtils import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.utils.MapParamUtils import com.navinfo.omqs.Constant import com.navinfo.omqs.db.ImportOMDBHelper +import com.navinfo.omqs.db.MultiPathsCallback import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.tools.FileManager import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus @@ -155,20 +159,50 @@ class TaskDownloadScope( fileNew ) if (task != null) { - if (importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, task, this)) { -// if (it == "finish") { - change(FileDownloadStatus.DONE) - Log.e("jingo", "数据安装结束") - withContext(Dispatchers.Main) { - //任务与当前一致,需要更新渲染图层 - if (MapParamUtils.getTaskId() == taskBean.id) { - downloadManager.mapController.layerManagerHandler.updateOMDBVectorTileLayer() + importOMDBHelper.importOmdbZipFile( + importOMDBHelper.omdbFile, + task, + this, + object : MultiPathsCallback { + override fun onProgress(value: Int) { + Log.e("jingo", "安装====$value") } - } - } else { - change(FileDownloadStatus.IMPORTING, "anzhuang") - } -// } + + override fun onError(t: Throwable) { + } + + override fun onComplete() { + taskBean.status = FileDownloadStatus.DONE + downloadData.postValue(taskBean) + //任务与当前一致,需要更新渲染图层 + if (MapParamUtils.getTaskId() == taskBean.id) { + downloadManager.mapController.layerManagerHandler.updateOMDBVectorTileLayer() + } + val realm = realmOperateHelper.getRealmDefaultInstance() + realm.executeTransaction { r -> + val newTask = + realm.where(TaskBean::class.java).equalTo("id", taskBean.id) + .findFirst() + newTask?.let { + it.syncStatus = taskBean.syncStatus + it.status = taskBean.status + it.errMsg = taskBean.errMsg + //赋值时间,用于查询过滤 + it.operationTime = taskBean.operationTime + r.copyToRealmOrUpdate(it) + taskBean = realm.copyFromRealm(it) + } + } + realm.close() + } + + override fun onResult(value: String) { + taskBean.status = FileDownloadStatus.IMPORTING + taskBean.message = value + downloadData.postValue(taskBean) + } + + }) } } catch (e: Exception) { Log.e("jingo", "数据安装失败 ${e.toString()}") 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 8c247086..b18a24f8 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 @@ -11,6 +11,7 @@ import com.navinfo.omqs.bean.ScProblemTypeBean import com.navinfo.omqs.bean.ScRootCauseAnalysisBean import com.navinfo.omqs.bean.ScWarningCodeBean import com.navinfo.omqs.db.ImportOMDBHelper +import com.navinfo.omqs.db.MultiPathsCallback import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.db.RoomAppDatabase import com.navinfo.omqs.tools.MetadataUtils @@ -152,11 +153,36 @@ class PersonalCenterViewModel @Inject constructor( viewModelScope.launch(Dispatchers.IO) { Log.d("OMQSApplication", "开始导入数据") if (task != null) { - importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, task, this) + importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, task, this,object :MultiPathsCallback{ + override fun onProgress(value: Int) { + } + + override fun onResult(value: String) { + } + + override fun onError(t: Throwable) { + } + + override fun onComplete() { + } + }) } else { val newTask = TaskBean() newTask.id = -1 - importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, newTask, this) + importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, newTask, this,object :MultiPathsCallback{ + override fun onProgress(value: Int) { + + } + + override fun onResult(value: String) { + } + + override fun onError(t: Throwable) { + } + + override fun onComplete() { + } + }) } Log.d("OMQSApplication", "导入数据完成") 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 5a8e1e91..dff88859 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 @@ -325,18 +325,19 @@ class TaskListAdapter( if (binding.taskProgressText.visibility != View.VISIBLE) binding.taskProgressText.visibility = View.VISIBLE binding.taskDownloadBtn.setText("安装中") + Log.e("jingo", "更新进度条 ${taskBean.message}") val split = taskBean.message.split("/") if (split.size == 2) { try { val index = split[0].toInt() val count = split[1].toInt() - binding.taskProgressText.text = - "${index * 100 / count}%" + Log.e("jingo", "更新进度条 $index====$count") + binding.taskProgressText.text = "${index * 100 / count}%" } catch (e: Exception) { Log.e("jingo", "更新进度条 $e") } } else { - binding.taskProgressText.text = "0%" + binding.taskProgressText.text = taskBean.message } val errMsg = taskBean.errMsg if (errMsg != null && errMsg.isNotEmpty()) {