diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/line/LineManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/line/LineManager.kt index 95330857d3..536c385f53 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/line/LineManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/line/LineManager.kt @@ -15,6 +15,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener import com.mogo.eagle.core.function.call.map.CallerMapGlobalTrajectoryDrawManager import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchManager +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils 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.Companion.M_BUS @@ -79,13 +80,14 @@ object LineManager : CallerBase() { private var autopilotId: String by Delegates.observable("") { _, oldValue, newValue -> if (oldValue != newValue) { CallerEagleBaseFunctionCall4OchManager.setOchAutopilotOrderId(newValue) - val (start, end) = getStations() - if(start!=null&&end!=null){ - CallerDataCenterBizListener.invokeOchInfo(OchInfo(0, mutableListOf(start.toMogoLocation(),end.toMogoLocation()))) - }else{ - CallerDataCenterBizListener.invokeOchInfo(OchInfo(0, mutableListOf())) + if(!AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)&&!AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)){ + val (start, end) = getStations() + if(start!=null&&end!=null){ + CallerDataCenterBizListener.invokeOchInfo(OchInfo(0, mutableListOf(start.toMogoLocation(),end.toMogoLocation()))) + }else{ + CallerDataCenterBizListener.invokeOchInfo(OchInfo(0, mutableListOf())) + } } - } } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/bluetooth/BaseBluetoothManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/bluetooth/BaseBluetoothManager.kt new file mode 100644 index 0000000000..afe96ca03c --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/bluetooth/BaseBluetoothManager.kt @@ -0,0 +1,55 @@ +package com.mogo.och.common.module.manager.bluetooth + +import android.Manifest +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothManager +import android.content.Context +import android.content.pm.PackageManager +import android.os.Build +import androidx.core.app.ActivityCompat +import com.mogo.commons.AbsMogoApplication +import com.mogo.eagle.core.function.main.MainPresenter +import com.mogo.eagle.core.utilcode.mogo.permissions.PermissionsDialogUtils +import com.mogo.eagle.core.utilcode.util.ActivityUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.common.module.utils.PermissionUtil + +open class BaseBluetoothManager { + + protected var bluetoothAdapter: BluetoothAdapter? = null + protected var bluetoothManager: BluetoothManager? = null + + private val REQUEST_ENABLE_BT = 10001 + private val TAG = "OchBluetoothManager" + + private var permissionlist = arrayOf( + Manifest.permission.BLUETOOTH_SCAN, + Manifest.permission.BLUETOOTH_ADVERTISE, + Manifest.permission.BLUETOOTH_CONNECT, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.ACCESS_COARSE_LOCATION, + ) + + enum class BluetoothState { + NONE, ON, OFF + } + + init { + bluetoothManager = AbsMogoApplication.getApp().getSystemService(BluetoothManager::class.java) + bluetoothAdapter = bluetoothManager?.adapter + } + + + fun isEnable(): BluetoothState { + bluetoothAdapter?.let { + if (it.isEnabled) { + return BluetoothState.ON + } else { + return BluetoothState.OFF + } + } + ToastUtils.showShort("设备无蓝牙硬件") + return BluetoothState.NONE + } + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/bluetooth/BleDevItem.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/bluetooth/BleDevItem.kt new file mode 100644 index 0000000000..f42961b84a --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/bluetooth/BleDevItem.kt @@ -0,0 +1,19 @@ +package com.mogo.och.common.module.manager.bluetooth + +import android.bluetooth.BluetoothDevice +import android.bluetooth.le.ScanResult + +data class BleDevItem(val dev: BluetoothDevice,val scanResult: ScanResult,val gattcallback:OchBluetoothGattCallback){ + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as BleDevItem + + return dev.address == other.dev.address + } + + override fun hashCode(): Int { + return dev.hashCode() + } +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/bluetooth/BleManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/bluetooth/BleManager.kt new file mode 100644 index 0000000000..3cbc2316ad --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/bluetooth/BleManager.kt @@ -0,0 +1,127 @@ +package com.mogo.och.common.module.manager.bluetooth + +import android.annotation.SuppressLint +import android.bluetooth.le.BluetoothLeScanner +import android.bluetooth.le.ScanCallback +import android.bluetooth.le.ScanResult +import android.os.Build +import android.os.Handler +import android.os.Looper +import android.util.Log +import com.mogo.och.common.module.manager.loop.BizLoopManager +import java.util.UUID + + +object BleManager : BaseBluetoothManager() { + + val UUID_SERVICE: UUID = UUID.fromString("000018F0-0000-1000-8000-00805F9BDDFB") //自定义UUID + val UUID_CHAR_READ_NOTIFY: UUID = UUID.fromString("00002AF0-0000-1000-8000-00805F9BEEFB") + val UUID_DESC_NOTITY: UUID = UUID.fromString("00002AF1-0000-1000-8000-00805F9BCCFB") + val UUID_CHAR_WRITE: UUID = UUID.fromString("00002AF1-0000-1000-8000-00805F9BFFFB") + + + private var scanning = false + private val handler = Handler(Looper.getMainLooper()) + + private var bluetoothLeScanner: BluetoothLeScanner? = null + + private val SCAN_PERIOD = 10000L + + private const val TAG = "BleManager" + + private val scanList = mutableListOf() + + var listener: BleDevListener? = null + + private val leScanCallback = object : ScanCallback(){ + @SuppressLint("MissingPermission") + override fun onScanResult(callbackType: Int, result: ScanResult?) { + result?.let { + val device = it.device + it.rssi// 信号强度 + it.scanRecord?.advertiseFlags + it.scanRecord?.serviceUuids + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + it.scanRecord?.serviceSolicitationUuids + } + it.scanRecord?.manufacturerSpecificData + it.scanRecord?.serviceData + it.scanRecord?.txPowerLevel + it.scanRecord?.deviceName + it.scanRecord?.manufacturerSpecificData + + it.timestampNanos// + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + it.isLegacy + } else { + TODO("VERSION.SDK_INT < O") + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + it.isLegacy//是否传统蓝牙 + } else { + TODO("VERSION.SDK_INT < O") + } + it.primaryPhy + it.secondaryPhy + it.advertisingSid + it.txPower + it.periodicAdvertisingInterval + if(!it.device.name.isNullOrEmpty()){ + val bleDevItem = BleDevItem(result.device, result,OchBluetoothGattCallback(result.device)) + if(!scanList.contains(bleDevItem)){ + scanList.add(bleDevItem) + } + Log.d(TAG, "callbackType:${callbackType}_____result:${result}") + listener?.dataChange(scanList) + } + } + } + + override fun onBatchScanResults(results: MutableList?) { + Log.d(TAG, "results:${results}") + } + + override fun onScanFailed(errorCode: Int) { + Log.d(TAG, "errorCode:${errorCode}") + } + } + + + fun scanLeDevice() { + + when (isEnable()) { + BluetoothState.ON -> {} + else -> { + return + } + } + + if(bluetoothLeScanner ==null){ + bluetoothLeScanner = bluetoothAdapter?.bluetoothLeScanner + } + + try { + if (!scanning) { // Stops scanning after a pre-defined scan period. + handler.postDelayed({ + scanning = false + bluetoothLeScanner?.stopScan(leScanCallback) + }, SCAN_PERIOD) + scanning = true + bluetoothLeScanner?.startScan(leScanCallback) + scanList.clear() + listener?.dataChange(scanList) + } else { + scanning = false + bluetoothLeScanner?.stopScan(leScanCallback) + } + }catch (e:SecurityException){ + e.printStackTrace() + } + + } + + interface BleDevListener{ + fun dataChange(scanList:MutableList) + } + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/bluetooth/OchBluetoothGattCallback.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/bluetooth/OchBluetoothGattCallback.kt new file mode 100644 index 0000000000..c2c51ac15c --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/bluetooth/OchBluetoothGattCallback.kt @@ -0,0 +1,244 @@ +package com.mogo.och.common.module.manager.bluetooth + +import android.annotation.SuppressLint +import android.bluetooth.BluetoothDevice +import android.bluetooth.BluetoothGatt +import android.bluetooth.BluetoothGattCallback +import android.bluetooth.BluetoothGattCharacteristic +import android.bluetooth.BluetoothGattDescriptor +import android.bluetooth.BluetoothGattService +import android.bluetooth.BluetoothProfile +import android.util.Log +import com.mogo.commons.AbsMogoApplication +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import java.util.UUID +import kotlin.properties.Delegates + +@SuppressLint("MissingPermission") +class OchBluetoothGattCallback(device: BluetoothDevice) : BluetoothGattCallback() { + + private val device = device + private var mBluetoothGatt: BluetoothGatt? = null + var connectListener: ConnectListener?=null + + private val waitSendData = mutableMapOf() + + private val maxTryCount = 6 + private var currentTryCount = 0 + + + var isConnected:Boolean by Delegates.observable(false) { _, oldValue, newValue -> + if (oldValue != newValue) { + Log.i(TAG,"链接状态发生变化${newValue}") + connectListener?.connectChangeListener() + connectListener = null + } + } + + private val TAG = "GattCallback" + override fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) { + val dev = gatt.device + Log.i(TAG, "onConnectionStateChange:${dev.name},${dev.address},${status},${newState},${dev.type}") + if (status == BluetoothGatt.GATT_SUCCESS && newState == BluetoothProfile.STATE_CONNECTED) { + isConnected = true + gatt.discoverServices() //启动服务发现 + } else { + isConnected = false + closeConn() + } + if(status==0){ + if(newState==2){ + Log.i(TAG,"与[${dev}]连接成功") + }else{ + Log.i(TAG,"与[${dev}]连接断开") + } + }else{ + Log.i(TAG,"与[${dev}]连接出错,错误码:$status") + if(status==133){ + connect() + } + } + } + + override fun onServicesDiscovered(gatt: BluetoothGatt, status: Int) { + Log.i(TAG,"onServicesDiscovered:${gatt.device.name},${gatt.device.address},${status}") + if (status == BluetoothGatt.GATT_SUCCESS) { //BLE服务发现成功 + // 遍历获取BLE服务Services/Characteristics/Descriptors的全部UUID + for (service in gatt.services) { + val allUUIDs = StringBuilder( + "UUIDs={\n S=${service.uuid}".trimIndent() + ) + for (characteristic in service.characteristics) { + allUUIDs.append(",\nC=").append(characteristic.uuid) + for (descriptor in characteristic.descriptors) { + allUUIDs.append(",\nD=").append(descriptor.uuid) + } + } + allUUIDs.append("}") + Log.i(TAG, "onServicesDiscovered:$allUUIDs") + } + // 链接成功 服务发现也成功后 + waitSendData.forEach { + writeData2UUID(it.key,it.value) + } + } + } + + override fun onCharacteristicRead( + gatt: BluetoothGatt, + characteristic: BluetoothGattCharacteristic, + status: Int + ) { + val uuid = characteristic.uuid + val valueStr = String(characteristic.value) + Log.i(TAG,"onCharacteristicRead:${gatt.device.name},${gatt.device.address},$uuid,$valueStr,$status") + } + + override fun onCharacteristicWrite( + gatt: BluetoothGatt, + characteristic: BluetoothGattCharacteristic, + status: Int + ) { + val uuid = characteristic.uuid + val valueStr = String(characteristic.value) + Log.i( + TAG, + "onCharacteristicWrite:${gatt.device.name},${gatt.device.address},$uuid,$valueStr,$status" + ) + if(status==BluetoothGatt.GATT_SUCCESS){ + waitSendData.remove(valueStr) + closeConn() + connectListener?.sendDataSuccessAndCloseListener(device) + } + } + + override fun onCharacteristicChanged( + gatt: BluetoothGatt, + characteristic: BluetoothGattCharacteristic + ) { + val uuid = characteristic.uuid + val valueStr = String(characteristic.value) + Log.i(TAG,"onCharacteristicChanged:${gatt.device.name},${ gatt.device.address},$uuid,$valueStr") + } + + override fun onDescriptorRead( + gatt: BluetoothGatt, + descriptor: BluetoothGattDescriptor, + status: Int + ) { + val uuid = descriptor.uuid + val valueStr = descriptor.value.contentToString() + Log.i(TAG,"onDescriptorRead:${gatt.device.name},${gatt.device.address},$uuid,$valueStr,$status") + } + + override fun onDescriptorWrite( + gatt: BluetoothGatt, + descriptor: BluetoothGattDescriptor, + status: Int + ) { + val uuid = descriptor.uuid + val valueStr = descriptor.value.contentToString() + Log.i(TAG,"onDescriptorWrite:${gatt.device.name},${gatt.device.address},$uuid,$valueStr,$status") + } + + private fun refreshDeviceCache(mBluetoothGatt: BluetoothGatt?): Boolean { + if (mBluetoothGatt != null) { + try { + val refresh = mBluetoothGatt.javaClass.getMethod("refresh") + if (refresh != null) { + return refresh.invoke(mBluetoothGatt) as Boolean + } + } catch (e: Exception) { + e.printStackTrace() + } + } + return false + } + + // BLE中心设备连接外围设备的数量有限(大概2~7个),在建立新连接之前必须释放旧连接资源,否则容易出现连接错误133 + fun closeConn() { + if (mBluetoothGatt != null) { + mBluetoothGatt!!.disconnect() + mBluetoothGatt!!.close() + refreshDeviceCache(mBluetoothGatt) + mBluetoothGatt = null + isConnected = false + + } + } + + // 获取Gatt服务 + private fun getGattService(uuid: UUID): BluetoothGattService? { + if (!isConnected) { + return null + } + val service = mBluetoothGatt!!.getService(uuid) + if (service == null) ToastUtils.showShort("没有找到服务UUID=$uuid") + return service + } + + // 注意:连续频繁读写数据容易失败,读写操作间隔最好200ms以上,或等待上次回调完成后再进行下次读写操作! + // 写入数据成功会回调->onCharacteristicWrite() + fun writeData2UUID(text:String,uuid: UUID){ + OchChainLogManager.writeChainLogWriteOff("司机端核销成功","发送数据${text}") + val service = getGattService(BleManager.UUID_SERVICE) + if (service != null) { + val characteristic = service.getCharacteristic(uuid) //通过UUID获取可写的Characteristic + characteristic.setValue(text.toByteArray()) //单次最多20个字节 + mBluetoothGatt!!.writeCharacteristic(characteristic) + } + } + // 注意:连续频繁读写数据容易失败,读写操作间隔最好200ms以上,或等待上次回调完成后再进行下次读写操作! + // 读取数据成功会回调->onCharacteristicChanged() + fun readDataByUUId(uuid: UUID){ + val service = getGattService(BleManager.UUID_SERVICE) + if (service != null) { + val characteristic = + service.getCharacteristic(uuid) //通过UUID获取可读的Characteristic + mBluetoothGatt!!.readCharacteristic(characteristic) + } + } + + fun notifyByUUID(uuid: UUID,notify:UUID){ + // 设置通知Characteristic变化会回调->onCharacteristicChanged() + val service = getGattService(BleManager.UUID_SERVICE) + if (service != null) { + // 设置Characteristic通知 + val characteristic = + service.getCharacteristic(BleManager.UUID_CHAR_READ_NOTIFY) //通过UUID获取可通知的Characteristic + mBluetoothGatt!!.setCharacteristicNotification(characteristic, true) + + // 向Characteristic的Descriptor属性写入通知开关,使蓝牙设备主动向手机发送数据 + val descriptor = characteristic.getDescriptor(BleManager.UUID_DESC_NOTITY) + // descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);//和通知类似,但服务端不主动发数据,只指示客户端读取数据 + descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE) + mBluetoothGatt!!.writeDescriptor(descriptor) + } + } + + fun connectGatt(code: String, businessTime: Long) { + if(isConnected){ + ToastUtils.showShort("已连接成功") + writeData2UUID("$code,$businessTime",BleManager.UUID_CHAR_WRITE) + }else { + connect() + waitSendData["$code,$businessTime"] = BleManager.UUID_CHAR_WRITE + } + } + + private fun connect(){ + Log.i(TAG,"connect:第${currentTryCount}次") + // 重试5次 + if(currentTryCount>maxTryCount){ + return + } + currentTryCount += 1 + mBluetoothGatt = device.connectGatt(AbsMogoApplication.getApp(), false, this) + } + + interface ConnectListener{ + fun connectChangeListener(){} + fun sendDataSuccessAndCloseListener(device: BluetoothDevice) + } +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/device/checkvin/CheckVinManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/device/checkvin/CheckVinManager.kt index f2ccd5102e..b2540b997b 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/device/checkvin/CheckVinManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/device/checkvin/CheckVinManager.kt @@ -26,6 +26,14 @@ object CheckVinManager : IMoGoAutopilotCarConfigListener { checkVin() } + fun getVin(): String { + var delineVin = CallerAutoPilotControlManager.getVIN() + if(delineVin.isEmpty()){ + delineVin = LoginStatusManager.getLoginInfo()?.vin?:"" + } + return delineVin + } + private fun checkVin() { LoginStatusManager.getLoginInfo()?.let {loginInfo -> val serverVin = loginInfo.vin diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/logchainanalytic/OchChainLogManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/logchainanalytic/OchChainLogManager.kt index 1ce5e50cda..a5de2226a9 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/logchainanalytic/OchChainLogManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/logchainanalytic/OchChainLogManager.kt @@ -58,10 +58,16 @@ object OchChainLogManager { const val EVENT_KEY_INFO_DB = "analytics_event_och_db" + const val EVENT_KEY_INFO_WRITEOFF = "analytics_event_och_writeoff" + fun writeChainLogDb(title: String, info: String) { writeChainLog(title, info, true, EVENT_KEY_INFO_DB) } + fun writeChainLogWriteOff(title: String, info: String) { + writeChainLog(title, info, true, EVENT_KEY_INFO_WRITEOFF) + } + fun writeChainLogNet(mustUpdate: Boolean, title: String, info: String) { diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/ScannerClientManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/ScannerClientManager.kt new file mode 100644 index 0000000000..b1292352ff --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/ScannerClientManager.kt @@ -0,0 +1,61 @@ +package com.mogo.och.common.module.manager.scnner + +import com.mogo.eagle.core.data.enums.EventTypeEnumNew +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.V2XMsg +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager.saveMsgBox +import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDevicesMsg +import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener +import com.mogo.och.common.module.manager.socket.lan.LanSocketManager +import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType + +object ScannerClientManager { + + private val TAG = "ScannerClientManager" + + private val writeOfDevicefMsg = object : ILanMessageListener { + override fun targetLan(): Class = WriteOffDevicesMsg::class.java + override fun onLanMsgReceived(writeOffDevicesMsg: WriteOffDevicesMsg?){ + writeOffDevicesMsg?.let { + if (it.isConnectScanner != null) { + val reason = it.reason ?: "" + if (it.isConnectScanner==true) { // 链接成功 + saveMsgBox( + MsgBoxBean( + MsgBoxType.V2X, + V2XMsg( + EventTypeEnumNew.TYPE_DEVICE_STATUS_NORMAL.poiType, + reason, + EventTypeEnumNew.TYPE_DEVICE_STATUS_NORMAL.tts, + "" + ) + ) + ) + } else { // 核验失败 + saveMsgBox( + MsgBoxBean( + MsgBoxType.V2X, + V2XMsg( + EventTypeEnumNew.TYPE_DEVICE_STATUS_ABNORMAL.poiType, + reason, + EventTypeEnumNew.TYPE_DEVICE_STATUS_ABNORMAL.tts, + "" + ) + ) + ) + } + } + } + } + } + + fun load(){ + // 核销设备信息 + LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_WRITEOFF_DEVICES_INFO.type,writeOfDevicefMsg) + } + + fun release(){ + LanSocketManager.unRegisterSocketMessageListener(DPMsgType.TYPE_WRITEOFF_DEVICES_INFO.type,writeOfDevicefMsg) + } +} diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/ScannerManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/ScannerManager.kt index 110379dae3..d5e3b04749 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/ScannerManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/ScannerManager.kt @@ -1,6 +1,11 @@ package com.mogo.och.common.module.manager.scnner import android.net.Uri +import com.mogo.eagle.core.data.enums.EventTypeEnumNew +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.V2XMsg +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager.saveMsgBox 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 @@ -8,17 +13,19 @@ import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.eagle.core.utilcode.util.StringUtils import com.mogo.och.common.module.biz.lansocket.IOchLanPassengerStatusListener import com.mogo.och.common.module.biz.lansocket.LoginLanPassengerSocket +import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDevicesMsg import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener import com.mogo.och.common.module.manager.socket.lan.LanSocketManager -import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDevicesMsg -import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffMsg -import com.mogo.support.device.manager.SerialPortManager +import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType +import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDetialMsg import com.mogo.support.device.manager.bean.VerificationData import com.mogo.support.serialport.common.core.DeviceType import com.mogo.support.device.DevicesManager import com.mogo.support.device.IBindStateChangeListener import com.mogo.support.device.IVerificationAutoListener +import com.mogo.support.device.manager.SerialPortManager import java.util.concurrent.ConcurrentHashMap import kotlin.properties.Delegates @@ -107,7 +114,6 @@ object ScannerManager : IOchLanPassengerStatusListener { ) data?.let { if (data.unpackStatus.isNullOrEmpty()) { - "数据类型${it.dataType.name}" CallerLogger.d(M_BUS_P + TAG, "data $it") if (!StringUtils.isEmpty(it.payload)) { parseParams(it.payload) @@ -161,9 +167,47 @@ object ScannerManager : IOchLanPassengerStatusListener { } + private val writeOfDevicefMsg = object : ILanMessageListener { + override fun targetLan(): Class = WriteOffDevicesMsg::class.java + override fun onLanMsgReceived(writeOffDevicesMsg: WriteOffDevicesMsg?){ + writeOffDevicesMsg?.let { + if (writeOffDevicesMsg.isConnectScanner != null) { + val reason = if (writeOffDevicesMsg.reason == null) "" else writeOffDevicesMsg.reason!! + if (writeOffDevicesMsg.isConnectScanner==true) { // 链接成功 + saveMsgBox( + MsgBoxBean( + MsgBoxType.V2X, + V2XMsg( + EventTypeEnumNew.TYPE_DEVICE_STATUS_NORMAL.poiType, + reason, + EventTypeEnumNew.TYPE_DEVICE_STATUS_NORMAL.tts, + "" + ) + ) + ) + } else { // 核验失败 + saveMsgBox( + MsgBoxBean( + MsgBoxType.V2X, + V2XMsg( + EventTypeEnumNew.TYPE_DEVICE_STATUS_ABNORMAL.poiType, + reason, + EventTypeEnumNew.TYPE_DEVICE_STATUS_ABNORMAL.tts, + "" + ) + ) + ) + } + } + } + } + } + init { //监听司机端消息 LoginLanPassengerSocket.addListener(TAG, this) + // 核销设备信息 + LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_WRITEOFF_DEVICES_INFO.type,writeOfDevicefMsg) DevicesManager.addBindStateChangeListener(TAG, onSerialPortListener) DevicesManager.addVerificationListener(TAG, onDeviceVerificationListener) } @@ -175,6 +219,10 @@ object ScannerManager : IOchLanPassengerStatusListener { stateChanageListeners[tag] = listener } + fun removeListener(tag:String){ + stateChanageListeners.remove(tag) + } + override fun onDriverConnectChangeListener(isConnect: Boolean) { super.onDriverConnectChangeListener(isConnect) if (isConnect) { @@ -185,7 +233,7 @@ object ScannerManager : IOchLanPassengerStatusListener { private fun parseParams(payload: String?) { val parse = Uri.parse("${OchCommonConst.getShuttleUrl()}?${payload}") val queryParameterNames = parse.queryParameterNames - val mutableMapOf = mutableMapOf() + val mutableMapOf = mutableMapOf() queryParameterNames.forEach { val queryParameter = parse.getQueryParameter(it) if (it != null && queryParameter != null) { @@ -216,8 +264,8 @@ object ScannerManager : IOchLanPassengerStatusListener { /** * 打开设备后数据异常 */ - private fun sendWriteOffMessage2Driver(message: String) { - val msg = WriteOffMsg(false, "", 0, "", message, "") + private fun sendWriteOffMessage2Driver(message:String){ + val msg = WriteOffDetialMsg(code = 10001, msg = message) CallerLogger.d(M_BUS_P + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(msg)) LanSocketManager.sendMsgToServer(msg) } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/StateChangeListener.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/StateChangeListener.kt index 723b598010..6652b71e34 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/StateChangeListener.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/StateChangeListener.kt @@ -2,5 +2,5 @@ package com.mogo.och.common.module.manager.scnner interface StateChangeListener { fun stateChange(newBindValue: BindStatus, newOpentValue: OpenStatus){} - fun parseData(params: MutableMap, payload: String?){} + fun parseData(params: MutableMap, payload: String?){} } \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/DPMsgType.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/DPMsgType.kt index 9633fa762a..60ac74237b 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/DPMsgType.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/DPMsgType.kt @@ -19,5 +19,7 @@ enum class DPMsgType(val type: Int) { TYPE_WRITEOFF_DEVICES_INFO(9), //核销设备信息 TYPE_CHANGE_BUSINESS_TYPE(10), //业务模式切换 TYPE_ENV_CHECK(11), //环境核验 + TYPE_WRITEOFF_INFO_DETAIL(13), //核销信息 + TYPE_WRITEOFF_INFO_RESULT(14), //核销结果 TYPE_CLIENT_REGISTER(12); //客户端注册 服务端需要 } \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/DataBean.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/DataBean.kt index 25e9b815a5..e23793e500 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/DataBean.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/bean/DataBean.kt @@ -70,6 +70,36 @@ data class WriteOffMsg( val orderNo: String? ) : BaseDPMsg(DPMsgType.TYPE_WRITEOFF_INFO.type) +data class WriteOffDetialMsg( + val code:Int, // 0 乘客端参加校验成功 给司机屏 3001 乘客屏校验失败 + val msg:String?,// code 非0时具体错误信息 + val expiryTime: Long?=null, // 二维码有效期 + val bookingTime: Long?=null,// 预定时间 + val lineId: Long?=null, // 线路id + val availableTimes: Int?=null,//总票数 + val orderNo: String?=null, // 订单Id + val uid: String?=null,// 服务器端唯一码 + val phone: String?=null,// 手机号码 + val ticketSize: Int?=null,// 票上几个人 + val ticketName: String?=null,// 票的名称 + val typeBiz: String?=null,//bus shuttle + val pipe:String?=null,// 渠道ehsafety mogogosafety + val startStationId:Long?=null,// 开始站点名称 + val tenantId:Long?=null// 租户id +) : BaseDPMsg(DPMsgType.TYPE_WRITEOFF_INFO_DETAIL.type) + + +/** + * code 3001 乘客屏参数校验失败 + * code 3002 司机屏校验失败原因未知 + * code 99 小程序缓存丢失Android 缓存存在 + */ +data class WriteOffResultMsg( + val code:Int,// 1成功 其他失败 + val phone:String,// 手机号 + val businessTime:Long +) : BaseDPMsg(DPMsgType.TYPE_WRITEOFF_INFO_RESULT.type) + data class WriteOffDevicesMsg( val isConnectScanner: Boolean?, val reason: String? diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransform.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransform.kt index 47d21521cb..cb0c48af35 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransform.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransform.kt @@ -1,5 +1,6 @@ package com.mogo.och.common.module.manager.transform +import android.view.View import com.mogo.eagle.core.function.api.och.IOchBizFunctionCall4Eagle import com.mogo.eagle.core.function.call.base.CallerBase import com.mogo.eagle.core.function.call.och.CallerOchBizFunctionCall4EagleManager @@ -15,4 +16,10 @@ object OchTransform : CallerBase(), IOchBizFunctionCall4Ea it.value.logout() } } + + override fun setVideoView(target: View?) { + M_LISTENERS.forEach { + it.value.setVideoView(target) + } + } } \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransformDispatch.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransformDispatch.kt index 801a9f3ffd..978d89bfa0 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransformDispatch.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransformDispatch.kt @@ -1,6 +1,9 @@ package com.mogo.och.common.module.manager.transform +import android.view.View + interface OchTransformDispatch { fun logout(){} + fun setVideoView(target: View?){} } \ No newline at end of file diff --git a/OCH/common/common/src/main/res/layout/common_dialog_status_new.xml b/OCH/common/common/src/main/res/layout/common_dialog_status_new.xml index 7b607f953b..08c4f07159 100644 --- a/OCH/common/common/src/main/res/layout/common_dialog_status_new.xml +++ b/OCH/common/common/src/main/res/layout/common_dialog_status_new.xml @@ -13,6 +13,7 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent" android:src="@drawable/common_dialog_close" + android:visibility="gone" android:layout_marginEnd="@dimen/dp_50" android:layout_marginTop="@dimen/dp_50" android:layout_width="@dimen/dp_60" diff --git a/OCH/common/common/src/main/res/values/strings.xml b/OCH/common/common/src/main/res/values/strings.xml index bfc3004bef..5ab5149b97 100644 --- a/OCH/common/common/src/main/res/values/strings.xml +++ b/OCH/common/common/src/main/res/values/strings.xml @@ -33,4 +33,10 @@ 加载中…… 暂无数据 重新加载 + + + 提示 + 确认 + 取消 + \ No newline at end of file diff --git a/OCH/common/data/src/main/java/com/mogo/och/data/bean/WriteOffBean.kt b/OCH/common/data/src/main/java/com/mogo/och/data/bean/WriteOffBean.kt new file mode 100644 index 0000000000..da29aca7ce --- /dev/null +++ b/OCH/common/data/src/main/java/com/mogo/och/data/bean/WriteOffBean.kt @@ -0,0 +1,3 @@ +package com.mogo.och.data.bean + +data class WriteOffBean(val orderNo:String,val uid:String,val phone:String) \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/schemas/com.mogo.och.weaknet.repository.db.MyDataBase/5.json b/OCH/shuttle/driver_weaknet/schemas/com.mogo.och.weaknet.repository.db.MyDataBase/5.json new file mode 100644 index 0000000000..bdeee2552a --- /dev/null +++ b/OCH/shuttle/driver_weaknet/schemas/com.mogo.och.weaknet.repository.db.MyDataBase/5.json @@ -0,0 +1,739 @@ +{ + "formatVersion": 1, + "database": { + "version": 5, + "identityHash": "018ed967c5f335de5d39581e033160ed", + "entities": [ + { + "tableName": "contrail_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `line_id` INTEGER, `csv_file_url` TEXT, `csv_file_md5` TEXT, `txt_file_url` TEXT, `txt_file_md5` TEXT, `contrail_save_time` INTEGER, `md5` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "csvFileUrl", + "columnName": "csv_file_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "csvFileMd5", + "columnName": "csv_file_md5", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "txtFileUrl", + "columnName": "txt_file_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "txtFileMd5", + "columnName": "txt_file_md5", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "contrailSaveTime", + "columnName": "contrail_save_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "md5", + "columnName": "md5", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_contrail_data_table_line_id", + "unique": false, + "columnNames": [ + "line_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_contrail_data_table_line_id` ON `${TABLE_NAME}` (`line_id`)" + }, + { + "name": "index_contrail_data_table_md5", + "unique": false, + "columnNames": [ + "md5" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_contrail_data_table_md5` ON `${TABLE_NAME}` (`md5`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "line_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `line_id` INTEGER, `line_name` TEXT, `end_station_name` TEXT, `line_get_time` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineName", + "columnName": "line_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "endStationName", + "columnName": "end_station_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "linegetTime", + "columnName": "line_get_time", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_line_data_table_line_id", + "unique": false, + "columnNames": [ + "line_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_line_data_table_line_id` ON `${TABLE_NAME}` (`line_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "site_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `site_id` INTEGER, `line_id` INTEGER, `name` TEXT, `name_kr` TEXT, `seq` INTEGER, `gcj_lon` REAL, `gcj_lat` REAL, `lon` REAL, `lat` REAL, `introduction` TEXT, `is_play_tts` INTEGER, `md5` TEXT, `videoList` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "siteId", + "columnName": "site_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "nameKr", + "columnName": "name_kr", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "seq", + "columnName": "seq", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "gcjLon", + "columnName": "gcj_lon", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "gcjLat", + "columnName": "gcj_lat", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "lon", + "columnName": "lon", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "lat", + "columnName": "lat", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "introduction", + "columnName": "introduction", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isPlayTts", + "columnName": "is_play_tts", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "md5", + "columnName": "md5", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "videoListDB", + "columnName": "videoList", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_site_data_table_site_id", + "unique": false, + "columnNames": [ + "site_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_site_data_table_site_id` ON `${TABLE_NAME}` (`site_id`)" + }, + { + "name": "index_site_data_table_line_id", + "unique": false, + "columnNames": [ + "line_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_site_data_table_line_id` ON `${TABLE_NAME}` (`line_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "task_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `task_id` INTEGER, `line_id` INTEGER, `task_data` INTEGER, `task_start_time` INTEGER, `start_time` INTEGER, `end_time` INTEGER, `task_get_time` INTEGER NOT NULL, `status` INTEGER)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "taskId", + "columnName": "task_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "taskDate", + "columnName": "task_data", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "taskStartTime", + "columnName": "task_start_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "startTime", + "columnName": "start_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "endtime", + "columnName": "end_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "taskgetTime", + "columnName": "task_get_time", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "status", + "columnName": "status", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_task_data_table_task_id", + "unique": false, + "columnNames": [ + "task_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_task_data_table_task_id` ON `${TABLE_NAME}` (`task_id`)" + }, + { + "name": "index_task_data_table_line_id", + "unique": false, + "columnNames": [ + "line_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_task_data_table_line_id` ON `${TABLE_NAME}` (`line_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "used_task_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `task_id` INTEGER, `line_id` INTEGER, `site_id` INTEGER, `line_name` TEXT, `name` TEXT, `name_kr` TEXT, `seq` INTEGER, `gcj_lon` REAL, `gcj_lat` REAL, `lon` REAL, `lat` REAL, `driving_status` INTEGER, `leaving` INTEGER, `arrived_time` INTEGER, `leave_time` INTEGER, `introduction` TEXT, `is_play_tts` INTEGER, `event_save_time` INTEGER NOT NULL, `videoList` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "taskId", + "columnName": "task_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "siteId", + "columnName": "site_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineName", + "columnName": "line_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "nameKr", + "columnName": "name_kr", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "seq", + "columnName": "seq", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "gcjLon", + "columnName": "gcj_lon", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "gcjLat", + "columnName": "gcj_lat", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "lon", + "columnName": "lon", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "lat", + "columnName": "lat", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "drivingStatus", + "columnName": "driving_status", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "leaving", + "columnName": "leaving", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "arrivedTime", + "columnName": "arrived_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "leaveTime", + "columnName": "leave_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "introduction", + "columnName": "introduction", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isPlayTts", + "columnName": "is_play_tts", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "eventSaveTime", + "columnName": "event_save_time", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "videoList", + "columnName": "videoList", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "event_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `event_type` TEXT, `lineId` INTEGER, `lineName` TEXT, `task_id` INTEGER, `task_start_time` INTEGER, `business_time` INTEGER, `write_version` INTEGER, `site_id` INTEGER, `seq` INTEGER, `driver_id` INTEGER, `event_save_time` INTEGER NOT NULL, `update_status` INTEGER NOT NULL, `msg_id` TEXT, `update_time` INTEGER)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "eventType", + "columnName": "event_type", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "lineId", + "columnName": "lineId", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineName", + "columnName": "lineName", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "taskId", + "columnName": "task_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "taskStartTime", + "columnName": "task_start_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "businessTime", + "columnName": "business_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "writeVersion", + "columnName": "write_version", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "siteId", + "columnName": "site_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "seq", + "columnName": "seq", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "driverId", + "columnName": "driver_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "eventSaveTime", + "columnName": "event_save_time", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "updateStatus", + "columnName": "update_status", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "msgId", + "columnName": "msg_id", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "upDateTime", + "columnName": "update_time", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_event_data_table_event_save_time", + "unique": false, + "columnNames": [ + "event_save_time" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_event_data_table_event_save_time` ON `${TABLE_NAME}` (`event_save_time`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "writeoff_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `msg_id` TEXT, `expiry_time` INTEGER, `booking_time` INTEGER, `type` INTEGER, `task_id` INTEGER, `line_id` INTEGER, `site_id` INTEGER, `driver_id` INTEGER, `available_times` INTEGER, `order_no` TEXT, `uid` TEXT, `seq` TEXT, `business_time` INTEGER, `tick_size` INTEGER, `tick_name` TEXT, `event_save_time` INTEGER NOT NULL, `update_status` INTEGER NOT NULL, `update_time` INTEGER)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "msgId", + "columnName": "msg_id", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "expiryTime", + "columnName": "expiry_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "bookingTime", + "columnName": "booking_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "taskId", + "columnName": "task_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "siteId", + "columnName": "site_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "driverId", + "columnName": "driver_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "availableTimes", + "columnName": "available_times", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "orderNo", + "columnName": "order_no", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "phone", + "columnName": "seq", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "businessTime", + "columnName": "business_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "ticketSize", + "columnName": "tick_size", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "ticketName", + "columnName": "tick_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "eventSaveTime", + "columnName": "event_save_time", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "updateStatus", + "columnName": "update_status", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "upDateTime", + "columnName": "update_time", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_writeoff_data_table_event_save_time", + "unique": false, + "columnNames": [ + "event_save_time" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_writeoff_data_table_event_save_time` ON `${TABLE_NAME}` (`event_save_time`)" + } + ], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '018ed967c5f335de5d39581e033160ed')" + ] + } +} \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ShuttleDriverProvider.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ShuttleDriverProvider.kt index b36287aece..7469c5c8b9 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ShuttleDriverProvider.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ShuttleDriverProvider.kt @@ -11,6 +11,7 @@ import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.biz.provider.CommonServiceImpl import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutopilotAnalytics +import com.mogo.och.common.module.manager.scnner.ScannerClientManager import com.mogo.och.weaknet.repository.db.repository.EventDb import com.mogo.och.weaknet.repository.db.repository.LineDb import com.mogo.och.weaknet.repository.db.repository.TaskDb @@ -18,6 +19,7 @@ import com.mogo.och.weaknet.repository.db.repository.TaskSiteDb import com.mogo.och.weaknet.ui.fragment.ShuttleFragment import com.mogo.och.weaknet.model.LineModel import com.mogo.och.weaknet.repository.RepositoryManager +import com.mogo.och.weaknet.repository.db.repository.WriteOffDb import com.mogo.och.weaknet.ui.bizswitch.SwitchBizView import com.mogo.och.weaknet.ui.qr.QrOpenView import com.mogo.och.weaknet.util.BusAnalyticsManager @@ -40,6 +42,7 @@ class ShuttleDriverProvider : CommonServiceImpl() { TaskDb.deleteObsoleteData() TaskSiteDb.deleteObsoleteData() EventDb.deleteObsoleteData() + WriteOffDb.deleteObsoleteData() } } @@ -48,7 +51,8 @@ class ShuttleDriverProvider : CommonServiceImpl() { busFragment = ShuttleFragment() } OchAutopilotAnalytics.ochEventKey = BusAnalyticsManager - LineModel.init(); + LineModel.init() + ScannerClientManager.load() return busFragment!! } @@ -56,6 +60,7 @@ class ShuttleDriverProvider : CommonServiceImpl() { busFragment = null OchAutopilotAnalytics.ochEventKey = null LineModel.release() + ScannerClientManager.release() RepositoryManager.release() } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/WaitUploadTask.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/WaitUploadTask.kt index c31501e604..060b03b464 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/WaitUploadTask.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/WaitUploadTask.kt @@ -20,7 +20,7 @@ data class WaitUploadLine(var lineName:String ,var lineId:Long,var task:MutableL } } -data class WaitUploadTask(val taskStartTime:Long,val taskId:Long){ +data class WaitUploadTask(val taskStartTime:Long,val taskId:Long,val waitUploadWriteOff:Int){ override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/request/ShuttleEventRequest.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/request/ShuttleEventRequest.kt index c68457ddab..a912a6754a 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/request/ShuttleEventRequest.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/request/ShuttleEventRequest.kt @@ -3,31 +3,45 @@ package com.mogo.och.weaknet.bean.request import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.network.utils.digest.DigestUtils import com.mogo.och.common.module.biz.login.LoginStatusManager +import com.mogo.och.common.module.manager.device.checkvin.CheckVinManager import com.mogo.och.weaknet.repository.db.bean.EventDataBean +import com.mogo.och.weaknet.repository.db.bean.WriteOffDataBean /** * 上报事件 */ -data class ShuttleEventRequest(val requestId: String, val sn: String, val businessType: Int,val eventList:MutableList){ +data class ShuttleEventRequest(val requestId: String, val sn: String,val vin:String ,val businessType: Int,val eventList:MutableList){ companion object{ - fun transformDb2Net(waitUpdateEvent: List): ShuttleEventRequest { + fun transformDb2Net( + waitUpdateEvent: List?, + waitUpdateWriteOffEvent: List? + ): ShuttleEventRequest { val businessTypeShuttle = LoginStatusManager.getLoginInfo()?.businessType?:11 - val md5Hex = DigestUtils.md5Hex(waitUpdateEvent.toString()) val eventList4Request = mutableListOf() var tempEvent: Event?=null - waitUpdateEvent.forEach { + waitUpdateEvent?.forEach { tempEvent = Event(it.eventType, EventData(it.taskId,it.businessTime,it.writeVersion,it.siteId,it.seq,it.driverId,it.msgId) ) eventList4Request.add(tempEvent!!) } - return ShuttleEventRequest(md5Hex, SharedPrefsMgr.getInstance().sn, + + waitUpdateWriteOffEvent?.forEach { + tempEvent = Event("WriteOff", + WriteOffEventData(it.msgId,it.taskId,it.siteId,it.driverId,it.orderNo,it.businessTime,it.businessTime) + ) + eventList4Request.add(tempEvent!!) + } + val md5Hex = DigestUtils.md5Hex(eventList4Request.toString()) + return ShuttleEventRequest(md5Hex, SharedPrefsMgr.getInstance().sn, CheckVinManager.getVin(), businessTypeShuttle,eventList4Request) } } } -data class Event(var eventType: String?,val eventData: EventData) +data class Event(var eventType: String?,val eventData: EventDataBase) + +open class EventDataBase(val msgtype:String) data class EventData( var taskId: Long?, @@ -37,4 +51,14 @@ data class EventData( var seq: Int?, var driverId:Long?, var msgId:String? -) \ No newline at end of file +):EventDataBase(msgtype = "lineEvent") + +data class WriteOffEventData( + var msgId: String?, + var taskId: Long?, + var siteId: Long?, + var driverId: Long?, + var orderNo: String?, + var businessTime: Long?, + var writeVersion: Long?, +):EventDataBase(msgtype = "writeoffEvent") \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/EventModel.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/EventModel.kt index daa2818b82..1e1e263d3a 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/EventModel.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/EventModel.kt @@ -9,39 +9,36 @@ import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.weaknet.bean.request.ShuttleEventRequest import com.mogo.och.weaknet.bean.WaitUploadLine import com.mogo.och.weaknet.bean.WaitUploadTask -import com.mogo.och.weaknet.repository.net.weaknet.dali.shuttle.DaliShuttleServiceManager import com.mogo.och.weaknet.repository.db.bean.EventDataBean import com.mogo.och.weaknet.repository.db.repository.EventDb import com.mogo.och.weaknet.repository.RepositoryManager import com.mogo.och.weaknet.repository.db.repository.SiteDb +import com.mogo.och.weaknet.repository.db.repository.WriteOffDb import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import io.reactivex.subjects.BehaviorSubject import java.util.concurrent.atomic.AtomicBoolean -object EventModel : EventDb.EventCallback { +object EventModel { private val isUpdating by lazy { AtomicBoolean(false) } private val createDefault = BehaviorSubject.createDefault(isUpdating.get()) fun load(){ - if (RepositoryManager.supportDb()) { - EventDb.eventCallback = this + if (RepositoryManager.supportDb() || RepositoryManager.supportWriteOffDb()) { BizLoopManager.postDelayed(loopUpdateInfo,2*60*1000) } } fun release(){ - if (RepositoryManager.supportDb()) { - EventDb.eventCallback = null - } + BizLoopManager.removeCallback(loopUpdateInfo) } private val loopUpdateInfo = Runnable { updateEvent() } - override fun notifySyn() { + fun notifySyn() { BizLoopManager.removeCallback(loopUpdateInfo) updateEvent() checkDbData() @@ -62,8 +59,9 @@ object EventModel : EventDb.EventCallback { isUpdating.set(true) createDefault.onNext(isUpdating.get()) ThreadUtils.getSinglePool().submit { - val waitUpdateEvent = EventDb.queryWaitUpdateEvent() - if(waitUpdateEvent.isNullOrEmpty()){ + val waitUpdateLineEvent = EventDb.queryWaitUpdateEvent() + val waitUpdateWriteOffEvent = WriteOffDb.queryWaitUpdateEvent() + if (waitUpdateLineEvent.isNullOrEmpty() && waitUpdateWriteOffEvent.isNullOrEmpty()) { OchChainLogManager.writeChainLogDb("上报event","没有数据需要上报${Thread.currentThread().name}") isUpdating.set(false) createDefault.onNext(isUpdating.get()) @@ -71,15 +69,27 @@ object EventModel : EventDb.EventCallback { return@submit } OchChainLogManager.writeChainLogDb("上报event","开始上报:${Thread.currentThread().name}") - val transformDb2Net = ShuttleEventRequest.transformDb2Net(waitUpdateEvent) + val transformDb2Net = ShuttleEventRequest.transformDb2Net(waitUpdateLineEvent,waitUpdateWriteOffEvent) RepositoryManager.reportCabinEvent(AbsMogoApplication.getApp()!!,transformDb2Net,object :OchCommonServiceCallback{ override fun onSuccess(data: BaseData?) { - waitUpdateEvent.forEach { - it.updateStatus = EventDataBean.updated - it.upDateTime = System.currentTimeMillis() - } OchChainLogManager.writeChainLogDb("上报event成功","$transformDb2Net ${Thread.currentThread().name}") - EventDb.saveUpdateSuccess(waitUpdateEvent) + + waitUpdateLineEvent?.let {lineEvents-> + lineEvents.forEach { + it.updateStatus = EventDataBean.updated + it.upDateTime = System.currentTimeMillis() + } + EventDb.saveUpdateSuccess(lineEvents) + } + + waitUpdateWriteOffEvent?.let {writeOffEvents-> + writeOffEvents.forEach { + it.updateStatus = EventDataBean.updated + it.upDateTime = System.currentTimeMillis() + } + WriteOffDb.saveUpdateSuccess(writeOffEvents) + } + isUpdating.set(false) createDefault.onNext(isUpdating.get()) val queryWaitUpdateEventCount = EventDb.queryWaitUpdateEventCount() @@ -110,26 +120,7 @@ object EventModel : EventDb.EventCallback { } fun queryWaitUploadInfo(): Observable>? { - return EventDb.queryWaitUploadData() - ?.flatMap { waitUploadList-> - val result = mutableListOf() - waitUploadList.forEach { wait-> - if(wait.lineId!=null&&wait.lineName!=null&&wait.taskId!=null&&wait.taskStartTime!=null) { - val tempTask = WaitUploadTask(wait.taskStartTime!!,wait.taskId!!) - val tempLine = WaitUploadLine(wait.lineName!!, wait.lineId!!, mutableListOf(tempTask)) - val haveSave = result.filter { - it.lineId==tempLine.lineId - } - if(haveSave.isEmpty()){ - result.add(tempLine) - }else{ - haveSave.first().task.add(tempTask) - } - } - } - Observable.just(result) - }?.subscribeOn(Schedulers.io()) - ?.observeOn(AndroidSchedulers.mainThread()) + return RepositoryManager.queryWaitUploadData() } fun getUploadTaskObservable():BehaviorSubject{ diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/LineModel.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/LineModel.kt index 82b008de2d..15c40c8764 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/LineModel.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/LineModel.kt @@ -5,7 +5,11 @@ import android.content.Context import com.mogo.commons.AbsMogoApplication import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.map.SiteMarkerBean +import com.mogo.eagle.core.data.och.OchInfo +import com.mogo.eagle.core.data.v2x.Point import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener import com.mogo.eagle.core.network.utils.digest.DigestUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d @@ -146,7 +150,9 @@ object LineModel { "数据发生变化", "接口信息发生变化 $lastChangeMd5 new md5${currentRequest}" ) + val startTime = System.currentTimeMillis() CarExecutableTaskResponse.save2Db(data) + CallerLogger.d(TAG,"更新数据耗时${System.currentTimeMillis()-startTime}___${Thread.currentThread().name}") RxUtils.createSubscribe(800) { // 等待写入数据库 mBusLinesCallbackMap.forEach { callback -> @@ -298,75 +304,85 @@ object LineModel { } fun endTask() { - currentTask?.let { task -> - RepositoryManager.endTask(task.taskId?:0L) - ?.subscribeOn(Schedulers.io()) - ?.observeOn(AndroidSchedulers.mainThread()) - ?.subscribe(object : Observer { - override fun onSubscribe(d: Disposable) { - startTaskDisposable - d(TAG, "endTask onSubscribe") - } - - override fun onError(e: Throwable) { - d(TAG, "endTask onError${e.printStackTrace()}") - if (e is DataException) { - + currentTask?.taskId?.let { taskId -> + if (RepositoryManager.canCanEndTask(taskId)) { + RepositoryManager.endTask(taskId) + ?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.subscribe(object : Observer { + override fun onSubscribe(d: Disposable) { + startTaskDisposable + d(TAG, "endTask onSubscribe") } - if (RepositoryManager.supportDb()) { - isGoingToNextStation = false - ThirdDeviceData.endTask() - ThirdDeviceData.sendTaskDetailsToClients() - ShuttleVoiceManager.endOrderBus() - // 取消自驾 - CallerAutoPilotControlManager.cancelAutoPilot() - currentTask = null - LineManager.setLineInfo(null) - LineManager.setStartAndEndStation(null,null) - stationList = mutableListOf() - startStationIndex = 0 - mBusLinesCallbackMap.forEach { - it.value.onCompleteTask() + override fun onError(e: Throwable) { + d(TAG, "endTask onError${e.printStackTrace()}") + if (e is DataException) { + } - val changeInfo = "taskId:${currentTask?.taskId}--lineInfo:${LineManager.lineInfos}" - OchChainLogManager.writeChainLog("结束任务", changeInfo) - }else{ - ToastUtils.showShort("结束任务失败请稍后再试") - mBusLinesCallbackMap.forEach { - it.value.onCompleteTaskFail() + if (RepositoryManager.supportDb()) { + isGoingToNextStation = false + + ThirdDeviceData.endTask() + ThirdDeviceData.sendTaskDetailsToClients() + ShuttleVoiceManager.endOrderBus() + // 取消自驾 + CallerAutoPilotControlManager.cancelAutoPilot() + currentTask = null + LineManager.setLineInfo(null) + LineManager.setStartAndEndStation(null, null) + LineModel.callEyeMap(true) + stationList = mutableListOf() + startStationIndex = 0 + mBusLinesCallbackMap.forEach { + it.value.onCompleteTask() + } + val changeInfo = + "taskId:${currentTask?.taskId}--lineInfo:${LineManager.lineInfos}" + OchChainLogManager.writeChainLog("结束任务", changeInfo) + } else { + ToastUtils.showShort("结束任务失败请稍后再试") + mBusLinesCallbackMap.forEach { + it.value.onCompleteTaskFail() + } } } - } - override fun onComplete() { - d(TAG, "endTask onComplete") - } - - override fun onNext(data: Boolean) { - d(TAG, "endTask onNext ${data}") - if (data) { - isGoingToNextStation = false - - ThirdDeviceData.endTask() - ThirdDeviceData.sendTaskDetailsToClients() - ShuttleVoiceManager.endOrderBus() - // 取消自驾 - CallerAutoPilotControlManager.cancelAutoPilot() - currentTask = null - LineManager.setLineInfo(null) - LineManager.setStartAndEndStation(null,null) - stationList = mutableListOf() - startStationIndex = 0 - mBusLinesCallbackMap.forEach { - it.value.onCompleteTask() - } - val changeInfo = "taskId:${currentTask?.taskId}--lineInfo:${LineManager.lineInfos}" - OchChainLogManager.writeChainLog("结束任务", changeInfo) + override fun onComplete() { + d(TAG, "endTask onComplete") } - onComplete() - } - }) + + override fun onNext(data: Boolean) { + d(TAG, "endTask onNext ${data}") + if (data) { + isGoingToNextStation = false + + ThirdDeviceData.endTask() + ThirdDeviceData.sendTaskDetailsToClients() + ShuttleVoiceManager.endOrderBus() + // 取消自驾 + CallerAutoPilotControlManager.cancelAutoPilot() + currentTask = null + LineManager.setLineInfo(null) + LineManager.setStartAndEndStation(null, null) + LineModel.callEyeMap(true) + stationList = mutableListOf() + startStationIndex = 0 + mBusLinesCallbackMap.forEach { + it.value.onCompleteTask() + } + val changeInfo = + "taskId:${currentTask?.taskId}--lineInfo:${LineManager.lineInfos}" + OchChainLogManager.writeChainLog("结束任务", changeInfo) + } + onComplete() + } + }) + }else{ + ToastUtils.showShort("有待上传核销数据请稍等") + // 主动上报一次 + EventModel.notifySyn() + } } } @@ -394,4 +410,45 @@ object LineModel { } } + fun callEyeMap(isClear:Boolean){ + if(isClear) { + val ochInfo = OchInfo(1, mutableListOf()) + ochInfo.siteMarkerList = mutableListOf() + CallerDataCenterBizListener.invokeOchInfo(ochInfo) + }else{ + val siteList = mutableListOf() + var temp: SiteMarkerBean?=null + stationList?.let { + it.forEachIndexed { index, busStationBean -> + if(index==0){ + temp =SiteMarkerBean(Point(busStationBean.gcjLon,busStationBean.gcjLat),R.drawable.bus_station_start,0.5f,0.87f) + }else if(index==it.size-1){ + temp =SiteMarkerBean(Point(busStationBean.gcjLon,busStationBean.gcjLat),R.drawable.bus_station_end,0.5f,0.87f) + }else{ + if(busStationBean.drivingStatus==1){ + temp =SiteMarkerBean(Point(busStationBean.gcjLon,busStationBean.gcjLat),R.drawable.bus_station_pass,0.5f,0.478f) + }else if (busStationBean.drivingStatus==3){ + temp =SiteMarkerBean(Point(busStationBean.gcjLon,busStationBean.gcjLat),R.drawable.bus_station_notarrive,0.5f,0.478f) + }else if (busStationBean.drivingStatus==2){ + if(busStationBean.isLeaving){ + temp =SiteMarkerBean(Point(busStationBean.gcjLon,busStationBean.gcjLat),R.drawable.bus_station_pass,0.5f,0.478f) + }else{ + temp =SiteMarkerBean(Point(busStationBean.gcjLon,busStationBean.gcjLat),R.drawable.bus_station_notarrive,0.5f,0.478f) + } + } + } + temp?.let {temp-> + siteList.add(temp) + } + } + } + val (start, end) = LineManager.getStations() + if(start!=null&&end!=null){ + val ochInfo = OchInfo(1, mutableListOf(start.toMogoLocation(),end.toMogoLocation())) + ochInfo.siteMarkerList = siteList + CallerDataCenterBizListener.invokeOchInfo(ochInfo) + } + } + } + } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/OrderModel.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/OrderModel.kt index b78c7fff71..865c646471 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/OrderModel.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/OrderModel.kt @@ -416,6 +416,7 @@ object OrderModel { if(LineModel.startStationIndex +1< it.size){ val endStation = it[LineModel.startStationIndex +1] LineManager.setStartAndEndStation(startStation,endStation) + LineModel.callEyeMap(false) } } LineModel.arrivedStationSuccess() @@ -431,6 +432,7 @@ object OrderModel { if(LineModel.startStationIndex +1< it.size){ val endStation = it[LineModel.startStationIndex +1] LineManager.setStartAndEndStation(startStation,endStation) + LineModel.callEyeMap(false) } } LineModel.arrivedStationSuccess() diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/TicketModel.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/TicketModel.kt index 00176e97d8..815c1d3640 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/TicketModel.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/TicketModel.kt @@ -2,15 +2,16 @@ package com.mogo.och.weaknet.model import com.elegant.network.utils.GsonUtil import com.mogo.commons.AbsMogoApplication -import com.mogo.commons.env.ProjectUtils import com.mogo.eagle.core.data.enums.EventTypeEnumNew import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.V2XMsg import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager.saveMsgBox +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger 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.mogo.logger.scene.SceneConstant.Companion.M_BUS_P import com.mogo.och.common.module.manager.autopilot.line.LineManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.loop.BizLoopManager @@ -20,19 +21,24 @@ import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener import com.mogo.och.common.module.manager.socket.lan.LanSocketManager import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType -import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDevicesMsg -import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffMsg +import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDetialMsg +import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffResultMsg import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.weaknet.bean.response.WriteOffCountResponse import com.mogo.och.weaknet.bean.WriteOffPassenger import com.mogo.och.weaknet.repository.RepositoryManager +import com.mogo.och.weaknet.repository.exception.DataException +import com.mogo.och.weaknet.repository.net.bean.response.PassengerWriteOffResponse import com.mogo.och.weaknet.util.ShuttleVoiceManager import io.reactivex.Observable import io.reactivex.ObservableEmitter import io.reactivex.ObservableOnSubscribe +import io.reactivex.Observer +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers -object TicketModel : IOchOnMessageListener{ +object TicketModel { private const val TAG = "TicketModel" @@ -40,89 +46,106 @@ object TicketModel : IOchOnMessageListener{ private var emitterMain: ObservableEmitter>?=null - private val observable = Observable.create(ObservableOnSubscribe> { emitter -> emitterMain = emitter }) - - private val writeOffMsg = object : ILanMessageListener { - override fun targetLan(): Class = WriteOffMsg::class.java - override fun onLanMsgReceived(obj: WriteOffMsg?) = receiveWrteOffInfo(obj) + /** + * 接受乘客端扫码数据进行云端和本地核销 + */ + private val writeOffDetialMsg = object : ILanMessageListener { + override fun targetLan(): Class = WriteOffDetialMsg::class.java + override fun onLanMsgReceived(obj: WriteOffDetialMsg?) = receiveWrteOffDefailtInfo(obj) } - private val writeOfDevicefMsg = object : ILanMessageListener { - override fun targetLan(): Class = WriteOffDevicesMsg::class.java - override fun onLanMsgReceived(obj: WriteOffDevicesMsg?) = receiveWrteOffDevicesInfo(obj) + /** + * 接受乘客端扫码数据进行云端和本地核销 + */ + private val writeOffOnlineMsg = object : IOchOnMessageListener { + override fun target(): Class { + return WriteOffPassenger::class.java + } + + override fun onMsgReceived(passenger: WriteOffPassenger?) { + //进行播报 + i(SceneConstant.M_BUS + TAG, "后台socket 核验:passenger = " + GsonUtil.jsonFromObject(passenger)) + if(passenger==null||passenger.passengerSize==0){ + return + } + RepositoryManager.saveWriteOff4Socket(passenger) + writeOffSuccess( + passenger.passengerSize, + passenger.phone ?: "", + passenger.ticketName?:"", + 0 + ) + } + } + + private val observable = Observable.create(ObservableOnSubscribe> { emitter -> emitterMain = emitter }) + + fun getWriteOffCountObservable():Observable>{ + return observable } fun load(){ - // 3s轮训站点核销人数 - if(RepositoryManager.supportWriteOff()) { + // 3s轮训站点核销人数 人数本地核销 直接计算就好 + if (RepositoryManager.supportWriteOff() && RepositoryManager.supportWriteOffDb()) { BizLoopManager.setLoopFunction( SELECTWRITEOFFCOUNT, LoopInfo(3, TicketModel::selectWriteOffCount, scheduler = Schedulers.io()) ) } // 核销信息 - LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_WRITEOFF_INFO.type,writeOffMsg) - // 核销设备信息 - LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_WRITEOFF_DEVICES_INFO.type,writeOfDevicefMsg) + LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_WRITEOFF_INFO_DETAIL.type,writeOffDetialMsg) + //监听核销乘客 - OCHSocketMessageManager.registerSocketMessageListener(OCHSocketMessageManager.msgWriteOffPassengerType, this) + OCHSocketMessageManager.registerSocketMessageListener(OCHSocketMessageManager.msgWriteOffPassengerType, writeOffOnlineMsg) } fun release(){ if(RepositoryManager.supportWriteOff()) { BizLoopManager.removeLoopFunction(SELECTWRITEOFFCOUNT) } - LanSocketManager.unRegisterSocketMessageListener(DPMsgType.TYPE_WRITEOFF_INFO.type,writeOffMsg) - LanSocketManager.unRegisterSocketMessageListener(DPMsgType.TYPE_WRITEOFF_DEVICES_INFO.type,writeOfDevicefMsg) + LanSocketManager.unRegisterSocketMessageListener(DPMsgType.TYPE_WRITEOFF_INFO_DETAIL.type,writeOffDetialMsg) OCHSocketMessageManager.releaseSocketMessageListener(OCHSocketMessageManager.msgWriteOffPassengerType) } - override fun target(): Class { - return WriteOffPassenger::class.java - } - - // 收到服务器的核验信息 - override fun onMsgReceived(passenger: WriteOffPassenger?) { - //进行播报 - i(SceneConstant.M_BUS + TAG, "后台socket 核验:passenger = " + GsonUtil.jsonFromObject(passenger)) - if(passenger==null||passenger.passengerSize==0){ - return - } - playPassenger( - passenger.passengerSize, - passenger.phone ?: "", - passenger.ticketName?:"", - passenger.orderNo?:"" - ) - selectWriteOffCount() - } - private fun selectWriteOffCount(){ LineManager.getStations().first?.let { firstStation-> LineModel.currentTask?.let { currentTask-> - RepositoryManager.queryWriteoffCount( + val queryWriteoffCount = RepositoryManager.queryWriteoffCount( AbsMogoApplication.getApp(), - currentTask.taskId?:0L, - firstStation.siteId.toLong(), - object : OchCommonServiceCallback { - override fun onSuccess(data: WriteOffCountResponse?) { - data?.let { - val count = if(it.data==null){ - 0 - }else{ - it.data - } - emitterMain?.onNext(Pair(firstStation.siteId,count)) - d(SceneConstant.M_BUS + TAG, "${firstStation.name}核销人数:${count}") - OchChainLogManager.writeChainLog("核销人数","任务:${currentTask.taskId} zhan'dian") + currentTask.taskId ?: 0L, + firstStation.siteId.toLong() + ) + if(queryWriteoffCount!=null){ + queryWriteoffCount.subscribe( + object : Observer { + override fun onSubscribe(d: Disposable) { + } - } - override fun onFail(code: Int, msg: String?) { + override fun onError(e: Throwable) { + + } + + override fun onComplete() { + + } + + override fun onNext(count: Int) { + emitterMain?.onNext(Pair(firstStation.siteId, count)) + d( + SceneConstant.M_BUS + TAG, + "${firstStation.name}核销人数:${count}" + ) + OchChainLogManager.writeChainLog( + "核销人数", + "任务:${currentTask.taskId} zhan'dian" + ) + } } - }) - return + ) + return + } } } @@ -130,83 +153,129 @@ object TicketModel : IOchOnMessageListener{ d(SceneConstant.M_BUS + TAG, "线路或者站点未空") } - fun getWriteOffCountObservable():Observable>{ - return observable - } - private fun receiveWrteOffInfo(writeOffMsg: WriteOffMsg?) { - if(writeOffMsg!=null) { - if (writeOffMsg.isScuccess != null) { - if (writeOffMsg.isScuccess == true) { // 核验成功 - if(writeOffMsg.ticketSize==null||writeOffMsg.ticketSize==0){ - return - } - } else { // 核验失败 - ShuttleVoiceManager.writeOffFaile(writeOffMsg.failedReason ?: "") - var tempPhone = writeOffMsg.phone - tempPhone?.let { - if (it.length > 8) { - //截取电话号码前三位 - val phoneNumPre = it.substring(0, 3) - //截取电话号码后四位 - val phoneNumFix = it.substring(7) - tempPhone = "$phoneNumPre****$phoneNumFix" + private fun receiveWrteOffDefailtInfo(writeOffDetialMsg: WriteOffDetialMsg?) { + writeOffDetialMsg?.let { + if (writeOffDetialMsg.code != 0) { + sendMessage2Driver( + writeOffDetialMsg.msg ?: "", + writeOffDetialMsg.phone ?: "", + writeOffDetialMsg.code + ) + } else { + RepositoryManager.writeOff(writeOffDetialMsg) + ?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.subscribe(object : Observer { + override fun onSubscribe(d: Disposable) { + d(TAG, "receiveWrteOffDefailtInfo onSubscribe") } - } - val reaseonAndPhone = if(tempPhone.isNullOrEmpty()) { - "${writeOffMsg.failedReason}" - }else{ - "${writeOffMsg.failedReason};乘客:${tempPhone}" - } - saveMsgBox( - MsgBoxBean( - MsgBoxType.V2X, V2XMsg( - EventTypeEnumNew.TYPE_ABNORMAL_VERIFICATION.poiType, - reaseonAndPhone, - EventTypeEnumNew.TYPE_ABNORMAL_VERIFICATION.tts, - "" + + override fun onError(e: Throwable) { + d(TAG, "receiveWrteOffDefailtInfo onError${e.printStackTrace()}") + if (e is DataException) { + CallerLogger.d(M_BUS_P + TAG, "核销失败 ${e.code}-----${e.msg}") + parseData(e.code,e.msg?:"",writeOffDetialMsg.phone?:"") + } + } + + override fun onComplete() { + d(TAG, "receiveWrteOffDefailtInfo onComplete") + } + + override fun onNext(data: PassengerWriteOffResponse.Result) { + d(TAG, "queryBusLines onNext ${data}") + writeOffSuccess( + data.ticketSize ?: 0, + data.phone ?: "", + data.ticketName ?: "", + data.businessTime?:System.currentTimeMillis(), ) - ) - ) + } + }) + } + } + } + + /** + * 解析错误原因 + */ + private fun parseData(code:Int,msg:String,phone: String){ + when (code) { + 6002 -> sendMessage2Driver("同一订单核销间隔时间需大于2分钟", phone,6002) + 1009 -> sendMessage2Driver("车票所选乘车日期非今日", phone,1009) + 1005 -> sendMessage2Driver("车辆未登录、或没有任务", phone,1005) + 1006 -> sendMessage2Driver("车票路线信息与当前车辆执行任务的路线信息不符合", phone,1006) + 1008 -> sendMessage2Driver("车票剩余可用次数为0", phone,99) + 6001 -> sendMessage2Driver("二维码已过期", phone,6001) + 1012 -> sendMessage2Driver("当前用户下单路线非当前的车辆所属公司", phone,1012) + else -> { + try { + val tempcode=msg.toInt() + parseData(tempcode,msg,phone) + }catch (e:Exception){ + sendMessage2Driver(msg, phone,3002) } } } } - private fun receiveWrteOffDevicesInfo(writeOffMsg: WriteOffDevicesMsg?) { - writeOffMsg?.let { - if (writeOffMsg.isConnectScanner != null) { - val reason = if (writeOffMsg.reason == null) "" else writeOffMsg.reason!! - if (writeOffMsg.isConnectScanner==true) { // 链接成功 - saveMsgBox( - MsgBoxBean( - MsgBoxType.V2X, - V2XMsg( - EventTypeEnumNew.TYPE_DEVICE_STATUS_NORMAL.poiType, - reason, - EventTypeEnumNew.TYPE_DEVICE_STATUS_NORMAL.tts, - "" - ) - ) - ) - } else { // 核验失败 - saveMsgBox( - MsgBoxBean( - MsgBoxType.V2X, - V2XMsg( - EventTypeEnumNew.TYPE_DEVICE_STATUS_ABNORMAL.poiType, - reason, - EventTypeEnumNew.TYPE_DEVICE_STATUS_ABNORMAL.tts, - "" - ) - ) - ) - } + /** + * 验票失败 + * code 3001 乘客屏参数校验失败 + * code 3002 司机屏校验失败原因未知 + * code 99 小程序缓存丢失Android 缓存存在 + */ + private fun sendMessage2Driver(message:String,phone:String,code:Int){ + // 发送乘客屏 通过蓝牙告知小程序 + LanSocketManager.sendMsgToClient(WriteOffResultMsg(code = code, phone = phone, System.currentTimeMillis())) + val failedReason = "验票失败,${message}" + ShuttleVoiceManager.writeOffFaile(failedReason) + var tempPhone = phone + tempPhone.let { + if (it.length > 8) { + //截取电话号码前三位 + val phoneNumPre = it.substring(0, 3) + //截取电话号码后四位 + val phoneNumFix = it.substring(7) + tempPhone = "$phoneNumPre****$phoneNumFix" } } + val reaseonAndPhone = if(tempPhone.isNullOrEmpty()) { + failedReason + }else{ + "${failedReason};乘客:${tempPhone}" + } + saveMsgBox( + MsgBoxBean( + MsgBoxType.V2X, V2XMsg( + EventTypeEnumNew.TYPE_ABNORMAL_VERIFICATION.poiType, + reaseonAndPhone, + EventTypeEnumNew.TYPE_ABNORMAL_VERIFICATION.tts, + "" + ) + ) + ) } - private fun playPassenger(ticketSize: Int,phone:String,ticketName:String,orderNo:String) { + /** + * 验票成功 + * 1、本地核销 + * 2、云端核销 + */ + private fun writeOffSuccess(ticketSize: Int, phone:String, ticketName:String,businessTime:Long) { + + // 发送乘客屏 通过蓝牙告知小程序 为0时是 安全员小程序核销的 + if(businessTime>0) { + LanSocketManager.sendMsgToClient( + WriteOffResultMsg( + code = 0,// 00成功 + phone = phone, + businessTime = businessTime + ) + ) + } + BizLoopManager.runInIoThread { selectWriteOffCount() } ShuttleVoiceManager.writeOffCount(ticketSize) diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/RepositoryManager.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/RepositoryManager.kt index 4f79fda2f0..066f1c27a6 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/RepositoryManager.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/RepositoryManager.kt @@ -7,22 +7,30 @@ import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDetialMsg import com.mogo.och.common.module.network.OchCommonServiceCallback +import com.mogo.och.weaknet.bean.WaitUploadLine +import com.mogo.och.weaknet.bean.WriteOffPassenger import com.mogo.och.weaknet.bean.request.ShuttleEventRequest import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse -import com.mogo.och.weaknet.bean.response.WriteOffCountResponse import com.mogo.och.weaknet.repository.db.MyDataBase import com.mogo.och.weaknet.repository.db.bean.LineDataBean import com.mogo.och.weaknet.repository.db.bean.TaskDataBean import com.mogo.och.weaknet.repository.db.repository.EventDb -import com.mogo.och.weaknet.repository.impl.NormalRepository -import com.mogo.och.weaknet.repository.impl.WeaknetRepository +import com.mogo.och.weaknet.repository.line.ILineRepository +import com.mogo.och.weaknet.repository.line.impl.NormalRepository +import com.mogo.och.weaknet.repository.line.impl.WeaknetRepository +import com.mogo.och.weaknet.repository.net.bean.response.PassengerWriteOffResponse +import com.mogo.och.weaknet.repository.writeoff.IWriteOffRepository +import com.mogo.och.weaknet.repository.writeoff.impl.WriteOffCacheRepository +import com.mogo.och.weaknet.repository.writeoff.impl.WriteOffNormallRepository import io.reactivex.Observable object RepositoryManager { private val TAG = "RepositoryManager" - private var repository: IRepository?=null + private var lineRepository: ILineRepository?=null get() { if(field==null){ when (ProjectUtils.getProjectType()) { @@ -59,45 +67,69 @@ object RepositoryManager { return field } + private var writeOffRepository: IWriteOffRepository?=null + get() { + if(field==null){ + when (ProjectUtils.getProjectType()) { + Project.SAAS -> { + if(AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)) { + field = WriteOffCacheRepository() + CallerLogger.d(TAG,"saas shuttle 核销缓存") + }else if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { + field = WriteOffCacheRepository() + CallerLogger.d(TAG,"saas bus 核销缓存") + } + } + Project.DALI -> { + if(AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)) { + field = WriteOffNormallRepository() + CallerLogger.d(TAG,"dali shuttle 不支持核销缓存") + }else if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { + field = WriteOffNormallRepository() + CallerLogger.d(TAG,"dali bus 不支持核销缓存") + } + } + else->{} + } + } + return field + } + fun release(){ closeDb() } fun loadCurrentTaskInfo():Observable?{ - return repository?.loadCurrentTaskInfo() + return lineRepository?.loadCurrentTaskInfo() } fun queryCanUseLine() : Observable?>? { - return repository?.queryCanUseLine() + return lineRepository?.queryCanUseLine() } fun queryCanUserTask(lineId: Long): Observable?>? { - return repository?.queryCanUserTask(lineId) + return lineRepository?.queryCanUserTask(lineId) } fun startTask(taskId:Long,lineId:Long,taskTime:Long,lineName:String): Observable? { - return repository?.startTask(taskId,lineId,taskTime,lineName) + return lineRepository?.startTask(taskId,lineId,taskTime,lineName) } fun leaveStation(seq: Int, siteId: Long, taskId: Long, lineId: Long, taskStartTime:Long ): Observable?{ - return repository?.leaveStation(seq,siteId,taskId,lineId,taskStartTime) + return lineRepository?.leaveStation(seq,siteId,taskId,lineId,taskStartTime) } fun arriveStation(seq: Int, siteId: Long, taskId: Long): Observable?{ - return repository?.arriveStation(seq,siteId,taskId) + return lineRepository?.arriveStation(seq,siteId,taskId) } fun endTask(taskId: Long): Observable?{ - return repository?.endTask(taskId) - } - - fun queryWriteoffCount(context: Context, taskId: Long, siteId: Long, callback: OchCommonServiceCallback?){ - repository?.queryWriteoffCount(context,taskId,siteId,callback) + return lineRepository?.endTask(taskId) } fun haveRunningTask():Boolean{ - return repository?.haveRunningTask()?:false + return lineRepository?.haveRunningTask()?:false } @@ -123,12 +155,18 @@ object RepositoryManager { } return false } + fun supportWriteOffDb():Boolean{ + if(supportWriteOff()){ + return ProjectUtils.isSaas() + } + return false + } fun queryCarExecutableTaskList( ochCommonServiceCallback: OchCommonServiceCallback ) { - if (repository is WeaknetRepository) { - repository?.queryCarExecutableTaskList(ochCommonServiceCallback) + if (lineRepository is WeaknetRepository) { + lineRepository?.queryCarExecutableTaskList(ochCommonServiceCallback) } } @@ -137,8 +175,34 @@ object RepositoryManager { data: ShuttleEventRequest?, callback: OchCommonServiceCallback? ){ - if (repository is WeaknetRepository) { - repository?.reportCabinEvent(context,data,callback) + if (lineRepository is WeaknetRepository) { + lineRepository?.reportCabinEvent(context,data,callback) + } + } + + fun queryWriteoffCount(context: Context, taskId: Long, siteId: Long): Observable? { + return writeOffRepository?.queryWriteoffCount(context,taskId,siteId) + } + + fun writeOff(writeOffDetialMsg: WriteOffDetialMsg): Observable? { + return writeOffRepository?.writeOffEvent(writeOffDetialMsg) + } + + fun queryWaitUploadData(): Observable>? { + return writeOffRepository?.queryWaitUploadData() + } + + + fun canCanEndTask(taskId: Long): Boolean { + return writeOffRepository?.canCanEndTask(taskId)?:true + } + + /** + * 安全员小程序核销成功的用户计数用 + */ + fun saveWriteOff4Socket(passenger: WriteOffPassenger) { + BizLoopManager.runInIoThread{ + writeOffRepository?.writeOffEvent4Socket(passenger) } } @@ -148,8 +212,10 @@ object RepositoryManager { CallerLogger.d(TAG,"关闭数据库") MyDataBase.instance = null CallerLogger.d(TAG,"重置数据库") - repository?.release() - repository = null + lineRepository?.release() + lineRepository = null + writeOffRepository?.release() + writeOffRepository = null CallerLogger.d(TAG,"重置 repository") } } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/MyDataBase.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/MyDataBase.kt index 3d6e448dc8..18f34dd05d 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/MyDataBase.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/MyDataBase.kt @@ -19,19 +19,21 @@ import com.mogo.och.weaknet.repository.db.bean.LineDataBean import com.mogo.och.weaknet.repository.db.bean.SiteDataBean import com.mogo.och.weaknet.repository.db.bean.TaskDataBean import com.mogo.och.weaknet.repository.db.bean.TaskSiteDataBean +import com.mogo.och.weaknet.repository.db.bean.WriteOffDataBean import com.mogo.och.weaknet.repository.db.dao.ContrailDataDao import com.mogo.och.weaknet.repository.db.dao.EventDataDao import com.mogo.och.weaknet.repository.db.dao.LineDataDao import com.mogo.och.weaknet.repository.db.dao.SiteDataDao import com.mogo.och.weaknet.repository.db.dao.TaskDataDao import com.mogo.och.weaknet.repository.db.dao.TaskSiteDataDao +import com.mogo.och.weaknet.repository.db.dao.WriteOffDataDao import java.io.File //注解Database告诉系统这是Room数据库对象 //entities指定该数据库有哪些表,多张表就逗号分隔 //version指定数据库版本号,升级时需要用到 //数据库继承自RoomDatabase -@Database(entities = [ContrailDataBean::class, LineDataBean::class, SiteDataBean::class, TaskDataBean::class, TaskSiteDataBean::class, EventDataBean::class], version = 4) +@Database(entities = [ContrailDataBean::class, LineDataBean::class, SiteDataBean::class, TaskDataBean::class, TaskSiteDataBean::class, EventDataBean::class, WriteOffDataBean::class], version = 5) abstract class MyDataBase : RoomDatabase() { override fun getOpenHelper(): SupportSQLiteOpenHelper { @@ -58,8 +60,33 @@ abstract class MyDataBase : RoomDatabase() { abstract val siteDataDao: SiteDataDao? abstract val taskDataDao: TaskDataDao? abstract val taskSiteDataDao: TaskSiteDataDao? + abstract val writeOffDataDao: WriteOffDataDao? companion object { + private val MIGRATION_1_2 = object : Migration(1, 2) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("ALTER TABLE ${EventDataBean.evnetDataTable} ADD COLUMN driver_id INTEGER"); + } + } + private val MIGRATION_2_3 = object : Migration(2, 3) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("ALTER TABLE ${SiteDataBean.siteDataTable} ADD COLUMN videoList TEXT"); + database.execSQL("ALTER TABLE ${TaskSiteDataBean.usedTaskDataTable} ADD COLUMN videoList TEXT"); + } + } + private val MIGRATION_3_4 = object : Migration(3, 4) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("ALTER TABLE ${EventDataBean.evnetDataTable} ADD COLUMN msg_id TEXT") + database.execSQL("ALTER TABLE ${EventDataBean.evnetDataTable} ADD COLUMN update_time INTEGER") + } + } + + private val MIGRATION_4_5 = object : Migration(4, 5) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("CREATE TABLE IF NOT EXISTS `${WriteOffDataBean.writeoffDataTable}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `msg_id` TEXT, `expiry_time` INTEGER, `booking_time` INTEGER, `type` INTEGER, `task_id` INTEGER, `line_id` INTEGER, `site_id` INTEGER, `driver_id` INTEGER, `remaining_times` INTEGER, `order_no` TEXT, `uid` TEXT, `seq` TEXT, `business_time` INTEGER, `tick_size` INTEGER, `tick_name` TEXT, `event_save_time` INTEGER NOT NULL, `update_status` INTEGER NOT NULL, `update_time` INTEGER)") + } + } + fun getDBName():MyDataBase{ val roomName = when (ProjectUtils.getProjectType()) { Project.SAAS -> { @@ -88,11 +115,10 @@ abstract class MyDataBase : RoomDatabase() { return Room.databaseBuilder( AbsMogoApplication.getApp()!!.applicationContext, MyDataBase::class.java, ROOT_PATH+roomName ) - .addMigrations(Migration1_2(1,2)) - .addMigrations(Migration2_3(2,3)) - .addMigrations(Migration3_4(3,4)) - .addMigrations(Migration2_4(2,4)) - .fallbackToDestructiveMigration() + .addMigrations(MIGRATION_1_2) + .addMigrations(MIGRATION_2_3) + .addMigrations(MIGRATION_3_4) + .addMigrations(MIGRATION_4_5) .build() } val ROOT_PATH = Environment.getExternalStorageDirectory().absolutePath + File.separator + "Mogo" + File.separator + "APP_cache" + File.separator //程序外部存储跟目录 @@ -105,32 +131,4 @@ abstract class MyDataBase : RoomDatabase() { return field } } - - class Migration1_2(val startVersion:Int,val endVersion:Int): Migration(startVersion,endVersion) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE ${EventDataBean.evnetDataTable} ADD COLUMN driver_id INTEGER"); - } - } - class Migration2_3(val startVersion:Int,val endVersion:Int): Migration(startVersion,endVersion) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE ${SiteDataBean.siteDataTable} ADD COLUMN videoList TEXT"); - database.execSQL("ALTER TABLE ${TaskSiteDataBean.usedTaskDataTable} ADD COLUMN videoList TEXT"); - } - } - - class Migration3_4(val startVersion:Int,val endVersion:Int): Migration(startVersion,endVersion) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE ${EventDataBean.evnetDataTable} ADD COLUMN msg_id TEXT") - database.execSQL("ALTER TABLE ${EventDataBean.evnetDataTable} ADD COLUMN update_time INTEGER") - } - } - - class Migration2_4(val startVersion:Int,val endVersion:Int): Migration(startVersion,endVersion) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE ${SiteDataBean.siteDataTable} ADD COLUMN videoList TEXT"); - database.execSQL("ALTER TABLE ${TaskSiteDataBean.usedTaskDataTable} ADD COLUMN videoList TEXT"); - database.execSQL("ALTER TABLE ${EventDataBean.evnetDataTable} ADD COLUMN msg_id TEXT") - database.execSQL("ALTER TABLE ${EventDataBean.evnetDataTable} ADD COLUMN update_time INTEGER") - } - } } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/WriteOffDataBean.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/WriteOffDataBean.kt new file mode 100644 index 0000000000..b556118b9f --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/WriteOffDataBean.kt @@ -0,0 +1,131 @@ +package com.mogo.och.weaknet.repository.db.bean + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey + +/** + * 上报给服务器端的 选择线路、滑动出发、进站 完成线路的对象 + */ +@Entity(tableName = WriteOffDataBean.writeoffDataTable) +data class WriteOffDataBean( + + @PrimaryKey(autoGenerate = true) var id: Int = 0, + + /** + * 二维码有效时间 时间戳 有效时间1分钟 + */ + @ColumnInfo(name = "msg_id", typeAffinity = ColumnInfo.TEXT) + var msgId: String? = null, + + /** + * 二维码有效时间 时间戳 有效时间1分钟 + */ + @ColumnInfo(name = "expiry_time", typeAffinity = ColumnInfo.INTEGER) + var expiryTime: Long? = null, + + /** + * 乘车日期 + */ + @ColumnInfo(name = "booking_time", typeAffinity = ColumnInfo.INTEGER) + var bookingTime: Long? = null, + + /** + * 校验接驳还是公交 shuttle bus + */ + @ColumnInfo(name = "type", typeAffinity = ColumnInfo.INTEGER) + var type: Int? = null, + + /** + * 当前的任务id + */ + @ColumnInfo(name = "task_id", typeAffinity = ColumnInfo.INTEGER) + var taskId: Long? = null, + + /** + * 校验线路Id + */ + @ColumnInfo(name = "line_id", typeAffinity = ColumnInfo.INTEGER) + var lineId: Long? = null, + + /** + * 校验站点Id + */ + @ColumnInfo(name = "site_id", typeAffinity = ColumnInfo.INTEGER) + var siteId: Long? = null, + + /** + * 司机id + */ + @ColumnInfo(name = "driver_id", typeAffinity = ColumnInfo.INTEGER) + var driverId: Long? = null, + + /** + * 剩余核销次数>0 + */ + @ColumnInfo(name = "available_times", typeAffinity = ColumnInfo.INTEGER) + var availableTimes: Int? = null, + + /** + * 订单号 + */ + @ColumnInfo(name = "order_no", typeAffinity = ColumnInfo.TEXT) + var orderNo: String? = null, + + /** + * uid + */ + @ColumnInfo(name = "uid", typeAffinity = ColumnInfo.TEXT) + var uid: String? = null, + + /** + * 用户手机号 + */ + @ColumnInfo(name = "seq", typeAffinity = ColumnInfo.TEXT) + var phone: String? = null, + + /** + * 业务发生的时间 + */ + @ColumnInfo(name = "business_time", typeAffinity = ColumnInfo.INTEGER) + var businessTime: Long? = null, + + /** + * 票里人数 + */ + @ColumnInfo(name = "tick_size", typeAffinity = ColumnInfo.INTEGER) + var ticketSize: Int? = null, + + /** + * 票的类型 + */ + @ColumnInfo(name = "tick_name", typeAffinity = ColumnInfo.TEXT) + var ticketName: String? = null, + + /** + * 存储此条数据时时间戳 + */ + @ColumnInfo(name = "event_save_time", typeAffinity = ColumnInfo.INTEGER, index = true) + val eventSaveTime: Long = System.currentTimeMillis(), + + @ColumnInfo(name = "update_status", typeAffinity = ColumnInfo.INTEGER) + var updateStatus:Int = notUpdate, + + @ColumnInfo(name = "update_time", typeAffinity = ColumnInfo.INTEGER) + var upDateTime:Long? = 0L, + + +) { + companion object { + const val writeoffDataTable: String = "writeoff_data_table" + // 没有上传 + const val notUpdate = 0 + // 上传中 + const val updating = 1 + // 已上传 + const val updated = 2 + + const val daliXiaoChengXu = "ehsafety" + const val saasXiaoChengXu = "mogogosafety" + } +} diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/TaskDataDao.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/TaskDataDao.kt index 752574ad4b..8ac85696f1 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/TaskDataDao.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/TaskDataDao.kt @@ -38,7 +38,7 @@ interface TaskDataDao { @Query("SELECT * FROM ${TaskDataBean.taskDataTable} WHERE task_get_time > :zeroTime and status = ${TaskDataBean.useing}") fun queryRunningTaskByStatus(zeroTime:Long = DateTimeUtil.getCurrentDateZero()): List? - @Query("SELECT * FROM ${TaskDataBean.taskDataTable} WHERE task_get_time > :zeroTime and status = ${TaskDataBean.unUse} and line_id = :lineId") + @Query("SELECT * FROM ${TaskDataBean.taskDataTable} WHERE task_get_time > :zeroTime and status = ${TaskDataBean.unUse} and line_id = :lineId order by task_start_time") fun queryUnuseTask(lineId: Long,zeroTime:Long = DateTimeUtil.getCurrentDateZero()): Observable?> @Query("DELETE FROM ${TaskDataBean.taskDataTable} WHERE task_get_time > :zeroTime and line_id = :lineId") diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/WriteOffDataDao.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/WriteOffDataDao.kt new file mode 100644 index 0000000000..4586f37cf0 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/WriteOffDataDao.kt @@ -0,0 +1,40 @@ +package com.mogo.och.weaknet.repository.db.dao + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.mogo.och.common.module.utils.DateTimeUtil +import com.mogo.och.weaknet.repository.db.bean.WriteOffDataBean + +@Dao +interface WriteOffDataDao { + + //插入数据 + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(vararg eventDataBean: WriteOffDataBean) + + //删除数据 + @Delete + fun delete(vararg eventDataBean: WriteOffDataBean) + + // 删除过时数据 + @Query("DELETE FROM ${WriteOffDataBean.writeoffDataTable} WHERE event_save_time < :zeroTime") + fun deleteObsoleteData(zeroTime: Long = DateTimeUtil.getCurrentDateZero()):Int + + + @Query("SELECT * FROM ${WriteOffDataBean.writeoffDataTable} WHERE event_save_time > :zeroTime and order_no = :orderNo order by event_save_time") + fun queryWriteOffByOrderNo(zeroTime: Long = DateTimeUtil.getCurrentDateZero(),orderNo:String): List? + + @Query("SELECT * FROM ${WriteOffDataBean.writeoffDataTable} WHERE event_save_time > :zeroTime and task_id = :taskId and update_status = ${WriteOffDataBean.notUpdate}") + fun queryWaitWriteOffByTaskId(taskId:Long,zeroTime: Long = DateTimeUtil.getCurrentDateZero()): List? + + @Query("SELECT * FROM ${WriteOffDataBean.writeoffDataTable} WHERE update_status = ${WriteOffDataBean.notUpdate} LIMIT 10 OFFSET 0") + fun queryWriteOffEventByStatusWithPage():List? + + @Query("SELECT * FROM ${WriteOffDataBean.writeoffDataTable} WHERE event_save_time > :zeroTime and task_id = :taskId and site_id = :siteId") + fun queryWriteOffByTaskAndSiteId(taskId: Long, siteId: Long,zeroTime: Long = DateTimeUtil.getCurrentDateZero()):List? + + +} diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/EventDb.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/EventDb.kt index c375fe910a..348ddb8521 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/EventDb.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/EventDb.kt @@ -5,6 +5,7 @@ import com.mogo.och.common.module.manager.cache.OchSPManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.utils.DateTimeUtil +import com.mogo.och.weaknet.model.EventModel import com.mogo.och.weaknet.repository.db.IDbRepository import com.mogo.och.weaknet.repository.db.MyDataBase import com.mogo.och.weaknet.repository.db.bean.EventDataBean @@ -23,7 +24,6 @@ object EventDb: IDbRepository { return field } - var eventCallback: EventCallback? = null override fun release(){ eventDataDao = null @@ -44,7 +44,7 @@ object EventDb: IDbRepository { event.msgId = "${OchSPManager.getSn()}_${DateTimeUtil.getCurrentTimeStamp()}" BizLoopManager.runInIoThread { eventDataDao?.insert(event) - eventCallback?.notifySyn() + EventModel.notifySyn() } } @@ -70,7 +70,7 @@ object EventDb: IDbRepository { event.msgId = "${OchSPManager.getSn()}_${DateTimeUtil.getCurrentTimeStamp()}" BizLoopManager.runInIoThread { eventDataDao?.insert(event) - eventCallback?.notifySyn() + EventModel.notifySyn() } } @@ -96,7 +96,7 @@ object EventDb: IDbRepository { event.msgId = "${OchSPManager.getSn()}_${DateTimeUtil.getCurrentTimeStamp()}" BizLoopManager.runInIoThread { eventDataDao?.insert(event) - eventCallback?.notifySyn() + EventModel.notifySyn() } } @@ -115,7 +115,7 @@ object EventDb: IDbRepository { event.msgId = "${OchSPManager.getSn()}_${DateTimeUtil.getCurrentTimeStamp()}" BizLoopManager.runInIoThread { eventDataDao?.insert(event) - eventCallback?.notifySyn() + EventModel.notifySyn() } } @@ -149,9 +149,4 @@ object EventDb: IDbRepository { return eventDataDao?.queryWaitUploadInfo() } - interface EventCallback { - fun notifySyn() - } - - } \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/TaskDb.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/TaskDb.kt index c56453a56f..3901125282 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/TaskDb.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/TaskDb.kt @@ -117,7 +117,7 @@ object TaskDb : IDbRepository { OchChainLogManager.writeChainLogDb("开始任务", "异常情况${lineId}_${lineName}_task:${taskId} 为未使用的状态 原因:${e.message}") } } - return@flatMap Observable.error(DataException(DataException.startTaskErrorCode,e.message)) + return@flatMap Observable.error(DataException(DataException.startTaskErrorCode,e.message?:"")) } updateCount?.let { if(it<=0){ diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/WriteOffDb.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/WriteOffDb.kt new file mode 100644 index 0000000000..988be54510 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/WriteOffDb.kt @@ -0,0 +1,65 @@ +package com.mogo.och.weaknet.repository.db.repository + +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.weaknet.model.EventModel +import com.mogo.och.weaknet.repository.db.IDbRepository +import com.mogo.och.weaknet.repository.db.MyDataBase +import com.mogo.och.weaknet.repository.db.bean.WriteOffDataBean +import com.mogo.och.weaknet.repository.db.dao.WriteOffDataDao + + +object WriteOffDb: IDbRepository { + + private var writeOffDataDao: WriteOffDataDao? = null + get() { + if(field==null){ + field = MyDataBase.instance?.writeOffDataDao + register() + } + return field + } + + override fun release(){ + writeOffDataDao = null + } + + fun addOrUpdate(vararg lineDataBean: WriteOffDataBean){ + writeOffDataDao?.insert(*lineDataBean) + EventModel.notifySyn() + } + + + fun queryWaitUpdateEventCount(orderNo:String): List? { + val queryWriteOffByOrderNo = writeOffDataDao?.queryWriteOffByOrderNo(orderNo = orderNo) + return queryWriteOffByOrderNo + } + + fun queryWaitUpdateEvent(): List? { + return writeOffDataDao?.queryWriteOffEventByStatusWithPage() + } + + fun saveUpdateSuccess(writeOffEvents: List) { + writeOffDataDao?.insert(*writeOffEvents.toTypedArray()) + } + + fun queryWaitUpdateEventByTaskId(taskId: Long): List? { + return writeOffDataDao?.queryWaitWriteOffByTaskId(taskId) + } + + fun queryWaitUpdateEventCountByTaskId(taskId: Long):Int { + val queryWriteOffByOrderNo = writeOffDataDao?.queryWaitWriteOffByTaskId(taskId) + return queryWriteOffByOrderNo?.size?:0 + } + + fun queryWriteOffByTaskAndSiteId(taskId: Long, siteId: Long): List? { + return writeOffDataDao?.queryWriteOffByTaskAndSiteId(taskId,siteId) + } + + fun deleteObsoleteData() { + writeOffDataDao?.deleteObsoleteData()?.let { + OchChainLogManager.writeChainLogDb("删除临时数据", "WriteOff删除数量:${it}") + } + } + + +} \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/exception/DataException.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/exception/DataException.kt index 64b423bc46..91d5e1333a 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/exception/DataException.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/exception/DataException.kt @@ -1,8 +1,14 @@ package com.mogo.och.weaknet.repository.exception class DataException: RuntimeException { + var code:Int = 0 + var msg:String = "" constructor() : super() - constructor(code:Int,message: String?) : super("${code}_${message}") + constructor(code:Int, message: String) : super("${code}_${message}"){ + this.code = code + this.msg = message + } + companion object{ val startTaskErrorCode = 10010 } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/IRepository.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/ILineRepository.kt similarity index 82% rename from OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/IRepository.kt rename to OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/ILineRepository.kt index 575f7f61df..f381bc7ba9 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/IRepository.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/ILineRepository.kt @@ -1,16 +1,15 @@ -package com.mogo.och.weaknet.repository +package com.mogo.och.weaknet.repository.line import android.content.Context import com.mogo.eagle.core.data.BaseData import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.weaknet.bean.request.ShuttleEventRequest import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse -import com.mogo.och.weaknet.bean.response.WriteOffCountResponse import com.mogo.och.weaknet.repository.db.bean.LineDataBean import com.mogo.och.weaknet.repository.db.bean.TaskDataBean import io.reactivex.Observable -interface IRepository { +interface ILineRepository { fun loadCurrentTaskInfo():Observable? @@ -26,8 +25,6 @@ interface IRepository { fun endTask( taskId: Long): Observable? - fun queryWriteoffCount(context: Context, taskId: Long, siteId: Long, callback: OchCommonServiceCallback?) - fun queryCarExecutableTaskList(ochCommonServiceCallback: OchCommonServiceCallback) fun reportCabinEvent(context: Context?, data: ShuttleEventRequest?, callback: OchCommonServiceCallback?) diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/impl/NormalRepository.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/NormalRepository.kt similarity index 77% rename from OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/impl/NormalRepository.kt rename to OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/NormalRepository.kt index b0bc27cf12..79a4836648 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/impl/NormalRepository.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/NormalRepository.kt @@ -1,4 +1,4 @@ -package com.mogo.och.weaknet.repository.impl +package com.mogo.och.weaknet.repository.line.impl import android.content.Context import com.mogo.commons.env.Project @@ -15,25 +15,23 @@ import com.mogo.och.data.bean.ContraiInfo import com.mogo.och.data.bean.LineInfo import com.mogo.och.weaknet.bean.request.ShuttleEventRequest import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse -import com.mogo.och.weaknet.bean.response.WriteOffCountResponse import com.mogo.och.weaknet.model.LineModel import com.mogo.och.weaknet.repository.db.bean.LineDataBean import com.mogo.och.weaknet.repository.db.bean.TaskDataBean -import com.mogo.och.weaknet.repository.IRepository +import com.mogo.och.weaknet.repository.line.ILineRepository import com.mogo.och.weaknet.repository.db.bean.TaskSiteDataBean +import com.mogo.och.weaknet.repository.net.NetInterface import com.mogo.och.weaknet.repository.net.exception.NetException -import com.mogo.och.weaknet.repository.net.normal.NormalNetInterface -import com.mogo.och.weaknet.repository.net.normal.dali.bus.DaliBusServiceManager -import com.mogo.och.weaknet.repository.net.normal.mogo.bus.MogoBusServiceManager -import com.mogo.och.weaknet.repository.net.normal.mogo.shuttle.MogoShuttleServiceManager -import com.mogo.och.weaknet.repository.net.weaknet.saas.bus.SaasBusServiceManager +import com.mogo.och.weaknet.repository.net.project.dali.bus.DaliBusServiceManager +import com.mogo.och.weaknet.repository.net.project.mogo.bus.MogoBusServiceManager +import com.mogo.och.weaknet.repository.net.project.mogo.shuttle.MogoShuttleServiceManager import io.reactivex.Observable -class NormalRepository: IRepository { +class NormalRepository: ILineRepository { - private val TAG = "NormalRepository" + private val tag = "NormalRepository" - private var normalNetInterface: NormalNetInterface?=null + private var normalLineInterface: NetInterface?=null get() { if(field==null){ when (ProjectUtils.getProjectType()) { @@ -48,7 +46,7 @@ class NormalRepository: IRepository { if(AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)) { throw NetException("非缓存weakNetInterface 初始化环境错误 isBus") }else if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { - field = DaliBusServiceManager() + field = DaliBusServiceManager } } Project.MOGO -> { @@ -67,7 +65,7 @@ class NormalRepository: IRepository { } override fun loadCurrentTaskInfo(): Observable? { - return normalNetInterface?.queryBusRoutes() + return normalLineInterface?.queryBusRoutes() ?.flatMap { busRoutesResult -> if (!busRoutesResult.sites.isNullOrEmpty() && busRoutesResult.sites.size > 1) { OchChainLogManager.writeChainLogDb( @@ -75,23 +73,23 @@ class NormalRepository: IRepository { "本地没有正在运行的数据,服务器端有${busRoutesResult}" ) val result = mutableListOf() - var temp: BusStationBean? = null + var temp: BusStationBean? var currentStationIndex = -1 var lineInfo: LineInfo?=null busRoutesResult.sites.forEachIndexed { index, taskAndsite -> temp = BusStationBean() - temp?.drivingStatus = (taskAndsite.drivingStatus ?: 0) - temp?.lat = (taskAndsite.lat ?: 0.0) - temp?.lon = (taskAndsite.lon ?: 0.0) - temp?.gcjLat = (taskAndsite.gcjLat ?: 0.0) - temp?.gcjLon = (taskAndsite.gcjLon ?: 0.0) + temp?.drivingStatus = taskAndsite.drivingStatus + temp?.lat = taskAndsite.lat + temp?.lon = taskAndsite.lon + temp?.gcjLat = taskAndsite.gcjLat + temp?.gcjLon = taskAndsite.gcjLon temp?.introduction = taskAndsite.introduction temp?.isLeaving = taskAndsite.isLeaving temp?.name = taskAndsite.name temp?.nameKr = taskAndsite.nameKr temp?.isPlayTts = java.lang.Boolean.TRUE == taskAndsite.isPlayTts - temp?.seq = (taskAndsite.seq ?: 0) - temp?.siteId = if (taskAndsite.siteId == null) 0 else taskAndsite.siteId!!.toInt() + temp?.seq = taskAndsite.seq + temp?.siteId = taskAndsite.siteId result.add(temp!!) // 正在进行中的任务 if (temp!!.drivingStatus == TaskSiteDataBean.drivingStatusCurrent) { @@ -126,6 +124,7 @@ class NormalRepository: IRepository { if (LineModel.startStationIndex < stationlist.size-1) { val endStation = stationlist[LineModel.startStationIndex + 1] LineManager.setStartAndEndStation(startStation,endStation) + LineModel.callEyeMap(false) } } return@flatMap Observable.just(true) @@ -135,11 +134,11 @@ class NormalRepository: IRepository { } override fun queryCanUseLine(): Observable?>? { - return normalNetInterface?.queryBusLines() + return normalLineInterface?.queryBusLines() } override fun queryCanUserTask(lineId: Long): Observable?>? { - return normalNetInterface?.queryBusTaskByLineId(lineId) + return normalLineInterface?.queryBusTaskByLineId(lineId) } override fun startTask( @@ -148,7 +147,7 @@ class NormalRepository: IRepository { taskTime: Long, lineName: String ): Observable? { - return normalNetInterface?.switchLine(taskId) + return normalLineInterface?.switchLine(taskId) } override fun leaveStation( @@ -158,11 +157,11 @@ class NormalRepository: IRepository { lineId: Long, taskStartTime: Long ): Observable? { - return normalNetInterface?.leaveStation(seq, siteId, taskId, System.currentTimeMillis()) + return normalLineInterface?.leaveStation(seq, siteId, taskId, System.currentTimeMillis()) } override fun arriveStation(seq: Int, siteId: Long, taskId: Long): Observable? { - return normalNetInterface?.arriveSiteStation( + return normalLineInterface?.arriveSiteStation( seq, siteId, taskId, @@ -171,16 +170,7 @@ class NormalRepository: IRepository { } override fun endTask(taskId: Long): Observable? { - return normalNetInterface?.endTask(taskId) - } - - override fun queryWriteoffCount( - context: Context, - taskId: Long, - siteId: Long, - callback: OchCommonServiceCallback? - ) { - + return normalLineInterface?.endTask(taskId) } override fun queryCarExecutableTaskList(ochCommonServiceCallback: OchCommonServiceCallback) { @@ -196,8 +186,8 @@ class NormalRepository: IRepository { } override fun release() { - normalNetInterface=null - CallerLogger.d(TAG,"重置 normalNetInterface") + normalLineInterface=null + CallerLogger.d(tag,"重置 normalNetInterface") } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/impl/WeaknetRepository.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/WeaknetRepository.kt similarity index 95% rename from OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/impl/WeaknetRepository.kt rename to OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/WeaknetRepository.kt index 9d8daaabdb..71c7fc1141 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/impl/WeaknetRepository.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/WeaknetRepository.kt @@ -1,4 +1,4 @@ -package com.mogo.och.weaknet.repository.impl +package com.mogo.och.weaknet.repository.line.impl import android.content.Context import com.mogo.commons.AbsMogoApplication @@ -14,7 +14,6 @@ import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.weaknet.bean.request.ShuttleEventRequest import com.mogo.och.weaknet.bean.response.BusRoutesResponse import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse -import com.mogo.och.weaknet.bean.response.WriteOffCountResponse import com.mogo.och.weaknet.model.LineModel import com.mogo.och.weaknet.model.LineModel.currentTask import com.mogo.och.weaknet.repository.db.bean.ContrailDataBean @@ -26,19 +25,19 @@ import com.mogo.och.weaknet.repository.db.repository.EventDb import com.mogo.och.weaknet.repository.db.repository.LineDb import com.mogo.och.weaknet.repository.db.repository.TaskDb import com.mogo.och.weaknet.repository.db.repository.TaskSiteDb -import com.mogo.och.weaknet.repository.IRepository +import com.mogo.och.weaknet.repository.line.ILineRepository import com.mogo.och.weaknet.repository.net.exception.NetException -import com.mogo.och.weaknet.repository.net.weaknet.WeakNetInterface -import com.mogo.och.weaknet.repository.net.weaknet.dali.shuttle.DaliShuttleServiceManager -import com.mogo.och.weaknet.repository.net.weaknet.saas.bus.SaasBusServiceManager -import com.mogo.och.weaknet.repository.net.weaknet.saas.shuttle.SaasShuttleServiceManager +import com.mogo.och.weaknet.repository.net.NetInterface +import com.mogo.och.weaknet.repository.net.project.dali.shuttle.DaliShuttleServiceManager +import com.mogo.och.weaknet.repository.net.project.saas.bus.SaasBusServiceManager +import com.mogo.och.weaknet.repository.net.project.saas.shuttle.SaasShuttleServiceManager import io.reactivex.Observable -class WeaknetRepository : IRepository { +class WeaknetRepository : ILineRepository { private val TAG = "ShuttleSaasRepository" private val context = AbsMogoApplication.getApp() - private var weakNetInterface: WeakNetInterface?=null + private var weakNetInterface: NetInterface?=null get() { if(field==null){ when (ProjectUtils.getProjectType()) { @@ -101,6 +100,7 @@ class WeaknetRepository : IRepository { if (LineModel.startStationIndex < stationlist.size-1) { val endStation = stationlist[LineModel.startStationIndex + 1] LineManager.setStartAndEndStation(startStation,endStation) + LineModel.callEyeMap(false) } } @@ -314,15 +314,6 @@ class WeaknetRepository : IRepository { } } - override fun queryWriteoffCount( - context: Context, - taskId: Long, - siteId: Long, - callback: OchCommonServiceCallback? - ) { - weakNetInterface?.writeOffCount(context,taskId,siteId,callback) - } - override fun queryCarExecutableTaskList( ochCommonServiceCallback: OchCommonServiceCallback ) { diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/NetInterface.java b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/NetInterface.java new file mode 100644 index 0000000000..3d8ce68708 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/NetInterface.java @@ -0,0 +1,63 @@ +package com.mogo.och.weaknet.repository.net; + +import android.content.Context; + +import com.mogo.och.common.module.network.OchCommonServiceCallback; +import com.mogo.och.data.bean.BusRoutesResult; +import com.mogo.och.weaknet.bean.request.ShuttleEventRequest; +import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse; +import com.mogo.eagle.core.data.BaseData; +import com.mogo.och.weaknet.repository.db.bean.LineDataBean; +import com.mogo.och.weaknet.repository.db.bean.TaskDataBean; +import com.mogo.och.weaknet.repository.net.bean.request.PassengerWriteOffRequest; +import com.mogo.och.weaknet.repository.net.bean.response.PassengerWriteOffResponse; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.Observable; + +public interface NetInterface { + + default Observable switchLine(long taskId){ + return null; + } + + default Observable endTask(long taskId){ + return Observable.just(true); + } + + default Observable leaveStation(int seq, long siteId, long taskId, long writeVersion){ + return Observable.just(true); + } + + default Observable arriveSiteStation(int seq, long siteId, long taskId, long writeVersion){ + return Observable.just(true); + } + + default Observable> queryBusLines(){ + return Observable.just(new ArrayList<>()); + } + + default Observable> queryBusTaskByLineId(long lineId){ + return Observable.just(new ArrayList<>()); + } + + + default Observable queryBusRoutes(){ + return Observable.just(new BusRoutesResult()); + } + + default Observable writeOffCount(Context context , Long taskId, Long siteId){ + return Observable.just(0); + } + + default Observable writeOffTicket(Context context, + PassengerWriteOffRequest ticketInfo){ + return Observable.just(new PassengerWriteOffResponse.Result("",0,"",0L,0L)); + } + + default void queryCarExecutableTaskList(Context context , OchCommonServiceCallback callback){} + + default void reportCabinEvent(Context context , ShuttleEventRequest data , OchCommonServiceCallback callback){} +} diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/bean/request/PassengerWriteOffRequest.java b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/bean/request/PassengerWriteOffRequest.java new file mode 100644 index 0000000000..834549053a --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/bean/request/PassengerWriteOffRequest.java @@ -0,0 +1,50 @@ +package com.mogo.och.weaknet.repository.net.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; + } +} diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/bean/response/PassengerWriteOffResponse.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/bean/response/PassengerWriteOffResponse.kt new file mode 100644 index 0000000000..587759dc32 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/bean/response/PassengerWriteOffResponse.kt @@ -0,0 +1,14 @@ +package com.mogo.och.weaknet.repository.net.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?,//剩余次数, + val businessTime:Long?,//业务时间 + ) +} diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/NormalNetInterface.java b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/NormalNetInterface.java deleted file mode 100644 index f842e53094..0000000000 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/NormalNetInterface.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.mogo.och.weaknet.repository.net.normal; - -import android.content.Context; - -import com.mogo.och.common.module.network.OchCommonServiceCallback; -import com.mogo.och.data.bean.BusRoutesResult; -import com.mogo.och.weaknet.bean.response.WriteOffCountResponse; -import com.mogo.och.weaknet.repository.db.bean.LineDataBean; -import com.mogo.och.weaknet.repository.db.bean.TaskDataBean; - -import java.util.List; - -import io.reactivex.Observable; - -public interface NormalNetInterface { - - Observable queryBusRoutes(); - - Observable switchLine(long taskId); - - Observable endTask(long taskId); - - Observable leaveStation(int seq, long siteId, long taskId, long writeVersion); - - Observable arriveSiteStation(int seq, long siteId, long taskId, long writeVersion); - - Observable> queryBusLines(); - - Observable> queryBusTaskByLineId(long lineId); - -} diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/dali/bus/DaliBusServiceManager.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/dali/bus/DaliBusServiceManager.kt similarity index 90% rename from OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/dali/bus/DaliBusServiceManager.kt rename to OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/dali/bus/DaliBusServiceManager.kt index c05b0445dd..832e005094 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/dali/bus/DaliBusServiceManager.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/dali/bus/DaliBusServiceManager.kt @@ -1,31 +1,26 @@ -package com.mogo.och.weaknet.repository.net.normal.dali.bus +package com.mogo.och.weaknet.repository.net.project.dali.bus -import android.content.Context import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.network.OchCommonNet -import com.mogo.och.common.module.network.OchCommonServiceCallback -import com.mogo.och.common.module.network.OchCommonSubscribeImpl -import com.mogo.och.common.module.network.interceptor.transformIoTry import com.mogo.och.common.module.network.interceptor.transformTry import com.mogo.och.data.bean.BusRoutesResult import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest -import com.mogo.och.weaknet.bean.response.WriteOffCountResponse import com.mogo.och.weaknet.repository.db.bean.LineDataBean import com.mogo.och.weaknet.repository.db.bean.TaskDataBean +import com.mogo.och.weaknet.repository.net.NetInterface import com.mogo.och.weaknet.repository.net.bean.request.BusCloseTaskRequest import com.mogo.och.weaknet.repository.net.bean.request.BusResetDrivingLineRequest import com.mogo.och.weaknet.repository.net.bean.request.BusUpdateSiteStatusRequest -import com.mogo.och.weaknet.repository.net.normal.NormalNetInterface import io.reactivex.Observable /** * @author: wangmingjun * @date: 2021/10/20 */ -class DaliBusServiceManager: NormalNetInterface { +object DaliBusServiceManager: NetInterface { private val mService: IDaliBusApiService = MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create( diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/dali/bus/IDaliBusApiService.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/dali/bus/IDaliBusApiService.kt similarity index 91% rename from OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/dali/bus/IDaliBusApiService.kt rename to OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/dali/bus/IDaliBusApiService.kt index 3e8c7db13d..c12dddc1b2 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/dali/bus/IDaliBusApiService.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/dali/bus/IDaliBusApiService.kt @@ -1,4 +1,4 @@ -package com.mogo.och.weaknet.repository.net.normal.dali.bus +package com.mogo.och.weaknet.repository.net.project.dali.bus import com.mogo.eagle.core.data.BaseData import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest @@ -9,8 +9,10 @@ import com.mogo.och.weaknet.repository.net.bean.request.BusResetDrivingLineReque import com.mogo.och.weaknet.repository.net.bean.request.BusRoutePlanningUpdateReqBean import com.mogo.och.weaknet.repository.net.bean.request.BusUpdateSiteStatusRequest import com.mogo.och.weaknet.repository.net.bean.request.CarHeartbeatReqBean +import com.mogo.och.weaknet.repository.net.bean.request.PassengerWriteOffRequest import com.mogo.och.weaknet.repository.net.bean.response.BusQueryLineTaskResponse import com.mogo.och.weaknet.repository.net.bean.response.BusQueryLinesResponse +import com.mogo.och.weaknet.repository.net.bean.response.PassengerWriteOffResponse import io.reactivex.Observable import retrofit2.http.Body import retrofit2.http.GET @@ -66,19 +68,6 @@ interface IDaliBusApiService { fun arriveSiteStation(@Header("appId") appId: String?, @Header("ticket") ticket: String?, @Body request: BusUpdateSiteStatusRequest?): Observable - /** - * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度 - * @param data - * @return - */ - @Headers("Content-type:application/json;charset=UTF-8") - @POST("/autopilot-car-hailing/location/v2/driver/bus/heartbeat") - fun runCarHeartbeat( - @Header("appId") appId: String?, - @Header("ticket") ticket: String?, - @Body data: CarHeartbeatReqBean? - ): Observable - /** * 查询车辆配置的所有路线 * @param appId @@ -152,5 +141,12 @@ interface IDaliBusApiService { @POST("/och-bus-cabin/cab/flow/v1/bus/driver/endTask") fun writeOffCount(@Header("appId") appId: String?, @Header("ticket") ticket: String?, @Query("taskId") taskId: Long , @Query("siteId")siteId: Long ): Observable + /** + * 核销接口 + */ + @Headers("Content-type:application/json;charset=UTF-8") + @POST("/och-vehicle/api/scanner/device/writeOff") + fun daliwriteOffTicket(@Header ("appId") appId:String, @Header("ticket") ticket:String, @Body request: PassengerWriteOffRequest):Observable + } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/dali/shuttle/DaliShuttleServiceManager.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/dali/shuttle/DaliShuttleServiceManager.kt similarity index 64% rename from OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/dali/shuttle/DaliShuttleServiceManager.kt rename to OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/dali/shuttle/DaliShuttleServiceManager.kt index e3a3491541..bbb7d5e50a 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/dali/shuttle/DaliShuttleServiceManager.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/dali/shuttle/DaliShuttleServiceManager.kt @@ -1,4 +1,4 @@ -package com.mogo.och.weaknet.repository.net.weaknet.dali.shuttle +package com.mogo.och.weaknet.repository.net.project.dali.shuttle import android.content.Context import com.mogo.cloud.passport.MoGoAiCloudClientConfig @@ -6,6 +6,7 @@ import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.common.module.manager.cache.OchSPManager import com.mogo.och.common.module.network.OchCommonNet import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.network.OchCommonSubscribeImpl @@ -14,56 +15,53 @@ import com.mogo.och.data.bean.BusRoutesResult import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest import com.mogo.och.weaknet.bean.request.ShuttleEventRequest import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse -import com.mogo.och.weaknet.bean.response.WriteOffCountResponse -import com.mogo.och.weaknet.repository.net.weaknet.WeakNetInterface +import com.mogo.och.weaknet.repository.net.NetInterface +import com.mogo.och.weaknet.repository.net.bean.request.PassengerWriteOffRequest +import com.mogo.och.weaknet.repository.net.bean.response.PassengerWriteOffResponse import io.reactivex.Observable /** * @author: wangmingjun * @date: 2021/10/20 */ -object DaliShuttleServiceManager: WeakNetInterface { +object DaliShuttleServiceManager : NetInterface { - private val mService: IDaliShuttleApiService = MoGoRetrofitFactory.getInstance(OchCommonConst.getShuttleUrl()).create( - IDaliShuttleApiService::class.java - ) + private val mService: IDaliShuttleApiService = + MoGoRetrofitFactory.getInstance(OchCommonConst.getShuttleUrl()).create( + IDaliShuttleApiService::class.java + ) /** * 查询小巴车当前任务 - * @param context - * @param callback */ override fun queryBusRoutes(): Observable? { //获取当前高德坐标 - return mService.queryBusRoutes( + return mService.queryBusRoutes( MoGoAiCloudClientConfig.getInstance().serviceAppId, SharedPrefsMgr.getInstance().token, BusQueryLineStationsRequest() - ) .transformIoTry() - .flatMap(OchCommonNet("saas shuttle queryBusRoutes",false)) + ).transformIoTry() + .flatMap(OchCommonNet("saas shuttle queryBusRoutes", false)) .flatMap { - Observable.just(it.data?:BusRoutesResult()) + Observable.just(it.data ?: BusRoutesResult()) } } /** * 只发生在大理和saas环境 查询当前站点核销的人数 */ - override fun writeOffCount( - context: Context, - taskId: Long?, - siteId: Long?, - callback: OchCommonServiceCallback? - ) { - mService.writeOffCount( + override fun writeOffCount(context: Context?, taskId: Long?, siteId: Long?): Observable { + return mService.writeOffCount( MoGoAiCloudClientConfig.getInstance().serviceAppId, SharedPrefsMgr.getInstance().token, taskId?.toString(), siteId?.toString() ) - .transformIoTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "writeOffCount")) + .flatMap(OchCommonNet("saas shuttle writeOffCount", false)) + .flatMap { + Observable.just(it.data ?: 0) + } } /** @@ -98,5 +96,22 @@ object DaliShuttleServiceManager: WeakNetInterface { .subscribe(OchCommonSubscribeImpl(context, callback, "reportCabinEvent")) } + override fun writeOffTicket( + context: Context, + ticketInfo: PassengerWriteOffRequest, + ): Observable? { + ticketInfo.sn = OchSPManager.getSn() + return mService.daliwriteOffTicket( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + SharedPrefsMgr.getInstance().token, + ticketInfo + ) + .transformIoTry() + .flatMap(OchCommonNet("dali shuttle writeOffCount",false)) + .flatMap { + Observable.just(it.data) + } + } + } \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/dali/shuttle/IDaliShuttleApiService.java b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/dali/shuttle/IDaliShuttleApiService.java similarity index 80% rename from OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/dali/shuttle/IDaliShuttleApiService.java rename to OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/dali/shuttle/IDaliShuttleApiService.java index 6fa1916321..46ed25619f 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/dali/shuttle/IDaliShuttleApiService.java +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/dali/shuttle/IDaliShuttleApiService.java @@ -1,4 +1,4 @@ -package com.mogo.och.weaknet.repository.net.weaknet.dali.shuttle; +package com.mogo.och.weaknet.repository.net.project.dali.shuttle; import com.mogo.eagle.core.data.BaseData; import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest; @@ -6,6 +6,8 @@ import com.mogo.och.weaknet.bean.request.ShuttleEventRequest; import com.mogo.och.weaknet.bean.response.BusRoutesResponse; import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse; import com.mogo.och.weaknet.bean.response.WriteOffCountResponse; +import com.mogo.och.weaknet.repository.net.bean.request.PassengerWriteOffRequest; +import com.mogo.och.weaknet.repository.net.bean.response.PassengerWriteOffResponse; import io.reactivex.Observable; import retrofit2.http.Body; @@ -41,6 +43,13 @@ public interface IDaliShuttleApiService { @GET("och-shuttle-cabin/api/business/v1/task/writeOffCount") Observable writeOffCount(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("taskId") String taskId, @Query("siteId") String siteId); + /** + * 实时核销 核销接口 + */ + @Headers({"Content-type:application/json;charset=UTF-8"}) + @POST("/och-vehicle/api/scanner/device/writeOff") + Observable daliwriteOffTicket(@Header ("appId") String appId, @Header("ticket") String ticket, @Body PassengerWriteOffRequest request); + /** * 同步 线路、站点、任务、自驾轨迹信息 */ diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/mogo/bus/IMogoBusApiService.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/mogo/bus/IMogoBusApiService.kt similarity index 98% rename from OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/mogo/bus/IMogoBusApiService.kt rename to OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/mogo/bus/IMogoBusApiService.kt index 97d33cd951..159f6d192f 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/mogo/bus/IMogoBusApiService.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/mogo/bus/IMogoBusApiService.kt @@ -1,4 +1,4 @@ -package com.mogo.och.weaknet.repository.net.normal.mogo.bus +package com.mogo.och.weaknet.repository.net.project.mogo.bus import com.mogo.eagle.core.data.BaseData import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/mogo/bus/MogoBusServiceManager.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/mogo/bus/MogoBusServiceManager.kt similarity index 93% rename from OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/mogo/bus/MogoBusServiceManager.kt rename to OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/mogo/bus/MogoBusServiceManager.kt index 13d5a6bf49..e8532328c8 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/mogo/bus/MogoBusServiceManager.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/mogo/bus/MogoBusServiceManager.kt @@ -1,29 +1,26 @@ -package com.mogo.och.weaknet.repository.net.normal.mogo.bus +package com.mogo.och.weaknet.repository.net.project.mogo.bus -import android.content.Context import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.network.OchCommonNet -import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.network.interceptor.transformTry import com.mogo.och.data.bean.BusRoutesResult import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest -import com.mogo.och.weaknet.bean.response.WriteOffCountResponse import com.mogo.och.weaknet.repository.db.bean.LineDataBean import com.mogo.och.weaknet.repository.db.bean.TaskDataBean +import com.mogo.och.weaknet.repository.net.NetInterface import com.mogo.och.weaknet.repository.net.bean.request.BusCloseTaskRequest import com.mogo.och.weaknet.repository.net.bean.request.BusResetDrivingLineRequest import com.mogo.och.weaknet.repository.net.bean.request.BusUpdateSiteStatusRequest -import com.mogo.och.weaknet.repository.net.normal.NormalNetInterface import io.reactivex.Observable /** * @author: wangmingjun * @date: 2021/10/20 */ -class MogoBusServiceManager: NormalNetInterface { +class MogoBusServiceManager: NetInterface { private val mService: IMogoBusApiService = MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create( diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/mogo/shuttle/IMogoShuttleApiService.java b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/mogo/shuttle/IMogoShuttleApiService.java similarity index 98% rename from OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/mogo/shuttle/IMogoShuttleApiService.java rename to OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/mogo/shuttle/IMogoShuttleApiService.java index 7b0c036ae9..6045b299cf 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/mogo/shuttle/IMogoShuttleApiService.java +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/mogo/shuttle/IMogoShuttleApiService.java @@ -1,4 +1,4 @@ -package com.mogo.och.weaknet.repository.net.normal.mogo.shuttle; +package com.mogo.och.weaknet.repository.net.project.mogo.shuttle; import com.mogo.eagle.core.data.BaseData; import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest; diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/mogo/shuttle/MogoShuttleServiceManager.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/mogo/shuttle/MogoShuttleServiceManager.kt similarity index 93% rename from OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/mogo/shuttle/MogoShuttleServiceManager.kt rename to OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/mogo/shuttle/MogoShuttleServiceManager.kt index 7b0cad8c1d..ce31bed2b5 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/normal/mogo/shuttle/MogoShuttleServiceManager.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/mogo/shuttle/MogoShuttleServiceManager.kt @@ -1,29 +1,26 @@ -package com.mogo.och.weaknet.repository.net.normal.mogo.shuttle +package com.mogo.och.weaknet.repository.net.project.mogo.shuttle -import android.content.Context import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.network.OchCommonNet -import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.network.interceptor.transformTry import com.mogo.och.data.bean.BusRoutesResult import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest -import com.mogo.och.weaknet.bean.response.WriteOffCountResponse import com.mogo.och.weaknet.repository.db.bean.LineDataBean import com.mogo.och.weaknet.repository.db.bean.TaskDataBean +import com.mogo.och.weaknet.repository.net.NetInterface import com.mogo.och.weaknet.repository.net.bean.request.BusCloseTaskRequest import com.mogo.och.weaknet.repository.net.bean.request.BusResetDrivingLineRequest import com.mogo.och.weaknet.repository.net.bean.request.BusUpdateSiteStatusRequest -import com.mogo.och.weaknet.repository.net.normal.NormalNetInterface import io.reactivex.Observable /** * @author: wangmingjun * @date: 2021/10/20 */ -class MogoShuttleServiceManager: NormalNetInterface { +class MogoShuttleServiceManager: NetInterface { private val mService: IMogoShuttleApiService = MoGoRetrofitFactory.getInstance(OchCommonConst.getShuttleUrl()).create( IMogoShuttleApiService::class.java diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/saas/bus/ISaasBusApiService.java b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/bus/ISaasBusApiService.java similarity index 80% rename from OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/saas/bus/ISaasBusApiService.java rename to OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/bus/ISaasBusApiService.java index 4ff06ef54a..948e50d30c 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/saas/bus/ISaasBusApiService.java +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/bus/ISaasBusApiService.java @@ -1,4 +1,4 @@ -package com.mogo.och.weaknet.repository.net.weaknet.saas.bus; +package com.mogo.och.weaknet.repository.net.project.saas.bus; import com.mogo.eagle.core.data.BaseData; import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest; @@ -6,7 +6,9 @@ import com.mogo.och.weaknet.bean.response.BusRoutesResponse; import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse; import com.mogo.och.weaknet.bean.request.ShuttleEventRequest; import com.mogo.och.weaknet.bean.response.WriteOffCountResponse; +import com.mogo.och.weaknet.repository.net.bean.request.PassengerWriteOffRequest; import com.mogo.och.weaknet.repository.net.bean.request.WriteOffCountReqBean; +import com.mogo.och.weaknet.repository.net.bean.response.PassengerWriteOffResponse; import io.reactivex.Observable; import retrofit2.http.Body; @@ -42,6 +44,13 @@ public interface ISaasBusApiService { @POST("/och-vehicle/api/car/v2/task/site/writeOffCount") Observable writeOffCount(@Header ("appId") String appId, @Header("ticket") String ticket, @Body WriteOffCountReqBean writeOffCountReqBean); + /** + * 同步核销接口 + */ + @Headers({"Content-type:application/json;charset=UTF-8"}) + @POST("/och-vehicle/api/car/v2/device/writeOff") + Observable saaswriteOffTicket(@Header ("appId") String appId, @Header("ticket") String ticket, @Body PassengerWriteOffRequest request); + /** * 同步 线路、站点、任务、自驾轨迹信息 */ diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/saas/bus/SaasBusServiceManager.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/bus/SaasBusServiceManager.kt similarity index 73% rename from OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/saas/bus/SaasBusServiceManager.kt rename to OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/bus/SaasBusServiceManager.kt index 7457794033..605a791148 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/saas/bus/SaasBusServiceManager.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/bus/SaasBusServiceManager.kt @@ -1,4 +1,4 @@ -package com.mogo.och.weaknet.repository.net.weaknet.saas.bus +package com.mogo.och.weaknet.repository.net.project.saas.bus import android.content.Context import com.mogo.cloud.passport.MoGoAiCloudClientConfig @@ -12,19 +12,17 @@ import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.network.OchCommonSubscribeImpl import com.mogo.och.common.module.network.interceptor.transformIoTry import com.mogo.och.data.bean.BusRoutesResult -import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse import com.mogo.och.weaknet.bean.request.ShuttleEventRequest -import com.mogo.och.weaknet.bean.response.WriteOffCountResponse import com.mogo.och.weaknet.repository.net.bean.request.WriteOffCountReqBean -import com.mogo.och.weaknet.repository.net.weaknet.WeakNetInterface +import com.mogo.och.weaknet.repository.net.NetInterface import io.reactivex.Observable /** * @author: wangmingjun * @date: 2021/10/20 */ -object SaasBusServiceManager: WeakNetInterface { +object SaasBusServiceManager: NetInterface { private val mService: ISaasBusApiService = MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create( ISaasBusApiService::class.java @@ -49,29 +47,6 @@ object SaasBusServiceManager: WeakNetInterface { } } - /** - * 只发生在大理和saas环境 查询当前站点核销的人数 - */ - override fun writeOffCount( - context: Context, - taskId: Long, - siteId: Long, - callback: OchCommonServiceCallback? - ) { - OchSPManager.getSn()?.let { - mService.writeOffCount( - MoGoAiCloudClientConfig.getInstance().serviceAppId, - SharedPrefsMgr.getInstance().token, - WriteOffCountReqBean(it,taskId, - siteId, - ) - ) - .transformIoTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "writeOffCount")) - } - - } - /** * 同步 线路、站点、任务、自驾轨迹信息 */ diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/saas/shuttle/ISaasShuttleApiService.java b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/shuttle/ISaasShuttleApiService.java similarity index 80% rename from OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/saas/shuttle/ISaasShuttleApiService.java rename to OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/shuttle/ISaasShuttleApiService.java index e86002ceb1..eb26f0f714 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/saas/shuttle/ISaasShuttleApiService.java +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/shuttle/ISaasShuttleApiService.java @@ -1,4 +1,4 @@ -package com.mogo.och.weaknet.repository.net.weaknet.saas.shuttle; +package com.mogo.och.weaknet.repository.net.project.saas.shuttle; import com.mogo.eagle.core.data.BaseData; import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest; @@ -6,7 +6,9 @@ import com.mogo.och.weaknet.bean.response.BusRoutesResponse; import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse; import com.mogo.och.weaknet.bean.request.ShuttleEventRequest; import com.mogo.och.weaknet.bean.response.WriteOffCountResponse; +import com.mogo.och.weaknet.repository.net.bean.request.PassengerWriteOffRequest; import com.mogo.och.weaknet.repository.net.bean.request.WriteOffCountReqBean; +import com.mogo.och.weaknet.repository.net.bean.response.PassengerWriteOffResponse; import io.reactivex.Observable; import retrofit2.http.Body; @@ -42,6 +44,13 @@ public interface ISaasShuttleApiService { @POST("/och-vehicle/api/car/v2/task/site/writeOffCount") Observable writeOffCount(@Header ("appId") String appId, @Header("ticket") String ticket, @Body WriteOffCountReqBean writeOffCountReqBean); + /** + * 同步核销接口 + */ + @Headers({"Content-type:application/json;charset=UTF-8"}) + @POST("/och-vehicle/api/car/v2/device/writeOff") + Observable saaswriteOffTicket(@Header ("appId") String appId, @Header("ticket") String ticket, @Body PassengerWriteOffRequest request); + /** * 同步 线路、站点、任务、自驾轨迹信息 */ diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/saas/shuttle/SaasShuttleServiceManager.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/shuttle/SaasShuttleServiceManager.kt similarity index 71% rename from OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/saas/shuttle/SaasShuttleServiceManager.kt rename to OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/shuttle/SaasShuttleServiceManager.kt index 42d02601b7..9af031601d 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/saas/shuttle/SaasShuttleServiceManager.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/shuttle/SaasShuttleServiceManager.kt @@ -1,4 +1,4 @@ -package com.mogo.och.weaknet.repository.net.weaknet.saas.shuttle +package com.mogo.och.weaknet.repository.net.project.saas.shuttle import android.content.Context import com.mogo.cloud.passport.MoGoAiCloudClientConfig @@ -15,16 +15,14 @@ import com.mogo.och.data.bean.BusRoutesResult import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse import com.mogo.och.weaknet.bean.request.ShuttleEventRequest -import com.mogo.och.weaknet.bean.response.WriteOffCountResponse -import com.mogo.och.weaknet.repository.net.bean.request.WriteOffCountReqBean -import com.mogo.och.weaknet.repository.net.weaknet.WeakNetInterface +import com.mogo.och.weaknet.repository.net.NetInterface import io.reactivex.Observable /** * @author: wangmingjun * @date: 2021/10/20 */ -object SaasShuttleServiceManager: WeakNetInterface { +object SaasShuttleServiceManager: NetInterface { private val mService: ISaasShuttleApiService = MoGoRetrofitFactory.getInstance(OchCommonConst.getShuttleUrl()).create( ISaasShuttleApiService::class.java @@ -33,8 +31,6 @@ object SaasShuttleServiceManager: WeakNetInterface { /** * 查询小巴车当前任务 - * @param context - * @param callback */ override fun queryBusRoutes(): Observable? { //获取当前高德坐标 @@ -49,29 +45,6 @@ object SaasShuttleServiceManager: WeakNetInterface { } } - /** - * 只发生在大理和saas环境 查询当前站点核销的人数 - */ - override fun writeOffCount( - context: Context, - taskId: Long, - siteId: Long, - callback: OchCommonServiceCallback? - ) { - OchSPManager.getSn()?.let { - mService.writeOffCount( - MoGoAiCloudClientConfig.getInstance().serviceAppId, - SharedPrefsMgr.getInstance().token, - WriteOffCountReqBean( - it, taskId, - siteId, - ) - ) - .transformIoTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "writeOffCount")) - } - } - /** * 同步 线路、站点、任务、自驾轨迹信息 */ diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/WeakNetInterface.java b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/WeakNetInterface.java deleted file mode 100644 index 5d6c7695de..0000000000 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/weaknet/WeakNetInterface.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.mogo.och.weaknet.repository.net.weaknet; - -import android.content.Context; - -import com.mogo.och.common.module.network.OchCommonServiceCallback; -import com.mogo.och.data.bean.BusRoutesResult; -import com.mogo.och.weaknet.bean.request.ShuttleEventRequest; -import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse; -import com.mogo.och.weaknet.bean.response.WriteOffCountResponse; -import com.mogo.eagle.core.data.BaseData; - -import io.reactivex.Observable; - -public interface WeakNetInterface { - - Observable queryBusRoutes(); - - void writeOffCount( - Context context , - Long taskId, - Long siteId, - OchCommonServiceCallback callback - ); - - void queryCarExecutableTaskList( - Context context , - OchCommonServiceCallback callback - ); - - void reportCabinEvent( - Context context , - ShuttleEventRequest data , - OchCommonServiceCallback callback - ); -} diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/writeoff/IWriteOffRepository.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/writeoff/IWriteOffRepository.kt new file mode 100644 index 0000000000..3e32e4991c --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/writeoff/IWriteOffRepository.kt @@ -0,0 +1,29 @@ +package com.mogo.och.weaknet.repository.writeoff + +import android.content.Context +import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDetialMsg +import com.mogo.och.common.module.network.OchCommonServiceCallback +import com.mogo.och.weaknet.bean.WaitUploadLine +import com.mogo.och.weaknet.bean.WriteOffPassenger +import com.mogo.och.weaknet.bean.response.WriteOffCountResponse +import com.mogo.och.weaknet.repository.net.bean.response.PassengerWriteOffResponse +import io.reactivex.Observable + +interface IWriteOffRepository { + + fun queryWriteoffCount(context: Context, taskId: Long, siteId: Long): Observable? + + fun writeOffEvent(writeOffDetialMsg: WriteOffDetialMsg): Observable? + + fun release() + + fun canCanEndTask(taskId: Long): Boolean { + return true + } + + fun queryWaitUploadData(): Observable>? + fun writeOffEvent4Socket(passenger: WriteOffPassenger) { + + } + +} \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/writeoff/impl/WriteOffCacheRepository.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/writeoff/impl/WriteOffCacheRepository.kt new file mode 100644 index 0000000000..b13b1ca64e --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/writeoff/impl/WriteOffCacheRepository.kt @@ -0,0 +1,244 @@ +package com.mogo.och.weaknet.repository.writeoff.impl + +import android.content.Context +import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.env.Project +import com.mogo.commons.env.ProjectUtils +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.och.common.module.biz.login.LoginStatusManager +import com.mogo.och.common.module.manager.autopilot.line.LineManager +import com.mogo.och.common.module.manager.cache.OchSPManager +import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDetialMsg +import com.mogo.och.common.module.utils.DateTimeUtil +import com.mogo.och.weaknet.bean.WaitUploadLine +import com.mogo.och.weaknet.bean.WaitUploadTask +import com.mogo.och.weaknet.bean.WriteOffPassenger +import com.mogo.och.weaknet.model.LineModel +import com.mogo.och.weaknet.repository.db.bean.WriteOffDataBean +import com.mogo.och.weaknet.repository.db.repository.EventDb +import com.mogo.och.weaknet.repository.db.repository.WriteOffDb +import com.mogo.och.weaknet.repository.exception.DataException +import com.mogo.och.weaknet.repository.net.exception.NetException +import com.mogo.och.weaknet.repository.net.NetInterface +import com.mogo.och.weaknet.repository.net.bean.response.PassengerWriteOffResponse +import com.mogo.och.weaknet.repository.net.project.saas.bus.SaasBusServiceManager +import com.mogo.och.weaknet.repository.net.project.saas.shuttle.SaasShuttleServiceManager +import com.mogo.och.weaknet.repository.writeoff.IWriteOffRepository +import io.reactivex.Observable +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers + +class WriteOffCacheRepository : IWriteOffRepository { + private val TAG = "ShuttleSaasRepository" + private val context = AbsMogoApplication.getApp() + + private var weakNetInterface: NetInterface?=null + get() { + if(field==null){ + when (ProjectUtils.getProjectType()) { + Project.SAAS -> { + if(AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)) { + field = SaasShuttleServiceManager + }else if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { + field = SaasBusServiceManager + } + } + Project.DALI -> { + throw NetException("缓存weakNetInterface 初始化环境错误 Dali") + } + Project.MOGO -> { + throw NetException("缓存weakNetInterface 初始化环境错误 MOGO") + } + else->{ + throw NetException("缓存weakNetInterface 初始化环境错误 未知") + } + } + } + return field + } + + + override fun queryWriteoffCount( + context: Context, + taskId: Long, + siteId: Long + ): Observable? { + val queryWriteOffByTaskAndSiteId = WriteOffDb.queryWriteOffByTaskAndSiteId(taskId, siteId) + return Observable.just(queryWriteOffByTaskAndSiteId) + .flatMap { + return@flatMap Observable.just(it?.size ?:0) + } + } + + override fun writeOffEvent(writeOffDetialMsg: WriteOffDetialMsg): Observable? { + + return Observable.just(writeOffDetialMsg) + .flatMap { + // 1、校验数据 + /** + * 0、校验 tenantId + * 1、校验pipe 校验project + * 2、校验业务模式 bus和接驳 + * 3、校验二维码有效性(向后1分钟有效) + * 4、校验乘车日期 + * 5、校验线路 + * + * 接驳 + * 6、校验次数 + * 7、同一个订单2分钟内只能执行一次 + * 小巴 + * 6、校验站点 + */ + var lineId:Long?=null + var siteId:Long?=null + + + // 1、校验租户id + it.tenantId?.let { tenantId-> + if(LoginStatusManager.getLoginInfo()?.tenantId==tenantId){ + + }else{ + throw DataException(1012,"当前用户下单路线非当前的车辆所属公司") + } + } + // 2、校验project + if(ProjectUtils.isSaas()){ + if(it.pipe != WriteOffDataBean.saasXiaoChengXu){ + throw DataException(1012,"当前用户下单路线非当前的车辆所属公司") + } + }else if(ProjectUtils.isDali()){ + if(it.pipe != WriteOffDataBean.daliXiaoChengXu){ + throw DataException(1012,"当前用户下单路线非当前的车辆所属公司") + } + } + // 3、校验 bus和shuttle + if (LoginStatusManager.getBusInessType().name.lowercase()!=it.typeBiz) { + throw DataException(1005,"车辆未登录、或没有任务") + } + // 4 二维码1分钟失效 + if(System.currentTimeMillis()-(it.expiryTime?:0L)>60_000){ + throw DataException(6001,"二维码已过期") + } + // 5 校验乘车日期 + if(!DateTimeUtil.isSameDay(System.currentTimeMillis(),it.bookingTime?:0)){ + throw DataException(1009,"车票所选乘车日期非今日") + } + // 6、校验线路 + if(it.lineId==LineManager.lineInfos?.lineId){ + lineId = it.lineId + }else{ + throw DataException(1006,"车票路线信息与当前车辆执行任务的路线信息不符合") + } + if (!it.orderNo.isNullOrEmpty()) { + val lastWriteOff = WriteOffDb.queryWaitUpdateEventCount(it.orderNo!!) + // 7、校验次数 + if ((it.availableTimes ?: 0) >= (lastWriteOff?.size ?: 0)) { + throw DataException(1008, "车票剩余可用次数为0") + } + if (AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)) { + // 8、同一个订单2分钟内只能核销一次 + if (lastWriteOff != null && lastWriteOff.size > 0) { + if (System.currentTimeMillis() - lastWriteOff.last().eventSaveTime <= 120_000) { + throw DataException(6002, "同一订单核销间隔时间需大于2分钟") + } + } + + val (start, _) = LineManager.getStations() + siteId = start?.siteId?.toLong() ?: 0 + } else if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { + // 8、校验起始站点 + val (start, _) = LineManager.getStations() + if (start?.siteId?.toLong() == it.startStationId) { + siteId = it.startStationId + } else { + throw DataException( + 1006, + "车票站点信息与当前车辆执行任务的站点信息不符合" + ) + } + } + } else { + throw DataException(11000, "缺少orderNo") + } + + val addWrite = WriteOffDataBean() + addWrite.expiryTime = it.expiryTime + addWrite.bookingTime = it.bookingTime + addWrite.type = it.type + addWrite.taskId = LineModel.currentTask?.taskId + addWrite.lineId = lineId + addWrite.siteId = siteId + addWrite.availableTimes = it.availableTimes + addWrite.orderNo = it.orderNo + addWrite.uid = it.uid + addWrite.phone = it.phone + addWrite.ticketSize = it.ticketSize + addWrite.ticketName = it.ticketName + addWrite.msgId = OchSPManager.getSn()+System.currentTimeMillis() + addWrite.driverId = LoginStatusManager.getLoginInfo()?.driverId?:0 + addWrite.businessTime = System.currentTimeMillis() + WriteOffDb.addOrUpdate(addWrite) + val reslut = PassengerWriteOffResponse.Result(it.phone,it.ticketSize,it.ticketName,it.availableTimes?.toLong(),addWrite.businessTime) + return@flatMap Observable.just(reslut) + } + } + + override fun canCanEndTask(taskId: Long): Boolean { + val queryWaitUpdateEventByTaskId = WriteOffDb.queryWaitUpdateEventByTaskId(taskId) + return queryWaitUpdateEventByTaskId.isNullOrEmpty() + } + + override fun queryWaitUploadData(): Observable>? { + return EventDb.queryWaitUploadData() + ?.flatMap { waitUploadList-> + val result = mutableListOf() + waitUploadList.forEach { wait-> + if(wait.lineId!=null&&wait.lineName!=null&&wait.taskId!=null&&wait.taskStartTime!=null) { + val waitUpdateEventCount = WriteOffDb.queryWaitUpdateEventCountByTaskId(wait.taskId!!) + val tempTask = WaitUploadTask(wait.taskStartTime!!,wait.taskId!!,waitUpdateEventCount) + val tempLine = WaitUploadLine(wait.lineName!!, wait.lineId!!, mutableListOf(tempTask)) + val haveSave = result.filter { + it.lineId==tempLine.lineId + } + if(haveSave.isEmpty()){ + result.add(tempLine) + }else{ + haveSave.first().task.add(tempTask) + } + } + } + Observable.just(result) } + ?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + } + + override fun writeOffEvent4Socket(passenger: WriteOffPassenger) { + val addWrite = WriteOffDataBean() + //addWrite.expiryTime = it.expiryTime + //addWrite.bookingTime = it.bookingTime + //addWrite.type = it.type + addWrite.taskId = LineModel.currentTask?.taskId + LineManager.getStationsWithLine { start, end, lineInfo -> + addWrite.siteId = start.siteId.toLong() + addWrite.lineId = lineInfo.lineId + } + //addWrite.availableTimes = it.availableTimes + addWrite.orderNo = passenger.orderNo + //addWrite.uid = it.uid + addWrite.phone = passenger.phone + addWrite.ticketSize = passenger.passengerSize + addWrite.ticketName = passenger.ticketName + //addWrite.msgId = OchSPManager.getSn()+System.currentTimeMillis() + addWrite.driverId = LoginStatusManager.getLoginInfo()?.driverId?:0 + //addWrite.businessTime = System.currentTimeMillis() + addWrite.updateStatus = WriteOffDataBean.updated + WriteOffDb.addOrUpdate(addWrite) + } + + override fun release() { + weakNetInterface = null + CallerLogger.d(TAG,"重置 weakNetInterface") + } +} \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/writeoff/impl/WriteOffNormallRepository.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/writeoff/impl/WriteOffNormallRepository.kt new file mode 100644 index 0000000000..f9deca8196 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/writeoff/impl/WriteOffNormallRepository.kt @@ -0,0 +1,107 @@ +package com.mogo.och.weaknet.repository.writeoff.impl + +import android.content.Context +import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.env.Project +import com.mogo.commons.env.ProjectUtils +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDetialMsg +import com.mogo.och.common.module.network.OchCommonServiceCallback +import com.mogo.och.weaknet.bean.WaitUploadLine +import com.mogo.och.weaknet.bean.WaitUploadTask +import com.mogo.och.weaknet.bean.response.WriteOffCountResponse +import com.mogo.och.weaknet.repository.db.repository.EventDb +import com.mogo.och.weaknet.repository.net.NetInterface +import com.mogo.och.weaknet.repository.net.bean.request.PassengerWriteOffRequest +import com.mogo.och.weaknet.repository.net.bean.response.PassengerWriteOffResponse +import com.mogo.och.weaknet.repository.net.exception.NetException +import com.mogo.och.weaknet.repository.net.project.dali.bus.DaliBusServiceManager +import com.mogo.och.weaknet.repository.net.project.dali.shuttle.DaliShuttleServiceManager +import com.mogo.och.weaknet.repository.writeoff.IWriteOffRepository +import io.reactivex.Observable +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers + +class WriteOffNormallRepository: IWriteOffRepository { + + private val TAG = "WriteOffNormallRepository" + + private var normalNetInterface: NetInterface?=null + get() { + if(field==null){ + when (ProjectUtils.getProjectType()) { + Project.SAAS -> { + throw NetException("writeoff 核销 初始化环境错误 SAAS") + } + Project.DALI -> { + if(AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)) { + field = DaliShuttleServiceManager + }else if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { + field = DaliBusServiceManager + } + } + Project.MOGO -> { + throw NetException("writeoff 核销 初始化环境错误 MOGO") + } + else->{ + throw NetException("writeoff 核销 初始化环境错误 未知") + } + } + } + return field + } + + init { + + } + + + override fun queryWriteoffCount( + context: Context, + taskId: Long, + siteId: Long, + ): Observable? { + return normalNetInterface?.writeOffCount(context,taskId,siteId) + } + + + override fun writeOffEvent(writeOffDetialMsg: WriteOffDetialMsg): Observable? { + val passengerWriteOffRequest = PassengerWriteOffRequest(writeOffDetialMsg.orderNo, writeOffDetialMsg.uid) + return normalNetInterface?.writeOffTicket( + AbsMogoApplication.getApp(), + passengerWriteOffRequest, + ) + } + + override fun release() { + normalNetInterface=null + CallerLogger.d(TAG,"重置 normalNetInterface") + } + + override fun queryWaitUploadData(): Observable>? { + return EventDb.queryWaitUploadData() + ?.flatMap { waitUploadList-> + val result = mutableListOf() + waitUploadList.forEach { wait-> + if(wait.lineId!=null&&wait.lineName!=null&&wait.taskId!=null&&wait.taskStartTime!=null) { + val tempTask = WaitUploadTask(wait.taskStartTime!!,wait.taskId!!,0) + val tempLine = WaitUploadLine(wait.lineName!!, wait.lineId!!, mutableListOf(tempTask)) + val haveSave = result.filter { + it.lineId==tempLine.lineId + } + if(haveSave.isEmpty()){ + result.add(tempLine) + }else{ + haveSave.first().task.add(tempTask) + } + } + } + Observable.just(result) } + ?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + } + + +} \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunned/RunningTaskAdapter.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunned/RunningTaskAdapter.kt index c65c8bcc4a..55f8ac57cc 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunned/RunningTaskAdapter.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunned/RunningTaskAdapter.kt @@ -44,7 +44,11 @@ class RunningTaskAdapter( val lineTasks = dataList!![currentPosition] val sb = StringBuilder().append("班次:") lineTasks.task.forEach { - sb.append(TimeUtils.millis2String(it.taskStartTime, "HH:mm")).append(" ") + sb.append(TimeUtils.millis2String(it.taskStartTime, "HH:mm")) + if(it.waitUploadWriteOff>0){ + sb.append("(${it.waitUploadWriteOff})") + } + sb.append(" ") } holder.actvLineTaskName.text = lineTasks.lineName holder.actvWaitUploadItem.text = sb diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunned/RunningTastViewModel.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunned/RunningTastViewModel.kt index bf12f0f88d..42d144c1ef 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunned/RunningTastViewModel.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunned/RunningTastViewModel.kt @@ -2,6 +2,7 @@ package com.mogo.och.weaknet.ui.taskrunned import androidx.lifecycle.ViewModel import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.utils.RxUtils import com.mogo.och.weaknet.bean.WaitUploadLine import com.mogo.och.weaknet.model.EventModel @@ -59,25 +60,28 @@ class RunningTastViewModel : ViewModel() { } fun queryNewData() { - EventModel.queryWaitUploadInfo() - ?.subscribe(object : Observer> { - override fun onSubscribe(d: Disposable) { - CallerLogger.d(TAG, "onSubscribe") - } + BizLoopManager.runInIoThread { + EventModel.queryWaitUploadInfo() + ?.subscribe(object : Observer> { + override fun onSubscribe(d: Disposable) { + CallerLogger.d(TAG, "onSubscribe") + } - override fun onError(e: Throwable) { - CallerLogger.d(TAG, "onError${e.printStackTrace()}") - } + override fun onError(e: Throwable) { + CallerLogger.d(TAG, "onError${e.printStackTrace()}") + } - override fun onComplete() { - CallerLogger.d(TAG, "onComplete") - } + override fun onComplete() { + CallerLogger.d(TAG, "onComplete") + } - override fun onNext(data: MutableList) { - this@RunningTastViewModel.viewCallback?.showData(data) - } + override fun onNext(data: MutableList) { + this@RunningTastViewModel.viewCallback?.showData(data) + } + + }) + } - }) } fun uploadData() { diff --git a/OCH/shuttle/driver_weaknet/src/main/res/drawable-nodpi/bus_station_end.png b/OCH/shuttle/driver_weaknet/src/main/res/drawable-nodpi/bus_station_end.png new file mode 100644 index 0000000000..45071228a2 Binary files /dev/null and b/OCH/shuttle/driver_weaknet/src/main/res/drawable-nodpi/bus_station_end.png differ diff --git a/OCH/shuttle/driver_weaknet/src/main/res/drawable-nodpi/bus_station_notarrive.png b/OCH/shuttle/driver_weaknet/src/main/res/drawable-nodpi/bus_station_notarrive.png new file mode 100644 index 0000000000..cbb2dda8b9 Binary files /dev/null and b/OCH/shuttle/driver_weaknet/src/main/res/drawable-nodpi/bus_station_notarrive.png differ diff --git a/OCH/shuttle/driver_weaknet/src/main/res/drawable-nodpi/bus_station_pass.png b/OCH/shuttle/driver_weaknet/src/main/res/drawable-nodpi/bus_station_pass.png new file mode 100644 index 0000000000..a411050a6e Binary files /dev/null and b/OCH/shuttle/driver_weaknet/src/main/res/drawable-nodpi/bus_station_pass.png differ diff --git a/OCH/shuttle/driver_weaknet/src/main/res/drawable-nodpi/bus_station_start.png b/OCH/shuttle/driver_weaknet/src/main/res/drawable-nodpi/bus_station_start.png new file mode 100644 index 0000000000..baca87f72f Binary files /dev/null and b/OCH/shuttle/driver_weaknet/src/main/res/drawable-nodpi/bus_station_start.png differ diff --git a/OCH/shuttle/passenger_weaknet/src/main/AndroidManifest.xml b/OCH/shuttle/passenger_weaknet/src/main/AndroidManifest.xml index 8f53c58eed..2a515ce29c 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/AndroidManifest.xml +++ b/OCH/shuttle/passenger_weaknet/src/main/AndroidManifest.xml @@ -2,4 +2,25 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/ShuttlePassengerProvider.kt b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/ShuttlePassengerProvider.kt index f991e74e61..ecf118c567 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/ShuttlePassengerProvider.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/ShuttlePassengerProvider.kt @@ -13,7 +13,7 @@ import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.biz.provider.CommonServiceImpl import com.mogo.och.common.module.wigets.media.MediaPlayerActivity import com.mogo.och.shuttle.weaknet.passenger.model.TicketModel -import com.mogo.och.shuttle.weaknet.passenger.ui.BusPStatusBarView +import com.mogo.och.shuttle.weaknet.passenger.ui.widget.BusPStatusBarView import com.mogo.och.shuttle.weaknet.passenger.ui.BusPassengerRouteFragment import com.mogo.och.shuttle.weaknet.passenger.ui.PM2BaseFragment import com.mogo.och.shuttle.weaknet.passenger.ui.widget.M2StatusBarView @@ -30,7 +30,7 @@ class ShuttlePassengerProvider : CommonServiceImpl() { private var mPM2Fragment: Fragment?=null override fun init(context: Context) { - TicketModel.load() + } override fun getStatusBarView(context: Context): View { @@ -59,11 +59,13 @@ class ShuttlePassengerProvider : CommonServiceImpl() { BusPassengerRouteFragment() } } + TicketModel.load() return mPM2Fragment!! } override fun resetFragment() { super.resetFragment() + TicketModel.release() mPM2Fragment = null } diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/callback/ADASCallback.kt b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/callback/ADASCallback.kt similarity index 100% rename from OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/callback/ADASCallback.kt rename to OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/callback/ADASCallback.kt diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/callback/ICommonCallback.java b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/callback/ICommonCallback.java new file mode 100644 index 0000000000..4a39fa1348 --- /dev/null +++ b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/callback/ICommonCallback.java @@ -0,0 +1,27 @@ +package com.mogo.och.shuttle.weaknet.passenger.callback; + +import com.mogo.och.data.bean.BusStationBean; + +import java.util.List; + +/** + * @author: wangmingjun + * @date: 2022/4/6 + */ +public interface ICommonCallback { + void updateLineInfo(String lineName); + void updateStationsInfo(List stations, int currentStationIndex, boolean isArrived); + void updateSpeed(int location); + void updateRemainMT(long meters, long timeInSecond); + void showNoTaskView(boolean isTrue); + + /** + * false: 未开启自驾, true : 开启自驾 + */ + void updateAutoStatus(boolean isOpen); + + default void updateLineStations(List stations){} + + default void clearCustomPolyline(){} + +} diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/CommonModel.kt b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/CommonModel.kt index 19b590dc2c..a2473d8c4c 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/CommonModel.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/CommonModel.kt @@ -1,26 +1,120 @@ package com.mogo.och.shuttle.weaknet.passenger.model +import android.annotation.SuppressLint +import android.content.Context import com.mogo.commons.AbsMogoApplication import com.mogo.commons.env.ProjectUtils +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +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.util.GsonUtils +import com.mogo.eagle.core.utilcode.util.StringUtils import com.mogo.och.common.module.biz.lansocket.IOchLanPassengerStatusListener +import com.mogo.och.common.module.biz.lansocket.LoginLanPassengerSocket +import com.mogo.och.common.module.biz.media.MediaManager +import com.mogo.och.common.module.manager.autopilot.autopilot.IOchAutopilotStatusListener +import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotStatusListenerManager +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager +import com.mogo.och.common.module.manager.distance.IDistanceListener +import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager import com.mogo.och.common.module.manager.download.DownloadManager +import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager +import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener import com.mogo.och.common.module.manager.socket.lan.LanSocketManager +import com.mogo.och.common.module.manager.socket.lan.bean.AppConnectMsg import com.mogo.och.common.module.manager.socket.lan.bean.BusinessType +import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType import com.mogo.och.common.module.manager.socket.lan.bean.TaskDetailsMsg import com.mogo.och.common.module.network.OchCommonServiceCallback +import com.mogo.och.common.module.utils.DateTimeUtil +import com.mogo.och.common.module.utils.PinYinUtil +import com.mogo.och.common.module.voice.VoiceNotice.showNotice +import com.mogo.och.common.module.wigets.media.MediaItem +import com.mogo.och.data.bean.BusRoutesResult +import com.mogo.och.data.bean.BusStationBean +import com.mogo.och.data.bean.BusTransferData import com.mogo.och.shuttle.weaknet.passenger.bean.response.ResponseSiteIntroduce +import com.mogo.och.shuttle.weaknet.passenger.callback.ICommonCallback +import com.mogo.och.shuttle.weaknet.passenger.constant.BusPassengerConst import com.mogo.och.shuttle.weaknet.passenger.network.PassengerServiceManager +import kotlin.math.abs + +@SuppressLint("StaticFieldLeak") +object CommonModel { + + private val TAG: String = CommonModel::class.java.simpleName + + var mContext: Context? = null + + + private var mCommonCallback: ICommonCallback? = null // bus路线信息更新 + + var mStations = mutableListOf() + var mNextStationIndex = 0 // A-B要到达站的index + @Volatile + var isGoingToNextStation = false //是否前往下一站过程中 + + var routesResult: BusRoutesResult? = null + + + + fun init(context: Context) { + mContext = context.applicationContext + initListeners() + queryDriverByLocalDriver() + } + + + private fun initListeners() { + //自动驾驶状态监听 + OchAutoPilotStatusListenerManager.addListener(TAG, mAutoPilotStatusListener) + // 定位监听 + OchLocationManager.addGCJ02Listener(TAG, 3, mMapLocationListener) + // 监听站点距离 + TrajectoryAndDistanceManager.addDistanceListener(TAG, trajectoryListener) + // 通用监听 + LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_COMMON.type, LanSocketManager.commonListener) + // 监听站点信息 + LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_TASK_DETAILS.type, typeTaskDetails) + // 注册监听和司机屏连接情况 + LoginLanPassengerSocket.addListener(TAG, connectDriverListener) + } + + fun releaseListeners() { + //自动驾驶状态监听 + CallerAutoPilotStatusListenerManager.removeListener(TAG) + // 定位监听 + OchLocationManager.removeGCJ02Listener(TAG) + // 监听站点距离 + TrajectoryAndDistanceManager.removeListener(TAG) + LanSocketManager.unRegisterSocketMessageListener(DPMsgType.TYPE_COMMON.type, LanSocketManager.commonListener) + LanSocketManager.unRegisterSocketMessageListener(DPMsgType.TYPE_TASK_DETAILS.type, typeTaskDetails) + LoginLanPassengerSocket.removeListener(TAG) + cleanStation("release") + } + + + fun setRouteLineInfoCallback(callback: ICommonCallback?) { + this.mCommonCallback = callback + } -open class CommonModel { val connectDriverListener = object : IOchLanPassengerStatusListener { + // 和司机屏连接发生变化后 override fun onDriverConnectChangeListener(isConnect: Boolean) { super.onDriverConnectChangeListener(isConnect) if(isConnect){ queryDriverByLocalDriver() } } - + // 司机屏sn 发生变化后 override fun onDriverSnChagneListner(sn: String?) { super.onDriverSnChagneListner(sn) sn?.let { @@ -29,12 +123,170 @@ open class CommonModel { } } + val mMapLocationListener: IMoGoChassisLocationGCJ02Listener = + object : IMoGoChassisLocationGCJ02Listener { + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + if (null == mogoLocation) return + updateSpeed(mogoLocation) + } + } + + val mAutoPilotStatusListener: IOchAutopilotStatusListener = + object : IOchAutopilotStatusListener { + + override fun onAutopilotStatusResponse(state: Int) { + d(SceneConstant.M_BUS_P, "onAutopilotStatusResponse ===== $state") + if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING != state){ + //美化模式下且行程中 + if (FunctionBuildConfig.isDemoMode && + mNextStationIndex >= 0 && mNextStationIndex <= mStations.size - 1 + && isGoingToNextStation + ){ + mCommonCallback?.updateAutoStatus(true) + }else{//非美化模式下 + mCommonCallback?.updateAutoStatus(false) + } + }else{//自驾状态 2 + mCommonCallback?.updateAutoStatus(true) + } + } + } + + val trajectoryListener: IDistanceListener = object : IDistanceListener { + override fun distanceCallback(distance: Float) { + val lastTime = distance / BusPassengerConst.BUS_AVERAGE_SPEED * 3.6 //秒 + d(SceneConstant.M_BUS_P, "轨迹排查==lastSumLength = $distance") + if (routesResult != null) { + for (site in routesResult!!.sites) { + if (site.drivingStatus == BusPassengerConst.STATION_STATUS_STOPPED && !site.isLeaving) { + return + } + } + } + // 小于200m 播报站点介绍 + if (distance < 200) { + val stationNext = mStations[mNextStationIndex] + if (!stationNext.isPlayTts) { + if (!StringUtils.isEmpty(stationNext.introduction)) { + showNotice(stationNext.introduction) + stationNext.isPlayTts = true + } + } + } + mCommonCallback?.updateRemainMT( + distance.toLong(), + lastTime.toLong() + ) + } + } + + val typeTaskDetails = object : ILanMessageListener { + override fun targetLan(): Class { + return TaskDetailsMsg::class.java + } + + override fun onLanMsgReceived(first: TaskDetailsMsg?) { + first?.let { + + if (first.msg?.isEmpty() == true) { + clearLocalRouteResult() + return + } + val result = GsonUtils.fromJson(first.msg, BusTransferData::class.java) + if (result != null && result.routesResult == null) { + clearLocalRouteResult() + } + + if (result != null) { + routesResult = result.routesResult + updatePassengerRouteInfo(routesResult) + } + } + } + } + + val b1CommonListener = object : ILanMessageListener { + override fun targetLan(): Class = AppConnectMsg::class.java + + override fun onLanMsgReceived(first: AppConnectMsg?) { + first?.let { + if (it.isViewShow) { //消息盒子显示内容 + OCHSocketMessageManager.pushAppOperationalMsgBox( + DateTimeUtil.getCurrentTimeStamp(), it.msg, + OCHSocketMessageManager.OPERATION_SYSTEM + ) + } + } + } + } + + fun clearLocalRouteResult(){ + routesResult = null + mNextStationIndex = 0 + cleanStation("queryDriverSiteByCoordinate") + isGoingToNextStation = false + mCommonCallback?.showNoTaskView(true) + } + + + fun updatePassengerRouteInfo(result: BusRoutesResult?) { + if (result == null) { + clearLocalRouteResult() + return + } + + if (routesResult != null && routesResult!!.lineId != result.lineId) { + d(SceneConstant.M_BUS_P + TAG, "lineId change= clearCustomPolyline") + mCommonCallback?.clearCustomPolyline() + } + + d(SceneConstant.M_BUS_P + TAG, "queryDriverSiteByCoordinate = update") + routesResult = result + + if (result.sites != null) { + mCommonCallback?.updateLineInfo(result.name) + mCommonCallback?.showNoTaskView(false) + if (result.sites != null) { + val stations = result.sites + mStations.clear() + mStations.addAll(stations) + mCommonCallback?.updateLineStations(mStations) + for (i in stations.indices) { + val station = stations[i] + if (station.drivingStatus == BusPassengerConst.STATION_STATUS_STOPPED + && station.isLeaving && i + 1 < stations.size + ) { + isGoingToNextStation = true + mCommonCallback?.updateStationsInfo(stations, i + 1, false) + mNextStationIndex = i + 1 + val startStation = mStations[i] + val endStation = mStations[i + 1] + startStationVideo(endStation) + setTrajectoryStation(startStation, endStation, result.lineId) + updateAutopilotControlParameters(result, i) + return + } else if (station.drivingStatus == BusPassengerConst.STATION_STATUS_STOPPED && !station.isLeaving) { + if (i == stations.size - 1) { + cleanStation("updatePassengerRouteInfo最后一个站点") + } + isGoingToNextStation = false + Logger.d(SceneConstant.M_BUS_P + TAG, "order = station= arrive") + mCommonCallback?.updateStationsInfo(stations, i, true) + clearAutopilotControlParameters() + return + } + } + } + } + } + + // 向司机屏请求业务数据 fun queryDriverByLocalDriver() { //本地去请求司机端 val msg = TaskDetailsMsg("task", BusinessType.shuttle) LanSocketManager.sendMsgToServer(msg) } - + // 查询sn 所配置的所有站点介绍视频 private fun querySiteIntroduce(){ AbsMogoApplication.getApp()?.let { if (ProjectUtils.isSaas()) { @@ -54,7 +306,7 @@ open class CommonModel { } } } - + // 去统一下载站点介绍 private fun downloadSiteIntroduce(response: ResponseSiteIntroduce) { response.data?.forEach {siteIntroduceInfo -> siteIntroduceInfo.introduceList.forEach {introduceInfo -> @@ -63,5 +315,101 @@ open class CommonModel { } } + fun updateAutopilotControlParameters( + busRoutesResult: BusRoutesResult, + leaveIndex: Int + ) { + val parameters = initAutopilotControlParameters(busRoutesResult, leaveIndex) + if (null == parameters) { + CallerLogger.e(SceneConstant.M_BUS_P, "AutopilotControlParameters is empty.") + return + } + CallerLogger.d(SceneConstant.M_BUS_P, "AutopilotControlParameters is update.") + CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(parameters) + } + + fun initAutopilotControlParameters( + busRoutesResult: BusRoutesResult, + leaveIndex: Int + ): AutopilotControlParameters? { + if (busRoutesResult.sites == null) { + return null + } + val stations = busRoutesResult.sites + if (leaveIndex + 1 > stations.size - 1) { + CallerLogger.e(SceneConstant.M_BUS_P, "行程日志-mismatch condition1.") + return null + } + val currentStation = stations[leaveIndex] + val nextStation = stations[leaveIndex + 1] + val parameters = AutopilotControlParameters() + parameters.routeID = busRoutesResult.lineId + parameters.routeName = busRoutesResult.name + parameters.startName = PinYinUtil.getPinYinHeadChar(currentStation.name) + parameters.endName = PinYinUtil.getPinYinHeadChar(nextStation.name) + parameters.startLatLon = + AutopilotControlParameters.AutoPilotLonLat(currentStation.lat, currentStation.lon) + parameters.endLatLon = + AutopilotControlParameters.AutoPilotLonLat(nextStation.lat, nextStation.lon) + parameters.vehicleType = 10 + if (parameters.autoPilotLine == null) { + parameters.autoPilotLine = AutopilotControlParameters.AutoPilotLine( + busRoutesResult.lineId.toLong(), busRoutesResult.name, + busRoutesResult.csvFileUrl, busRoutesResult.csvFileMd5, + busRoutesResult.txtFileUrl, busRoutesResult.txtFileMd5, + busRoutesResult.contrailSaveTime, busRoutesResult.carModel, + busRoutesResult.csvFileUrlDPQP, busRoutesResult.csvFileMd5DPQP, + busRoutesResult.txtFileUrlDPQP, busRoutesResult.txtFileMd5DPQP, + busRoutesResult.contrailSaveTimeDPQP + ) + } + return parameters + } + + fun clearAutopilotControlParameters() { + CallerLogger.d(SceneConstant.M_BUS_P, "AutopilotControlParameters is clear.") + CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(null) + } + + fun startStationVideo(startStationInfo: BusStationBean){ + val introductionList = mutableListOf() + startStationInfo.videoList?.forEach { + if(it.type==1) { + introductionList.add( + MediaItem( + MediaItem.PrioritySite, it.url, + MediaItem.MEDIA_TYPE_VIDEO,"","") + ) + } + } + MediaManager.postSiteIntroduceInfo(introductionList) + } + + fun setTrajectoryStation( + startStationInfo: BusStationBean, + endStationInfo: BusStationBean, + lineId: Int + ) { + val startStation = MogoLocation() + startStation.longitude = startStationInfo.gcjLon + startStation.latitude = startStationInfo.gcjLat + val endStation = MogoLocation() + endStation.longitude = endStationInfo.gcjLon + endStation.latitude = endStationInfo.gcjLat + TrajectoryAndDistanceManager.setStationPoint(startStation, endStation, lineId.toLong()) + } + + fun cleanStation(type: String) { + d(SceneConstant.M_BUS_P, "清理站点:$type") + TrajectoryAndDistanceManager.setStationPoint(null, null, -1L) + } + + + fun updateSpeed(mogoLocation: MogoLocation) { + // km/h + val speedKM = (abs(mogoLocation.gnssSpeed) * 3.6f).toInt() + + mCommonCallback?.updateSpeed(speedKM) + } } \ No newline at end of file diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/LineModel.kt b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/LineModel.kt deleted file mode 100644 index 9c6629570a..0000000000 --- a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/LineModel.kt +++ /dev/null @@ -1,346 +0,0 @@ -package com.mogo.och.shuttle.weaknet.passenger.model - -import android.annotation.SuppressLint -import android.content.Context -import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters -import com.mogo.eagle.core.data.config.FunctionBuildConfig -import com.mogo.eagle.core.data.map.MogoLocation -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener -import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant -import com.mogo.eagle.core.utilcode.util.GsonUtils -import com.mogo.eagle.core.utilcode.util.StringUtils -import com.mogo.och.common.module.biz.lansocket.LoginLanPassengerSocket -import com.mogo.och.common.module.biz.media.MediaManager -import com.mogo.och.common.module.manager.autopilot.autopilot.IOchAutopilotStatusListener -import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotStatusListenerManager -import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager -import com.mogo.och.common.module.manager.distance.IDistanceListener -import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager -import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener -import com.mogo.och.common.module.manager.socket.lan.LanSocketManager -import com.mogo.och.common.module.manager.socket.lan.bean.BusinessType -import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType -import com.mogo.och.common.module.manager.socket.lan.bean.TaskDetailsMsg -import com.mogo.och.common.module.utils.PinYinUtil -import com.mogo.och.common.module.voice.VoiceNotice.showNotice -import com.mogo.och.common.module.wigets.media.MediaItem -import com.mogo.och.data.bean.BusRoutesResult -import com.mogo.och.data.bean.BusStationBean -import com.mogo.och.data.bean.BusTransferData -import com.mogo.och.shuttle.weaknet.passenger.callback.AutoPilotStatusCallback -import com.mogo.och.shuttle.weaknet.passenger.callback.DrivingInfoCallback -import com.mogo.och.shuttle.weaknet.passenger.constant.BusPassengerConst -import kotlin.math.abs - -/** - * @author: wangmingjun - * @date: 2023/1/31 - */ -@SuppressLint("StaticFieldLeak") -object LineModel:CommonModel(){ - - private var mContext: Context? = null - - private var routesResult: BusRoutesResult? = null - private val TAG: String = LineModel::class.java.simpleName - - var mStations = mutableListOf() - private var mNextStationIndex = 0 // A-B要到达站的index - private var isGoingToNextStation = false //是否前往下一站过程中 - - private var mDrivingInfoCallback: DrivingInfoCallback? = null //行程信息 - private var mAutoStatusCallback: AutoPilotStatusCallback? = null //自动驾驶状态 - - fun init(context: Context) { - mContext = context - initListener() - queryDriverByLocalDriver() - } - - - - private fun initListener() { - //自动驾驶状态监听 - OchAutoPilotStatusListenerManager.addListener(TAG, mAutoPilotStatusListener) - - // 定位监听 - OchLocationManager.addGCJ02Listener(TAG, 3, mMapLocationListener) - // 监听站点距离 - TrajectoryAndDistanceManager.addDistanceListener(TAG, trajectoryListener) - // 通用监听 - LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_COMMON.type,LanSocketManager.commonListener) - // 监听站点信息 - LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_TASK_DETAILS.type,typeTaskDetails) - - LoginLanPassengerSocket.addListener(TAG, connectDriverListener) - - } - - fun releaseListener() { - //自动驾驶状态监听 - CallerAutoPilotStatusListenerManager.removeListener(TAG) - - // 定位监听 - OchLocationManager.removeGCJ02Listener(TAG) - // 监听站点距离 - cleanStation("release") - - TrajectoryAndDistanceManager.removeListener(TAG) - - LanSocketManager.unRegisterSocketMessageListener(DPMsgType.TYPE_COMMON.type,LanSocketManager.commonListener) - LanSocketManager.unRegisterSocketMessageListener(DPMsgType.TYPE_TASK_DETAILS.type,typeTaskDetails) - - LoginLanPassengerSocket.removeListener(TAG) - - } - - fun setDrivingInfoCallback(drivingInfoCallback : DrivingInfoCallback?){ - mDrivingInfoCallback = drivingInfoCallback - } - - fun setAutoStatusCallback(autoPilotStatusCallback: AutoPilotStatusCallback?){ - mAutoStatusCallback = autoPilotStatusCallback - } - - private val typeTaskDetails = object : ILanMessageListener { - override fun targetLan(): Class { - return TaskDetailsMsg::class.java - } - - override fun onLanMsgReceived(first: TaskDetailsMsg?) { - first?.let { - - if (first.msg?.isEmpty() == true) { - updateLocalOrder() - return - } - val result = GsonUtils.fromJson(first.msg, BusTransferData::class.java) - if (result != null && result.routesResult == null){ - updateLocalOrder() - } - - if (result != null) { - routesResult = result.routesResult - updatePassengerRouteInfo(routesResult!!) - } - } - } - } - - private val trajectoryListener: IDistanceListener = object : IDistanceListener { - override fun distanceCallback(distance: Float) { - val lastTime = distance / BusPassengerConst.BUS_AVERAGE_SPEED * 3.6 //秒 - d(SceneConstant.M_BUS_P + TAG, "轨迹排查==lastSumLength = $distance") - if (routesResult != null) { - for (site in routesResult!!.sites) { - if (site.drivingStatus == BusPassengerConst.STATION_STATUS_STOPPED && !site.isLeaving) { - return - } - } - } - // 小于200m 播报站点介绍 - if (distance < 200) { - val stationNext = mStations[mNextStationIndex] - if (!stationNext.isPlayTts) { - if (!StringUtils.isEmpty(stationNext.introduction)) { - showNotice(stationNext.introduction) - stationNext.isPlayTts = true - } - } - } - mDrivingInfoCallback?.updateRemainMT( - distance.toLong(), - lastTime.toLong() - ) - } - } - - private val mMapLocationListener: IMoGoChassisLocationGCJ02Listener = - object : IMoGoChassisLocationGCJ02Listener{ - override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { - if (null == mogoLocation) return - updateSpeed(mogoLocation) - } - } - - private fun updateSpeed(mogoLocation: MogoLocation) { - // km/h - val speedKM = (abs(mogoLocation.gnssSpeed) * 3.6f).toInt() - - mDrivingInfoCallback?.updateSpeed(speedKM) - } - - private val mAutoPilotStatusListener: IOchAutopilotStatusListener = - object : IOchAutopilotStatusListener { - - override fun onAutopilotStatusResponse(state: Int) { - super.onAutopilotStatusResponse(state) - d(SceneConstant.M_BUS_P+ TAG, "onAutopilotStatusResponse ===== $state") - if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING != state){ - //美化模式下且行程中 - if (FunctionBuildConfig.isDemoMode && - mNextStationIndex>= 0 && mNextStationIndex <= mStations.size - 1 - && isGoingToNextStation){ - mAutoStatusCallback?.updateAutoStatus(true) - }else{//非美化模式下 - mAutoStatusCallback?.updateAutoStatus(false) - } - }else{//自驾状态 2 - mAutoStatusCallback?.updateAutoStatus(true) - } - } - - } - - - private fun updateLocalOrder(){ - routesResult = null - mNextStationIndex = 0 - cleanStation("queryDriverSiteByCoordinate") - isGoingToNextStation = false - mDrivingInfoCallback?.showNoTaskView(true) - } - - private fun updatePassengerRouteInfo(result: BusRoutesResult) { - if (routesResult != null && routesResult!!.lineId != result.lineId){ - d(SceneConstant.M_BUS_P+ TAG, "lineId change= clearCustomPolyline") - mDrivingInfoCallback?.clearCustomPolyline() - } - - d(SceneConstant.M_BUS_P+ TAG, "queryDriverSiteByCoordinate= update") - routesResult = result - - mDrivingInfoCallback?.updateLine(result.name) - if (result.sites != null) { - mDrivingInfoCallback?.showNoTaskView(false) - val stations: List = result.sites - mStations.clear() - mStations.addAll(stations) - mDrivingInfoCallback?.updateLineStations(mStations) - for (i in stations.indices) { - val station: BusStationBean = stations[i] - if (station.drivingStatus == BusPassengerConst.STATION_STATUS_STOPPED - && station.isLeaving && i + 1 < stations.size) { - mDrivingInfoCallback?.updateStationsInfo(stations as MutableList, i + 1, false) - d(SceneConstant.M_BUS_P+ TAG,"och-rotting--mNextStationIndex = $mNextStationIndex , i = $i") - d(SceneConstant.M_BUS_P+ TAG,"och-rotting--start ") - isGoingToNextStation = true - mNextStationIndex = i + 1 - val startStation = mStations[i] - val endStation = mStations[i + 1] - startStationVideo(endStation) - setTrajectoryStation(startStation, endStation, result.lineId) - updateAutopilotControlParameters(result,i) - return - } else if (station.drivingStatus == BusPassengerConst.STATION_STATUS_STOPPED && !station.isLeaving) { - d(SceneConstant.M_BUS_P+ TAG,"och-rotting--mNextStationIndex = $mNextStationIndex , i = $i") - d(SceneConstant.M_BUS_P+ TAG,"och-rotting--arrived ") - if (i == stations.size - 1) { - cleanStation("updatePassengerRouteInfo最后一个站点") - } - isGoingToNextStation = false - mDrivingInfoCallback?.updateStationsInfo(stations as MutableList, i, true) - clearAutopilotControlParameters() - return - }else{ -// d(SceneConstant.M_BUS_P+TAG,"och-rotting--BusStationBean = " + GsonUtils.toJson(station)) - } - } - } - - } - - private fun setTrajectoryStation( - startStationInfo: BusStationBean, - endStationInfo: BusStationBean, - lineId: Int - ) { - val startStation = MogoLocation() - startStation.longitude = startStationInfo.gcjLon - startStation.latitude = startStationInfo.gcjLat - val endStation = MogoLocation() - endStation.longitude = endStationInfo.gcjLon - endStation.latitude = endStationInfo.gcjLat - TrajectoryAndDistanceManager.setStationPoint(startStation, endStation, lineId.toLong()) - } - - private fun startStationVideo(startStationInfo: BusStationBean){ - val introductionList = mutableListOf() - startStationInfo.videoList?.forEach { - if(it.type==1) { - introductionList.add( - MediaItem( - MediaItem.PrioritySite, it.url, - MediaItem.MEDIA_TYPE_VIDEO,"","") - ) - } - } - MediaManager.postSiteIntroduceInfo(introductionList) - } - - private fun cleanStation(type: String) { - d(SceneConstant.M_BUS_P + TAG, "清理站点:$type") - TrajectoryAndDistanceManager.setStationPoint(null, null, -1L) - } - - private fun updateAutopilotControlParameters( - busRoutesResult: BusRoutesResult, - leaveIndex: Int - ) { - val parameters = initAutopilotControlParameters(busRoutesResult, leaveIndex) - if (null == parameters) { - CallerLogger.e(SceneConstant.M_BUS_P + TAG, "AutopilotControlParameters is empty.") - return - } - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "AutopilotControlParameters is update.") - CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(parameters) - } - - private fun initAutopilotControlParameters( - busRoutesResult: BusRoutesResult, - leaveIndex: Int - ): AutopilotControlParameters? { - if (busRoutesResult.sites == null) { - return null - } - val stations = busRoutesResult.sites - if (leaveIndex + 1 > stations.size - 1) { - CallerLogger.e(SceneConstant.M_BUS_P + TAG, "行程日志-mismatch condition1.") - return null - } - val currentStation = stations[leaveIndex] - val nextStation = stations[leaveIndex + 1] - val parameters = AutopilotControlParameters() - parameters.routeID = busRoutesResult.lineId - parameters.routeName = busRoutesResult.name - parameters.startName = PinYinUtil.getPinYinHeadChar(currentStation.name) - parameters.endName = PinYinUtil.getPinYinHeadChar(nextStation.name) - parameters.startLatLon = - AutopilotControlParameters.AutoPilotLonLat(currentStation.lat, currentStation.lon) - parameters.endLatLon = - AutopilotControlParameters.AutoPilotLonLat(nextStation.lat, nextStation.lon) - parameters.vehicleType = 10 - if (parameters.autoPilotLine == null) { - parameters.autoPilotLine = AutopilotControlParameters.AutoPilotLine( - busRoutesResult.lineId.toLong(), busRoutesResult.name, - busRoutesResult.csvFileUrl, busRoutesResult.csvFileMd5, - busRoutesResult.txtFileUrl, busRoutesResult.txtFileMd5, - busRoutesResult.contrailSaveTime, busRoutesResult.carModel, - busRoutesResult.csvFileUrlDPQP, busRoutesResult.csvFileMd5DPQP, - busRoutesResult.txtFileUrlDPQP, busRoutesResult.txtFileMd5DPQP, - busRoutesResult.contrailSaveTimeDPQP - ) - } - return parameters - } - - - private fun clearAutopilotControlParameters() { - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "AutopilotControlParameters is clear.") - CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(null) - } -} \ No newline at end of file diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/TicketModel.kt b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/TicketModel.kt index 3b1e34943d..d7a9951f55 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/TicketModel.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/TicketModel.kt @@ -1,35 +1,143 @@ package com.mogo.och.shuttle.weaknet.passenger.model -import com.mogo.commons.AbsMogoApplication +import android.annotation.SuppressLint +import android.bluetooth.BluetoothDevice 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.eagle.core.utilcode.util.RegexUtils -import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffMsg +import com.mogo.och.common.module.manager.bluetooth.BleDevItem +import com.mogo.och.common.module.manager.bluetooth.BleManager +import com.mogo.och.common.module.manager.bluetooth.BleManager.BleDevListener +import com.mogo.och.common.module.manager.bluetooth.OchBluetoothGattCallback.ConnectListener +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.manager.socket.lan.LanSocketManager -import com.mogo.och.common.module.network.OchCommonServiceCallback -import com.mogo.och.shuttle.weaknet.passenger.bean.request.PassengerWriteOffRequest -import com.mogo.och.shuttle.weaknet.passenger.bean.response.PassengerWriteOffResponse import com.mogo.och.common.module.manager.scnner.ScannerManager import com.mogo.och.common.module.manager.scnner.StateChangeListener -import com.mogo.och.shuttle.weaknet.passenger.network.PassengerServiceManager +import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener +import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType +import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffDetialMsg +import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffResultMsg +import com.mogo.och.common.module.utils.RxUtils +import java.net.URLDecoder object TicketModel : StateChangeListener { private const val TAG = "TicketModel" - init { - ScannerManager.addStateChangeListener(TAG, this) + // 等待链接 + private val waitConnectDev = mutableListOf() + private val waitConnectDevNameList = mutableListOf() + + private val connectListener: ConnectListener = object : ConnectListener { + override fun sendDataSuccessAndCloseListener(device: BluetoothDevice) { + waitConnectDev.forEach { + if(it.dev==device){ + waitConnectDev.remove(it) + return + } + } + } } + init { + + } + + private val writeOffResultMsg = object : ILanMessageListener { + override fun targetLan(): Class = WriteOffResultMsg::class.java + + override fun onLanMsgReceived(obj: WriteOffResultMsg?) { + findDeviceConnectAndSendData(obj,1) + } + } + @SuppressLint("MissingPermission") + private fun findDeviceConnectAndSendData(obj: WriteOffResultMsg?,count:Int){ + OchChainLogManager.writeChainLogWriteOff("司机端核销成功","去连接蓝牙并发送数据 次数:${count}") + // 收到核销结果扫描蓝牙并写会核销结果 + obj?.phone?.let {phone-> + var haveDevices = false + var tempRemove:BleDevItem?=null + waitConnectDev.forEach { + if(it.dev.name == getBleName(phone)){ + haveDevices = true + OchChainLogManager.writeChainLogWriteOff("司机端核销结果","${obj}_找到设备dev.name:${it.dev.name}${getBleName(phone)}") + when (obj.code) { + 99 -> { + it.gattcallback.connectGatt("99",obj.businessTime) + } + 0 -> { + it.gattcallback.connectGatt("00",obj.businessTime) + } + else -> { + it.gattcallback.connectGatt("01",obj.businessTime) + } + } + + it.gattcallback.connectListener = connectListener + tempRemove = it + return@forEach + } + } + waitConnectDev.remove(tempRemove) + if(!haveDevices&&count<6){ + RxUtils.createSubscribe { + // 没有找到设备重试5次 + OchChainLogManager.writeChainLogWriteOff("司机端核销成功","2s后重试") + findDeviceConnectAndSendData(obj,count+1) + } + } + } + } + + private val bleDevs = object : BleDevListener{ + @SuppressLint("MissingPermission") + @Synchronized + override fun dataChange(scanList: MutableList) { + val tempList = mutableListOf() + waitConnectDevNameList.forEach { waitConnectName-> + scanList.forEach { + if(it.dev.name==waitConnectName){ + waitConnectDev.add(it) + tempList.add(waitConnectName) + } + } + } + waitConnectDevNameList.removeAll(tempList) + } + } + + fun load(){ + OchChainLogManager.writeChainLogInit("初始化信息","核销功能初始化") + ScannerManager.addStateChangeListener(TAG, this) + // 核销信息 + LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_WRITEOFF_INFO_RESULT.type,writeOffResultMsg) + BleManager.listener = bleDevs + } + fun release(){ + ScannerManager.removeListener(TAG) + LanSocketManager.unRegisterSocketMessageListener(DPMsgType.TYPE_WRITEOFF_INFO_RESULT.type,writeOffResultMsg) + BleManager.listener = null } - override fun parseData(params: MutableMap, payload: String?) { + override fun parseData(params: MutableMap, payload: String?) { + val expiryTime = params["expiryTime"] + val bookingTime = params["bookingTime"] + val lineId = params["lineId"] + val availableTimes = params["availableTimes"] val orderNo = params["orderNo"] val uid = params["uid"] val phone = params["phone"] + val ticketSize = params["ticketSize"] + val ticketName = params["ticketName"] + val type = params["type"] + val pipe = params["pipe"] + val startStationId = params["startStationId"] + val tenantId = params["tenantId"] + if(orderNo is String && uid is String){ var phoneNum = "" if(phone is String){ @@ -37,99 +145,67 @@ object TicketModel : StateChangeListener { phoneNum = phone } } - writeOffTicket(orderNo,uid,phoneNum) + try { + val writeOffDetail = WriteOffDetialMsg(0,"", + expiryTime?.toLong()?:0, + bookingTime?.toLong()?:0, + lineId?.toLong()?:0, + availableTimes?.toInt()?:0, + orderNo, + uid, + phoneNum, + ticketSize?.toInt()?:0, + URLDecoder.decode(ticketName,"UTF-8"), + type, + pipe, + startStationId?.toLong()?:0, + tenantId?.toLong()?:0 + ) + CallerLogger.d(M_BUS_P + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(writeOffDetail)) + LanSocketManager.sendMsgToServer(writeOffDetail) + addWaitConnectDevName(phone) + scanBle() + }catch (e:Exception){ + e.printStackTrace() + CallerLogger.d(M_BUS_P + TAG, "") + // 通知司机屏二维码错误 + val writeOffDetail = WriteOffDetialMsg(code = 3001, msg = "参数错误:${payload}") + CallerLogger.d(M_BUS_P + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(writeOffDetail)) + LanSocketManager.sendMsgToServer(writeOffDetail) + } }else{ // 通知司机屏二维码错误 - sendMessage2Driver("参数错误:${payload}","") + val writeOffDetail = WriteOffDetialMsg(code = 3001, msg = "参数错误:${payload}") + CallerLogger.d(M_BUS_P + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(writeOffDetail)) + LanSocketManager.sendMsgToServer(writeOffDetail) } } - private fun writeOffTicket(orderNo: String, uid: String, phoneNum: 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) - sendMessage2DriverSuccess(data.data,orderNo) - } + private fun addWaitConnectDevName(phone: String?) { + var tempPhone = phone + tempPhone?.let { + waitConnectDevNameList.add( getBleName(it)) + } - override fun onFail(code: Int, msg: String?) { - CallerLogger.d(M_BUS_P + TAG, "核销失败 ${code}-----${msg}") + } - when (code) { - 6002 -> { - sendMessage2Driver("同一订单核销间隔时间需大于2分钟",phoneNum) - } - 1009 -> { - sendMessage2Driver("车票所选乘车日期非今日",phoneNum) - } - 1005 -> { - sendMessage2Driver("车辆未登录、或没有任务",phoneNum) - } - 1006 -> { - sendMessage2Driver("车票路线信息与当前车辆执行任务的路线信息不符合",phoneNum) - } - 1008 -> { - sendMessage2Driver("车票剩余可用次数为0",phoneNum) - } - 6001 -> { - sendMessage2Driver("二维码已过期",phoneNum) - } - 1012 -> { - sendMessage2Driver("当前用户下单路线非当前的车辆所属公司",phoneNum) - } - else -> { - when (msg) { - "6002" -> { - sendMessage2Driver("同一订单核销间隔时间需大于2分钟",phoneNum) - } - "1009" -> { - sendMessage2Driver("车票所选乘车日期非今日",phoneNum) - } - "1005" -> { - sendMessage2Driver("车辆未登录、或没有任务",phoneNum) - } - "1006" -> { - sendMessage2Driver("车票路线信息与当前车辆执行任务的路线信息不符合",phoneNum) - } - "1008" -> { - sendMessage2Driver("车票剩余可用次数为0",phoneNum) - } - "6001" -> { - sendMessage2Driver("二维码已过期",phoneNum) - } - "1012" -> { - sendMessage2Driver("当前用户下单路线非当前的车辆所属公司",phoneNum) - } - else -> { - sendMessage2Driver(msg?:"",phoneNum) - } - } - } - } - } - - override fun onError(message: String) { - sendMessage2Driver("网络错误",phoneNum) - } + fun getBleName(phone: String):String{ + var tempPhone = phone + tempPhone.let { + if (it.length > 8) { + //截取电话号码前三位 + val phoneNumPre = it.substring(0, 3) + //截取电话号码后四位 + val phoneNumFix = it.substring(7) + tempPhone = "${phoneNumPre}$phoneNumFix" } - ) + } + return tempPhone } - private fun sendMessage2Driver(message:String,phone:String){ - val msg = WriteOffMsg(false, phone, 0, "", "验票失败,${message}","") - CallerLogger.d(M_BUS_P + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(msg)) - LanSocketManager.sendMsgToServer(msg) + private fun scanBle() { + BizLoopManager.runInMainThread{ + BleManager.scanLeDevice() + } } - private fun sendMessage2DriverSuccess(message: PassengerWriteOffResponse.Result, orderNo: String){ - val msg = WriteOffMsg(true, message.phone, message.ticketSize, message.ticketName, "",orderNo) - CallerLogger.d(M_BUS_P + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(msg)) - LanSocketManager.sendMsgToServer(msg) - } - - } \ No newline at end of file diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/network/PassengerServiceManager.kt b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/network/PassengerServiceManager.kt index c6bd01848c..5f6e5c705c 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/network/PassengerServiceManager.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/network/PassengerServiceManager.kt @@ -2,22 +2,13 @@ package com.mogo.och.shuttle.weaknet.passenger.network import android.content.Context import com.mogo.cloud.passport.MoGoAiCloudClientConfig -import com.mogo.commons.env.ProjectUtils 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.lansocket.LoginLanPassengerSocket import com.mogo.och.common.module.constant.OchCommonConst -import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.network.OchCommonSubscribeImpl import com.mogo.och.common.module.network.interceptor.transformTry -import com.mogo.och.shuttle.weaknet.passenger.bean.request.PassengerQueryLineRequest -import com.mogo.och.shuttle.weaknet.passenger.bean.request.PassengerWriteOffRequest -import com.mogo.och.shuttle.weaknet.passenger.bean.response.PassengerOperationStatusResponse -import com.mogo.och.shuttle.weaknet.passenger.bean.response.PassengerRoutesResponse -import com.mogo.och.shuttle.weaknet.passenger.bean.response.PassengerWriteOffResponse import com.mogo.och.shuttle.weaknet.passenger.bean.response.ResponseSiteIntroduce /** @@ -32,43 +23,7 @@ object PassengerServiceManager { ServiceApi::class.java) /** - * 查询司机端出车收车状态,以及车牌号 - * @param context - * @param callback - */ - @JvmStatic - fun writeOffTicket( - context: Context, - ticketInfo: PassengerWriteOffRequest, - callback: OchCommonServiceCallback?, - ) { - ticketInfo.sn = LoginLanPassengerSocket.driverSn - if(StringUtils.isEmpty(LoginLanPassengerSocket.driverSn)){ - ToastUtils.showShort("请链接司机屏${ticketInfo.uid}") - OchChainLogManager.writeChainLogScanner(TAG +"onError","无司机屏sn请处理") - return - } - if(ProjectUtils.isSaas()) { - mShuttleBusPassengerServiceApi.saaswriteOffTicket( - MoGoAiCloudClientConfig.getInstance().serviceAppId, - SharedPrefsMgr.getInstance().token, - ticketInfo - ) - .transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "writeOff")) - }else if(ProjectUtils.isDali()) { - mShuttleBusPassengerServiceApi.daliwriteOffTicket( - MoGoAiCloudClientConfig.getInstance().serviceAppId, - SharedPrefsMgr.getInstance().token, - ticketInfo - ) - .transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "writeOff")) - } - } - - /** - * 查询绑定行驶的小巴车路线 + * 查询绑定行驶的小巴车路线包含站点的站点广告 * @param context * @param callback */ diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/network/ServiceApi.java b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/network/ServiceApi.java index 75d010abc4..b4cba989a0 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/network/ServiceApi.java +++ b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/network/ServiceApi.java @@ -19,19 +19,7 @@ import retrofit2.http.Query; */ public interface ServiceApi { - /** - * 核销接口 - */ - @Headers({"Content-type:application/json;charset=UTF-8"}) - @POST("/och-vehicle/api/scanner/device/writeOff") - Observable daliwriteOffTicket(@Header ("appId") String appId, @Header("ticket") String ticket, @Body PassengerWriteOffRequest request); - /** - * 核销接口 - */ - @Headers({"Content-type:application/json;charset=UTF-8"}) - @POST("/och-vehicle/api/car/v2/device/writeOff") - Observable saaswriteOffTicket(@Header ("appId") String appId, @Header("ticket") String ticket, @Body PassengerWriteOffRequest request); /** * 查询车辆对应站点的所有视频介绍视频 diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/callback/IBusPassegerDriverStatusCallback.java b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/callback/IBusPassegerDriverStatusCallback.java deleted file mode 100644 index ec1a0ebc5f..0000000000 --- a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/callback/IBusPassegerDriverStatusCallback.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.mogo.och.shuttle.weaknet.passenger.callback; - -/** - * @author: wangmingjun - * @date: 2021/10/22 - */ -public interface IBusPassegerDriverStatusCallback { - void changeOperationStatus(boolean changeStatus); -} diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/callback/IBusPassengerADASStatusCallback.java b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/callback/IBusPassengerADASStatusCallback.java deleted file mode 100644 index f68f593932..0000000000 --- a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/callback/IBusPassengerADASStatusCallback.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.mogo.och.shuttle.weaknet.passenger.callback; - -/** - * Created on 2022/3/31 - * - * Model->Presenter回调:ADAS相关(自动驾驶状态回调,到达终点等等) - */ -public interface IBusPassengerADASStatusCallback { - - // 自动驾驶可用状态 - void onAutopilotEnable(); - - // 自动驾驶不可用状态 - void onAutopilotDisable(); - - // 自动驾驶运行中 - void onAutopilotRunning(); -} diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/callback/IBusPassengerAutopilotPlanningCallback.java b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/callback/IBusPassengerAutopilotPlanningCallback.java deleted file mode 100644 index 2bf2d2ea0e..0000000000 --- a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/callback/IBusPassengerAutopilotPlanningCallback.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.mogo.och.shuttle.weaknet.passenger.callback; - -/** - * Created on 2022/3/31 - */ -public interface IBusPassengerAutopilotPlanningCallback { - void routePlanningToNextStationChanged(long meters, long timeInSecond); - -} diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/callback/IBusPassengerControllerStatusCallback.java b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/callback/IBusPassengerControllerStatusCallback.java deleted file mode 100644 index 08c3b3344a..0000000000 --- a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/callback/IBusPassengerControllerStatusCallback.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.mogo.och.shuttle.weaknet.passenger.callback; - -import com.mogo.eagle.core.data.map.MogoLocation; - -/** - * Created on 2022/3/31 - * - * Model->Presenter回调:状态控制器监听(accOn、adas ui show、voice ui show、push ui show、v2x ui show等等) - */ -public interface IBusPassengerControllerStatusCallback { - // 自车定位 - void onCarLocationChanged(MogoLocation location); -} diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/callback/IBusPassengerRouteLineInfoCallback.java b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/callback/IBusPassengerRouteLineInfoCallback.java deleted file mode 100644 index ebe945edfe..0000000000 --- a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/callback/IBusPassengerRouteLineInfoCallback.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.mogo.och.shuttle.weaknet.passenger.callback; - -import com.mogo.och.data.bean.BusStationBean; - -import java.util.List; - -/** - * @author: wangmingjun - * @date: 2022/4/6 - */ -public interface IBusPassengerRouteLineInfoCallback { - void updateLineInfo(String lineName); - void updateStationsInfo(List stations, int currentStationIndex, boolean isArrived); - void showNoTaskView(); - void hideNoTaskView(); -} diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/model/BusPassengerModel.kt b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/model/BusPassengerModel.kt deleted file mode 100644 index e52ac3a4c6..0000000000 --- a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/model/BusPassengerModel.kt +++ /dev/null @@ -1,390 +0,0 @@ -package com.mogo.och.shuttle.weaknet.passenger.model - -import android.annotation.SuppressLint -import android.content.Context -import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager -import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters -import com.mogo.eagle.core.data.config.FunctionBuildConfig -import com.mogo.eagle.core.data.map.MogoLocation -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener -import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d -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.util.GsonUtils -import com.mogo.eagle.core.utilcode.util.StringUtils -import com.mogo.och.common.module.biz.lansocket.IOchLanPassengerStatusListener -import com.mogo.och.common.module.biz.lansocket.LoginLanPassengerSocket -import com.mogo.och.common.module.biz.media.MediaManager -import com.mogo.och.common.module.manager.autopilot.autopilot.IOchAutopilotStatusListener -import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotStatusListenerManager -import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager -import com.mogo.och.common.module.manager.distance.IDistanceListener -import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager -import com.mogo.och.common.module.manager.socket.cloud.AbnormalFactorsLoopManager -import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager -import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener -import com.mogo.och.common.module.manager.socket.lan.LanSocketManager -import com.mogo.och.common.module.manager.socket.lan.bean.AppConnectMsg -import com.mogo.och.common.module.manager.socket.lan.bean.BusinessType -import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType -import com.mogo.och.common.module.manager.socket.lan.bean.TaskDetailsMsg -import com.mogo.och.common.module.utils.DateTimeUtil -import com.mogo.och.common.module.utils.PinYinUtil -import com.mogo.och.common.module.voice.VoiceNotice.showNotice -import com.mogo.och.common.module.wigets.media.MediaItem -import com.mogo.och.data.bean.BusRoutesResult -import com.mogo.och.data.bean.BusStationBean -import com.mogo.och.data.bean.BusTransferData -import com.mogo.och.shuttle.weaknet.passenger.callback.IBusPassegerDriverStatusCallback -import com.mogo.och.shuttle.weaknet.passenger.callback.IBusPassengerADASStatusCallback -import com.mogo.och.shuttle.weaknet.passenger.callback.IBusPassengerAutopilotPlanningCallback -import com.mogo.och.shuttle.weaknet.passenger.callback.IBusPassengerControllerStatusCallback -import com.mogo.och.shuttle.weaknet.passenger.callback.IBusPassengerRouteLineInfoCallback -import com.mogo.och.shuttle.weaknet.passenger.constant.BusPassengerConst -import java.util.concurrent.ConcurrentHashMap - -/** - * Created on 2022/3/31 - */ -@SuppressLint("StaticFieldLeak") -object BusPassengerModel :CommonModel(){ - private val TAG: String = BusPassengerModel::class.java.simpleName - private var mContext: Context? = null - private var mADASStatusCallback: IBusPassengerADASStatusCallback? = null //Model->Presenter:自动驾驶状态相关 - private var mAutopilotPlanningCallback: IBusPassengerAutopilotPlanningCallback? = null //Model->Presenter:自动驾驶线路规划 - private val mControllerStatusCallbackMap: MutableMap = ConcurrentHashMap() - - private var mDriverStatusCallback: IBusPassegerDriverStatusCallback? = null //出车收车状态 - private var mRouteLineInfoCallback: IBusPassengerRouteLineInfoCallback? = null // bus路线信息更新 - - private var routesResult: BusRoutesResult? = null - - var mStations: MutableList = ArrayList() - private var mNextStationIndex = 0 // 要到达站的index - - @Volatile - private var isGoingToNextStation = false - - fun init(context: Context) { - mContext = context.applicationContext - initListeners() - queryDriverByLocalDriver() - } - - fun setDriverStatusCallback(callback: IBusPassegerDriverStatusCallback?) { - this.mDriverStatusCallback = callback - } - - fun setRouteLineInfoCallback(callback: IBusPassengerRouteLineInfoCallback?) { - this.mRouteLineInfoCallback = callback - } - - fun setMoGoAutopilotPlanningListener(moGoAutopilotPlanningCallback: IBusPassengerAutopilotPlanningCallback?) { - this.mAutopilotPlanningCallback = moGoAutopilotPlanningCallback - } - - fun setADASStatusCallback(callback: IBusPassengerADASStatusCallback?) { - this.mADASStatusCallback = callback - } - - fun setControllerStatusCallback( - tag: String?, - callback: IBusPassengerControllerStatusCallback? - ) { - if (tag == null || "" == tag) return - if (callback == null) { - mControllerStatusCallbackMap.remove(tag) - return - } - mControllerStatusCallbackMap[tag] = callback - } - - - private fun clearLocalRouteResult() { - if (routesResult != null) { - routesResult = null - } - mNextStationIndex = 0 - cleanStation("queryDriverSiteByCoordinate") - if (mRouteLineInfoCallback != null) { - mRouteLineInfoCallback!!.showNoTaskView() - } - } - - private fun updatePassengerRouteInfo(result: BusRoutesResult?) { - if (result == null) { - clearLocalRouteResult() - return - } - d(SceneConstant.M_BUS_P + TAG, "queryDriverSiteByCoordinate = update") - routesResult = result - - if (mRouteLineInfoCallback != null) { - mRouteLineInfoCallback!!.updateLineInfo(result.name) - mRouteLineInfoCallback!!.hideNoTaskView() - if (result.sites != null) { - val stations = result.sites - mStations.clear() - mStations.addAll(stations) - for (i in stations.indices) { - val station = stations[i] - if (station.drivingStatus == BusPassengerConst.STATION_STATUS_STOPPED && station.isLeaving && i + 1 < stations.size) { - Logger.d(SceneConstant.M_BUS_P + TAG, "order = station= leave") - isGoingToNextStation = true - mRouteLineInfoCallback!!.updateStationsInfo(stations, i + 1, false) - mNextStationIndex = i + 1 - val startStation = mStations[i] - val endStation = mStations[i + 1] - startStationVideo(endStation) - setTrajectoryStation(startStation, endStation, result.lineId) - updateAutopilotControlParameters(result,i) - return - } else if (station.drivingStatus == BusPassengerConst.STATION_STATUS_STOPPED && !station.isLeaving) { - if (i == stations.size - 1) { - cleanStation("updatePassengerRouteInfo最后一个站点") - } - isGoingToNextStation = false - Logger.d(SceneConstant.M_BUS_P + TAG, "order = station= arrive") - mRouteLineInfoCallback!!.updateStationsInfo(stations, i, true) - clearAutopilotControlParameters() - return - } - } - } - } - } - - fun release() { - releaseListeners() - cleanStation("release") - } - - private fun initListeners() { - // 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口 - - OchAutoPilotStatusListenerManager.addListener(TAG, mGoAutopilotStatusListener) - OchLocationManager.addGCJ02Listener(TAG, 3, mMapLocationListener) - - // 通用监听 - LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_COMMON.type, commonListener) - // 监听站点信息 - LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_TASK_DETAILS.type, typeTaskDetails) - - AbnormalFactorsLoopManager.startLoopAbnormalFactors(mContext!!) - TrajectoryAndDistanceManager.addDistanceListener(TAG, trajectoryListener) - - LoginLanPassengerSocket.addListener(TAG,connectDriverListener) - } - - private fun releaseListeners() { - // 注销定位监听 - - OchLocationManager.removeGCJ02Listener(TAG) - - MogoAiCloudSocketManager.getInstance(mContext) - .unregisterLifecycleListener(10010) - - LanSocketManager.unRegisterSocketMessageListener(DPMsgType.TYPE_COMMON.type, commonListener) - LanSocketManager.unRegisterSocketMessageListener(DPMsgType.TYPE_TASK_DETAILS.type, typeTaskDetails) - - AbnormalFactorsLoopManager.stopLoopAbnormalFactors() - LoginLanPassengerSocket.removeListener(TAG) - } - - private val commonListener = object : ILanMessageListener { - override fun targetLan(): Class = AppConnectMsg::class.java - - override fun onLanMsgReceived(first: AppConnectMsg?) { - first?.let { - if (it.isViewShow) { //消息盒子显示内容 - OCHSocketMessageManager.pushAppOperationalMsgBox( - DateTimeUtil.getCurrentTimeStamp(), it.msg, - OCHSocketMessageManager.OPERATION_SYSTEM - ) - } - } - } - } - - private val typeTaskDetails = object : ILanMessageListener { - override fun targetLan(): Class = TaskDetailsMsg::class.java - - override fun onLanMsgReceived(first: TaskDetailsMsg?) { - first?.let { - if (first.msg!!.isEmpty()) { - clearLocalRouteResult() - return - } - val result = GsonUtils.fromJson(first.msg, BusTransferData::class.java) - - if (result != null && result.routesResult == null){ - clearLocalRouteResult() - } - - mDriverStatusCallback?.changeOperationStatus(result!!.loginStatus == 1) - if (result != null) { //已司机端传来的为准 - routesResult = result.routesResult - updatePassengerRouteInfo(routesResult) - } - } - } - } - - private val trajectoryListener: IDistanceListener = object : IDistanceListener { - override fun distanceCallback(distance: Float) { - val lastTime = distance / BusPassengerConst.BUS_AVERAGE_SPEED * 3.6 //秒 - d(SceneConstant.M_BUS_P + TAG, "轨迹排查==lastSumLength = $distance") - if (routesResult != null) { - for (site in routesResult!!.sites) { - if (site.drivingStatus == BusPassengerConst.STATION_STATUS_STOPPED && !site.isLeaving) { - return - } - } - } - // 小于200m 播报站点介绍 - if (distance < 200) { - val stationNext = mStations[mNextStationIndex] - if (!stationNext.isPlayTts) { - if (!StringUtils.isEmpty(stationNext.introduction)) { - showNotice(stationNext.introduction) - stationNext.isPlayTts = true - } - } - } - mAutopilotPlanningCallback!!.routePlanningToNextStationChanged( - distance.toLong(), lastTime.toLong() - ) - } - } - - private val mMapLocationListener: IMoGoChassisLocationGCJ02Listener = - object : IMoGoChassisLocationGCJ02Listener { - override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { - if (null == mogoLocation) return - for (callback in mControllerStatusCallbackMap.values) { - callback.onCarLocationChanged(mogoLocation) - } - } - } - - private val mGoAutopilotStatusListener: IOchAutopilotStatusListener = - object : IOchAutopilotStatusListener { - override fun onAutopilotStatusResponse(state: Int) { - if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { - //2022.7.20 自动驾驶更换成带档位的 - if (mADASStatusCallback != null) mADASStatusCallback!!.onAutopilotRunning() - } else { - if (FunctionBuildConfig.isDemoMode && mNextStationIndex >= 0 && mNextStationIndex <= mStations.size - 1 && isGoingToNextStation) { - Logger.d( - SceneConstant.M_BUS_P + TAG, - "FunctionBuildConfig.isDemoMode is true" - ) - return - } - - if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { - if (mADASStatusCallback != null) mADASStatusCallback!!.onAutopilotEnable() - } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { - if (mADASStatusCallback != null) mADASStatusCallback!!.onAutopilotDisable() - } else if (state == IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING) { - if (mADASStatusCallback != null) mADASStatusCallback!!.onAutopilotRunning() - } - } - } - } - - private fun setTrajectoryStation( - startStationInfo: BusStationBean, - endStationInfo: BusStationBean, - lineId: Int - ) { - val startStation = MogoLocation() - startStation.longitude = startStationInfo.gcjLon - startStation.latitude = startStationInfo.gcjLat - val endStation = MogoLocation() - endStation.longitude = endStationInfo.gcjLon - endStation.latitude = endStationInfo.gcjLat - TrajectoryAndDistanceManager.setStationPoint(startStation, endStation, lineId.toLong()) - } - - - private fun startStationVideo(startStationInfo: BusStationBean){ - val introductionList = mutableListOf() - startStationInfo.videoList?.forEach { - if(it.type==1) { - introductionList.add( - MediaItem( - MediaItem.PrioritySite, it.url, - MediaItem.MEDIA_TYPE_VIDEO,"","") - ) - } - } - MediaManager.postSiteIntroduceInfo(introductionList) - } - - private fun cleanStation(type: String) { - d(SceneConstant.M_BUS_P + TAG, "清理站点:$type") - TrajectoryAndDistanceManager.setStationPoint(null, null, -1L) - } - - private fun updateAutopilotControlParameters( - busRoutesResult: BusRoutesResult, - leaveIndex: Int - ) { - val parameters = initAutopilotControlParameters(busRoutesResult, leaveIndex) - if (null == parameters) { - CallerLogger.e(SceneConstant.M_BUS_P + TAG, "AutopilotControlParameters is empty.") - return - } - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "AutopilotControlParameters is update.") - CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(parameters) - } - - private fun initAutopilotControlParameters( - busRoutesResult: BusRoutesResult, - leaveIndex: Int - ): AutopilotControlParameters? { - if (busRoutesResult.sites == null) { - return null - } - val stations = busRoutesResult.sites - if (leaveIndex + 1 > stations.size - 1) { - CallerLogger.e(SceneConstant.M_BUS_P + TAG, "行程日志-mismatch condition1.") - return null - } - val currentStation = stations[leaveIndex] - val nextStation = stations[leaveIndex + 1] - val parameters = AutopilotControlParameters() - parameters.routeID = busRoutesResult.lineId - parameters.routeName = busRoutesResult.name - parameters.startName = PinYinUtil.getPinYinHeadChar(currentStation.name) - parameters.endName = PinYinUtil.getPinYinHeadChar(nextStation.name) - parameters.startLatLon = - AutopilotControlParameters.AutoPilotLonLat(currentStation.lat, currentStation.lon) - parameters.endLatLon = - AutopilotControlParameters.AutoPilotLonLat(nextStation.lat, nextStation.lon) - parameters.vehicleType = 10 - if (parameters.autoPilotLine == null) { - parameters.autoPilotLine = AutopilotControlParameters.AutoPilotLine( - busRoutesResult.lineId.toLong(), busRoutesResult.name, - busRoutesResult.csvFileUrl, busRoutesResult.csvFileMd5, - busRoutesResult.txtFileUrl, busRoutesResult.txtFileMd5, - busRoutesResult.contrailSaveTime, busRoutesResult.carModel, - busRoutesResult.csvFileUrlDPQP, busRoutesResult.csvFileMd5DPQP, - busRoutesResult.txtFileUrlDPQP, busRoutesResult.txtFileMd5DPQP, - busRoutesResult.contrailSaveTimeDPQP - ) - } - return parameters - } - - - private fun clearAutopilotControlParameters() { - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "AutopilotControlParameters is clear.") - CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(null) - } - -} diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/presenter/BaseBusPassengerPresenter.kt b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/presenter/BaseBusPassengerPresenter.kt index bdb1a005ba..827112c551 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/presenter/BaseBusPassengerPresenter.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/presenter/BaseBusPassengerPresenter.kt @@ -3,31 +3,24 @@ package com.mogo.och.shuttle.weaknet.passenger.presenter import androidx.lifecycle.LifecycleOwner import com.mogo.commons.AbsMogoApplication import com.mogo.commons.mvp.Presenter -import com.mogo.eagle.core.data.map.MogoLocation -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant -import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.data.bean.BusStationBean -import com.mogo.och.shuttle.weaknet.passenger.callback.IBusPassegerDriverStatusCallback -import com.mogo.och.shuttle.weaknet.passenger.callback.IBusPassengerADASStatusCallback -import com.mogo.och.shuttle.weaknet.passenger.callback.IBusPassengerAutopilotPlanningCallback -import com.mogo.och.shuttle.weaknet.passenger.callback.IBusPassengerControllerStatusCallback -import com.mogo.och.shuttle.weaknet.passenger.callback.IBusPassengerRouteLineInfoCallback -import com.mogo.och.shuttle.weaknet.passenger.model.BusPassengerModel +import com.mogo.och.shuttle.weaknet.passenger.callback.ICommonCallback +import com.mogo.och.shuttle.weaknet.passenger.model.CommonModel import com.mogo.och.shuttle.weaknet.passenger.ui.BusPassengerRouteFragment /** * Created on 2022/3/31 */ class BaseBusPassengerPresenter(view: BusPassengerRouteFragment?) : - Presenter(view), IBusPassengerADASStatusCallback, - IBusPassengerControllerStatusCallback, IBusPassegerDriverStatusCallback, - IBusPassengerRouteLineInfoCallback, IBusPassengerAutopilotPlanningCallback { + Presenter(view), + ICommonCallback { private val TAG: String = BaseBusPassengerPresenter::class.java.simpleName init { - BusPassengerModel.init(AbsMogoApplication.getApp()) + CommonModel.init(AbsMogoApplication.getApp()) initListeners() } @@ -40,77 +33,27 @@ class BaseBusPassengerPresenter(view: BusPassengerRouteFragment?) : super.onDestroy(owner) releaseListeners() - BusPassengerModel.release() + CommonModel.releaseListeners() } private fun initListeners() { - BusPassengerModel.setADASStatusCallback(this) - BusPassengerModel.setControllerStatusCallback(TAG, this) - BusPassengerModel.setDriverStatusCallback(this) - BusPassengerModel.setRouteLineInfoCallback(this) - BusPassengerModel.setMoGoAutopilotPlanningListener(this) + CommonModel.setRouteLineInfoCallback(this) } private fun releaseListeners() { - BusPassengerModel.setADASStatusCallback(null) - BusPassengerModel.setControllerStatusCallback(TAG, null) - BusPassengerModel.setDriverStatusCallback(null) - BusPassengerModel.setRouteLineInfoCallback(null) - BusPassengerModel.setMoGoAutopilotPlanningListener(null) + CommonModel.setRouteLineInfoCallback(null) } - override fun onAutopilotEnable() { - UiThreadHandler.post({ - if (mView != null) { - mView!!.onAutopilotStatusChanged( - IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE - ) - } - }, UiThreadHandler.MODE.QUEUE) - } - - override fun onAutopilotDisable() { - UiThreadHandler.post({ - if (mView != null) { - mView!!.onAutopilotStatusChanged( - IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE - ) - } - }, UiThreadHandler.MODE.QUEUE) - } - - override fun onAutopilotRunning() { - UiThreadHandler.post({ - if (mView != null) { - mView!!.onAutopilotStatusChanged( - IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING - ) - } - }, UiThreadHandler.MODE.QUEUE) - } - - override fun onCarLocationChanged(location: MogoLocation) { - UiThreadHandler.post({ - if (location != null && mView != null) { - mView!!.onCarLocationChanged(location) - } - }, UiThreadHandler.MODE.QUEUE) - } - - override fun changeOperationStatus(changeStatus: Boolean) { - UiThreadHandler.post({ - if (mView != null) { - mView!!.changeOperationStatus(changeStatus) - } - }, UiThreadHandler.MODE.QUEUE) + override fun updateSpeed(location: Int) { + BizLoopManager.runInMainThread{ + mView?.onCarLocationChanged(location) + } } override fun updateLineInfo(lineName: String) { - UiThreadHandler.post({ - if (mView != null) { - mView!!.updateLineInfo(lineName) - } - }, UiThreadHandler.MODE.QUEUE) + BizLoopManager.runInMainThread{ + mView?.updateLineInfo(lineName) + } } override fun updateStationsInfo( @@ -118,34 +61,30 @@ class BaseBusPassengerPresenter(view: BusPassengerRouteFragment?) : currentStationIndex: Int, isArrived: Boolean ) { - UiThreadHandler.post({ - if (mView != null) { - mView!!.updateStationsInfo(stations, currentStationIndex, isArrived) - } - }, UiThreadHandler.MODE.QUEUE) + BizLoopManager.runInMainThread{ + mView?.updateStationsInfo(stations, currentStationIndex, isArrived) + } } - override fun showNoTaskView() { - UiThreadHandler.post({ - if (mView != null) { - mView!!.showNoTaskView() + override fun showNoTaskView(isShow:Boolean) { + BizLoopManager.runInMainThread{ + if(isShow) { + mView?.showNoTaskView() + }else{ + mView?.hideNoTaskView() } - }, UiThreadHandler.MODE.QUEUE) + } } - override fun hideNoTaskView() { - UiThreadHandler.post({ - if (mView != null) { - mView!!.hideNoTaskView() - } - }, UiThreadHandler.MODE.QUEUE) + override fun updateAutoStatus(isOpen: Boolean) { + BizLoopManager.runInMainThread{ + mView?.onAutopilotStatusChanged(isOpen) + } } - override fun routePlanningToNextStationChanged(meters: Long, timeInSecond: Long) { - UiThreadHandler.post({ - if (mView != null) { - mView!!.updateRoutePlanningToNextStation(meters, timeInSecond) - } - }, UiThreadHandler.MODE.QUEUE) + override fun updateRemainMT(meters: Long, timeInSecond: Long) { + BizLoopManager.runInMainThread{ + mView?.updateRoutePlanningToNextStation(meters, timeInSecond) + } } } diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/BusPassengerRouteFragment.java b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/BusPassengerRouteFragment.java index 2beab5a584..339a416291 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/BusPassengerRouteFragment.java +++ b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/BusPassengerRouteFragment.java @@ -62,13 +62,6 @@ public class BusPassengerRouteFragment extends private AppCompatTextView mCurrentArriveTip; private AppCompatImageView mSpeakArrivedIv; - /** - * 改变自动驾驶状态 - * - * @param status 2 - running 1 - enable 2 - disable - */ - private int mPrevAPStatus = -1; - @Override public int getStationPanelViewId() { return R.layout.shuttle_p_weak_jl_route_fragment; @@ -179,18 +172,6 @@ public class BusPassengerRouteFragment extends } } - public void changeOperationStatus(boolean status) { - if (!status) { - emptyTv.setText(getString(R.string.shuttle_p_jl_no_out)); - mNoLineInfoView.setVisibility(View.VISIBLE); - mRouteInfoView.setVisibility(View.GONE); - mLineName.setText(getContext().getString(R.string.shuttle_p_jl_no_line)); - updateArrivedStation(null,0,true); - clearMapView(); - clearMapMarkers(); - } - } - public void showNoTaskView(){ if (mNoLineInfoView.getVisibility() == View.GONE){ mNoLineInfoView.setVisibility(View.VISIBLE); @@ -279,13 +260,8 @@ public class BusPassengerRouteFragment extends // lastBearing = bearing; // } - public void onCarLocationChanged(MogoLocation location) { - updateSpeedView((float) location.getGnssSpeed()); - } - - public void updateSpeedView(float speed){ - int speedKM = (int) (Math.abs(speed) * 3.6F); - mSpeedTv.setText(String.valueOf(speedKM)); + public void onCarLocationChanged(int location) { + mSpeedTv.setText(String.valueOf(location)); } public void updateCurrentStation(int position) { @@ -355,21 +331,17 @@ public class BusPassengerRouteFragment extends mCurrentArriveTip.setText(Html.fromHtml(str)); } - public void onAutopilotStatusChanged(int status) { + public void onAutopilotStatusChanged(boolean isOpen) { UiThreadHandler.post(new Runnable() { @Override public void run() { - // 3. 其他过程直接更新 - if (mPrevAPStatus != status){ - AutopilotStatusChanged(status); - } - mPrevAPStatus = status; + AutopilotStatusChanged(isOpen); } }); } - public void AutopilotStatusChanged(int status) { - if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == status) { + public void AutopilotStatusChanged(boolean isOpen) { + if (isOpen) { mAutopilotIv.setImageResource(R.drawable.shuttle_p_jl_auto_open); } else { mAutopilotIv.setImageResource(R.drawable.shuttle_p_jl_auto_close); diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/BusPBlueToothView.kt b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/widget/BusPBlueToothView.kt similarity index 95% rename from OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/BusPBlueToothView.kt rename to OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/widget/BusPBlueToothView.kt index 2606e8fcdc..d646acab18 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/BusPBlueToothView.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/widget/BusPBlueToothView.kt @@ -1,4 +1,4 @@ -package com.mogo.och.shuttle.weaknet.passenger.ui +package com.mogo.och.shuttle.weaknet.passenger.ui.widget import android.content.Context import android.util.AttributeSet diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/BusPStatusBarView.kt b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/widget/BusPStatusBarView.kt similarity index 95% rename from OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/BusPStatusBarView.kt rename to OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/widget/BusPStatusBarView.kt index c0c3f1a182..073bc9778b 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/BusPStatusBarView.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/widget/BusPStatusBarView.kt @@ -1,4 +1,4 @@ -package com.mogo.och.shuttle.weaknet.passenger.ui +package com.mogo.och.shuttle.weaknet.passenger.ui.widget import android.annotation.* import android.content.Context @@ -11,11 +11,9 @@ import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager -import com.mogo.eagle.core.utilcode.kotlin.* import com.mogo.eagle.core.utilcode.util.AppUtils import com.mogo.och.shuttle.weaknet.passenger.R import kotlinx.android.synthetic.main.shuttle_p_weak_jl_view_status_bar.view.tv_shuttle_b1_p_version -import kotlinx.coroutines.* import me.jessyan.autosize.utils.AutoSizeUtils /** diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/BusPassengerTrafficLightView.kt b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/widget/BusPassengerTrafficLightView.kt similarity index 99% rename from OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/BusPassengerTrafficLightView.kt rename to OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/widget/BusPassengerTrafficLightView.kt index e353b04f2e..fa8e30d04e 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/BusPassengerTrafficLightView.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/jinlv/com/mogo/och/shuttle/weaknet/passenger/ui/widget/BusPassengerTrafficLightView.kt @@ -1,4 +1,4 @@ -package com.mogo.och.shuttle.weaknet.passenger.ui +package com.mogo.och.shuttle.weaknet.passenger.ui.widget import android.content.Context import android.util.AttributeSet diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/callback/AutoPilotStatusCallback.kt b/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/callback/AutoPilotStatusCallback.kt deleted file mode 100644 index 1f68457985..0000000000 --- a/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/callback/AutoPilotStatusCallback.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.mogo.och.shuttle.weaknet.passenger.callback - -/** - * @author: wangmingjun - * @date: 2023/2/13 - */ -interface AutoPilotStatusCallback { - /** - * false: 未开启自驾, true : 开启自驾 - */ - fun updateAutoStatus(isOpen: Boolean) - - fun updateAutoStatus(status: Int) -} \ No newline at end of file diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/callback/DrivingInfoCallback.kt b/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/callback/DrivingInfoCallback.kt deleted file mode 100644 index ef9974051d..0000000000 --- a/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/callback/DrivingInfoCallback.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.mogo.och.shuttle.weaknet.passenger.callback - -import com.mogo.och.data.bean.BusStationBean - -/** - * @author: wangmingjun - * @date: 2023/2/2 - */ -interface DrivingInfoCallback { - fun updateSpeed(speed: Int) - fun updatePlateNumber(carNum: String) - fun updateLine(lineName: String) - fun updateRemainMT(meters : Long, timeInSecond : Long) // 米,秒 - fun showNoTaskView(isTrue : Boolean) - fun updateLineStations(stations: MutableList) - fun updateStationsInfo(stations: MutableList, i: Int, isArrived: Boolean) - fun clearCustomPolyline() -} \ No newline at end of file diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/presenter/PM2DrivingPresenter.kt b/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/presenter/PM2DrivingPresenter.kt index 89e8b10363..b82b61eef0 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/presenter/PM2DrivingPresenter.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/presenter/PM2DrivingPresenter.kt @@ -4,18 +4,18 @@ import androidx.lifecycle.LifecycleOwner import com.amap.api.maps.model.LatLng import com.mogo.commons.mvp.Presenter import com.mogo.eagle.core.utilcode.util.ThreadUtils -import com.mogo.och.shuttle.weaknet.passenger.callback.AutoPilotStatusCallback -import com.mogo.och.shuttle.weaknet.passenger.callback.DrivingInfoCallback import com.mogo.och.shuttle.weaknet.passenger.model.PM2ADASModel -import com.mogo.och.shuttle.weaknet.passenger.model.LineModel import com.mogo.och.shuttle.weaknet.passenger.ui.PM2DrivingInfoFragment import com.mogo.och.data.bean.BusStationBean +import com.mogo.och.shuttle.weaknet.passenger.callback.ICommonCallback +import com.mogo.och.shuttle.weaknet.passenger.model.CommonModel class PM2DrivingPresenter(view: PM2DrivingInfoFragment?) : - Presenter(view), DrivingInfoCallback, AutoPilotStatusCallback { + Presenter(view), + ICommonCallback { init { - LineModel.init(context) + CommonModel.init(context) PM2ADASModel.INSTANCE.init(context) initListener() } @@ -23,17 +23,15 @@ class PM2DrivingPresenter(view: PM2DrivingInfoFragment?) : override fun onDestroy(owner: LifecycleOwner) { super.onDestroy(owner) destroyListener() - LineModel.releaseListener() + CommonModel.releaseListeners() } private fun initListener(){ - LineModel.setDrivingInfoCallback(this) - LineModel.setAutoStatusCallback(this) + CommonModel.setRouteLineInfoCallback(this) } private fun destroyListener(){ - LineModel.setDrivingInfoCallback(null) - LineModel.setAutoStatusCallback(null) + CommonModel.setRouteLineInfoCallback(null) } override fun updateSpeed(speed: Int) { @@ -45,13 +43,7 @@ class PM2DrivingPresenter(view: PM2DrivingInfoFragment?) : } } - override fun updatePlateNumber(carNum: String) { - ThreadUtils.runOnUiThread { - mView?.updateCarPlateNum(carNum) - } - } - - override fun updateLine(lineName: String) { + override fun updateLineInfo(lineName: String) { ThreadUtils.runOnUiThread { mView?.updateTaskName(lineName) } @@ -128,9 +120,5 @@ class PM2DrivingPresenter(view: PM2DrivingInfoFragment?) : } } - override fun updateAutoStatus(status: Int) { - - } - } \ No newline at end of file diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/ui/PM2BaseFragment.kt b/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/ui/PM2BaseFragment.kt index fd4a77054a..3e18fa7aee 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/ui/PM2BaseFragment.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/ui/PM2BaseFragment.kt @@ -28,23 +28,11 @@ class PM2BaseFragment : } override fun initViews() { - //横竖屏 -// setScreenDirection() tv_shuttle_b2_p_version.text = "版本:${AppUtils.getAppVersionName()}" //隐藏小地图 initFragment() } -// private fun setScreenDirection() { -// var ro = Settings.System.getInt(context?.contentResolver, -// Settings.System.USER_ROTATION,Surface.ROTATION_270) -// if (ro != Surface.ROTATION_270){ -// ro = Surface.ROTATION_270 -// } -// Settings.System.putInt(context?.contentResolver, -// Settings.System.USER_ROTATION,ro) -// } - /** * 初始化行程信息,高静地图,宣传 三个fragment */ diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/ui/PM2DrivingInfoFragment.kt b/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/ui/PM2DrivingInfoFragment.kt index 133c1de460..82911ed8aa 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/ui/PM2DrivingInfoFragment.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/m2/com/mogo/och/shuttle/weaknet/passenger/ui/PM2DrivingInfoFragment.kt @@ -15,6 +15,7 @@ import com.mogo.och.shuttle.weaknet.passenger.R import com.mogo.och.shuttle.weaknet.passenger.presenter.PM2DrivingPresenter import com.mogo.och.common.module.utils.DateTimeUtil.* import com.mogo.och.common.module.utils.NumberFormatUtil +import com.mogo.och.common.module.utils.ResourcesUtils import com.mogo.och.data.bean.BusStationBean import kotlinx.android.synthetic.main.shuttle_p_m2_driving_info_fragment.auto_tv import kotlinx.android.synthetic.main.shuttle_p_m2_driving_info_fragment.clg_distance_left_time @@ -41,16 +42,24 @@ import kotlin.math.roundToInt class PM2DrivingInfoFragment : MvpFragment() { - val stationIcon = BitmapFactory.decodeResource(AbsMogoApplication.getApp().resources, R.drawable.shuttle_p_m2_map_staton_icon) - val stationPassIcon = BitmapFactory.decodeResource(AbsMogoApplication.getApp().resources, R.drawable.shuttle_p_m2_map_staton_arrived_icon) - val startStationIcon = BitmapFactory.decodeResource(AbsMogoApplication.getApp().resources, R.drawable.shuttle_p_m2_map_start_icon) - val endStationIcon = BitmapFactory.decodeResource(AbsMogoApplication.getApp().resources, R.drawable.shuttle_p_m2_map_end_icon) + private val stationIcon = BitmapFactory.decodeResource( + AbsMogoApplication.getApp().resources, + R.drawable.shuttle_p_m2_map_staton_icon + ) + private val stationPassIcon = BitmapFactory.decodeResource( + AbsMogoApplication.getApp().resources, + R.drawable.shuttle_p_m2_map_staton_arrived_icon + ) + private val startStationIcon = BitmapFactory.decodeResource( + AbsMogoApplication.getApp().resources, + R.drawable.shuttle_p_m2_map_start_icon + ) + private val endStationIcon = BitmapFactory.decodeResource( + AbsMogoApplication.getApp().resources, + R.drawable.shuttle_p_m2_map_end_icon + ) + - /** - * 改变自动驾驶状态 - * - * @param status 2 - running 1 - enable 2 - disable - */ override fun getLayoutId(): Int { return R.layout.shuttle_p_m2_driving_info_fragment } @@ -65,38 +74,14 @@ class PM2DrivingInfoFragment : true } - line_name_tv.setTextColor(resources.getColor(R.color.shuttle_p_m2_line_name_tv_color)) - station_name_tv.setTextColor(resources.getColor(R.color.shuttle_p_m2_line_name_tv_color)) + line_name_tv.setTextColor(ResourcesUtils.getColor(R.color.shuttle_p_m2_line_name_tv_color)) + station_name_tv.setTextColor(ResourcesUtils.getColor(R.color.shuttle_p_m2_line_name_tv_color)) speed_tv.setVertrial(true) val intArrayOf = intArrayOf( - requireContext().resources.getColor(R.color.shuttle_p_m2_color_43cefe), - requireContext().resources.getColor(R.color.shuttle_p_m2_color_1466fb) + ResourcesUtils.getColor(R.color.shuttle_p_m2_color_43cefe), + ResourcesUtils.getColor(R.color.shuttle_p_m2_color_1466fb), ) speed_tv.setmColorList(intArrayOf) - -// current_time_tv.onClick { - -// //测试V2X消息 -// CallerMsgBoxManager.saveMsgBox( -// MsgBoxBean( -// MsgBoxType.V2X, -// V2XMsg( -// "6666", -// "超速行驶", -// "" -// ) -// ) -// ) -// -// val noticeTrafficStylePushData = NoticeTrafficStylePushData() -// noticeTrafficStylePushData.content= "测试公告布局" -// val noticeFromCloudMsg = NoticeFrCloudMsg(null, noticeTrafficStylePushData, 1) -// CallerMsgBoxManager.saveMsgBox( -// MsgBoxBean( -// MsgBoxType.NOTICE, noticeFromCloudMsg) -// ) -// BPRouteDataTestUtils.converToRouteData() -// } } override fun initViews(savedInstanceState: Bundle?) { @@ -111,50 +96,34 @@ class PM2DrivingInfoFragment : override fun onResume() { super.onResume() - overMapView?.let{ - it.onResume() - } + overMapView?.onResume() } override fun onPause() { super.onPause() - overMapView?.let{ - it.onPause() - } + overMapView?.onPause() } override fun onDestroyView() { overMapView?.onDestroy() - if (mPresenter != null) { - mPresenter?.onDestroy(this) - } + mPresenter?.onDestroy(this) super.onDestroyView() } - fun updateSpeed(speed: Int){ + fun updateSpeed(speed: Int) { speed_tv.text = speed.toString() } - fun updateCarPlateNum(plateNum : String){ - - } - - fun updateTaskName(name: String){ + fun updateTaskName(name: String) { line_name_tv.text = name } - fun changeOperationStatus(status:Boolean){ - if (!status){ - updateNoOrderUI() - } - } - - fun showNoTaskView(haveTask: Boolean){ + fun showNoTaskView(haveTask: Boolean) { setLineInfoView(haveTask) } - private fun setLineInfoView(isShow: Boolean){ - if (!isShow){ + private fun setLineInfoView(isShow: Boolean) { + if (!isShow) { updateNoOrderUI() } } @@ -162,19 +131,16 @@ class PM2DrivingInfoFragment : private fun updateNoOrderUI() { line_name_tv.text = resources.getString(R.string.shuttle_p_m2_not_select_line_content) updateNoStationView() - overMapView?.let { - it.clearSiteMarkers() - } + overMapView?.clearSiteMarkers() clearCustomPolyline() } - fun clearCustomPolyline(){ - overMapView?.let { - it.clearCustomPolyline() - } + fun clearCustomPolyline() { + overMapView?.clearCustomPolyline() } - private fun updateNoStationView(){ - station_name_tv.setTextColor(resources.getColor(R.color.shuttle_p_m2_next_tv_color)) + + private fun updateNoStationView() { + station_name_tv.setTextColor(ResourcesUtils.getColor(R.color.shuttle_p_m2_next_tv_color)) station_name_tv.text = resources.getString(R.string.shuttle_p_m2_empty_tv) tv_distance.text = resources.getString(R.string.shuttle_p_m2_empty_remain_km) tv_left_time.text = resources.getString(R.string.shuttle_p_m2_empty_remain_minute) @@ -186,12 +152,32 @@ class PM2DrivingInfoFragment : } fun updateAutoStatus(isAutoPilot: Boolean) { - if (isAutoPilot){ - context?.let { auto_tv.setTextColor(ContextCompat.getColor(it,R.color.shuttle_p_m2_white_color)) } - context?.let { auto_tv.background = ContextCompat.getDrawable(it,R.drawable.shuttle_p_m2_auto_button_bg) } - }else{ - context?.let { auto_tv.setTextColor(ContextCompat.getColor(it,R.color.shuttle_p_m2_color_7094ad)) } - context?.let { auto_tv.background = ContextCompat.getDrawable(it,R.drawable.shuttle_p_m2_bg_p_m2_auto) } + if (isAutoPilot) { + context?.let { + auto_tv.setTextColor( + ContextCompat.getColor( + it, + R.color.shuttle_p_m2_white_color + ) + ) + } + context?.let { + auto_tv.background = + ContextCompat.getDrawable(it, R.drawable.shuttle_p_m2_auto_button_bg) + } + } else { + context?.let { + auto_tv.setTextColor( + ContextCompat.getColor( + it, + R.color.shuttle_p_m2_color_7094ad + ) + ) + } + context?.let { + auto_tv.background = + ContextCompat.getDrawable(it, R.drawable.shuttle_p_m2_bg_p_m2_auto) + } } } @@ -200,38 +186,40 @@ class PM2DrivingInfoFragment : stationsPass: MutableList, startStation: LatLng?, endStation: LatLng? - ){ + ) { overMapView?.let { val stationsList: MutableList = mutableListOf() - startStation?.let { start-> - stationsList.add(SiteMarkerBean(start,startStationIcon,0.5f,0.5f)) + startStation?.let { start -> + stationsList.add(SiteMarkerBean(start, startStationIcon, 0.5f, 0.5f)) } - for (stationsPass in stationsPass) { - stationsList.add(SiteMarkerBean(stationsPass,stationPassIcon,0.5f,0.5f)) + for (stationPass in stationsPass) { + stationsList.add(SiteMarkerBean(stationPass, stationPassIcon, 0.5f, 0.5f)) } - for (stationsPass in stations) { - stationsList.add(SiteMarkerBean(stationsPass,stationIcon,0.5f,0.5f)) + for (stationPass in stations) { + stationsList.add(SiteMarkerBean(stationPass, stationIcon, 0.5f, 0.5f)) } - endStation?.let {end-> - stationsList.add(SiteMarkerBean(end,endStationIcon,0.5f,0.5f)) + endStation?.let { end -> + stationsList.add(SiteMarkerBean(end, endStationIcon, 0.5f, 0.5f)) } it.drawSiteMarkers(stationsList) } } - fun updateStationsInfo(stations: MutableList, i: Int, isArrived: Boolean){ + fun updateStationsInfo(stations: MutableList, i: Int, isArrived: Boolean) { if (stations.size == 0) return - if (0<= i && i + android:text="@string/shuttle_p_jl_no_task"/> \ No newline at end of file diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/jinlv/layout/shuttle_p_weak_jl_view_status_bar.xml b/OCH/shuttle/passenger_weaknet/src/main/res/jinlv/layout/shuttle_p_weak_jl_view_status_bar.xml index 4101251a11..74e9b46cd2 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/res/jinlv/layout/shuttle_p_weak_jl_view_status_bar.xml +++ b/OCH/shuttle/passenger_weaknet/src/main/res/jinlv/layout/shuttle_p_weak_jl_view_status_bar.xml @@ -32,7 +32,7 @@ android:layout_marginStart="@dimen/dp_40" /> - + + + @Headers("Content-type:application/json;charset=UTF-8") + @GET("/och-taxi-cabin/api/flow/v1/resetInit") + fun resetInit( + @Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId, + @Header("ticket") ticket: String = SharedPrefsMgr.getInstance().token, + @Query("sn") sn: String? = OchSPManager.getSn() + ): Observable + } \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiTaskWithOrderServiceManager.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiTaskWithOrderServiceManager.kt index cd79b5555a..96ee447e95 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiTaskWithOrderServiceManager.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiTaskWithOrderServiceManager.kt @@ -157,6 +157,18 @@ object TaxiTaskWithOrderServiceManager { .subscribe(OchCommonSubscribeImpl(context, callback, "orderCompleted")) } + /** + * 服务完成 + */ + @JvmStatic + fun resetInit( + context: Context, callback: OchCommonServiceCallback? + ) { + mOCHTaxiServiceApi.resetInit().transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "orderCompleted")) + } + + /** * 取消订单 */ diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiPresenter.java b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiPresenter.java index e2ff3cb07f..9461c9214f 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiPresenter.java +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiPresenter.java @@ -1,5 +1,7 @@ package com.mogo.och.unmanned.taxi.ui.base; +import android.view.View; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.LifecycleOwner; @@ -80,6 +82,11 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS } private final OchTransformDispatch ochTransform = new OchTransformDispatch(){ + @Override + public void setVideoView(@Nullable View target) { + + } + @Override public void logout() { TaxiTaskModel.INSTANCE.logout(); diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingChooseLineItemOpenAnimator.java b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingChooseLineItemOpenAnimator.java deleted file mode 100644 index a63a94090d..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingChooseLineItemOpenAnimator.java +++ /dev/null @@ -1,641 +0,0 @@ -package com.mogo.och.unmanned.taxi.ui.routing; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.TimeInterpolator; -import android.animation.ValueAnimator; -import android.view.View; -import android.view.ViewPropertyAnimator; - -import androidx.annotation.NonNull; -import androidx.core.view.ViewCompat; -import androidx.recyclerview.widget.DefaultItemAnimator; -import androidx.recyclerview.widget.RecyclerView; - -import java.util.ArrayList; -import java.util.List; - -/** - * This implementation of {@link RecyclerView.ItemAnimator} provides basic - * animations on remove, add, and move events that happen to the items in - * a RecyclerView. RecyclerView uses a DefaultItemAnimator by default. - * - * @see RecyclerView#setItemAnimator(RecyclerView.ItemAnimator) - */ -public class TaxiRoutingChooseLineItemOpenAnimator extends DefaultItemAnimator { - private static final boolean DEBUG = false; - private static TimeInterpolator sDefaultInterpolator; - private final ArrayList mPendingRemovals = new ArrayList<>(); - private final ArrayList mPendingAdditions = new ArrayList<>(); - private final ArrayList mPendingMoves = new ArrayList<>(); - private final ArrayList mPendingChanges = new ArrayList<>(); - private final ArrayList> mAdditionsList = new ArrayList<>(); - private final ArrayList> mMovesList = new ArrayList<>(); - private final ArrayList> mChangesList = new ArrayList<>(); - private final ArrayList mAddAnimations = new ArrayList<>(); - private final ArrayList mMoveAnimations = new ArrayList<>(); - private final ArrayList mRemoveAnimations = new ArrayList<>(); - private final ArrayList mChangeAnimations = new ArrayList<>(); - - private static class MoveInfo { - public RecyclerView.ViewHolder holder; - public int fromX, fromY, toX, toY; - - MoveInfo(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) { - this.holder = holder; - this.fromX = fromX; - this.fromY = fromY; - this.toX = toX; - this.toY = toY; - } - } - - private static class ChangeInfo { - public RecyclerView.ViewHolder oldHolder, newHolder; - public int fromX, fromY, toX, toY; - - private ChangeInfo(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder) { - this.oldHolder = oldHolder; - this.newHolder = newHolder; - } - - ChangeInfo(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, - int fromX, int fromY, int toX, int toY) { - this(oldHolder, newHolder); - this.fromX = fromX; - this.fromY = fromY; - this.toX = toX; - this.toY = toY; - } - - @Override - public String toString() { - return "ChangeInfo{" - + "oldHolder=" + oldHolder - + ", newHolder=" + newHolder - + ", fromX=" + fromX - + ", fromY=" + fromY - + ", toX=" + toX - + ", toY=" + toY - + '}'; - } - } - - @Override - public void runPendingAnimations() { - boolean removalsPending = !mPendingRemovals.isEmpty(); - boolean movesPending = !mPendingMoves.isEmpty(); - boolean changesPending = !mPendingChanges.isEmpty(); - boolean additionsPending = !mPendingAdditions.isEmpty(); - if (!removalsPending && !movesPending && !additionsPending && !changesPending) { - // nothing to animate - return; - } - // First, remove stuff - for (RecyclerView.ViewHolder holder : mPendingRemovals) { - animateRemoveImpl(holder); - } - mPendingRemovals.clear(); - // Next, move stuff - if (movesPending) { - final ArrayList moves = new ArrayList<>(mPendingMoves); - mMovesList.add(moves); - mPendingMoves.clear(); - Runnable mover = () -> { - for (MoveInfo moveInfo : moves) { - animateMoveImpl(moveInfo.holder, moveInfo.fromX, moveInfo.fromY, - moveInfo.toX, moveInfo.toY); - } - moves.clear(); - mMovesList.remove(moves); - }; - if (removalsPending) { - View view = moves.get(0).holder.itemView; - ViewCompat.postOnAnimationDelayed(view, mover, getRemoveDuration()); - } else { - mover.run(); - } - } - // Next, change stuff, to run in parallel with move animations - if (changesPending) { - final ArrayList changes = new ArrayList<>(mPendingChanges); - mChangesList.add(changes); - mPendingChanges.clear(); - Runnable changer = () -> { - for (ChangeInfo change : changes) { - animateChangeImpl(change); - } - changes.clear(); - mChangesList.remove(changes); - }; - if (removalsPending) { - RecyclerView.ViewHolder holder = changes.get(0).oldHolder; - ViewCompat.postOnAnimationDelayed(holder.itemView, changer, getRemoveDuration()); - } else { - changer.run(); - } - } - // Next, add stuff - if (additionsPending) { - final ArrayList additions = new ArrayList<>(mPendingAdditions); - mAdditionsList.add(additions); - mPendingAdditions.clear(); - Runnable adder = () -> { - for (RecyclerView.ViewHolder holder : additions) { - animateAddImpl(holder); - } - additions.clear(); - mAdditionsList.remove(additions); - }; - if (removalsPending || movesPending || changesPending) { - long removeDuration = removalsPending ? getRemoveDuration() : 0; - long moveDuration = movesPending ? getMoveDuration() : 0; - long changeDuration = changesPending ? getChangeDuration() : 0; - long totalDelay = removeDuration + Math.max(moveDuration, changeDuration); - View view = additions.get(0).itemView; - ViewCompat.postOnAnimationDelayed(view, adder, totalDelay); - } else { - adder.run(); - } - } - } - - @Override - public boolean animateRemove(final RecyclerView.ViewHolder holder) { - resetAnimation(holder); - mPendingRemovals.add(holder); - return true; - } - - private void animateRemoveImpl(final RecyclerView.ViewHolder holder) { - final View view = holder.itemView; - final ViewPropertyAnimator animation = view.animate(); - mRemoveAnimations.add(holder); - animation.setDuration(getRemoveDuration()).alpha(0).setListener( - new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animator) { - dispatchRemoveStarting(holder); - } - - @Override - public void onAnimationEnd(Animator animator) { - animation.setListener(null); - view.setAlpha(1); - dispatchRemoveFinished(holder); - mRemoveAnimations.remove(holder); - dispatchFinishedWhenDone(); - } - }).start(); - } - - @Override - public boolean animateAdd(final RecyclerView.ViewHolder holder) { - resetAnimation(holder); - holder.itemView.setAlpha(0); - mPendingAdditions.add(holder); - return true; - } - - void animateAddImpl(final RecyclerView.ViewHolder holder) { - final View view = holder.itemView; - final ViewPropertyAnimator animation = view.animate(); - mAddAnimations.add(holder); - animation.alpha(1).setDuration(getAddDuration()) - .setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animator) { - dispatchAddStarting(holder); - } - - @Override - public void onAnimationCancel(Animator animator) { - view.setAlpha(1); - } - - @Override - public void onAnimationEnd(Animator animator) { - animation.setListener(null); - dispatchAddFinished(holder); - mAddAnimations.remove(holder); - dispatchFinishedWhenDone(); - } - }).start(); - } - - @Override - public boolean animateMove(final RecyclerView.ViewHolder holder, int fromX, int fromY, - int toX, int toY) { - final View view = holder.itemView; - fromX += (int) holder.itemView.getTranslationX(); - fromY += (int) holder.itemView.getTranslationY(); - resetAnimation(holder); - int deltaX = toX - fromX; - int deltaY = toY - fromY; - if (deltaX == 0 && deltaY == 0) { - dispatchMoveFinished(holder); - return false; - } - if (deltaX != 0) { - view.setTranslationX(-deltaX); - } - if (deltaY != 0) { - view.setTranslationY(-deltaY); - } - mPendingMoves.add(new MoveInfo(holder, fromX, fromY, toX, toY)); - return true; - } - - void animateMoveImpl(final RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) { - final View view = holder.itemView; - final int deltaX = toX - fromX; - final int deltaY = toY - fromY; - if (deltaX != 0) { - view.animate().translationX(0); - } - if (deltaY != 0) { - view.animate().translationY(0); - } - // TODO: make EndActions end listeners instead, since end actions aren't called when - // vpas are canceled (and can't end them. why?) - // need listener functionality in VPACompat for this. Ick. - final ViewPropertyAnimator animation = view.animate(); - mMoveAnimations.add(holder); - animation.setDuration(getMoveDuration()).setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animator) { - dispatchMoveStarting(holder); - } - - @Override - public void onAnimationCancel(Animator animator) { - if (deltaX != 0) { - view.setTranslationX(0); - } - if (deltaY != 0) { - view.setTranslationY(0); - } - } - - @Override - public void onAnimationEnd(Animator animator) { - animation.setListener(null); - dispatchMoveFinished(holder); - mMoveAnimations.remove(holder); - dispatchFinishedWhenDone(); - } - }).start(); - } - - @Override - public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, - int fromX, int fromY, int toX, int toY) { - if (oldHolder == newHolder) { - // Don't know how to run change animations when the same view holder is re-used. - // run a move animation to handle position changes. - return animateMove(oldHolder, fromX, fromY, toX, toY); - } - final float prevTranslationX = oldHolder.itemView.getTranslationX(); - final float prevTranslationY = oldHolder.itemView.getTranslationY(); - final float prevAlpha = oldHolder.itemView.getAlpha(); - resetAnimation(oldHolder); - int deltaX = (int) (toX - fromX - prevTranslationX); - int deltaY = (int) (toY - fromY - prevTranslationY); - // recover prev translation state after ending animation - oldHolder.itemView.setTranslationX(prevTranslationX); - oldHolder.itemView.setTranslationY(prevTranslationY); - oldHolder.itemView.setAlpha(prevAlpha); - if (newHolder != null) { - // carry over translation values - resetAnimation(newHolder); - newHolder.itemView.setTranslationX(-deltaX); - newHolder.itemView.setTranslationY(-deltaY); - newHolder.itemView.setAlpha(0); - } - mPendingChanges.add(new ChangeInfo(oldHolder, newHolder, fromX, fromY, toX, toY)); - return true; - } - - void animateChangeImpl(final ChangeInfo changeInfo) { - final RecyclerView.ViewHolder holder = changeInfo.oldHolder; - final View view = holder == null ? null : holder.itemView; - final RecyclerView.ViewHolder newHolder = changeInfo.newHolder; - final View newView = newHolder != null ? newHolder.itemView : null; - if (view != null) { - final ViewPropertyAnimator oldViewAnim = view.animate().setDuration( - getChangeDuration()); - mChangeAnimations.add(changeInfo.oldHolder); - oldViewAnim.translationX((float) (changeInfo.toX - changeInfo.fromX)); - oldViewAnim.translationY((float) (changeInfo.toY - changeInfo.fromY)); - oldViewAnim.alpha(0).setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animator) { - dispatchChangeStarting(changeInfo.oldHolder, true); - } - - @Override - public void onAnimationEnd(Animator animator) { - oldViewAnim.setListener(null); - view.setAlpha(1); - view.setTranslationX(0); - view.setTranslationY(0); - dispatchChangeFinished(changeInfo.oldHolder, true); - mChangeAnimations.remove(changeInfo.oldHolder); - dispatchFinishedWhenDone(); - } - }).start(); - } - if (newView != null) { - final ViewPropertyAnimator newViewAnimation = newView.animate(); - mChangeAnimations.add(changeInfo.newHolder); - newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration()) - .alpha(1).setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animator) { - dispatchChangeStarting(changeInfo.newHolder, false); - } - - @Override - public void onAnimationEnd(Animator animator) { - newViewAnimation.setListener(null); - newView.setAlpha(1); - newView.setTranslationX(0); - newView.setTranslationY(0); - dispatchChangeFinished(changeInfo.newHolder, false); - mChangeAnimations.remove(changeInfo.newHolder); - dispatchFinishedWhenDone(); - } - }).start(); - } - } - - private void endChangeAnimation(List infoList, RecyclerView.ViewHolder item) { - for (int i = infoList.size() - 1; i >= 0; i--) { - ChangeInfo changeInfo = infoList.get(i); - if (endChangeAnimationIfNecessary(changeInfo, item)) { - if (changeInfo.oldHolder == null && changeInfo.newHolder == null) { - infoList.remove(changeInfo); - } - } - } - } - - private void endChangeAnimationIfNecessary(ChangeInfo changeInfo) { - if (changeInfo.oldHolder != null) { - endChangeAnimationIfNecessary(changeInfo, changeInfo.oldHolder); - } - if (changeInfo.newHolder != null) { - endChangeAnimationIfNecessary(changeInfo, changeInfo.newHolder); - } - } - - private boolean endChangeAnimationIfNecessary(ChangeInfo changeInfo, RecyclerView.ViewHolder item) { - boolean oldItem = false; - if (changeInfo.newHolder == item) { - changeInfo.newHolder = null; - } else if (changeInfo.oldHolder == item) { - changeInfo.oldHolder = null; - oldItem = true; - } else { - return false; - } - item.itemView.setAlpha(1); - item.itemView.setTranslationX(0); - item.itemView.setTranslationY(0); - dispatchChangeFinished(item, oldItem); - return true; - } - - @Override - public void endAnimation(RecyclerView.ViewHolder item) { - final View view = item.itemView; - // this will trigger end callback which should set properties to their target values. - view.animate().cancel(); - // TODO if some other animations are chained to end, how do we cancel them as well? - for (int i = mPendingMoves.size() - 1; i >= 0; i--) { - MoveInfo moveInfo = mPendingMoves.get(i); - if (moveInfo.holder == item) { - view.setTranslationY(0); - view.setTranslationX(0); - dispatchMoveFinished(item); - mPendingMoves.remove(i); - } - } - endChangeAnimation(mPendingChanges, item); - if (mPendingRemovals.remove(item)) { - view.setAlpha(1); - dispatchRemoveFinished(item); - } - if (mPendingAdditions.remove(item)) { - view.setAlpha(1); - dispatchAddFinished(item); - } - - for (int i = mChangesList.size() - 1; i >= 0; i--) { - ArrayList changes = mChangesList.get(i); - endChangeAnimation(changes, item); - if (changes.isEmpty()) { - mChangesList.remove(i); - } - } - for (int i = mMovesList.size() - 1; i >= 0; i--) { - ArrayList moves = mMovesList.get(i); - for (int j = moves.size() - 1; j >= 0; j--) { - MoveInfo moveInfo = moves.get(j); - if (moveInfo.holder == item) { - view.setTranslationY(0); - view.setTranslationX(0); - dispatchMoveFinished(item); - moves.remove(j); - if (moves.isEmpty()) { - mMovesList.remove(i); - } - break; - } - } - } - for (int i = mAdditionsList.size() - 1; i >= 0; i--) { - ArrayList additions = mAdditionsList.get(i); - if (additions.remove(item)) { - view.setAlpha(1); - dispatchAddFinished(item); - if (additions.isEmpty()) { - mAdditionsList.remove(i); - } - } - } - - // animations should be ended by the cancel above. - //noinspection Pointless BooleanExpression,ConstantConditions - if (mRemoveAnimations.remove(item) && DEBUG) { - throw new IllegalStateException("after animation is cancelled, item should not be in " - + "mRemoveAnimations list"); - } - - //noinspection Pointless BooleanExpression,ConstantConditions - if (mAddAnimations.remove(item) && DEBUG) { - throw new IllegalStateException("after animation is cancelled, item should not be in " - + "mAddAnimations list"); - } - - //noinspection Pointless BooleanExpression,ConstantConditions - if (mChangeAnimations.remove(item) && DEBUG) { - throw new IllegalStateException("after animation is cancelled, item should not be in " - + "mChangeAnimations list"); - } - - //noinspection Pointless BooleanExpression,ConstantConditions - if (mMoveAnimations.remove(item) && DEBUG) { - throw new IllegalStateException("after animation is cancelled, item should not be in " - + "mMoveAnimations list"); - } - dispatchFinishedWhenDone(); - } - - private void resetAnimation(RecyclerView.ViewHolder holder) { - if (sDefaultInterpolator == null) { - sDefaultInterpolator = new ValueAnimator().getInterpolator(); - } - holder.itemView.animate().setInterpolator(sDefaultInterpolator); - endAnimation(holder); - } - - @Override - public boolean isRunning() { - return (!mPendingAdditions.isEmpty() - || !mPendingChanges.isEmpty() - || !mPendingMoves.isEmpty() - || !mPendingRemovals.isEmpty() - || !mMoveAnimations.isEmpty() - || !mRemoveAnimations.isEmpty() - || !mAddAnimations.isEmpty() - || !mChangeAnimations.isEmpty() - || !mMovesList.isEmpty() - || !mAdditionsList.isEmpty() - || !mChangesList.isEmpty()); - } - - /** - * Check the state of currently pending and running animations. If there are none - * pending/running, call {@link #dispatchAnimationsFinished()} to notify any - * listeners. - */ - void dispatchFinishedWhenDone() { - if (!isRunning()) { - dispatchAnimationsFinished(); - } - } - - @Override - public void endAnimations() { - int count = mPendingMoves.size(); - for (int i = count - 1; i >= 0; i--) { - MoveInfo item = mPendingMoves.get(i); - View view = item.holder.itemView; - view.setTranslationY(0); - view.setTranslationX(0); - dispatchMoveFinished(item.holder); - mPendingMoves.remove(i); - } - count = mPendingRemovals.size(); - for (int i = count - 1; i >= 0; i--) { - RecyclerView.ViewHolder item = mPendingRemovals.get(i); - dispatchRemoveFinished(item); - mPendingRemovals.remove(i); - } - count = mPendingAdditions.size(); - for (int i = count - 1; i >= 0; i--) { - RecyclerView.ViewHolder item = mPendingAdditions.get(i); - item.itemView.setAlpha(1); - dispatchAddFinished(item); - mPendingAdditions.remove(i); - } - count = mPendingChanges.size(); - for (int i = count - 1; i >= 0; i--) { - endChangeAnimationIfNecessary(mPendingChanges.get(i)); - } - mPendingChanges.clear(); - if (!isRunning()) { - return; - } - - int listCount = mMovesList.size(); - for (int i = listCount - 1; i >= 0; i--) { - ArrayList moves = mMovesList.get(i); - count = moves.size(); - for (int j = count - 1; j >= 0; j--) { - MoveInfo moveInfo = moves.get(j); - RecyclerView.ViewHolder item = moveInfo.holder; - View view = item.itemView; - view.setTranslationY(0); - view.setTranslationX(0); - dispatchMoveFinished(moveInfo.holder); - moves.remove(j); - if (moves.isEmpty()) { - mMovesList.remove(moves); - } - } - } - listCount = mAdditionsList.size(); - for (int i = listCount - 1; i >= 0; i--) { - ArrayList additions = mAdditionsList.get(i); - count = additions.size(); - for (int j = count - 1; j >= 0; j--) { - RecyclerView.ViewHolder item = additions.get(j); - View view = item.itemView; - view.setAlpha(1); - dispatchAddFinished(item); - additions.remove(j); - if (additions.isEmpty()) { - mAdditionsList.remove(additions); - } - } - } - listCount = mChangesList.size(); - for (int i = listCount - 1; i >= 0; i--) { - ArrayList changes = mChangesList.get(i); - count = changes.size(); - for (int j = count - 1; j >= 0; j--) { - endChangeAnimationIfNecessary(changes.get(j)); - if (changes.isEmpty()) { - mChangesList.remove(changes); - } - } - } - - cancelAll(mRemoveAnimations); - cancelAll(mMoveAnimations); - cancelAll(mAddAnimations); - cancelAll(mChangeAnimations); - - dispatchAnimationsFinished(); - } - - void cancelAll(List viewHolders) { - for (int i = viewHolders.size() - 1; i >= 0; i--) { - viewHolders.get(i).itemView.animate().cancel(); - } - } - - /** - * {@inheritDoc} - *

- * If the payload list is not empty, DefaultItemAnimator returns true. - * When this is the case: - *

    - *
  • If you override {@link #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)}, both - * ViewHolder arguments will be the same instance. - *
  • - *
  • - * If you are not overriding {@link #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)}, - * then DefaultItemAnimator will call {@link #animateMove(RecyclerView.ViewHolder, int, int, int, int)} and - * run a move animation instead. - *
  • - *
- */ - @Override - public boolean canReuseUpdatedViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, - @NonNull List payloads) { - return !payloads.isEmpty() || super.canReuseUpdatedViewHolder(viewHolder, payloads); - } -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingFeedbackDialog.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingFeedbackDialog.kt deleted file mode 100644 index 8113ced685..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingFeedbackDialog.kt +++ /dev/null @@ -1,98 +0,0 @@ -package com.mogo.och.unmanned.taxi.ui.routing - -import android.content.Context -import android.widget.ImageView -import android.widget.TextView -import androidx.lifecycle.LifecycleObserver -import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog -import com.mogo.och.unmanned.taxi.R - -class TaxiRoutingFeedbackDialog : BaseFloatDialog, LifecycleObserver { - - private var commonConfirm: TextView? = null - private var commonCancel: TextView? = null - private var commonTips: TextView? = null - private var commonCloseIcon: ImageView? = null - private var clickListener: TaxiRoutingFeedBackDialogClickListener? = null - - constructor(builder: Builder, context: Context) : super(context) { - commonTips?.text = builder.tipsStr - commonCancel?.text = builder.cancelStr - commonConfirm?.text = builder.confirmStr - clickListener = builder.clickListener - } - - init { - setContentView(R.layout.unmanned_dialog_routing_feedback_result) - - setCanceledOnTouchOutside(true) - - commonConfirm = findViewById(R.id.routing_common_confirm) - commonCancel = findViewById(R.id.routing_common_cancel) - commonTips = findViewById(R.id.routing_common_tips) - commonCloseIcon = findViewById(R.id.closeDialogIcon) - - commonCloseIcon?.setOnClickListener { - dismiss() - } - - commonConfirm?.setOnClickListener { - clickListener?.confirm() - dismiss() - } - - commonCancel?.setOnClickListener { - clickListener?.cancel() - dismiss() - } - } - - fun showDialog() { - if (isShowing) { - return - } - show() - } - - fun hideDialog() { - if (isShowing) { - dismiss() - } - } - - interface TaxiRoutingFeedBackDialogClickListener { - fun confirm() - fun cancel() - } - - class Builder { - var tipsStr: String = "" - var confirmStr: String = "" - var cancelStr: String = "" - var clickListener: TaxiRoutingFeedBackDialogClickListener? = null - - fun tips(tips: String): Builder { - this.tipsStr = tips - return this - } - - fun confirmStr(commit: String): Builder { - this.confirmStr = commit - return this - } - - fun cancelStr(cancel: String): Builder { - this.cancelStr = cancel - return this - } - - fun clickListener(listener: TaxiRoutingFeedBackDialogClickListener): Builder { - this.clickListener = listener - return this - } - - fun build(context: Context): TaxiRoutingFeedbackDialog? { - return TaxiRoutingFeedbackDialog(this, context) - } - } -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingLoadingDialog.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingLoadingDialog.kt deleted file mode 100644 index 1d1be9867c..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingLoadingDialog.kt +++ /dev/null @@ -1,73 +0,0 @@ -package com.mogo.och.unmanned.taxi.ui.routing - -import android.animation.ObjectAnimator -import android.content.Context -import android.view.animation.LinearInterpolator -import androidx.lifecycle.LifecycleObserver -import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog -import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.mogo.och.unmanned.taxi.R -import kotlinx.android.synthetic.main.unmanned_dialog_routing_loading.dialog_loading_text -import kotlinx.android.synthetic.main.unmanned_dialog_routing_loading.dialog_loading_view - -/** - * loading - */ -class TaxiRoutingLoadingDialog : BaseFloatDialog, LifecycleObserver { - private var objectAnimator: ObjectAnimator? = null - private val mLoadingView by lazy { dialog_loading_view } - private val mLoadingText by lazy { dialog_loading_text } - private var mRunnable:Runnable= Runnable { - ToastUtils.showLong("超时未响应,请求失败") - hideLoading() - } - - constructor(context: Context) : super(context) - - init { - setContentView(R.layout.unmanned_dialog_routing_loading) - setCanceledOnTouchOutside(false) - } - - /** - * 开始旋转 - */ - private fun startRotation() { - objectAnimator = ObjectAnimator.ofFloat(mLoadingView, "rotation", -720f, 0f) - objectAnimator?.let { - it.duration = 3000 - it.repeatCount = -1 - it.interpolator = LinearInterpolator() - it.start() - } - } - - /** - * 停止旋转 - */ - private fun stopRotation() { - objectAnimator?.let { - if (it.isRunning) { - it.end() - objectAnimator = null - } - } - } - - /** - * 显示dialog - */ - fun showLoading() { - mLoadingText.text = "请求中,请稍后..." - startRotation() - show() - } - - /** - * 隐藏dialog - */ - fun hideLoading() { - stopRotation() - dismiss() - } -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingModel.kt index 56e69fe74b..f5c3afe577 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingModel.kt @@ -13,8 +13,6 @@ object TaxiRoutingModel { mOrderStatusCallback = callback } - - /** * 显示/隐藏 前往任务目的地的导航 * diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingUiIntent.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingUiIntent.kt deleted file mode 100644 index 2ae40f16ce..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingUiIntent.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.mogo.och.unmanned.taxi.ui.routing - -import com.mogo.och.unmanned.taxi.base.IUiIntent -import com.mogo.och.unmanned.taxi.bean.EndGrayTaskFeedbackType -import com.mogo.och.unmanned.taxi.bean.GrayLineBean - -sealed class TaxiRoutingUiIntent : IUiIntent { - - //打开选择路线页面 - data class StartChooseLineAction(val currentTimestamp: Long) : TaxiRoutingUiIntent() - - //查询灰度线路列表 - data class QueryRoutingGrayLineList(val currentTimestamp: Long) : TaxiRoutingUiIntent() - - //开始一个任务并查询此任务对应的轨迹详情 - data class StartTaskAndQueryContrail(val grayLineBean: GrayLineBean) : TaxiRoutingUiIntent() - - //展示Routing任务信息 - data class ShowRoutingTask(val routingTask: RoutingUIState.RoutingTask) : - TaxiRoutingUiIntent() - - //开始任务 - data class StartTaskAction(val routingTask: RoutingUIState.RoutingTask) : TaxiRoutingUiIntent() - - //问题打点 - data class SubmitGrayLineIssueLocation(val grayId: Long) : TaxiRoutingUiIntent() - - //展示结束任务反馈弹框 - data class ShowFeedbackDialog(val grayId: Long) : TaxiRoutingUiIntent() - - //结束任务 - data class SubmitEndTask(val grayId: Long, val type: EndGrayTaskFeedbackType,val occurrenceTime:Long) : - TaxiRoutingUiIntent() -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingUiState.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingUiState.kt deleted file mode 100644 index 6797e281f2..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingUiState.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.mogo.och.unmanned.taxi.ui.routing - -import com.mogo.och.unmanned.taxi.base.IUiState -import com.mogo.och.unmanned.taxi.bean.ContrailBean -import com.mogo.och.unmanned.taxi.bean.GrayLineBean - -data class TaxiRoutingUiState(val routingUiState: RoutingUIState) : IUiState - -/** - * 算路UI状态 - */ -sealed class RoutingUIState { - object Init : RoutingUIState() - - data class ShowGrayLineList(var data: MutableList) : RoutingUIState() - - data class HideChooseLineLoading(var isCosePage: Boolean) : RoutingUIState() - - data class PostRoutingTaskResult( - val grayLineBean: GrayLineBean?, - val contrailBean: ContrailBean?, - val grayId: Long? - ) : RoutingUIState() - - data class RoutingTask( - val grayLineBean: GrayLineBean?, - val contrailBean: ContrailBean?, - val grayId: Long? - ) : RoutingUIState() - - data class ShowFinishTaskButton(val routingTask: RoutingTask) : RoutingUIState() - data class ShowFeedbackDialog(val grayId: Long, val currentTimestamp: Long) : RoutingUIState() - object DismissFeedbackDialog : RoutingUIState() -} - - diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/errorpoint/ReportErrorPointView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/errorpoint/ReportErrorPointView.kt index 03a2b0d5f1..d6e9c4820b 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/errorpoint/ReportErrorPointView.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/errorpoint/ReportErrorPointView.kt @@ -19,7 +19,6 @@ import com.mogo.och.common.module.wigets.dialog.CommonDialogView import com.mogo.och.common.module.wigets.dialog.CommonFeedbackDialog import com.mogo.och.unmanned.taxi.R import com.mogo.och.unmanned.taxi.bean.PointError -import com.mogo.och.unmanned.taxi.ui.routing.TaxiRoutingLoadingDialog import kotlinx.android.synthetic.main.taxt_report_error_point_panel.view.lvs_loding import kotlinx.android.synthetic.main.taxt_report_error_point_panel.view.rvErrorPointReason import kotlinx.android.synthetic.main.taxt_report_error_point_panel.view.tv_report_error_point_reason diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingrunning/RoutingRunningView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingrunning/RoutingRunningView.kt index f89b04ef30..7778358d1e 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingrunning/RoutingRunningView.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingrunning/RoutingRunningView.kt @@ -22,7 +22,6 @@ import com.mogo.och.unmanned.taxi.bean.EndGrayTaskFeedbackType import com.mogo.och.unmanned.taxi.bean.StartGrayAndQueryContrailRsp import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst import com.mogo.och.unmanned.taxi.ui.routing.RoutingSwitchModel -import com.mogo.och.unmanned.taxi.ui.routing.TaxiRoutingFeedbackDialog import com.mogo.och.unmanned.taxi.ui.routing.TaxiRoutingModel import com.mogo.och.common.module.map.MapMakerManager import com.mogo.och.common.module.wigets.dialog.CommonDialogStatus @@ -59,9 +58,6 @@ class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCal private var swtichViewModel: RoutingSwitchModel?=null - private var mFeedbackDialog: TaxiRoutingFeedbackDialog? = null - - init { LayoutInflater.from(context).inflate(R.layout.unmanned_routing_running, this, true) initView() @@ -85,10 +81,6 @@ class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCal } - private fun hideFeedbackDialog() { - mFeedbackDialog?.hideDialog() - } - private fun showFeedbackDialog(grayId: Long) { val occurrenceTime = System.currentTimeMillis() CommonDialogStatus @@ -116,35 +108,6 @@ class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCal } }) .build(context).show() - - - -// val builder: TaxiRoutingFeedbackDialog.Builder = TaxiRoutingFeedbackDialog.Builder() -// builder.cancelStr( -// MainMoGoApplication.getApp() -// .getString(R.string.routing_feedback_result_btn_not_sure) -// ).confirmStr( -// MainMoGoApplication.getApp() -// .getString(R.string.routing_feedback_result_btn_sure) -// ).tips(MainMoGoApplication.getApp().getString(R.string.routing_feedback_result_hint)) -// .clickListener(object : -// TaxiRoutingFeedbackDialog.TaxiRoutingFeedBackDialogClickListener { -// override fun confirm() { -// swtichViewModel?.showLoading() -// viewModel?.endGrayTask( grayId, -// EndGrayTaskFeedbackType.USABLE_YES, -// occurrenceTime) -// } -// -// override fun cancel() { -// swtichViewModel?.showLoading() -// viewModel?.endGrayTask( grayId, -// EndGrayTaskFeedbackType.USABLE_NO, -// occurrenceTime) -// } -// }) -// mFeedbackDialog = builder.build(context) -// mFeedbackDialog?.showDialog() } /** @@ -294,7 +257,6 @@ class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCal override fun onSubmitEndTaskFailed(errorStr: String) { ToastUtils.showShort(errorStr) - hideFeedbackDialog() viewModel?.data?.let { swtichViewModel?.showRoutingRunning(it) } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingselect/RoutingSelectView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingselect/RoutingSelectView.kt index 862a9a2ecf..51218eac35 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingselect/RoutingSelectView.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingselect/RoutingSelectView.kt @@ -15,7 +15,6 @@ import com.mogo.och.unmanned.taxi.bean.GrayLineBean import com.mogo.och.unmanned.taxi.bean.StartGrayAndQueryContrailRsp import com.mogo.och.unmanned.taxi.ui.debug.DebugView import com.mogo.och.unmanned.taxi.ui.routing.RoutingSwitchModel -import com.mogo.och.unmanned.taxi.ui.routing.TaxiRoutingChooseLineItemOpenAnimator import com.mogo.och.unmanned.taxi.ui.routing.routingselect.RoutingSelectModel.SwtichRoutingViewCallback import kotlinx.android.synthetic.main.unmanned_routing_select.view.include_empty import kotlinx.android.synthetic.main.unmanned_routing_select.view.include_error @@ -58,7 +57,6 @@ class RoutingSelectView: ConstraintLayout, SwtichRoutingViewCallback { mLinearLayoutManager = WrapContentLinearLayoutManager(context) switch_routing_rv.layoutManager = mLinearLayoutManager - switch_routing_rv.itemAnimator = TaxiRoutingChooseLineItemOpenAnimator() mChooseLineListAdapter = RoutingItemAdapter(context, mRoutingLineList) switch_routing_rv.addItemDecoration(SpacesItemDecoration(AutoSizeUtils.dp2px(context,20f))) switch_routing_rv.adapter = mChooseLineListAdapter diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiCurrentTaskFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiCurrentTaskFragment.kt deleted file mode 100644 index 9fcd9ad1f4..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiCurrentTaskFragment.kt +++ /dev/null @@ -1,862 +0,0 @@ -package com.mogo.och.unmanned.taxi.ui.task - -import android.graphics.Color -import android.graphics.drawable.GradientDrawable -import android.os.Bundle -import android.os.CountDownTimer -import android.text.TextUtils -import android.view.View -import androidx.core.content.ContextCompat -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.lifecycleScope -import com.amap.api.navi.model.NaviLatLng -import com.mogo.commons.mvp.BaseFragment -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getState -import com.mogo.eagle.core.function.hmi.ui.widget.ItinerarySummaryDialog -import com.mogo.eagle.core.function.main.MainMoGoApplication -import com.mogo.eagle.core.network.utils.GsonUtil -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -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.Companion.M_TAXI -import com.mogo.eagle.core.utilcode.util.ClickUtils -import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.mogo.eagle.core.utilcode.util.UiThreadHandler -import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum -import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager -import com.mogo.och.common.module.map.AmapNaviToDestinationModel -import com.mogo.och.common.module.map.ICommonNaviChangedCallback -import com.mogo.och.common.module.utils.DateTimeUtil -import com.mogo.och.common.module.utils.FlowBus -import com.mogo.och.common.module.voice.VoiceNotice -import com.mogo.och.common.module.wigets.OCHCommitDialog -import com.mogo.och.unmanned.taxi.R -import com.mogo.och.unmanned.taxi.bean.OrderDetail -import com.mogo.och.unmanned.taxi.bean.QueryCurrentTaskRespBean -import com.mogo.och.unmanned.taxi.bean.StartServiceRespBean -import com.mogo.och.unmanned.taxi.constant.TaskStatusEnum -import com.mogo.och.unmanned.taxi.constant.TaskTypeEnum -import com.mogo.och.unmanned.taxi.constant.TaxiDriverEventConst -import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst.Companion.TAXI_END_MAP_MAKER -import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst.Companion.TAXI_START_MAP_MAKER -import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst.Companion.TYPE_MARKER_TAXI_ORDER -import com.mogo.och.common.module.map.MapMakerManager -import com.mogo.och.unmanned.taxi.utils.TaskUtils -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.cancelOrder -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.endPoint -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.endStationName -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.mCurrentTaskLayout -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.naviToEnd -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.naviToStart -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.noTaskData -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.orderPhoneAndNum -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.pathwayPoint -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.startPoint -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.startStationName -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.taskClickBtn -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.taskOtherInfo -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.taskStatus -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.taskTypeTv -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.trajectoryType -import kotlinx.android.synthetic.main.unmanned_taxi_no_data_common_view.noOrderDataTv -import kotlinx.android.synthetic.main.unmanned_taxi_no_data_common_view.prepareTaskCountdownTv -import kotlinx.coroutines.flow.map - -/** - * @author: wangmingjun - * @date: 2023/7/24 - */ -class TaxiCurrentTaskFragment : BaseFragment(), - View.OnClickListener, ICommonNaviChangedCallback { - - private lateinit var mViewModel: TaxiCurrentTaskViewModel - - private var mPrepareTasCountDownTimer: CountDownTimer? = null - - private var dialog:ItinerarySummaryDialog? = null - - companion object { - const val TAG = M_TAXI + "TaxiCurrentTaskFragment" - - fun newInstance(): TaxiCurrentTaskFragment { - val args = Bundle() - val fragment = TaxiCurrentTaskFragment() - fragment.arguments = args - return fragment - } - } - - override fun getLayoutId(): Int { - return R.layout.unmanned_task_fragment_current - } - - override fun getTagName(): String { - return this.javaClass.simpleName - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - mViewModel = ViewModelProvider( - this, - ViewModelProvider.NewInstanceFactory() - )[TaxiCurrentTaskViewModel::class.java] - } - - override fun initViews() { - initOnClickListener() - initContainerView(false) - initTaskDebugViewListener() - initViewModelObserver() - } - - /** - * 是否有正在进行的订单,进行UI显示 - * - * @param hasCurrentTask - */ - private fun initContainerView(hasCurrentTask: Boolean) { - d( - TAG, - "hasCurrentTask = $hasCurrentTask" - ) - if (hasCurrentTask) { - noTaskData.visibility = View.GONE - mCurrentTaskLayout.visibility = View.VISIBLE - } else { - noTaskData.visibility = View.VISIBLE - noOrderDataTv.text = "暂无进行中订单" - mCurrentTaskLayout.visibility = View.GONE - taskOtherInfo.text = "距离 -- 公里, 用时 -- 分钟" - } - } - - private fun initOnClickListener() { - naviToStart.setOnClickListener(this) - naviToEnd.setOnClickListener(this) - - cancelOrder.setOnClickListener(this) - taskStatus.setOnClickListener(this) - taskClickBtn.setOnClickListener(this) - } - - private fun initTaskDebugViewListener() { - taskStatus.setOnLongClickListener { - FlowBus.with(TaxiDriverEventConst.TaxiFragmentEvent.EVENT_TYPE_SHOW_DEBUG_VIEW) - .post(this.lifecycleScope, true) - false - } - } - - private fun initViewModelObserver() { - mViewModel.sendUiIntent(TaskUiIntent.StartTaskWithOrderLooper) - - //监听返回的数据状态 - lifecycleScope.launchWhenStarted { - mViewModel.uiStateFlow.map { it.taskWithOrderUIState }.collect { taskAndOrderUiState -> - d(TAG, "uiStateFlow-initViewModelObserver: $taskAndOrderUiState") - when (taskAndOrderUiState) { - is TaskWithOrderUIState.Init -> { - } - - // 开始接单后 需要将车开到最近的一个站点就位,然后才能开启 无人化 流程 - is TaskWithOrderUIState.TaskDriveToNearestStationTask -> { - if (taskAndOrderUiState.driveToNearestStationTask != null) { - updateViewByDriveToNearestStationTask(taskAndOrderUiState.driveToNearestStationTask) - } else { - updatePrepareTaskDelayUI(0, false) - initContainerView(false) - removeAllMapMarker() - } - } - - is TaskWithOrderUIState.TaskWithOrder -> { - val currentTaskWithOrder = taskAndOrderUiState.taskWithOrder - if (currentTaskWithOrder == null) { - initContainerView(false) - removeAllMapMarker() - } else { - updateViewByCurrentTaskWithOrder(currentTaskWithOrder) - } - updateNextTaskFragment(currentTaskWithOrder) - } - - is TaskWithOrderUIState.UpdateOrderTripInfo -> { - dialog?.setOrderMileage(taskAndOrderUiState.mileage*1000) - taskOtherInfo.text = - TaskUtils.getCurrentTaskTotalAndDurationHtml( - taskAndOrderUiState.mileage, - taskAndOrderUiState.duration - ) - } - - is TaskWithOrderUIState.UpdateTaskTripLocalCalculateInfo -> { - updateCurrentTaskTripInfo( - taskAndOrderUiState.meters, - taskAndOrderUiState.timeInSecond - ) - } - - is TaskWithOrderUIState.UpdatePrepareTaskDelay -> { - updatePrepareTaskDelayUI( - taskAndOrderUiState.delayTime, - taskAndOrderUiState.isStart - ) - } - } - } - } - } - - /** - * 更新拉取任务倒计时 - */ - private fun updatePrepareTaskDelayUI(millisInFuture: Long, isStart: Boolean) { - - if (!isStart) { - prepareTaskCountdownTv.visibility = View.INVISIBLE - mPrepareTasCountDownTimer?.cancel() - mPrepareTasCountDownTimer = null - return - } - - if (mPrepareTasCountDownTimer != null) { - mPrepareTasCountDownTimer?.cancel() - mPrepareTasCountDownTimer = null - } - - prepareTaskCountdownTv.visibility = View.VISIBLE - mPrepareTasCountDownTimer = - object : CountDownTimer(millisInFuture, 1000L) {// 倒计时后开启自驾 - - override fun onTick(millisUntilFinished: Long) { - // 倒计时 - UiThreadHandler.post { - prepareTaskCountdownTv.text = - "距离任务获取还有 ${DateTimeUtil.second2MMSS(millisUntilFinished / 1000)}" - } - } - - override fun onFinish() { - //倒计时结束了... - UiThreadHandler.post { - prepareTaskCountdownTv.visibility = View.INVISIBLE - } - mPrepareTasCountDownTimer?.cancel() - } - } - - mPrepareTasCountDownTimer?.start() - } - - private fun updateViewByDriveToNearestStationTask(driveToNearestStationTask: StartServiceRespBean.Result?) { - if (driveToNearestStationTask == null) return - initContainerView(true) - // DriverToNearestStationTask 任务更新 - taskStatus.visibility = View.VISIBLE - taskTypeTv.visibility = View.GONE - cancelOrder.visibility = View.GONE - orderPhoneAndNum.visibility = View.GONE - startStationName.visibility = View.VISIBLE - endStationName.visibility = View.VISIBLE - taskClickBtn.visibility = View.GONE - naviToStart.visibility = View.GONE - naviToEnd.visibility = View.VISIBLE - taskOtherInfo.visibility = View.VISIBLE - pathwayPoint.visibility = View.GONE - - // 更新任务状态,起点,终点 - taskStatus.text = resources.getString(R.string.task_start_to_virtual_site) - startStationName.text = resources.getString(R.string.task_current_loc) - endStationName.text = driveToNearestStationTask.siteName - updateStartAndEndStationPointByStatus(true) - - setOrRemoveMapMaker( - true, - TAXI_END_MAP_MAKER, - driveToNearestStationTask.wgs84Lat, - driveToNearestStationTask.wgs84Lon, - R.raw.end_marker - ) - - // 使用高德获取导航数据 - startNaviToStation( - false, - driveToNearestStationTask.gcjLat, - driveToNearestStationTask.gcjLon - ) - } - - private fun updateStartAndEndStationPointByStatus(isGoingToStation: Boolean) { - if (isGoingToStation) {// 即将到达的站点 - startPoint.setImageResource(R.drawable.taxi_driver_circle_blue_big) - endPoint.setImageResource(R.drawable.taxi_driver_circle_green_big) - } else {// 到达站点 或 已经经过的站点 - startPoint.setImageResource(R.drawable.taxi_driver_circle_green_big) - endPoint.setImageResource(R.drawable.taxi_driver_circle_blue_big) - } - } - - private fun updateNextTaskFragment(result: QueryCurrentTaskRespBean.Result?) { - FlowBus.with(TaxiDriverEventConst.TabFragmentEvent.EVENT_TYPE_TASK_WITH_ORDER_CHANGED) - .post(this.lifecycleScope, result) - - if (result != null - && result.taskType == TaskTypeEnum.VirtualTask.code - && result.order != null - && result.currentStatus != TaskStatusEnum.CompleteTask.code - ) { - VoiceNotice.showNotice("已为您提前接到下一订单,待完成当前任务后服务") - FlowBus.with(TaxiDriverEventConst.TabFragmentEvent.EVENT_TYPE_SHOW_RED_POINT) - .post(this.lifecycleScope, true) - } else { - FlowBus.with(TaxiDriverEventConst.TabFragmentEvent.EVENT_TYPE_SHOW_RED_POINT) - .post(this.lifecycleScope, false) - } - } - - fun onCarTakeOrderStatusChanged() { - if (this::mViewModel.isInitialized) { - mViewModel.sendUiIntent(TaskUiIntent.StartOrEndTakeOrder) - } else { - CallerLogger.e(TAG, "onCarTakeOrderStatusChanged: mViewModel is not Initialized") - } - } - - /** - * 根据任务状态计算剩余历程和时间 - */ - private fun updateRemainDistanceAndTime(isVoicePlay: Boolean) { - val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() ?: return - d(TAG, "updateRemainDistanceAndTime ${currentTaskWithOrder.currentStatus}") - if (currentTaskWithOrder.currentStatus == TaskStatusEnum.StartTask.code) { - if (currentTaskWithOrder.endSite != null) { - startNaviToStation( - isVoicePlay, currentTaskWithOrder.endSite!!.gcjLat, - currentTaskWithOrder.endSite!!.gcjLon - ) - } - - } else if (currentTaskWithOrder.currentStatus == TaskStatusEnum.CompleteTask.code && - currentTaskWithOrder.taskType <= TaskTypeEnum.ToOrderStartTask.code - ) { - taskOtherInfo.text = "已到达 ${currentTaskWithOrder.endSite?.siteName}" - } else { - taskOtherInfo.text = "距离 -- 公里, 用时 -- 分钟" - } - } - - /** - * 更新当前任务和订单信息 - */ - private fun updateViewByCurrentTaskWithOrder(taskAndOrder: QueryCurrentTaskRespBean.Result?) { - if (taskAndOrder == null) return - /** - * 根据任务类型判断任务显示, - * 虚拟单, 显示在进行中 前往上车点 - * 演练任务,显示演练任务, 同时有订单显示在待服务中 - * 当前任务是接驾任务,显示订单状态+运营单 订单显示在进行中, 任务不再显示 - */ - val taskType = taskAndOrder.taskType // 任务类型 - val order = taskAndOrder.order // 订单信息 - val endSite = taskAndOrder.endSite // 终点 - val currentStatus = taskAndOrder.currentStatus // 任务的状态 0:空闲 1:获取任务 2:开始任务 3:到达目的地 - - if ((endSite == null || currentStatus == TaskStatusEnum.CompleteTask.code) // 无任务或者任务已经完成的时候且无订单的时候 - && taskAndOrder.order == null - ) { - initContainerView(false) - removeAllMapMarker() - return - } - - initContainerView(true) - - when (taskType) { - TaskTypeEnum.None.code -> { - if (order != null && (currentStatus == TaskStatusEnum.CompleteTask.code - || currentStatus == TaskStatusEnum.None.code) - ) { //暂停接单会清空前往上车点任务 - updateOrderUI(order) - } - } - - TaskTypeEnum.VirtualTask.code -> { //演练任务 - - if (order != null && currentStatus == TaskStatusEnum.CompleteTask.code) { - updateOrderUI(order) - } else { - updateVirtualTaskUI(taskAndOrder) - } - } - - TaskTypeEnum.ToOrderEndTask.code, TaskTypeEnum.ToOrderStartTask.code -> {// 接驾任务 或 送驾任务 - order?.also { - updatePathwayPoint(taskType, endSite?.siteName) - updateOrderUI(it) - } - } - } - - updateMapMarkers(taskAndOrder) - updateRemainDistanceAndTime(false) - } - - private fun updatePathwayPoint(taskType: Int, endSiteName: String?) { - if (TextUtils.isEmpty(endSiteName)) return - pathwayPoint.visibility = if (taskType == TaskTypeEnum.ToOrderStartTask.code) - View.VISIBLE else View.GONE - pathwayPoint.text = "途径: $endSiteName" - } - - private fun updateMapMarkers(taskAndOrder: QueryCurrentTaskRespBean.Result?) { - if (taskAndOrder?.startSite != null - && taskAndOrder.endSite != null - ) { - when (taskAndOrder.currentStatus) { - TaskStatusEnum.GetTask.code -> { - setOrRemoveMapMaker( - true, - TAXI_START_MAP_MAKER, - taskAndOrder.startSite!!.wgs84Lat, - taskAndOrder.startSite!!.wgs84Lon, - R.raw.star_marker - ) - setOrRemoveMapMaker( - true, - TAXI_END_MAP_MAKER, - taskAndOrder.endSite!!.wgs84Lat, - taskAndOrder.endSite!!.wgs84Lon, - R.raw.end_marker - ) - } - - TaskStatusEnum.StartTask.code -> { - setOrRemoveMapMaker( - false, - TAXI_START_MAP_MAKER, - taskAndOrder.startSite!!.wgs84Lat, - taskAndOrder.startSite!!.wgs84Lon, - R.raw.star_marker - ) - setOrRemoveMapMaker( - true, - TAXI_END_MAP_MAKER, - taskAndOrder.endSite!!.wgs84Lat, - taskAndOrder.endSite!!.wgs84Lon, - R.raw.end_marker - ) - } - - TaskStatusEnum.CompleteTask.code -> { - setOrRemoveMapMaker( - false, - TAXI_START_MAP_MAKER, - taskAndOrder.startSite!!.wgs84Lat, - taskAndOrder.startSite!!.wgs84Lon, - R.raw.star_marker - ) - setOrRemoveMapMaker( - false, - TAXI_END_MAP_MAKER, - taskAndOrder.endSite!!.wgs84Lat, - taskAndOrder.endSite!!.wgs84Lon, - R.raw.end_marker - ) - } - } - } else { - d( - TAG, - "CurrentTaskWithOrder == " + GsonUtil.jsonFromObject(taskAndOrder) - ) - } - } - - private fun updateVirtualTaskUI(taskAndOrder: QueryCurrentTaskRespBean.Result?) { - - if (taskAndOrder == null) return - - val startSite = taskAndOrder.startSite // 起点 - val endSite = taskAndOrder.endSite // 终点 - val currentStatus = taskAndOrder.currentStatus // 任务的状态 0:空闲 1:获取任务 2:开始任务 3:到达目的地 - - cancelOrder.visibility = View.GONE - orderPhoneAndNum.visibility = View.GONE - taskClickBtn.visibility = View.GONE - - naviToStart.visibility = View.GONE - taskTypeTv.visibility = View.VISIBLE - naviToEnd.visibility = - if (currentStatus >= TaskStatusEnum.StartTask.code) View.VISIBLE else View.GONE - taskOtherInfo.visibility = - if (currentStatus == TaskStatusEnum.GetTask.code) View.GONE else View.VISIBLE - - pathwayPoint.visibility = View.GONE - - if (startSite == null || endSite == null) return - - taskStatus.text = resources.getString(R.string.task_start_end_site) - taskTypeTv.background = - ContextCompat.getDrawable( - MainMoGoApplication.getApp().applicationContext, R.drawable.task_unreal_type_btn_bg - ) - taskTypeTv.text = resources.getString(R.string.task_exercise) - startStationName.text = startSite.siteName - endStationName.text = endSite.siteName - TaxiTaskModel.getCurrentOrderTrajectoryList().also { - val taskTrajectory = it.firstOrNull {taskAndOrder.lineId == it.lineId} - trajectoryType.visibility = if (taskTrajectory?.source == 2) - View.VISIBLE else View.GONE - } - updatePrepareTaskDelayUI(0, false) - updateStartAndEndStationPointByStatus(true) - } - - private fun updateOrderUI(order: OrderDetail) { - cancelOrder.visibility = if (order.orderStatus - == TaxiOrderStatusEnum.ArriveAtEnd.code - ) View.GONE else View.VISIBLE - orderPhoneAndNum.visibility = View.VISIBLE - taskClickBtn.visibility = View.VISIBLE - taskTypeTv.visibility = View.VISIBLE -// orderStatus: 0 订单创建(为派单), 10 已派上司机(司机去往上车点), 20 司机到达上车点, -// 30 乘客到达上车点, 40 服务中(去往目的地), 50 到达目的地, 60 已完成, 70 已取消 - naviToStart.visibility = if (order.orderStatus - == TaxiOrderStatusEnum.OnTheWayToStart.code - ) View.VISIBLE else View.GONE - - naviToEnd.visibility = if (order.orderStatus - == TaxiOrderStatusEnum.OnTheWayToEnd.code - ) View.VISIBLE else View.GONE - taskOtherInfo.visibility = View.VISIBLE - - updatePrepareTaskDelayUI(0, false) - taskTypeTv.text = resources.getString(R.string.task_order) - taskTypeTv.background = - ContextCompat.getDrawable( - MainMoGoApplication.getApp().applicationContext, - R.drawable.task_order_type_btn_bg - ) - orderPhoneAndNum.text = TaskUtils.getCurrentTaskPhoneNumAndPassengerCountHtml( - order.bookingUserPhone, - order.passengerSize - ) - startStationName.text = order.orderStartSite?.siteName - endStationName.text = order.orderEndSite?.siteName - TaxiTaskModel.getCurrentOrderTrajectoryList().also { - val orderTrajectory = it.firstOrNull {order.orderLine == it.lineId} - trajectoryType.visibility = if (orderTrajectory?.source == 2) - View.VISIBLE else View.GONE - } - - when (order.orderStatus) { - TaxiOrderStatusEnum.None.code -> { //无 - dismissDialog() - initContainerView(false) - removeAllMapMarker() - } - - TaxiOrderStatusEnum.ArriveAtEnd.code -> { //到达目的地 - taskStatus.text = resources.getString(R.string.task_start_end_site) - showDialog() - updateStartAndEndStationPointByStatus(true) - updateTaskContainerBottomBtn( - getString(R.string.module_och_taxi_order_server_end), - Color.parseColor("#FFFFFF"), - Color.parseColor("#FF1D5EF3"), - true - ) - hideNaviBtns() - } - - TaxiOrderStatusEnum.OnTheWayToEnd.code -> { //送驾中 - dismissDialog() - taskStatus.text = resources.getString(R.string.task_start_end_site) - updateStartAndEndStationPointByStatus(true) - updateTaskContainerBottomBtn( - getString(R.string.module_och_taxi_order_close), - Color.parseColor("#FFFFFF"), - Color.parseColor("#FF1D5EF3"), - true - ) - } - - TaxiOrderStatusEnum.UserArriveAtStart.code, TaxiOrderStatusEnum.ArriveAtStart.code -> { - //乘客到达上车点, 验证成功 ; 到达乘客上车点 - dismissDialog() - taskStatus.text = resources.getString(R.string.arrived_start_site) - updateStartAndEndStationPointByStatus(false) - updateTaskContainerBottomBtn( - if (order.orderStatus == TaxiOrderStatusEnum.UserArriveAtStart.code) - getString(R.string.module_och_taxi_order_server_start) - else getString(R.string.module_och_taxi_order_server_start_wait_check), - Color.parseColor("#FFFFFF"), - Color.parseColor("#FF1D5EF3"), - true - ) - hideNaviBtns() - taskOtherInfo.text = TaskUtils.getCurrentTaskWaitTimeHtml() - } - - TaxiOrderStatusEnum.OnTheWayToStart.code -> { //前往上车地点 - dismissDialog() - taskStatus.text = resources.getString(R.string.task_start_start_site) - updateStartAndEndStationPointByStatus(false) - updateTaskContainerBottomBtn( - getString(R.string.module_och_taxi_order_server_start), - Color.parseColor("#4DFFFFFF"), - Color.parseColor("#4D1D5EF3"), - false - ) - } - } - } - - private fun hideNaviBtns() { - naviToStart.visibility = View.GONE - naviToEnd.visibility = View.GONE - AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi() - - FlowBus.with(TaxiDriverEventConst.TaxiFragmentEvent.EVENT_TYPE_SHOW_AMAP_NAVI_TO_STATION_FRAGMENT) - .post(this.lifecycleScope, false) - FlowBus.with(TaxiDriverEventConst.TaxiFragmentEvent.EVENT_TYPE_SHOW_ROUTING_TO_STATION_FRAGMENT) - .post(this.lifecycleScope, false) - } - - private fun startNaviToStation(isVoicePlay: Boolean, stationLat: Double, stationLng: Double) { - AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi() - val gcJ02Location = OchLocationManager.getGCJ02Location() - val mCurLatitude = gcJ02Location.latitude - val mCurLongitude = gcJ02Location.longitude - d(TAG, "currentLatLng=$mCurLatitude $mCurLongitude") - val startNaviLatLng = NaviLatLng(mCurLatitude, mCurLongitude) - val endNaviLatLng = NaviLatLng(stationLat, stationLng) - AmapNaviToDestinationModel.getInstance(context).initAMapNavi(startNaviLatLng, endNaviLatLng) - AmapNaviToDestinationModel.getInstance(context).setVoiceIsMute(isVoicePlay) - AmapNaviToDestinationModel.getInstance(context).setTaxiNaviChangedCallback(this) - } - - /** - * 剩余里程和剩余时间 - * @param meters 米 - * @param timeInSecond 秒 - */ - private fun updateCurrentTaskTripInfo(meters: Long, timeInSecond: Long) { - UiThreadHandler.post { - TaxiTaskModel.getCurrentTaskWithOrder() ?: return@post - d( - TAG, - "updateCurrentTaskTripInfo, taskUtil, ${ - TaskUtils.getCurrentTaskTripHtml( - meters, - timeInSecond - ) - }" - ) - taskOtherInfo.text = TaskUtils.getCurrentTaskTripHtml(meters, timeInSecond) - } - } - - override fun onDestroyView() { - AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi() - updatePrepareTaskDelayUI(0, false) - super.onDestroyView() - } - - private fun startOrEndService() { - val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() - if (currentTaskWithOrder?.order == null) return - val order = currentTaskWithOrder.order - if (TaxiOrderStatusEnum.ArriveAtStart.code == order!!.orderStatus) { //到达乘客上车点,司机可跳过乘客屏认证 - mViewModel.sendUiIntent(TaskUiIntent.JumpPassengerCheck) - } else if (TaxiOrderStatusEnum.UserArriveAtStart.code == order.orderStatus) { - mViewModel.sendUiIntent(TaskUiIntent.StartTask) - } else if (TaxiOrderStatusEnum.ArriveAtEnd.code == order.orderStatus) { //点击了完成服务,结束订单并更新订单信息 - mViewModel.sendUiIntent(TaskUiIntent.JourneyCompleted) - } else if (TaxiOrderStatusEnum.OnTheWayToEnd.code == order.orderStatus) { //前往目的地过程中可提前结束行程 - //自驾中提示,接管后才能结束 - if (getState() - == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING - ) { - ToastUtils.showLong(R.string.taxi_switch_line_btn_warning1) - } else { - closeOrderDialog() - } - } - } - - private fun closeOrderDialog() { - val builder = OCHCommitDialog.Builder() - val closeOrderDialog = builder - .title(getString(R.string.dialog_order_close_title)) - .tips(getString(R.string.dialog_order_close_content)) - .confirmStr(getString(R.string.dialog_order_close_confirm)) - .cancelStr(getString(R.string.dialog_order_close_cancel)) - .build(requireContext()) - closeOrderDialog!!.setClickListener(object : OCHCommitDialog.ClickListener { - override fun confirm() { - mViewModel.sendUiIntent(TaskUiIntent.CloseOrderByDriver) - } - - override fun cancel() { - closeOrderDialog.dismiss() - } - }) - closeOrderDialog.show() - } - - - override fun onClick(v: View) { - if (!ClickUtils.isFastClick()) { - i(TAG, "view点击过快") - return - } - when (v.id) { - taskClickBtn.id -> { - d(TAG, taskStatus.text.toString()) - startOrEndService() - } - - cancelOrder.id -> { - val currentWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() - if (currentWithOrder?.order != null) { - val order = currentWithOrder.order - activity?.also { - } - } - } - - naviToStart.id, - naviToEnd.id -> { - showNaviToEndStationFragment(true) - } - } - } - - /** - * 显示/隐藏 前往任务目的地的导航 - * - * @param isShow - */ - private fun showNaviToEndStationFragment(isShow: Boolean) { - FlowBus.with(TaxiDriverEventConst.TaxiFragmentEvent.EVENT_TYPE_START_NAVI_TO_END_STATION) - .post(this.lifecycleScope, isShow) - } - - override fun onCurrentNaviDistAndTimeChanged(meters: Int, timeInSecond: Long) { - updateCurrentTaskTripInfo(meters.toLong(), timeInSecond) - } - - override fun reInitNaviAmap(isPlay: Boolean, isRestart: Boolean) { - d(TAG, "isPlay = $isPlay, isRestart=$isRestart") - if (!isRestart) { - FlowBus.with(TaxiDriverEventConst.TaxiFragmentEvent.EVENT_TYPE_SHOW_AMAP_NAVI_TO_STATION_FRAGMENT) - .post(this.lifecycleScope, false) - return - } - val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() - - UiThreadHandler.postDelayed({ - updateRemainDistanceAndTime(false) - }, 2000) - - UiThreadHandler.postDelayed({ - if (currentTaskWithOrder?.currentStatus == TaskStatusEnum.GetTask.code - ) { - if (naviToStart.visibility == View.GONE) { - naviToStart.visibility = View.VISIBLE - } - } - if ((currentTaskWithOrder?.currentStatus == TaskStatusEnum.StartTask.code - && currentTaskWithOrder.order == null) - || (currentTaskWithOrder?.order?.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.code) - ) { - if (naviToEnd.visibility == View.GONE) { - naviToEnd.visibility = View.VISIBLE - } - } - }, 3000) - } - - fun onNaviToEndStationByAmap(isShow: Boolean) { - val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() ?: return - - FlowBus.with(TaxiDriverEventConst.TaxiFragmentEvent.EVENT_TYPE_SHOW_AMAP_NAVI_TO_STATION_FRAGMENT) - .post( - this.lifecycleScope, - if (currentTaskWithOrder.currentStatus == TaskStatusEnum.StartTask.code) - isShow - else - true - ) - updateRemainDistanceAndTime( - if (currentTaskWithOrder.currentStatus == TaskStatusEnum.StartTask.code) - isShow else true - ) - } - - /** - * 绘制地图起点终点 - * @param isAdd - * @param uuid - */ - private fun setOrRemoveMapMaker( - isAdd: Boolean, uuid: String, - lat: Double, lon: Double, resourceId: Int - ) { - if (isAdd) { - MapMakerManager.addMapMaker(TYPE_MARKER_TAXI_ORDER, uuid, lat, lon, resourceId) - } else { - MapMakerManager.removeMapMaker(uuid, lat, lon) - } - } - - private fun removeAllMapMarker() { - MapMakerManager.removeAllMapMarkerByOwner(TYPE_MARKER_TAXI_ORDER) - } - - private fun updateTaskContainerBottomBtn( - txt: String?, - txtColorId: Int, - bgColorId: Int, - isClickable: Boolean - ) { - taskClickBtn.text = txt - taskClickBtn.setTextColor(txtColorId) - val background = - taskClickBtn.background as GradientDrawable //GradientDrawable是Drawable的子类 - background.setColor(bgColorId) - taskClickBtn.isClickable = isClickable - } - - override fun onDestroy() { - mViewModel.startOrStopCurrentTaskWithOrderLoop(false) - super.onDestroy() - } - - private fun showDialog(){ - if(dialog==null&&context!=null){ - - } - context?.let { - if(dialog==null) { - dialog = ItinerarySummaryDialog(it, true, R.style.summary_dialog) - } - dialog?.let { dialogInner -> - if(!dialogInner.isShowing){ - dialogInner.show() - } - } - } - - } - private fun dismissDialog(){ - dialog?.let { - if(it.isShowing){ - it.dismiss() - } - } - dialog = null - } -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiCurrentTaskViewModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiCurrentTaskViewModel.kt deleted file mode 100644 index b01476393a..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiCurrentTaskViewModel.kt +++ /dev/null @@ -1,490 +0,0 @@ -package com.mogo.och.unmanned.taxi.ui.task - -import com.mogo.commons.AbsMogoApplication -import com.mogo.commons.module.status.MogoStatusManager -import com.mogo.eagle.core.data.BaseData -import com.mogo.eagle.core.data.config.FunctionBuildConfig -import com.mogo.eagle.core.data.map.MogoLocation -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager -import com.mogo.eagle.core.function.call.unmanned.CallerUnmannedListenerManager -import com.mogo.eagle.core.network.utils.GsonUtil -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d -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.order.TaxiOrderStatusEnum -import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager -import com.mogo.och.common.module.manager.autopilot.line.LineManager -import com.mogo.och.common.module.network.OchCommonServiceCallback -import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager -import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager -import com.mogo.och.common.module.utils.ToastUtilsOch -import com.mogo.och.common.module.voice.VoiceNotice -import com.mogo.och.data.bean.LineInfo -import com.mogo.och.unmanned.taxi.R -import com.mogo.och.unmanned.taxi.base.BaseViewModel -import com.mogo.och.unmanned.taxi.base.IUiIntent -import com.mogo.och.unmanned.taxi.bean.QueryCurrentTaskRespBean -import com.mogo.och.unmanned.taxi.bean.StartServiceRespBean -import com.mogo.och.unmanned.taxi.bean.TrajectoryListRespBean -import com.mogo.och.unmanned.taxi.callback.ITaxiCarServiceCallback -import com.mogo.och.unmanned.taxi.callback.ITaxiTaskWithOrderCallback -import com.mogo.och.unmanned.taxi.constant.TaskStatusEnum -import com.mogo.och.unmanned.taxi.constant.TaskTypeEnum -import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst -import com.mogo.och.unmanned.taxi.network.TaxiTaskWithOrderServiceManager -import com.mogo.och.unmanned.taxi.ui.debug.DebugView -import com.mogo.och.unmanned.taxi.utils.TaxiTrajectoryManager - -/** - * @author: wangmingjun - * @date: 2023/7/26 - */ -class TaxiCurrentTaskViewModel : BaseViewModel(), - ITaxiTaskWithOrderCallback, ITaxiCarServiceCallback { - - private val TAG = SceneConstant.M_TAXI + "TaxiUnmannedViewModel" - - init { - TaxiTaskModel.addTaskWithOrderListener(TAG, this) - TaxiTaskModel.setCarServiceCallback(this) - } - - override fun onCleared() { - TaxiTaskModel.removeTaskWithOrderListener(TAG) - TaxiTaskModel.removeCarServiceCallback() - super.onCleared() - } - - override fun initUiState(): UnmannedState { - return UnmannedState(TaskWithOrderUIState.Init) - } - - override fun handleIntent(intent: IUiIntent) { - when (intent) { - is TaskUiIntent.StartTaskWithOrderLooper -> { //开始轮询 - startOrStopCurrentTaskWithOrderLoop(true) - } - - is TaskUiIntent.StartOrEndTakeOrder -> {//开始、暂停接单 - TaxiTaskModel.updateCarServingStatus() - } - - is TaskUiIntent.JumpPassengerCheck -> { //手动点击跳过乘客验证 - jumpPassengerCheck() - } - - is TaskUiIntent.JourneyCompleted -> { //点击服务完成 - journeyCompleted() - } - - is TaskUiIntent.CloseOrderByDriver -> { - closeOrderByDriver() - } - - is TaskUiIntent.CancelOrder -> {// 取消订单, 暂未加取消类型和原因 - cancelOrder(intent.type) - } - - is TaskUiIntent.StartTask -> { - startTask() - } - } - } - - fun startOrStopCurrentTaskWithOrderLoop(start: Boolean) { - d(TAG, "startOrStopCurrentTaskWithOrderLoop(): isStart=$start") - if (start) { - DebugView.printInfoMsg("[查询TaskWithOrder信息] start loop") - TaxiTaskModel.startQueryCurrentTaskWithOrderLoop() - } else { - DebugView.printInfoMsg("[查询TaskWithOrder信息] stop loop") - TaxiTaskModel.stopQueryCurrentTaskWithOrderLoop() - } - } - - private fun cancelOrder(cancelType: Int) { - val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() - currentTaskWithOrder?.order?.also { - TaxiTaskModel.cancelOrder(it.orderNo, cancelType) - } - } - - private fun jumpPassengerCheck() { - DebugView.printInfoMsg("[跳过乘客验证] 准备发送请求") - val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() - currentTaskWithOrder?.order?.also { - TaxiTaskWithOrderServiceManager.jumpPassengerCheck(AbsMogoApplication.getApp().applicationContext, - it.orderNo, - object : OchCommonServiceCallback { - override fun onSuccess(data: BaseData?) { - DebugView.printInfoMsg("[跳过乘客验证] 请求success") - d(TAG, "jumpPassengerCheck onSuccess:") - } - - override fun onFail(code: Int, msg: String?) { - DebugView.printInfoMsg("[跳过乘客验证] 请求fail, code=$code, msg=$msg") - d(TAG, "jumpPassengerCheck onFail: code=$code, msg=$msg") - } - }) - } - } - - private fun journeyCompleted() { - DebugView.printInfoMsg("[服务完成] 准备发送请求") - val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() - currentTaskWithOrder?.order?.also { - TaxiTaskWithOrderServiceManager.orderCompleted(AbsMogoApplication.getApp().applicationContext, - it.orderNo, - object : OchCommonServiceCallback { - override fun onSuccess(data: BaseData?) { - DebugView.printInfoMsg("[服务完成] 请求success") - d(TAG, "journeyCompleted onSuccess") - } - - override fun onFail(code: Int, msg: String?) { - DebugView.printInfoMsg("[服务完成] 请求fail, code=$code, msg=$msg") - d(TAG, "journeyCompleted onFail: code=$code, msg=$msg") - } - }) - } - } - - private fun closeOrderByDriver() { - val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() - currentTaskWithOrder?.order?.orderEndSite?.also { - TaxiTaskModel.submitArriveSite(it.siteId, true) - } - } - - private fun startTask(isStartAutopilot: Boolean = true) { - if (!TaxiTaskModel.checkCurrentTaskCondition()) { - ToastUtils.showShort("无任务!") - return - } - - TaxiTaskModel.getCurrentTaskWithOrder()?.let { - TaxiTaskModel.startTask( - if (it.order != null && it.order!!.orderStatus >= TaxiOrderStatusEnum.ArriveAtStart.code) - it.order!!.orderLine //当前若是启动的送驾任务 , 则使用订单信息的lineId - else - it.lineId - ,isStartAutopilot) - } - } - - private fun updateTaskAndOrderUi(currentTaskWithOrder: QueryCurrentTaskRespBean.Result?) { - d( - TAG, "updateTaskAndOrderUi: currentTaskWithOrder=${ - GsonUtil.getGson().toJson(currentTaskWithOrder) - }" - ) - sendUiState { - copy( - taskWithOrderUIState = TaskWithOrderUIState.TaskWithOrder( - currentTaskWithOrder - ) - ) - } - } - - private fun updatePrepareTaskDelayUI(delayTime: Long, isStart: Boolean) { - d(TAG, "UpdatePrepareTaskDelay120SUI = $isStart") - sendUiState { - copy( - taskWithOrderUIState = TaskWithOrderUIState.UpdatePrepareTaskDelay(delayTime, - isStart - ) - ) - } - } - - private fun updateDriveToNearestStationTaskUI(driveToNearestStationTask: StartServiceRespBean.Result?) { - d(TAG, "updateDriveToNearestStationTaskUI = ${driveToNearestStationTask?.toString()}") - sendUiState { - copy( - taskWithOrderUIState = TaskWithOrderUIState.TaskDriveToNearestStationTask( - driveToNearestStationTask - ) - ) - } - } - - private fun updateOrderTripInfoUI(mileage: Float, duration: Int) { - d(TAG, "updateOrderTripInfoUI") - OchChainLogManager.writeChainLog("到达目的地计算距离和时间", "距离:${mileage} 时间:${duration}") - sendUiState { - copy( - taskWithOrderUIState = TaskWithOrderUIState.UpdateOrderTripInfo( - mileage, duration - ) - ) - } - } - - private fun updateTaskTripInfoLocalCalculateUI(meters: Long, timeInSecond: Long) { - d(TAG, "UpdateTaskTripInfoLocalCalculateUI") - sendUiState { - copy( - taskWithOrderUIState = TaskWithOrderUIState.UpdateTaskTripLocalCalculateInfo( - meters, timeInSecond - ) - ) - } - } - - override fun onTaskWithOrderQuerySuccess(timeMillis: Long) { - } - - override fun onTaskWithOrderDataChanged(result: QueryCurrentTaskRespBean.Result?) { - d(TAG, "onTaskWithOrderChanged = result = " + GsonUtil.jsonFromObject(result)) - DebugView.printInfoMsg("[查询TaskWithOrder信息] 更新数据, 刷新UI") - updateTaskAndOrderUi(result) - // 设置task执行相关状态,切换模式时判断使用 - if (result == null || result.taskType == TaskTypeEnum.None.code) { - MogoStatusManager.getInstance().setTaxiUnmanedDriverPerformTask(TAG, false) - LineManager.setLineInfo(null); - } else { - MogoStatusManager.getInstance().setTaxiUnmanedDriverPerformTask(TAG, true) - } - } - - override fun onTaskStarted(result: QueryCurrentTaskRespBean.Result?) { - updateLocalCalculateStation(result) - if (result?.endSite != null){ - TaxiTaskModel.setBeautificationMode(true) - updateAutopilotControlParameters() - }else{ - clearDemoModeAndACParameters() - } - } - - private fun updateLocalCalculateStation(result: QueryCurrentTaskRespBean.Result?) { - if (result?.startSite != null && result.endSite != null - ) { - d(TAG, "updateLocalCalculateStation start") - val curTaskAndOrder = TaxiTaskModel.getCurrentTaskWithOrder() ?: return - if (curTaskAndOrder.startSite != null && curTaskAndOrder.endSite != null) { - val startStation = MogoLocation() - startStation.longitude = curTaskAndOrder.startSite!!.gcjLon - startStation.latitude = curTaskAndOrder.startSite!!.gcjLat - val endStation = MogoLocation() - endStation.longitude = curTaskAndOrder.endSite!!.gcjLon - endStation.latitude = curTaskAndOrder.endSite!!.gcjLat - TrajectoryAndDistanceManager.setStationPoint( - startStation, - endStation, - curTaskAndOrder.lineId - ) - } - } else { - TaxiTaskModel.clearLocalCalculateStation() - } - } - - /** - * 开始倒计时120s或者10s拉取任务 - * 演练任务120s拉取 - * 接驾任务10s拉取 - */ - override fun onTaskCompleted(result: QueryCurrentTaskRespBean.Result?) { - d(TAG, "onTaskCompleted: ${result?.currentStatus}, siteId=${result?.endSite?.siteId}") - - if (result?.order != null && result.servingStatus == 1){ - if (result.taskType <= TaskTypeEnum.VirtualTask.code - && result.order!!.orderStatus < TaxiOrderStatusEnum.ArriveAtStart.code) { - VoiceNotice.showNotice("已为您接到订单") - } - if (result.order!!.orderStatus == TaxiOrderStatusEnum.ArriveAtStart.code){ - VoiceNotice.showNotice("已到达上车地点,等待乘客上车") - } - } - - /** - * 1、有订单下(表示当前有订单或者未来有要执行的订单): - * 接驾任务需要立即拉取, 拉取时机在车辆前往上车点状态 - * 送驾任务需要立即拉取, 拉取时机在乘客已上车状态 - * 2、在没有订单情况下 - * 若当前到站的是前往标定站点, 则45s去拉取任务 - * 若当前是演练任务到站, 45s去拉取任务 - * 若当前是接驾任务到站, 此情况肯定是有订单的, 则走1 - * 若当前到站的是送驾任务, 不去拉取, 需等待司机点击服务完成按钮后拉取 - */ - - if (result?.order != null){ //接到订单情况下 - if (QueryCurrentTaskRespBean.isOrderOnTheWayToStart(result)){ //接驾任务拉取 - TaxiTaskModel.startPrepareTaskDelay(TaxiUnmannedConst.START_PREPARE_TO_START_TASK_INTERVAL, - result?.endSite!!.siteId) - }else if (QueryCurrentTaskRespBean.isOrderUserArriveAtStart(result)) { //送驾任务拉取 - TaxiTaskModel.startPrepareTaskDelay(0, result?.endSite!!.siteId) - }else{ // 在已经接到订单的其他情况下, 取消倒计时任务拉取 - TaxiTaskModel.removePrepareTaskDelay() - } - }else{ //演练任务拉取 6.2.0使用配置的时间拉取, 默认45s - TaxiTaskModel.startPrepareTaskDelay( - CallerUnmannedListenerManager.getVirtualTaskPullTaskIntervalF() * 1000L, result?.endSite!!.siteId) - } - - clearDemoModeAndACParameters() - } - - override fun onTaskTrajectoryDataChanged(data: TrajectoryListRespBean?) { - TaxiTrajectoryManager.getInstance().syncTrajectoryInfo() //同步轨迹信息 - } - - override fun onOrderCancel() { - VoiceNotice.showNotice("已取消行程") - //取消自驾,D档位会溜车 map3.6.0 修改 - TaxiTaskModel.cancelAutopilot() - // 设置task执行相关状态,切换模式时判断使用 - MogoStatusManager.getInstance().setTaxiUnmanedDriverPerformTask(TAG, false) - LineManager.setLineInfo(null); - } - - override fun onOrderArriveAtEnd(orderNo: String) { - TaxiTaskModel.queryOrderByOrderNo(orderNo) - } - - /** - * 更新总全程信息(公里和分钟), 后端返回的数据 - */ - override fun onOrderTripInfoChanged(mileage: Float, duration: Int) { - updateOrderTripInfoUI(mileage, duration) - } - - override fun onOrderJourneyCompleted() { - updateTaskAndOrderUi(null) - //获取新的任务 - val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() - currentTaskWithOrder?.endSite?.also {//使用配置的时间拉取, 默认是45s - TaxiTaskModel.startPrepareTaskDelay(CallerUnmannedListenerManager.getVirtualTaskPullTaskIntervalF() * 1000L, - it.siteId) - } - // 设置task执行相关状态,切换模式时判断使用 - MogoStatusManager.getInstance().setTaxiUnmanedDriverPerformTask(TAG, false) - LineManager.setLineInfo(null); - } - - override fun onStartAutopilot(postDelayTime: Long) { - UiThreadHandler.postDelayed(startTaskRunnable, postDelayTime) // 5s后或者倒计时结束开启自驾, 状态流转 - } - - private val startTaskRunnable: Runnable = Runnable { - startTask() //状态流转 - VoiceNotice.showNotice("车辆正在自动开启自动驾驶") - } - - /** - * 主动请求平行驾驶, 停止启动自驾命令, 任务状态需向下流转 - */ - override fun onStopAutopilot() { - UiThreadHandler.removeCallbacks(startTaskRunnable) - if (!TaxiTaskModel.checkCurrentTaskCondition()) { - d(TAG, "onStopAutopilot: 无任务无需流转状态") - return - } - startTask(false) - } - - override fun onPauseStartAutopilot() { - UiThreadHandler.removeCallbacks(startTaskRunnable) - } - - /** - * 开始倒计时120s或者10s拉取任务 - * 演练任务120s拉取 - * 接驾任务10s拉取 - */ - override fun onStartPrepareTaskUI(delayTime: Long, isStart: Boolean) { - updatePrepareTaskDelayUI(delayTime, isStart) - } - - /** - * 更新本次任务行程信息, 本地计算的数据 - */ - override fun onTaskTripInfoLocalCalculateChanged(meters: Long, timeInSecond: Long) { - updateTaskTripInfoLocalCalculateUI(meters, timeInSecond) - } - - override fun onCarEndServiceSuccess( - driveToNearestStationTask: StartServiceRespBean.Result?, - currentTaskWithOrder: QueryCurrentTaskRespBean.Result? - ) { - if (currentTaskWithOrder == null) return - if (currentTaskWithOrder.currentStatus < TaskStatusEnum.CompleteTask.code //任务未完成 - && currentTaskWithOrder.currentStatus > TaskStatusEnum.None.code // 暂停接单后查询到任务状态是0, 代表没任务 - || currentTaskWithOrder.order != null) {// 有订单未完成 - VoiceNotice.showNotice("暂停接单啦!要完成当前订单哦") - } else { - VoiceNotice.showNotice("暂停接单啦") - 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("开始接单啦") - updateDriveToNearestStationTaskUI(driveToNearestStationTask) - } - - override fun onCarStartServiceFailed(code: Int, msg: String) { - val gcJ02Location = OchLocationManager.getGCJ02Location() - ToastUtilsOch.showWithCodeMessage( - code, - "$msg curLatitude = ${gcJ02Location.latitude}" + " curLongitude = ${gcJ02Location.longitude}" - ) - } - - 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)) - } - } - - override fun onStartTaskFail() { - - } - - private fun clearDemoModeAndACParameters(){ - if (FunctionBuildConfig.isDemoMode) { - d(TAG, "setIPCDemoMode:false") - CallerAutoPilotControlManager.setIPCDemoMode(false) - } - TaxiTaskModel.clearAutopilotControlParameters() - } - - /** - * 将业务订单信息保存,鹰眼可取用 - */ - private fun updateAutopilotControlParameters() { - val parameters = TaxiTaskModel.initAutopilotControlParameters() - if (null == parameters) { - CallerLogger.e(TAG, "AutopilotControlParameters is empty.") - return - } - d(TAG, "AutopilotControlParameters is update.") - DebugView.printInfoMsg("[启自驾] updateAutopilotControlParameters调用成功") - CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(parameters) - } -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiNextTaskFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiNextTaskFragment.kt deleted file mode 100644 index fc8ee9aac9..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiNextTaskFragment.kt +++ /dev/null @@ -1,142 +0,0 @@ -package com.mogo.och.unmanned.taxi.ui.task - -import android.graphics.Color -import android.graphics.drawable.GradientDrawable -import android.os.Bundle -import android.view.View -import androidx.core.content.ContextCompat -import com.mogo.commons.mvp.BaseFragment -import com.mogo.eagle.core.function.main.MainMoGoApplication -import com.mogo.eagle.core.utilcode.kotlin.onClick -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant -import com.mogo.och.unmanned.taxi.R -import com.mogo.och.unmanned.taxi.bean.OrderDetail -import com.mogo.och.unmanned.taxi.bean.QueryCurrentTaskRespBean -import com.mogo.och.unmanned.taxi.constant.TaskStatusEnum -import com.mogo.och.unmanned.taxi.constant.TaskTypeEnum -import com.mogo.och.unmanned.taxi.ui.task.cancleorder.CancleOrderView -import com.mogo.och.unmanned.taxi.utils.TaskUtils -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.cancelOrder -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.endStationName -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.mCurrentTaskLayout -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.naviToEnd -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.naviToStart -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.noTaskData -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.orderPhoneAndNum -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.startStationName -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.taskClickBtn -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.taskOtherInfo -import kotlinx.android.synthetic.main.unmanned_task_fragment_current.taskTypeTv - -/** - * @author: wangmingjun - * @date: 2023/7/24 - */ -class TaxiNextTaskFragment : BaseFragment() { - companion object { - val TAG = SceneConstant.M_TAXI + javaClass.simpleName - fun newInstance(): TaxiNextTaskFragment { - val args = Bundle() - val fragment = TaxiNextTaskFragment() - fragment.arguments = args - return fragment - } - } - - override fun getLayoutId(): Int { - return R.layout.unmanned_task_fragment_current - } - - override fun getTagName(): String { - return javaClass.simpleName - } - - override fun initViews() { - cancelOrder.onClick { //取消待服务订单 - val currentWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() - if (currentWithOrder?.order != null) { - val order = currentWithOrder.order - activity?.also { - context?.let { - CancleOrderView.showDialog(it) - } - } - } - } - showNoNextTaskView() - } - - fun onTaskDataChanged(taskWithOrder: QueryCurrentTaskRespBean.Result?) { - if (taskWithOrder?.order == null) { - showNoNextTaskView() - return - } - - if (taskWithOrder.taskType == TaskTypeEnum.VirtualTask.code && - taskWithOrder.currentStatus != TaskStatusEnum.CompleteTask.code - ) { - val order = taskWithOrder.order - updateTaskUI(order!!) - } else { - showNoNextTaskView() - } - } - - private fun updateTaskUI(order: OrderDetail) { - showNextTaskView() - taskOtherInfo.visibility = View.GONE - naviToStart.visibility = View.GONE - naviToEnd.visibility = View.GONE - - orderPhoneAndNum.text = - TaskUtils.getNextTaskPhoneNumAndPassengerCountHtml( - order.bookingUserPhone, - order.passengerSize - ) - - order.orderStartSite?.let { - startStationName.text = it.siteName - } - order.orderEndSite?.let { - endStationName.text = it.siteName - } - - taskTypeTv.text = resources.getString(R.string.task_order) - taskTypeTv.background = - ContextCompat.getDrawable( - MainMoGoApplication.getApp().applicationContext, - R.drawable.task_order_type_btn_bg - ) - - updateTaskContainerBottomBtn( - getString(R.string.waiting_server), - Color.parseColor("#4DFFFFFF"), - Color.parseColor("#4D1D5EF3"), - false - ) - } - - private fun updateTaskContainerBottomBtn( - txt: String?, - txtColorId: Int, - bgColorId: Int, - isClickable: Boolean - ) { - taskClickBtn.text = txt - taskClickBtn.setTextColor(txtColorId) - val background = - taskClickBtn.background as GradientDrawable //GradientDrawable是Drawable的子类 - background.setColor(bgColorId) - taskClickBtn.isClickable = isClickable - } - - private fun showNoNextTaskView() { - noTaskData.visibility = View.VISIBLE - mCurrentTaskLayout.visibility = View.GONE - } - - private fun showNextTaskView() { - noTaskData.visibility = View.GONE - mCurrentTaskLayout.visibility = View.VISIBLE - } -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskTabFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskTabFragment.kt deleted file mode 100644 index c56428bc34..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskTabFragment.kt +++ /dev/null @@ -1,201 +0,0 @@ -package com.mogo.och.unmanned.taxi.ui.task - -import android.graphics.Color -import android.graphics.Typeface -import android.os.Bundle -import android.util.TypedValue -import android.view.View -import android.widget.TextView -import androidx.core.content.ContextCompat -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentPagerAdapter -import androidx.viewpager.widget.ViewPager.OnPageChangeListener -import com.google.android.material.tabs.TabLayout -import com.mogo.commons.mvp.BaseFragment -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant -import com.mogo.och.common.module.utils.FlowBus -import com.mogo.och.unmanned.taxi.R -import com.mogo.och.unmanned.taxi.bean.QueryCurrentTaskRespBean -import com.mogo.och.unmanned.taxi.constant.TaxiDriverEventConst -import kotlinx.android.synthetic.main.unmanned_taxi_server_orders_panel.module_och_taxi_tab -import kotlinx.android.synthetic.main.unmanned_taxi_server_orders_panel.module_och_taxi_view_pager -import kotlinx.android.synthetic.main.unmanned_taxi_server_orders_panel.wait_order_num -import me.jessyan.autosize.utils.AutoSizeUtils - -/** - * @author: wangmingjun - * @date: 2023/7/25 - * @desc: 司机端任务fragment 容器,展示了“进行中”和“待服务”的任务信息 - * 任务:可以理解为对应的是一个自动驾驶任务 - * 任务类型:演练任务 / 接驾任务 / 送驾任务 - * DriveToNearestStationTask: 一种特殊任务,人工驾驶去最近的站点任务。每次 开启接单 后后端都会返回离当前最近的站点,车辆需要 - * 开到此站点后才能进入无人化接单的整体流程 - * 订单:是面向C端小程序的一个概念,用户下单后产生的是一个订单,后端会将一个订单分解成 接驾任务和送驾任务 并派发到 - * 车端来执行 - * 任务和订单的对应:1.如果是一个演练任务,是后端自动生成的,没有和C端订单挂钩 - * 2.如果是一个接驾任务 或 送驾任务,是和一个实际的C端订单对应的 - */ -class TaxiTaskTabFragment : BaseFragment() { - - companion object { - const val TAG = "TaxiTaskTabFragment" - const val TAB_POSITION_CURRENT = 0 - const val TAB_POSITION_NEXT = 1 - val mTabTitles = arrayOf("进行中", "待服务") - - fun newInstance(): TaxiTaskTabFragment { - val args = Bundle() - val fragment = TaxiTaskTabFragment() - fragment.arguments = args - return fragment - } - } - - private val mFragments: MutableList = ArrayList() - private var currentTaskFragment: TaxiCurrentTaskFragment? = null - private var nextTaskFragment: TaxiNextTaskFragment? = null - - override fun getLayoutId(): Int { - return R.layout.unmanned_taxi_server_orders_panel - } - - override fun getTagName(): String { - return this.javaClass.simpleName - } - - override fun initViews() { - initTaskTab() - initEventBus() - } - - private fun initTaskTab() { - for (position in mTabTitles.indices) { - val tab = module_och_taxi_tab.newTab() - tab.view.setBackgroundColor(Color.parseColor("#00000000")) - val tabView = - View.inflate(activity, R.layout.unmanned_taxi_tab_item_custom, null) as TextView - tabView.text = mTabTitles[position] - tabView.height = AutoSizeUtils.dp2px(context, 115f) - tab.customView = tabView - - if (TAB_POSITION_CURRENT == position) { - module_och_taxi_tab.addTab(tab, true) - changeTabLayoutUI(tab, true) - currentTaskFragment = TaxiCurrentTaskFragment.newInstance() - mFragments.add(currentTaskFragment!!) - } else if (TAB_POSITION_NEXT == position) { - module_och_taxi_tab.addTab(tab) - changeTabLayoutUI(tab, false) - nextTaskFragment = TaxiNextTaskFragment.newInstance() - mFragments.add(nextTaskFragment!!) - } - } - d(SceneConstant.M_TAXI + TAG, "activity=$activity") - - module_och_taxi_tab.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { - override fun onTabSelected(tab: TabLayout.Tab) { - module_och_taxi_view_pager.currentItem = tab.position - changeTabLayoutUI(tab, true) - } - - override fun onTabUnselected(tab: TabLayout.Tab) { - changeTabLayoutUI(tab, false) - } - - override fun onTabReselected(tab: TabLayout.Tab) {} - }) - - module_och_taxi_view_pager.addOnPageChangeListener(object : OnPageChangeListener { - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - } - - override fun onPageSelected(position: Int) { - module_och_taxi_tab.getTabAt(position)!!.select() - } - - override fun onPageScrollStateChanged(state: Int) {} - }) - - module_och_taxi_view_pager.adapter = TaskTabFragmentAdapter( - childFragmentManager, - FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT - ) - } - - private fun changeTabLayoutUI(tab: TabLayout.Tab, isSelected: Boolean) { - val textView = tab.customView!!.findViewById(R.id.tab_title) as TextView - if (isSelected) { - textView.background = - ContextCompat.getDrawable(requireContext(), R.drawable.taxi_driver_tab_item_bg) - textView.setTextSize( - TypedValue.COMPLEX_UNIT_PX, - AutoSizeUtils.dp2px(context, 40f).toFloat() - ) - textView.typeface = Typeface.defaultFromStyle(Typeface.BOLD) - textView.setTextColor(Color.parseColor("#FFFFFF")) - - d(SceneConstant.M_TAXI + TAG, "SelectTv = " + textView.text) - } else { - textView.background = null - textView.setTextSize( - TypedValue.COMPLEX_UNIT_PX, - AutoSizeUtils.dp2px(context, 36f).toFloat() - ) - textView.typeface = Typeface.defaultFromStyle(Typeface.NORMAL) - textView.setTextColor(Color.parseColor("#CCD4F5")) - - d(SceneConstant.M_TAXI + TAG, "unSelectTv = " + textView.text) - } - } - - internal inner class TaskTabFragmentAdapter( - fragmentManager: FragmentManager, - behavior: Int - ) : - FragmentPagerAdapter(fragmentManager, behavior) { - override fun getItem(position: Int): Fragment { - d( - SceneConstant.M_TAXI + TAG, - "getItem=$position" - ) - return mFragments[position] - } - - override fun getCount(): Int { - return mFragments.size - } - - override fun getPageTitle(position: Int): CharSequence { - d( - SceneConstant.M_TAXI + TAG, - "getPageTitle=$position" - ) - return mTabTitles[position] - } - } - - private fun initEventBus() { - FlowBus.with(TaxiDriverEventConst.TabFragmentEvent.EVENT_TYPE_SHOW_RED_POINT) - .register(this) { show -> - wait_order_num.visibility = if (show) View.VISIBLE else View.GONE - } - FlowBus.with(TaxiDriverEventConst.TabFragmentEvent.EVENT_TYPE_TASK_WITH_ORDER_CHANGED) - .register(this) { taskWithOrder -> - nextTaskFragment?.onTaskDataChanged(taskWithOrder) - } - } - - fun onNaviToEndStationByAMap(isShow: Boolean) { - currentTaskFragment?.onNaviToEndStationByAmap(isShow) - } - - fun onCarTakeOrderStatusChanged() { - currentTaskFragment?.onCarTakeOrderStatusChanged() - } -} diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt index 34202a630c..8b6968b90e 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt @@ -14,6 +14,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d 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.login.LoginStatusManager import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum import com.mogo.och.common.module.manager.autopilot.line.LineManager import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager @@ -167,6 +168,8 @@ class ItineraryCurrentModel : BaseViewModel(), } } + + private fun closeOrderByDriver() { val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() currentTaskWithOrder?.order?.orderEndSite?.also { @@ -509,6 +512,24 @@ class ItineraryCurrentModel : BaseViewModel(), CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(parameters) } + fun cancleTask() { + DebugView.printInfoMsg("[车辆复位] 准备发送请求") + TaxiTaskWithOrderServiceManager.resetInit( + AbsMogoApplication.getApp().applicationContext, + object : OchCommonServiceCallback { + override fun onSuccess(data: BaseData?) { + DebugView.printInfoMsg("[车辆复位] 请求success") + LoginStatusManager.queryLoginStatusByNet() + VoiceNotice.showNotice("暂停接单啦!"); + d(TAG, "journeyCompleted onSuccess") + } + + override fun onFail(code: Int, msg: String?) { + DebugView.printInfoMsg("[车辆复位] 请求fail, code=$code, msg=$msg") + d(TAG, "journeyCompleted onFail: code=$code, msg=$msg") + } + }) + } interface SwtichLineViewCallback { diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt index 147d856dc6..7c3ef49a67 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt @@ -33,6 +33,7 @@ import com.mogo.och.common.module.utils.ResourcesUtils import com.mogo.och.common.module.voice.VoiceNotice import com.mogo.och.common.module.wigets.CommonSlideView import com.mogo.och.common.module.wigets.dialog.CommonDialogStatus +import com.mogo.och.common.module.wigets.dialog.CommonDialogView import com.mogo.och.unmanned.taxi.R import com.mogo.och.unmanned.taxi.TaxiUnmannedDriverProvider import com.mogo.och.unmanned.taxi.bean.OrderDetail @@ -57,6 +58,7 @@ import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.actv_end_o import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.actv_order_phone import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.actv_submit_task import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.cancelOrder +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.cancelTask import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.commonSlideViewStartServer import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.gourp_order import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.group_itinerary_info @@ -295,6 +297,7 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi group_itinerary_info.visibility = GONE include_empty.visibility = VISIBLE prepareTaskCountdownTv.visibility = GONE + cancelTask.visibility = View.GONE actv_end_order.visibility = GONE commonSlideViewStartServer.visibility = GONE @@ -305,6 +308,7 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi private fun initOnClickListener() { naviToStart.setOnClickListener(this) naviToEnd.setOnClickListener(this) + cancelTask.setOnClickListener(this) cancelOrder.setOnClickListener(this) taskStatus.setOnClickListener(this) @@ -412,6 +416,26 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi naviToEnd.id -> { showNaviToEndStationFragment() } + cancelTask.id -> { + val builder = CommonDialogStatus.Builder() + val closeLineConfirmDialog = builder + .title(ResourcesUtils.getString(R.string.common_dialog_title)) + .tips(ResourcesUtils.getString(R.string.taxi_dialog_cancle_task)) + .confirmStr(ResourcesUtils.getString(R.string.common_dialog_confirm)) + .cancelStr(ResourcesUtils.getString(R.string.common_dialog_cancel)) + .status(CommonDialogStatus.Status.ask) + .build(context) + closeLineConfirmDialog.setClickListener(object : CommonDialogStatus.ClickListener { + override fun confirm() { + viewModel?.cancleTask() + } + + override fun cancel() { + closeLineConfirmDialog.dismiss() + } + }) + closeLineConfirmDialog.show() + } } } @@ -454,6 +478,7 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi aciv_task_type_exercise.visibility = View.GONE // 轨迹标识 trajectoryType.visibility = View.GONE + cancelTask.visibility = View.GONE actv_end_order.visibility = GONE @@ -504,6 +529,8 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi == TaxiOrderStatusEnum.OnTheWayToEnd.code ) View.VISIBLE else View.GONE + cancelTask.visibility = View.GONE + updatePrepareTaskDelayUI(0, false) orderPhoneAndNum.text = TaskUtils.getCurrentTaskPhoneNumAndPassengerCountHtml( @@ -636,7 +663,7 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi taskStatus.text = resources.getString(R.string.task_start_end_site) aciv_task_type_exercise.setImageResource(R.drawable.taxi_task_exercise) - + cancelTask.visibility = VISIBLE startStationName.text = startSite.siteName endStationName.text = endSite.siteName @@ -870,5 +897,4 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi commonSlideViewStartServer.reset() } - } diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_itinerary_current.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_itinerary_current.xml index 172ec63198..53c8514f83 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_itinerary_current.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_itinerary_current.xml @@ -141,6 +141,17 @@ android:layout_width="@dimen/dp_46" android:layout_height="@dimen/dp_46"/> + + 线路不可用 路线验证结束啦!点击下方按钮反馈验证结果吧 + 您确认要结束任务吗? + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt index 4be8d66433..d4a3c8f395 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt @@ -24,6 +24,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerV2nNioEventListenerMana import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager +import com.mogo.eagle.core.function.call.och.CallerOchBizFunctionCall4EagleManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager @@ -178,6 +179,7 @@ class TeleMsgHandler : IMsgHandler { // 10: 第1个1代表运营面板开关打开,第2个0代表打开成功,告之司机端 CallerTelematicManager.sendMsgToServer(TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP, "11".toByteArray()) } + CallerOchBizFunctionCall4EagleManager.setVideoView(target) } else { CallerTelematicManager.sendMsgToServer(TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP, "10".toByteArray()) @@ -185,6 +187,7 @@ class TeleMsgHandler : IMsgHandler { } else { //第1个0代表运营面板开关关闭,第2个1代表关闭成功,告之司机端; 相应的还有状态:00表示关闭失败 CallerTelematicManager.sendMsgToServer(TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP, "01".toByteArray()) + CallerOchBizFunctionCall4EagleManager.setVideoView(null) } } catch (t: Throwable) { t.printStackTrace() diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartView.kt index 4ccbe398d2..1f28ff91d8 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartView.kt @@ -2,7 +2,11 @@ package com.mogo.eagle.core.function.hmi.ui.widget import android.animation.ObjectAnimator import android.animation.ValueAnimator +import android.content.BroadcastReceiver import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.net.ConnectivityManager import android.os.CountDownTimer import android.text.TextUtils import android.util.AttributeSet @@ -32,20 +36,21 @@ import kotlinx.android.synthetic.main.view_cold_start.view.ivColdStartStatus import kotlinx.android.synthetic.main.view_cold_start.view.ivIpcConnectStatus import kotlinx.android.synthetic.main.view_cold_start.view.ivNodeListMask import kotlinx.android.synthetic.main.view_cold_start.view.ivSsmConnectStatus +import kotlinx.android.synthetic.main.view_cold_start.view.ivWifiConnectStatus import kotlinx.android.synthetic.main.view_cold_start.view.rvNodeList import kotlinx.android.synthetic.main.view_cold_start.view.tvColdStartContent import kotlinx.android.synthetic.main.view_cold_start.view.tvColdStartNow import kotlinx.android.synthetic.main.view_cold_start.view.tvIpcConnectContent import kotlinx.android.synthetic.main.view_cold_start.view.tvSsmConnectContent import kotlinx.android.synthetic.main.view_cold_start.view.tvSystemStartupTitle -import kotlinx.android.synthetic.main.view_cold_start.view.viewColdStartDivider -import kotlinx.android.synthetic.main.view_cold_start.view.viewSsmConnectDivider +import kotlinx.android.synthetic.main.view_cold_start.view.tvWifiConnectContent import system_master.SsmInfo import system_master.SystemStatusInfo import java.util.Locale import java.util.regex.Matcher import java.util.regex.Pattern + /** * 冷启动呈现二期 * 前置展示冷启动过程和结果 @@ -63,12 +68,15 @@ class ColdStartView @JvmOverloads constructor( const val COLD_START_WAITING_TIME = 600000L //冷启动超时等待时间 } + private var wifiConnectStatus = false //WIFI连接状态,默认是未连接 private var ipcConnectStatus = false //连接域控状态,默认是未连接 private var ssmConnectStatus = false //SSM连接状态,默认是未连接 private var coldStartStatus = false //冷启动状态,默认是未冷启动成功 private var currentColdStartSuccess = false //冷启动成功状态,也是成功后动画完成状态 + private var wifiRotationAnim: ObjectAnimator?= null //WIFI连接状态动画 + private var ipcRotationAnim: ObjectAnimator?= null //域控连接状态动画 private var ssmRotationAnim: ObjectAnimator?= null //SSM连接状态动画 @@ -117,6 +125,11 @@ class ColdStartView @JvmOverloads constructor( override fun onAttachedToWindow() { super.onAttachedToWindow() + // 注册广播接收器 + val intentFilter = IntentFilter() + intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION) + context.applicationContext.registerReceiver(networkStateReceiver, intentFilter) + showWifiConnecting() CallerAutoPilotStatusListenerManager.addListener(TAG, this) CallerColdStartStateListenerManager.addListener(TAG,this) } @@ -125,24 +138,30 @@ class ColdStartView @JvmOverloads constructor( super.onDetachedFromWindow() CallerAutoPilotStatusListenerManager.removeListener(TAG) CallerColdStartStateListenerManager.removeListener(TAG) + wifiRotationAnim?.cancel() ipcRotationAnim?.cancel() ssmRotationAnim?.cancel() connectSSMTimer?.cancel() coldStartRotationAnim?.cancel() connectColdStartTimer?.cancel() + // 取消注册广播接收器 + context.applicationContext.unregisterReceiver(networkStateReceiver) } override fun onAutopilotIpcConnectStatusChanged( status: AdasConstants.IpcConnectionStatus, reason: String? ){ + ipcConnectStatus = status == AdasConstants.IpcConnectionStatus.CONNECTED + if(!wifiConnectStatus){ + return + } ThreadUtils.runOnUiThread { - ipcConnectStatus = if(status == AdasConstants.IpcConnectionStatus.CONNECTED){ + if(status == AdasConstants.IpcConnectionStatus.CONNECTED){ //域控连接成功 - if(!ipcConnectStatus){ + if(ipcConnectStatus){ showIPCConnectSuccessView() } - true }else{ //域控连接失败 when(status){ @@ -206,8 +225,6 @@ class ColdStartView @JvmOverloads constructor( - - /** * 状态查询应答 * @param status 数据 @@ -331,6 +348,28 @@ class ColdStartView @JvmOverloads constructor( } } + private val networkStateReceiver: BroadcastReceiver = object: BroadcastReceiver(){ + override fun onReceive(context: Context?, intent: Intent?) { + if (intent!!.action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { + val connectivityManager = + context!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val networkInfo = connectivityManager.activeNetworkInfo + ThreadUtils.runOnUiThread { + if (networkInfo != null && networkInfo.isConnected) { + // 网络连接可用 + connectWifiSuccess() + } else { + // 网络连接不可用 + showWifiConnecting() + } + } + + } + } + + } + + /** * 冷启动状态 */ @@ -392,12 +431,12 @@ class ColdStartView @JvmOverloads constructor( ipcRotationAnim?.cancel() ivIpcConnectStatus.rotation = 0f tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_ssm_wait) + tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.white)) ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_success)) tvIpcConnectContent.text = resources.getString(R.string.ipc_connect_success) //开启连接SSM倒计时 connectSSMProcess() //域控连接成功后开始展示SSM连接状态 - viewSsmConnectDivider.visibility = View.VISIBLE ivSsmConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process)) //旋转动画 if(ssmRotationAnim == null){ @@ -411,13 +450,7 @@ class ColdStartView @JvmOverloads constructor( //设置SSM连接文案为连接中 tvSsmConnectContent.text = resources.getString(R.string.ssm_connect_loading) tvSsmConnectContent.setTextColor(ContextCompat.getColor(context, android.R.color.white)) - viewSsmConnectDivider.visibility = View.VISIBLE - ivSsmConnectStatus.visibility = View.VISIBLE - tvSsmConnectContent.visibility = View.VISIBLE //隐藏冷启动相关视图 - viewColdStartDivider.visibility = View.GONE - ivColdStartStatus.visibility = View.GONE - tvColdStartContent.visibility = View.GONE rvNodeList.visibility = View.GONE ivNodeListMask.visibility = View.GONE //域控连接成功埋点统计 @@ -434,6 +467,7 @@ class ColdStartView @JvmOverloads constructor( */ private fun showIPCConnectFailView(failReason: String?){ tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_tel_exception) + tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.cold_start_fail)) if(tvIpcConnectContent.text.isNotEmpty() && tvIpcConnectContent.text.equals(failReason)){ return } @@ -443,14 +477,7 @@ class ColdStartView @JvmOverloads constructor( failReason?.let { tvIpcConnectContent.text = it } - //隐藏SSM相关视图 - viewSsmConnectDivider.visibility = View.GONE - ivSsmConnectStatus.visibility = View.GONE - tvSsmConnectContent.visibility = View.GONE //隐藏冷启动相关视图 - viewColdStartDivider.visibility = View.GONE - ivColdStartStatus.visibility = View.GONE - tvColdStartContent.visibility = View.GONE rvNodeList.visibility = View.GONE ivNodeListMask.visibility = View.GONE //域控连接失败埋点统计 @@ -462,8 +489,75 @@ class ColdStartView @JvmOverloads constructor( newColdStart = false } + /** + * 等待网络连接 + */ + private fun showWifiConnecting(){ + wifiConnectStatus = false + tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_wifi_wait) + tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.white)) + ivWifiConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process)) + tvWifiConnectContent.text = resources.getString(R.string.wifi_connect_loading) + if(wifiRotationAnim == null){ + wifiRotationAnim = ObjectAnimator.ofFloat(ivWifiConnectStatus, "rotation", 0f, 360f) + } + wifiRotationAnim?.repeatCount = ValueAnimator.INFINITE + wifiRotationAnim?.repeatMode = ValueAnimator.RESTART + wifiRotationAnim?.duration = 1500 + wifiRotationAnim?.interpolator = LinearInterpolator() + wifiRotationAnim?.start() + //动画和计时器重置 + ipcRotationAnim?.cancel() + ivIpcConnectStatus.rotation = 0f + ssmRotationAnim?.cancel() + ivSsmConnectStatus.rotation = 0f + connectSSMTimer?.cancel() + coldStartRotationAnim?.cancel() + ivColdStartStatus.rotation = 0f + connectColdStartTimer?.cancel() + //域控连接状态展示 + ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_wait)) + tvIpcConnectContent.text = resources.getString(R.string.ipc_connect_wait) + //SSM连接状态展示 + ivSsmConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_wait)) + tvSsmConnectContent.text = resources.getString(R.string.ssm_connect_wait) + //冷启动节点状态展示 + ivColdStartStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_wait)) + tvColdStartContent.text = resources.getString(R.string.cold_start_wait) + //隐藏Topic列表 + rvNodeList.visibility = View.GONE + ivNodeListMask.visibility = View.GONE + ipcConnectStatus = false + } + + private fun connectWifiSuccess(){ + wifiConnectStatus = true + wifiRotationAnim?.cancel() + ivWifiConnectStatus.rotation = 0f + ivWifiConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_success)) + tvWifiConnectContent.text = resources.getString(R.string.wifi_connect_success) + //开始连接域控 + tvIpcConnectContent.text = resources.getString(R.string.ipc_connect_loading) + ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process)) + if(ipcRotationAnim == null){ + ipcRotationAnim = ObjectAnimator.ofFloat(ivIpcConnectStatus, "rotation", 0f, 360f) + } + ipcRotationAnim?.repeatCount = ValueAnimator.INFINITE + ipcRotationAnim?.repeatMode = ValueAnimator.RESTART + ipcRotationAnim?.duration = 1500 + ipcRotationAnim?.interpolator = LinearInterpolator() + ipcRotationAnim?.start() + //隐藏冷启动相关视图 + rvNodeList.visibility = View.GONE + ivNodeListMask.visibility = View.GONE + if(ipcConnectStatus){ + showIPCConnectSuccessView() + } + } + private fun showIPCConnecting(){ tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_tel_wait) + tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.white)) ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process)) tvIpcConnectContent.text = "正在重连域控..." if(ipcRotationAnim == null){ @@ -474,14 +568,7 @@ class ColdStartView @JvmOverloads constructor( ipcRotationAnim?.duration = 1500 ipcRotationAnim?.interpolator = LinearInterpolator() ipcRotationAnim?.start() - //隐藏SSM相关视图 - viewSsmConnectDivider.visibility = View.GONE - ivSsmConnectStatus.visibility = View.GONE - tvSsmConnectContent.visibility = View.GONE //隐藏冷启动相关视图 - viewColdStartDivider.visibility = View.GONE - ivColdStartStatus.visibility = View.GONE - tvColdStartContent.visibility = View.GONE rvNodeList.visibility = View.GONE ivNodeListMask.visibility = View.GONE } @@ -508,6 +595,7 @@ class ColdStartView @JvmOverloads constructor( */ private fun showSSMConnectSuccessView(){ tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_sys_wait) + tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.white)) //取消旋转动画 ssmRotationAnim?.cancel() //取消连接SSM超时等待倒计时 @@ -518,9 +606,6 @@ class ColdStartView @JvmOverloads constructor( tvSsmConnectContent.text = resources.getString(R.string.ssm_connect_success) tvSsmConnectContent.setTextColor(ContextCompat.getColor(context, R.color.white)) //展示冷启动连接过程视图 - viewColdStartDivider.visibility = View.VISIBLE - ivColdStartStatus.visibility = View.VISIBLE - tvColdStartContent.visibility = View.VISIBLE rvNodeList.visibility = View.VISIBLE ivNodeListMask.visibility = View.VISIBLE tvColdStartContent.text = "启动中…" @@ -541,6 +626,7 @@ class ColdStartView @JvmOverloads constructor( */ private fun showSSMConnectFailView(){ tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_ssm_exception) + tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.cold_start_fail)) //取消旋转动画 ssmRotationAnim?.cancel() ivSsmConnectStatus.rotation = 0f @@ -606,6 +692,7 @@ class ColdStartView @JvmOverloads constructor( */ private fun showColdStartFailView(){ tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_sys_exception) + tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.cold_start_fail)) coldStartRotationAnim?.cancel() ivColdStartStatus.rotation = 0f ivColdStartStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_fail)) @@ -619,6 +706,7 @@ class ColdStartView @JvmOverloads constructor( private fun showColdStartSuccessView(){ if(coldStartStatus){ tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_sys_success) + tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.white)) coldStartRotationAnim?.cancel() ivColdStartStatus.rotation = 0f ivColdStartStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_success)) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt index e829ec4543..1d8f28dec6 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt @@ -401,7 +401,7 @@ open class MainActivity : MvpActivity(), MainView, // 弹出对话框告诉用户需要权限的原因, 并引导用户去应用权限管理中手动打开权限按钮 if (!isFirst) { if (reasong.isNotEmpty()) { - val substring = reasong.substring(0, reasong.length - 2) + val substring = reasong.substring(0, reasong.length - 1) PermissionsDialogUtils.openAppDetails(this, substring, REQUEST_CODE_DIALOG) }else { PermissionsDialogUtils.openAppDetails(this, null, REQUEST_CODE_DIALOG) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_fail.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_fail.png index e469e824d2..f4191de57b 100644 Binary files a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_fail.png and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_fail.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_wait.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_wait.png new file mode 100644 index 0000000000..e26a905ea3 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_wait.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_cold_start.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_cold_start.xml index cdfd7a10f0..3eb4d5705b 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_cold_start.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_cold_start.xml @@ -20,15 +20,49 @@ /> + + + + + + #131415 - #FFCD3D + #FF4E41 \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml index 7ed0580a39..8e9714dd69 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml @@ -213,19 +213,27 @@ 红绿灯信号来源 已发起上报 + Wifi连接状态图标 域控连接状态图标 SSM连接状态图标 冷启动状态图标 + 等待连接车辆WiFi… + 已连接车辆Wi-Fi + 待连接域控 + 连接域控… 已连接域控 系统启动中… 系统启动成功 系统启动失败 + 待连接SSM 正在等待SSM信息 与SSM通信正常 超时未收到SSM信息,建议重启车辆并上报问题 + 待启动 系统启动成功,即将进入主页 系统启动异常,建议上报问题,可尝试重启车辆 + 等待车辆上电 等待连接域控 连接域控异常,持续重试中 等待SSM信息 diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/TravelRealityView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/TravelRealityView.kt index 2bc394c97e..c75d2cf03c 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/TravelRealityView.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/TravelRealityView.kt @@ -1699,20 +1699,22 @@ class TravelRealityView @JvmOverloads constructor( super.invokeOchInfo(ochInfo) Log.d(TAG, "invokeOchInfo:$ochInfo") if (ochInfo.type == 0) { - val locList = ochInfo.latLonList - if (locList.isEmpty() || locList.size < 2) { - mStartLatLng = null - mEndLatLng = null - UiThreadHandler.post { - hideStartEndMarker() + val locationList = ochInfo.latLonList + locationList?.let { locList-> + if (locList.isEmpty() || locList.size < 2) { + mStartLatLng = null + mEndLatLng = null + UiThreadHandler.post { + hideStartEndMarker() + } + } else { + // 设置开始结束Marker位置 + mStartLatLng = LatLng(locList[0].latitude, locList[0].longitude) + mEndLatLng = LatLng(locList[1].latitude, locList[1].longitude) + } + if (!isPlayingAnim) { + drawStartAndEnd() } - } else { - // 设置开始结束Marker位置 - mStartLatLng = LatLng(locList[0].latitude, locList[0].longitude) - mEndLatLng = LatLng(locList[1].latitude, locList[1].longitude) - } - if (!isPlayingAnim) { - drawStartAndEnd() } } } diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/SiteMarkerBean.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/SiteMarkerBean.kt new file mode 100644 index 0000000000..1f9f3feb7a --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/SiteMarkerBean.kt @@ -0,0 +1,5 @@ +package com.mogo.eagle.core.data.map + +import com.mogo.eagle.core.data.v2x.Point + +data class SiteMarkerBean(var latLng: Point, var resId: Int, var anchorX: Float, var anchorY: Float) diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/och/OchInfo.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/och/OchInfo.kt index 57e04a8b2c..79700fb092 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/och/OchInfo.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/och/OchInfo.kt @@ -1,6 +1,10 @@ package com.mogo.eagle.core.data.och import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.data.map.SiteMarkerBean // type 0-> 起终点坐标 坐标index 0 起点 坐标index 1 终点 -data class OchInfo(var type: Int, var latLonList: List) \ No newline at end of file +// type 1-> 起终点+站点 +data class OchInfo(var type: Int, var latLonList: List?) { + var siteMarkerList: List? = null// 起终点+站点 +} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/IOchBizFunctionCall4Eagle.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/IOchBizFunctionCall4Eagle.kt index 851f61ae61..b4a8876709 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/IOchBizFunctionCall4Eagle.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/IOchBizFunctionCall4Eagle.kt @@ -1,5 +1,7 @@ package com.mogo.eagle.core.function.api.och +import android.view.View + /** * 定义提供给 鹰眼底层 调用的接口 */ @@ -8,4 +10,5 @@ interface IOchBizFunctionCall4Eagle { * 退出登录 */ fun logout() + fun setVideoView(target: View?) } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/och/CallerOchBizFunctionCall4EagleManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/och/CallerOchBizFunctionCall4EagleManager.kt index c375abdbc7..1ccc6ca424 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/och/CallerOchBizFunctionCall4EagleManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/och/CallerOchBizFunctionCall4EagleManager.kt @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.call.och +import android.view.View import com.mogo.eagle.core.function.api.och.IOchBizFunctionCall4Eagle /** @@ -24,4 +25,8 @@ object CallerOchBizFunctionCall4EagleManager : IOchBizFunctionCall4Eagle { override fun logout() { ochBizFunctionCall4EagleInstance?.logout() } + + override fun setVideoView(target: View?) { + ochBizFunctionCall4EagleInstance?.setVideoView(target) + } } \ No newline at end of file diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/AppIdentityModeUtils.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/AppIdentityModeUtils.kt index cd7325d559..c97b4c2918 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/AppIdentityModeUtils.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/AppIdentityModeUtils.kt @@ -1,23 +1,31 @@ package com.mogo.eagle.core.utilcode.mogo +/** + * 取值要与mis后台配置对应上 + * https://mogogo.zhidaozhixing.com/eagleEye-mis/appInfo/query/all?keyWord=&pageNum=1&pageSize=20 + */ fun AppIdentityModeUtils.getMisChannelCode(appIdentityMode: String): Int { return when { isTaxi(appIdentityMode) && isPassenger(appIdentityMode) -> 1 // 出租乘客端 isTaxi(appIdentityMode) && isDriver(appIdentityMode) -> 2 // 出租司机端 - isBus(appIdentityMode) && isPassenger(appIdentityMode) -> 3 // 公交乘客端 - isBus(appIdentityMode) && isDriver(appIdentityMode) -> 4 // 公交司机端 + isBus(appIdentityMode) && isPassenger(appIdentityMode) && isB1(appIdentityMode) -> 3 // B1公交乘客端 + isBus(appIdentityMode) && isDriver(appIdentityMode) && isB1(appIdentityMode) -> 4 // B1公交司机端 + + isShuttle(appIdentityMode) && isPassenger(appIdentityMode) && isB1(appIdentityMode) -> 3 // B1接驳乘客端 + isShuttle(appIdentityMode) && isDriver(appIdentityMode) && isB1(appIdentityMode) -> 4 // B1接驳司机端 + isCharter(appIdentityMode) && isPassenger(appIdentityMode) -> 8 // 包车乘客端 isCharter(appIdentityMode) && isDriver(appIdentityMode) -> 9 // 包车司机端 - isShuttle(appIdentityMode) && isPassenger(appIdentityMode) && isB1(appIdentityMode) -> 10 // B1接驳乘客端 - isShuttle(appIdentityMode) && isDriver(appIdentityMode) && isB1(appIdentityMode) -> 11 // B1接驳司机端 - isSweeper(appIdentityMode) && isDriver(appIdentityMode) -> 12 // 清扫车司机端 - isShuttle(appIdentityMode) && isPassenger(appIdentityMode) && isB2(appIdentityMode) -> 17 // B2接驳乘客端 - isShuttle(appIdentityMode) && isDriver(appIdentityMode) && isB2(appIdentityMode) -> 15 // B2接驳司机端 + isBus(appIdentityMode) && isPassenger(appIdentityMode) && isB2(appIdentityMode) -> 17 // B2公交乘客端 + isBus(appIdentityMode) && isDriver(appIdentityMode) && isB2(appIdentityMode) -> 15 // B2公交司机端 + + isShuttle(appIdentityMode) && isPassenger(appIdentityMode) && isB2(appIdentityMode) -> 17 // B2接驳乘客端 + isShuttle(appIdentityMode) && isDriver(appIdentityMode) && isB2(appIdentityMode) -> 15 // B2接驳司机端 else -> 0 } diff --git a/foudations/mogo-commons/build.gradle b/foudations/mogo-commons/build.gradle index 95da3f4ef5..fe86427004 100644 --- a/foudations/mogo-commons/build.gradle +++ b/foudations/mogo-commons/build.gradle @@ -62,12 +62,13 @@ dependencies { api rootProject.ext.dependencies.ttsbase api rootProject.ext.dependencies.mogo_core_data api rootProject.ext.dependencies.mogo_core_network + api rootProject.ext.dependencies.serialport } else { api project(":foudations:mogo-aicloud-services-sdk") api project(":tts:tts-base") api project(':core:mogo-core-data') api project(':core:mogo-core-network') - + api project(":libraries:mogo-hardware-devices") } api 'com.mogo.cloud:countly-sdk:1.4.7.49.18-debug' diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/AIAssist.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/AIAssist.java index df826a640e..f5d52c7bfd 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/AIAssist.java +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/AIAssist.java @@ -5,6 +5,7 @@ import android.util.Log; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.ToastUtils; +import com.mogo.support.device.DevicesManager; import com.mogo.tts.base.IGlobalTtsCallback; import com.mogo.tts.base.IMogoTTS; import com.mogo.tts.base.IMogoTTSCallback; @@ -61,14 +62,17 @@ public class AIAssist { Class clazz3 = null; try { clazz1 = Class.forName("com.mogo.tts.pad.PadTTS"); - } catch (Exception ignored) {} + } catch (Exception ignored) { + } try { clazz2 = Class.forName("com.mogo.tts.iflytek.IFlyTekTts"); - } catch (Exception ignored) {} + } catch (Exception ignored) { + } try { clazz3 = Class.forName("com.mogo.tts.pad.ZhiTTS"); - } catch (Exception ignored) {} + } catch (Exception ignored) { + } if (clazz1 != null) { mTTS = (IMogoTTS) clazz1.getConstructor().newInstance(); @@ -141,6 +145,7 @@ public class AIAssist { /** * 等级由低到高为0、1、2、3,分别对应p3、p2、p1、p0 + * * @param text * @param level */ @@ -152,8 +157,9 @@ public class AIAssist { /** * 支持多语言的Tts + * * @param ttsEntity: 多语言Entity - * @param level: 等级由低到高为0、1、2、3,分别对应p3、p2、p1、p0 + * @param level: 等级由低到高为0、1、2、3,分别对应p3、p2、p1、p0 * @param callback */ public void speakMultiLangTTSWithLevel(MultiLangTtsEntity ttsEntity, int level, IMogoTTSCallback callback) { @@ -191,6 +197,26 @@ public class AIAssist { } } + /** + * text:语音播报内容,level:播报级别,withOutside:true代表两个一起播,反之则只播车内 + */ + public void speakTTSVoiceWithLevel(String text, int level, IMogoTTSCallback callBack, boolean withOutside) { + if (withOutside) { + DevicesManager.INSTANCE.speechCx830seBroadcast(text); + speakTTSVoiceWithLevel(text, level, callBack); + } else { + speakTTSVoiceWithLevel(text, level, callBack); + } + } + + /** + * + * @param text:只播报车外的语音 + */ + public void playVoiceOutside(String text) { + DevicesManager.INSTANCE.speechCx830seBroadcast(text); + } + public void stopSpeakTts(String tts) { if (mTTS != null) { mTTS.stopSpeakTts(tts); diff --git a/gradle.properties b/gradle.properties index 71bac237a4..2d60eec418 100644 --- a/gradle.properties +++ b/gradle.properties @@ -92,8 +92,8 @@ WEBSOCKET_VERSION=1.1.7 applicationId=com.mogo.launcer applicationName=IntelligentPilot # RoboBus司机端:2.5.1;RoboTaxi司机端:2.5.1;RoboTaxi乘客端:1.0.0 -versionCode=6007003 -versionName=6.7.3 +versionCode=6008000 +versionName=6.8.0 ################# 新架构模块Maven版本管理 ################# MOGO_CORE_FUNCTION_HMI_VERSION=0.0.58.10 @@ -151,7 +151,7 @@ MATRIX_VERSION=2.0.8 # 公交模式司机端版本号 -DRIVER_VERSION=6.7.4 +DRIVER_VERSION=6.8.0 # 公交模式乘客端端版本号 -PASSENGER_VERSION=5.7.4 +PASSENGER_VERSION=5.8.0