From cf640cb1d209ff2e2703731704c66d81694230bf Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Wed, 26 Apr 2023 15:18:43 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=85=83=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 9 +- .../main/java/com/navinfo/omqs/Constant.kt | 1 + .../com/navinfo/omqs/db/ImportOMDBHelper.kt | 4 +- .../http/taskdownload/TaskDownloadScope.kt | 9 +- .../com/navinfo/omqs/tools/MetadataUtils.kt | 19 ++ .../omqs/ui/activity/map/MainActivity.kt | 4 +- .../EvaluationResultFragment.kt | 6 +- .../EvaluationResultViewModel.kt | 11 +- .../personalcenter/PersonalCenterFragment.kt | 42 +-- .../personalcenter/PersonalCenterViewModel.kt | 245 +++++++++++++----- .../qsrecordlist/QsRecordListFragment.kt | 6 - .../ui/fragment/tasklist/TaskListViewModel.kt | 1 - .../omqs/ui/other/BaseRecyclerViewAdapter.kt | 2 +- .../res/layout/fragment_evaluation_result.xml | 4 +- .../main/res => }/resources/rendertheme.xsd | 0 15 files changed, 249 insertions(+), 114 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/tools/MetadataUtils.kt rename collect-library/{src/main/res => }/resources/rendertheme.xsd (100%) diff --git a/app/build.gradle b/app/build.gradle index 199d51c4..f8bffd48 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -86,8 +86,13 @@ dependencies { kapt "androidx.room:room-ktx:2.5.1" //读取excel word等文件 - implementation 'org.apache.poi:poi:4.0.0' - implementation 'org.apache.poi:poi-ooxml:4.0.0' +// implementation 'org.apache.poi:poi:4.0.0' +// implementation 'org.apache.poi:poi-ooxml:4.0.0' +// implementation 'org.apache.poi:poi-ooxml-schemas:4.0.0' +// implementation 'org.apache.xmlbeans:xmlbeans:3.0.2' +// implementation 'javax.xml.stream:stax-api:1.0-2' +// implementation 'com.bea.xml.stream:com.bea.xml.stream:1.0.0' + implementation 'commons-io:commons-io:2.11.0' // 读取spatialite文件 implementation 'com.github.sevar83:android-spatialite:2.0.1' diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index 559cdda5..e74563a6 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -79,4 +79,5 @@ class Constant { const val OMDB_CONFIG = "omdb.config" } + } \ 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 ea70906b..ecac27c1 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -47,7 +47,7 @@ class ImportOMDBHelper @AssistedInject constructor( ).writableDatabase } private val configFile: File = - File("${Constant.DATA_PATH}/${Constant.CURRENT_USER_ID}", Constant.OMDB_CONFIG) + File("${Constant.USER_DATA_PATH}", Constant.OMDB_CONFIG) /** * 读取config的配置文件 @@ -174,7 +174,7 @@ class ImportOMDBHelper @AssistedInject constructor( emit("${index + 1}/${importConfig.tables.size}") } Realm.getDefaultInstance().commitTransaction() - emit("OK") + emit("finish") } } 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 f15902d7..f376a82f 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,15 +1,12 @@ package com.navinfo.omqs.http.taskdownload -import android.content.Context import android.util.Log -import androidx.core.content.ContentProviderCompat.requireContext import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Observer import com.navinfo.omqs.Constant import com.navinfo.omqs.bean.TaskBean import com.navinfo.omqs.db.ImportOMDBHelper -import com.navinfo.omqs.hilt.ImportOMDBHiltFactory import com.navinfo.omqs.tools.FileManager import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus import io.realm.Realm @@ -18,7 +15,6 @@ import java.io.File import java.io.IOException import java.io.InputStream import java.io.RandomAccessFile -import javax.inject.Inject class TaskDownloadScope( private val downloadManager: TaskDownloadManager, @@ -26,9 +22,6 @@ class TaskDownloadScope( ) : CoroutineScope by CoroutineScope(Dispatchers.IO + CoroutineName("OfflineMapDownLoad")) { - @Inject - lateinit var importOMDBHiltFactory: ImportOMDBHiltFactory - /** *下载任务,用来取消的 */ @@ -131,7 +124,7 @@ class TaskDownloadScope( ) importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile).collect { Log.e("jingo", "数据安装 $it") - if (it == "OK") { + if (it == "finish") { change(FileDownloadStatus.DONE) } else { change(FileDownloadStatus.IMPORTING, it) diff --git a/app/src/main/java/com/navinfo/omqs/tools/MetadataUtils.kt b/app/src/main/java/com/navinfo/omqs/tools/MetadataUtils.kt new file mode 100644 index 00000000..25af2cca --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/tools/MetadataUtils.kt @@ -0,0 +1,19 @@ +package com.navinfo.omqs.tools + +class MetadataUtils { + companion object { + object ScProblemTypeTitle { + + const val TITLE_ELEMENT_TYPE = "类型" + const val TITLE_ELEMENT_CODE = "要素代码" + const val TITLE_CLASS_TYPE = "要素分类" + const val TITLE_PROBLEM_TYPE = "问题类型" + const val TITLE_PHENOMENON = "问题现象" + } + + object ScRootCauseAnalysisTitle { + const val TITLE_PROBLEM_LINK = "问题环节" + const val TITLE_PROBLEM_CAUSE = "初步问题原因" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index 51273fb5..27d79e89 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -67,8 +67,8 @@ class MainActivity : BaseActivity() { //启动轨迹存储 mapController.locationLayerHandler.setNiLocationListener(NiLocationListener { ToastUtils.showLong("定位${it.longitude}") - binding!!.viewModel!!.addSaveTrace(it) - binding!!.viewModel!!.startSaveTraceThread(this) + binding.viewModel!!.addSaveTrace(it) + binding.viewModel!!.startSaveTraceThread(this) }) //显示轨迹图层 // mapController.layerManagerHandler.showNiLocationLayer(Constant.DATA_PATH+ SystemConstant.USER_ID+"/trace.sqlite") diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt index 3e8a366b..65ca7324 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt @@ -164,7 +164,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { override fun onDestroyView() { - activity?.apply { + activity?.run { findNavController(R.id.main_activity_middle_fragment).navigateUp() } super.onDestroyView() @@ -178,7 +178,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { when (v.id) { //上三项,打开面板 R.id.evaluation_class_type, R.id.evaluation_problem_type, R.id.evaluation_phenomenon -> { - activity?.apply { + activity?.run { val controller = findNavController(R.id.main_activity_middle_fragment) controller.currentDestination?.let { //如果之前页面是空fragment,直接打开面板 @@ -201,7 +201,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { } //下两项,打开面板 R.id.evaluation_link, R.id.evaluation_cause -> { - activity?.apply { + activity?.run { val controller = findNavController(R.id.main_activity_middle_fragment) controller.currentDestination?.let { //如果之前页面是空fragment,直接打开面板 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 01b4c6a7..2fa6224f 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 @@ -6,6 +6,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.map.NIMapController +import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.db.RoomAppDatabase import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Realm @@ -17,7 +18,9 @@ import javax.inject.Inject @HiltViewModel class EvaluationResultViewModel @Inject constructor( - private val roomAppDatabase: RoomAppDatabase, private val mapController: NIMapController + private val roomAppDatabase: RoomAppDatabase, + private val mapController: NIMapController, + private val realmOperateHelper: RealmOperateHelper, ) : ViewModel() { private val markerTitle = "点选marker" @@ -50,7 +53,7 @@ class EvaluationResultViewModel @Inject constructor( init { liveDataQsRecordBean.value = QsRecordBean(id = UUID.randomUUID().toString()) Log.e("jingo", "EvaluationResultViewModel 创建了 ${hashCode()}") - mapController.markerHandle.apply { + mapController.markerHandle.run { setOnMapClickListener { liveDataQsRecordBean.value!!.geometry = it.toGeometry() addMarker(it, markerTitle) @@ -207,7 +210,7 @@ class EvaluationResultViewModel @Inject constructor( fun saveData() { viewModelScope.launch(Dispatchers.IO) { val realm = Realm.getDefaultInstance() - Log.e("jingo","realm hashCOde ${realm.hashCode()}") + Log.e("jingo", "realm hashCOde ${realm.hashCode()}") realm.executeTransaction { it.copyToRealmOrUpdate(liveDataQsRecordBean.value) } @@ -221,7 +224,7 @@ class EvaluationResultViewModel @Inject constructor( viewModelScope.launch(Dispatchers.IO) { val realm = Realm.getDefaultInstance() - Log.e("jingo","realm hashCOde ${realm.hashCode()}") + Log.e("jingo", "realm hashCOde ${realm.hashCode()}") realm.executeTransaction { val objects = it.where(QsRecordBean::class.java) .equalTo("id", liveDataQsRecordBean.value?.id).findFirst() diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt index 4f7cd21f..7fe8c490 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt @@ -7,7 +7,9 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController +import com.blankj.utilcode.util.ToastUtils import com.blankj.utilcode.util.UriUtils import com.github.k1rakishou.fsaf.FileChooser import com.github.k1rakishou.fsaf.callback.FSAFActivityCallbacks @@ -36,6 +38,7 @@ class PersonalCenterFragment : BaseFragment(), FSAFActivityCallbacks { @Inject lateinit var importOMDBHiltFactory: ImportOMDBHiltFactory + @Inject lateinit var niMapController: NIMapController @@ -77,22 +80,22 @@ class PersonalCenterFragment : BaseFragment(), FSAFActivityCallbacks { } }) } - R.id.personal_center_menu_import_data -> { // 导入zip数据 - fileChooser.openChooseFileDialog(object : FileChooserCallback() { - override fun onCancel(reason: String) { - } - - override fun onResult(uri: Uri) { - val file = UriUtils.uri2File(uri) - val importOMDBHelper: ImportOMDBHelper = - importOMDBHiltFactory.obtainImportOMDBHelper( - requireContext(), - file - ) - viewModel.importOMDBData(importOMDBHelper) - } - }) - } +// R.id.personal_center_menu_import_data -> { // 导入zip数据 +// fileChooser.openChooseFileDialog(object : FileChooserCallback() { +// override fun onCancel(reason: String) { +// } +// +// override fun onResult(uri: Uri) { +// val file = UriUtils.uri2File(uri) +// val importOMDBHelper: ImportOMDBHelper = +// importOMDBHiltFactory.obtainImportOMDBHelper( +// requireContext(), +// file +// ) +// viewModel.importOMDBData(importOMDBHelper) +// } +// }) +// } R.id.personal_center_menu_import_yuan_data -> { // 用户选中导入数据,打开文件选择器,用户选择导入的数据文件目录 fileChooser.openChooseFileDialog(object : FileChooserCallback() { @@ -107,7 +110,8 @@ class PersonalCenterFragment : BaseFragment(), FSAFActivityCallbacks { R.id.personal_center_menu_test -> { viewModel.readRealmData() // 定位到指定位置 - niMapController.mMapView.vtmMap.animator().animateTo(GeoPoint(30.270367985798032, 113.83513667119433)) + niMapController.mMapView.vtmMap.animator() + .animateTo(GeoPoint(30.270367985798032, 113.83513667119433)) } R.id.personal_center_menu_task_list -> { findNavController().navigate(R.id.TaskListFragment) @@ -119,6 +123,10 @@ class PersonalCenterFragment : BaseFragment(), FSAFActivityCallbacks { true } + viewModel.liveDataMessage.observe(viewLifecycleOwner) { + ToastUtils.showShort(it) + } + fileChooser.setCallbacks(this@PersonalCenterFragment) } 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 19106b80..aebf7569 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 @@ -1,8 +1,9 @@ package com.navinfo.omqs.ui.fragment.personalcenter -import android.content.Context import android.net.Uri import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.blankj.utilcode.util.FileIOUtils @@ -10,35 +11,35 @@ import com.blankj.utilcode.util.UriUtils import com.blankj.utilcode.util.ZipUtils import com.google.gson.Gson import com.navinfo.collect.library.data.entity.* -import com.navinfo.collect.library.map.NIMapController -import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.omqs.bean.ScProblemTypeBean import com.navinfo.omqs.bean.ScRootCauseAnalysisBean import com.navinfo.omqs.db.ImportOMDBHelper import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.db.RoomAppDatabase +import com.navinfo.omqs.tools.MetadataUtils +import com.navinfo.omqs.tools.MetadataUtils.Companion.ScProblemTypeTitle +import com.navinfo.omqs.tools.MetadataUtils.Companion.ScRootCauseAnalysisTitle import dagger.hilt.android.lifecycle.HiltViewModel -import dagger.hilt.android.scopes.ViewModelScoped -import io.realm.Realm -import io.realm.RealmDictionary import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import org.apache.poi.ss.usermodel.Row -import org.apache.poi.ss.usermodel.WorkbookFactory -import org.locationtech.jts.geom.Point -import java.io.File -import java.io.FileInputStream -import java.io.IOException -import java.io.InputStream +import kotlinx.coroutines.withContext +import org.apache.commons.io.input.BOMInputStream +import java.io.* +import java.nio.charset.Charset +import java.text.Normalizer import java.util.* import javax.inject.Inject + @HiltViewModel class PersonalCenterViewModel @Inject constructor( private val roomAppDatabase: RoomAppDatabase ) : ViewModel() { @Inject lateinit var realmOperateHelper: RealmOperateHelper + + val liveDataMessage = MutableLiveData() + /** * 导入OMDB数据 * */ @@ -50,12 +51,16 @@ class PersonalCenterViewModel @Inject constructor( val hadLinkKindFile = File(importOMDBHelper.omdbFile.parentFile, "HAD_LINK_KIND.txt") val hadLinkDirectFile = File(importOMDBHelper.omdbFile.parentFile, "HAD_LINK_DIRECT.txt") val hadSpeedLimitFile = File(importOMDBHelper.omdbFile.parentFile, "HAD_SPEEDLIMIT.txt") - val hadSpeedLimitCondFile = File(importOMDBHelper.omdbFile.parentFile, "HAD_SPEEDLIMIT_COND.txt") - val hadSpeedLimitVarFile = File(importOMDBHelper.omdbFile.parentFile, "HAD_SPEEDLIMIT_VAR.txt") + val hadSpeedLimitCondFile = + File(importOMDBHelper.omdbFile.parentFile, "HAD_SPEEDLIMIT_COND.txt") + val hadSpeedLimitVarFile = + File(importOMDBHelper.omdbFile.parentFile, "HAD_SPEEDLIMIT_VAR.txt") - for (tableName in listOf("HAD_LINK", "HAD_SPEEDLIMIT", "HAD_SPEEDLIMIT_COND", "HAD_SPEEDLIMIT_VAR")/*listOf("HAD_LINK")*/) { + for (tableName in listOf( + "HAD_LINK", "HAD_SPEEDLIMIT", "HAD_SPEEDLIMIT_COND", "HAD_SPEEDLIMIT_VAR" + )/*listOf("HAD_LINK")*/) { importOMDBHelper.getOMDBTableData(tableName).collect { - for (map in it) { + for (map in it) { if ("HAD_LINK" == tableName) { // 根据HAD_Link生成json文件 val hadLink = HAD_LINK() @@ -65,25 +70,31 @@ class PersonalCenterViewModel @Inject constructor( hadLink.E_NODE_PID = map["E_NODE_PID"].toString() hadLink.GEOMETRY = map["GEOMETRY"].toString() // 将该数据写入到对应的txt文件 - FileIOUtils.writeFileFromString(hadLinkFile, gson.toJson(hadLink)+"\r", true) + FileIOUtils.writeFileFromString( + hadLinkFile, gson.toJson(hadLink) + "\r", true + ) - val hadLinkDirect = HAD_LINK_DIRECT() + val hadLinkDirect = HAD_LINK_DIRECT() hadLinkDirect.LINK_PID = map["LINK_PID"].toString() hadLinkDirect.MESH = map["MESH"].toString() hadLinkDirect.DIRECT = map["DIRECT"].toString().toInt() hadLinkDirect.GEOMETRY = map["GEOMETRY"].toString() // 将该数据写入到对应的txt文件 - FileIOUtils.writeFileFromString(hadLinkDirectFile, gson.toJson(hadLinkDirect)+"\r", true) + FileIOUtils.writeFileFromString( + hadLinkDirectFile, gson.toJson(hadLinkDirect) + "\r", true + ) - val hadLinkKind = HAD_LINK_KIND() + val hadLinkKind = HAD_LINK_KIND() hadLinkKind.LINK_PID = map["LINK_PID"].toString() hadLinkKind.MESH = map["MESH"].toString() hadLinkKind.KIND = map["KIND"].toString().toInt() hadLinkKind.GEOMETRY = map["GEOMETRY"].toString() // 将该数据写入到对应的txt文件 - FileIOUtils.writeFileFromString(hadLinkKindFile, gson.toJson(hadLinkKind)+"\r", true) + FileIOUtils.writeFileFromString( + hadLinkKindFile, gson.toJson(hadLinkKind) + "\r", true + ) } else if ("HAD_SPEEDLIMIT" == tableName) { - val hadSpeedlimit = HAD_SPEEDLIMIT() + val hadSpeedlimit = HAD_SPEEDLIMIT() hadSpeedlimit.SPEED_ID = map["SPEED_ID"].toString() hadSpeedlimit.MESH = map["MESH"].toString() hadSpeedlimit.LINK_PID = map["LINK_PID"].toString() @@ -93,9 +104,11 @@ class PersonalCenterViewModel @Inject constructor( hadSpeedlimit.MAX_SPEED = map["MAX_SPEED"].toString().toInt() hadSpeedlimit.MIN_SPEED = map["MIN_SPEED"].toString().toInt() // 将该数据写入到对应的txt文件 - FileIOUtils.writeFileFromString(hadSpeedLimitFile, gson.toJson(hadSpeedlimit)+"\r", true) + FileIOUtils.writeFileFromString( + hadSpeedLimitFile, gson.toJson(hadSpeedlimit) + "\r", true + ) } else if ("HAD_SPEEDLIMIT_COND" == tableName) { - val hadSpeedlimitCond = HAD_SPEEDLIMIT_COND() + val hadSpeedlimitCond = HAD_SPEEDLIMIT_COND() hadSpeedlimitCond.SPEED_COND_ID = map["SPEED_COND_ID"].toString() hadSpeedlimitCond.MESH = map["MESH"].toString() hadSpeedlimitCond.LINK_PID = map["LINK_PID"].toString() @@ -103,13 +116,16 @@ class PersonalCenterViewModel @Inject constructor( hadSpeedlimitCond.DIRECT = map["DIRECT"].toString().toInt() hadSpeedlimitCond.SPEED_FLAG = map["SPEED_FLAG"].toString().toInt() hadSpeedlimitCond.MAX_SPEED = map["MAX_SPEED"].toString().toInt() - hadSpeedlimitCond.SPEED_DEPENDENT = map["SPEED_DEPENDENT"].toString().toInt() + hadSpeedlimitCond.SPEED_DEPENDENT = + map["SPEED_DEPENDENT"].toString().toInt() hadSpeedlimitCond.VEHICLE_TYPE = map["VEHICLE_TYPE"].toString().toInt() hadSpeedlimitCond.VALID_PERIOD = map["VALID_PERIOD"].toString() // 将该数据写入到对应的txt文件 - FileIOUtils.writeFileFromString(hadSpeedLimitCondFile, gson.toJson(hadSpeedlimitCond)+"\r", true) + FileIOUtils.writeFileFromString( + hadSpeedLimitCondFile, gson.toJson(hadSpeedlimitCond) + "\r", true + ) } else if ("HAD_SPEEDLIMIT_VAR" == tableName) { - val hadSpeedlimitVar = HAD_SPEEDLIMIT_VAR() + val hadSpeedlimitVar = HAD_SPEEDLIMIT_VAR() hadSpeedlimitVar.SPEED_VAR_ID = map["SPEED_ID"].toString() hadSpeedlimitVar.MESH = map["MESH"].toString() hadSpeedlimitVar.LINK_PID = map["LINK_PID"].toString() @@ -117,7 +133,9 @@ class PersonalCenterViewModel @Inject constructor( hadSpeedlimitVar.DIRECT = map["DIRECT"].toString().toInt() hadSpeedlimitVar.LOCATION = map["LOCATION"].toString() // 将该数据写入到对应的txt文件 - FileIOUtils.writeFileFromString(hadSpeedLimitVarFile, gson.toJson(hadSpeedlimitVar)+"\r", true) + FileIOUtils.writeFileFromString( + hadSpeedLimitVarFile, gson.toJson(hadSpeedlimitVar) + "\r", true + ) } // val properties = RealmDictionary() // for (entry in map.entries) { @@ -129,10 +147,20 @@ class PersonalCenterViewModel @Inject constructor( } } } - ZipUtils.zipFiles(mutableListOf(hadLinkFile, hadLinkKindFile, hadLinkDirectFile, hadSpeedLimitFile, hadSpeedLimitCondFile, hadSpeedLimitVarFile), File(importOMDBHelper.omdbFile.parentFile, "output.zip")) + ZipUtils.zipFiles( + mutableListOf( + hadLinkFile, + hadLinkKindFile, + hadLinkDirectFile, + hadSpeedLimitFile, + hadSpeedLimitCondFile, + hadSpeedLimitVarFile + ), File(importOMDBHelper.omdbFile.parentFile, "output.zip") + ) Log.d("OMQSApplication", "生成数据完成") } + /** * 导入OMDB数据 * */ @@ -153,51 +181,136 @@ class PersonalCenterViewModel @Inject constructor( val file = UriUtils.uri2File(uri) val inputStream: InputStream = FileInputStream(file) //getAssets().open("sample.xlsx") - val workbook = WorkbookFactory.create(inputStream) - //获取所有sheet - val sheet1 = workbook.getSheet("SC_PROBLEM_TYPE") - sheet1?.let { - val rowCount: Int = it.physicalNumberOfRows // 获取行数 - val list = mutableListOf() - for (i in 1 until rowCount) { - val row: Row = it.getRow(i) // 获取行 -// val cellCount: Int = row.physicalNumberOfCells // 获取列数 - val bean = ScProblemTypeBean( - elementType = row.getCell(0).stringCellValue, - elementCode = row.getCell(1).numericCellValue.toString(), - classType = row.getCell(2).stringCellValue, - problemType = row.getCell(3).stringCellValue, - phenomenon = row.getCell(4).stringCellValue - ) - list.add(bean) - Log.e("jingo", bean.toString()) - } - roomAppDatabase.getScProblemTypeDao().insertOrUpdateList(list) - } - val sheet2 = workbook.getSheet("SC_ROOT_CAUSE_ANALYSIS") - sheet2?.let { - val rowCount: Int = it.physicalNumberOfRows // 获取行数 - val list = mutableListOf() - for (i in 1 until rowCount) { - val row: Row = it.getRow(i) // 获取行 - val cellCount: Int = row.physicalNumberOfCells // 获取列数 - if (cellCount == 2) { - val bean = ScRootCauseAnalysisBean() - bean.problemLink = row.getCell(0).stringCellValue - bean.problemCause = row.getCell(1).stringCellValue + val bomInputStreamReader = BOMInputStream(inputStream) + val inputStreamReader = InputStreamReader(bomInputStreamReader, "UTF-8") + + val bufferedReader = BufferedReader(inputStreamReader) + var line: String? = null + var index = 0 + var elementTypeIndex = -1 + var elementCodeIndex = -1 + var classTypeIndex = -1 + var problemTypeIndex = -1 + var phenomenonIndex = -1 + var problemLinkIndex = -1 + var problemCauseIndex = -1 + val list = mutableListOf() + val list2 = mutableListOf() + while (bufferedReader.readLine()?.also { line = it } != null) { // 处理 CSV 文件中的每一行数据 + val data = + line!!.split(",".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() + if (index == 0) { + for (i in data.indices) { + when (data[i]) { + ScProblemTypeTitle.TITLE_ELEMENT_TYPE -> { + elementTypeIndex = i + } + ScProblemTypeTitle.TITLE_ELEMENT_CODE -> { + elementCodeIndex = i + } + ScProblemTypeTitle.TITLE_CLASS_TYPE -> { + classTypeIndex = i + } + ScProblemTypeTitle.TITLE_PROBLEM_TYPE -> { + problemTypeIndex = i + } + ScProblemTypeTitle.TITLE_PHENOMENON -> { + phenomenonIndex = i + } + ScRootCauseAnalysisTitle.TITLE_PROBLEM_LINK -> { + problemLinkIndex = i + } + ScRootCauseAnalysisTitle.TITLE_PROBLEM_CAUSE -> { + problemCauseIndex = i + } + } + } + } else { + if (elementTypeIndex > -1 + && elementCodeIndex > -1 + && classTypeIndex > -1 + && problemTypeIndex > -1 + && phenomenonIndex > -1 + ) { + val bean = ScProblemTypeBean( + elementType = data[elementTypeIndex], + elementCode = data[elementCodeIndex], + classType = data[classTypeIndex], + problemType = data[problemTypeIndex], + phenomenon = data[phenomenonIndex], + ) list.add(bean) - Log.e("jingo", bean.toString()) + } else if (problemLinkIndex > -1 && problemCauseIndex > -1) { + val bean = ScRootCauseAnalysisBean( + problemLink = data[problemLinkIndex], + problemCause = data[problemCauseIndex], + ) + list2.add(bean) + } else { + liveDataMessage.postValue("元数据表规格不正确,请仔细核对") + break } } - roomAppDatabase.getScRootCauseAnalysisDao().insertOrUpdateList(list) + index++ } - workbook.close() + if (list.isNotEmpty()) { + liveDataMessage.postValue("元数据表导入成功") + roomAppDatabase.getScProblemTypeDao().insertOrUpdateList(list) + } + if (list2.isNotEmpty()) { + liveDataMessage.postValue("元数据表导入成功") + roomAppDatabase.getScRootCauseAnalysisDao().insertOrUpdateList(list2) + } + + bufferedReader.close() + inputStreamReader.close() + inputStream.close() +// val workbook = WorkbookFactory.create(inputStream) +// //获取所有sheet +// val sheet1 = workbook.getSheet("SC_PROBLEM_TYPE") +// sheet1?.let { +// val rowCount: Int = it.physicalNumberOfRows // 获取行数 +// val list = mutableListOf() +// for (i in 1 until rowCount) { +// val row: Row = it.getRow(i) // 获取行 +//// val cellCount: Int = row.physicalNumberOfCells // 获取列数 +// val bean = ScProblemTypeBean( +// elementType = row.getCell(0).stringCellValue, +// elementCode = row.getCell(1).numericCellValue.toString(), +// classType = row.getCell(2).stringCellValue, +// problemType = row.getCell(3).stringCellValue, +// phenomenon = row.getCell(4).stringCellValue +// ) +// list.add(bean) +// Log.e("jingo", bean.toString()) +// } +// roomAppDatabase.getScProblemTypeDao().insertOrUpdateList(list) +// } +// val sheet2 = workbook.getSheet("SC_ROOT_CAUSE_ANALYSIS") +// sheet2?.let { +// val rowCount: Int = it.physicalNumberOfRows // 获取行数 +// val list = mutableListOf() +// for (i in 1 until rowCount) { +// val row: Row = it.getRow(i) // 获取行 +// val cellCount: Int = row.physicalNumberOfCells // 获取列数 +// if (cellCount == 2) { +// val bean = ScRootCauseAnalysisBean() +// bean.problemLink = row.getCell(0).stringCellValue +// bean.problemCause = row.getCell(1).stringCellValue +// list.add(bean) +// Log.e("jingo", bean.toString()) +// } +// } +// roomAppDatabase.getScRootCauseAnalysisDao().insertOrUpdateList(list) +// } +// workbook.close() + } catch (e: IOException) { e.printStackTrace() Log.e("jingo", e.toString()) + liveDataMessage.postValue("元数据表导入失败!$e") } } - } fun readRealmData() { diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListFragment.kt index 0f8ec349..bb43281c 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListFragment.kt @@ -8,18 +8,12 @@ import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView.VERTICAL -import com.blankj.utilcode.util.ToastUtils import com.navinfo.omqs.R import com.navinfo.omqs.databinding.FragmentQsRecordListBinding import com.navinfo.omqs.ui.activity.map.MainActivity import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.fragment.tasklist.QsRecordListAdapter -import com.navinfo.omqs.ui.other.BaseToast.makeText -import com.navinfo.omqs.ui.widget.RecycleViewDivider import dagger.hilt.android.AndroidEntryPoint -import org.apache.poi.xwpf.usermodel.VerticalAlign -import javax.inject.Inject @AndroidEntryPoint class QsRecordListFragment : BaseFragment(){ diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt index f3175363..b4a38473 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt @@ -65,7 +65,6 @@ class TaskListViewModel @Inject constructor( } } is NetResult.Loading -> {} - else -> {} } for (item in taskList) { diff --git a/app/src/main/java/com/navinfo/omqs/ui/other/BaseRecyclerViewAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/other/BaseRecyclerViewAdapter.kt index aed4ced8..aa93a6d2 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/other/BaseRecyclerViewAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/other/BaseRecyclerViewAdapter.kt @@ -45,7 +45,7 @@ abstract class BaseRecyclerViewAdapter(var data: List = listOf()) : override fun onViewDetachedFromWindow(holder: BaseViewHolder) { super.onViewDetachedFromWindow(holder) - holder.apply { + holder.run { onStop() } } diff --git a/app/src/main/res/layout/fragment_evaluation_result.xml b/app/src/main/res/layout/fragment_evaluation_result.xml index 2b07c99f..bd0896f0 100644 --- a/app/src/main/res/layout/fragment_evaluation_result.xml +++ b/app/src/main/res/layout/fragment_evaluation_result.xml @@ -64,7 +64,7 @@ android:layout_height="wrap_content" android:layout_marginTop="5dp" android:background="@drawable/fm_card_map_down_status_bg" - android:onClick="@{fragment.onClick}" + android:onClick="@{fragment::onClick}" android:text="@{viewModel.liveDataQsRecordBean.classType}" /> Date: Wed, 26 Apr 2023 15:19:36 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=90=88=E5=B9=B6=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/navinfo/omqs/tools/MetadataUtils.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/navinfo/omqs/tools/MetadataUtils.kt b/app/src/main/java/com/navinfo/omqs/tools/MetadataUtils.kt index 25af2cca..e2c48c10 100644 --- a/app/src/main/java/com/navinfo/omqs/tools/MetadataUtils.kt +++ b/app/src/main/java/com/navinfo/omqs/tools/MetadataUtils.kt @@ -7,7 +7,7 @@ class MetadataUtils { const val TITLE_ELEMENT_TYPE = "类型" const val TITLE_ELEMENT_CODE = "要素代码" const val TITLE_CLASS_TYPE = "要素分类" - const val TITLE_PROBLEM_TYPE = "问题类型" + const val TITLE_PROBLEM_TYPE = "问题类型·" const val TITLE_PHENOMENON = "问题现象" } From 92a9f9d6c4b3645ea02696f1f93244e0291bfa91 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Thu, 27 Apr 2023 10:12:29 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=81=93=E8=B7=AF?= =?UTF-8?q?=E6=8D=95=E6=8D=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- .../java/com/navinfo/omqs/bean/TaskBean.kt | 2 +- .../com/navinfo/omqs/db/RealmOperateHelper.kt | 6 ++--- .../http/taskdownload/TaskDownloadScope.kt | 25 +++++++++++++------ .../com/navinfo/omqs/tools/MetadataUtils.kt | 2 +- .../EvaluationResultViewModel.kt | 24 ++++++++++++++++++ .../ui/fragment/tasklist/TaskListViewModel.kt | 4 +-- 7 files changed, 50 insertions(+), 15 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 244ecbc4..1ac69655 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -33,7 +33,7 @@ android { signingConfigs { debug { - storeFile file('D:/WrokSpace/OneMapQS/fastmap.keystore') + storeFile file('../fastmap.keystore') storePassword "navinfo" keyAlias "fastmap" keyPassword "navinfo" diff --git a/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt b/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt index 86265253..9fcdc488 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt @@ -14,7 +14,7 @@ open class TaskBean @JvmOverloads constructor( /** * 测评任务id */ - @PrimaryKey +// @PrimaryKey var id: Int = 0, /** * 测评任务名称 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 ced6dcb2..a00873d3 100644 --- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt @@ -46,7 +46,7 @@ class RealmOperateHelper() { val yEnd = tileYSet.stream().max(Comparator.naturalOrder()).orElse(null) // 查询realm中对应tile号的数据 val realmList = Realm.getDefaultInstance().where(RenderEntity::class.java) - .equalTo("table", "HAD_LINK") + .equalTo("table", "OMDB_RD_LINK") .and() .rawPredicate("tileX>=$xStart and tileX<=$xEnd and tileY>=$yStart and tileY<=$yEnd") .findAll() @@ -89,7 +89,7 @@ class RealmOperateHelper() { val yEnd = tileYSet.stream().max(Comparator.naturalOrder()).orElse(null) // 查询realm中对应tile号的数据 val realmList = Realm.getDefaultInstance().where(RenderEntity::class.java) - .notEqualTo("table", "HAD_LINK") + .notEqualTo("table", "OMDB_RD_LINK") .and() .rawPredicate("tileX>=$xStart and tileX<=$xEnd and tileY>=$yStart and tileY<=$yEnd") .findAll() @@ -119,7 +119,7 @@ class RealmOperateHelper() { val result = mutableListOf() withContext(Dispatchers.IO) { val realmList = Realm.getDefaultInstance().where(RenderEntity::class.java) - .notEqualTo("table", "HAD_LINK") + .notEqualTo("table", "OMDB_RD_LINK") .and() .equalTo("properties['LINK_PID']", linkPid) .findAll() 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 f376a82f..66a10858 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 @@ -44,7 +44,9 @@ class TaskDownloadScope( //改进的代码 fun start() { - change(FileDownloadStatus.WAITING) + launch{ + change(FileDownloadStatus.WAITING) + } downloadManager.launchScope(this@TaskDownloadScope) } @@ -54,7 +56,10 @@ class TaskDownloadScope( */ fun pause() { downloadJob?.cancel("pause") - change(FileDownloadStatus.PAUSE) + launch{ + change(FileDownloadStatus.PAUSE) + } + } /** @@ -85,18 +90,20 @@ class TaskDownloadScope( * 更新任务 * @param status [OfflineMapCityBean.Status] */ - private fun change(status: Int, message: String = "") { + private suspend fun change(status: Int, message: String = "") { + Log.e("jingo", "我被挂起 S") if (taskBean.status != status || status == FileDownloadStatus.LOADING || status == FileDownloadStatus.IMPORTING) { taskBean.status = status taskBean.message = message downloadData.postValue(taskBean) - launch { + if (status != FileDownloadStatus.LOADING && status != FileDownloadStatus.IMPORTING) { val realm = Realm.getDefaultInstance() realm.executeTransaction { it.copyToRealmOrUpdate(taskBean) } } } + Log.e("jingo", "我被挂起 E") } /** @@ -182,7 +189,7 @@ class TaskDownloadScope( randomAccessFile.seek(startPosition) taskBean.currentSize = startPosition inputStream = responseBody.byteStream() - val bufferSize = 1024 * 2 + val bufferSize = 1024 * 4 val buffer = ByteArray(bufferSize) var readLength = 0 @@ -198,13 +205,17 @@ class TaskDownloadScope( } if (taskBean.currentSize == taskBean.fileSize) { - importData(fileTemp) + inputStream?.close() + randomAccessFile?.close() + inputStream = null + randomAccessFile = null + importData() } else { change(FileDownloadStatus.PAUSE) } } catch (e: Throwable) { change(FileDownloadStatus.ERROR) - Log.e("jingo","数据下载出错 ${e.message}") + Log.e("jingo", "数据下载出错 ${e.message}") } finally { inputStream?.close() randomAccessFile?.close() diff --git a/app/src/main/java/com/navinfo/omqs/tools/MetadataUtils.kt b/app/src/main/java/com/navinfo/omqs/tools/MetadataUtils.kt index e2c48c10..25af2cca 100644 --- a/app/src/main/java/com/navinfo/omqs/tools/MetadataUtils.kt +++ b/app/src/main/java/com/navinfo/omqs/tools/MetadataUtils.kt @@ -7,7 +7,7 @@ class MetadataUtils { const val TITLE_ELEMENT_TYPE = "类型" const val TITLE_ELEMENT_CODE = "要素代码" const val TITLE_CLASS_TYPE = "要素分类" - const val TITLE_PROBLEM_TYPE = "问题类型·" + const val TITLE_PROBLEM_TYPE = "问题类型" const val TITLE_PHENOMENON = "问题现象" } 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 2fa6224f..f1914053 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 @@ -6,6 +6,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.map.NIMapController +import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.db.RoomAppDatabase import dagger.hilt.android.lifecycle.HiltViewModel @@ -13,6 +14,7 @@ import io.realm.Realm import io.realm.kotlin.where import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import org.locationtech.jts.geom.Point import java.util.* import javax.inject.Inject @@ -57,6 +59,17 @@ class EvaluationResultViewModel @Inject constructor( setOnMapClickListener { liveDataQsRecordBean.value!!.geometry = it.toGeometry() addMarker(it, markerTitle) + viewModelScope.launch { + val linkList = realmOperateHelper.queryLink( + point = GeometryTools.createPoint( + it.longitude, + it.latitude + ), sort = true + ) + if (linkList.isNotEmpty()) { + liveDataQsRecordBean.value!!.linkId = linkList[0].id + } + } } } @@ -82,6 +95,17 @@ class EvaluationResultViewModel @Inject constructor( geoPoint?.let { liveDataQsRecordBean.value!!.geometry = it.toGeometry() mapController.markerHandle.addMarker(geoPoint, markerTitle) + viewModelScope.launch { + val linkList = realmOperateHelper.queryLink( + GeometryTools.createPoint( + geoPoint.longitude, + geoPoint.latitude + ) + ) + if (linkList.isNotEmpty()) { + liveDataQsRecordBean.value!!.linkId = linkList[0].id + } + } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt index b4a38473..53ee23dd 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt @@ -26,12 +26,12 @@ class TaskListViewModel @Inject constructor( fun getTaskList(context: Context) { viewModelScope.launch(Dispatchers.IO) { - val realm = Realm.getDefaultInstance() - Log.e("jingo", "realm hashCOde ${realm.hashCode()}") + var taskList: List = mutableListOf() when (val result = networkService.getTaskList("02911")) { is NetResult.Success -> { if (result.data != null) { + val realm = Realm.getDefaultInstance() realm.executeTransaction { result.data.obj?.let { list -> for (task in list) {