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

增加任务和作业数据统计
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) {
Log.e("jingo", "下载线程 ${taskBean.id}")
if (!scopeMap.containsKey(taskBean.id)) {
scopeMap[taskBean.id] = TaskDownloadScope(this, taskBean)
}
@ -114,7 +113,6 @@ class TaskDownloadManager constructor(
fun observer(
id: Int, lifecycleOwner: LifecycleOwner, observer: Observer<TaskBean>
) {
Log.e("jingo", "监听线程 ${id}")
if (scopeMap.containsKey(id)) {
scopeMap[id]!!.observer(lifecycleOwner, observer)
}

View File

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

View File

@ -9,6 +9,7 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.blankj.utilcode.util.ResourceUtils
import com.navinfo.collect.library.data.entity.TaskBean
import com.navinfo.omqs.Constant
import com.navinfo.omqs.bean.LoginUserBean
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.NetworkService
import com.navinfo.omqs.tools.FileManager
import com.navinfo.omqs.util.DateTimeUtil
import com.navinfo.omqs.util.NetUtils
import dagger.hilt.android.lifecycle.HiltViewModel
import io.realm.Realm
@ -37,6 +39,11 @@ enum class LoginStatus {
*/
LOGIN_STATUS_NET_OFFLINE_MAP,
/**
* 访问任务列表
*/
LOGIN_STATUS_NET_GET_TASK_LIST,
/**
* 初始化文件夹
*/
@ -108,11 +115,12 @@ class LoginViewModel @Inject constructor(
val userCodeCache = sharedPreferences?.getString("userCode", null)
val userRealName = sharedPreferences?.getString("userRealName", null)
//增加缓存记录,不用每次连接网络登录
if (userNameCache != null && passwordCache != null && userCodeCache != null&&userRealName!=null) {
if (userNameCache != null && passwordCache != null && userCodeCache != null && userRealName != null) {
if (userNameCache == userName && passwordCache == password) {
viewModelScope.launch(Dispatchers.IO) {
createUserFolder(context, userCodeCache,userRealName)
loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS)
createUserFolder(context, userCodeCache, userRealName)
getOfflineCityList(context)
// loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS)
}
return
}
@ -156,6 +164,14 @@ class LoginViewModel @Inject constructor(
} else {
userCode = defaultUserResponse.obj?.userCode.toString()
userRealName = defaultUserResponse.obj?.userName.toString()
folderInit(
context = context,
userName = userName,
password = password,
userCode = userCode,
userRealName = userRealName
)
getOfflineCityList(context)
}
} else {
withContext(Dispatchers.Main) {
@ -197,21 +213,13 @@ class LoginViewModel @Inject constructor(
else -> {}
}
//文件夹初始化
try {
loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_INIT)
sharedPreferences?.edit()?.putString("userName", userName)?.commit()
sharedPreferences?.edit()?.putString("passWord", password)?.commit()
sharedPreferences?.edit()?.putString("userCode", userCode)?.commit()
sharedPreferences?.edit()?.putString("userRealName", userRealName)?.commit()
}
createUserFolder(context, userCode,userRealName)
} catch (e: IOException) {
loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_FAILURE)
}
/**
* 获取离线地图
*/
private suspend fun getOfflineCityList(context: Context) {
//假装解压文件等
delay(1000)
loginStatus.postValue(LoginStatus.LOGIN_STATUS_NET_OFFLINE_MAP)
when (val result = networkService.getOfflineMapCityList()) {
is NetResult.Success -> {
@ -222,6 +230,7 @@ class LoginViewModel @Inject constructor(
}
roomAppDatabase.getOfflineMapDao().insertOrUpdate(result.data)
}
getTaskList(context)
}
is NetResult.Error<*> -> {
@ -229,6 +238,7 @@ class LoginViewModel @Inject constructor(
Toast.makeText(context, "${result.exception.message}", Toast.LENGTH_SHORT)
.show()
}
getTaskList(context)
}
is NetResult.Failure<*> -> {
@ -236,18 +246,101 @@ class LoginViewModel @Inject constructor(
Toast.makeText(context, "${result.code}:${result.msg}", Toast.LENGTH_SHORT)
.show()
}
getTaskList(context)
}
is NetResult.Loading -> {}
else -> {}
}
loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS)
}
/**
* 获取任务列表
*/
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 {
loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_INIT)
sharedPreferences?.edit()?.putString("userName", userName)?.commit()
sharedPreferences?.edit()?.putString("passWord", password)?.commit()
sharedPreferences?.edit()?.putString("userCode", userCode)?.commit()
sharedPreferences?.edit()?.putString("userRealName", userRealName)?.commit()
createUserFolder(context, userCode, userRealName)
} catch (e: IOException) {
loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_FAILURE)
}
}
/**
* 创建用户目录
*/
private fun createUserFolder(context: Context, userId: String,userRealName:String) {
private fun createUserFolder(context: Context, userId: String, userRealName: String) {
Constant.IS_VIDEO_SPEED = false
Constant.USER_ID = userId
Constant.USER_REAL_NAME = userRealName

View File

@ -59,6 +59,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.locationtech.jts.geom.Point
import org.oscim.core.GeoPoint
import org.oscim.core.MapPosition
import org.oscim.layers.marker.MarkerItem
@ -215,6 +216,8 @@ class MainViewModel @Inject constructor(
//线选择状态
if (bSelectRoad) {
captureLink(point)
} else {
captureItem(point)
}
}
}
@ -369,7 +372,7 @@ class MainViewModel @Inject constructor(
GeometryToolsKt.getTileYByGeometry(geometry.toString(), tileY)
//遍历存储tile对应的x与y的值
tileX.forEach { x ->
tileX.forEach { x ->
tileY.forEach { y ->
location.tilex = x
location.tiley = y
@ -382,10 +385,11 @@ 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) {
location.media = 1
}
var disance = 0.0
@ -432,6 +436,23 @@ class MainViewModel @Inject constructor(
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.OnClickListener
import android.view.ViewGroup
import android.widget.TextView
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.transition.AutoTransition
import androidx.transition.Scene
import androidx.transition.TransitionManager
@ -15,11 +17,8 @@ import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.FragmentConsoleBinding
import com.navinfo.omqs.ui.activity.map.MainActivity
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.offlinemap.OfflineMapFragment
import com.navinfo.omqs.ui.fragment.personalcenter.PersonalCenterFragment
import com.navinfo.omqs.ui.fragment.qsrecordlist.QsRecordListFragment
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
@ -33,6 +32,8 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
private var mFragment: Fragment? = null
private val fragmentId = R.id.console_fragment
private val viewModel by viewModels<ConsoleViewModel>()
// 创建a场景
private val aScene by lazy {
Scene.getSceneForLayout(
@ -72,6 +73,7 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
override fun onTransitionEnd(transition: androidx.transition.Transition) {
initOnClickListener()
initLiveData()
}
override fun onTransitionCancel(transition: androidx.transition.Transition) {
@ -95,6 +97,7 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
override fun onTransitionEnd(transition: androidx.transition.Transition) {
initOnClickListener()
initLiveData()
}
override fun onTransitionCancel(transition: androidx.transition.Transition) {
@ -108,8 +111,26 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
})
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}"
}
}
/**
* 设置点击事件
@ -193,12 +214,13 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
R.id.console_personal_center_bg, R.id.console_personal_center_icon_bg -> {
if (sceneFlag) {
mFragment = PersonalCenterFragment {
if(it){
if (it) {
activity?.let { a ->
a.supportFragmentManager.beginTransaction().remove(this).commit()
a.supportFragmentManager.beginTransaction().remove(this)
.commit()
(a as MainActivity).showIndoorDataLayout()
}
}else{
} else {
TransitionManager.go(aScene, aTransition)
}
@ -208,12 +230,13 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
} else {
if (mFragment !is PersonalCenterFragment) {
mFragment = PersonalCenterFragment {
if(it){
if (it) {
activity?.let { a ->
a.supportFragmentManager.beginTransaction().remove(this).commit()
a.supportFragmentManager.beginTransaction().remove(this)
.commit()
(a as MainActivity).showIndoorDataLayout()
}
}else{
} else {
TransitionManager.go(aScene, aTransition)
}
}

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) {
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()
}
}

View File

@ -234,7 +234,7 @@
android:textColor="@color/white"
android:textSize="16sp"
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" />
@ -387,7 +387,7 @@
<View
android:id="@+id/main_activity_bottom_sheet"
android:layout_width="60dp"
android:layout_height="48dp"
android:layout_height="30dp"
android:background="@drawable/baseline_minimize_24"
android:onClick="@{()->mainActivity.onSwitchSheet()}"
android:paddingBottom="10dp"

View File

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

View File

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