Переглянути джерело

1. 角色名称支持按照后台配置显示
2. 对接消息推送更新接口,支持点对点推送

bjb 3 місяців тому
батько
коміт
c0d74d52be

+ 1 - 1
.idea/deploymentTargetSelector.xml

@@ -4,7 +4,7 @@
     <selectionStates>
       <SelectionState runConfigName="app">
         <option name="selectionMode" value="DROPDOWN" />
-        <DropdownSelection timestamp="2026-01-26T08:36:26.106723Z">
+        <DropdownSelection timestamp="2026-01-28T05:55:40.229413700Z">
           <Target type="DEFAULT_BOOT">
             <handle>
               <DeviceId pluginId="PhysicalDevice" identifier="serial=d8d12db95670c08" />

+ 1 - 1
app/src/main/java/com/iscs/bozzys/api/ApiBean.kt

@@ -54,7 +54,7 @@ class PageRsp<T>(val total: Int, val list: List<T>)
  * @param user  用户信息
  * @param roles 角色信息
  */
-class PermissionRsp(val user: User, val roles: List<String>)
+class PermissionRsp(val user: User, val roles: List<String>,val roleList: List<Role>)
 
 /**
  * 任务统计

+ 10 - 0
app/src/main/java/com/iscs/bozzys/api/ApiRequest.kt

@@ -311,4 +311,14 @@ object ApiRequest {
         return requestApi { api.updateUserProfile(params) }
     }
 
+    /**
+     * 更新消息推送状态
+     *
+     * @param deviceId  消息推送当前设备id
+     * @param isRemove  是否移除消息推送
+     */
+    suspend fun updateMessagePushStatus(deviceId: String, isRemove: Boolean): Result<Response<Boolean>> {
+        return requestApi { api.updateMessagePushStatus(mutableMapOf("type" to (if (isRemove) 1 else 0), "deviceId" to deviceId)) }
+    }
+
 }

+ 10 - 0
app/src/main/java/com/iscs/bozzys/api/ApiService.kt

@@ -270,4 +270,14 @@ interface ApiService {
         @HeaderMap headers: Map<String, String> = ApiRequest.getUserHeaders()
     ): Response<Boolean>
 
+    /**
+     * 更新消息推送状态
+     */
+    @Headers("Content-Type: application/json")
+    @POST("/admin-api/system/user/updateDeviceId")
+    suspend fun updateMessagePushStatus(
+        @Body body: MutableMap<String, Any>,
+        @HeaderMap headers: Map<String, String> = ApiRequest.getUserHeaders()
+    ): Response<Boolean>
+
 }

+ 6 - 0
app/src/main/java/com/iscs/bozzys/api/Role.kt

@@ -0,0 +1,6 @@
+package com.iscs.bozzys.api
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class Role(val name: String = "", val code: String = "")

+ 27 - 0
app/src/main/java/com/iscs/bozzys/ui/pages/vm/VMHome.kt

@@ -2,6 +2,7 @@ package com.iscs.bozzys.ui.pages.vm
 
 import androidx.compose.ui.graphics.Color
 import androidx.lifecycle.viewModelScope
+import com.alibaba.sdk.android.push.noonesdk.PushServiceFactory
 import com.iscs.bozzys.R
 import com.iscs.bozzys.api.ApiRequest
 import com.iscs.bozzys.api.ApiRequest.getResponse
@@ -16,6 +17,7 @@ import com.iscs.bozzys.event.RefreshEventBus
 import com.iscs.bozzys.ui.common.VMBase
 import com.iscs.bozzys.ui.theme.Text
 import com.iscs.bozzys.utils.Storage
+import com.iscs.bozzys.utils.Storage.saveRoleList
 import com.iscs.bozzys.utils.Storage.saveUserAvatar
 import com.iscs.bozzys.utils.isAdmin
 import kotlinx.coroutines.async
@@ -122,6 +124,8 @@ class VMHome : VMBase() {
     fun getHomeTaskData(showLoading: Boolean = false, done: () -> Unit = {}) {
         viewModelScope.launch {
             loading.emit(StateLoading(show = showLoading))
+            // 执行消息推送注册
+            registerPush()
             // 查询权限信息
             val permissionRsp = ApiRequest.getUserPermission().getOrElse { it.getResponse() }
             if (!permissionRsp.code.isCodeOk()) {
@@ -189,6 +193,7 @@ class VMHome : VMBase() {
                 return@launch
             }
             permissionRsp.data?.user?.avatar.saveUserAvatar()
+            permissionRsp.data?.roleList?.saveRoleList()
             _state.value = _state.value.copy(
                 homeTasks = ArrayList(tasksRsp.data?.list ?: emptyList()),
                 messageList = ArrayList(msgRsp.data?.list ?: emptyList()),
@@ -290,6 +295,15 @@ class VMHome : VMBase() {
      */
     fun logout(done: () -> Unit) {
         viewModelScope.launch {
+            val deviceId = PushServiceFactory.getCloudPushService().deviceId
+            // 执行注销消息推送操作
+            if (!deviceId.isNullOrEmpty()) {
+                val rsp = ApiRequest.updateMessagePushStatus(deviceId, true).getOrElse { it.getResponse() }
+                if (!rsp.code.isCodeOk()) {
+                    toast.emit(rsp.msg)
+                    return@launch
+                }
+            }
             ApiRequest.logout().onSuccess {
                 // 清除本地数据
                 Storage.saveLogin(false)
@@ -321,6 +335,19 @@ class VMHome : VMBase() {
         }
     }
 
+    /**
+     * 消息推送注册
+     */
+    private fun registerPush() {
+        viewModelScope.launch {
+            val pushService = PushServiceFactory.getCloudPushService()
+            val deviceId = pushService.deviceId
+            if (deviceId.isNullOrEmpty()) return@launch
+            // 不处理结果
+            ApiRequest.updateMessagePushStatus(deviceId, false)
+        }
+    }
+
 }
 
 /**

+ 5 - 4
app/src/main/java/com/iscs/bozzys/utils/Exts.kt

@@ -4,14 +4,15 @@ package com.iscs.bozzys.utils
  * 获取角色名称
  */
 fun List<String>.getRoleName(): String {
+    val roles = Storage.readRoleList()
     return if (this.contains("super_admin")) {
-        "超级管理员"
+        roles.find { it.code == "super_admin" }?.name ?: ""
     } else if (this.contains("jtdrawer")) {
-        "参与人"
+        roles.find { it.code == "jtdrawer" }?.name ?: ""
     } else if (this.contains("jtlocker")) {
-        "上锁人"
+        roles.find { it.code == "jtlocker" }?.name ?: ""
     } else if (this.contains("jtcolocker")) {
-        "共锁人"
+        roles.find { it.code == "jtcolocker" }?.name ?: ""
     } else {
         ""
     }

+ 22 - 0
app/src/main/java/com/iscs/bozzys/utils/Storage.kt

@@ -1,7 +1,10 @@
 package com.iscs.bozzys.utils
 
 import android.app.Application
+import com.iscs.bozzys.api.Role
 import com.tencent.mmkv.MMKV
+import kotlinx.serialization.encodeToString
+import kotlinx.serialization.json.Json
 
 object Storage {
 
@@ -103,6 +106,25 @@ object Storage {
         return (mmkv.decodeString("user_role", "") ?: "").split(",")
     }
 
+    /**
+     * 保存当前角色列表
+     */
+    fun List<Role>?.saveRoleList(): Boolean {
+        if (this == null) return false
+        val json = Json
+        val str = json.encodeToString(this)
+        return mmkv.encode("role_list", str)
+    }
+
+    /**
+     * 读取当前角色
+     */
+    fun readRoleList(): List<Role> {
+        val str = mmkv.decodeString("role_list", "[]") ?: "[]"
+        val json = Json
+        return json.decodeFromString<List<Role>>(str)
+    }
+
     /**
      * 保存Token生成的向量
      */