diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/base/BaseViewModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/base/BaseViewModel.kt index db4c7dc6f8..043c1c71bb 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/base/BaseViewModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/base/BaseViewModel.kt @@ -6,7 +6,6 @@ import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @@ -20,21 +19,9 @@ abstract class BaseViewModel : ViewMod private val _uiStateFlow = MutableStateFlow(initUiState()) val uiStateFlow: StateFlow = _uiStateFlow - protected abstract fun initUiState(): UiState - - protected fun sendUiState(copy: UiState.() -> UiState){ - _uiStateFlow.update { copy(_uiStateFlow.value) } - } - private val _uiIntentFlow: Channel = Channel() val uiIntentFlow: Flow = _uiIntentFlow.receiveAsFlow() - fun sendUiIntent(uiIntent: UiIntent){ - viewModelScope.launch { - _uiIntentFlow.send(uiIntent) - } - } - init { viewModelScope.launch { uiIntentFlow.collect { @@ -43,5 +30,17 @@ abstract class BaseViewModel : ViewMod } } + protected abstract fun initUiState(): UiState + + protected fun sendUiState(copy: UiState.() -> UiState) { + _uiStateFlow.update { copy(_uiStateFlow.value) } + } + + fun sendUiIntent(uiIntent: UiIntent) { + viewModelScope.launch { + _uiIntentFlow.send(uiIntent) + } + } + protected abstract fun handleIntent(intent: IUiIntent) } \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/base/MviInterface.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/base/MviInterface.kt index 0ef921eb03..c79c9d3fc8 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/base/MviInterface.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/base/MviInterface.kt @@ -1,4 +1,5 @@ package com.mogo.och.taxi.base + import androidx.annotation.Keep /** diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiCarServiceCallback.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiCarServiceCallback.kt new file mode 100644 index 0000000000..712dfc3ebc --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiCarServiceCallback.kt @@ -0,0 +1,21 @@ +package com.mogo.och.taxi.callback + +import com.mogo.och.taxi.bean.QueryCurrentTaskRespBean +import com.mogo.och.taxi.bean.StartServiceRespBean + +interface ITaxiCarServiceCallback { + fun onCarEndServiceSuccess( + driveToNearestStationTask: StartServiceRespBean.Result?, + currentTaskWithOrder: QueryCurrentTaskRespBean.Result? + ) + + fun onCarEndServiceFailed(code: Int, msg: String) + fun onCarEndServiceError() + fun onCarStartServiceSuccess( + driveToNearestStationTask: StartServiceRespBean.Result?, + currentTaskWithOrder: QueryCurrentTaskRespBean.Result? + ) + + fun onCarStartServiceFailed(code: Int, msg: String) + fun onCarStartServiceError() +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiTaskCallback.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiTaskWithOrderCallback.kt similarity index 89% rename from OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiTaskCallback.kt rename to OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiTaskWithOrderCallback.kt index ea36b2d54c..14fcfcb8dc 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiTaskCallback.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiTaskWithOrderCallback.kt @@ -3,7 +3,7 @@ package com.mogo.och.taxi.callback import com.mogo.och.taxi.bean.QueryCurrentTaskRespBean import com.mogo.och.taxi.bean.TrajectoryListRespBean -interface ITaxiTaskCallback { +interface ITaxiTaskWithOrderCallback { fun onTaskWithOrderDataChanged(taskWithOrder: QueryCurrentTaskRespBean.Result?) fun onTaskCompleted(isOrderArrivedAtStart: Boolean, siteId: Long) fun onTaskTrajectoryDataChanged(data: TrajectoryListRespBean?) @@ -11,4 +11,5 @@ interface ITaxiTaskCallback { fun onOrderArriveAtEnd(orderNo: String) fun onOrderTotalMileAndDurationChanged(mileage: Float, duration: Int) fun onOrderJourneyCompleted() + fun onStartAutopilot() } \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/LoginBusImpl.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiDriverLoginImpl.kt similarity index 75% rename from OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/LoginBusImpl.kt rename to OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiDriverLoginImpl.kt index c57492cd1e..305a5cfd41 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/LoginBusImpl.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiDriverLoginImpl.kt @@ -9,13 +9,13 @@ import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean import com.mogo.och.common.module.biz.network.LoginDefaultManage import com.mogo.och.common.module.biz.network.OchCommonServiceCallback -class LoginBusImpl: LoginDefaultManage { +class TaxiDriverLoginImpl : LoginDefaultManage { override fun getPhoneCode( context: Context, phone: String?, callback: OchCommonServiceCallback? ) { - OchCommonServiceManager.getPhoneCode(context,phone,callback) + TaxiDriverLoginServiceManager.getPhoneCode(context, phone, callback) } override fun gotoLoginBycode( @@ -25,7 +25,7 @@ class LoginBusImpl: LoginDefaultManage { location4Login: TaxiLoginReqBean.Location4Login?, callback: OchCommonServiceCallback? ) { - OchCommonServiceManager.gotoLoginBycode(context,phone,code,location4Login,callback) + TaxiDriverLoginServiceManager.gotoLoginBycode(context, phone, code, location4Login, callback) } override fun logout( @@ -33,15 +33,13 @@ class LoginBusImpl: LoginDefaultManage { location4Login: TaxiLogoutReqBean.Location4Login?, callback: OchCommonServiceCallback? ) { - OchCommonServiceManager.logout(context,location4Login,callback) + TaxiDriverLoginServiceManager.logout(context, location4Login, callback) } override fun queryDriverServiceStatus( context: Context, callback: OchCommonServiceCallback? ) { - OchCommonServiceManager.queryDriverServiceStatus(context,callback) + TaxiDriverLoginServiceManager.queryDriverServiceStatus(context, callback) } - - } \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/OchLoginServiceApi.java b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiDriverLoginServiceApi.java similarity index 73% rename from OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/OchLoginServiceApi.java rename to OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiDriverLoginServiceApi.java index 14cc0a6e89..dd841840bf 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/OchLoginServiceApi.java +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiDriverLoginServiceApi.java @@ -1,10 +1,9 @@ package com.mogo.och.taxi.network; + import com.mogo.eagle.core.data.BaseData; import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; -import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean; import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean; import com.mogo.och.common.module.biz.bean.TaxiLoginSmsReqBean; -import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean; import com.mogo.och.taxi.bean.UnmannedLoginReqBean; import com.mogo.och.taxi.bean.UnmannedLogoutReqBean; @@ -18,28 +17,30 @@ import retrofit2.http.Query; /** * Created by pangfan on 2021/8/19 - * + *

* 网约车-出租车接口定义 */ -interface OchLoginServiceApi { +interface TaxiDriverLoginServiceApi { /** * 获取手机验证码 * * @return */ - @Headers( {"Content-type:application/json;charset=UTF-8"} ) - @POST( "/och-taxi-cabin/api/sms/v1/sendSms" ) + @Headers({"Content-type:application/json;charset=UTF-8"}) + @POST("/och-taxi-cabin/api/sms/v1/sendSms") Observable getPhoneCode(@Header("appId") String appId , @Header("ticket") String ticket, @Body TaxiLoginSmsReqBean data); + /** * 通过验证码登录 + * * @param appId * @param ticket * @param data * @return */ - @Headers( {"Content-type:application/json;charset=UTF-8"} ) - @POST( "/och-taxi-cabin/api/flow/v1/startOperation" ) + @Headers({"Content-type:application/json;charset=UTF-8"}) + @POST("/och-taxi-cabin/api/flow/v1/startOperation") Observable gotoLoginBycode4Taxi(@Header("appId") String appId , @Header("ticket") String ticket, @Body UnmannedLoginReqBean data); @@ -49,16 +50,17 @@ interface OchLoginServiceApi { @Headers({"Content-type:application/json;charset=UTF-8"}) @POST("/och-taxi-cabin/api/flow/v1/endOperation") Observable logout4Taxi(@Header("appId") String appId, @Header("ticket") String ticket, - @Body UnmannedLogoutReqBean data); + @Body UnmannedLogoutReqBean data); /** * 接单状态和登录状态查询 出租车司机端、小巴车司机端、小巴车乘客端 + * * @param sn * @return */ - @Headers( {"Content-type:application/json;charset=UTF-8"} ) - @GET( "/och-taxi-cabin/api/business/v1/loginStatus") - Observable queryDriverServiceStatusAndLoginStatus(@Header ("appId") String appId + @Headers({"Content-type:application/json;charset=UTF-8"}) + @GET("/och-taxi-cabin/api/business/v1/loginStatus") + Observable queryDriverServiceStatusAndLoginStatus(@Header("appId") String appId , @Header("ticket") String ticket, @Query("sn") String sn); } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/OchCommonServiceManager.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiDriverLoginServiceManager.kt similarity index 96% rename from OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/OchCommonServiceManager.kt rename to OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiDriverLoginServiceManager.kt index 6dc3f41321..728c44e314 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/OchCommonServiceManager.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiDriverLoginServiceManager.kt @@ -24,13 +24,13 @@ import com.mogo.och.taxi.bean.UnmannedLogoutReqBean /** * Created by pangfan on 2021/8/19 */ -object OchCommonServiceManager { +object TaxiDriverLoginServiceManager { private const val TAG = "OchCommonServiceManager" - private val mOCHTaxiServiceApi: OchLoginServiceApi = + private val mOCHTaxiServiceApi: TaxiDriverLoginServiceApi = MoGoRetrofitFactory.getInstance(getBaseUrl()).create( - OchLoginServiceApi::class.java + TaxiDriverLoginServiceApi::class.java ) /** diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/UnmannedTaskServiceApi.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiTaskWithOrderServiceApi.kt similarity index 99% rename from OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/UnmannedTaskServiceApi.kt rename to OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiTaskWithOrderServiceApi.kt index 542e734cff..7bbfce05b0 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/UnmannedTaskServiceApi.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiTaskWithOrderServiceApi.kt @@ -27,7 +27,7 @@ import retrofit2.http.Query * @author: wangmingjun * @date: 2023/7/26 */ -interface UnmannedTaskServiceApi { +interface TaxiTaskWithOrderServiceApi { /** * 开始接单 diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiTaskWithOrderServiceManager.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiTaskWithOrderServiceManager.kt index c5a4d65552..ddc81e46be 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiTaskWithOrderServiceManager.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiTaskWithOrderServiceManager.kt @@ -27,9 +27,9 @@ import com.mogo.och.taxi.bean.TrajectoryListRespBean */ object TaxiTaskWithOrderServiceManager { - private var mOCHTaxiServiceApi: UnmannedTaskServiceApi = + private var mOCHTaxiServiceApi: TaxiTaskWithOrderServiceApi = MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create( - UnmannedTaskServiceApi::class.java + TaxiTaskWithOrderServiceApi::class.java ) /** diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiFragment.kt index d23252ae4e..53e881b4d3 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiFragment.kt @@ -12,11 +12,13 @@ import com.mogo.eagle.core.data.temp.EventLogout import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.och.common.module.biz.constant.OchCommonConst import com.mogo.och.common.module.biz.provider.LoginService import com.mogo.och.taxi.R import com.mogo.och.taxi.bean.QueryCurrentTaskRespBean -import com.mogo.och.taxi.network.LoginBusImpl +import com.mogo.och.taxi.constant.TaxiOrderStatusEnum +import com.mogo.och.taxi.network.TaxiDriverLoginImpl import com.mogo.och.taxi.ui.personal.TaxiPersonalDialogFragment import com.mogo.och.taxi.ui.task.TaxiTaskModel import com.mogo.och.taxi.ui.task.TaxiTaskTabFragment @@ -85,7 +87,7 @@ class TaxiFragment : BaseTaxiTabFragment(), loginService = ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation() as LoginService if (loginService != null) { - loginService!!.registerFragment(this, presenter, LoginBusImpl()) + loginService!!.registerFragment(this, presenter, TaxiDriverLoginImpl()) } } @@ -230,7 +232,19 @@ class TaxiFragment : BaseTaxiTabFragment(), } findViewById(R.id.test_bar_start_service_confirm)?.setOnClickListener { - TaxiTaskModel.toStartTask() + if (!TaxiTaskModel.checkCurrentTaskCondition()) { + ToastUtils.showShort("无任务!") + return@setOnClickListener + } + //当前订单状态若为20 , 则使用的lineId为订单信息的 + TaxiTaskModel.getCurTaskAndOrder()?.let { + TaxiTaskModel.startTask( + if (it.order != null && it.order!!.orderStatus >= TaxiOrderStatusEnum.ArriveAtStart.code) + it.order!!.orderLine + else + it.lineId + ) + } } findViewById(R.id.test_bar_on_the_way_to_end)?.setOnClickListener { diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiPresenter.java b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiPresenter.java index 388eb365dc..6477a91d16 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiPresenter.java +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiPresenter.java @@ -37,7 +37,7 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS public TaxiPresenter(TaxiFragment view) { super(view); - TaxiTaskModel.INSTANCE.init(AbsMogoApplication.getApp()); + TaxiTaskModel.INSTANCE.init(); OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp()); initListeners(); } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/navi/auto/RoutingNaviPresenter.java b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/navi/auto/RoutingNaviPresenter.java index 69160ee3b2..6a5c1f0adc 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/navi/auto/RoutingNaviPresenter.java +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/navi/auto/RoutingNaviPresenter.java @@ -21,7 +21,7 @@ import java.util.List; /** * @author congtaowang * @since 2021/1/18 - * + *

* 描述 */ public class RoutingNaviPresenter extends Presenter implements IOCHTaxiAutopilotPlanningCallback { @@ -30,31 +30,31 @@ public class RoutingNaviPresenter extends Presenter imp public RoutingNaviPresenter(TaxiRoutingNaviFragment view) { super(view); - TaxiTaskModel.INSTANCE.init(AbsMogoApplication.getApp()); + TaxiTaskModel.INSTANCE.init(); initListeners(); } @Override - public void onCreate( @NonNull LifecycleOwner owner ) { - super.onCreate( owner ); - CallerLogger.d( M_TAXI + TAG, " onCreate" ); + public void onCreate(@NonNull LifecycleOwner owner) { + super.onCreate(owner); + CallerLogger.d(M_TAXI + TAG, " onCreate"); } @Override - public void onDestroy( @NonNull LifecycleOwner owner ) { - super.onDestroy( owner ); + public void onDestroy(@NonNull LifecycleOwner owner) { + super.onDestroy(owner); } private void initListeners() { TaxiTaskModel.INSTANCE.setMoGoAutopilotPlanningListener(this); } - private void runOnUIThread( Runnable executor ) { - if ( executor == null ) { + private void runOnUIThread(Runnable executor) { + if (executor == null) { return; } - if ( Looper.myLooper() != Looper.getMainLooper() ) { - UiThreadHandler.post( executor ); + if (Looper.myLooper() != Looper.getMainLooper()) { + UiThreadHandler.post(executor); } else { executor.run(); } @@ -62,11 +62,11 @@ public class RoutingNaviPresenter extends Presenter imp @Override public void setLineMarker(LatLng startStation, LatLng endStation) { - runOnUIThread(() -> mView.setLineMarker(startStation,endStation)); + runOnUIThread(() -> mView.setLineMarker(startStation, endStation)); } @Override public void routeResult(List routeArrivied, List routeArriving, MogoLocation location) { - mView.routeResult(routeArrivied,routeArriving,location); + mView.routeResult(routeArrivied, routeArriving, location); } } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskFragment.kt index 972c8a0329..d65c017f63 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskFragment.kt @@ -149,7 +149,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), } private fun initViewModelObserver() { - mViewModel.sendUiIntent(UnmannedIntent.StartTaskOrOrderLooper) + mViewModel.sendUiIntent(UnmannedIntent.StartTaskWithOrderLooper) //监听返回的数据状态 lifecycleScope.launchWhenStarted { @@ -245,7 +245,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), } fun onCarTakeOrderStatusChanged() { - mViewModel.sendUiIntent(UnmannedIntent.StartOrPauseTakeOrder) + mViewModel.sendUiIntent(UnmannedIntent.StartOrEndTakeOrder) } private fun updateRemainDistanceAndTime(isVoicePlay: Boolean) { @@ -559,7 +559,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), if (mCurrentTaskWithOrder == null || mCurrentTaskWithOrder!!.order == null) return val order = mCurrentTaskWithOrder!!.order if (TaxiOrderStatusEnum.ArriveAtStart.code == order!!.orderStatus) { //到达乘客上车点,司机可跳过乘客屏认证 - mViewModel.sendUiIntent(UnmannedIntent.JumpPassengerCheckDone) + mViewModel.sendUiIntent(UnmannedIntent.JumpPassengerCheck) } else if (TaxiOrderStatusEnum.UserArriveAtStart.code == order.orderStatus) { mViewModel.sendUiIntent(UnmannedIntent.StartTask) } else if (TaxiOrderStatusEnum.ArriveAtEnd.code == order.orderStatus) { //点击了完成服务,结束订单并更新订单信息 diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt index ea3c90e398..bf11fea391 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt @@ -1,61 +1,48 @@ package com.mogo.och.taxi.ui.task -import android.annotation.SuppressLint -import android.content.Context import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager import com.mogo.eagle.core.network.utils.GsonUtil import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.i import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.NetworkUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler -import com.mogo.och.common.module.biz.constant.LoginStatusManager -import com.mogo.och.common.module.biz.constant.LoginStatusManager.isLogin import com.mogo.och.common.module.biz.network.OchCommonServiceCallback import com.mogo.och.common.module.utils.ToastUtilsOch import com.mogo.och.common.module.voice.VoiceNotice import com.mogo.och.taxi.R import com.mogo.och.taxi.base.BaseViewModel import com.mogo.och.taxi.base.IUiIntent -import com.mogo.och.taxi.bean.TrajectoryListRespBean -import com.mogo.och.taxi.bean.PrepareTaskRespBean -import com.mogo.och.taxi.bean.QueryCarOrderByNoRespBean import com.mogo.och.taxi.bean.QueryCurrentTaskRespBean import com.mogo.och.taxi.bean.StartServiceRespBean +import com.mogo.och.taxi.bean.TrajectoryListRespBean +import com.mogo.och.taxi.callback.ITaxiCarServiceCallback +import com.mogo.och.taxi.callback.ITaxiTaskWithOrderCallback import com.mogo.och.taxi.constant.TaskStatusEnum -import com.mogo.och.taxi.constant.TaskTypeEnum import com.mogo.och.taxi.constant.TaxiOrderStatusEnum import com.mogo.och.taxi.constant.TaxiUnmannedConst -import com.mogo.och.taxi.constant.TaxtServingStatusManager.isOpeningOrderStatus import com.mogo.och.taxi.network.TaxiTaskWithOrderServiceManager import com.mogo.och.taxi.network.TaxiTaskWithOrderServiceManager.cancelOrder -import com.mogo.och.taxi.network.TaxiTaskWithOrderServiceManager.contrailList -import com.mogo.och.taxi.network.TaxiTaskWithOrderServiceManager.queryCarOrderByOrderNo -import com.mogo.och.taxi.ui.task.TaxiTaskModel import com.mogo.och.taxi.ui.unmanned.TaskWithOrderUIState import com.mogo.och.taxi.ui.unmanned.UnmannedIntent import com.mogo.och.taxi.ui.unmanned.UnmannedState -import io.reactivex.Observable -import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.disposables.Disposable -import io.reactivex.schedulers.Schedulers -import java.util.concurrent.TimeUnit +import com.mogo.och.taxi.utils.TaxiTrajectoryManager /** * @author: wangmingjun * @date: 2023/7/26 */ -class TaxiCurrentTaskViewModel : BaseViewModel() { +class TaxiCurrentTaskViewModel : BaseViewModel(), + ITaxiTaskWithOrderCallback, ITaxiCarServiceCallback { - private var mInAndWaitServiceDisposable: Disposable? = null //进行中、待服务订单列表轮询 - private var mCurrentTaskAndOrder: QueryCurrentTaskRespBean.Result? = null - private val TAG = "TaxiUnmannedViewModel" + private val TAG = SceneConstant.M_TAXI + "TaxiUnmannedViewModel" - @SuppressLint("StaticFieldLeak") - private var mContext: Context = AbsMogoApplication.getApp().applicationContext + init { + TaxiTaskModel.setTaskWithOrderCallback(this) + TaxiTaskModel.setCarServiceCallback(this) + } override fun initUiState(): UnmannedState { return UnmannedState(TaskWithOrderUIState.Init) @@ -63,16 +50,16 @@ class TaxiCurrentTaskViewModel : BaseViewModel() override fun handleIntent(intent: IUiIntent) { when (intent) { - is UnmannedIntent.StartTaskOrOrderLooper -> { //开始轮询 - startOrStopOrderLoop(true) + is UnmannedIntent.StartTaskWithOrderLooper -> { //开始轮询 + startOrStopCurrentTaskWithOrderLoop(true) } - is UnmannedIntent.StartOrPauseTakeOrder -> {//开始、暂停接单 - updateCarStatus() + is UnmannedIntent.StartOrEndTakeOrder -> {//开始、暂停接单 + TaxiTaskModel.updateCarServingStatus() } - is UnmannedIntent.JumpPassengerCheckDone -> { //手动点击跳过乘客验证 - jumpPassengerCheckDone() + is UnmannedIntent.JumpPassengerCheck -> { //手动点击跳过乘客验证 + jumpPassengerCheck() } is UnmannedIntent.JourneyCompleted -> { //点击服务完成 @@ -80,168 +67,113 @@ class TaxiCurrentTaskViewModel : BaseViewModel() } is UnmannedIntent.CloseOrderByDriver -> { - if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null) { - val site = mCurrentTaskAndOrder!!.order!!.orderEndSite - TaxiTaskModel.submitArriveSite(site!!.siteId, true) - } + closeOrderByDriver() } is UnmannedIntent.CancelOrder -> {// 取消订单, 暂未加取消类型和原因 - handleCancelOrder(intent.type) + cancelOrder(intent.type) } is UnmannedIntent.StartTask -> { - TaxiTaskModel.toStartTask() + startTask() } } } - private fun handleCancelOrder(cancelType: Int) { - if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null) { - cancelOrder(mContext, mCurrentTaskAndOrder!!.order!!.orderNo, cancelType, + fun startOrStopCurrentTaskWithOrderLoop(start: Boolean) { + d(TAG, "startOrStopCurrentTaskWithOrderLoop(): isStart=$start") + if (start) { + TaxiTaskModel.startQueryCurrentTaskWithOrderLoop() + } else { + TaxiTaskModel.stopQueryCurrentTaskWithOrderLoop() + } + } + + private fun cancelOrder(cancelType: Int) { + val currentTaskWithOrder = TaxiTaskModel.getCurTaskAndOrder() + currentTaskWithOrder?.order?.also { + cancelOrder(AbsMogoApplication.getApp().applicationContext, + it.orderNo, + cancelType, object : OchCommonServiceCallback { override fun onSuccess(data: BaseData?) { - d(SceneConstant.M_TAXI + TAG, "handleCancelOrder() = onSuccess") + d(TAG, "handleCancelOrder() = onSuccess") } override fun onFail(code: Int, msg: String?) { - d(SceneConstant.M_TAXI + TAG, "handleCancelOrder() $code $msg") + d(TAG, "handleCancelOrder() $code $msg") } - }) } } - /** - * 更新接单状态 - */ - private fun updateCarStatus() { - if (!isLogin()) { - TaxiTaskModel.loginService!!.queryLoginStatusByNet() - return - } - if (isOpeningOrderStatus()) {//接单状态下,去结束 - TaxiTaskWithOrderServiceManager.endService(mContext, + private fun jumpPassengerCheck() { + val currentTaskWithOrder = TaxiTaskModel.getCurTaskAndOrder() + currentTaskWithOrder?.order?.also { + TaxiTaskWithOrderServiceManager.jumpPassengerCheck(AbsMogoApplication.getApp().applicationContext, + it.orderNo, object : OchCommonServiceCallback { override fun onSuccess(data: BaseData?) { - TaxiTaskModel.loginService!!.queryLoginStatusByNet() - //需要将虚拟任务停掉, 虚拟任务会再开始接单后获取新的 - d(TAG, "set mUntruthSiteTask null") - updateDriveToNearestStationTaskUI(null) - updateUntruthTask(null) - - if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.endSite != null - && mCurrentTaskAndOrder!!.startSite != null - && mCurrentTaskAndOrder!!.currentStatus < TaskStatusEnum.CompleteTask.code - ) { - VoiceNotice.showNotice("暂停接单啦!要完成当前订单哦") - } else { - VoiceNotice.showNotice("暂停接单啦") - } - - } - - override fun onError() { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort(mContext.getString(R.string.network_error_tip)) - } else { - ToastUtils.showShort(mContext.getString(R.string.request_error_tip)) - } - } - - override fun onFail(code: Int, msg: String) { - ToastUtilsOch.showWithCodeMessage(code, msg) - } - - }) - - } else {//暂停接单状态下,去接单 - TaxiTaskWithOrderServiceManager.startService(mContext, - CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude, - CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().longitude, - object : OchCommonServiceCallback { - override fun onSuccess(data: StartServiceRespBean?) { - if (data == null || data.code != 0) return - TaxiTaskModel.loginService!!.queryLoginStatusByNet() - VoiceNotice.showNotice("开始接单啦") - d(TAG, "data.data=" + GsonUtil.jsonFromObject(data.data)) - if (mCurrentTaskAndOrder == null) return - if (mCurrentTaskAndOrder!!.endSite != null) { - if (mCurrentTaskAndOrder!!.currentStatus == TaskStatusEnum.CompleteTask.code - && mCurrentTaskAndOrder!!.order != null - ) { //有任务, 状态为3, 且有订单 - return - } else if (mCurrentTaskAndOrder!!.currentStatus < TaskStatusEnum.CompleteTask.code) { - //有任务, 并且未执行完成 - return - } - } - updateDriveToNearestStationTaskUI(data.data) - updateUntruthTask(data.data) + d(TAG, "jumpPassengerCheck onSuccess:") } override fun onFail(code: Int, msg: String?) { - ToastUtilsOch.showWithCodeMessage( - code, - "$msg curLatitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude}" + - " curLongitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().longitude}" - ) - } - - override fun onError() { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort(mContext.getString(R.string.network_error_tip)) - } else { - ToastUtils.showShort(mContext.getString(R.string.request_error_tip)) - } + d(TAG, "jumpPassengerCheck onFail: code=$code, msg=$msg") } }) } } private fun journeyCompleted() { - if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null) { + val currentTaskWithOrder = TaxiTaskModel.getCurTaskAndOrder() + currentTaskWithOrder?.order?.also { TaxiTaskWithOrderServiceManager.orderCompleted(AbsMogoApplication.getApp().applicationContext, - mCurrentTaskAndOrder!!.order!!.orderNo, + it.orderNo, object : OchCommonServiceCallback { override fun onSuccess(data: BaseData?) { - d(SceneConstant.M_TAXI + TAG, "orderCompleted() = onSuccess") + d(TAG, "journeyCompleted onSuccess") } override fun onFail(code: Int, msg: String?) { - d(SceneConstant.M_TAXI + TAG, "orderCompleted() $code $msg") + d(TAG, "journeyCompleted onFail: code=$code, msg=$msg") } }) } } - private fun jumpPassengerCheckDone() { - if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null) { - TaxiTaskWithOrderServiceManager.jumpPassengerCheck(AbsMogoApplication.getApp().applicationContext, - mCurrentTaskAndOrder!!.order!!.orderNo, - object : OchCommonServiceCallback { - override fun onSuccess(data: BaseData?) { - d(SceneConstant.M_TAXI + TAG, "jumpPassengerCheckDone() = onSuccess") - } - - override fun onFail(code: Int, msg: String?) { - d(SceneConstant.M_TAXI + TAG, "jumpPassengerCheckDone() $code $msg") - } - }) + private fun closeOrderByDriver() { + val currentTaskWithOrder = TaxiTaskModel.getCurTaskAndOrder() + currentTaskWithOrder?.order?.orderEndSite?.also { + TaxiTaskModel.submitArriveSite(it.siteId, true) } } - private fun updateUntruthTask(result: StartServiceRespBean.Result?) { - TaxiTaskModel.updateUntruthTask(result) + private fun startTask() { + if (!TaxiTaskModel.checkCurrentTaskCondition()) { + ToastUtils.showShort("无任务!") + return + } + //当前订单状态若为20 , 则使用的lineId为订单信息的 + TaxiTaskModel.getCurTaskAndOrder()?.let { + TaxiTaskModel.startTask( + if (it.order != null && it.order!!.orderStatus >= TaxiOrderStatusEnum.ArriveAtStart.code) + it.order!!.orderLine + else + it.lineId + ) + } } - private fun updateTaskAndOrderUi() { - d(TAG, "queryCurrentTaskOnce = updateTaskAndOrderUi") - + private fun updateTaskAndOrderUi(currentTaskWithOrder: QueryCurrentTaskRespBean.Result?) { + d( + TAG, "updateTaskAndOrderUi: currentTaskWithOrder=${ + GsonUtil.getGson().toJson(currentTaskWithOrder) + }" + ) sendUiState { copy( taskWithOrderUIState = TaskWithOrderUIState.TaskWithOrder( - mCurrentTaskAndOrder + currentTaskWithOrder ) ) } @@ -258,257 +190,123 @@ class TaxiCurrentTaskViewModel : BaseViewModel() } } - private fun updateNoTaskWithOrderUI() { - sendUiState { - copy( - taskWithOrderUIState = TaskWithOrderUIState.TaskWithOrder( - null - ) - ) - } - } - - fun startOrStopOrderLoop(start: Boolean) { - d(SceneConstant.M_TAXI + TAG, "startOrStopOrderLoop() $start") - if (start) { - startInAndWaitCurrentTaskLoop() - } else { - stopInAndWaitCurrentTaskLoop() - } - } - - private fun queryCurrentTaskOnce() { - if (!LoginStatusManager.isLogin()) return // 未登陆则不去查询 - TaxiTaskWithOrderServiceManager.queryCurrentTask(AbsMogoApplication.getApp().applicationContext, - object : OchCommonServiceCallback { - override fun onSuccess(data: QueryCurrentTaskRespBean?) { - if (data === null) return - if (data.data === null) return - if (data.code != 0) return - - val result = data.data - - d(TAG, "queryCurrentTaskOnce = result = " + GsonUtil.jsonFromObject(result)) - - d( - TAG, - "queryCurrentTaskOnce = mCurrentTaskAndOrder = " + GsonUtil.jsonFromObject( - mCurrentTaskAndOrder - ) - ) - - - if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null && - result != null && result.order == null - ) { - //本地根据订单 orderNo 去查询下(乘客取消订单) - d( - TAG, - "queryCurrentTaskOnce1 = result order is empty, query order by orderNo!" - ) - queryCurrentOrderStatusByNo(mCurrentTaskAndOrder!!.order!!.orderNo) - return - } - - //订单或者伪任务更新, 都去刷新下界面 - if (mCurrentTaskAndOrder == null || !mCurrentTaskAndOrder!!.equals(result)) { - d(TAG, "queryCurrentTaskOnce1 = mCurrentTaskAndOrder update ") - if (result == null) return - - if (result.endSite == null && result.order == null) { - mCurrentTaskAndOrder = null - updateNoTaskWithOrderUI() - TaxiTaskModel.updateCurrentTaskAndOrder(null) - } - - //当前任务完成且订单状态到达乘客上车点, 则立马去拉取任务 不再等30s,否则送驾任务要等30s后才能去执行 - if (result.currentStatus == TaskStatusEnum.CompleteTask.code) { - if (result.order != null && result.order!!.orderStatus - == TaxiOrderStatusEnum.ArriveAtStart.code - ) { - pullTask(result.endSite!!.siteId) - d(TAG, "queryCurrentTaskOnce1 = pullTask") - - } else { - startPrepareTask120S(result.endSite!!.siteId) - d(TAG, "queryCurrentTaskOnce1 = startPrepareTask120S") - - } - } - - mCurrentTaskAndOrder = result - TaxiTaskModel.updateCurrentTaskAndOrder(result) - TaxiTaskModel.updateStation() - updateTaskAndOrderUi() - if (result.order != null && result.order!!.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.code) { - d(TAG, "queryCurrentTaskOnce1 = ArriveAtEnd query mileage and duration") - queryCurrentOrderStatusByNo(result.order!!.orderNo) //查询全程里程和用时,更新 - } - - //根据lineId集合去查轨迹集合, 返回的只是接驾任务的line集合,没有送驾任务 - if (result.order != null && result.order!!.orderStatus <= TaxiOrderStatusEnum.OnTheWayToEnd.code) { - var lines = result.order!!.planningLines - lines = lines.plus(result.order!!.orderLine) - d(TAG, "queryCurrentTaskOnce1 = by lineIds query Contrails") - queryOrderPickUpContrails(lines) - } - - if (result.currentStatus <= TaskStatusEnum.StartTask.code) {//任务执行中, 去加载下轨迹 - d(TAG, "queryCurrentTaskOnce1 = by lineId query Contrail") - TaxiTaskModel.queryTaskContrail(Array(1) { result.lineId }) - } - - if (result.taskType <= TaskTypeEnum.ToOrderStartTask.code - && result.currentStatus == TaskStatusEnum.GetTask.code - ) {//自动去启动自驾 - if (!(result.order != null && result.order!!.orderStatus >= TaxiOrderStatusEnum.ArriveAtStart.code)) { - d(TAG, "queryCurrentTaskOnce1 = autoStartDriving") - TaxiTaskModel.autoStartDriving() - return - } - } - } - } - - override fun onFail(code: Int, msg: String?) { - d(TAG, "queryCurrentTaskOnce = $code, $msg") - } - - }) - } - - /** - * 查询送驾任务轨迹集合 - * 注: 运营单刚来的时候, 有可能还在运行一个演练任务, 要先跑完演练任务才跑运营单 - */ - private fun queryOrderPickUpContrails(planningLines: Array?) { - if (planningLines == null) return - contrailList(mContext, planningLines, - object : OchCommonServiceCallback { - override fun onSuccess(data: TrajectoryListRespBean?) { - if (data == null || data.code != 0) return - val contrails = data.data - if (mCurrentTaskAndOrder != null) { - TaxiTaskModel.updateOrderContrails(contrails) - } - } - - override fun onFail(code: Int, msg: String?) { - d(SceneConstant.M_TAXI + TAG, "queryOrderContrail code=$code,msg=$msg") - } - - }) - } - - private fun queryCurrentOrderStatusByNo(orderNo: String) { - queryCarOrderByOrderNo(mContext, orderNo, - object : OchCommonServiceCallback { - override fun onSuccess(data: QueryCarOrderByNoRespBean?) { - d( - SceneConstant.M_TAXI + TAG, "queryCurrentOrderStatusByNo data = " + - GsonUtil.jsonFromObject(data) - ) - if (data == null || data.code != 0) return - if (data.data.orderStatus == TaxiOrderStatusEnum.Cancel.code) { - VoiceNotice.showNotice("乘客已经取消") - mCurrentTaskAndOrder = null - updateNoTaskWithOrderUI() - //2020.8.23 到站后不再调用取消自驾. 原因是取消自驾,D档位会溜车 -// TaxiModel.cancelAutopilot() - return - } - if (data.data.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.code) {//到站 - //结束导航 - updateOrderMileAndDur(data.data.mileage, data.data.duration.toInt()) - return - } - if (data.data.orderStatus == TaxiOrderStatusEnum.JourneyCompleted.code) {//完成 - //获取新的任务 - if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.endSite != null) { - startPrepareTask120S(mCurrentTaskAndOrder!!.endSite!!.siteId) - } - mCurrentTaskAndOrder = null - updateNoTaskWithOrderUI() - return - } - } - - override fun onFail(code: Int, msg: String?) { - d( - SceneConstant.M_TAXI + TAG, - "queryCurrentOrderStatusByNo() code=$code,msg=$msg" - ) - } - - }) - } - - private fun updateOrderMileAndDur(mileage: Float, duration: Int) { - d(TAG, "queryCurrentTaskOnce = updateTaskAndOrderUi") - + private fun updateOrderTotalMileAndDurationUI(mileage: Float, duration: Int) { + d(TAG, "updateOrderTotalMileAndDurationUI") sendUiState { copy( taskWithOrderUIState = TaskWithOrderUIState.UpdateTaskTripInfo( - mileage, - duration + mileage, duration ) ) } } - private fun startPrepareTask120S(siteId: Long) { + + override fun onTaskWithOrderDataChanged(result: QueryCurrentTaskRespBean.Result?) { + d(TAG, "onTaskWithOrderChanged = result = " + GsonUtil.jsonFromObject(result)) + result?.also { + updateTaskAndOrderUi(result) + } + } + + override fun onTaskCompleted(isOrderArrivedAtStart: Boolean, siteId: Long) { + d(TAG, "onTaskCompleted: isOrderArrivedAtStart=$isOrderArrivedAtStart, siteId=$siteId") + if (isOrderArrivedAtStart) { + TaxiTaskModel.prepareNextTask(siteId) + } else { + TaxiTaskModel.startPrepareTask120S(siteId) + } + } + + override fun onTaskTrajectoryDataChanged(data: TrajectoryListRespBean?) { + TaxiTrajectoryManager.getInstance().syncTrajectoryInfo() + } + + override fun onOrderCancel() { + VoiceNotice.showNotice("乘客已经取消") + updateTaskAndOrderUi(null) + } + + override fun onOrderArriveAtEnd(orderNo: String) { + TaxiTaskModel.queryOrderByOrderNo(orderNo) + } + + override fun onOrderTotalMileAndDurationChanged(mileage: Float, duration: Int) { + //更新总全程信息(公里和分钟) + updateOrderTotalMileAndDurationUI(mileage, duration) + } + + override fun onOrderJourneyCompleted() { + updateTaskAndOrderUi(null) + //获取新的任务 + val currentTaskWithOrder = TaxiTaskModel.getCurTaskAndOrder() + currentTaskWithOrder?.endSite?.also { + TaxiTaskModel.startPrepareTask120S(it.siteId) + } + } + + override fun onStartAutopilot() { UiThreadHandler.postDelayed({ - pullTask(siteId) - }, TaxiUnmannedConst.TIMER_PREPARE_TASK_INTERVAL) + startTask() //状态流转 + TaxiTaskModel.startAutoPilot() //自驾开启 + VoiceNotice.showNotice("车辆正在自动开启自动驾驶") + }, TaxiUnmannedConst.START_AUTOPILOT_COUNTDOWN_INTERVAL) // 10s后开启自驾, 状态流转 } - private fun pullTask(siteId: Long) { - TaxiTaskWithOrderServiceManager.prepareTask( - mContext, - siteId, - object : OchCommonServiceCallback { - override fun onSuccess(data: PrepareTaskRespBean?) { - d( - SceneConstant.M_TAXI + TAG, "prepareTask = " + GsonUtil.jsonFromObject(data) - + ", isOpeningOrderStatus = ${isOpeningOrderStatus()}" - ) - if (data?.data == null || data.code != 0) return - //去下载轨迹, 下发给工控机下载 - TaxiTaskModel.queryTaskContrail(Array(1) { data.data!!.lineId }) - } - - override fun onFail(code: Int, msg: String?) { - d(SceneConstant.M_TAXI + TAG, "$code $msg") - if (isLogin() && isOpeningOrderStatus()) { - startPrepareTask120S(siteId) //失败后30s再次调用获取下一任务 - } - } - - }) - } - - - private fun startInAndWaitCurrentTaskLoop() { - if (mInAndWaitServiceDisposable != null && !mInAndWaitServiceDisposable!!.isDisposed) { - return + override fun onCarEndServiceSuccess( + driveToNearestStationTask: StartServiceRespBean.Result?, + currentTaskWithOrder: QueryCurrentTaskRespBean.Result? + ) { + if (currentTaskWithOrder?.endSite != null && currentTaskWithOrder.startSite != null && currentTaskWithOrder.currentStatus < TaskStatusEnum.CompleteTask.code) { + VoiceNotice.showNotice("暂停接单啦!要完成当前订单哦") + } else { + VoiceNotice.showNotice("暂停接单啦") } - i(SceneConstant.M_TAXI + TAG, "startInAndWaitOrdersLoop()") - mInAndWaitServiceDisposable = Observable.interval( - TaxiUnmannedConst.LOOP_DELAY, - TaxiUnmannedConst.LOOP_PERIOD_2S, TimeUnit.MILLISECONDS + updateDriveToNearestStationTaskUI(driveToNearestStationTask) + } + + override fun onCarEndServiceFailed(code: Int, msg: String) { + ToastUtilsOch.showWithCodeMessage(code, msg) + } + + override fun onCarEndServiceError() { + 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 onCarStartServiceSuccess( + driveToNearestStationTask: StartServiceRespBean.Result?, + currentTaskWithOrder: QueryCurrentTaskRespBean.Result? + ) { + VoiceNotice.showNotice("开始接单啦") + currentTaskWithOrder?.apply { + if (endSite != null) { + when { + currentStatus == TaskStatusEnum.CompleteTask.code && order != null -> return + currentStatus < TaskStatusEnum.CompleteTask.code -> return + } + } + } + updateDriveToNearestStationTaskUI(driveToNearestStationTask) + } + + override fun onCarStartServiceFailed(code: Int, msg: String) { + ToastUtilsOch.showWithCodeMessage( + code, + "$msg curLatitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude}" + " curLongitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().longitude}" ) - .map { aLong: Long -> aLong + 1 } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { queryCurrentTaskOnce() } } - private fun stopInAndWaitCurrentTaskLoop() { - if (mInAndWaitServiceDisposable != null) { - i(SceneConstant.M_TAXI + TAG, "stopInAndWaitOrdersLoop()") - mInAndWaitServiceDisposable!!.dispose() - mInAndWaitServiceDisposable = null + override fun onCarStartServiceError() { + 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)) } } - } \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskModel.kt index 369f8bf980..5284e99a47 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskModel.kt @@ -1,6 +1,5 @@ package com.mogo.och.taxi.ui.task -import android.annotation.SuppressLint import android.content.Context import android.net.ConnectivityManager import android.text.TextUtils @@ -54,7 +53,6 @@ import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceM import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.setStationPoint import com.mogo.och.common.module.map.AmapNaviToDestinationModel import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjLocations -import com.mogo.och.common.module.voice.VoiceNotice import com.mogo.och.taxi.bean.OrderDetail import com.mogo.och.taxi.bean.PrepareTaskRespBean import com.mogo.och.taxi.bean.QueryCarOrderByNoRespBean @@ -63,9 +61,10 @@ import com.mogo.och.taxi.bean.StartServiceRespBean import com.mogo.och.taxi.bean.TrajectoryListRespBean import com.mogo.och.taxi.callback.IOCHTaxiAutopilotPlanningCallback import com.mogo.och.taxi.callback.ITaxiADASStatusCallback +import com.mogo.och.taxi.callback.ITaxiCarServiceCallback import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback import com.mogo.och.taxi.callback.ITaxiOrderStatusCallback -import com.mogo.och.taxi.callback.ITaxiTaskCallback +import com.mogo.och.taxi.callback.ITaxiTaskWithOrderCallback import com.mogo.och.taxi.constant.TaskStatusEnum import com.mogo.och.taxi.constant.TaskTypeEnum import com.mogo.och.taxi.constant.TaxiCarServingStatusManager @@ -73,7 +72,6 @@ import com.mogo.och.taxi.constant.TaxiOrderStatusEnum import com.mogo.och.taxi.constant.TaxiOrderStatusEnum.Companion.valueOf import com.mogo.och.taxi.constant.TaxiUnmannedConst import com.mogo.och.taxi.constant.TaxiUnmannedConst.Companion.BUSINESSTYPE -import com.mogo.och.taxi.constant.TaxiUnmannedConst.Companion.START_AUTOPILOT_COUNTDOWN_INTERVAL import com.mogo.och.taxi.network.TaxiTaskWithOrderServiceManager import com.mogo.och.taxi.utils.RxJavaUtils import com.mogo.och.taxi.utils.TaxiAnalyticsManager @@ -94,12 +92,11 @@ import java.util.concurrent.TimeUnit * @author: wangmingjun * @date: 2023/7/25 */ -@SuppressLint("StaticFieldLeak") object TaxiTaskModel { private val TAG = SceneConstant.M_TAXI + TaxiTaskModel::class.java.simpleName - - private lateinit var mContext: Context + private val mContext: Context + get() = AbsMogoApplication.getApp().applicationContext private var mQueryTaskWithOrderDisposable: Disposable? = null @@ -116,7 +113,9 @@ object TaxiTaskModel { private var mAutopilotPlanningCallback: IOCHTaxiAutopilotPlanningCallback? = null - private var mTaxiTaskCallback: ITaxiTaskCallback? = null + private var mTaxiTaskWithOrderCallback: ITaxiTaskWithOrderCallback? = null + + private var mTaxiCarServiceCallback: ITaxiCarServiceCallback? = null //当前任务和订单 private var mCurrentTaskWithOrder: QueryCurrentTaskRespBean.Result? = null @@ -151,12 +150,15 @@ object TaxiTaskModel { mOrderStatusCallback = callback } - fun setTaskCallback(callback: ITaxiTaskCallback) { - mTaxiTaskCallback = callback + fun setTaskWithOrderCallback(callback: ITaxiTaskWithOrderCallback) { + mTaxiTaskWithOrderCallback = callback } - fun init(context: Context) { - mContext = context.applicationContext + fun setCarServiceCallback(callback: ITaxiCarServiceCallback) { + mTaxiCarServiceCallback = callback + } + + fun init() { loginService = ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation() as LoginService initListeners() @@ -341,7 +343,8 @@ object TaxiTaskModel { } if (checkCurrentTaskCondition() - && mCurrentTaskWithOrder?.currentStatus == TaskStatusEnum.StartTask.code) { + && mCurrentTaskWithOrder?.currentStatus == TaskStatusEnum.StartTask.code + ) { // judgeTaskStartStation(mogoLocation) judgeTaskEndSiteStation(mogoLocation) } @@ -613,7 +616,7 @@ object TaxiTaskModel { //当前任务完成且订单状态到达乘客上车点, 则立马去拉取任务 不再等30s,否则送驾任务要等30s后才能去执行 if (result?.currentStatus == TaskStatusEnum.CompleteTask.code) { - mTaxiTaskCallback?.onTaskCompleted( + mTaxiTaskWithOrderCallback?.onTaskCompleted( QueryCurrentTaskRespBean.isOrderArriveAtStart( result ), @@ -626,7 +629,7 @@ object TaxiTaskModel { //达到终点后查询全程里程和用时 if (QueryCurrentTaskRespBean.isOrderArriveAtEnd(result)) { d(TAG, "queryCurrentTaskOnce ArriveAtEnd") - mTaxiTaskCallback?.onOrderArriveAtEnd(result.order!!.orderNo) + mTaxiTaskWithOrderCallback?.onOrderArriveAtEnd(result.order!!.orderNo) } //根据lineId集合去查轨迹集合, 返回的只是接驾任务的line集合, 没有送驾任务 @@ -644,11 +647,13 @@ object TaxiTaskModel { ) { if (result.order == null || result.order!!.orderStatus < TaxiOrderStatusEnum.ArriveAtStart.code) { d(TAG, "queryCurrentTaskOnce autoStartDriving") - autoStartDriving() + //启动动画+文字 + mControllerStatusCallback?.startOpenAutopilotNonManual() + mTaxiTaskWithOrderCallback?.onStartAutopilot() } } - mTaxiTaskCallback?.onTaskWithOrderDataChanged(mCurrentTaskWithOrder) + mTaxiTaskWithOrderCallback?.onTaskWithOrderDataChanged(mCurrentTaskWithOrder) } } @@ -686,22 +691,22 @@ object TaxiTaskModel { if (data == null) return when (data.data.orderStatus) { TaxiOrderStatusEnum.Cancel.code -> { - mTaxiTaskCallback?.onOrderCancel() //更新本地标志位 mCurrentTaskWithOrder?.order = null + mTaxiTaskWithOrderCallback?.onOrderCancel() } TaxiOrderStatusEnum.ArriveAtEnd.code -> { - mTaxiTaskCallback?.onOrderTotalMileAndDurationChanged( + mTaxiTaskWithOrderCallback?.onOrderTotalMileAndDurationChanged( data.data.mileage, data.data.duration.toInt() ) } TaxiOrderStatusEnum.JourneyCompleted.code -> { - mTaxiTaskCallback?.onOrderJourneyCompleted() //更新本地标志位 mCurrentTaskWithOrder?.order = null + mTaxiTaskWithOrderCallback?.onOrderJourneyCompleted() } } } @@ -766,7 +771,7 @@ object TaxiTaskModel { mTaskTrajectoryList.addAll(it) mCurrentTaskTrajectory = it.first { currentTaskLineId == it.lineId } } - mTaxiTaskCallback?.onTaskTrajectoryDataChanged(data) + mTaxiTaskWithOrderCallback?.onTaskTrajectoryDataChanged(data) } override fun onFail(code: Int, msg: String?) { @@ -775,6 +780,61 @@ object TaxiTaskModel { }) } + fun updateCarServingStatus() { + if (!LoginStatusManager.isLogin()) { + loginService?.queryLoginStatusByNet() + return + } + if (TaxiCarServingStatusManager.isCarServingStatus()) {//接单状态下,去结束 + TaxiTaskWithOrderServiceManager.endService( + mContext, + object : OchCommonServiceCallback { + override fun onSuccess(data: BaseData?) { + loginService?.queryLoginStatusByNet() + //需要将虚拟任务停掉, 虚拟任务会再开始接单后获取新的 + mDriveToNearestStationTask = null + mTaxiCarServiceCallback?.onCarEndServiceSuccess( + mDriveToNearestStationTask, + mCurrentTaskWithOrder + ) + } + + override fun onError() { + mTaxiCarServiceCallback?.onCarEndServiceError() + } + + override fun onFail(code: Int, msg: String) { + mTaxiCarServiceCallback?.onCarEndServiceFailed(code, msg) + } + }) + } else { + //暂停接单状态下,去接单 + TaxiTaskWithOrderServiceManager.startService(mContext, + CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude, + CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().longitude, + object : OchCommonServiceCallback { + override fun onSuccess(data: StartServiceRespBean?) { + if (data == null) return + d(TAG, "data.data=" + GsonUtil.jsonFromObject(data.data)) + loginService?.queryLoginStatusByNet() + mDriveToNearestStationTask = data.data + mTaxiCarServiceCallback?.onCarStartServiceSuccess( + mDriveToNearestStationTask, + mCurrentTaskWithOrder + ) + } + + override fun onFail(code: Int, msg: String) { + mTaxiCarServiceCallback?.onCarStartServiceFailed(code, msg) + } + + override fun onError() { + mTaxiCarServiceCallback?.onCarStartServiceError() + } + }) + } + } + // 获取当前订单状态 fun getCurOrderStatus(): TaxiOrderStatusEnum? { if (mCurrentTaskWithOrder == null) TaxiOrderStatusEnum.None @@ -1058,19 +1118,18 @@ object TaxiTaskModel { } } - private fun startTask(lineId: Long) { + fun startTask(lineId: Long) { TaxiTaskWithOrderServiceManager.startTask( mContext, lineId, object : OchCommonServiceCallback { override fun onSuccess(data: BaseData?) { - d(TAG, GsonUtil.jsonFromObject(data)) + d(TAG, "startTask onSuccess: data=${GsonUtil.jsonFromObject(data)}") } override fun onFail(code: Int, msg: String?) { - d(TAG, "$code $msg") + d(TAG, "startTask onFail: code=$code, msg=$msg") } - }) } @@ -1133,23 +1192,6 @@ object TaxiTaskModel { autopilotArriveAtStation() } - fun toStartTask() { - if (!checkCurrentTaskCondition()) { - ToastUtils.showShort("无任务!") - return - } - - //当前订单状态若为20 , 则使用的lineId为订单信息的 - mCurrentTaskWithOrder?.let { - startTask( - if (it.order != null && it.order!!.orderStatus >= TaxiOrderStatusEnum.ArriveAtStart.code) - it.order!!.orderLine - else - it.lineId - ) - } - } - /** * 测试开启自动驾驶 */ @@ -1160,7 +1202,6 @@ object TaxiTaskModel { startAutoPilot() } - /** * 设置路径规划起终点 */ @@ -1218,17 +1259,4 @@ object TaxiTaskModel { } } } - - fun autoStartDriving() { - //启动动画+文字 - if (mControllerStatusCallback != null) { - mControllerStatusCallback!!.startOpenAutopilotNonManual() - } - - UiThreadHandler.postDelayed({ - toStartTask() //状态流转 - startAutoPilot() //自驾开启 - VoiceNotice.showNotice("车辆正在自动开启自动驾驶") - }, START_AUTOPILOT_COUNTDOWN_INTERVAL) // 10s后开启自驾, 状态流转 - } } \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/unmanned/UnmannedIntent.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/unmanned/UnmannedIntent.kt index b06d4e62b9..7cf1ddd36d 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/unmanned/UnmannedIntent.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/unmanned/UnmannedIntent.kt @@ -9,9 +9,9 @@ import com.mogo.och.taxi.base.IUiIntent sealed class UnmannedIntent: IUiIntent{ //开始接单 、 暂停接单 - object StartOrPauseTakeOrder : UnmannedIntent() + object StartOrEndTakeOrder : UnmannedIntent() - object StartTaskOrOrderLooper : UnmannedIntent() + object StartTaskWithOrderLooper : UnmannedIntent() //取消订单 class CancelOrder(val type: Int) : UnmannedIntent() @@ -22,7 +22,7 @@ sealed class UnmannedIntent: IUiIntent{ object JourneyCompleted: UnmannedIntent() //跳过乘客验证 - object JumpPassengerCheckDone : UnmannedIntent() + object JumpPassengerCheck : UnmannedIntent() //司机端手动结束订单 object CloseOrderByDriver : UnmannedIntent()