feat(chat): 添加群聊右侧导航抽屉和健康档案功能

- 集成 androidx.drawerlayout:drawerlayout:1.2.0 依赖
- 新增 chat_activity_with_navigation.xml 布局文件实现抽屉布局
- 新增 chat_navigation_header.xml 头部布局显示群成员信息
- 在 TUIBaseChatActivity 中实现抽屉打开关闭功能
- 修改 InputView 中的群视频通话逻辑,针对特定包名使用新方案
- 添加 ProposalBean 数据模型用于健康档案信息
- 实现 ProposalActivity 页面展示患者健康档案详情
- 添加 EmergencyApi 接口获取健康档案数据
- 在 HomeFragment 中增加登录验证跳转健康档案页面
- 完善群聊界面右滑抽屉显示群成员列表功能
This commit is contained in:
2026-07-15 17:50:27 +08:00
parent b29c46b906
commit 7cca7e0b79
7 changed files with 1479 additions and 904 deletions
@@ -58,3 +58,70 @@ data class HomeBankBean(
val totalPoints: String? val totalPoints: String?
) )
data class ProposalBean(
val id: String,
val empId: String,
val name: String,
val age: Int,
val sexCode: String?,
val workUnit: String?,
val careLiaisonName: String?,
val idNo: String,
val phone: String,
val careStatus: String,
val dataLevel: Int,
val negativeList: String,
val caseInfo: String,
val riskLevel: String,
val year: String,
val flagFat: Int,
val bmi: String,
val height: String,
val weight: String,
val targetWeight: String,
val targetBmi: String,
val bmiCurrent: String,
val waistNew: String,
val bodyFatPercentNew: String,
val weightRiskType: String,
val hypertension: Int,
val systolicPressureAvg: String,
val systolicPressureTarget: String,
val diastolicPressureAvg: String,
val diastolicPressureTarget: String,
val diabetes: Int,
val glu: String,
val bloodSugarTarget: String,
val ldl: String,
val ldlTarget: String,
val tc: String,
val tcTarget: String,
val tg: String,
val tgTarget: String,
val uricAcid: String,
val uricAcidTarget: String,
val homocysteine: String,
val homocysteineTarget: String,
val bloodK: String,
val chd: String,
val cvd: String,
val af: String,
val ca: String,
val indicatorListStr: String,
val indicatorListStrOrigin: String,
val screeningProjects: String,
val treatPlan: String,
val treatPlanResponse: String,
val dietSuggestion: String,
val dietSuggestionResponse: String,
val sportGuide: String,
val sportGuideResponse: String,
val lifeManage: String,
val lifeManageResponse: String,
val cabinOpinion: String,
val cabinOpinionTime: String,
val cabinOpinionUserName: String,
val expertOpinion: String,
val expertOpinionTime: String,
val expertOpinionUserName: String
)
@@ -8,6 +8,7 @@ import com.xjjk.healthyclients.bean.emergency.HospitalBean
import com.xjjk.healthyclients.bean.emergency.LocationResourceBean import com.xjjk.healthyclients.bean.emergency.LocationResourceBean
import com.xjjk.healthyclients.bean.emergency.OrderThroughBean import com.xjjk.healthyclients.bean.emergency.OrderThroughBean
import com.xjjk.healthyclients.bean.emergency.initUserOrderPageBean import com.xjjk.healthyclients.bean.emergency.initUserOrderPageBean
import com.xjjk.healthyclients.bean.home.ProposalBean
import com.xjjk.healthyclients.data.bean.ApiResponse import com.xjjk.healthyclients.data.bean.ApiResponse
import okhttp3.RequestBody import okhttp3.RequestBody
import retrofit2.http.Body import retrofit2.http.Body
@@ -82,5 +83,10 @@ interface EmergencyApi {
*/ */
@GET("/health-emergency/api/emergency/createGroupMag") @GET("/health-emergency/api/emergency/createGroupMag")
suspend fun getIMGroupInfo(@QueryMap params: MutableMap<String, Any?>): ApiResponse<EmergencyGroupInfo> suspend fun getIMGroupInfo(@QueryMap params: MutableMap<String, Any?>): ApiResponse<EmergencyGroupInfo>
/**
* 获取一人一案
*/
@GET("/health-emergency/emergency/LargeScreenNew/onePersonCase")
suspend fun getProposalInfo(): ApiResponse<ProposalBean>
} }
@@ -11,6 +11,7 @@ import com.xjjk.healthyclients.bean.emergency.HospitalBean
import com.xjjk.healthyclients.bean.emergency.LocationResourceBean import com.xjjk.healthyclients.bean.emergency.LocationResourceBean
import com.xjjk.healthyclients.bean.emergency.OrderThroughBean import com.xjjk.healthyclients.bean.emergency.OrderThroughBean
import com.xjjk.healthyclients.bean.emergency.initUserOrderPageBean import com.xjjk.healthyclients.bean.emergency.initUserOrderPageBean
import com.xjjk.healthyclients.bean.home.ProposalBean
import com.xjjk.healthyclients.data.api.EmergencyApi import com.xjjk.healthyclients.data.api.EmergencyApi
import com.xjjk.healthyclients.data.bean.ApiResponse import com.xjjk.healthyclients.data.bean.ApiResponse
import com.xjjk.healthyclients.retrofit.RetrofitManager import com.xjjk.healthyclients.retrofit.RetrofitManager
@@ -107,8 +108,6 @@ object EmergencyRepository : BaseRepository() {
return CommonRepository.getCommonSettingMenuList("category") return CommonRepository.getCommonSettingMenuList("category")
} }
suspend fun getIMGroupInfo(groupName: String, longitude: Double, suspend fun getIMGroupInfo(groupName: String, longitude: Double,
latitude: Double): ApiResponse<EmergencyGroupInfo> { latitude: Double): ApiResponse<EmergencyGroupInfo> {
var map = mutableMapOf<String, Any?>() var map = mutableMapOf<String, Any?>()
@@ -118,4 +117,7 @@ object EmergencyRepository : BaseRepository() {
return apiCall { service.getIMGroupInfo(map) } return apiCall { service.getIMGroupInfo(map) }
} }
suspend fun getProposalInfo(): ApiResponse<ProposalBean> {
return apiCall { service.getProposalInfo() }
}
} }
@@ -209,9 +209,13 @@ class HomeFragment :
} }
R.id.img_right -> { R.id.img_right -> {
val bundle = Bundle() if (DataStoreManager.isLogin()) {
bundle.putString("title", "一人一案") val bundle = Bundle()
toActivity(ProposalActivity::class.java, bundle) bundle.putString("title", "一人一案")
toActivity(ProposalActivity::class.java, bundle)
} else {
startLoginActivity(requireContext())
}
} }
R.id.home_head_tab1 -> { R.id.home_head_tab1 -> {
@@ -2,10 +2,16 @@ package com.xjjk.healthyclients.ui.activity
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.xjjk.healthyclients.R import com.xjjk.healthyclients.R
import com.xjjk.healthyclients.base.BaseVMBActivity import com.xjjk.healthyclients.base.BaseVMBActivity
import com.xjjk.healthyclients.bean.home.ProposalBean
import com.xjjk.healthyclients.databinding.ActivityProposalBinding import com.xjjk.healthyclients.databinding.ActivityProposalBinding
import com.xjjk.healthyclients.ui.viewmodel.ProposalViewModel import com.xjjk.healthyclients.ui.viewmodel.ProposalViewModel
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
/** /**
* 一人一案(健康档案)页面 * 一人一案(健康档案)页面
@@ -20,6 +26,83 @@ class ProposalActivity :
override fun initData() { override fun initData() {
// 加载健康档案数据 // 加载健康档案数据
}
override fun createObserve() {
super.createObserve()
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.CREATED) {
mViewModel.proposalInfo.collectLatest {
setProposalInfo(it)
}
}
}
}
private fun setProposalInfo(proposalBean: ProposalBean?) {
proposalBean?.let {
// 患者信息
mBinding.tvPatientName.text = it.name
mBinding.tvPatientGenderAge.text = it.sexCode + " · " + it.age
mBinding.tvDocumentStatus.text = it.careStatus
mBinding.tvPatientCompany.text = it.workUnit
mBinding.tvIdNumber.text = it.idNo
mBinding.tvPhone.text = it.phone
// 关爱管理信息
mBinding.tvLevel.text = it.dataLevel.toString()
mBinding.tvLiaisonName.text = it.careLiaisonName
mBinding.tvNegativeList.text = it.negativeList
// 档案与标签
mBinding.tvFlagFat.text = it.flagFat.toString()
mBinding.tvWeight.text = it.weight
mBinding.tvHeight.text = it.height
mBinding.tvBmi.text = it.bmiCurrent
mBinding.tvStandardWeight.text = it.targetWeight
// 心血管健康
mBinding.tvBloodPressure.text = it.hypertension.toString()
mBinding.tvSystolicAvg.text = it.systolicPressureAvg
mBinding.tvSystolicTarget.text = it.systolicPressureTarget
mBinding.tvSystolic.text = it.systolicPressureAvg
mBinding.tvDiastolicAvg.text = it.diastolicPressureAvg
mBinding.tvDiastolicTarget.text = it.diastolicPressureTarget
mBinding.tvDiastolic.text = it.diastolicPressureAvg
// 代谢指标
mBinding.tvDiabetes.text = it.diabetes.toString()
mBinding.llDiabetesTag.visibility = if (it.diabetes != 0) View.VISIBLE else View.GONE
mBinding.tvFbsValue.text = it.glu
mBinding.tvFbsTarget.text = it.bloodSugarTarget
mBinding.tvFbsCurrent.text = it.glu
// 血脂四项
mBinding.tvTcValue.text = it.tc
mBinding.tvTcTarget.text = it.tcTarget
mBinding.tvTcCurrent.text = it.tc
mBinding.tvTgValue.text = it.tg
mBinding.tvTgTarget.text = it.tgTarget
mBinding.tvTgCurrent.text = it.tg
mBinding.tvLdlValue.text = it.ldl
mBinding.tvLdlTarget.text = it.ldlTarget
mBinding.tvLdlCurrent.text = it.ldl
// 肾脏与骨骼代谢
mBinding.tvUaValue.text = it.uricAcid
mBinding.tvUaTarget.text = it.uricAcidTarget
mBinding.tvUaCurrent.text = it.uricAcid
// 特殊代谢指标
mBinding.tvHcyValue.text = it.homocysteine
mBinding.tvHcyTarget.text = it.homocysteineTarget
mBinding.tvHcyCurrent.text = it.homocysteine
// 医疗意见与记录
mBinding.tvCabinTime.text = it.cabinOpinionTime
mBinding.tvCabinReporter.text = it.cabinOpinionUserName
mBinding.tvDoctorTime.text = it.expertOpinionTime
mBinding.tvDoctorReporter.text = it.expertOpinionUserName
}
} }
override fun bindEvent() { override fun bindEvent() {
@@ -1,13 +1,32 @@
package com.xjjk.healthyclients.ui.viewmodel package com.xjjk.healthyclients.ui.viewmodel
import com.xjjk.healthyclients.base.viewmodel.BaseViewModel import com.xjjk.healthyclients.base.viewmodel.BaseViewModel
import com.xjjk.healthyclients.bean.home.ProposalBean
import com.xjjk.healthyclients.data.repository.EmergencyRepository
import com.xjjk.healthyclients.superfuntion.handleRequest
import com.xjjk.healthyclients.superfuntion.launch
import kotlinx.coroutines.flow.MutableStateFlow
/** /**
* 一人一案(健康档案)ViewModel * 一人一案(健康档案)ViewModel
*/ */
class ProposalViewModel : BaseViewModel() { class ProposalViewModel : BaseViewModel() {
var proposalInfo = MutableStateFlow<ProposalBean?>(null)
override fun init() { override fun init() {
// 初始化逻辑 // 初始化逻辑
getProposalInfo()
}
fun getProposalInfo() {
launch({
handleRequest(
EmergencyRepository.getProposalInfo(),
successBlock = {
it.result?.let { it1 ->
proposalInfo.emit(it1)
}
})
})
} }
} }
File diff suppressed because it is too large Load Diff