diff --git a/OCH/bus/passenger/src/main/res/m2/layout/bus_p_m2_view_status_bar.xml b/OCH/bus/passenger/src/main/res/m2/layout/bus_p_m2_view_status_bar.xml index 163bee4257..8c4a96d678 100644 --- a/OCH/bus/passenger/src/main/res/m2/layout/bus_p_m2_view_status_bar.xml +++ b/OCH/bus/passenger/src/main/res/m2/layout/bus_p_m2_view_status_bar.xml @@ -19,7 +19,7 @@ android:layout_marginStart="@dimen/dp_40" /> - = + ConcurrentHashMap() + + + private var bindStatus: BindStatus by Delegates.observable(BindStatus.NOTHING) { _, oldV, newV -> + if (oldV != newV) { + try { + CallerLogger.d(SceneConstant.M_OCHCOMMON + TAG, "状态发生变化old:${oldV}_new:${newV}") + if (stateChanageListeners.size > 0) { + stateChanageListeners.forEach { + it.value.stateChange(newV, openStatus) + } + } + } catch (e: Exception) { + CallerLogger.e(SceneConstant.M_OCHCOMMON + TAG, "扫码枪bind错误") + } + } + } + private var openStatus: OpenStatus by Delegates.observable(OpenStatus.Unopen) { _, oldV, newV -> + if (oldV != newV) { + try { + if (stateChanageListeners.size > 0) { + stateChanageListeners.forEach { + it.value.stateChange(bindStatus, newV) + } + } + } catch (e: Exception) { + CallerLogger.e(SceneConstant.M_OCHCOMMON + TAG, "扫码枪open错误") + } + } + } + + fun addStateChangeListener(tag: String, listener: StateChangeListener) { + if (stateChanageListeners.containsKey(tag)) { + return + } + stateChanageListeners[tag] = listener + } + + fun bindService() { + serialPortManager.bindService(AbsMogoApplication.getApp(), this);//绑定服务 + } + + override fun onServiceState(serviceState: Int) { + when (serviceState) { + SERVICE_STATE.BIND_SUCCEED -> { + bindStatus = BindStatus.BIND_SUCCEED + serialPortManager.openVerificationDevice(object : OnDeviceVerificationListener() { + override fun onSerialPortState( + path: String?, + isOpen: Boolean, + throwableMessage: String? + ) { + CallerLogger.d( + M_BUS_P + TAG, + "path ${path}---isOpen${isOpen}--throwableMessage${throwableMessage}" + ) + if (isOpen) { + openStatus = OpenStatus.Open + } else { + openStatus = OpenStatus.Unopen + } + } + + override fun onActiveDataReceive(data: VerificationActiveData?) { + data?.let { + if(data.unpackStatus==UnpackStatus.SUCCEED){ + "数据类型${it.dataType.name}" + CallerLogger.d(M_BUS_P + TAG, "data $it") + if(!StringUtils.isEmpty(it.payload)){ + parseParams(it.payload) + }else{ + CallerLogger.d(M_BUS_P + TAG, "数据错误") + } + }else{ + CallerLogger.d(M_BUS_P + TAG, "解包失败") + } + } + } + + }); + } + SERVICE_STATE.BIND_FAILURE_UNINSTALLED -> { + CallerLogger.d(M_BUS_P + TAG, "服务绑定失败:未安装串口服务端APP") + bindStatus = BindStatus.BIND_FAILURE_UNINSTALLED + } + SERVICE_STATE.BIND_FAILURE_NO_PERMISSION_NOT_FOUND -> { + CallerLogger.d(M_BUS_P + TAG, "服务绑定失败:没有绑定权限或找不到服务(如果是此状态,基本上安装后就可以找到,主要就是权限问题)") + bindStatus = BindStatus.BIND_FAILURE_NO_PERMISSION_NOT_FOUND + } + SERVICE_STATE.EXCEPTION -> { + CallerLogger.d(M_BUS_P + TAG, "服务被异常销毁") + bindStatus = BindStatus.EXCEPTION + } + else -> {} + } + } + + private fun parseParams(payload: String?) { + val parse = Uri.parse("${OchCommonConst.getShuttleUrl()}?${payload}") + val queryParameterNames = parse.queryParameterNames + val mutableMapOf = mutableMapOf() + queryParameterNames.forEach { + val queryParameter = parse.getQueryParameter(it) + println("${it}:$queryParameter") + if(it!=null&&queryParameter!=null){ + mutableMapOf[it] = queryParameter + } + } + if (stateChanageListeners.size > 0) { + stateChanageListeners.forEach { + it.value.parseData(mutableMapOf) + } + } + + } + + // 查询串口 + override fun onFindSerialPort(paths: Array?) { + CallerLogger.d(M_BUS_P + TAG, "$paths") + if(paths==null) { + bindStatus = BindStatus.BIND_FAILURE_NO_PERMISSION_NOT_FOUND + } + } +} + +enum class BindStatus { + BIND_SUCCEED, BIND_FAILURE_UNINSTALLED ,BIND_FAILURE_NO_PERMISSION_NOT_FOUND,EXCEPTION,NOTHING +} + +enum class OpenStatus { + Open, Unopen +} \ No newline at end of file diff --git a/OCH/shuttle/passenger/src/main/java/com/mogo/och/shuttle/passenger/manager/scnner/ScannerStateView.kt b/OCH/shuttle/passenger/src/main/java/com/mogo/och/shuttle/passenger/manager/scnner/ScannerStateView.kt new file mode 100644 index 0000000000..5183a494a2 --- /dev/null +++ b/OCH/shuttle/passenger/src/main/java/com/mogo/och/shuttle/passenger/manager/scnner/ScannerStateView.kt @@ -0,0 +1,44 @@ +package com.mogo.och.shuttle.passenger.manager.scnner + +import android.content.Context +import android.util.AttributeSet +import android.view.View +import androidx.appcompat.widget.AppCompatImageView +import com.mogo.och.common.module.R + +class ScannerStateView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : AppCompatImageView(context, attrs, defStyleAttr), StateChangeListener { + private val TAG = "ScannerStateView" + + init { + setImageResource(R.drawable.driver_connect_statis) + ScannerManager.addStateChangeListener(TAG,this) + } + + override fun stateChange(newBindValue: BindStatus, newOpentValue: OpenStatus) { + when (newBindValue) { + BindStatus.BIND_SUCCEED -> { + // 绑定成功 + when (newOpentValue) { + OpenStatus.Open -> { + //成功打开 + visibility = View.GONE + } + OpenStatus.Unopen -> { + // 打开失败 + setImageResource(R.drawable.driver_connect_statis) + } + } + } + else ->{ + // 绑定失败 + setImageResource(R.drawable.driver_connect_statis) + } + } + } + + +} \ No newline at end of file diff --git a/OCH/shuttle/passenger/src/main/java/com/mogo/och/shuttle/passenger/manager/scnner/StateChangeListener.kt b/OCH/shuttle/passenger/src/main/java/com/mogo/och/shuttle/passenger/manager/scnner/StateChangeListener.kt new file mode 100644 index 0000000000..cbe1b13a45 --- /dev/null +++ b/OCH/shuttle/passenger/src/main/java/com/mogo/och/shuttle/passenger/manager/scnner/StateChangeListener.kt @@ -0,0 +1,6 @@ +package com.mogo.och.shuttle.passenger.manager.scnner + +interface StateChangeListener { + fun stateChange(newBindValue:BindStatus,newOpentValue:OpenStatus){} + fun parseData(params:MutableMap){} +} \ No newline at end of file diff --git a/OCH/shuttle/passenger/src/main/java/com/mogo/och/shuttle/passenger/model/TicketModel.kt b/OCH/shuttle/passenger/src/main/java/com/mogo/och/shuttle/passenger/model/TicketModel.kt new file mode 100644 index 0000000000..cfef34d5b8 --- /dev/null +++ b/OCH/shuttle/passenger/src/main/java/com/mogo/och/shuttle/passenger/model/TicketModel.kt @@ -0,0 +1,57 @@ +package com.mogo.och.shuttle.passenger.model + +import com.mogo.commons.AbsMogoApplication +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback +import com.mogo.och.common.module.debug.DebugDataDispatch +import com.mogo.och.shuttle.passenger.bean.request.PassengerWriteOffRequest +import com.mogo.och.shuttle.passenger.bean.response.PassengerWriteOffResponse +import com.mogo.och.shuttle.passenger.manager.scnner.ScannerManager +import com.mogo.och.shuttle.passenger.manager.scnner.StateChangeListener +import com.mogo.och.shuttle.passenger.network.PassengerServiceManager + +object TicketModel : StateChangeListener { + + private const val TAG = "TicketModel" + + init { + ScannerManager.bindService() + ScannerManager.addStateChangeListener(TAG, this) + } + + fun load(){ + + } + + override fun parseData(params: MutableMap) { + val orderNo = params["orderNo"] + val uid = params["uid"] + if(orderNo is String && uid is String){ + writeOffTicket(orderNo,uid) + }else{ + // 通知司机屏二维码错误 + } + } + + fun writeOffTicket(orderNo: String, uid: String) { + val passengerWriteOffRequest = PassengerWriteOffRequest(orderNo, uid) + PassengerServiceManager.writeOffTicket(AbsMogoApplication.getApp(), + passengerWriteOffRequest, + object : OchCommonServiceCallback { + override fun onSuccess(data: PassengerWriteOffResponse?) { + if (data?.data == null) return + val ticketInfo = + "核销成功:票种名称:${data.data.ticketName},车票数量:${data.data.ticketSize},预留手机号:${data.data.phone},时间:${data.data.remainingTimes}" + CallerLogger.d(M_BUS_P + TAG, ticketInfo) + } + + override fun onFail(code: Int, msg: String?) { + CallerLogger.d(M_BUS_P + TAG, "核销失败 ${code}-----${msg}") + } + + } + ) + } + +} \ No newline at end of file diff --git a/OCH/shuttle/passenger/src/main/java/com/mogo/och/shuttle/passenger/network/PassengerServiceManager.kt b/OCH/shuttle/passenger/src/main/java/com/mogo/och/shuttle/passenger/network/PassengerServiceManager.kt index 428a10c648..8586f35e0f 100644 --- a/OCH/shuttle/passenger/src/main/java/com/mogo/och/shuttle/passenger/network/PassengerServiceManager.kt +++ b/OCH/shuttle/passenger/src/main/java/com/mogo/och/shuttle/passenger/network/PassengerServiceManager.kt @@ -5,13 +5,17 @@ import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager.getSer import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.eagle.core.utilcode.util.StringUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils 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.shuttle.passenger.bean.request.PassengerQueryLineRequest +import com.mogo.och.shuttle.passenger.bean.request.PassengerWriteOffRequest import com.mogo.och.shuttle.passenger.bean.response.PassengerOperationStatusResponse import com.mogo.och.shuttle.passenger.bean.response.PassengerRoutesResponse +import com.mogo.och.shuttle.passenger.bean.response.PassengerWriteOffResponse /** * Created on 2022/3/31 @@ -75,4 +79,30 @@ object PassengerServiceManager { .subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverOperationStatus")) } + + /** + * 查询司机端出车收车状态,以及车牌号 + * @param context + * @param callback + */ + @JvmStatic + fun writeOffTicket( + context: Context, + ticketInfo: PassengerWriteOffRequest, + callback: OchCommonServiceCallback?, + ) { + ticketInfo.sn = driverAppSn + if(StringUtils.isEmpty(driverAppSn)){ + ToastUtils.showShort("请链接司机屏") + return + } + mShuttleBusPassengerServiceApi.writeOffTicket( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + SharedPrefsMgr.getInstance().token, + ticketInfo + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverOperationStatus")) + + } } \ No newline at end of file diff --git a/OCH/shuttle/passenger/src/main/java/com/mogo/och/shuttle/passenger/network/ServiceApi.java b/OCH/shuttle/passenger/src/main/java/com/mogo/och/shuttle/passenger/network/ServiceApi.java index 17b94a64f0..b1cd8187a1 100644 --- a/OCH/shuttle/passenger/src/main/java/com/mogo/och/shuttle/passenger/network/ServiceApi.java +++ b/OCH/shuttle/passenger/src/main/java/com/mogo/och/shuttle/passenger/network/ServiceApi.java @@ -1,8 +1,10 @@ package com.mogo.och.shuttle.passenger.network; import com.mogo.och.shuttle.passenger.bean.request.PassengerQueryLineRequest; +import com.mogo.och.shuttle.passenger.bean.request.PassengerWriteOffRequest; import com.mogo.och.shuttle.passenger.bean.response.PassengerOperationStatusResponse; import com.mogo.och.shuttle.passenger.bean.response.PassengerRoutesResponse; +import com.mogo.och.shuttle.passenger.bean.response.PassengerWriteOffResponse; import io.reactivex.Observable; import retrofit2.http.Body; @@ -35,4 +37,11 @@ public interface ServiceApi { // @GET("/autopilot-car-hailing/car/v2/driver/bus/passenger/takeOrderStatus/query") @GET("/och-shuttle-cabin/api/business/v1/passenger/loginStatus") Observable queryDriverOperationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn); + + /** + * 查询司机端的登陆状态 + */ + @Headers({"Content-type:application/json;charset=UTF-8"}) + @POST("/och-vehicle/api/scanner/device/writeOff") + Observable writeOffTicket(@Header ("appId") String appId, @Header("ticket") String ticket, @Body PassengerWriteOffRequest request); } diff --git a/OCH/shuttle/passenger/src/main/java/jinlv/com/mogo/och/shuttle/passenger/model/BusPassengerModel.java b/OCH/shuttle/passenger/src/main/java/jinlv/com/mogo/och/shuttle/passenger/model/BusPassengerModel.java index beaa6e1c4d..0c0e1574e8 100644 --- a/OCH/shuttle/passenger/src/main/java/jinlv/com/mogo/och/shuttle/passenger/model/BusPassengerModel.java +++ b/OCH/shuttle/passenger/src/main/java/jinlv/com/mogo/och/shuttle/passenger/model/BusPassengerModel.java @@ -402,6 +402,7 @@ public class BusPassengerModel { @Override public void onReceivedServerSn(@Nullable String sn) { + Logger.d(SceneConstant.M_BUS_P + TAG, "司机屏sn:"+sn ); } @Override diff --git a/OCH/shuttle/passenger/src/main/java/m2/com/mogo/och/shuttle/passenger/bean/PM2QueryLineRequest.java b/OCH/shuttle/passenger/src/main/java/m2/com/mogo/och/shuttle/passenger/bean/PM2QueryLineRequest.java deleted file mode 100644 index 62594f2813..0000000000 --- a/OCH/shuttle/passenger/src/main/java/m2/com/mogo/och/shuttle/passenger/bean/PM2QueryLineRequest.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.mogo.och.shuttle.passenger.bean; - -public -/** - * @author congtaowang - * @since 2021/3/22 - * - * 根据车机行驶线路站点信息 - */ -class PM2QueryLineRequest { - - private String sn; - public PM2QueryLineRequest(String sn) { - this.sn = sn; - } -} diff --git a/OCH/shuttle/passenger/src/main/res/drawable/scanner_qr_code.xml b/OCH/shuttle/passenger/src/main/res/drawable/scanner_qr_code.xml new file mode 100644 index 0000000000..7b205e5aed --- /dev/null +++ b/OCH/shuttle/passenger/src/main/res/drawable/scanner_qr_code.xml @@ -0,0 +1,28 @@ + + + diff --git a/OCH/shuttle/passenger/src/main/res/jinlv/layout/shuttle_p_jl_view_status_bar.xml b/OCH/shuttle/passenger/src/main/res/jinlv/layout/shuttle_p_jl_view_status_bar.xml index 2be462cb64..f48c5371bc 100644 --- a/OCH/shuttle/passenger/src/main/res/jinlv/layout/shuttle_p_jl_view_status_bar.xml +++ b/OCH/shuttle/passenger/src/main/res/jinlv/layout/shuttle_p_jl_view_status_bar.xml @@ -8,6 +8,17 @@ tools:ignore="MissingDefaultResource" android:background="@drawable/shuttle_p_jl_bg_status_bar"> + + @@ -31,18 +42,15 @@ android:layout_gravity="center" android:layout_marginStart="@dimen/dp_40" /> - - - - + app:layout_constraintStart_toEndOf="@+id/wifiStateView" + android:layout_width="@dimen/dp_24" + android:layout_height="@dimen/dp_24" + android:src="@drawable/scanner_qr_code" + android:layout_gravity="center" + android:layout_marginStart="@dimen/dp_40"/> \ No newline at end of file diff --git a/OCH/shuttle/passenger/src/main/res/m2/layout/shuttle_p_m2_view_status_bar.xml b/OCH/shuttle/passenger/src/main/res/m2/layout/shuttle_p_m2_view_status_bar.xml index 2aac7be30f..a2d86ad7bd 100644 --- a/OCH/shuttle/passenger/src/main/res/m2/layout/shuttle_p_m2_view_status_bar.xml +++ b/OCH/shuttle/passenger/src/main/res/m2/layout/shuttle_p_m2_view_status_bar.xml @@ -19,7 +19,7 @@ android:layout_marginStart="@dimen/dp_40" /> -