[fea]
[核销、未通知小程序]
This commit is contained in:
yangyakun
2024-11-19 14:20:21 +08:00
parent da414503b9
commit 7db12ccbe7
15 changed files with 624 additions and 20 deletions

View File

@@ -2,7 +2,7 @@
"formatVersion": 1,
"database": {
"version": 5,
"identityHash": "17bc11cdabb03126bdab91081b897fff",
"identityHash": "018ed967c5f335de5d39581e033160ed",
"entities": [
{
"tableName": "contrail_data_table",
@@ -593,7 +593,7 @@
},
{
"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, `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)",
"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",
@@ -650,8 +650,8 @@
"notNull": false
},
{
"fieldPath": "remainingTimes",
"columnName": "remaining_times",
"fieldPath": "availableTimes",
"columnName": "available_times",
"affinity": "INTEGER",
"notNull": false
},
@@ -733,7 +733,7 @@
"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, '17bc11cdabb03126bdab91081b897fff')"
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '018ed967c5f335de5d39581e033160ed')"
]
}
}

View File

@@ -3,13 +3,14 @@ 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<Event>){
data class ShuttleEventRequest(val requestId: String, val sn: String,val vin:String ,val businessType: Int,val eventList:MutableList<Event>){
companion object{
fun transformDb2Net(
waitUpdateEvent: List<EventDataBean>?,
@@ -32,7 +33,7 @@ data class ShuttleEventRequest(val requestId: String, val sn: String, val busine
eventList4Request.add(tempEvent!!)
}
val md5Hex = DigestUtils.md5Hex(eventList4Request.toString())
return ShuttleEventRequest(md5Hex, SharedPrefsMgr.getInstance().sn,
return ShuttleEventRequest(md5Hex, SharedPrefsMgr.getInstance().sn, CheckVinManager.getVin(),
businessTypeShuttle,eventList4Request)
}
}

View File

@@ -63,8 +63,8 @@ data class WriteOffDataBean(
/**
* 剩余核销次数>0
*/
@ColumnInfo(name = "remaining_times", typeAffinity = ColumnInfo.INTEGER)
var remainingTimes: Int? = null,
@ColumnInfo(name = "available_times", typeAffinity = ColumnInfo.INTEGER)
var availableTimes: Int? = null,
/**
* 订单号

View File

@@ -9,6 +9,7 @@ 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.network.OchCommonServiceCallback
import com.mogo.och.common.module.utils.DateTimeUtil
@@ -126,7 +127,7 @@ class WriteOffCacheRepository : IWriteOffRepository {
if(AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)) {
// 6、校验次数
if((it.remainingTimes?:0)<=0){
if((it.availableTimes?:0)<=0){
throw DataException(1008,"车票剩余可用次数为0")
}
// 7、同一个订单2分钟内只能核销一次
@@ -140,6 +141,8 @@ class WriteOffCacheRepository : IWriteOffRepository {
}else{
throw DataException(11000,"缺少orderNo")
}
val (start, _) = LineManager.getStations()
siteId = start?.siteId?.toLong()?:0
}else if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) {
val (start, _) = LineManager.getStations()
if(start?.siteId?.toLong()==it.startStationId){
@@ -156,15 +159,17 @@ class WriteOffCacheRepository : IWriteOffRepository {
addWrite.taskId = LineModel.currentTask?.taskId
addWrite.lineId = lineId
addWrite.siteId = siteId
addWrite.remainingTimes = it.remainingTimes
addWrite.availableTimes = it.availableTimes
addWrite.orderNo = it.orderNo
addWrite.uid = it.uid
addWrite.phone = it.phone
addWrite.ticketSize = it.ticketSize
addWrite.ticketName = it.ticketName
WriteOffDb.addOrUpdate()
val reslut = PassengerWriteOffResponse.Result(it.phone,it.ticketSize,it.ticketName,it.remainingTimes?.toLong())
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())
return@flatMap Observable.just(reslut)
}
}

View File

@@ -2,4 +2,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.mogo.och.shuttle.weaknet.passenger">
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
</manifest>

View File

@@ -1,9 +1,17 @@
package com.mogo.och.shuttle.weaknet.passenger.model
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.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.manager.scnner.ScannerManager
import com.mogo.och.common.module.manager.scnner.StateChangeListener
@@ -11,31 +19,92 @@ 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"
// 等待链接
private val waitConnectDev = mutableListOf<BleDevItem>()
private val waitConnectDevNameList = mutableListOf<String>()
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<WriteOffResultMsg> {
override fun targetLan(): Class<WriteOffResultMsg> = 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
waitConnectDev.forEach {
if(it.dev.name== getBleName(phone)){
haveDevices = true
OchChainLogManager.writeChainLogWriteOff("司机端核销成功","找到设备")
it.gattcallback.connectGatt()
it.gattcallback.connectListener = connectListener
}
}
if(!haveDevices&&count<6){
RxUtils.createSubscribe {
OchChainLogManager.writeChainLogWriteOff("司机端核销成功","2s后重试")
findDeviceConnectAndSendData(obj,count+1)
}
}
}
}
private val bleDevs = object : BleDevListener{
@SuppressLint("MissingPermission")
@Synchronized
override fun dataChange(scanList: MutableList<BleDevItem>) {
val tempList = mutableListOf<String>()
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<String, String>, payload: String?) {
@@ -43,7 +112,7 @@ object TicketModel : StateChangeListener {
val bookingTime = params["bookingTime"]
val businessType = params["businessType"]
val lineId = params["lineId"]
val remainingTimes = params["remainingTimes"]
val availableTimes = params["availableTimes"]
val orderNo = params["orderNo"]
val uid = params["uid"]
val phone = params["phone"]
@@ -67,12 +136,12 @@ object TicketModel : StateChangeListener {
bookingTime?.toLong()?:0,
businessType?.toInt()?:0,
lineId?.toLong()?:0,
remainingTimes?.toInt()?:0,
availableTimes?.toInt()?:0,
orderNo,
uid,
phoneNum,
ticketSize?.toInt()?:0,
ticketName,
URLDecoder.decode(ticketName,"UTF-8"),
type,
pipe,
startStationId?.toLong()?:0,
@@ -80,6 +149,8 @@ object TicketModel : StateChangeListener {
)
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, "")
@@ -95,4 +166,32 @@ object TicketModel : StateChangeListener {
LanSocketManager.sendMsgToServer(writeOffDetail)
}
}
private fun addWaitConnectDevName(phone: String?) {
var tempPhone = phone
tempPhone?.let {
waitConnectDevNameList.add( getBleName(it))
}
}
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 = "mogo${phoneNumPre}$phoneNumFix"
}
}
return tempPhone
}
private fun scanBle() {
BizLoopManager.runInMainThread{
BleManager.scanLeDevice()
}
}
}