瀏覽代碼

fix 由于smartfuel 不支持以枪号索引订单,改为泵码索引

robin 4 年之前
父節點
當前提交
4f057f6729

+ 35 - 27
app/src/main/java/com/doverfuelingsolutions/issp/api/FuelInfoApi.kt

@@ -3,8 +3,9 @@ package com.doverfuelingsolutions.issp.api
 import com.doverfuelingsolutions.issp.R
 import com.doverfuelingsolutions.issp.api.basic.RetrofitUtil
 import com.doverfuelingsolutions.issp.api.dto.DFSResult
-import com.doverfuelingsolutions.issp.api.dto.ResultNozzleInfo
+import com.doverfuelingsolutions.issp.api.dto.ResultPumpInfo
 import com.doverfuelingsolutions.issp.api.entity.NozzleInfo
+import com.doverfuelingsolutions.issp.api.entity.PumpInfo
 import com.doverfuelingsolutions.issp.api.service.ServiceStation
 import com.doverfuelingsolutions.issp.utils.log.DFSLog
 import com.doverfuelingsolutions.issp.utils.sp.SPKeys
@@ -22,48 +23,55 @@ object FuelInfoApi {
 
     private var serviceStation: ServiceStation = serviceMaker()
 
-    suspend fun getNozzleInfo() = suspendCoroutine<DFSResult<List<NozzleInfo>>> {
+    suspend fun requestPumpInfo() = suspendCoroutine<DFSResult<List<PumpInfo>>> {
         GlobalScope.launch(Dispatchers.IO) {
-            val resultNozzleList = getNozzleData()
-            if (!resultNozzleList.success || resultNozzleList.data == null) {
-                it.resume(DFSResult.fail(resultNozzleList.message))
+            val resultPumpList = requestPumpList()
+            if (!resultPumpList.success || resultPumpList.data == null) {
+                it.resume(DFSResult.fail(resultPumpList.message))
                 return@launch
-            } else if (resultNozzleList.data.isEmpty()) {
+            } else if (resultPumpList.data.isEmpty()) {
                 it.resume(DFSResult.success(emptyList()))
                 return@launch
             }
 
             val localBarcodeMap = getLocalBarcodeMap().toMutableMap()
             var isLocalAdd = false
-            val nozzleInfoList = arrayListOf<NozzleInfo>()
-            for (pump in resultNozzleList.data) {
-                for (nozzle in pump.Nozzles) {
-                    val localName = localBarcodeMap[nozzle.ProductBarcode]
-                    val name: String = if (localName != null && localName.isNotEmpty()) {
-                        localName
+            val pumpList = arrayListOf<PumpInfo>()
+            for (item in resultPumpList.data) {
+                if (item.nozzles.isEmpty()) return@launch
+                // confirm 确认是否每个油泵下的枪的油品都是一致的?ResultPumpInfo 的 Name 属性?
+                // 当前油泵的油品名称
+                val firstNozzle = item.nozzles[0]
+                val localName = localBarcodeMap[firstNozzle.ProductBarcode]
+                val name: String = if (localName != null && localName.isNotEmpty()) {
+                    localName
+                } else {
+                    val resultBarcodeInfo = CloudApi.barcodeName(firstNozzle.ProductBarcode)
+                    if (resultBarcodeInfo.success && resultBarcodeInfo.data != null && resultBarcodeInfo.data.IsFuelItem) {
+                        localBarcodeMap[firstNozzle.ProductBarcode] = resultBarcodeInfo.data.ItemName
+                        isLocalAdd = true
+                        resultBarcodeInfo.data.ItemName
                     } else {
-                        val resultBarcodeInfo = CloudApi.barcodeName(nozzle.ProductBarcode)
-                        if (resultBarcodeInfo.success && resultBarcodeInfo.data != null && resultBarcodeInfo.data.IsFuelItem) {
-                            localBarcodeMap[nozzle.ProductBarcode] = resultBarcodeInfo.data.ItemName
-                            isLocalAdd = true
-                            resultBarcodeInfo.data.ItemName
-                        } else {
-                            ""
-                        }
+                        ""
                     }
-                    nozzleInfoList.add(NozzleInfo(pump.PumpId, nozzle.SiteLevelNozzleId, nozzle.ProductBarcode, name))
                 }
+                val pump = PumpInfo(item.PumpId, name, item.nozzles.map { resultNozzleInfo ->
+                    NozzleInfo(item.PumpId, resultNozzleInfo.SiteLevelNozzleId, resultNozzleInfo.ProductBarcode, name)
+                })
+                pumpList.add(pump)
             }
             if (isLocalAdd) setLocalBarcodeMap(localBarcodeMap)
 
-            nozzleInfoList.sortBy { it.physicalId }
-            it.resume(DFSResult.success(nozzleInfoList))
+            // confirm 是否还有必要做排序?
+            pumpList.sortBy { it.pumpId }
+            it.resume(DFSResult.success(pumpList))
         }
     }
 
-    private suspend fun getNozzleData() = suspendCoroutine<DFSResult<Array<ResultNozzleInfo>>> {
-        serviceStation.getNozzleInfo().enqueue(object : Callback<Array<ResultNozzleInfo>> {
-            override fun onResponse(call: Call<Array<ResultNozzleInfo>>, response: Response<Array<ResultNozzleInfo>>) {
+    // confirm 订单主键从 nozzle 改为 pump
+    private suspend fun requestPumpList() = suspendCoroutine<DFSResult<Array<ResultPumpInfo>>> {
+        serviceStation.getNozzleInfo().enqueue(object : Callback<Array<ResultPumpInfo>> {
+            override fun onResponse(call: Call<Array<ResultPumpInfo>>, response: Response<Array<ResultPumpInfo>>) {
                 val code = response.code()
                 val body = response.body()
                 if (code == 200 && body != null) {
@@ -73,7 +81,7 @@ object FuelInfoApi {
                 it.resume(DFSResult.fail(R.string.return_data_error))
             }
 
-            override fun onFailure(call: Call<Array<ResultNozzleInfo>>, t: Throwable) {
+            override fun onFailure(call: Call<Array<ResultPumpInfo>>, t: Throwable) {
                 DFSLog.e("FuelInfoApi.getNozzleData.onFailure", t)
                 it.resume(DFSResult.fail(t.message.toString()))
             }

+ 3 - 3
app/src/main/java/com/doverfuelingsolutions/issp/api/dto/ResultNozzleInfo.kt

@@ -1,7 +1,7 @@
 package com.doverfuelingsolutions.issp.api.dto
 
 data class ResultNozzleInfo(
-    val Name: String,
-    val PumpId: Int,
-    val Nozzles: List<ResultNozzleInfoItem>,
+    val LogicalId: Int,
+    val SiteLevelNozzleId: Int,
+    val ProductBarcode: Int,
 )

+ 0 - 7
app/src/main/java/com/doverfuelingsolutions/issp/api/dto/ResultNozzleInfoItem.kt

@@ -1,7 +0,0 @@
-package com.doverfuelingsolutions.issp.api.dto
-
-data class ResultNozzleInfoItem(
-    val LogicalId: Int,
-    val SiteLevelNozzleId: Int,
-    val ProductBarcode: Int,
-)

+ 7 - 0
app/src/main/java/com/doverfuelingsolutions/issp/api/dto/ResultPumpInfo.kt

@@ -0,0 +1,7 @@
+package com.doverfuelingsolutions.issp.api.dto
+
+data class ResultPumpInfo(
+    val Name: String,
+    val PumpId: Int,
+    val nozzles: List<ResultNozzleInfo>,
+)

+ 9 - 0
app/src/main/java/com/doverfuelingsolutions/issp/api/entity/PumpInfo.kt

@@ -0,0 +1,9 @@
+package com.doverfuelingsolutions.issp.api.entity
+
+data class PumpInfo(
+    val pumpId: Int,
+    val oilName: String,
+    val nozzleList: List<NozzleInfo>,
+) {
+    constructor(nozzle: NozzleInfo) : this(nozzle.pumpId, nozzle.barcodeName, listOf(nozzle))
+}

+ 2 - 4
app/src/main/java/com/doverfuelingsolutions/issp/api/service/ServiceStation.kt

@@ -1,9 +1,7 @@
 package com.doverfuelingsolutions.issp.api.service
 
-import com.doverfuelingsolutions.issp.api.dto.ResultNozzleInfo
+import com.doverfuelingsolutions.issp.api.dto.ResultPumpInfo
 import com.doverfuelingsolutions.issp.api.entity.DefaultParams
-import okhttp3.ResponseBody
-import org.json.JSONObject
 import retrofit2.Call
 import retrofit2.http.Body
 import retrofit2.http.POST
@@ -11,5 +9,5 @@ import retrofit2.http.POST
 interface ServiceStation {
 
     @POST("u/?mn=GetPumpsLayout&pn=fdcServerApp&en=Applications.FDC.FdcServerHostApp")
-    fun getNozzleInfo(@Body params: DefaultParams = DefaultParams(emptyList())): Call<Array<ResultNozzleInfo>>
+    fun getNozzleInfo(@Body params: DefaultParams = DefaultParams(emptyList())): Call<Array<ResultPumpInfo>>
 }

+ 15 - 19
app/src/main/java/com/doverfuelingsolutions/issp/fusion/FusionManager.kt

@@ -6,7 +6,7 @@ import androidx.lifecycle.OnLifecycleEvent
 import com.doverfuelingsolutions.issp.R
 import com.doverfuelingsolutions.issp.api.FuelInfoApi
 import com.doverfuelingsolutions.issp.api.dto.DFSResult
-import com.doverfuelingsolutions.issp.api.entity.NozzleInfo
+import com.doverfuelingsolutions.issp.api.entity.PumpInfo
 import com.doverfuelingsolutions.issp.data.GlobalData
 import com.doverfuelingsolutions.issp.fusion.callback.OnFusionEvent
 import com.doverfuelingsolutions.issp.utils.StringUtil
@@ -30,7 +30,7 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
     var stateFusion: FdcClient.FdcClientState = FdcClient.FdcClientState.Stopped
     private const val timeoutMax = 4000
     private var isLogin = false
-    val nozzleList = arrayListOf<NozzleInfo>()
+    val pumpList = arrayListOf<PumpInfo>()
 
     private val coroutineIO = CoroutineScope(Dispatchers.IO)
 
@@ -124,10 +124,10 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
                 }
             }
 
-            val resultNozzles = requestNozzleInfo()
-            if (resultNozzles.success && resultNozzles.data != null) {
-                if (nozzleList.isNotEmpty()) nozzleList.clear()
-                nozzleList.addAll(resultNozzles.data)
+            val resultPumpList = requestPumpInfo()
+            if (resultPumpList.success && resultPumpList.data != null) {
+                if (pumpList.isNotEmpty()) pumpList.clear()
+                pumpList.addAll(resultPumpList.data)
                 onFusionEvent?.onFusionInit(FusionError.Success)
             } else {
                 onFusionEvent?.onFusionInit(FusionError.GetNozzleInfo, StringUtil.get(R.string.fail_get_nozzle))
@@ -146,18 +146,14 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
                     if (response == null || response !is ServiceResponseGetAvailableFuelSaleTrxs || response.singleFdcData == null || response.singleDeviceClass == null) {
                         it.resume(DFSResult.fail(R.string.fail_get_order))
                     } else {
-                        val detailList = response.singleFdcData.deviceClasses.map { dc ->
-                            DFSLog.v(dc)
-                            val asyncResultDetail = async { getOrderDetail(dc) }
-                            val result = asyncResultDetail.await()
-                            if (result.success) {
-                                DFSLog.d(result.data)
-                                result.data?.productName = nozzleList.find { it.pumpId == dc.pumpNo }?.barcodeName ?: ""
-                            }
-                            result.data
-                        }
-                        val orderList = detailList.filterNotNull()
-                        it.resume(DFSResult.success(orderList))
+                        val deferredList = response.singleFdcData.deviceClasses.map { dc -> async { getOrderDetail(dc) } }
+                        val resultDetailList = deferredList.map { deferred -> deferred.await() }
+                        it.resume(DFSResult.success(resultDetailList.mapNotNull { resultDetail ->
+                            resultDetail.data?.productName =
+                                pumpList.find { it.pumpId == resultDetail.data?.pumpNo }?.oilName
+                                    ?: ""
+                            resultDetail.data
+                        }))
                     }
                 }
             }, 4000)
@@ -189,7 +185,7 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
         }
     }
 
-    suspend fun requestNozzleInfo() = FuelInfoApi.getNozzleInfo()
+    suspend fun requestPumpInfo() = FuelInfoApi.requestPumpInfo()
 
     private suspend fun login() = suspendCoroutine<Boolean> {
         val port = SPUtil.getString(SPKeys.MIDDLE_PORT).toInt()

+ 1 - 2
app/src/main/java/com/doverfuelingsolutions/issp/view/MainActivity.kt

@@ -15,7 +15,6 @@ import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.lifecycleScope
 import com.doverfuelingsolutions.issp.R
-import com.doverfuelingsolutions.issp.api.FuelInfoApi
 import com.doverfuelingsolutions.issp.data.GlobalData
 import com.doverfuelingsolutions.issp.databinding.ActivityMainBinding
 import com.doverfuelingsolutions.issp.fusion.FusionError
@@ -121,7 +120,7 @@ class MainActivity : AppCompatActivity(),
                 val type = result.getString(FragmentConstants.searchType)
                 if (type == FragmentConstants.typeNozzle) {
                     fragmentOrderList.viewModel.type.value = FragmentConstants.typeNozzle
-                    fragmentOrderList.viewModel.nozzle.value = result.getInt(FragmentConstants.pumpId)
+                    fragmentOrderList.viewModel.pump.value = result.getInt(FragmentConstants.pumpId)
                     setFragment(fragmentOrderList, true)
                 }
             }

+ 10 - 10
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentNozzle.kt

@@ -11,7 +11,6 @@ import androidx.recyclerview.widget.GridLayoutManager
 import com.doverfuelingsolutions.issp.R
 import com.doverfuelingsolutions.issp.databinding.FragmentNozzleBinding
 import com.doverfuelingsolutions.issp.fusion.FusionManager
-import com.doverfuelingsolutions.issp.utils.log.DFSLog
 import com.doverfuelingsolutions.issp.view.adapter.ChooseListAdapter
 import com.scwang.smart.refresh.header.ClassicsHeader
 import kotlinx.coroutines.Dispatchers
@@ -22,10 +21,10 @@ class FragmentNozzle : FragmentBasic() {
 
     private lateinit var binding: FragmentNozzleBinding
 
-    private val nozzleList: List<Int> by lazy { FusionManager.nozzleList.map { it.physicalId } }
-    private val chooseListAdapter: ChooseListAdapter<Int> by lazy {
+    private val pumpList: List<String> by lazy { FusionManager.pumpList.map { it.nozzleList.joinToString() } }
+    private val chooseListAdapter: ChooseListAdapter<String> by lazy {
         ChooseListAdapter(
-            nozzleList,
+            pumpList,
             this::select
         )
     }
@@ -48,10 +47,10 @@ class FragmentNozzle : FragmentBasic() {
 
     private fun handleNozzleRefresh() {
         GlobalScope.launch(Dispatchers.Main) {
-            val resultNozzles = FusionManager.requestNozzleInfo()
+            val resultNozzles = FusionManager.requestPumpInfo()
             if (resultNozzles.success && resultNozzles.data != null) {
-                if (FusionManager.nozzleList.isNotEmpty()) FusionManager.nozzleList.clear()
-                FusionManager.nozzleList.addAll(resultNozzles.data)
+                if (FusionManager.pumpList.isNotEmpty()) FusionManager.pumpList.clear()
+                FusionManager.pumpList.addAll(resultNozzles.data)
                 binding.nozzleList.adapter?.notifyDataSetChanged()
                 binding.smartRefreshLayout.finishRefresh(200, true, false)
             } else {
@@ -60,14 +59,15 @@ class FragmentNozzle : FragmentBasic() {
         }
     }
 
-    private fun select(nozzle: Int) {
-        // TODO 究竟是传 FP 还是物理枪号?
+    private fun select(nozzle: String) {
         setFragmentResult(
             FragmentConstants.fragmentEvent,
             bundleOf(
                 Pair(FragmentConstants.eventType, FragmentConstants.eventOrderList),
                 Pair(FragmentConstants.searchType, FragmentConstants.typeNozzle),
-                Pair(FragmentConstants.pumpId, nozzle),
+                Pair(FragmentConstants.pumpId, FusionManager.pumpList.find {
+                    it.nozzleList.joinToString() == nozzle
+                }!!.pumpId),
             )
         )
     }

+ 5 - 6
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentOrderList.kt

@@ -16,7 +16,6 @@ import com.doverfuelingsolutions.issp.fusion.FusionManager
 import com.doverfuelingsolutions.issp.utils.log.DFSLog
 import com.doverfuelingsolutions.issp.view.adapter.OrderListAdapter
 import com.google.android.material.snackbar.Snackbar
-import com.google.gson.Gson
 import com.scwang.smart.refresh.header.ClassicsHeader
 import com.wayne.www.waynelib.fdc.message.DeviceClass
 import kotlinx.coroutines.launch
@@ -55,7 +54,7 @@ class FragmentOrderList : FragmentBasic() {
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
 
-        // TODO 订单状态:锁定、清理
+        // TODO 订单状态:是否需要对一些已锁定、清理的订单做处理?
         lifecycleScope.launch {
             binding.orderList.scrollTo(0, 0)
             // local data
@@ -65,7 +64,7 @@ class FragmentOrderList : FragmentBasic() {
             orderListAdapter.notifyDataSetChanged()
 
             // remote data
-            val result = FusionManager.getAllUnsettledOrder(viewModel.nozzle.value!!)
+            val result = FusionManager.getAllUnsettledOrder(viewModel.pump.value!!)
             if (result.success && result.data != null) {
                 val localHash = localList.joinToString { it.transactionSeqNo }
                 val remoteHash = result.data.joinToString { it.transactionSeqNo }
@@ -89,10 +88,10 @@ class FragmentOrderList : FragmentBasic() {
 
     private fun filterByMode(orders: List<DeviceClass>): List<DeviceClass> {
         val isNozzle = viewModel.type.value == FragmentConstants.typeNozzle
-        val physicalNozzle = viewModel.nozzle.value!!
+        val pump = viewModel.pump.value!!
         return orders.filter {
             if (isNozzle) {
-                it.nozzleNo == physicalNozzle
+                it.pumpNo == pump
             } else {
                 // TODO 油品选择
                 true
@@ -102,7 +101,7 @@ class FragmentOrderList : FragmentBasic() {
 
     class FragmentNozzleViewModel : ViewModel() {
         val type = MutableLiveData(FragmentConstants.typeNozzle)
-        val nozzle = MutableLiveData(0)
+        val pump = MutableLiveData(-1)
         val oilName = MutableLiveData("")
     }
 }