123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- package com.framework.mvvm.mv
- import android.content.SharedPreferences
- import androidx.core.content.edit
- import androidx.lifecycle.ViewModel
- import androidx.lifecycle.viewModelScope
- import cn.sagacloud.cadengine.OkhttpUtil
- import com.framework.app.DEVICE_ID
- import com.framework.app.IP
- import com.framework.app.pathDownloadMap
- import com.framework.app.timestamp
- import com.framework.mvvm.model.db.entity.task.ObjectEntity
- import com.framework.mvvm.model.repository.AdmRepository
- import com.framework.mvvm.model.vo.AdmRequest
- import com.framework.mvvm.model.vo.FloorInfo
- import com.google.gson.Gson
- import kotlinx.coroutines.Dispatchers
- import kotlinx.coroutines.flow.SharingStarted.Companion.WhileSubscribed
- import kotlinx.coroutines.flow.StateFlow
- import kotlinx.coroutines.flow.flow
- import kotlinx.coroutines.flow.stateIn
- import kotlinx.coroutines.launch
- import kotlinx.coroutines.withContext
- class AdmViewModel(private val repository: AdmRepository) : ViewModel() {
- /**
- * 请求架构数据
- */
- fun requestFrame(request: AdmRequest) {
- viewModelScope.launch {
- repository.requestFrame(request)
- }
- }
- /**
- * 请求字典数据
- */
- fun requestDict(request: AdmRequest) {
- viewModelScope.launch {
- repository.requestDict(request)
- }
- }
- fun requestFrameAndDict(request: AdmRequest, block: (() -> Unit)? = null) {
- viewModelScope.launch {
- repository.requestFrame(request)
- repository.requestDict(request)
- block?.invoke()
- }
- }
- /* 请求建筑数据
- fun requestBuilding(request: AdmRequest, block: ((Building) -> Unit)? = null) {
- viewModelScope.launch(Dispatchers.IO) {
- repository.requestBuilding(request, block)
- val floors = repository.getFloors()
- floors.forEach {
- val strInfo = it.strInfos
- if (!strInfo.isNullOrEmpty() && strInfo.contains("floorMap")) {
- try {
- val info = Json.decodeFromString<FloorInfo>(strInfo)
- val map = info.floorMap
- val floorMap =
- OkhttpUtil.getGzipMap("$IP$pathDownloadMap${map!!}")
- it.floorMap = floorMap
- repository.updateObject(it)
- } catch (e: Exception) {
- println("floor map Exception: $e")
- }
- }
- }
- println("floor map over !!!, floors: ${floors.size}")
- }
- }*/
- /**
- * 上传建筑数据
- */
- fun uploadBuilding(block: (() -> Unit)? = null) {
- viewModelScope.launch(Dispatchers.IO) {
- val buildings = repository.getBuildings()
- for (building in buildings) {
- repository.uploadBuilding(building.projectId!!, building.id)
- }
- withContext(Dispatchers.Main) {
- block?.invoke()
- }
- }
- }
- /**
- * 下载建筑数据
- */
- fun downloadBuilding(sp: SharedPreferences, block: (() -> Unit)? = null) {
- viewModelScope.launch(Dispatchers.IO) {
- val buildings = repository.getBuildings()
- println("downloadBuilding will download : ${buildings.size} $buildings")
- for (building in buildings) {
- repository.requestBuilding(
- AdmRequest(
- userId = "bdtp",
- projectId = building.projectId!!,
- groupCode = "BR",
- buildingId = building.id,
- uploadFlag = sp.getString(DEVICE_ID, "") ?: "",
- lastDownloadTime = sp.getString(timestamp, "") ?: ""
- )
- ) {
- println("downloadBuilding save buildingId and Timestamp -> ${it.buildingId}, ${it.timestamp}")
- sp.edit { putString(it.buildingId, it.timestamp) }
- }
- }
- // 下载地图
- val floors = repository.getFloors()
- floors.forEach {
- val strInfo = it.strInfos
- if (!strInfo.isNullOrEmpty()) {
- try {
- val gson = Gson()
- // val info = Json.decodeFromString<FloorInfo>(strInfo)
- val info = gson.fromJson(strInfo, FloorInfo::class.java)
- val map = info.floorMap
- val floorMap =
- OkhttpUtil.getGzipMap("$IP$pathDownloadMap${map!!}")
- it.floorMap = floorMap
- repository.updateObject(it)
- } catch (e: Exception) {
- println("floor map Exception: $e")
- }
- }
- }
- withContext(Dispatchers.Main) {
- block?.invoke()
- }
- }
- }
- /**
- * 获取建筑数量
- */
- val buildings: StateFlow<List<ObjectEntity>> = flow {
- emit(repository.getBuildings())
- }.stateIn(
- scope = viewModelScope,
- started = WhileSubscribed(5000),
- initialValue = arrayListOf()
- )
- /**
- * 获取本地数据中的建筑信息
- */
- suspend fun getBuildings(): List<ObjectEntity> {
- return repository.getBuildings()
- }
- }
|