diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/TicketModel.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/TicketModel.kt index 8f5bfce84e..c414506cbe 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/TicketModel.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/TicketModel.kt @@ -38,9 +38,9 @@ object TicketModel : IOchOnMessageListener{ private const val SELECTWRITEOFFCOUNT = "SELECTWRITEOFFCOUNT" - private var emitterMain: ObservableEmitter?=null + private var emitterMain: ObservableEmitter>?=null - private val observable = Observable.create(ObservableOnSubscribe { emitter -> emitterMain = emitter }) + private val observable = Observable.create(ObservableOnSubscribe> { emitter -> emitterMain = emitter }) private val writeOffMsg = object : ILanMessageListener { override fun targetLan(): Class = WriteOffMsg::class.java @@ -107,7 +107,7 @@ object TicketModel : IOchOnMessageListener{ object : OchCommonServiceCallback { override fun onSuccess(data: WriteOffCountResponse?) { data?.data?.let { - emitterMain?.onNext(it) + emitterMain?.onNext(Pair(firstStation.siteId,it)) d(SceneConstant.M_BUS + TAG, "${firstStation.name}核销人数:${it}") OchChainLogManager.writeChainLog("核销人数","任务:${currentTask.taskId} zhan'dian") } @@ -121,11 +121,11 @@ object TicketModel : IOchOnMessageListener{ } } - emitterMain?.onNext(0) + emitterMain?.onNext(Pair(0,0)) d(SceneConstant.M_BUS + TAG, "线路或者站点未空") } - fun getWriteOffCountObservable():Observable{ + fun getWriteOffCountObservable():Observable>{ return observable } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/TaskRunningAdapter.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/TaskRunningAdapter.kt index cb1404fe9c..f0b932e176 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/TaskRunningAdapter.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/TaskRunningAdapter.kt @@ -14,6 +14,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.och.common.module.utils.ResourcesUtils import com.mogo.och.data.bean.BusStationBean import com.mogo.och.shuttle.weaknet.R +import com.mogo.och.weaknet.model.LineModel import com.mogo.och.weaknet.ui.writeoff.WriteOffView import me.jessyan.autosize.utils.AutoSizeUtils @@ -28,7 +29,6 @@ class TaskRunningAdapter( companion object{ const val TAG = "TaskRunningAdapter" } - private var startStationIndex:Int = -1 private val argbEvaluator: ArgbEvaluator = ArgbEvaluator() private val startColor = ResourcesUtils.getColor(R.color.shuttle_driver_1970FF) @@ -37,14 +37,13 @@ class TaskRunningAdapter( private val halfHeight = 16.5f private var totalHeight = 0f - fun setDataList(dataList: List, startStationIndex:Int) { - this.startStationIndex = startStationIndex + fun setDataList(dataList: List) { this.mData.clear() this.mData.addAll(dataList) - if(startStationIndex==0){ + if(LineModel.startStationIndex==0){ totalHeight = 33 + (dataList.size-2)*heightItem }else{ - totalHeight = (halfHeight+(dataList.size-1-startStationIndex)*heightItem).toFloat() + totalHeight = (halfHeight+(dataList.size-1-LineModel.startStationIndex)*heightItem).toFloat() } notifyItemRangeChanged(0,dataList.size,true) } @@ -63,6 +62,8 @@ class TaskRunningAdapter( val currentPosition = holder.bindingAdapterPosition val line = mData[currentPosition] holder.actvStationName.text = line.name + holder.actvWriteOffCount.setSiteId(line.siteId) + val startStationIndex = LineModel.startStationIndex if (startStationIndex>0) { CallerLogger.d(TAG, "位置:$currentPosition 当前站${mData[startStationIndex]} ") } @@ -70,14 +71,16 @@ class TaskRunningAdapter( if(currentPosition=2 }?.let { actv_running_task_last_station.text = "往${it.last().name ?: ""}" - mAdapter.setDataList(it,LineModel.startStationIndex) + mAdapter.setDataList(it) CallerLogger.d(TAG,"BusLineModel.startStationIndex:${LineModel.startStationIndex}___$it") val currentStation = it.get(LineModel.startStationIndex) if(currentStation.isLeaving){ diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/writeoff/WriteOffView.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/writeoff/WriteOffView.kt index f81be538fb..a1d8b41958 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/writeoff/WriteOffView.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/writeoff/WriteOffView.kt @@ -2,13 +2,14 @@ package com.mogo.och.weaknet.ui.writeoff import android.content.Context import android.util.AttributeSet -import android.view.LayoutInflater import androidx.appcompat.widget.AppCompatTextView -import androidx.constraintlayout.widget.ConstraintLayout import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner +import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.env.ProjectUtils +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.och.shuttle.weaknet.R -import kotlinx.android.synthetic.main.shuttle_weak_wirte_off_view.view.tv_write_off_count class WriteOffView : AppCompatTextView, WriteOffViewModel.IwriteOffViewCallback { @@ -22,10 +23,16 @@ class WriteOffView : AppCompatTextView, WriteOffViewModel.IwriteOffViewCallback private var viewModel:WriteOffViewModel? = null + private var siteId:Int = 0 + override fun onAttachedToWindow() { super.onAttachedToWindow() - + if(ProjectUtils.isDali()&& AppIdentityModeUtils.isShuttleDriver(FunctionBuildConfig.appIdentityMode)) { + val showText = + AbsMogoApplication.getApp().getString(R.string.shuttle_write_off_count,0) + text = showText + } viewModel = findViewTreeViewModelStoreOwner()?.let { ViewModelProvider(it).get(WriteOffViewModel::class.java) } @@ -38,6 +45,11 @@ class WriteOffView : AppCompatTextView, WriteOffViewModel.IwriteOffViewCallback private fun stopListenerWriteOff(){ viewModel?.setWriteOffCallback(null) visibility = GONE + if(ProjectUtils.isDali()&& AppIdentityModeUtils.isShuttleDriver(FunctionBuildConfig.appIdentityMode)) { + val showText = + AbsMogoApplication.getApp().getString(R.string.shuttle_write_off_count, 0) + text = showText + } } override fun onVisibilityAggregated(isVisible: Boolean) { @@ -57,8 +69,14 @@ class WriteOffView : AppCompatTextView, WriteOffViewModel.IwriteOffViewCallback } } - override fun setWriteOffCount(showText: String) { - text = showText + override fun setWriteOffCount(showText: String,siteId: Int) { + if(this.siteId==siteId) { + text = showText + } + } + + fun setSiteId(siteId: Int) { + this.siteId = siteId } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/writeoff/WriteOffViewModel.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/writeoff/WriteOffViewModel.kt index 4eafb93ba8..5f75e85334 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/writeoff/WriteOffViewModel.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/writeoff/WriteOffViewModel.kt @@ -24,7 +24,7 @@ class WriteOffViewModel : ViewModel() { private var disposable: Disposable? = null - private val observer = object : Observer { + private val observer = object : Observer> { override fun onSubscribe(d: Disposable) { disposable = d } @@ -37,21 +37,24 @@ class WriteOffViewModel : ViewModel() { } - override fun onNext(countInfo: String) { - viewCallback?.setWriteOffCount(countInfo) + override fun onNext(countInfo: Pair) { + viewCallback?.setWriteOffCount(countInfo.first,countInfo.second) } } fun setWriteOffCallback(viewCallback: IwriteOffViewCallback?) { this.viewCallback = viewCallback + if(viewCallback==null){ + RxUtils.disposeSubscribe(disposable) + } TicketModel .getWriteOffCountObservable() .flatMap { t -> val showText = - AbsMogoApplication.getApp().getString(R.string.shuttle_write_off_count, t) + AbsMogoApplication.getApp().getString(R.string.shuttle_write_off_count, t.second) CallerLogger.d(SceneConstant.M_BUS + TAG, "显示文案:${showText}") - Observable.just(showText) + Observable.just(Pair(showText,t.first)) } .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer) @@ -64,7 +67,7 @@ class WriteOffViewModel : ViewModel() { } interface IwriteOffViewCallback { - fun setWriteOffCount(count:String) + fun setWriteOffCount(count:String,siteId: Int) } } \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt index e8ca54e148..9814ec1b0a 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt @@ -29,6 +29,7 @@ import com.mogo.och.unmanned.taxi.constant.TaxiDriverEventConst import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst.Companion.START_AUTOPILOT_ANIMATION_INTERVAL import com.mogo.och.unmanned.taxi.ui.navi.amap.TaxiAmapNaviFragment import com.mogo.och.unmanned.taxi.ui.navi.auto.TaxiRoutingNaviFragment +import com.mogo.och.unmanned.taxi.ui.operational.OperationalManager import com.mogo.och.unmanned.taxi.ui.operational.TaxiOperationalDialogFragment import com.mogo.och.unmanned.taxi.ui.task.TaxiTaskModel import com.mogo.och.unmanned.taxi.ui.task.itinerarycurrent.ItineraryCurrentView @@ -58,7 +59,6 @@ class TaxiFragment :MvpFragment(), private val runningTaskGateWay = "RUNNINGTASKGATEWAY" private val lineView = "LINEVIEW" - private var personalDialogFragment: WeakReference? = null private fun updateOperationBtnStatusOnModeChange(isRoutingVerifyMode: Boolean) { @@ -102,10 +102,11 @@ class TaxiFragment :MvpFragment(), when (toolTag) { runningTaskGateWay -> { d(TAG, "runningTaskGateWay:$runningTaskGateWay---toolTag:$toolTag") - personalDialogFragment = WeakReference(TaxiOperationalDialogFragment()) - activity?.supportFragmentManager?.let { - d(TAG, "runningTaskGateWay:展示view ${personalDialogFragment!!.get()}") - personalDialogFragment!!.get()?.show(it, "service_data") + if(context==null){ + d(TAG, "runningTaskGateWay:没有展示view ") + }else{ + d(TAG, "runningTaskGateWay:展示view ") + OperationalManager.showBadCaseConfigWindow(it) } } } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/operational/OperationalManager.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/operational/OperationalManager.kt new file mode 100644 index 0000000000..1e49d84e98 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/operational/OperationalManager.kt @@ -0,0 +1,145 @@ +package com.mogo.och.unmanned.taxi.ui.operational + + +import android.content.Context +import android.graphics.Color +import android.graphics.Rect +import android.graphics.drawable.ColorDrawable +import android.os.Build.VERSION +import android.os.Build.VERSION_CODES +import android.transition.Slide +import android.view.Gravity +import android.view.MotionEvent +import android.view.View +import android.view.ViewConfiguration +import android.view.WindowManager +import android.view.animation.AccelerateDecelerateInterpolator +import android.widget.PopupWindow +import android.widget.PopupWindow.INPUT_METHOD_NEEDED +import androidx.fragment.app.FragmentActivity +import androidx.lifecycle.Lifecycle.Event +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.lifecycleScope +import com.mogo.eagle.core.utilcode.kotlin.lifeCycleOwner +import com.mogo.eagle.core.utilcode.reminder.Reminder +import com.mogo.eagle.core.utilcode.reminder.api.impl.PopupWindowReminder +import com.mogo.eagle.core.utilcode.util.* +import me.jessyan.autosize.utils.AutoSizeUtils +import kotlin.math.abs + +object OperationalManager : LifecycleEventObserver{ + + const val TAG = "BadCase" + + private var hideFloat: (() -> Unit)? = null + + fun init(context: Context) { + } + + /** + * 展示BadCase配置页面 + */ + fun showBadCaseConfigWindow(context: Context) { + val badCaseConfigView = OperationalManagerView(context) + badCaseConfigView.setOnClickListener(object : OperationalManagerView.ClickListener { + override fun onClose() { + hideFloat?.invoke() + hideFloat = null + } + }) + enqueuePop( + badCaseConfigView, + AutoSizeUtils.dp2px(context, 1046f), + WindowManager.LayoutParams.MATCH_PARENT, + key = "BadCaseConfigView" + ).also { + hideFloat = it + } + } + + override fun onStateChanged(source: LifecycleOwner, event: Event) { + + } + + + fun enqueuePop(content: View, width: Int, height: Int, key: String = "", startX: Int = 0, startY: Int = 0, gravity: Int = Gravity.START, onOuterViewClicked:((focus: View) -> Unit)? = null, isOverride: Boolean = false, isFocusable: Boolean = true): () -> Unit { + val topActivity = ActivityUtils.getTopActivity() + val activity = (topActivity as? FragmentActivity) ?: throw IllegalStateException("please use Activity to trigger pop show.") + val isImmersiveMode = BarUtils.isImmersiveMode(activity) + var tempReminder: PopupWindowReminder? = null + activity.lifecycleScope.launchWhenResumed { + val pop = PopupWindow(width, height).also { + it.isOutsideTouchable = true + it.isTouchable = true + it.isFocusable = isFocusable + it.inputMethodMode = INPUT_METHOD_NEEDED + it.isClippingEnabled = false + var x = 0f + var y = 0f + val touchSlop = ViewConfiguration.get(activity).scaledTouchSlop + var isClicked = false + it.setTouchInterceptor { v, event -> + val out = Rect() + v.getGlobalVisibleRect(out) + if (out.contains(event.x.toInt(), event.y.toInt())) { + return@setTouchInterceptor false + } + + when(event.actionMasked) { + MotionEvent.ACTION_DOWN -> { + x = event.x + y = event.y + } + MotionEvent.ACTION_MOVE -> { + val deltaX = event.x - x + val deltaY = event.y - y + isClicked = !(abs(deltaX) > touchSlop || abs(deltaY) > touchSlop) + } + MotionEvent.ACTION_UP -> { + if (isClicked) { + isClicked = false + onOuterViewClicked?.invoke(v) + } + } + } + try { + return@setTouchInterceptor true + } finally { + activity.window.decorView.dispatchTouchEvent(event) + } + } + it.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + } + if (VERSION.SDK_INT >= VERSION_CODES.M) { + val transition = Slide(gravity).also { + it.interpolator = AccelerateDecelerateInterpolator() + it.duration = 200 + } + pop.enterTransition = transition + pop.exitTransition = transition + } + pop.contentView = content + val reminder = object : PopupWindowReminder(pop) { + + override fun key(): String { + return key + super.key() + } + + override fun show() { + pop.showAtLocation(activity.window.decorView, gravity, startX, startY) + } + override fun isOverride(): Boolean = isOverride + } + tempReminder = reminder + Reminder.enqueue(activity.lifeCycleOwner, reminder) + } + return { + tempReminder?.hide() + } + } + + + + +} diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/operational/OperationalManagerView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/operational/OperationalManagerView.kt new file mode 100644 index 0000000000..e4f2d41921 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/operational/OperationalManagerView.kt @@ -0,0 +1,255 @@ +package com.mogo.och.unmanned.taxi.ui.operational + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.mogo.commons.AbsMogoApplication +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.och.common.module.utils.DateTimeUtil +import com.mogo.och.common.module.wigets.WindowRelativeLayout +import com.mogo.och.unmanned.taxi.R +import com.mogo.och.unmanned.taxi.bean.OrderTaskDetailStationBean +import com.mogo.och.unmanned.taxi.bean.QueryOrdersRespBean +import com.mogo.och.unmanned.taxi.bean.QueryServingDurationRespBean +import com.mogo.och.unmanned.taxi.bean.QueryTaskRespBean +import com.mogo.och.unmanned.taxi.constant.StationTypeEnum +import com.mogo.och.unmanned.taxi.constant.TaskTypeEnum +import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.dayTotalOrdersView +import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.itemDayTv +import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.operationDataTitle +import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.operationItemRecyclerView +import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.view.operationalDataView +import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.view.dayCompletedOrdersView +import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.view.operationalDataCloseIv +import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.view.servingDurationView +import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.operationalDataView +import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.operationalDetailView +import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.scheduledTasksView +import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.view.dayTotalOrdersView +import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.view.itemDayTv +import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.view.operationDataTitle +import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.view.operationItemRecyclerView +import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.view.operationalDetailView +import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.view.scheduledTasksView + +class OperationalManagerView: WindowRelativeLayout, OperationalViewModel.RunningTaskViewCallback { + + + constructor(context: Context?) : super(context) + + constructor(context: Context?, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr) + + constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes) + + + companion object { + const val TAG = "BadCaseManagerView" + } + + private var clickListener:ClickListener?=null + private var viewModel:OperationalViewModel?=null + private var orderListAdapter: OrderListAdapter? = null + + init { + LayoutInflater.from(context).inflate(R.layout.unmanned_taxi_operational_data_view, this, true) + initView() + } + + private fun initView(){ + //关闭BadCase管理窗口 + operationalDataCloseIv.onClick { + if (operationalDetailView.visibility == View.GONE){ + clickListener?.onClose() + }else{ + operationalDetailView.visibility = View.GONE + operationalDataView.visibility = View.VISIBLE + operationDataTitle.text = "网约车运营数据" + } + } + + } + + fun setOnClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + + interface ClickListener { + fun onClose() + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + + viewModel = ViewModelProvider(this).get(OperationalViewModel::class.java) + + viewModel?.setDistanceCallback(this) + } + + override fun onVisibilityAggregated(isVisible: Boolean) { + super.onVisibilityAggregated(isVisible) + + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + } + + + + override fun updateScheduledTaskList(currentScheduledTaskList: MutableList?) { + var dataContent = "0" + if (currentScheduledTaskList != null){ + dataContent = currentScheduledTaskList.size.toString() + } + scheduledTasksView.setOperationDataContentTv(dataContent,"个") + scheduledTasksView.setOperationalDataTagTv("今日演练任务量") + scheduledTasksView.setOperationalDataViewClick(View.VISIBLE, + object :OperationalDataItemView.DataViewClickListener{ + override fun onClick() { + currentScheduledTaskList?.also { + operationalDataView.visibility = View.INVISIBLE + operationalDetailView.visibility = View.VISIBLE + operationDataTitle.text = "今日演练任务量列表" + itemDayTv.text = DateTimeUtil.getYMDTime(DateTimeUtil.getCurrentTimeStamp()) + var taskListAdapter = TaskListAdapter(AbsMogoApplication.getApp().applicationContext, it) + operationItemRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + operationItemRecyclerView.adapter = taskListAdapter + } + } + + }) + } + + override fun updateServingDuration(data: QueryServingDurationRespBean?) { + var duration = DateTimeUtil.second2Time(0) + if (data != null) { + duration = DateTimeUtil.second2Time(data.data) + + } + + val listSplit = duration.split(":") + + servingDurationView.setOperationalDuration(listSplit[0],"时",listSplit[1],"分") + servingDurationView.setOperationalDataTagTv("今日服务总时长") + servingDurationView.setOperationalDataViewClick(View.GONE,null) + } + + override fun setTaskList(currentOrderTaskList: MutableList?) { + if (currentOrderTaskList == null) orderListAdapter?.updateTaskStationView(null) + else{ + var orderTaskDetailList = mutableListOf() + for (index in currentOrderTaskList.size -1 downTo 0){ //后台给的数据是倒序 + val taskDetail = currentOrderTaskList[index] + when(taskDetail.taskType){ + TaskTypeEnum.VirtualTask.code, TaskTypeEnum.ToOrderStartTask.code -> { + if (index != currentOrderTaskList.size-2){ + var bean = + OrderTaskDetailStationBean(taskDetail.endSiteName, StationTypeEnum.PathwayStation.code) + orderTaskDetailList.add(bean) + } + } + TaskTypeEnum.ToOrderEndTask.code -> { + if(orderTaskDetailList.size>0){ + val last = orderTaskDetailList.last() + if (last.stationType== StationTypeEnum.PathwayStation.code && + last.stationName==taskDetail.startSiteName) { + last.stationType = StationTypeEnum.OrderStartStation.code + }else{ + val beanStart = + OrderTaskDetailStationBean(taskDetail.startSiteName, + StationTypeEnum.OrderStartStation.code) + orderTaskDetailList.add(beanStart) + } + }else{ + val beanStart = + OrderTaskDetailStationBean(taskDetail.startSiteName, + StationTypeEnum.OrderStartStation.code) + orderTaskDetailList.add(beanStart) + } + + var beanEnd = + OrderTaskDetailStationBean(taskDetail.endSiteName, StationTypeEnum.OrderEndStation.code) + orderTaskDetailList.add(beanEnd) + } + } + } + orderListAdapter?.updateTaskStationView(orderTaskDetailList) + } + + } + + override fun setCurrentCompleteOrderData(completedOrderList: MutableList?) { + var dataContent = "0" + if (completedOrderList != null){ + dataContent = completedOrderList.size.toString() + } + + dayCompletedOrdersView.setOperationDataContentTv(dataContent,"单") + dayCompletedOrdersView.setOperationalDataTagTv("今日订单完成量") + dayCompletedOrdersView.setOperationalDataViewClick(View.VISIBLE, + object :OperationalDataItemView.DataViewClickListener{ + override fun onClick() { + completedOrderList?.also { + operationalDataView.visibility = View.INVISIBLE + operationalDetailView.visibility = View.VISIBLE + operationDataTitle.text = "今日订单完成量列表" + itemDayTv.text = DateTimeUtil.getYMDTime(DateTimeUtil.getCurrentTimeStamp()) + orderListAdapter = OrderListAdapter( + AbsMogoApplication.getApp().applicationContext, + it, + object : OrderListAdapter.ClickViewDetailListener{ + override fun clickViewOrderDetail(orderNo: String) { + viewModel?.queryTaskListByOrderNo(orderNo) + } + + }) + operationItemRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + operationItemRecyclerView.adapter = orderListAdapter + } + } + + }) + } + + override fun setCurrentDayOrders(totalOrderList: MutableList?) { + var dataContent = "0" + if (totalOrderList != null){ + dataContent = totalOrderList.size.toString() + } + + dayTotalOrdersView.setOperationDataContentTv(dataContent,"单") + dayTotalOrdersView.setOperationalDataTagTv("今日全部订单量") + dayTotalOrdersView.setOperationalDataViewClick(View.VISIBLE, + object :OperationalDataItemView.DataViewClickListener{ + override fun onClick() { + totalOrderList?.also { + operationalDataView.visibility = View.INVISIBLE + operationalDetailView.visibility = View.VISIBLE + operationDataTitle.text = "今日全部订单量列表" + itemDayTv.text = DateTimeUtil.getYMDTime(DateTimeUtil.getCurrentTimeStamp()) + orderListAdapter = OrderListAdapter(AbsMogoApplication.getApp().applicationContext, + it, + object : OrderListAdapter.ClickViewDetailListener{ + override fun clickViewOrderDetail(orderNo: String) { + viewModel?.queryTaskListByOrderNo(orderNo) + } + + }) + operationItemRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + operationItemRecyclerView.adapter = orderListAdapter + } + } + + }) + } + + +} diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/operational/OperationalViewModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/operational/OperationalViewModel.kt new file mode 100644 index 0000000000..92d5e009f7 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/operational/OperationalViewModel.kt @@ -0,0 +1,210 @@ +package com.mogo.och.unmanned.taxi.ui.operational + +import androidx.lifecycle.ViewModel +import com.mogo.commons.AbsMogoApplication +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.util.GsonUtils +import com.mogo.eagle.core.utilcode.util.NetworkUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.network.OchCommonServiceCallback +import com.mogo.och.common.module.utils.RxUtils +import com.mogo.och.unmanned.taxi.R +import com.mogo.och.unmanned.taxi.bean.QueryOrdersRespBean +import com.mogo.och.unmanned.taxi.bean.QueryServingDurationRespBean +import com.mogo.och.unmanned.taxi.bean.QueryTaskRespBean +import com.mogo.och.unmanned.taxi.network.TaxiOperationalDataServiceManager +import io.reactivex.disposables.Disposable + +/** + * @author XuXinChao + * @description BadCase录包管理页面 + * @since: 2022/12/15 + */ +class OperationalViewModel : ViewModel() { + + private val TAG = OperationalViewModel::class.java.simpleName + + private var viewCallback:RunningTaskViewCallback?=null + private var subscribe: Disposable?=null + + + fun setDistanceCallback(viewCallback:RunningTaskViewCallback){ + this.viewCallback = viewCallback + queryServingDuration() + queryCurrentCompleteOrder() + queryCurrentDayOrder() + queryCurrentScheduledTaskList() + } + + + /** + * 车辆演练任务列表 + */ + private fun queryCurrentScheduledTaskList() { + TaxiOperationalDataServiceManager.queryCurrentScheduledTaskList( + AbsMogoApplication.getApp().applicationContext, + object : OchCommonServiceCallback { + override fun onSuccess(data: QueryTaskRespBean?) { + CallerLogger.d(TAG, "queryCurrentScheduledTaskList" + GsonUtils.toJson(data)) + data?.also { + viewCallback?.updateScheduledTaskList(data.data) + } + } + + override fun onFail(code: Int, msg: String?) { + ToastUtils.showShort(msg) + } + + override fun onError() { + val context = AbsMogoApplication.getApp().applicationContext + if (!NetworkUtils.isConnected(context)) { + ToastUtils.showShort(context.getString(R.string.network_error_tip)) + } else { + ToastUtils.showShort(context.getString(R.string.request_error_tip)) + } + } + + }) + } + + /** + * 车辆服务市场列表 + */ + private fun queryServingDuration(){ + TaxiOperationalDataServiceManager.queryServingDuration( + AbsMogoApplication.getApp().applicationContext, + object : OchCommonServiceCallback { + override fun onSuccess(data: QueryServingDurationRespBean) { //服务时长返回 秒 + val toJson = GsonUtils.toJson(data) + CallerLogger.d(TAG, "queryServingDuration$toJson") + OchChainLogManager.writeChainLog("今日服务时长",toJson) + viewCallback?.updateServingDuration(data) + } + + override fun onFail(code: Int, msg: String?) { + ToastUtils.showShort(msg) + } + + override fun onError() { + val context = AbsMogoApplication.getApp().applicationContext + if (!NetworkUtils.isConnected(context)) { + ToastUtils.showShort(context.getString(R.string.network_error_tip)) + } else { + ToastUtils.showShort(context.getString(R.string.request_error_tip)) + } + } + + }) + } + + /** + * 根据订单查询任务列表 + */ + fun queryTaskListByOrderNo(orderNo: String){ + TaxiOperationalDataServiceManager.queryTaskListByOrder( + AbsMogoApplication.getApp().applicationContext, + orderNo, + object : OchCommonServiceCallback { + override fun onSuccess(data: QueryTaskRespBean?) { + CallerLogger.d(TAG, "queryTaskListByOrderNo" + GsonUtils.toJson(data)) + + data?.also { + viewCallback?.setTaskList(data.data) + } + } + + override fun onFail(code: Int, msg: String?) { + ToastUtils.showShort(msg) + } + + override fun onError() { + val context = AbsMogoApplication.getApp().applicationContext + if (!NetworkUtils.isConnected(context)) { + ToastUtils.showShort(context.getString(R.string.network_error_tip)) + } else { + ToastUtils.showShort(context.getString(R.string.request_error_tip)) + } + } + + }) + } + + /** + * 查询车辆当天已完成订单 + */ + private fun queryCurrentCompleteOrder(){ + TaxiOperationalDataServiceManager.queryCurrentCompleteOrder( + AbsMogoApplication.getApp().applicationContext, + object : OchCommonServiceCallback { + override fun onSuccess(data: QueryOrdersRespBean?) { + CallerLogger.d(TAG, "queryCurrentCompleteOrder" + GsonUtils.toJson(data)) + + data?.also { + viewCallback?.setCurrentCompleteOrderData(data.data) + } + } + + override fun onFail(code: Int, msg: String?) { + ToastUtils.showShort(msg) + } + + override fun onError() { + val context = AbsMogoApplication.getApp().applicationContext + if (!NetworkUtils.isConnected(context)) { + ToastUtils.showShort(context.getString(R.string.network_error_tip)) + } else { + ToastUtils.showShort(context.getString(R.string.request_error_tip)) + } + } + + }) + } + + /** + * 查询车辆当天所有订单 + */ + private fun queryCurrentDayOrder(){ + TaxiOperationalDataServiceManager.queryCurrentDayOrder( + AbsMogoApplication.getApp().applicationContext, + object : OchCommonServiceCallback { + override fun onSuccess(data: QueryOrdersRespBean?) { + CallerLogger.d(TAG, "queryCurrentDayOrder" + GsonUtils.toJson(data)) + + data?.also { + viewCallback?.setCurrentDayOrders(data.data) + } + } + + override fun onFail(code: Int, msg: String?) { + ToastUtils.showShort(msg) + } + + override fun onError() { + val context = AbsMogoApplication.getApp().applicationContext + if (!NetworkUtils.isConnected(context)) { + ToastUtils.showShort(context.getString(R.string.network_error_tip)) + } else { + ToastUtils.showShort(context.getString(R.string.request_error_tip)) + } + } + }) + } + + override fun onCleared() { + RxUtils.disposeSubscribe(subscribe) + subscribe = null + } + + + + interface RunningTaskViewCallback{ + fun updateScheduledTaskList(data: MutableList?) + fun updateServingDuration(data: QueryServingDurationRespBean?) + fun setTaskList(data: MutableList?) + fun setCurrentCompleteOrderData(data: MutableList?) + fun setCurrentDayOrders(data: MutableList?) + + } +} + diff --git a/gradle.properties b/gradle.properties index 5fb89d703e..4c0bce9973 100644 --- a/gradle.properties +++ b/gradle.properties @@ -83,7 +83,7 @@ MOGO_TELEMATIC_VERSION=1.4.7.42 MOGO_SKIN_VERSION=1.4.7.49.14-debug ######## MogoAiCloudSDK Version ######## # 自研地图 -MAP_SDK_VERSION=3.4.1.17 +MAP_SDK_VERSION=3.4.1.18 MAP_SDK_DATA_VERSION=1.0.0.9 MAP_SDK_OPERATION_VERSION=1.1.4.1 # websocket