修改登录逻辑和数据访问顺序

增加任务和作业数据统计
This commit is contained in:
squallzhjch 2023-07-26 17:08:45 +08:00
parent e1b0e45157
commit 01bc6ac7fc
10 changed files with 217 additions and 88 deletions

View File

@ -104,7 +104,6 @@ class TaskDownloadManager constructor(
fun addTask(taskBean: TaskBean) { fun addTask(taskBean: TaskBean) {
Log.e("jingo", "下载线程 ${taskBean.id}")
if (!scopeMap.containsKey(taskBean.id)) { if (!scopeMap.containsKey(taskBean.id)) {
scopeMap[taskBean.id] = TaskDownloadScope(this, taskBean) scopeMap[taskBean.id] = TaskDownloadScope(this, taskBean)
} }
@ -114,7 +113,6 @@ class TaskDownloadManager constructor(
fun observer( fun observer(
id: Int, lifecycleOwner: LifecycleOwner, observer: Observer<TaskBean> id: Int, lifecycleOwner: LifecycleOwner, observer: Observer<TaskBean>
) { ) {
Log.e("jingo", "监听线程 ${id}")
if (scopeMap.containsKey(id)) { if (scopeMap.containsKey(id)) {
scopeMap[id]!!.observer(lifecycleOwner, observer) scopeMap[id]!!.observer(lifecycleOwner, observer)
} }

View File

@ -99,6 +99,10 @@ class LoginActivity : CheckPermissionsActivity() {
LoginStatus.LOGIN_STATUS_NET_OFFLINE_MAP -> { LoginStatus.LOGIN_STATUS_NET_OFFLINE_MAP -> {
loginDialog("检查离线地图...") loginDialog("检查离线地图...")
} }
LoginStatus.LOGIN_STATUS_NET_GET_TASK_LIST -> {
loginDialog("获取任务列表...")
}
else -> {}
} }
} }
@ -113,6 +117,7 @@ class LoginActivity : CheckPermissionsActivity() {
*/ */
private fun loginDialog(message: String) { private fun loginDialog(message: String) {
if (loginDialog == null) { if (loginDialog == null) {
Log.e("jingo", "登录dialog显示")
loginDialog = MaterialAlertDialogBuilder( loginDialog = MaterialAlertDialogBuilder(
this, com.google.android.material.R.style.MaterialAlertDialog_Material3 this, com.google.android.material.R.style.MaterialAlertDialog_Material3
).setTitle("登录").setMessage(message).show() ).setTitle("登录").setMessage(message).show()

View File

@ -9,6 +9,7 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.blankj.utilcode.util.ResourceUtils import com.blankj.utilcode.util.ResourceUtils
import com.navinfo.collect.library.data.entity.TaskBean
import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant
import com.navinfo.omqs.bean.LoginUserBean import com.navinfo.omqs.bean.LoginUserBean
import com.navinfo.omqs.bean.SysUserBean import com.navinfo.omqs.bean.SysUserBean
@ -17,6 +18,7 @@ import com.navinfo.omqs.http.DefaultResponse
import com.navinfo.omqs.http.NetResult import com.navinfo.omqs.http.NetResult
import com.navinfo.omqs.http.NetworkService import com.navinfo.omqs.http.NetworkService
import com.navinfo.omqs.tools.FileManager import com.navinfo.omqs.tools.FileManager
import com.navinfo.omqs.util.DateTimeUtil
import com.navinfo.omqs.util.NetUtils import com.navinfo.omqs.util.NetUtils
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import io.realm.Realm import io.realm.Realm
@ -37,6 +39,11 @@ enum class LoginStatus {
*/ */
LOGIN_STATUS_NET_OFFLINE_MAP, LOGIN_STATUS_NET_OFFLINE_MAP,
/**
* 访问任务列表
*/
LOGIN_STATUS_NET_GET_TASK_LIST,
/** /**
* 初始化文件夹 * 初始化文件夹
*/ */
@ -112,7 +119,8 @@ class LoginViewModel @Inject constructor(
if (userNameCache == userName && passwordCache == password) { if (userNameCache == userName && passwordCache == password) {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
createUserFolder(context, userCodeCache, userRealName) createUserFolder(context, userCodeCache, userRealName)
loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS) getOfflineCityList(context)
// loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS)
} }
return return
} }
@ -156,6 +164,14 @@ class LoginViewModel @Inject constructor(
} else { } else {
userCode = defaultUserResponse.obj?.userCode.toString() userCode = defaultUserResponse.obj?.userCode.toString()
userRealName = defaultUserResponse.obj?.userName.toString() userRealName = defaultUserResponse.obj?.userName.toString()
folderInit(
context = context,
userName = userName,
password = password,
userCode = userCode,
userRealName = userRealName
)
getOfflineCityList(context)
} }
} else { } else {
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
@ -197,6 +213,116 @@ class LoginViewModel @Inject constructor(
else -> {} else -> {}
} }
}
/**
* 获取离线地图
*/
private suspend fun getOfflineCityList(context: Context) {
loginStatus.postValue(LoginStatus.LOGIN_STATUS_NET_OFFLINE_MAP)
when (val result = networkService.getOfflineMapCityList()) {
is NetResult.Success -> {
if (result.data != null) {
for (cityBean in result.data) {
FileManager.checkOfflineMapFileInfo(cityBean)
}
roomAppDatabase.getOfflineMapDao().insertOrUpdate(result.data)
}
getTaskList(context)
}
is NetResult.Error<*> -> {
withContext(Dispatchers.Main) {
Toast.makeText(context, "${result.exception.message}", Toast.LENGTH_SHORT)
.show()
}
getTaskList(context)
}
is NetResult.Failure<*> -> {
withContext(Dispatchers.Main) {
Toast.makeText(context, "${result.code}:${result.msg}", Toast.LENGTH_SHORT)
.show()
}
getTaskList(context)
}
is NetResult.Loading -> {}
}
}
/**
* 获取任务列表
*/
private suspend fun getTaskList(context: Context) {
loginStatus.postValue(LoginStatus.LOGIN_STATUS_NET_GET_TASK_LIST)
when (val result = networkService.getTaskList(Constant.USER_ID)) {
is NetResult.Success -> {
if (result.data != null) {
val realm = Realm.getDefaultInstance()
realm.executeTransaction {
result.data.obj?.let { list ->
for (index in list.indices) {
val task = list[index]
val item = realm.where(TaskBean::class.java).equalTo(
"id", task.id
).findFirst()
if (item != null) {
task.fileSize = item.fileSize
task.status = item.status
task.currentSize = item.currentSize
task.hadLinkDvoList = item.hadLinkDvoList
//已上传后不在更新操作时间
if (task.syncStatus != FileManager.Companion.FileUploadStatus.DONE) {
//赋值时间,用于查询过滤
task.operationTime = DateTimeUtil.getNowDate().time
}
} else {
//赋值时间,用于查询过滤
task.operationTime = DateTimeUtil.getNowDate().time
}
realm.copyToRealmOrUpdate(task)
}
}
}
}
loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS)
}
is NetResult.Error<*> -> {
withContext(Dispatchers.Main) {
Toast.makeText(context, "${result.exception.message}", Toast.LENGTH_SHORT)
.show()
}
loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS)
}
is NetResult.Failure<*> -> {
withContext(Dispatchers.Main) {
Toast.makeText(context, "${result.code}:${result.msg}", Toast.LENGTH_SHORT)
.show()
}
loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS)
}
is NetResult.Loading -> {}
}
}
/**
* 初始化文件夹
*/
private fun folderInit(
context: Context,
userName: String,
password: String,
userCode: String,
userRealName: String
) {
//文件夹初始化 //文件夹初始化
try { try {
loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_INIT) loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_INIT)
@ -209,39 +335,6 @@ class LoginViewModel @Inject constructor(
} catch (e: IOException) { } catch (e: IOException) {
loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_FAILURE) loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_FAILURE)
} }
//假装解压文件等
delay(1000)
loginStatus.postValue(LoginStatus.LOGIN_STATUS_NET_OFFLINE_MAP)
when (val result = networkService.getOfflineMapCityList()) {
is NetResult.Success -> {
if (result.data != null) {
for (cityBean in result.data) {
FileManager.checkOfflineMapFileInfo(cityBean)
}
roomAppDatabase.getOfflineMapDao().insertOrUpdate(result.data)
}
}
is NetResult.Error<*> -> {
withContext(Dispatchers.Main) {
Toast.makeText(context, "${result.exception.message}", Toast.LENGTH_SHORT)
.show()
}
}
is NetResult.Failure<*> -> {
withContext(Dispatchers.Main) {
Toast.makeText(context, "${result.code}:${result.msg}", Toast.LENGTH_SHORT)
.show()
}
}
is NetResult.Loading -> {}
else -> {}
}
loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS)
} }
/** /**

View File

@ -59,6 +59,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.locationtech.jts.geom.Point
import org.oscim.core.GeoPoint import org.oscim.core.GeoPoint
import org.oscim.core.MapPosition import org.oscim.core.MapPosition
import org.oscim.layers.marker.MarkerItem import org.oscim.layers.marker.MarkerItem
@ -215,6 +216,8 @@ class MainViewModel @Inject constructor(
//线选择状态 //线选择状态
if (bSelectRoad) { if (bSelectRoad) {
captureLink(point) captureLink(point)
} else {
captureItem(point)
} }
} }
} }
@ -382,7 +385,8 @@ class MainViewModel @Inject constructor(
} }
location.taskId = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1).toString() location.taskId =
sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1).toString()
//判断如果是连接状态并处于录像模式,标记为有效点 //判断如果是连接状态并处于录像模式,标记为有效点
if (shareUtil?.connectstate == true && shareUtil?.takeCameraMode == 0) { if (shareUtil?.connectstate == true && shareUtil?.takeCameraMode == 0) {
@ -432,6 +436,23 @@ class MainViewModel @Inject constructor(
mapController.layerManagerHandler.showNiLocationLayer() mapController.layerManagerHandler.showNiLocationLayer()
} }
/**
* 捕捉要素数据
*/
private suspend fun captureItem(point: GeoPoint) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val itemList = realmOperateHelper.queryElement(
GeometryTools.createPoint(
point.longitude,
point.latitude
)
)
if(itemList.size == 1){
}
}
}
/** /**
* 捕获道路和面板 * 捕获道路和面板

View File

@ -6,8 +6,10 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.View.OnClickListener import android.view.View.OnClickListener
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.transition.AutoTransition import androidx.transition.AutoTransition
import androidx.transition.Scene import androidx.transition.Scene
import androidx.transition.TransitionManager import androidx.transition.TransitionManager
@ -15,11 +17,8 @@ import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.FragmentConsoleBinding import com.navinfo.omqs.databinding.FragmentConsoleBinding
import com.navinfo.omqs.ui.activity.map.MainActivity import com.navinfo.omqs.ui.activity.map.MainActivity
import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.fragment.BaseFragment
import com.navinfo.omqs.ui.fragment.evaluationresult.EvaluationResultFragment
import com.navinfo.omqs.ui.fragment.layermanager.LayerManagerFragment import com.navinfo.omqs.ui.fragment.layermanager.LayerManagerFragment
import com.navinfo.omqs.ui.fragment.offlinemap.OfflineMapFragment
import com.navinfo.omqs.ui.fragment.personalcenter.PersonalCenterFragment import com.navinfo.omqs.ui.fragment.personalcenter.PersonalCenterFragment
import com.navinfo.omqs.ui.fragment.qsrecordlist.QsRecordListFragment
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
@ -33,6 +32,8 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
private var mFragment: Fragment? = null private var mFragment: Fragment? = null
private val fragmentId = R.id.console_fragment private val fragmentId = R.id.console_fragment
private val viewModel by viewModels<ConsoleViewModel>()
// 创建a场景 // 创建a场景
private val aScene by lazy { private val aScene by lazy {
Scene.getSceneForLayout( Scene.getSceneForLayout(
@ -72,6 +73,7 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
override fun onTransitionEnd(transition: androidx.transition.Transition) { override fun onTransitionEnd(transition: androidx.transition.Transition) {
initOnClickListener() initOnClickListener()
initLiveData()
} }
override fun onTransitionCancel(transition: androidx.transition.Transition) { override fun onTransitionCancel(transition: androidx.transition.Transition) {
@ -95,6 +97,7 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
override fun onTransitionEnd(transition: androidx.transition.Transition) { override fun onTransitionEnd(transition: androidx.transition.Transition) {
initOnClickListener() initOnClickListener()
initLiveData()
} }
override fun onTransitionCancel(transition: androidx.transition.Transition) { override fun onTransitionCancel(transition: androidx.transition.Transition) {
@ -108,8 +111,26 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
}) })
initOnClickListener() initOnClickListener()
initLiveData()
} }
private fun initLiveData(){
/**
* 任务数量统计
*/
viewModel.liveDataTaskCount.observe(viewLifecycleOwner) {
binding.consoleRoot.findViewById<TextView>(R.id.console_task_count_text).text =
"${it}"
}
/**
* 评测数据数量统计
*/
viewModel.liveDataEvaluationResultCount.observe(viewLifecycleOwner) {
binding.consoleRoot.findViewById<TextView>(R.id.console_evaluation_count_text).text =
"${it}"
}
}
/** /**
* 设置点击事件 * 设置点击事件
@ -195,7 +216,8 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
mFragment = PersonalCenterFragment { mFragment = PersonalCenterFragment {
if (it) { if (it) {
activity?.let { a -> activity?.let { a ->
a.supportFragmentManager.beginTransaction().remove(this).commit() a.supportFragmentManager.beginTransaction().remove(this)
.commit()
(a as MainActivity).showIndoorDataLayout() (a as MainActivity).showIndoorDataLayout()
} }
} else { } else {
@ -210,7 +232,8 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
mFragment = PersonalCenterFragment { mFragment = PersonalCenterFragment {
if (it) { if (it) {
activity?.let { a -> activity?.let { a ->
a.supportFragmentManager.beginTransaction().remove(this).commit() a.supportFragmentManager.beginTransaction().remove(this)
.commit()
(a as MainActivity).showIndoorDataLayout() (a as MainActivity).showIndoorDataLayout()
} }
} else { } else {

View File

@ -0,0 +1,42 @@
package com.navinfo.omqs.ui.fragment.console
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.navinfo.collect.library.data.entity.QsRecordBean
import com.navinfo.collect.library.data.entity.TaskBean
import com.navinfo.omqs.tools.FileManager
import com.navinfo.omqs.util.DateTimeUtil
import dagger.hilt.android.lifecycle.HiltViewModel
import io.realm.Realm
import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class ConsoleViewModel @Inject constructor() : ViewModel() {
/**
* 当前任务量统计
*/
val liveDataTaskCount = MutableLiveData(0)
/**
* 作业数据统计
*/
val liveDataEvaluationResultCount = MutableLiveData(0)
init {
viewModelScope.launch {
val realm = Realm.getDefaultInstance()
val nowTime: Long = DateTimeUtil.getNowDate().time
val beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L
val syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE
val count =
realm.where(TaskBean::class.java).notEqualTo("syncStatus", syncUpload).or()
.between("operationTime", beginNowTime, nowTime)
.equalTo("syncStatus", syncUpload).count()
liveDataTaskCount.postValue(count.toInt())
val count2 = realm.where(QsRecordBean::class.java).count()
liveDataEvaluationResultCount.postValue(count2.toInt())
}
}
}

View File

@ -95,55 +95,6 @@ class TaskViewModel @Inject constructor(
fun getTaskList(context: Context) { fun getTaskList(context: Context) {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
when (val result = networkService.getTaskList(Constant.USER_ID)) {
is NetResult.Success -> {
if (result.data != null) {
val realm = Realm.getDefaultInstance()
realm.executeTransaction {
result.data.obj?.let { list ->
for (index in list.indices) {
val task = list[index]
val item = realm.where(TaskBean::class.java).equalTo(
"id", task.id
).findFirst()
if (item != null) {
task.fileSize = item.fileSize
task.status = item.status
task.currentSize = item.currentSize
task.hadLinkDvoList = item.hadLinkDvoList
//已上传后不在更新操作时间
if (task.syncStatus != FileManager.Companion.FileUploadStatus.DONE) {
//赋值时间,用于查询过滤
task.operationTime = DateTimeUtil.getNowDate().time
}
} else {
//赋值时间,用于查询过滤
task.operationTime = DateTimeUtil.getNowDate().time
}
realm.copyToRealmOrUpdate(task)
}
}
}
}
}
is NetResult.Error<*> -> {
withContext(Dispatchers.Main) {
Toast.makeText(context, "${result.exception.message}", Toast.LENGTH_SHORT)
.show()
}
}
is NetResult.Failure<*> -> {
withContext(Dispatchers.Main) {
Toast.makeText(context, "${result.code}:${result.msg}", Toast.LENGTH_SHORT)
.show()
}
}
is NetResult.Loading -> {}
}
getLocalTaskList() getLocalTaskList()
} }
} }

View File

@ -234,7 +234,7 @@
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="16sp" android:textSize="16sp"
android:visibility="gone" android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/main_activity_geometry" app:layout_constraintBottom_toTopOf="@id/main_activity_bottom_sheet"
app:layout_constraintLeft_toLeftOf="@id/main_activity_top_sign_recyclerview" /> app:layout_constraintLeft_toLeftOf="@id/main_activity_top_sign_recyclerview" />
@ -387,7 +387,7 @@
<View <View
android:id="@+id/main_activity_bottom_sheet" android:id="@+id/main_activity_bottom_sheet"
android:layout_width="60dp" android:layout_width="60dp"
android:layout_height="48dp" android:layout_height="30dp"
android:background="@drawable/baseline_minimize_24" android:background="@drawable/baseline_minimize_24"
android:onClick="@{()->mainActivity.onSwitchSheet()}" android:onClick="@{()->mainActivity.onSwitchSheet()}"
android:paddingBottom="10dp" android:paddingBottom="10dp"

View File

@ -338,7 +338,6 @@
android:layout_marginRight="8dp" android:layout_marginRight="8dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:gravity="center" android:gravity="center"
android:text="共 387 条"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="18sp" android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="@id/console_task_count_bg" app:layout_constraintBottom_toBottomOf="@id/console_task_count_bg"
@ -384,7 +383,6 @@
android:layout_marginRight="8dp" android:layout_marginRight="8dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:gravity="center" android:gravity="center"
android:text="共 387 条"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="18sp" android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="@id/console_evaluation_count_bg" app:layout_constraintBottom_toBottomOf="@id/console_evaluation_count_bg"

View File

@ -343,7 +343,6 @@
android:layout_marginRight="8dp" android:layout_marginRight="8dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:gravity="center" android:gravity="center"
android:text="共 387 条"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="18sp" android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="@id/console_task_count_bg" app:layout_constraintBottom_toBottomOf="@id/console_task_count_bg"
@ -390,7 +389,6 @@
android:layout_marginRight="8dp" android:layout_marginRight="8dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:gravity="center" android:gravity="center"
android:text="共 387 条"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="18sp" android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="@id/console_evaluation_count_bg" app:layout_constraintBottom_toBottomOf="@id/console_evaluation_count_bg"