bai %!s(int64=3) %!d(string=hai) anos
pai
achega
999a26d6ef

+ 2 - 2
app/src/main/java/com/ys/bdtp/adm/App.kt

@@ -9,7 +9,7 @@ import androidx.compose.ui.platform.LocalContext
 import com.google.accompanist.insets.ProvideWindowInsets
 import com.google.accompanist.systemuicontroller.rememberSystemUiController
 import com.ys.bdtp.adm.app.theme.AdmTheme
-import com.ys.bdtp.adm.mvvm.ui.screen.home.Main
+import com.ys.bdtp.adm.mvvm.ui.screen.home.Home
 import org.kodein.di.compose.onDIContext
 
 @Composable
@@ -33,7 +33,7 @@ fun App() = onDIContext(LocalContext.current) {
                 }
                 //LoginScreen()
                 //MainScreen()
-                Main()
+                Home()
             }
         }
     }

+ 4 - 0
app/src/main/java/com/ys/bdtp/adm/di/Di.kt

@@ -14,6 +14,8 @@ import com.ys.bdtp.adm.mvvm.vm.login.LoginRepository
 import com.ys.bdtp.adm.mvvm.vm.login.LoginViewModel
 import com.ys.bdtp.adm.mvvm.vm.main.MainRepository
 import com.ys.bdtp.adm.mvvm.vm.main.MainViewModel
+import com.ys.bdtp.adm.mvvm.vm.offline.OfflineRepository
+import com.ys.bdtp.adm.mvvm.vm.offline.OfflineViewModel
 import com.ys.bdtp.adm.mvvm.vm.project.ProjectRepository
 import com.ys.bdtp.adm.mvvm.vm.project.ProjectViewModel
 import com.ys.bdtp.adm.mvvm.vm.task.TaskRepository
@@ -93,6 +95,7 @@ val repositoryModule = DI.Module("repository") {
     bind { provider { MainRepository(instance()) } }
     bind { provider { ProjectRepository(instance(), instance()) } }
     bind { provider { TaskRepository(instance(), instance()) } }
+    bind { provider { OfflineRepository(instance(), instance()) } }
 }
 
 val viewModelModule = DI.Module("viewModel") {
@@ -101,6 +104,7 @@ val viewModelModule = DI.Module("viewModel") {
     bind { provider { MainViewModel(instance()) } }
     bind { provider { ProjectViewModel(instance()) } }
     bind { provider { TaskViewModel(instance()) } }
+    bind { provider { OfflineViewModel(instance()) } }
 }
 
 val dbModule = DI.Module("dbModule") {

+ 18 - 14
app/src/main/java/com/ys/bdtp/adm/mvvm/model/Data.kt

@@ -15,8 +15,8 @@ data class Data<out T>(val state: State, val data: T? = null, val msg: String =
             return Data(State.Success, data, "")
         }
 
-        fun <T> failure(msg: String): Data<T> {
-            return Data(State.Failure, null, msg)
+        fun <T> failure(fail: Fail): Data<T> {
+            return Data(State.Failure, null, fail.toString())
         }
 
         fun <T> loading(): Data<T> {
@@ -36,25 +36,29 @@ sealed interface State {
 
 inline fun <ResultType, RequestType> data(
     crossinline fromDb: () -> Flow<ResultType>,
-    crossinline fromNt: suspend () -> RequestType,
-    crossinline onSuccess: suspend (RequestType) -> Unit,
-    crossinline onFailure: (Throwable) -> Unit = {},
-    crossinline isFromNt: (ResultType) -> Boolean = { true }
+    noinline fromNt: suspend () -> Model<RequestType>,
+    crossinline success: suspend (RequestType) -> Unit,
+    crossinline failure: (Fail) -> Unit = {},
+    crossinline needNt: (ResultType) -> Boolean = { true }
 ): Flow<Data<ResultType>> = flow {
     emit(Data.loading())
     val data = fromDb().firstOrNull()
-    val isNt = data == null || isFromNt(data)
+    val isNt = data == null || needNt(data)
 
     val flow = if (!isNt) {
         fromDb().map { Data.success(it) }
     } else {
-        try {
-            onSuccess(fromNt())
-            fromDb().map { Data.success(it) }
-        } catch (e: Exception) {
-            onFailure(e)
-            fromDb().map { Data.failure(e.message ?: "") }
+        when (val response = request(fromNt)) {
+            is SuccessResponse -> {
+                success(response.data)
+                fromDb().map { Data.success(it) }
+            }
+            is FailureResponse -> {
+                failure(response.fail)
+                fromDb().map { Data.failure(response.fail) }
+            }
         }
     }
     emitAll(flow)
-}
+}
+

+ 5 - 5
app/src/main/java/com/ys/bdtp/adm/mvvm/model/nt/Api.kt

@@ -32,31 +32,31 @@ interface Api {
      * 获取字典数据
      */
     @POST("adm-server/adm/dict")
-    suspend fun getDict(): Model<Dict>
+    suspend fun getDict(@Body map: Map<String, String>): Model<Dict>
 
     /**
      * 获取配置信息
      */
     @POST("adm-server/adm/config")
-    suspend fun getConfig(): Model<Config>
+    suspend fun getConfig(@Body map: Map<String, String>): Model<Config>
 
     /**
      * 获取字典数据
      */
     @POST("adm-server/adm/frame")
-    suspend fun getFrame(): Model<Frame>
+    suspend fun getFrame(@Body map: Map<String, String>): Model<Frame>
 
     /**
      * 获取建筑数据
      */
     @POST("adm-server/adm/download")
-    suspend fun getBuilding(): Model<Building>
+    suspend fun getMission(@Body map: Map<String, String>): Model<Mission>
 
     /**
      * 获取关系数据
      */
     @POST("adm-server/adm/downloadObjRel")
-    suspend fun getRelations(): Model<Relation>
+    suspend fun getRelation(@Body map: Map<String, String>): Model<Relation>
 
     /**
      * 判断是否有需要更新的数据

+ 1 - 1
app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/Building.kt

@@ -5,7 +5,7 @@ import com.ys.bdtp.adm.mvvm.model.db.entity.task.*
 /**
  * 建筑数据
  */
-data class Building(
+data class Mission(
     val bdtpDownloadTs: Long,
     val buildingId: String,
     val objects: List<Object>,

+ 21 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/request/Request.kt

@@ -0,0 +1,21 @@
+package com.ys.bdtp.adm.mvvm.model.vo.request
+
+
+/**
+ * 请求参数体
+ */
+fun requestBody(
+    userId: String = "",
+    groupCode: String = "",
+    projectId: String = "",
+    buildingId: String = "",
+    floorId: String = ""
+): Map<String, String> {
+    return mapOf(
+        "userId" to userId,
+        "groupCode" to groupCode,
+        "projectId" to projectId,
+        "buildingId" to buildingId,
+        "floorId" to floorId,
+    )
+}

+ 3 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/examine/Space3DActivity.kt

@@ -20,13 +20,16 @@ import com.google.gson.reflect.TypeToken
 import com.ys.bdtp.adm.R
 import com.ys.bdtp.adm.mvvm.model.vo.Object
 import com.ys.bdtp.adm.mvvm.model.vo.*
+import com.ys.bdtp.adm.mvvm.vm.offline.OfflineViewModel
 import org.kodein.di.DI
 import org.kodein.di.DIAware
 import org.kodein.di.android.closestDI
+import org.kodein.di.instance
 
 class Space3DActivity : ComponentActivity(), DIAware, View.OnClickListener {
 
     override val di: DI by closestDI()
+    val vm by instance<OfflineViewModel>()
     var isLastSpace = false
     var isLockCamera = false
     var meshObject: MeshObjectModel? = null

+ 1 - 1
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/home/Home.kt

@@ -18,7 +18,7 @@ import com.ys.bdtp.adm.mvvm.ui.screen.task.Tasks
 val LocalNavHostController = compositionLocalOf<NavHostController?> { null }
 
 @Composable
-fun Main() {
+fun Home() {
     val navController = rememberNavController()
     CompositionLocalProvider(LocalNavHostController provides navController) {
         NavHost(navController = navController, startDestination = Route.Flash) {

+ 6 - 2
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/offline/Offline.kt

@@ -11,6 +11,7 @@ import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.width
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.tooling.preview.Preview
@@ -18,10 +19,14 @@ import androidx.compose.ui.unit.dp
 import com.ys.bdtp.adm.mvvm.ui.compose.Head
 import com.ys.bdtp.adm.mvvm.ui.compose.HeadRight
 import com.ys.bdtp.adm.mvvm.ui.screen.home.LocalNavHostController
+import com.ys.bdtp.adm.mvvm.vm.offline.OfflineViewModel
+import org.kodein.di.compose.rememberViewModel
 
 @Composable
 fun Offline() {
     val nav = LocalNavHostController.current!!
+    val vm by rememberViewModel<OfflineViewModel>()
+    val scope = rememberCoroutineScope()
     Column(modifier = Modifier.background(Color.White)) {
         Head(
             left = { OfflineHeadLeft(nav) },
@@ -40,9 +45,8 @@ fun Offline() {
                 .background(Color(0xFFEFF0F1))
         )
 
-
         Row {
-            OfflineSide()
+            OfflineSide2()
             Spacer(
                 modifier = Modifier
                     .width(1.dp)

+ 128 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/offline/OfflineSide2.kt

@@ -0,0 +1,128 @@
+package com.ys.bdtp.adm.mvvm.ui.screen.offline
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.*
+import androidx.compose.material.Button
+import androidx.compose.material.ButtonDefaults
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import com.ys.bdtp.adm.app.theme.bgBlueColor
+import com.ys.bdtp.adm.app.theme.underColor
+import com.ys.bdtp.adm.app.theme.whiteColor
+import com.ys.bdtp.adm.mvvm.model.vo.request.requestBody
+import com.ys.bdtp.adm.mvvm.vm.offline.OfflineViewModel
+import kotlinx.coroutines.launch
+import org.kodein.di.compose.rememberViewModel
+
+
+/**
+ * 离线数据左侧UI
+ */
+@Composable
+fun OfflineSide2() {
+    val vm by rememberViewModel<OfflineViewModel>()
+    val scope = rememberCoroutineScope()
+    Column(
+        modifier = Modifier
+            .width(280.dp)
+            .fillMaxHeight()
+            .background(underColor)
+            .padding(vertical = 30.dp),
+        horizontalAlignment = Alignment.CenterHorizontally
+    ) {
+
+        Button(
+            modifier = Modifier.size(220.dp, 42.dp),
+            onClick = {
+                scope.launch {
+                    vm.getDict(
+                        map = requestBody(),
+                        s = {
+
+                        },
+                        f = {
+
+                        }
+                    )
+                }
+            },
+            colors = ButtonDefaults.buttonColors(
+                contentColor = whiteColor,
+                backgroundColor = bgBlueColor
+            ),
+            elevation = ButtonDefaults.elevation(0.dp)
+        ) {
+            Text(text = "全部同步")
+        }
+
+
+        Button(
+            modifier = Modifier.size(220.dp, 42.dp),
+            onClick = {
+
+            },
+            colors = ButtonDefaults.buttonColors(
+                contentColor = whiteColor,
+                backgroundColor = bgBlueColor
+            ),
+            elevation = ButtonDefaults.elevation(0.dp)
+        ) {
+            Text(text = "字典数据")
+        }
+
+        Button(
+            modifier = Modifier.size(220.dp, 42.dp),
+            onClick = {
+
+            },
+            colors = ButtonDefaults.buttonColors(
+                contentColor = whiteColor,
+                backgroundColor = bgBlueColor
+            ),
+            elevation = ButtonDefaults.elevation(0.dp)
+        ) {
+            Text(text = "配置数据")
+        }
+
+        Button(
+            modifier = Modifier.size(220.dp, 42.dp),
+            onClick = {
+
+            },
+            colors = ButtonDefaults.buttonColors(
+                contentColor = whiteColor,
+                backgroundColor = bgBlueColor
+            ),
+            elevation = ButtonDefaults.elevation(0.dp)
+        ) {
+            Text(text = "框架数据")
+        }
+
+
+        Button(
+            modifier = Modifier.size(220.dp, 42.dp),
+            onClick = {
+
+            },
+            colors = ButtonDefaults.buttonColors(
+                contentColor = whiteColor,
+                backgroundColor = bgBlueColor
+            ),
+            elevation = ButtonDefaults.elevation(0.dp)
+        ) {
+            Text(text = "任务数据")
+        }
+    }
+}
+
+
+@Preview
+@Composable
+fun PreviewOfflineSide2() {
+    OfflineSide2()
+}

+ 63 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/offline/OfflineRepository.kt

@@ -0,0 +1,63 @@
+package com.ys.bdtp.adm.mvvm.vm.offline
+
+import com.ys.bdtp.adm.mvvm.model.*
+import com.ys.bdtp.adm.mvvm.model.db.AdmDatabase
+import com.ys.bdtp.adm.mvvm.model.nt.Api
+import com.ys.bdtp.adm.mvvm.model.vo.Config
+import com.ys.bdtp.adm.mvvm.model.vo.Dict
+import com.ys.bdtp.adm.mvvm.model.vo.Frame
+import com.ys.bdtp.adm.mvvm.model.vo.Mission
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.withContext
+
+/**
+ * Offline 数据厂库
+ */
+class OfflineRepository(
+    private val api: Api,
+    private val db: AdmDatabase
+) {
+    /**
+     * 获取字典数据
+     */
+    suspend fun getDict(map: Map<String, String>): Response<Dict> {
+        return withContext(Dispatchers.IO) {
+            request {
+                api.getDict(map)
+            }
+        }
+    }
+
+    /**
+     * 获取配置数据
+     */
+    suspend fun getConfig(map: Map<String, String>): Response<Config> {
+        return withContext(Dispatchers.IO) {
+            request {
+                api.getConfig(map)
+            }
+        }
+    }
+
+    /**
+     * 获取框架数据
+     */
+    suspend fun getFrame(map: Map<String, String>): Response<Frame> {
+        return withContext(Dispatchers.IO) {
+            request {
+                api.getFrame(map)
+            }
+        }
+    }
+
+    /**
+     * 获取任务数据
+     */
+    suspend fun getMission(map: Map<String, String>): Response<Mission> {
+        return withContext(Dispatchers.IO) {
+            request {
+                api.getMission(map)
+            }
+        }
+    }
+}

+ 83 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/offline/OfflineViewModel.kt

@@ -0,0 +1,83 @@
+package com.ys.bdtp.adm.mvvm.vm.offline
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.ys.bdtp.adm.mvvm.model.Fail
+import com.ys.bdtp.adm.mvvm.model.FailureResponse
+import com.ys.bdtp.adm.mvvm.model.SuccessResponse
+import com.ys.bdtp.adm.mvvm.model.vo.Config
+import com.ys.bdtp.adm.mvvm.model.vo.Dict
+import com.ys.bdtp.adm.mvvm.model.vo.Frame
+import com.ys.bdtp.adm.mvvm.model.vo.Mission
+import kotlinx.coroutines.launch
+
+/**
+ * OfflineViewModel
+ */
+class OfflineViewModel(private val repo: OfflineRepository) : ViewModel() {
+
+    /**
+     * 获取任务
+     */
+    fun getMission(map: Map<String, String>, s: (Mission) -> Unit, f: (Fail) -> Unit) {
+        viewModelScope.launch {
+            when (val response = repo.getMission(map)) {
+                is SuccessResponse -> {
+                    s(response.data)
+
+                }
+                is FailureResponse -> {
+                    f(response.fail)
+                }
+            }
+        }
+    }
+
+    /**
+     * 获取配置
+     */
+    fun getConfig(map: Map<String, String>, s: (Config) -> Unit, f: (Fail) -> Unit) {
+        viewModelScope.launch {
+            when (val response = repo.getConfig(map)) {
+                is SuccessResponse -> {
+                    s(response.data)
+                }
+                is FailureResponse -> {
+                    f(response.fail)
+                }
+            }
+        }
+    }
+
+    /**
+     * 获取框架数据
+     */
+    fun getFrame(map: Map<String, String>, s: (Frame) -> Unit, f: (Fail) -> Unit) {
+        viewModelScope.launch {
+            when (val response = repo.getFrame(map)) {
+                is SuccessResponse -> {
+                    s(response.data)
+                }
+                is FailureResponse -> {
+                    f(response.fail)
+                }
+            }
+        }
+    }
+
+    /**
+     * 获取字典
+     */
+    fun getDict(map: Map<String, String>, s: (Dict) -> Unit, f: (Fail) -> Unit) {
+        viewModelScope.launch {
+            when (val response = repo.getDict(map)) {
+                is SuccessResponse -> {
+                    s(response.data)
+                }
+                is FailureResponse -> {
+                    f(response.fail)
+                }
+            }
+        }
+    }
+}