|
@@ -21,6 +21,7 @@ import com.wayne.www.waynelib.fdc.OnFdcMessageReceivedListener
|
|
|
import com.wayne.www.waynelib.fdc.OnFdcServiceResponseReceivedListener
|
|
|
import com.wayne.www.waynelib.fdc.message.*
|
|
|
import kotlinx.coroutines.*
|
|
|
+import java.util.*
|
|
|
import kotlin.coroutines.resume
|
|
|
import kotlin.coroutines.suspendCoroutine
|
|
|
|
|
@@ -29,7 +30,7 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
|
|
|
OnFdcMessageReceivedListener {
|
|
|
|
|
|
var stateFusion: FdcClient.FdcClientState = FdcClient.FdcClientState.Stopped
|
|
|
- private const val timeoutMax = 4000
|
|
|
+ private const val timeoutMax = 8000
|
|
|
var firstLink = false
|
|
|
private set
|
|
|
private var isLogin = false
|
|
@@ -40,7 +41,7 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
|
|
|
var onFusionEvent: OnFusionEvent? = null
|
|
|
|
|
|
override fun onFdcClientStateChanged(sender: FdcClient?, state: FdcClient.FdcClientState?) {
|
|
|
- DFSLog.i("Fusion: state = ${state?.name}")
|
|
|
+ DFSLog.d("Fusion: state = ${state?.name?.toLowerCase(Locale.CHINA)}")
|
|
|
if (sender == null || state == null) return
|
|
|
|
|
|
stateFusion = state
|
|
@@ -53,12 +54,16 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
|
|
|
FdcClient.FdcClientState.Connecting -> onFusionEvent?.onFusionReconnect()
|
|
|
FdcClient.FdcClientState.MyAddReConnect -> {
|
|
|
if (!firstLink) {
|
|
|
- onFusionEvent?.onFusionInit(FusionError.WrongAddress, StringUtil.get(R.string.wrong_fusion_address))
|
|
|
+ onFusionEvent?.onFusionInit(
|
|
|
+ FusionError.WrongAddress,
|
|
|
+ StringUtil.get(R.string.wrong_fusion_address)
|
|
|
+ )
|
|
|
} else {
|
|
|
onFusionEvent?.onFusionReconnect()
|
|
|
}
|
|
|
}
|
|
|
- else -> {}
|
|
|
+ else -> {
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -90,7 +95,10 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
|
|
|
coroutineIO.launch {
|
|
|
delay(12000)
|
|
|
if (stateFusion == FdcClient.FdcClientState.Stopped) {
|
|
|
- onFusionEvent?.onFusionInit(FusionError.Timeout, StringUtil.get(R.string.connect_timeout))
|
|
|
+ onFusionEvent?.onFusionInit(
|
|
|
+ FusionError.Timeout,
|
|
|
+ StringUtil.get(R.string.connect_timeout)
|
|
|
+ )
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -130,7 +138,10 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
|
|
|
}
|
|
|
if (!success) {
|
|
|
isLogin = false
|
|
|
- onFusionEvent?.onFusionInit(FusionError.Login, StringUtil.get(R.string.login_fail))
|
|
|
+ onFusionEvent?.onFusionInit(
|
|
|
+ FusionError.Login,
|
|
|
+ StringUtil.get(R.string.login_fail)
|
|
|
+ )
|
|
|
return@launch
|
|
|
} else {
|
|
|
isLogin = true
|
|
@@ -143,7 +154,10 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
|
|
|
pumpList.addAll(resultPumpList.data)
|
|
|
onFusionEvent?.onFusionInit(FusionError.Success)
|
|
|
} else {
|
|
|
- onFusionEvent?.onFusionInit(FusionError.GetNozzleInfo, StringUtil.get(R.string.fail_get_nozzle))
|
|
|
+ onFusionEvent?.onFusionInit(
|
|
|
+ FusionError.GetNozzleInfo,
|
|
|
+ StringUtil.get(R.string.fail_get_nozzle)
|
|
|
+ )
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -153,66 +167,84 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
|
|
|
* @param pumpId -1表示全部FP,其他代表某个FP
|
|
|
*/
|
|
|
suspend fun getAllUnsettledOrder(pumpId: Int = -1) = suspendCoroutine<DFSResult<List<DeviceClass>>> {
|
|
|
- ThreadUtil.io {
|
|
|
- FdcClient.getDefault().sendGetAvailableFuelSaleTrxs(pumpId, { _, response ->
|
|
|
- coroutineIO.launch {
|
|
|
- if (response == null || response !is ServiceResponseGetAvailableFuelSaleTrxs) {
|
|
|
- it.resume(DFSResult.fail(R.string.fail_get_order))
|
|
|
- } else if (response.singleFdcData == null || response.singleDeviceClass == null) {
|
|
|
- it.resume(DFSResult.success(emptyList()))
|
|
|
- } else {
|
|
|
- DFSLog.v("uncleared orders of pump $pumpId", response.singleFdcData.deviceClasses)
|
|
|
- val unsettledList = response.singleFdcData.deviceClasses.filter { !it.isClear }
|
|
|
- val resultDetailList = unsettledList
|
|
|
- .map { dc -> async { getOrderDetail(dc) } }
|
|
|
- .map { deferred -> deferred.await() }
|
|
|
- .filter { it.success }
|
|
|
- .mapNotNull {
|
|
|
- it.data?.productName =
|
|
|
- pumpList.find { pump -> pump.pumpId == it.data?.pumpNo }?.oilName
|
|
|
- ?: ""
|
|
|
- it.data
|
|
|
- }
|
|
|
- it.resume(DFSResult.success(resultDetailList))
|
|
|
+ ThreadUtil.io {
|
|
|
+ val time1 = System.currentTimeMillis()
|
|
|
+ FdcClient.getDefault().sendGetAvailableFuelSaleTrxs(pumpId, { _, response ->
|
|
|
+ val time2 = System.currentTimeMillis()
|
|
|
+ DFSLog.v(
|
|
|
+ "fetch uncleared orders of pump $pumpId (cost ${time2 - time1}ms)",
|
|
|
+ response
|
|
|
+ )
|
|
|
+ coroutineIO.launch {
|
|
|
+ if (response == null || response !is ServiceResponseGetAvailableFuelSaleTrxs) {
|
|
|
+ it.resume(DFSResult.fail(R.string.fail_get_order))
|
|
|
+ } else if (response.singleFdcData == null || response.singleDeviceClass == null) {
|
|
|
+ it.resume(DFSResult.success(emptyList()))
|
|
|
+ } else {
|
|
|
+ val unsettledList =
|
|
|
+ response.singleFdcData.deviceClasses.filter { !it.isClear }
|
|
|
+ val resultDetailList = unsettledList
|
|
|
+ .map { dc -> async { getOrderDetail(dc) } }
|
|
|
+ .map { deferred -> deferred.await() }
|
|
|
+ .filter { it.success }
|
|
|
+ .mapNotNull {
|
|
|
+ it.data?.productName =
|
|
|
+ pumpList.find { pump -> pump.pumpId == it.data?.pumpNo }?.oilName
|
|
|
+ ?: ""
|
|
|
+ it.data
|
|
|
+ }
|
|
|
+ val time3 = System.currentTimeMillis()
|
|
|
+ DFSLog.v("fetch uncleared orders detail cost ${time3 - time2}ms")
|
|
|
+ it.resume(DFSResult.success(resultDetailList))
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- }, 4000)
|
|
|
+ }, timeoutMax)
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
/**
|
|
|
* 挂起函数:获取订单详情
|
|
|
*/
|
|
|
private suspend fun getOrderDetail(deviceClass: DeviceClass) = suspendCoroutine<DFSResult<DeviceClass>> {
|
|
|
- getOrderDetailAsync(deviceClass) { asyncResult ->
|
|
|
- it.resume(asyncResult)
|
|
|
+ getOrderDetailAsync(deviceClass) { asyncResult ->
|
|
|
+ it.resume(asyncResult)
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
/**
|
|
|
* 获取订单详情
|
|
|
*/
|
|
|
private fun getOrderDetailAsync(dcRaw: DeviceClass, callback: (result: DFSResult<DeviceClass>) -> Unit) {
|
|
|
ThreadUtil.io {
|
|
|
- FdcClient.getDefault().sendGetFuelSalesTrxDetailsRequestAsync(dcRaw.pumpNo, dcRaw.transactionSeqNo, dcRaw.releaseTokenAttribute, { _, response ->
|
|
|
- if (response == null || response !is ServiceResponseGetFuelSalesTrxDetails || response.fdcData.isEmpty() || response.fdcData[0].deviceClasses.isEmpty()) {
|
|
|
- callback(DFSResult.fail(R.string.fail_get_order_detail))
|
|
|
- } else {
|
|
|
- val dc = response.fdcData[0].deviceClasses[0]
|
|
|
- // 迷惑的数据需要 hack 一下
|
|
|
- dc.releaseTokenAttribute = dcRaw.releaseTokenAttribute
|
|
|
- val correctNozzle = pumpList.find {
|
|
|
- it.pumpId == dc.pumpNo
|
|
|
- }?.nozzleList?.find {
|
|
|
- it.logicId == dc.nozzleNo
|
|
|
- }
|
|
|
- correctNozzle?.let {
|
|
|
- dc.nozzleNo = it.physicalId
|
|
|
- dc.logicNo = it.logicId
|
|
|
+ FdcClient.getDefault().sendGetFuelSalesTrxDetailsRequestAsync(
|
|
|
+ dcRaw.pumpNo,
|
|
|
+ dcRaw.transactionSeqNo,
|
|
|
+ dcRaw.releaseTokenAttribute,
|
|
|
+ { _, response ->
|
|
|
+ DFSLog.v(
|
|
|
+ "fetch order detail of ${dcRaw.pumpNo}-${dcRaw.transactionSeqNo}",
|
|
|
+ response
|
|
|
+ )
|
|
|
+ if (response == null || response !is ServiceResponseGetFuelSalesTrxDetails || response.fdcData.isEmpty() || response.fdcData[0].deviceClasses.isEmpty()) {
|
|
|
+ callback(DFSResult.fail(R.string.fail_get_order_detail))
|
|
|
+ } else {
|
|
|
+ val dc = response.fdcData[0].deviceClasses[0]
|
|
|
+ // 迷惑的数据需要 hack 一下
|
|
|
+ dc.releaseTokenAttribute = dcRaw.releaseTokenAttribute
|
|
|
+ val correctNozzle = pumpList.find {
|
|
|
+ it.pumpId == dc.pumpNo
|
|
|
+ }?.nozzleList?.find {
|
|
|
+ it.logicId == dc.nozzleNo
|
|
|
+ }
|
|
|
+ correctNozzle?.let {
|
|
|
+ dc.nozzleNo = it.physicalId
|
|
|
+ dc.logicNo = it.logicId
|
|
|
+ }
|
|
|
+ callback(DFSResult.success(dc))
|
|
|
}
|
|
|
- callback(DFSResult.success(dc))
|
|
|
- }
|
|
|
- }, 3000)
|
|
|
+ },
|
|
|
+ 3000
|
|
|
+ )
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -229,19 +261,25 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
|
|
|
clearOrder(dc.pumpNo, dc.transactionSeqNo, dc.releaseTokenAttribute.toInt())
|
|
|
}
|
|
|
}
|
|
|
- suspend fun clearOrder(pumpId: Int, transactionNo: String, token: Int,) = suspendCoroutine<DFSResult<Boolean>> {
|
|
|
- ThreadUtil.io {
|
|
|
- FdcClient.getDefault().sendClearFuelSaleTrxRequestAsync(pumpId, transactionNo, token, { _, response ->
|
|
|
- if (response != null && response.singleDeviceClass != null && response.overallResult.equals("Success", true)) {
|
|
|
- DFSLog.i("clear order[$pumpId-$transactionNo-$token] succeed")
|
|
|
- it.resume(DFSResult.success(true))
|
|
|
- } else {
|
|
|
- DFSLog.e("FusionManager.clearOrder failed", response)
|
|
|
- it.resume(DFSResult.fail(R.string.fail_lock_order))
|
|
|
- }
|
|
|
- },4000)
|
|
|
+
|
|
|
+ suspend fun clearOrder(pumpId: Int, transactionNo: String, token: Int) = suspendCoroutine<DFSResult<Boolean>> {
|
|
|
+ ThreadUtil.io {
|
|
|
+ FdcClient.getDefault()
|
|
|
+ .sendClearFuelSaleTrxRequestAsync(pumpId, transactionNo, token, { _, response ->
|
|
|
+ if (response != null && response.singleDeviceClass != null && response.overallResult.equals(
|
|
|
+ "Success",
|
|
|
+ true
|
|
|
+ )
|
|
|
+ ) {
|
|
|
+ DFSLog.i("clear order[$pumpId-$transactionNo-$token] succeed")
|
|
|
+ it.resume(DFSResult.success(true))
|
|
|
+ } else {
|
|
|
+ DFSLog.e("FusionManager.clearOrder failed", response)
|
|
|
+ it.resume(DFSResult.fail(R.string.fail_lock_order))
|
|
|
+ }
|
|
|
+ }, 4000)
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
/**
|
|
|
* 锁定/解锁订单
|
|
@@ -255,37 +293,50 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
|
|
|
lockOrder(dc.pumpNo, dc.transactionSeqNo, dc.releaseTokenAttribute.toInt(), lock)
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
suspend fun lockOrder(pumpId: Int, transactionNo: String, token: Int, lock: Boolean) = suspendCoroutine<DFSResult<Boolean>> {
|
|
|
- ThreadUtil.io {
|
|
|
- val callback = OnFdcServiceResponseReceivedListener { _, response ->
|
|
|
- DFSLog.v("Fusion.lockOrder($pumpId, $transactionNo, $token, $lock)", response)
|
|
|
- if (response != null && response.singleDeviceClass != null && response.overallResult.equals("Success", true)) {
|
|
|
- it.resume(DFSResult.success(true))
|
|
|
+ ThreadUtil.io {
|
|
|
+ val callback = OnFdcServiceResponseReceivedListener { _, response ->
|
|
|
+ DFSLog.v("Fusion.lockOrder($pumpId, $transactionNo, $token, $lock)", response)
|
|
|
+ if (response != null && response.singleDeviceClass != null && response.overallResult.equals("Success", true)) {
|
|
|
+ it.resume(DFSResult.success(true))
|
|
|
+ } else {
|
|
|
+ it.resume(DFSResult.fail(response?.overallResult ?: StringUtil.get(R.string.fail_operate)))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (lock) {
|
|
|
+ FdcClient.getDefault().sendLockFuelSaleTrxRequestAsync(
|
|
|
+ pumpId,
|
|
|
+ transactionNo,
|
|
|
+ token,
|
|
|
+ callback,
|
|
|
+ 4000
|
|
|
+ )
|
|
|
} else {
|
|
|
- it.resume(DFSResult.fail(response?.overallResult ?: StringUtil.get(R.string.fail_operate)))
|
|
|
+ FdcClient.getDefault().sendUnLockFuelSaleTrxRequestAsync(
|
|
|
+ pumpId,
|
|
|
+ transactionNo,
|
|
|
+ token,
|
|
|
+ callback,
|
|
|
+ 4000
|
|
|
+ )
|
|
|
}
|
|
|
}
|
|
|
- if (lock) {
|
|
|
- FdcClient.getDefault().sendLockFuelSaleTrxRequestAsync(pumpId, transactionNo, token, callback, 4000)
|
|
|
- } else {
|
|
|
- FdcClient.getDefault().sendUnLockFuelSaleTrxRequestAsync(pumpId, transactionNo, token, callback, 4000)
|
|
|
- }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
suspend fun requestPumpInfo() = FuelInfoApi.requestPumpInfo()
|
|
|
|
|
|
private suspend fun login() = suspendCoroutine<Boolean> {
|
|
|
val port = SPUtil.getString(SPKeys.MIDDLE_PORT).toInt()
|
|
|
FdcClient.getDefault().sendLogonRequestAsync(port, port, "00.07", { _, response ->
|
|
|
+ DFSLog.v("Fusion: login response", response)
|
|
|
if (response != null && response is ServiceResponseLogOn) {
|
|
|
val status = response.singleFdcData.fdcStatus
|
|
|
- DFSLog.v("Fusion: try login response = $status")
|
|
|
if (status.equals(FusionConstants.CODE_SUCCESS, true)) {
|
|
|
- DFSLog.d("Fusion: login succeeded")
|
|
|
+ DFSLog.i("Fusion: login succeeded")
|
|
|
it.resume(true)
|
|
|
} else {
|
|
|
- DFSLog.d("Fusion: login failed")
|
|
|
+ DFSLog.e("Fusion: login failed")
|
|
|
it.resume(false)
|
|
|
}
|
|
|
}
|
|
@@ -297,10 +348,10 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
|
|
|
val status = response?.singleFdcData?.fdcStatus
|
|
|
DFSLog.v("Fusion: try logout response = $status")
|
|
|
if (status != null && status.equals(FusionConstants.CODE_SUCCESS, true)) {
|
|
|
- DFSLog.d("Fusion: logout succeeded")
|
|
|
+ DFSLog.i("Fusion: logout succeeded")
|
|
|
it.resume(true)
|
|
|
} else {
|
|
|
- DFSLog.d("Fusion: logout failed")
|
|
|
+ DFSLog.e("Fusion: logout failed")
|
|
|
it.resume(false)
|
|
|
}
|
|
|
}, timeoutMax)
|