AdmViewModel.kt 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package com.framework.mvvm.mv
  2. import android.content.SharedPreferences
  3. import androidx.core.content.edit
  4. import androidx.lifecycle.ViewModel
  5. import androidx.lifecycle.viewModelScope
  6. import cn.sagacloud.cadengine.OkhttpUtil
  7. import com.framework.app.DEVICE_ID
  8. import com.framework.app.IP
  9. import com.framework.app.pathDownloadMap
  10. import com.framework.app.timestamp
  11. import com.framework.mvvm.model.db.entity.task.ObjectEntity
  12. import com.framework.mvvm.model.repository.AdmRepository
  13. import com.framework.mvvm.model.vo.AdmRequest
  14. import com.framework.mvvm.model.vo.FloorInfo
  15. import com.google.gson.Gson
  16. import kotlinx.coroutines.Dispatchers
  17. import kotlinx.coroutines.flow.SharingStarted.Companion.WhileSubscribed
  18. import kotlinx.coroutines.flow.StateFlow
  19. import kotlinx.coroutines.flow.flow
  20. import kotlinx.coroutines.flow.stateIn
  21. import kotlinx.coroutines.launch
  22. import kotlinx.coroutines.withContext
  23. class AdmViewModel(private val repository: AdmRepository) : ViewModel() {
  24. /**
  25. * 请求架构数据
  26. */
  27. fun requestFrame(request: AdmRequest) {
  28. viewModelScope.launch {
  29. repository.requestFrame(request)
  30. }
  31. }
  32. /**
  33. * 请求字典数据
  34. */
  35. fun requestDict(request: AdmRequest) {
  36. viewModelScope.launch {
  37. repository.requestDict(request)
  38. }
  39. }
  40. fun requestFrameAndDict(request: AdmRequest, block: (() -> Unit)? = null) {
  41. viewModelScope.launch {
  42. repository.requestFrame(request)
  43. repository.requestDict(request)
  44. block?.invoke()
  45. }
  46. }
  47. /* 请求建筑数据
  48. fun requestBuilding(request: AdmRequest, block: ((Building) -> Unit)? = null) {
  49. viewModelScope.launch(Dispatchers.IO) {
  50. repository.requestBuilding(request, block)
  51. val floors = repository.getFloors()
  52. floors.forEach {
  53. val strInfo = it.strInfos
  54. if (!strInfo.isNullOrEmpty() && strInfo.contains("floorMap")) {
  55. try {
  56. val info = Json.decodeFromString<FloorInfo>(strInfo)
  57. val map = info.floorMap
  58. val floorMap =
  59. OkhttpUtil.getGzipMap("$IP$pathDownloadMap${map!!}")
  60. it.floorMap = floorMap
  61. repository.updateObject(it)
  62. } catch (e: Exception) {
  63. println("floor map Exception: $e")
  64. }
  65. }
  66. }
  67. println("floor map over !!!, floors: ${floors.size}")
  68. }
  69. }*/
  70. /**
  71. * 上传建筑数据
  72. */
  73. fun uploadBuilding(block: (() -> Unit)? = null) {
  74. viewModelScope.launch(Dispatchers.IO) {
  75. val buildings = repository.getBuildings()
  76. for (building in buildings) {
  77. repository.uploadBuilding(building.projectId!!, building.id)
  78. }
  79. withContext(Dispatchers.Main) {
  80. block?.invoke()
  81. }
  82. }
  83. }
  84. /**
  85. * 下载建筑数据
  86. */
  87. fun downloadBuilding(sp: SharedPreferences, block: (() -> Unit)? = null) {
  88. viewModelScope.launch(Dispatchers.IO) {
  89. val buildings = repository.getBuildings()
  90. println("downloadBuilding will download : ${buildings.size} $buildings")
  91. for (building in buildings) {
  92. repository.requestBuilding(
  93. AdmRequest(
  94. userId = "bdtp",
  95. projectId = building.projectId!!,
  96. groupCode = "BR",
  97. buildingId = building.id,
  98. uploadFlag = sp.getString(DEVICE_ID, "") ?: "",
  99. lastDownloadTime = sp.getString(timestamp, "") ?: ""
  100. )
  101. ) {
  102. println("downloadBuilding save buildingId and Timestamp -> ${it.buildingId}, ${it.timestamp}")
  103. sp.edit { putString(it.buildingId, it.timestamp) }
  104. }
  105. }
  106. // 下载地图
  107. val floors = repository.getFloors()
  108. floors.forEach {
  109. val strInfo = it.strInfos
  110. if (!strInfo.isNullOrEmpty()) {
  111. try {
  112. val gson = Gson()
  113. // val info = Json.decodeFromString<FloorInfo>(strInfo)
  114. val info = gson.fromJson(strInfo, FloorInfo::class.java)
  115. val map = info.floorMap
  116. val floorMap =
  117. OkhttpUtil.getGzipMap("$IP$pathDownloadMap${map!!}")
  118. it.floorMap = floorMap
  119. repository.updateObject(it)
  120. } catch (e: Exception) {
  121. println("floor map Exception: $e")
  122. }
  123. }
  124. }
  125. withContext(Dispatchers.Main) {
  126. block?.invoke()
  127. }
  128. }
  129. }
  130. /**
  131. * 获取建筑数量
  132. */
  133. val buildings: StateFlow<List<ObjectEntity>> = flow {
  134. emit(repository.getBuildings())
  135. }.stateIn(
  136. scope = viewModelScope,
  137. started = WhileSubscribed(5000),
  138. initialValue = arrayListOf()
  139. )
  140. /**
  141. * 获取本地数据中的建筑信息
  142. */
  143. suspend fun getBuildings(): List<ObjectEntity> {
  144. return repository.getBuildings()
  145. }
  146. }