[shuttle_p]
[核销接驳票]
This commit is contained in:
yangyakun
2024-01-15 19:35:27 +08:00
parent 7b2c3448ca
commit b8f348ba71
17 changed files with 429 additions and 31 deletions

View File

@@ -19,7 +19,7 @@
android:layout_marginStart="@dimen/dp_40" />
<!--魔方连接状态 蓝牙-->
<com.mogo.och.bus.passenger.ui.widget.M2BlueToothView
<com.mogo.och.bus.passenger.passenger.ui.widget.M2BlueToothView
android:id="@+id/blueToothView"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"

View File

@@ -86,6 +86,8 @@ dependencies {
implementation rootProject.ext.dependencies.rxandroid
implementation rootProject.ext.dependencies.androidxconstraintlayout
implementation rootProject.ext.dependencies.amapnavi3dmap
// 串口链接
implementation rootProject.ext.dependencies.serialport
implementation project(":OCH:common:common")
compileOnly project(":libraries:mogo-map")
implementation project(':core:mogo-core-res')

View File

@@ -14,6 +14,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.MultiDisplayUtils
import com.mogo.och.shuttle.passenger.constant.BusPassengerConst
import com.mogo.och.common.module.wigets.media.MediaPlayerActivity
import com.mogo.och.shuttle.passenger.model.TicketModel
import com.mogo.och.shuttle.passenger.ui.BusPassengerRouteFragment
import com.mogo.och.shuttle.passenger.ui.PM2BaseFragment
@@ -37,6 +38,7 @@ class MogoOCHShuttlePassenger : IMoGoFunctionProvider {
MultiDisplayUtils.startActWithSecond(it, MediaPlayerActivity::class.java)
}
}
TicketModel.load()
return null
}

View File

@@ -0,0 +1,50 @@
package com.mogo.och.shuttle.passenger.bean.request;
public
/**
* @author congtaowang
* @since 2021/3/22
*
* 根据车机行驶线路站点信息
*/
class PassengerWriteOffRequest {
private String sn;
private String orderNo;
private String uid;
public PassengerWriteOffRequest(String orderNo, String uid) {
this.orderNo = orderNo;
this.uid = uid;
}
public PassengerWriteOffRequest(String sn, String orderNo, String uid) {
this.sn = sn;
this.orderNo = orderNo;
this.uid = uid;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
}

View File

@@ -0,0 +1,13 @@
package com.mogo.och.shuttle.passenger.bean.response
import com.mogo.eagle.core.data.BaseData
data class PassengerWriteOffResponse(val data: Result?) : BaseData(){
data class Result(
val phone: String?,
val ticketSize: Int?,
val ticketName: String?,
val remainingTimes: Long?
)
}

View File

@@ -0,0 +1,161 @@
package com.mogo.och.shuttle.passenger.manager.scnner
import android.net.Uri
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.mogo.logger.scene.SceneConstant.Companion.M_BUS_P
import com.mogo.eagle.core.utilcode.util.StringUtils
import com.mogo.och.common.module.biz.constant.OchCommonConst
import com.mogo.och.common.module.manager.distancemamager.ITrajectoryWithStationListener
import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager
import com.mogo.support.serialport.client.SerialPortManager
import com.mogo.support.serialport.client.SerialPortManager.SERVICE_STATE
import com.mogo.support.serialport.client.listener.OnDeviceVerificationListener
import com.mogo.support.serialport.client.listener.OnSerialPortListener
import com.mogo.support.serialport.common.verification.UnpackStatus
import com.mogo.support.serialport.common.verification.data.VerificationActiveData
import java.net.URL
import java.util.concurrent.ConcurrentHashMap
import kotlin.properties.Delegates
object ScannerManager : OnSerialPortListener {
private val TAG = "ScannerManager"
private var serialPortManager = SerialPortManager()
private val stateChanageListeners: ConcurrentHashMap<String, StateChangeListener> =
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<String, Any>()
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<out String>?) {
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
}

View File

@@ -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)
}
}
}
}

View File

@@ -0,0 +1,6 @@
package com.mogo.och.shuttle.passenger.manager.scnner
interface StateChangeListener {
fun stateChange(newBindValue:BindStatus,newOpentValue:OpenStatus){}
fun parseData(params:MutableMap<String, Any>){}
}

View File

@@ -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<String, Any>) {
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<PassengerWriteOffResponse> {
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}")
}
}
)
}
}

View File

@@ -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<PassengerWriteOffResponse>?,
) {
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"))
}
}

View File

@@ -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<PassengerOperationStatusResponse> 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<PassengerWriteOffResponse> writeOffTicket(@Header ("appId") String appId, @Header("ticket") String ticket, @Body PassengerWriteOffRequest request);
}

View File

@@ -402,6 +402,7 @@ public class BusPassengerModel {
@Override
public void onReceivedServerSn(@Nullable String sn) {
Logger.d(SceneConstant.M_BUS_P + TAG, "司机屏sn"+sn );
}
@Override

View File

@@ -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;
}
}

View File

@@ -0,0 +1,28 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="
M 9.5,6.5
v0,3 h-3,0 v-3 H9.5M11,
5H5v6h6V5L11,
5zM9.5,
14.5v3h-3v-3H9.5M11,
13H5v6h6V13L11,
13zM17.5,
6.5v3h-3v-3H17.5M19,
5h-6v6h6V5L19,
5zM13,
13h1.5v1.5H13V13zM14.5,
14.5H16V16h-1.5V14.5zM16,
13h1.5v1.5H16V13zM13,
16h1.5v1.5H13V16zM14.5,
17.5H16V19h-1.5V17.5zM16,
16h1.5v1.5H16V16zM17.5,
14.5H19V16h-1.5V14.5zM17.5,
17.5H19V19h-1.5V17.5zM22,
7h-2V4h-3V2h5V7zM22,
22v-5h-2v3h-3v2H22zM2,
22h5v-2H4v-3H2V22zM2,
2v5h2V4h3V2H2z"
/>
</vector>

View File

@@ -8,6 +8,17 @@
tools:ignore="MissingDefaultResource"
android:background="@drawable/shuttle_p_jl_bg_status_bar">
<ImageView
android:id="@+id/status_bar_logo"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="@dimen/dp_40"
android:src="@drawable/shuttle_p_jl_status_bar_logo"
android:scaleType="fitXY"
android:layout_width="@dimen/dp_94"
android:layout_height="@dimen/dp_25"/>
<!--Wifi状态-->
<com.mogo.eagle.core.function.hmi.ui.widget.WifiStateView
android:id="@+id/wifiStateView"
@@ -15,7 +26,7 @@
android:layout_height="@dimen/dp_28"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@+id/status_bar_logo"
app:layout_constraintStart_toEndOf="@+id/status_bar_logo"
android:layout_gravity="center"
android:layout_marginStart="@dimen/dp_40" />
@@ -31,18 +42,15 @@
android:layout_gravity="center"
android:layout_marginStart="@dimen/dp_40" />
<ImageView
android:id="@+id/status_bar_logo"
<com.mogo.och.shuttle.passenger.manager.scnner.ScannerStateView
android:id="@+id/scannerStateView"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginLeft="@dimen/dp_40"
android:src="@drawable/shuttle_p_jl_status_bar_logo"
android:scaleType="fitXY"
android:layout_width="@dimen/dp_94"
android:layout_height="@dimen/dp_25"/>
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"/>
</merge>

View File

@@ -19,7 +19,7 @@
android:layout_marginStart="@dimen/dp_40" />
<!--魔方连接状态 蓝牙-->
<com.mogo.och.bus.passenger.ui.widget.M2BlueToothView
<com.mogo.och.shuttle.passenger.ui.widget.M2BlueToothView
android:id="@+id/blueToothView"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"

View File

@@ -214,7 +214,10 @@ ext {
lancetx_compiler_lib : "com.mogo.eagle.core.lancetx:runtime:1.0.5",
//========================= autosize ======================
androidautoSize : 'com.github.JessYanCoding:AndroidAutoSize:v1.2.1',
androidautoSize : 'com.github.JessYanCoding:AndroidAutoSize:v1.2.1',
//========================= 扫码机 ======================
serialport : 'com.mogo.support.serialport:client:1.0.0-alpha5',
thread_opt : "com.mogo.thread.opt:lib:10.10.2",