package com.xw.yunwei.ui.task.normal
|
|
import android.annotation.SuppressLint
|
import android.net.Uri
|
import android.os.Bundle
|
import androidx.core.os.bundleOf
|
import androidx.core.view.isVisible
|
import androidx.recyclerview.widget.GridLayoutManager
|
import com.amap.api.location.AMapLocation
|
import com.amap.api.maps.model.LatLng
|
import com.blankj.utilcode.util.UriUtils
|
import com.luck.picture.lib.config.PictureMimeType
|
import com.luck.picture.lib.entity.LocalMedia
|
import com.luck.picture.lib.interfaces.OnResultCallbackListener
|
import com.xw.common.CommonDialog
|
import com.xw.common.base.FileSelectBean
|
import com.xw.common.base.ImageEventListener
|
import com.xw.common.base.ImageSelectAdapter
|
import com.xw.common.base.ShowImgListDialog
|
import com.xw.common.custom.BatteryView.Companion.getBatteryColorByBatteryLife
|
import com.xw.common.utils.BindUtils.getUrls
|
import com.xw.common.utils.GpsHelper
|
import com.xw.common.utils.GpsHelper.Companion.navigate
|
import com.xw.common.utils.ToastUtilCommon
|
import com.xw.yunwei.BR
|
import com.xw.yunwei.BaseBusinessActivity
|
import com.xw.yunwei.databinding.ActivityNormalTaskDetailBinding
|
import com.xw.yunwei.model.TaskNormalModel
|
import com.xw.yunwei.ui.work.car.detail.operations.charge.ChargeCarActivity
|
import com.xw.yunwei.utils.PictureSelectorFactory
|
|
/**
|
* 常规任务详情页面
|
*
|
* 支持展示多种任务类型的详情,包括:
|
* - 待处理:日常检查、车辆充电、车辆整备、洗车、维修、保养、年检、保险、车辆运营资质到期
|
* - 已处理:检测、车辆充电、车辆整备、洗车、维修、保养、年检、保险、车辆运营资质到期
|
*
|
* 页面根据任务状态(待处理/已处理)和任务类型动态展示不同布局,
|
* 并支持图片选择、上传及高德地图导航功能。
|
*/
|
class NormalTaskDetailActivity: BaseBusinessActivity<ActivityNormalTaskDetailBinding, NormalTaskDetailVM>(), GpsHelper.OnMapLocation{
|
override fun getBindingVariable(): Int = BR.viewModel
|
// var gpsHelper: GpsHelper? = null
|
|
override fun myCreate(savedInstanceState: Bundle?) {
|
super.myCreate(savedInstanceState)
|
// gpsHelper = GpsHelper(
|
// this,
|
// this,
|
// isOnceLocation = true,
|
// isAutomatic = true,
|
// savedInstanceState = savedInstanceState
|
// )
|
// lifecycle.addObserver(gpsHelper!!)
|
}
|
|
override fun init() {
|
super.init()
|
// 从 intent 中获取任务 ID
|
viewModel.taskId = intent.getLongExtra("taskId", 0L)
|
}
|
|
/** 标识是否从图片选择页返回,避免 onResume 中重复刷新详情 */
|
var isGetPictureBack = false
|
|
override fun onResume() {
|
super.onResume()
|
if (isGetPictureBack) {
|
isGetPictureBack = false
|
return
|
}
|
// 查询任务详情及子详情
|
viewModel.queryDetail()
|
}
|
|
@SuppressLint("SetTextI18n")
|
override fun setObservable() {
|
super.setObservable()
|
// 监听任务主详情,初始化适配器与按钮文案
|
viewModel.taskDetail.observe(this) {
|
initAdapter(it)
|
// 根据任务类型设置待处理状态下的操作按钮文案
|
viewModel.btnDoingAction.value = when (it.taskTypeId) {
|
"1" -> "开始检查"
|
"2" -> "开始充电"
|
"3" -> "开始整备"
|
"4" -> "完成洗车任务"
|
"5" -> "去送修"
|
"6" -> "完成保养"
|
"7" -> "完成续保"
|
"8" -> "完成年检"
|
"9" -> "完成任务"
|
else -> ""
|
}
|
// 整备和维修任务隐藏详情入口
|
binding.layoutDoing.viewDetail.isVisible = it.taskTypeId !in arrayOf("3", "5")
|
binding.layoutFinish.viewDetail1.isVisible = it.taskTypeId !in arrayOf("3", "5")
|
// 加载任务图片到第一个仅查看适配器
|
it.taskImage?.getUrls()?.let {
|
viewModel.adapters.getOrNull(0)?.setList(it.map { FileSelectBean(url = it, type = "img") })
|
}
|
}
|
// 监听充电任务子详情
|
viewModel.chargeModel.observe(this) {
|
if (viewModel.taskDetail.value?.status == 1) { // 待处理
|
if (it.startOperationsUserId == null) { // 未充电
|
viewModel.showDoingBtn.value = true
|
viewModel.showDoingSlide.value = false
|
} else { // 已充电
|
viewModel.showDoingBtn.value = false
|
viewModel.showDoingSlide.value = true
|
binding.layoutDoing.chargeLayout.batteryViewHis.setBatteryLife(it.startRemainingBattery ?: 0)
|
binding.layoutDoing.chargeLayout.batteryLifeHis.text = "${it.startRemainingBattery}km"
|
binding.layoutDoing.chargeLayout.batteryLifeHis.setTextColor(getBatteryColorByBatteryLife(it.startRemainingBattery ?: 0))
|
}
|
} else if (viewModel.taskDetail.value?.status == 2) { // 已处理
|
binding.layoutFinish.chargeLayout.batteryView1.setBatteryLife(it.startRemainingBattery ?: 0)
|
binding.layoutFinish.chargeLayout.batteryView2.setBatteryLife(it.endRemainingBattery ?: 0)
|
binding.layoutFinish.chargeLayout.batteryLife1.text = "${it.startRemainingBattery ?: 0}km"
|
binding.layoutFinish.chargeLayout.batteryLife2.text = "${it.endRemainingBattery ?: 0}km"
|
binding.layoutFinish.chargeLayout.batteryLife1.setTextColor(getBatteryColorByBatteryLife(it.startRemainingBattery ?: 0))
|
binding.layoutFinish.chargeLayout.batteryLife2.setTextColor(getBatteryColorByBatteryLife(it.endRemainingBattery ?: 0))
|
}
|
|
// 加载充电开始/结束图片
|
it.startChargingPicture?.getUrls()?.let {
|
viewModel.adapters.getOrNull(0)?.setList(it.map { FileSelectBean(url = it, type = "img") })
|
}
|
it.endChargingPicture?.getUrls()?.let {
|
viewModel.adapters.getOrNull(1)?.setList(it.map { FileSelectBean(url = it, type = "img") })
|
}
|
}
|
// 监听洗车任务子详情
|
viewModel.cleanModel.observe(this) {
|
it.taskImage?.getUrls()?.let {
|
viewModel.adapters.getOrNull(0)?.setList(it.map { FileSelectBean(url = it, type = "img") })
|
}
|
}
|
// 监听检测任务子详情
|
viewModel.checkModel.observe(this) {
|
it.sensorCleaningPicture?.getUrls()?.let {
|
viewModel.adapters.getOrNull(0)?.setList(it.map { FileSelectBean(url = it, type = "img") })
|
}
|
it.interactiveScreenPicture?.getUrls()?.let {
|
viewModel.adapters.getOrNull(1)?.setList(it.map { FileSelectBean(url = it, type = "img") })
|
}
|
it.helpButtonPicture?.getUrls()?.let {
|
viewModel.adapters.getOrNull(2)?.setList(it.map { FileSelectBean(url = it, type = "img") })
|
}
|
it.paymentFunctionPicture?.getUrls()?.let {
|
viewModel.adapters.getOrNull(3)?.setList(it.map { FileSelectBean(url = it, type = "img") })
|
}
|
it.systemCheckPicture?.getUrls()?.let {
|
viewModel.adapters.getOrNull(4)?.setList(it.map { FileSelectBean(url = it, type = "img") })
|
}
|
}
|
// 监听整备任务子详情
|
viewModel.maintainModel.observe(this) {
|
it.headLight?.getUrls()?.let {
|
viewModel.adapters.getOrNull(0)?.setList(it.map { FileSelectBean(url = it, type = "img") })
|
}
|
it.turnSignal?.getUrls()?.let {
|
viewModel.adapters.getOrNull(1)?.setList(it.map { FileSelectBean(url = it, type = "img") })
|
}
|
it.brakeLight?.getUrls()?.let {
|
viewModel.adapters.getOrNull(2)?.setList(it.map { FileSelectBean(url = it, type = "img") })
|
}
|
it.fogLight?.getUrls()?.let {
|
viewModel.adapters.getOrNull(3)?.setList(it.map { FileSelectBean(url = it, type = "img") })
|
}
|
it.cabinCleaning?.getUrls()?.let {
|
viewModel.adapters.getOrNull(4)?.setList(it.map { FileSelectBean(url = it, type = "img") })
|
}
|
it.lostItems?.getUrls()?.let {
|
viewModel.adapters.getOrNull(5)?.setList(it.map { FileSelectBean(url = it, type = "img") })
|
}
|
|
}
|
// 监听维修任务子详情
|
viewModel.repairModel.observe(this) {
|
if (viewModel.taskDetail.value?.status == 1) { // 待处理
|
viewModel.isRepair.value = it.sendUserId != null
|
viewModel.btnDoingAction.value = if(it.sendUserId == null) "去送修" else "确认取回车辆"
|
}
|
it.startRepairPicture?.getUrls()?.let {
|
viewModel.adapters.getOrNull(0)?.setList(it.map { FileSelectBean(url = it, type = "img") })
|
}
|
it.repairMoneyDetail?.getUrls()?.let {
|
viewModel.adapters.getOrNull(1)?.setList(it.map { FileSelectBean(url = it, type = "img") })
|
}
|
}
|
}
|
|
override fun setListener() {
|
super.setListener()
|
binding.tvApplyForReassignment.setOnClickListener {
|
viewModel.showApplyForReassignDialog(this)
|
}
|
// 导航按钮:跳转高德地图导航到车辆位置
|
binding.layoutDoing.nav.setOnClickListener {
|
viewModel.taskDetail.value?.let { item ->
|
if ((item.vehicleLat ?: 0.0) != 0.0 && (item.vehicleLon ?: 0.0) != 0.0) {
|
navigate(
|
end = LatLng(item.vehicleLat!!, item.vehicleLon!!),
|
context = this
|
)
|
} else {
|
ToastUtilCommon.showError("数据异常")
|
}
|
}
|
}
|
|
// 滑动完成按钮:充电任务中滑动结束后跳转到充电页面
|
binding.layoutDoing.slideView.setOnSlideCompleteListener{
|
viewModel.taskDetail.value?.let {
|
startActivity(
|
ChargeCarActivity::class.java,
|
bundleOf("carId" to (it.vehicleId ?: 0L), "taskId" to (it.id ?: 0L))
|
)
|
}
|
binding.layoutDoing.slideView.animateReset()
|
}
|
}
|
|
/**
|
* 根据任务状态与类型初始化对应的图片适配器
|
*
|
* @param it 任务详情数据
|
*/
|
private fun initAdapter(it: TaskNormalModel) {
|
if (it.status == 1) { // 待处理
|
if (it.taskTypeId in arrayOf("4", "6", "7", "8", "9")) {
|
// 洗车、保养、年检、保险、资质到期:使用可编辑适配器
|
initEditAdapter()
|
if (it.taskTypeId == "4") {
|
binding.layoutDoing.cleanLayout.rv.adapter = viewModel.adapterCanEdit
|
binding.layoutDoing.cleanLayout.rv.layoutManager = GridLayoutManager(this, 5)
|
} else {
|
binding.layoutDoing.byLayout.rv.adapter = viewModel.adapterCanEdit
|
binding.layoutDoing.byLayout.rv.layoutManager = GridLayoutManager(this, 5)
|
}
|
} else if (it.taskTypeId == "2") { // 充电
|
initOnlyViewAdapter(1)
|
binding.layoutDoing.chargeLayout.rvHis.adapter = viewModel.adapters[0]
|
binding.layoutDoing.chargeLayout.rvHis.layoutManager = GridLayoutManager(this, 5)
|
} else if (it.taskTypeId == "5") { // 维修
|
initOnlyViewAdapter(1)
|
binding.layoutDoing.repairLayout.rv.adapter = viewModel.adapters[0]
|
binding.layoutDoing.repairLayout.rv.layoutManager = GridLayoutManager(this, 5)
|
}
|
} else { // 已处理
|
if (it.taskTypeId in arrayOf("6", "7", "8", "9")) {
|
initOnlyViewAdapter(1)
|
binding.layoutFinish.byLayout.rv.adapter = viewModel.adapters[0]
|
binding.layoutFinish.byLayout.rv.layoutManager = GridLayoutManager(this, 5)
|
} else if (it.taskTypeId == "1") { // 检测
|
initOnlyViewAdapter(5)
|
binding.layoutFinish.checkLayout.rv1.adapter = viewModel.adapters[0]
|
binding.layoutFinish.checkLayout.rv1.layoutManager = GridLayoutManager(this, 5)
|
binding.layoutFinish.checkLayout.rv2.adapter = viewModel.adapters[1]
|
binding.layoutFinish.checkLayout.rv2.layoutManager = GridLayoutManager(this, 5)
|
binding.layoutFinish.checkLayout.rv3.adapter = viewModel.adapters[2]
|
binding.layoutFinish.checkLayout.rv3.layoutManager = GridLayoutManager(this, 5)
|
binding.layoutFinish.checkLayout.rv4.adapter = viewModel.adapters[3]
|
binding.layoutFinish.checkLayout.rv4.layoutManager = GridLayoutManager(this, 5)
|
binding.layoutFinish.checkLayout.rv5.adapter = viewModel.adapters[4]
|
binding.layoutFinish.checkLayout.rv5.layoutManager = GridLayoutManager(this, 5)
|
} else if (it.taskTypeId == "2") { // 充电
|
initOnlyViewAdapter(2)
|
binding.layoutFinish.chargeLayout.rv1.adapter = viewModel.adapters[0]
|
binding.layoutFinish.chargeLayout.rv1.layoutManager = GridLayoutManager(this, 5)
|
binding.layoutFinish.chargeLayout.rv2.adapter = viewModel.adapters[1]
|
binding.layoutFinish.chargeLayout.rv2.layoutManager = GridLayoutManager(this, 5)
|
} else if (it.taskTypeId == "3") { // 整备
|
initOnlyViewAdapter(6)
|
binding.layoutFinish.maintainLayout.rv1.adapter = viewModel.adapters[0]
|
binding.layoutFinish.maintainLayout.rv1.layoutManager = GridLayoutManager(this, 5)
|
binding.layoutFinish.maintainLayout.rv2.adapter = viewModel.adapters[1]
|
binding.layoutFinish.maintainLayout.rv2.layoutManager = GridLayoutManager(this, 5)
|
binding.layoutFinish.maintainLayout.rv3.adapter = viewModel.adapters[2]
|
binding.layoutFinish.maintainLayout.rv3.layoutManager = GridLayoutManager(this, 5)
|
binding.layoutFinish.maintainLayout.rv4.adapter = viewModel.adapters[3]
|
binding.layoutFinish.maintainLayout.rv4.layoutManager = GridLayoutManager(this, 5)
|
binding.layoutFinish.maintainLayout.rv5.adapter = viewModel.adapters[4]
|
binding.layoutFinish.maintainLayout.rv5.layoutManager = GridLayoutManager(this, 5)
|
binding.layoutFinish.maintainLayout.rv6.adapter = viewModel.adapters[5]
|
binding.layoutFinish.maintainLayout.rv6.layoutManager = GridLayoutManager(this, 5)
|
} else if (it.taskTypeId == "4") { // 洗车
|
initOnlyViewAdapter(1)
|
binding.layoutFinish.cleanLayout.rv.adapter = viewModel.adapters[0]
|
binding.layoutFinish.cleanLayout.rv.layoutManager = GridLayoutManager(this, 5)
|
} else if (it.taskTypeId == "5") { // 维修
|
initOnlyViewAdapter(2)
|
binding.layoutFinish.repairLayout.rv1.adapter = viewModel.adapters[0]
|
binding.layoutFinish.repairLayout.rv1.layoutManager = GridLayoutManager(this, 5)
|
binding.layoutFinish.repairLayout.rv2.adapter = viewModel.adapters[1]
|
binding.layoutFinish.repairLayout.rv2.layoutManager = GridLayoutManager(this, 5)
|
}
|
}
|
}
|
|
/** 初始化可编辑图片适配器,支持添加、查看、删除图片 */
|
private fun initEditAdapter() {
|
viewModel.imageEventCanEdit = object : ImageEventListener<FileSelectBean>() {
|
override fun addImage(item: FileSelectBean) {
|
showTypeDialog()
|
}
|
|
override fun viewImage(item: FileSelectBean) {
|
val imgList: MutableList<String> = ArrayList()
|
for (item1 in viewModel.adapterCanEdit.data) {
|
imgList.add(item1.localPath.ifEmpty { item1.url })
|
}
|
ShowImgListDialog(
|
this@NormalTaskDetailActivity,
|
imgList,
|
imgList.indexOf(item.localPath)
|
).show()
|
}
|
|
override fun deleteImage(item: FileSelectBean) {
|
viewModel.adapterCanEdit.remove(item)
|
}
|
}
|
viewModel.adapterCanEdit = ImageSelectAdapter(this, viewModel.maxSize, 1, viewModel.imageEventCanEdit)
|
}
|
|
/**
|
* 初始化仅查看图片适配器
|
*
|
* @param num 需要创建的适配器数量
|
*/
|
private fun initOnlyViewAdapter(num: Int){
|
viewModel.imageEvents.clear()
|
viewModel.adapters.clear()
|
for (index in 0 until num) {
|
val imageEvent = object : ImageEventListener<FileSelectBean>() {
|
override fun viewImage(item: FileSelectBean) {
|
val imgList: MutableList<String> = ArrayList()
|
for (item1 in viewModel.adapters[index].data) {
|
imgList.add(item1.localPath.ifEmpty { item1.url })
|
}
|
ShowImgListDialog(
|
this@NormalTaskDetailActivity,
|
imgList,
|
imgList.indexOf(item.localPath)
|
).show()
|
}
|
}
|
viewModel.imageEvents.add(imageEvent)
|
val adapter = ImageSelectAdapter(this, viewModel.maxSize, 0, imageEvent)
|
viewModel.adapters.add(adapter)
|
}
|
}
|
|
/** 显示选择拍照或相册的弹窗 */
|
private fun showTypeDialog() {
|
CommonDialog.showTypeDialog(this) {
|
isGetPictureBack = it in arrayOf(1, 0)
|
if (it == 0) takeAPhotograph() else if (it == 1) enterGallery()
|
}
|
}
|
|
// 进入图库
|
@SuppressLint("SourceLockedOrientationActivity")
|
private fun enterGallery() {
|
PictureSelectorFactory.enterGallery(
|
this,
|
viewModel.maxSize - viewModel.adapterCanEdit.data.size,
|
resultCallbackListener
|
)
|
}
|
|
// 拍照
|
private fun takeAPhotograph() {
|
PictureSelectorFactory.takeAPhotograph(this, resultCallbackListener)
|
}
|
|
/** 图片选择结果回调 */
|
private var resultCallbackListener = object : OnResultCallbackListener<LocalMedia> {
|
override fun onResult(result: ArrayList<LocalMedia>?) {
|
result?.let { selectList ->
|
val dataList: MutableList<FileSelectBean> = ArrayList()
|
dataList.addAll(viewModel.adapterCanEdit.data)
|
for (item in selectList) {
|
val path: String = item.availablePath
|
// 处理 content Uri,转换为绝对路径
|
var imgPath = if (PictureMimeType.isContent(path) && !item.isCut && !item.isCompressed) {
|
UriUtils.uri2File(Uri.parse(path)).absolutePath
|
} else {
|
path
|
}
|
dataList.add(FileSelectBean(localPath = imgPath, type = "img"))
|
}
|
viewModel.adapterCanEdit.setList(dataList)
|
}
|
}
|
override fun onCancel() {}
|
}
|
|
/**
|
* 高德定位回调
|
*
|
* @param pLocation 定位结果
|
*/
|
override fun location(pLocation: AMapLocation?) {
|
viewModel.location = pLocation
|
}
|
|
}
|