[shuttle_p]
[核销接驳票 异常处理和消息通知]
This commit is contained in:
yangyakun
2024-01-16 16:29:16 +08:00
parent b8f348ba71
commit a1fb290a9e
11 changed files with 306 additions and 107 deletions

View File

@@ -2,25 +2,29 @@ package com.mogo.och.shuttle.passenger.manager.scnner
import android.net.Uri
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener
import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
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.GsonUtils
import com.mogo.eagle.core.utilcode.util.StringUtils
import com.mogo.och.common.module.bean.dpmsg.WriteOffDevicesMsg
import com.mogo.och.common.module.bean.dpmsg.WriteOffMsg
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 {
object ScannerManager : OnSerialPortListener, OnDeviceVerificationListener(), IReceivedMsgListener {
private val TAG = "ScannerManager"
@@ -29,11 +33,20 @@ object ScannerManager : OnSerialPortListener {
private val stateChanageListeners: ConcurrentHashMap<String, StateChangeListener> =
ConcurrentHashMap()
private var driverSn:String by Delegates.observable("") { _, oldV, newV ->
if (oldV != newV) {
// sn 发生了改变 需要向司机屏推送当前链接的状态
sendScannerState()
}
}
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(newV!=BindStatus.BIND_SUCCEED) {
dispatchMsg(newV)
}
if (stateChanageListeners.size > 0) {
stateChanageListeners.forEach {
it.value.stateChange(newV, openStatus)
@@ -44,6 +57,7 @@ object ScannerManager : OnSerialPortListener {
}
}
}
private var openStatus: OpenStatus by Delegates.observable(OpenStatus.Unopen) { _, oldV, newV ->
if (oldV != newV) {
try {
@@ -58,6 +72,11 @@ object ScannerManager : OnSerialPortListener {
}
}
init {
//监听司机端消息
CallerTelematicListenerManager.addListener(TAG, this)
}
fun addStateChangeListener(tag: String, listener: StateChangeListener) {
if (stateChanageListeners.containsKey(tag)) {
return
@@ -66,47 +85,14 @@ object ScannerManager : OnSerialPortListener {
}
fun bindService() {
serialPortManager.bindService(AbsMogoApplication.getApp(), this);//绑定服务
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, "解包失败")
}
}
}
});
serialPortManager.openVerificationDevice(this)
}
SERVICE_STATE.BIND_FAILURE_UNINSTALLED -> {
CallerLogger.d(M_BUS_P + TAG, "服务绑定失败未安装串口服务端APP")
@@ -124,25 +110,6 @@ object ScannerManager : OnSerialPortListener {
}
}
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")
@@ -150,6 +117,135 @@ object ScannerManager : OnSerialPortListener {
bindStatus = BindStatus.BIND_FAILURE_NO_PERMISSION_NOT_FOUND
}
}
override fun onSerialPortState(
path: String?,
isOpen: Boolean,
throwableMessage: String?
) {
CallerLogger.d(
M_BUS_P + TAG,
"path ${path}---isOpen${isOpen}--throwableMessage${throwableMessage}"
)
openStatus = if (isOpen) {
sendMessage2Driver(true,"扫码枪打开成功")
OpenStatus.Open
} else {
sendMessage2Driver(false,"扫码枪打开错误:${throwableMessage}_${path}")
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, "数据错误")
sendMessage2DriverWriteOffInfo("扫码数据为空")
}
}else{
sendMessage2DriverWriteOffInfo("解包失败")
CallerLogger.d(M_BUS_P + TAG, "解包失败")
}
}
}
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)
if(it!=null&&queryParameter!=null){
mutableMapOf[it] = queryParameter
}
}
if(mutableMapOf.isNotEmpty()){
if (stateChanageListeners.size > 0) {
stateChanageListeners.forEach {
it.value.parseData(mutableMapOf,payload)
}
}
}else{
sendMessage2DriverWriteOffInfo("扫码参数数据为空:${payload}")
}
}
/**
* @param isConnectScanner 是否打开设备
*/
private fun sendMessage2Driver(isConnectScanner:Boolean,message:String){
val msg = WriteOffDevicesMsg(isConnectScanner, message)
CallerLogger.d(M_BUS_P + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(msg))
if(driverSn.isNotEmpty()) {
CallerTelematicManager.sendMsgToServer(
OchCommonConst.BUSINESS_STRING,
GsonUtils.toJson(msg).toByteArray()
)
}
}
/**
* 打开设备后数据异常
*/
private fun sendMessage2DriverWriteOffInfo(message:String){
val msg = WriteOffMsg(false, "", 0, "", message)
CallerLogger.d(M_BUS_P + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(msg))
CallerTelematicManager.sendMsgToServer(
OchCommonConst.BUSINESS_STRING,
GsonUtils.toJson(msg).toByteArray()
)
}
override fun onReceivedMsg(type: Int, byteArray: ByteArray) {
}
override fun onReceivedServerSn(sn: String?) {
Logger.d(M_BUS_P + TAG, "司机屏sn$sn")
driverSn = sn?:""
}
/**
* 链接司机屏后向司机屏同步扫码枪状态
*/
private fun sendScannerState() {
if(bindStatus==BindStatus.BIND_SUCCEED&& openStatus==OpenStatus.Open){
sendMessage2Driver(true,"扫码枪打开状态")
}else{
if(bindStatus==BindStatus.BIND_SUCCEED&& openStatus==OpenStatus.Unopen){
sendMessage2Driver(false,"绑定成功、打开失败")
}else{
dispatchMsg(bindStatus)
}
}
}
private fun dispatchMsg(newV: BindStatus) {
when (newV) {
BindStatus.BIND_FAILURE_UNINSTALLED -> {
// 服务绑定失败未安装串口服务端APP
sendMessage2Driver(false,"服务绑定失败未安装串口服务端APP")
}
BindStatus.BIND_FAILURE_NO_PERMISSION_NOT_FOUND -> {
// 服务绑定失败:没有绑定权限或找不到服务(如果是此状态,基本上安装后就可以找到,主要就是权限问题)
sendMessage2Driver(false,"服务绑定失败:没有绑定权限或找不到服务")
}
BindStatus.EXCEPTION -> {
// 扫码枪open错误
sendMessage2Driver(false,"扫码枪打开错误")
}
BindStatus.NOTHING -> {}
else -> {}
}
}
}
enum class BindStatus {

View File

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

View File

@@ -1,10 +1,13 @@
package com.mogo.och.shuttle.passenger.model
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager
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.eagle.core.utilcode.util.GsonUtils
import com.mogo.och.common.module.bean.dpmsg.WriteOffMsg
import com.mogo.och.common.module.biz.constant.OchCommonConst
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
@@ -24,17 +27,18 @@ object TicketModel : StateChangeListener {
}
override fun parseData(params: MutableMap<String, Any>) {
override fun parseData(params: MutableMap<String, Any>, payload: String?) {
val orderNo = params["orderNo"]
val uid = params["uid"]
if(orderNo is String && uid is String){
writeOffTicket(orderNo,uid)
}else{
// 通知司机屏二维码错误
sendMessage2Driver("参数错误:${payload}")
}
}
fun writeOffTicket(orderNo: String, uid: String) {
private fun writeOffTicket(orderNo: String, uid: String) {
val passengerWriteOffRequest = PassengerWriteOffRequest(orderNo, uid)
PassengerServiceManager.writeOffTicket(AbsMogoApplication.getApp(),
passengerWriteOffRequest,
@@ -44,14 +48,42 @@ object TicketModel : StateChangeListener {
val ticketInfo =
"核销成功:票种名称:${data.data.ticketName},车票数量:${data.data.ticketSize},预留手机号:${data.data.phone},时间:${data.data.remainingTimes}"
CallerLogger.d(M_BUS_P + TAG, ticketInfo)
sendMessage2DriverSuccess(data.data)
}
override fun onFail(code: Int, msg: String?) {
CallerLogger.d(M_BUS_P + TAG, "核销失败 ${code}-----${msg}")
when (code) {
6002 -> {sendMessage2Driver("同一订单核销间隔时间需大于5分钟")}
1009 -> {sendMessage2Driver("车票所选乘车日期非今日")}
1006 -> {sendMessage2Driver("车票路线信息与当前车辆执行任务的路线信息不符合")}
1008 -> {sendMessage2Driver("车票剩余可用次数为0")}
6001 -> {sendMessage2Driver("二维码已过期")}
1012 -> {sendMessage2Driver("当前用户下单路线非当前的车辆所属公司")}
else -> {}
}
}
}
)
}
private fun sendMessage2Driver(message:String){
val msg = WriteOffMsg(false, "", 0, "", message)
CallerLogger.d(M_BUS_P + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(msg))
CallerTelematicManager.sendMsgToServer(
OchCommonConst.BUSINESS_STRING,
GsonUtils.toJson(msg).toByteArray()
)
}
private fun sendMessage2DriverSuccess(message: PassengerWriteOffResponse.Result){
val msg = WriteOffMsg(true, message.phone, message.ticketSize, message.ticketName, "")
CallerLogger.d(M_BUS_P + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(msg))
CallerTelematicManager.sendMsgToServer(
OchCommonConst.BUSINESS_STRING,
GsonUtils.toJson(msg).toByteArray()
)
}
}

View File

@@ -93,7 +93,7 @@ object PassengerServiceManager {
) {
ticketInfo.sn = driverAppSn
if(StringUtils.isEmpty(driverAppSn)){
ToastUtils.showShort("请链接司机屏")
ToastUtils.showShort("请链接司机屏${ticketInfo.uid}")
return
}
mShuttleBusPassengerServiceApi.writeOffTicket(