From 2eec82554348db075f3b33e1634ac6a420b71796 Mon Sep 17 00:00:00 2001 From: aibingbing Date: Thu, 23 Nov 2023 21:36:16 +0800 Subject: [PATCH] =?UTF-8?q?[=E8=87=AA=E4=B8=BB=E7=AE=97=E8=B7=AF=E9=AA=8C?= =?UTF-8?q?=E8=AF=81]=20feat:=20=E5=A2=9E=E5=8A=A0=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E5=8F=8A=E7=AE=A1=E7=90=86=E7=B1=BB=EF=BC=8C?= =?UTF-8?q?Model,=20ViewModel=20=E5=90=84=E5=B1=82=E6=AC=A1=E4=B9=8B?= =?UTF-8?q?=E9=97=B4=E4=BE=9D=E8=B5=96=E7=AD=89=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/AndroidManifest.xml | 2 +- .../com/mogo/och/taxi/bean/TaxiRoutingBean.kt | 39 +++++ .../bean/TaxiRoutingQueryLineResponse.java | 22 --- .../och/taxi/callback/ITaxiRoutingCallback.kt | 11 ++ .../och/taxi/network/TaxiRoutingServiceApi.kt | 75 +++++++++ .../taxi/network/TaxiRoutingServiceManager.kt | 130 +++++++++++++++ ...ty.kt => TaxiRoutingChooseLineActivity.kt} | 86 ++++++---- .../routing/TaxiRoutingChooseLineAdapter.kt | 10 +- .../routing/TaxiRoutingChooseLineViewModel.kt | 94 +++++++++++ .../taxi/ui/routing/TaxiRoutingFragment.kt | 83 +++++++--- .../routing/TaxiRoutingFragmentViewModel.kt | 53 ++++++ .../och/taxi/ui/routing/TaxiRoutingModel.kt | 154 ++++++++++++++++++ .../taxi/ui/routing/TaxiRoutingUiIntent.kt | 26 +++ .../och/taxi/ui/routing/TaxiRoutingUiState.kt | 23 +++ gradle.properties | 2 +- 15 files changed, 720 insertions(+), 90 deletions(-) create mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt delete mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingQueryLineResponse.java create mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiRoutingCallback.kt create mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiRoutingServiceApi.kt create mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiRoutingServiceManager.kt rename OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/{TaxiRoutingChooseTaskActivity.kt => TaxiRoutingChooseLineActivity.kt} (66%) create mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineViewModel.kt create mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragmentViewModel.kt create mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt create mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingUiIntent.kt create mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingUiState.kt diff --git a/OCH/taxi/unmanned-driver/src/main/AndroidManifest.xml b/OCH/taxi/unmanned-driver/src/main/AndroidManifest.xml index a7808094c9..3ab0402e38 100644 --- a/OCH/taxi/unmanned-driver/src/main/AndroidManifest.xml +++ b/OCH/taxi/unmanned-driver/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ - diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt new file mode 100644 index 0000000000..a19c466320 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt @@ -0,0 +1,39 @@ +package com.mogo.och.taxi.bean + +import com.mogo.eagle.core.data.BaseData + +data class GrayLineBean( + var lineId: Long?, //线路id + var lineName: String?, //线路名称 + var contrailId: Long?, //轨迹id + var carVerificationCount: Int?, //本次今日已验证次数 + var lineSuccessCount: Int?, //线路累计反馈可用次数 + var lineFailCount: Int?, //线路累计反馈不可用次数 + var isChoosed: Boolean = false //当前是否选中 +) + +data class ContrailBean( + var lineId: Long?, + var contrailId: Long?, + var csvFileUrl: String?, + var csvFileMd5: String?, + var txtFileUrl: String?, + var txtFileMd5: String?, + var version: Long? +) + +data class QueryGrayContrailListRsp(var data: MutableList?) : BaseData() +data class StartGrayContrailTaskReq(var sn: String, var contrailId: Long) +data class StartGrayContrailTaskRsp(var data: Long?) : BaseData() +data class QueryRoutingContrailByIdRsp(var data: ContrailBean?) : BaseData() +data class SubmitGrayLineIssueLocationReq(var grayId: Long, var gcjLon: Double, var gcjLat: Double) +data class EndGrayContrailTaskReq(var grayId: Long, var feedback: Int) //feedback 1:成功 2:失败 +data class StartGrayAndQueryContrailRsp( + var taskId: Long?, + var contrail: ContrailBean?, + var grayLineBean: GrayLineBean +) : BaseData() + + + + diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingQueryLineResponse.java b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingQueryLineResponse.java deleted file mode 100644 index 7c3efdda76..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingQueryLineResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.mogo.och.taxi.bean; - -import com.mogo.eagle.core.data.BaseData; - -import java.util.List; - -/** - * @author: wangmingjun - * @date: 2022/2/9 - */ -public class TaxiRoutingQueryLineResponse extends BaseData { - public List data; - - public static class Result { - public int lineId;//线路id - public String name;//线路名字 - public int todayVerifyNum;//本车今天验证次数 - public int historyVerifyTotalUsableNum;//历史累计验证可用次数 - public int historyVerifyTotalNotUsableNum;//历史累计验证不可用次数 - public boolean isChoosed;//当前是否选中 - } -} diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiRoutingCallback.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiRoutingCallback.kt new file mode 100644 index 0000000000..125e1c13c1 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiRoutingCallback.kt @@ -0,0 +1,11 @@ +package com.mogo.och.taxi.callback + +import com.mogo.och.taxi.bean.GrayLineBean +import com.mogo.och.taxi.bean.StartGrayAndQueryContrailRsp + +interface ITaxiRoutingCallback { + fun onQueryRoutingGrayLineListSuccess(data: MutableList) + fun onQueryRoutingGrayLineListFailed(errorStr: String) + fun onStartGrayTaskAndQueryContrailSuccess(data: StartGrayAndQueryContrailRsp) + fun onStartGrayTaskAndQueryContrailFailed(errorStr: String) +} diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiRoutingServiceApi.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiRoutingServiceApi.kt new file mode 100644 index 0000000000..f1857459e4 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiRoutingServiceApi.kt @@ -0,0 +1,75 @@ +package com.mogo.och.taxi.network + +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.eagle.core.data.BaseData +import com.mogo.och.taxi.bean.EndGrayContrailTaskReq +import com.mogo.och.taxi.bean.QueryGrayContrailListRsp +import com.mogo.och.taxi.bean.QueryRoutingContrailByIdRsp +import com.mogo.och.taxi.bean.StartGrayContrailTaskReq +import com.mogo.och.taxi.bean.StartGrayContrailTaskRsp +import com.mogo.och.taxi.bean.SubmitGrayLineIssueLocationReq +import io.reactivex.Observable +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.Headers +import retrofit2.http.POST +import retrofit2.http.Query + +interface TaxiRoutingServiceApi { + + /** + * 查询灰度线路列表 + */ + @Headers("Content-type:application/json;charset=UTF-8") + @GET("/och-taxi-cabin/api/business/v1/queryGrayContrailList") + fun queryRoutingGrayLineList( + @Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId, + @Header("ticket") ticket: String = MoGoAiCloudClientConfig.getInstance().token, + @Query("sn") sn: String? + ): Observable + + /** + * 开始一个路线的灰度任务 + */ + @Headers("Content-type:application/json;charset=UTF-8") + @POST("/och-taxi-cabin/api/business/v1/startGray") + fun startGrayTask( + @Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId, + @Header("ticket") ticket: String = MoGoAiCloudClientConfig.getInstance().token, + @Body data: StartGrayContrailTaskReq + ): Observable + + /** + * 根据id查询灰度轨迹详情 + */ + @Headers("Content-type:application/json;charset=UTF-8") + @GET("/och-taxi-cabin/api/business/v1/gray/contrail") + fun queryRoutingContrailById( + @Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId, + @Header("ticket") ticket: String = MoGoAiCloudClientConfig.getInstance().token, + @Query("id") contrailId: Long + ): Observable + + /** + * 上报路线打点 + */ + @Headers("Content-type:application/json;charset=UTF-8") + @POST("/och-taxi-cabin/api/business/v1/saveDotDetail") + fun submitGrayLineIssueLocation( + @Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId, + @Header("ticket") ticket: String = MoGoAiCloudClientConfig.getInstance().token, + @Body data: SubmitGrayLineIssueLocationReq + ): Observable + + /** + * 结束一个路线的灰度任务 + */ + @Headers("Content-type:application/json;charset=UTF-8") + @POST("/och-taxi-cabin/api/business/v1/endGray") + fun endGrayTask( + @Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId, + @Header("ticket") ticket: String = MoGoAiCloudClientConfig.getInstance().token, + @Body data: EndGrayContrailTaskReq + ): Observable +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiRoutingServiceManager.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiRoutingServiceManager.kt new file mode 100644 index 0000000000..3047ebd492 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiRoutingServiceManager.kt @@ -0,0 +1,130 @@ +package com.mogo.och.taxi.network + +import android.content.Context +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.eagle.core.data.BaseData +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.och.common.module.biz.constant.OchCommonConst +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback +import com.mogo.och.common.module.biz.network.OchCommonSubscribeImpl +import com.mogo.och.common.module.biz.network.interceptor.transformTry +import com.mogo.och.taxi.bean.EndGrayContrailTaskReq +import com.mogo.och.taxi.bean.GrayLineBean +import com.mogo.och.taxi.bean.QueryGrayContrailListRsp +import com.mogo.och.taxi.bean.QueryRoutingContrailByIdRsp +import com.mogo.och.taxi.bean.StartGrayAndQueryContrailRsp +import com.mogo.och.taxi.bean.StartGrayContrailTaskReq +import com.mogo.och.taxi.bean.StartGrayContrailTaskRsp +import com.mogo.och.taxi.bean.SubmitGrayLineIssueLocationReq +import io.reactivex.Observable + +object TaxiRoutingServiceManager { + + private var mRoutingServiceApi: TaxiRoutingServiceApi = + MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create( + TaxiRoutingServiceApi::class.java + ) + + /** + * 查询灰度路线列表 + */ + fun queryRoutingGrayLineList( + context: Context, + callback: OchCommonServiceCallback + ) { + mRoutingServiceApi.queryRoutingGrayLineList( + sn = MoGoAiCloudClientConfig.getInstance().sn + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryRoutingGrayLineList")) + } + + /** + * 开始一个灰度任务 + */ + fun startGrayTask( + context: Context, + data: StartGrayContrailTaskReq, + callback: OchCommonServiceCallback + ) { + mRoutingServiceApi.startGrayTask(data = data).transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "startGrayTask")) + } + + /** + * 通过id查询轨迹详情 + */ + fun queryRoutingContrailById( + context: Context, + contrailId: Long, + callback: OchCommonServiceCallback + ) { + mRoutingServiceApi.queryRoutingContrailById(contrailId = contrailId).transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryRoutingContrailById")) + } + + /** + * 上报线路打点 + */ + fun submitGrayLineIssueLocation( + context: Context, + data: SubmitGrayLineIssueLocationReq, + callback: OchCommonServiceCallback + ) { + mRoutingServiceApi.submitGrayLineIssueLocation(data = data).transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "submitGrayLineIssueLocation")) + } + + /** + * 结束一个灰度任务 + */ + fun endGrayTask( + context: Context, + data: EndGrayContrailTaskReq, + callback: OchCommonServiceCallback + ) { + mRoutingServiceApi.endGrayTask(data = data).transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "endGrayTask")) + } + + fun startGrayTaskAndQueryRoutingContrail( + context: Context, + sn: String, + contrailId: Long, + grayLineBean: GrayLineBean, + callback: OchCommonServiceCallback + ) { + val data = StartGrayContrailTaskReq(sn = sn, contrailId = contrailId) + var taskId: Long + mRoutingServiceApi.startGrayTask(data = data) + .flatMap { startGrayRsp -> + if (startGrayRsp.data == null) { + taskId = -1L + val result = StartGrayAndQueryContrailRsp( + taskId = taskId, + contrail = null, + grayLineBean = grayLineBean + ) + return@flatMap Observable.just(result) + } + taskId = startGrayRsp.data!! + return@flatMap mRoutingServiceApi.queryRoutingContrailById(contrailId = contrailId) + .map { queryRoutingContrailRsp -> + val result = StartGrayAndQueryContrailRsp( + taskId = taskId, + contrail = queryRoutingContrailRsp.data, + grayLineBean = grayLineBean + ) + result + } + } + .transformTry() + .subscribe( + OchCommonSubscribeImpl( + context, + callback, + "startGrayTaskAndQueryRoutingContrail" + ) + ) + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseTaskActivity.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt similarity index 66% rename from OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseTaskActivity.kt rename to OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt index 1a43045ead..4bef569900 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseTaskActivity.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt @@ -7,24 +7,34 @@ import android.view.View import android.view.ViewGroup import android.view.WindowManager import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.view.SpacesItemDecoration import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.utils.FlowBus import com.mogo.och.taxi.R -import com.mogo.och.taxi.bean.TaxiRoutingQueryLineResponse +import com.mogo.och.taxi.bean.GrayLineBean import com.mogo.och.taxi.constant.TaxiDriverEventConst import kotlinx.android.synthetic.main.routing_choose_task_activity.btnChooseLineSubmit import kotlinx.android.synthetic.main.routing_choose_task_activity.btnClose import kotlinx.android.synthetic.main.routing_choose_task_activity.chooseLineListView import kotlinx.android.synthetic.main.routing_no_data_common_view.noDataContainer +import kotlinx.coroutines.flow.map -class TaxiRoutingChooseTaskActivity : AppCompatActivity() { +class TaxiRoutingChooseLineActivity : AppCompatActivity() { companion object { - const val TAG = "TaxiRoutingChooseTaskActivity" + const val TAG = "TaxiRoutingChooseLineActivity" + } + + private val mViewModel: TaxiRoutingChooseLineViewModel by lazy { + ViewModelProvider( + this, + ViewModelProvider.NewInstanceFactory() + )[TaxiRoutingChooseLineViewModel::class.java] } private val mLoadingDialog: TaxiRoutingLoadingDialog by lazy { @@ -34,14 +44,16 @@ class TaxiRoutingChooseTaskActivity : AppCompatActivity() { } private lateinit var mChooseLineListAdapter: TaxiRoutingChooseLineAdapter private lateinit var mLinearLayoutManager: LinearLayoutManager - private val mRoutingLineList: MutableList = ArrayList() - private var mCurrentChosenLineId: Int? = -1 + private val mRoutingLineList: MutableList = ArrayList() + private var mCurrentChosenPosition: Int = -1 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.routing_choose_task_activity) initWindowParams() initView() + initViewListener() + initViewModelObserver() loadData() } @@ -69,20 +81,27 @@ class TaxiRoutingChooseTaskActivity : AppCompatActivity() { mChooseLineListAdapter.setOnLineItemClickListener(object : TaxiRoutingChooseLineAdapter.OnChooseLineItemClickListener { override fun onItemClick(position: Int, close: Boolean) { - mCurrentChosenLineId = mRoutingLineList[position].lineId + mCurrentChosenPosition = position } }) + } + private fun initViewListener() { btnClose.setOnClickListener { finish() } btnChooseLineSubmit.setOnClickListener { - if (mCurrentChosenLineId == -1) { + if (mCurrentChosenPosition == -1) { ToastUtils.showLong("请先选择任务") return@setOnClickListener } - ToastUtils.showLong("当前选择的路线LineId:$mCurrentChosenLineId") + ToastUtils.showLong("当前选择的路线contrailId:$mCurrentChosenPosition") mLoadingDialog.showLoading() + val chosenItem = mRoutingLineList[mCurrentChosenPosition] + mViewModel.sendUiIntent( + TaxiRoutingUiIntent.StartTaskAndQueryContrail(chosenItem) + ) + // TODO UiThreadHandler.postDelayed({ mLoadingDialog.hideLoading() FlowBus.with(TaxiDriverEventConst.RoutingActivityEvent.EVENT_TYPE_GET_CHOSEN_LINE_TASK_ID) @@ -93,6 +112,26 @@ class TaxiRoutingChooseTaskActivity : AppCompatActivity() { } } + private fun initViewModelObserver() { + lifecycleScope.launchWhenStarted { + mViewModel.uiStateFlow.map { it.routingUiState }.collect { routingUiState -> + CallerLogger.d( + TAG, + "uiStateFlow-initViewModelObserver: $routingUiState" + ) + when (routingUiState) { + is RoutingUIState.Init -> { + showEmptyView() + } + + is RoutingUIState.ShowGrayLineList -> { + onRoutingGrayLineListChanged(routingUiState.data) + } + } + } + } + } + private fun showEmptyView() { chooseLineListView.visibility = View.GONE btnChooseLineSubmit.visibility = View.GONE @@ -105,41 +144,18 @@ class TaxiRoutingChooseTaskActivity : AppCompatActivity() { noDataContainer.visibility = View.GONE } - /** - * 初始化数据 - */ private fun loadData() { - //TODO - for (i in 1..10) { - val result = TaxiRoutingQueryLineResponse.Result() - result.lineId = i - result.name = "路线名称$i" - result.todayVerifyNum = 2 - result.historyVerifyTotalUsableNum = 5 - result.historyVerifyTotalNotUsableNum = 1 - result.isChoosed = false - mRoutingLineList.add(result) - } - if (mRoutingLineList.isEmpty()) { - showEmptyView() - } else { - showRecyclerView() - mChooseLineListAdapter.notifyDataSetChanged() - } + mViewModel.sendUiIntent(TaxiRoutingUiIntent.QueryRoutingGrayLineList) } - fun onRoutingLineDataChanged(data: TaxiRoutingQueryLineResponse?) { - if (data?.data?.isNotEmpty() == true) { + private fun onRoutingGrayLineListChanged(data: MutableList) { + if (data.isNotEmpty()) { showRecyclerView() mRoutingLineList.clear() - mRoutingLineList.addAll(data.data) + mRoutingLineList.addAll(data) mChooseLineListAdapter.notifyDataSetChanged() } else { showEmptyView() } } - - override fun onDestroy() { - super.onDestroy() - } } \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt index ae43cb3930..501cc62945 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt @@ -8,11 +8,11 @@ import android.view.ViewGroup import androidx.appcompat.widget.AppCompatTextView import androidx.recyclerview.widget.RecyclerView import com.mogo.och.taxi.R -import com.mogo.och.taxi.bean.TaxiRoutingQueryLineResponse +import com.mogo.och.taxi.bean.GrayLineBean class TaxiRoutingChooseLineAdapter( private val mContext: Context, - private val mData: List + private val mData: List ) : RecyclerView.Adapter() { companion object { @@ -32,10 +32,10 @@ class TaxiRoutingChooseLineAdapter( override fun onBindViewHolder(holder: SwitchLineViewHolder, position: Int) { val currentPosition = holder.bindingAdapterPosition val data = mData[currentPosition] - holder.lineNameTextView.text = data.name - holder.todayVerifyNumTextView.text = "本车今日已验证:${data.todayVerifyNum}次" + holder.lineNameTextView.text = data.lineName + holder.todayVerifyNumTextView.text = "本车今日已验证:${data.carVerificationCount}次" holder.historyVerifyNumTextView.text = - "路线累计反馈${data.historyVerifyTotalUsableNum}可用,${data.historyVerifyTotalNotUsableNum}不可用" + "路线累计反馈${data.lineSuccessCount}可用,${data.lineFailCount}不可用" if (data.isChoosed) { holder.itemView.setBackgroundResource(R.drawable.routing_choose_line_shape_select_line_item_bg_selected) } else { diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineViewModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineViewModel.kt new file mode 100644 index 0000000000..b616f28e18 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineViewModel.kt @@ -0,0 +1,94 @@ +package com.mogo.och.taxi.ui.routing + +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.och.taxi.base.BaseViewModel +import com.mogo.och.taxi.base.IUiIntent +import com.mogo.och.taxi.bean.GrayLineBean +import com.mogo.och.taxi.bean.StartGrayAndQueryContrailRsp +import com.mogo.och.taxi.callback.ITaxiRoutingCallback + +class TaxiRoutingChooseLineViewModel : BaseViewModel(), + ITaxiRoutingCallback { + + private val TAG = SceneConstant.M_TAXI + "TaxiRoutingChooseLineViewModel" + + init { + TaxiRoutingModel.addTaxiRoutingListener(TAG, this) + } + + override fun initUiState(): TaxiRoutingUiState { + return TaxiRoutingUiState(RoutingUIState.Init) + } + + override fun handleIntent(intent: IUiIntent) { + when (intent) { + is TaxiRoutingUiIntent.QueryRoutingGrayLineList -> { + TaxiRoutingModel.queryRoutingGrayLineList() + } + + is TaxiRoutingUiIntent.StartTaskAndQueryContrail -> { + val contrailId = intent.grayLineBean.contrailId + TaxiRoutingModel.startGrayTaskAndQueryRoutingContrail( + contrailId ?: -1L, + intent.grayLineBean + ) + } + } + } + + override fun onQueryRoutingGrayLineListSuccess(data: MutableList) { + sendUiState { + copy( + routingUiState = RoutingUIState.ShowGrayLineList(data) + ) + } + } + + override fun onQueryRoutingGrayLineListFailed(errorStr: String) { +// sendUiState { +// copy( +// routingUiState = RoutingUIState.Init +// ) +// } + //TODO + val data: MutableList = mutableListOf() + for (i in 1..15) { + val result = GrayLineBean( + lineId = i + 1L, + lineName = "路线名称$i", + contrailId = i + 1L, + carVerificationCount = i, + lineSuccessCount = i, + lineFailCount = i, + isChoosed = false + ) + data.add(result) + } + sendUiState { + copy( + routingUiState = RoutingUIState.ShowGrayLineList(data) + ) + } + } + + override fun onStartGrayTaskAndQueryContrailSuccess(data: StartGrayAndQueryContrailRsp) { + sendUiState { + copy( + routingUiState = RoutingUIState.RoutingTask( + grayId = data.taskId, + grayLineBean = data.grayLineBean, + contrailBean = data.contrail + ) + ) + } + } + + override fun onStartGrayTaskAndQueryContrailFailed(errorStr: String) { + + } + + override fun onCleared() { + super.onCleared() + TaxiRoutingModel.removeTaxiRoutingListener(TAG) + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragment.kt index 18c41878a2..1462cdc8c5 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragment.kt @@ -1,12 +1,12 @@ package com.mogo.och.taxi.ui.routing -import android.content.Intent import android.os.Bundle -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import com.mogo.commons.mvp.BaseFragment import com.mogo.eagle.core.function.main.MainMoGoApplication +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.och.common.module.utils.FlowBus @@ -20,11 +20,12 @@ import kotlinx.android.synthetic.main.routing_fragment.headerTitleContainer import kotlinx.android.synthetic.main.routing_fragment.mCurrentTaskLayout import kotlinx.android.synthetic.main.routing_fragment.noDataContainer import kotlinx.android.synthetic.main.routing_fragment.taskTitleTv +import kotlinx.coroutines.flow.map class TaxiRoutingFragment : BaseFragment() { companion object { - const val TAG = SceneConstant.M_TAXI + "RoutingFragment" + const val TAG = SceneConstant.M_TAXI + "TaxiRoutingFragment" fun newInstance(): TaxiRoutingFragment { val args = Bundle() @@ -34,39 +35,69 @@ class TaxiRoutingFragment : BaseFragment() { } } + private val mViewModel: TaxiRoutingFragmentViewModel by lazy { + ViewModelProvider( + this, + ViewModelProvider.NewInstanceFactory() + )[TaxiRoutingFragmentViewModel::class.java] + } + override fun getLayoutId(): Int { return R.layout.routing_fragment } override fun getTagName(): String { - return "RoutingFragment" + return "TaxiRoutingFragment" } override fun initViews() { - btnChooseTask.setOnClickListener { - val intent = Intent(context, TaxiRoutingChooseTaskActivity::class.java) - startActivity(intent) - } - showChooseTaskView() - } - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { initEventBus() - return super.onCreateView(inflater, container, savedInstanceState) + initViewListener() + initViewModelObserver() } private fun initEventBus() { - FlowBus.with(TaxiDriverEventConst.RoutingActivityEvent.EVENT_TYPE_GET_CHOSEN_LINE_TASK_ID) - .register(this) { taskId -> - ToastUtils.showLong("接收到taskId:$taskId") - showCurrentLineTaskContentView() + FlowBus.with(TaxiDriverEventConst.RoutingActivityEvent.EVENT_TYPE_GET_CHOSEN_LINE_TASK_ID) + .register(this) { task -> + ToastUtils.showLong("接收到taskId:${task.grayId}") + mViewModel.sendUiIntent(TaxiRoutingUiIntent.ShowRoutingTask(task)) } } + private fun initViewListener() { + btnChooseTask.setOnClickListener { + mViewModel.sendUiIntent(TaxiRoutingUiIntent.StartChooseLineAction) + } + } + + private fun initViewModelObserver() { + lifecycleScope.launchWhenStarted { + mViewModel.uiStateFlow.map { it.routingUiState }.collect { routingUiState -> + CallerLogger.d( + TAG, + "uiStateFlow-initViewModelObserver: $routingUiState" + ) + when (routingUiState) { + is RoutingUIState.Init -> { + showChooseTaskView() + } + + is RoutingUIState.RoutingTask -> { + showCurrentLineTaskContentView(routingUiState) + } + + is RoutingUIState.ShowFinishTaskButton -> { + showFinishTaskView() + } + + is RoutingUIState.ShowFeedbackDialog -> { + showFeedbackDialog() + } + } + } + } + } + private fun showChooseTaskView() { noDataContainer.visibility = View.VISIBLE mCurrentTaskLayout.visibility = View.GONE @@ -77,17 +108,17 @@ class TaxiRoutingFragment : BaseFragment() { finishSubmitIssueGroup.visibility = View.GONE } - private fun showCurrentLineTaskContentView() { + private fun showCurrentLineTaskContentView(data: RoutingUIState.RoutingTask) { noDataContainer.visibility = View.GONE mCurrentTaskLayout.visibility = View.VISIBLE headerTitleContainer.visibility = View.VISIBLE - taskTitleTv.text = "测试任务测试任务" + taskTitleTv.text = data.grayLineBean.lineName btnChooseTask.visibility = View.GONE btnStartTask.visibility = View.VISIBLE btnStartTask.setOnClickListener { - showFinishTaskView() + mViewModel.sendUiIntent(TaxiRoutingUiIntent.StartTaskAction) } finishSubmitIssueGroup.visibility = View.GONE } @@ -97,7 +128,7 @@ class TaxiRoutingFragment : BaseFragment() { btnStartTask.visibility = View.GONE finishSubmitIssueGroup.visibility = View.VISIBLE btnFinishTask.setOnClickListener { - showFeedbackDialog() + mViewModel.sendUiIntent(TaxiRoutingUiIntent.ShowFeedbackDialog) } } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragmentViewModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragmentViewModel.kt new file mode 100644 index 0000000000..fbd9b4aab6 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragmentViewModel.kt @@ -0,0 +1,53 @@ +package com.mogo.och.taxi.ui.routing + +import android.content.Context +import android.content.Intent +import com.mogo.commons.AbsMogoApplication +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.och.taxi.base.BaseViewModel +import com.mogo.och.taxi.base.IUiIntent + +class TaxiRoutingFragmentViewModel : BaseViewModel() { + + companion object { + const val TAG = SceneConstant.M_TAXI + "TaxiRoutingFragmentViewModel" + } + + private val mContext: Context + get() = AbsMogoApplication.getApp().applicationContext + + override fun initUiState(): TaxiRoutingUiState { + return TaxiRoutingUiState(RoutingUIState.Init) + } + + override fun handleIntent(intent: IUiIntent) { + when (intent) { + is TaxiRoutingUiIntent.StartChooseLineAction -> { + val intent = Intent(mContext, TaxiRoutingChooseLineActivity::class.java) + mContext?.startActivity(intent) + } + + is TaxiRoutingUiIntent.ShowRoutingTask -> { + val task = intent.routingTask + sendUiState { + copy( + routingUiState = RoutingUIState.RoutingTask( + task.grayLineBean, + task.contrailBean, + task.grayId + ) + ) + } + } + + is TaxiRoutingUiIntent.StartTaskAction -> { + //TODO 启动自动驾驶 + sendUiState { + copy( + routingUiState = RoutingUIState.ShowFinishTaskButton + ) + } + } + } + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt new file mode 100644 index 0000000000..de6ccc7914 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt @@ -0,0 +1,154 @@ +package com.mogo.och.taxi.ui.routing + +import android.content.Context +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.commons.AbsMogoApplication +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +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.biz.network.OchCommonServiceCallback +import com.mogo.och.taxi.bean.GrayLineBean +import com.mogo.och.taxi.bean.QueryGrayContrailListRsp +import com.mogo.och.taxi.bean.StartGrayAndQueryContrailRsp +import com.mogo.och.taxi.callback.ITaxiRoutingCallback +import com.mogo.och.taxi.network.TaxiRoutingServiceManager +import java.util.concurrent.ConcurrentHashMap + +object TaxiRoutingModel { + private val TAG = SceneConstant.M_TAXI + TaxiRoutingModel::class.java.simpleName + + private val mContext: Context + get() = AbsMogoApplication.getApp().applicationContext + + private val mTaxiRoutingCallbackMap: ConcurrentHashMap = + ConcurrentHashMap() + + + fun addTaxiRoutingListener(tag: String, listener: ITaxiRoutingCallback) { + if (mTaxiRoutingCallbackMap.containsKey(tag)) { + return + } + mTaxiRoutingCallbackMap[tag] = listener + } + + fun removeTaxiRoutingListener(tag: String) { + if (!mTaxiRoutingCallbackMap.containsKey(tag)) { + return + } + mTaxiRoutingCallbackMap.remove(tag) + } + + fun queryRoutingGrayLineList() { + TaxiRoutingServiceManager.queryRoutingGrayLineList(mContext, + object : OchCommonServiceCallback { + override fun onSuccess(data: QueryGrayContrailListRsp) { + CallerLogger.d( + TAG, + "queryRoutingGrayLineList onSuccess: data=${GsonUtils.toJson(data)}" + ) + val result = mutableListOf() + data.data?.also { + result.addAll(it) + } + mTaxiRoutingCallbackMap.forEach { + val listener = it.value + listener.onQueryRoutingGrayLineListSuccess(result) + } + } + + override fun onFail(code: Int, msg: String?) { + CallerLogger.d( + TAG, + "queryRoutingGrayLineList onFail: code=$code, msg=$msg" + ) + ToastUtils.showShort("查询灰度线路列表异常, 请稍后重试, code=$code") + mTaxiRoutingCallbackMap.forEach { + val listener = it.value + listener.onQueryRoutingGrayLineListFailed( + msg ?: "查询灰度线路列表异常, 请稍后重试" + ) + } + } + + override fun onError() { + super.onError() + var hintStr = "" + if (!NetworkUtils.isConnected(mContext)) { + hintStr = "网络出现异常,请稍后重试" + ToastUtils.showShort(hintStr) + } else { + hintStr = "查询灰度线路列表异常, 请稍后重试" + ToastUtils.showShort(hintStr) + } + CallerLogger.d( + TAG, + "queryRoutingGrayLineList onError, msg=$hintStr" + ) + mTaxiRoutingCallbackMap.forEach { + val listener = it.value + listener.onQueryRoutingGrayLineListFailed(hintStr) + } + } + }) + } + + fun startGrayTaskAndQueryRoutingContrail(contrailId: Long, grayLineBean: GrayLineBean) { + TaxiRoutingServiceManager.startGrayTaskAndQueryRoutingContrail( + mContext, + sn = MoGoAiCloudClientConfig.getInstance().sn, + contrailId = contrailId, + grayLineBean = grayLineBean, + object : OchCommonServiceCallback { + override fun onSuccess(data: StartGrayAndQueryContrailRsp) { + CallerLogger.d( + TAG, + "startGrayTaskAndQueryRoutingContrail onSuccess: data=${ + GsonUtils.toJson( + data + ) + }" + ) + mTaxiRoutingCallbackMap.forEach { + val listener = it.value + listener.onStartGrayTaskAndQueryContrailSuccess(data) + } + } + + override fun onFail(code: Int, msg: String?) { + CallerLogger.d( + TAG, + "startGrayTaskAndQueryRoutingContrail onFail: code=$code, msg=$msg" + ) + mTaxiRoutingCallbackMap.forEach { + val listener = it.value + listener.onStartGrayTaskAndQueryContrailFailed( + msg ?: "startGrayTaskAndQueryRoutingContrail onFail" + ) + } + } + + override fun onError() { + super.onError() + var hintStr = "" + if (!NetworkUtils.isConnected(mContext)) { + hintStr = "网络出现异常,请稍后重试" + ToastUtils.showShort(hintStr) + } else { + hintStr = "开始任务并查询轨迹详情异常, 请稍后重试" + ToastUtils.showShort(hintStr) + } + CallerLogger.d( + TAG, + "startGrayTaskAndQueryRoutingContrail onError, msg=$hintStr" + ) + mTaxiRoutingCallbackMap.forEach { + val listener = it.value + listener.onStartGrayTaskAndQueryContrailFailed(hintStr) + } + } + } + ) + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingUiIntent.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingUiIntent.kt new file mode 100644 index 0000000000..f6c285633a --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingUiIntent.kt @@ -0,0 +1,26 @@ +package com.mogo.och.taxi.ui.routing + +import com.mogo.och.taxi.base.IUiIntent +import com.mogo.och.taxi.bean.GrayLineBean + +sealed class TaxiRoutingUiIntent : IUiIntent { + + //打开选择路线页面 + object StartChooseLineAction : TaxiRoutingUiIntent() + + //查询灰度线路列表 + object QueryRoutingGrayLineList : TaxiRoutingUiIntent() + + //开始一个任务并查询此任务对应的轨迹详情 + data class StartTaskAndQueryContrail(val grayLineBean: GrayLineBean) : TaxiRoutingUiIntent() + + //展示Routing任务信息 + data class ShowRoutingTask(val routingTask: RoutingUIState.RoutingTask) : + TaxiRoutingUiIntent() + + //开始任务 + object StartTaskAction : TaxiRoutingUiIntent() + + //展示结束任务反馈弹框 + object ShowFeedbackDialog : TaxiRoutingUiIntent() +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingUiState.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingUiState.kt new file mode 100644 index 0000000000..69c83eccee --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingUiState.kt @@ -0,0 +1,23 @@ +package com.mogo.och.taxi.ui.routing + +import com.mogo.och.taxi.base.IUiState +import com.mogo.och.taxi.bean.ContrailBean +import com.mogo.och.taxi.bean.GrayLineBean + +data class TaxiRoutingUiState(val routingUiState: RoutingUIState) : IUiState + +sealed class RoutingUIState { + object Init : RoutingUIState() + + data class RoutingTask( + val grayLineBean: GrayLineBean?, + val contrailBean: ContrailBean?, + val grayId: Long? + ) : RoutingUIState() + + object ShowFinishTaskButton : RoutingUIState() + object ShowFeedbackDialog : RoutingUIState() + data class ShowGrayLineList(var data: MutableList) : RoutingUIState() +} + + diff --git a/gradle.properties b/gradle.properties index b50da3f97c..ca1408ea13 100644 --- a/gradle.properties +++ b/gradle.properties @@ -163,7 +163,7 @@ TAXI_DRIVER_VERSION=6.1.2 TAXI_PASSENGER_VERSION=5.1.0 # 出租车模式司机端版本号 -TAXIUNMANNED_DRIVER_VERSION=6.1.2 +TAXIUNMANNED_DRIVER_VERSION=6.2.2 # 出租车模式乘客端端版本号 TAXIUNMANNED_PASSENGER_VERSION=5.1.0