瀏覽代碼

feat 兼容FCC2.0

robin 4 年之前
父節點
當前提交
3255dee979

+ 115 - 18
app/src/main/java/com/doverfuelingsolutions/issp/api/FuelInfoApi.kt

@@ -3,7 +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.*
+import com.doverfuelingsolutions.issp.api.entity.DefaultParams
 import com.doverfuelingsolutions.issp.api.entity.NozzleInfo
+import com.doverfuelingsolutions.issp.api.entity.ParametersBean
 import com.doverfuelingsolutions.issp.api.entity.PumpInfo
 import com.doverfuelingsolutions.issp.api.service.ServiceStation
 import com.doverfuelingsolutions.issp.utils.log.DFSLog
@@ -31,7 +33,7 @@ object FuelInfoApi {
     /**
      * 获取泵+枪信息,并且其中的补全残缺信息
      */
-    suspend fun requestPumpInfo() = suspendCoroutine<DFSResult<List<PumpInfo>>> {
+    suspend fun requestPumpInfo() = suspendCoroutine<DFSResult<List<NozzleInfo>>> {
         GlobalScope.launch(Dispatchers.IO) {
             val resultApi = getApiInfo(WayneApiConfig.Api_GetPumpsLayout)
             if (resultApi.success && resultApi.data != null) {
@@ -44,23 +46,33 @@ object FuelInfoApi {
                     return@launch
                 }
 
-            val pumpList = arrayListOf<PumpInfo>()
-            for (item in resultPumpList.data) {
-                if (item.Nozzles.isEmpty()) continue
-                val firstNozzle = item.Nozzles[0]
-                // FCC3.0 传递了油品名称,不需要像 FCC2.0 那样自行查询
-                val pump = PumpInfo(item.PumpId, firstNozzle.ProductName, item.Nozzles.map { resultNozzleInfo ->
-                    NozzleInfo(
-                        item.PumpId,
-                        resultNozzleInfo.LogicalId,
-                        resultNozzleInfo.SiteLevelNozzleId,
-                        resultNozzleInfo.ProductBarcode,
-                        firstNozzle.ProductName)
-                })
-                pumpList.add(pump)
-            }
-
-            it.resume(DFSResult.success(pumpList))
+                val nozzles = arrayListOf<NozzleInfo>()
+                val barcodeHashMap = HashMap<Int, ResultBarcode>()
+                resultPumpList.data.forEach { pump ->
+                    pump.Nozzles.forEach { nozzle ->
+                        val barcode = nozzle.ProductBarcode
+                        val barcodeInfo: ResultBarcode? = if (barcodeHashMap.containsKey(barcode)) {
+                            barcodeHashMap[barcode]
+                        } else {
+                            val resultBarcodeInfo = SystemApi.barcodeName(barcode)
+                            if (resultBarcodeInfo.success && resultBarcodeInfo.data != null) {
+                                barcodeHashMap[barcode] = resultBarcodeInfo.data
+                                resultBarcodeInfo.data
+                            } else {
+                                null
+                            }
+                        }
+                        val n = NozzleInfo(
+                            pump.PumpId,
+                            nozzle.LogicalId,
+                            nozzle.SiteLevelNozzleId,
+                            nozzle.ProductBarcode,
+                            barcodeInfo?.ItemName ?: "",
+                            barcodeInfo?.Id ?: "")
+                        nozzles.add(n)
+                    }
+                }
+                it.resume(DFSResult.success(nozzles))
             } else {
                 it.resume(DFSResult.fail(resultApi.message))
             }
@@ -122,6 +134,91 @@ object FuelInfoApi {
         })
     }
 
+    /**
+     * 【FCC2.0】获取泵+枪信息,并且其中的补全残缺信息
+     */
+    suspend fun requestPumpInfoFromFCC2(): DFSResult<List<NozzleInfo>> {
+        return suspendCoroutine {
+            serviceStation.getNozzleInfo().enqueue(object : Callback<ResponseBody> {
+                override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
+                    try {
+                        val code = response.code()
+                        val body = response.body()?.string()
+                        if (code == 200 && body != null) {
+                            val obj = Gson().fromJson<List<ResultPumpInfoFCC2>>(body, object : TypeToken<List<ResultPumpInfoFCC2>>() {}.type)
+                            GlobalScope.launch {
+                                val nozzles = arrayListOf<NozzleInfo>()
+                                val barcodeHashMap = HashMap<Int, ResultBarcode>()
+
+                                obj.forEach { pump ->
+                                    pump.Nozzles.forEach { nozzle ->
+                                        val barcode = nozzle.ProductBarcode
+                                        val barcodeInfo: ResultBarcode? = if (barcodeHashMap.containsKey(barcode)) {
+                                            barcodeHashMap[barcode]
+                                        } else {
+                                            val resultBarcodeInfo = SystemApi.barcodeName(barcode)
+                                            if (resultBarcodeInfo.success && resultBarcodeInfo.data != null) {
+                                                barcodeHashMap[barcode] = resultBarcodeInfo.data
+                                                resultBarcodeInfo.data
+                                            } else {
+                                                null
+                                            }
+                                        }
+                                        val n = NozzleInfo(
+                                            pump.PumpId,
+                                            nozzle.LogicalId,
+                                            nozzle.SiteLevelNozzleId,
+                                            nozzle.ProductBarcode,
+                                            barcodeInfo?.ItemName ?: "",
+                                            barcodeInfo?.Id ?: "")
+                                        nozzles.add(n)
+                                    }
+                                }
+                                it.resume(DFSResult.success(nozzles))
+                            }
+                        } else {
+                            it.resume(DFSResult.fail(response.message()))
+                        }
+                    } catch (e: Exception) {
+                        it.resume(DFSResult.fail(e.message.toString()))
+                    }
+                }
+
+                override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
+                    it.resume(DFSResult.fail(t.message.toString()))
+                }
+            })
+        }
+    }
+
+    /**
+     * 【FCC2.0】获取累计数信息
+     */
+    suspend fun accumulationInfoFromFCC2(dc: DeviceClass): DFSResult<ResultAccumulationInfo> {
+        return suspendCoroutine {
+            val bean = ParametersBean().apply {
+                Value = dc.releaseTokenElement
+            }
+            serviceStation.accumulationInfo(DefaultParams(listOf(bean))).enqueue(object : Callback<List<ResultAccumulationInfo>> {
+                override fun onResponse(call: Call<List<ResultAccumulationInfo>>, response: Response<List<ResultAccumulationInfo>>) {
+                    val code = response.code()
+                    val body = response.body()
+                    if (code == 200 && body != null && body.isNotEmpty()) {
+                        it.resume(DFSResult.success(body[0]))
+                        return
+                    }
+
+                    it.resume(DFSResult.fail(R.string.fail_get_accumulation))
+                }
+
+                override fun onFailure(call: Call<List<ResultAccumulationInfo>>, t: Throwable) {
+                    DFSLog.e("FuelInfoApi.accumulationInfo.onFailure", t)
+                    it.resume(DFSResult.fail(R.string.fail_get_accumulation))
+                }
+            })
+        }
+    }
+
     /* Wayne FCC3.0 后,不能使用静态 Url 请求接口,必须查询得到动态 Url 后调用 */
     private val apiInfoListType = (object : TypeToken<List<ResultApiInfo>>() {}).type
     private suspend fun getApiInfo(type: String) = suspendCoroutine<DFSResult<ResultApiInfo>> {

+ 4 - 7
app/src/main/java/com/doverfuelingsolutions/issp/api/SystemApi.kt

@@ -86,13 +86,10 @@ object SystemApi {
                 // 对于微信+支付宝,pay 方法会根据付款码来判断区分究竟是微信还是支付宝,因此本地化一个支付类型
                 body!!.Data.let { channels ->
                     val combine = channels.find { type -> type.PaymentId == 13 }
-                    if (combine != null) {
-                        it.resume(DFSResult.success(combine))
-                        return
-                    } else {
-                        it.resume(DFSResult.success(ResultPaymentParam(0, "移动支付")))
-                        return
-                    }
+                    val param = combine ?: ResultPaymentParam(0, "移动支付")
+                    GlobalData.paymentId.set(param.PaymentId)
+                    GlobalData.paymentName.set(param.DispalyName)
+                    it.resume(DFSResult.success(param))
                 }
             }
 

+ 8 - 0
app/src/main/java/com/doverfuelingsolutions/issp/api/dto/ResultNozzleInfoFCC2.kt

@@ -0,0 +1,8 @@
+package com.doverfuelingsolutions.issp.api.dto
+
+data class ResultNozzleInfoFCC2(
+    val LogicalId: Int,
+    val SiteLevelNozzleId: Int,
+    val ProductBarcode: Int,
+    val ProductName: String,
+)

+ 6 - 0
app/src/main/java/com/doverfuelingsolutions/issp/api/dto/ResultPumpInfoFCC2.kt

@@ -0,0 +1,6 @@
+package com.doverfuelingsolutions.issp.api.dto
+
+data class ResultPumpInfoFCC2(
+    val PumpId: Int,
+    val Nozzles: List<ResultNozzleInfoFCC2>,
+)

+ 26 - 1
app/src/main/java/com/doverfuelingsolutions/issp/api/entity/NozzleInfo.kt

@@ -6,4 +6,29 @@ data class NozzleInfo(
     val physicalId: Int,
     val barcodeId: Int,
     val barcodeName: String,
-)
+    val posItemUniqueId: String,
+) {
+
+    class Builder() {
+
+        constructor(nozzle: NozzleInfo) : this() {
+            pumpId = nozzle.pumpId
+            logicId = nozzle.logicId
+            physicalId = nozzle.physicalId
+            barcodeId = nozzle.barcodeId
+            barcodeName = nozzle.barcodeName
+            posItemUniqueId = nozzle.posItemUniqueId
+        }
+
+        var pumpId: Int = -1
+        var logicId: Int = -1
+        var physicalId: Int = -1
+        var barcodeId: Int = -1
+        var barcodeName: String = ""
+        var posItemUniqueId: String = ""
+
+        fun build(): NozzleInfo {
+            return NozzleInfo(pumpId, logicId, physicalId, barcodeId, barcodeName, posItemUniqueId)
+        }
+    }
+}

+ 3 - 6
app/src/main/java/com/doverfuelingsolutions/issp/api/service/ServiceStation.kt

@@ -2,7 +2,6 @@ package com.doverfuelingsolutions.issp.api.service
 
 import com.doverfuelingsolutions.issp.api.dto.ResultAccumulationInfo
 import com.doverfuelingsolutions.issp.api.dto.ResultApiInfo
-import com.doverfuelingsolutions.issp.api.dto.ResultPumpInfo
 import com.doverfuelingsolutions.issp.api.entity.DefaultParams
 import okhttp3.RequestBody
 import okhttp3.ResponseBody
@@ -17,16 +16,14 @@ interface ServiceStation {
     @POST
     fun postBody(@Url url: String, @Body params: RequestBody) : Call<ResponseBody>
 
-    @Headers("requestName: getApiInfo", "Content-Type: application/json")
+    @Headers("Content-Type: application/json")
     @POST("u/?apitype=service&an=ShowMeApi&pn=ProcessorsDispatcher&en=Edge.Core.Processor.Dispatcher.DefaultDispatcher")
     fun getApiInfo(@Body params: RequestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), "[\"webApi\", [\"IfsfFdcServer\"]]")): Call<Array<ResultApiInfo>>
 
-    @Headers("requestName: getNozzleInfo")
     @POST("u/?mn=GetPumpsLayout&pn=fdcServerApp&en=Applications.FDC.FdcServerHostApp")
-    fun getNozzleInfo(@Body params: DefaultParams = DefaultParams(emptyList())): Call<Array<ResultPumpInfo>>
-
+    fun getNozzleInfo(@Body params: DefaultParams = DefaultParams(emptyList())): Call<ResponseBody>
 
     @POST("u/?mn=GetFuelSaleTrxDetailsAsync&pn=fdcServerApp&en=Applications.FDC.FdcServerHostApp")
-    @Headers("requestName: accumulationInfo", "Content-Type: application/json", "Accept: application/json")
+    @Headers("Content-Type: application/json", "Accept: application/json")
     fun accumulationInfo(@Body params: DefaultParams): Call<List<ResultAccumulationInfo>>
 }

+ 22 - 18
app/src/main/java/com/doverfuelingsolutions/issp/fusion/FusionManager.kt

@@ -6,6 +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.OnFusionStatus
@@ -22,6 +23,7 @@ import com.wayne.www.waynelib.fdc.OnFdcServiceResponseReceivedListener
 import com.wayne.www.waynelib.fdc.message.*
 import kotlinx.coroutines.*
 import java.util.*
+import java.util.concurrent.CopyOnWriteArrayList
 import kotlin.coroutines.resume
 import kotlin.coroutines.suspendCoroutine
 import kotlin.math.min
@@ -40,7 +42,7 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
         private set
     var isFetchPumpInfo = false
         private set
-    val pumpList = arrayListOf<PumpInfo>()
+    val nozzles = arrayListOf<NozzleInfo>()
 
     private val coroutineIO = CoroutineScope(Dispatchers.IO)
     private var jobRestart: Job? = null
@@ -199,25 +201,22 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
             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
-                )
+                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 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 }?.productName
+                                    nozzles.find { n -> n.pumpId == it.data?.pumpNo && it.data.nozzleNo == n.physicalId }?.barcodeName
                                         ?: ""
                                 it.data
                             }
@@ -259,10 +258,8 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
                         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
+                        val correctNozzle = nozzles.find {
+                            it.pumpId == dc.pumpNo && it.logicId == dc.nozzleNo
                         }
                         correctNozzle?.let {
                             dc.nozzleNo = it.physicalId
@@ -354,15 +351,22 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
     /**
      * Proxy method to get pump and nozzle data.
      */
-    suspend fun getPumpInfo(): DFSResult<List<PumpInfo>> {
-        val resultPumpList = FuelInfoApi.requestPumpInfo()
-        if (resultPumpList.success && resultPumpList.data != null) {
+    suspend fun getPumpInfo(): DFSResult<List<NozzleInfo>> {
+        val resultNozzles = if (SPUtil.getBoolean(SPKeys.USE_FCC2)) {
+            FuelInfoApi.requestPumpInfoFromFCC2()
+        } else {
+            FuelInfoApi.requestPumpInfo()
+        }
+        if (resultNozzles.success && resultNozzles.data != null) {
             isFetchPumpInfo = true
-            if (pumpList.isNotEmpty()) pumpList.clear()
-            pumpList.addAll(resultPumpList.data)
+            if (nozzles.isNotEmpty()) nozzles.clear()
+            nozzles.addAll(resultNozzles.data)
+            nozzles.sortBy { it.physicalId }
+        } else {
+            isFetchPumpInfo = false
         }
 
-        return resultPumpList
+        return resultNozzles
     }
 
     private suspend fun login() = suspendCoroutine<Boolean> {

+ 1 - 0
app/src/main/java/com/doverfuelingsolutions/issp/utils/sp/SPKeys.kt

@@ -33,6 +33,7 @@ class SPKeys {
         val FUEL_PORT: String = StringUtil.get(R.string.sp_fuel_port)
 
         val ORDER_CHOOSE: String = StringUtil.get(R.string.sp_choose_order_way)
+        val USE_FCC2: String = StringUtil.get(R.string.sp_use_fcc_2)
 
         val FUEL_BARCODE: String = StringUtil.get(R.string.sp_fuel_barcode)
         val ORDER_UNSETTLED: String = StringUtil.get(R.string.sp_order_unsettled)

+ 2 - 0
app/src/main/java/com/doverfuelingsolutions/issp/utils/sp/SPUtil.kt

@@ -32,6 +32,8 @@ object SPUtil {
         }
     }
 
+    fun getBoolean(key: String, defaultValue: Boolean = false) = instance.getBoolean(key, defaultValue)
+
     private fun <T : Serializable> setObject(key: String, @NonNull obj: T) {
         ThreadUtil.io {
             try {

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

@@ -264,7 +264,7 @@ class MainActivity : AppCompatActivity(),
     private fun initFragmentEntry() {
         fragmentRouter.setHomeFragment(
             if (SPUtil.getString(SPKeys.ORDER_CHOOSE) == "nozzle") {
-                FragmentNozzle.build(FusionManager.pumpList)
+                FragmentNozzle.build()
             } else {
                 FragmentSelect()
             }

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

@@ -9,7 +9,6 @@ import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.GridLayoutManager
 import com.doverfuelingsolutions.issp.R
 import com.doverfuelingsolutions.issp.api.SystemApi
-import com.doverfuelingsolutions.issp.api.entity.PumpInfo
 import com.doverfuelingsolutions.issp.data.GlobalData
 import com.doverfuelingsolutions.issp.databinding.FragmentNozzleBinding
 import com.doverfuelingsolutions.issp.fusion.FusionManager
@@ -21,27 +20,17 @@ import com.scwang.smart.refresh.header.ClassicsHeader
 import kotlinx.coroutines.GlobalScope
 import kotlinx.coroutines.launch
 
-class FragmentNozzle private constructor(private val pumpList: List<PumpInfo>) : FragmentBasic() {
+class FragmentNozzle private constructor() : FragmentBasic() {
 
     companion object {
 
-        fun build(pumpList: List<PumpInfo>) = FragmentNozzle(pumpList)
+        fun build() = FragmentNozzle()
     }
 
     override val title = StringUtil.get(R.string.query_by_nozzle)
 
     private lateinit var binding: FragmentNozzleBinding
-    private val chooseList = pumpList.map {
-        it.nozzleList.joinToString(", ") { nozzleInfo ->
-            nozzleInfo.physicalId.toString()
-        }
-    }
-    private val chooseListAdapter: ChooseListAdapter by lazy {
-        ChooseListAdapter(
-            chooseList,
-            this::select
-        )
-    }
+    private val chooseListAdapter = ChooseListAdapter(FusionManager.nozzles.map { it.physicalId.toString() }, this::select)
 
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
         if (!this::binding.isInitialized) {
@@ -61,8 +50,6 @@ class FragmentNozzle private constructor(private val pumpList: List<PumpInfo>) :
         lifecycleScope.launchWhenStarted {
             val resultNozzles = FusionManager.getPumpInfo()
             if (resultNozzles.success && resultNozzles.data != null) {
-                if (FusionManager.pumpList.isNotEmpty()) FusionManager.pumpList.clear()
-                FusionManager.pumpList.addAll(resultNozzles.data)
                 binding.nozzleList.adapter?.notifyDataSetChanged()
                 binding.smartRefreshLayout.finishRefresh(200, true, false)
             } else {
@@ -71,7 +58,7 @@ class FragmentNozzle private constructor(private val pumpList: List<PumpInfo>) :
         }
     }
 
-    private fun select(nozzleList: String) {
+    private fun select(physicalId: String) {
         if (GlobalData.paymentId.get() == -1) {
             DFSToastUtil.fail(R.string.fail_get_pay_param_retry)
             GlobalScope.launch {
@@ -80,12 +67,8 @@ class FragmentNozzle private constructor(private val pumpList: List<PumpInfo>) :
             return
         }
 
-        pumpList.find {
-            it.nozzleList.joinToString(", ") { nozzleInfo ->
-                nozzleInfo.physicalId.toString()
-            } == nozzleList
-        }?.let {
-            (activity as MainActivity).fragmentRouter.push(FragmentOrderList.build(it.pumpId))
+        FusionManager.nozzles.find { it.physicalId.toString() == physicalId }?.let {
+            (requireActivity() as MainActivity).fragmentRouter.push(FragmentOrderList.build(it.pumpId))
         }
     }
 }

+ 4 - 3
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentOrderList.kt

@@ -42,7 +42,7 @@ class FragmentOrderList private constructor(private val pumpId: Int) : FragmentB
     private var selectedPosition: Int? = null
 
     private var selectedName = ""
-    private val oilNameList = FusionManager.pumpList.map { it.productName }.filter { it.isNotBlank() }
+    private val oilNameList = FusionManager.nozzles.map { it.barcodeName }.toSet().toList()
     private val chooseListAdapter = ChooseListAdapter(oilNameList, this::selectOilName, true)
 
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -135,8 +135,9 @@ class FragmentOrderList private constructor(private val pumpId: Int) : FragmentB
             // local cache
             if (orderList.isNotEmpty()) orderList.clear()
             if (pumpId == -1) {
-                val allPumpOrderList = FusionManager.pumpList.map {
-                    SPUtil.getOrderListByPump(it.pumpId)
+                val allPumps = FusionManager.nozzles.map { it.pumpId }.toSet().toList()
+                val allPumpOrderList = allPumps.map {
+                    SPUtil.getOrderListByPump(it)
                 }
                 val sum = allPumpOrderList.reduce { acc, list ->
                     acc.addAll(list)

+ 23 - 9
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentPayType.kt

@@ -13,6 +13,8 @@ import com.doverfuelingsolutions.issp.databinding.FragmentPayTypeBinding
 import com.doverfuelingsolutions.issp.fusion.FusionManager
 import com.doverfuelingsolutions.issp.utils.DFSToastUtil
 import com.doverfuelingsolutions.issp.utils.StringUtil
+import com.doverfuelingsolutions.issp.utils.log.DFSLog
+import com.doverfuelingsolutions.issp.utils.sp.SPKeys
 import com.doverfuelingsolutions.issp.utils.sp.SPUtil
 import com.doverfuelingsolutions.issp.view.MainActivity
 import com.wayne.www.waynelib.fdc.message.DeviceClass
@@ -54,7 +56,11 @@ class FragmentPayType private constructor(private val dc: DeviceClass): Fragment
 
         lifecycleScope.launchWhenStarted {
             // 累计数信息
-            val resultAccumulationInfo = FuelInfoApi.accumulationInfo(dc)
+            val resultAccumulationInfo = if (SPUtil.getBoolean(SPKeys.USE_FCC2)) {
+                FuelInfoApi.accumulationInfoFromFCC2(dc)
+            } else {
+                FuelInfoApi.accumulationInfo(dc)
+            }
             if (resultAccumulationInfo.success && resultAccumulationInfo.data != null) {
                 dc.amountTotalizer = BigDecimal(resultAccumulationInfo.data.AmountTotalizer)
                 dc.volumeTotalizer = BigDecimal(resultAccumulationInfo.data.VolumeTotalizer)
@@ -66,19 +72,27 @@ class FragmentPayType private constructor(private val dc: DeviceClass): Fragment
                 return@launchWhenStarted
             }
 
-            // 查询最新的油品ID(非BarcodeId)
-            val resultBarcodeInfo = SystemApi.barcodeName(dc.productNo1.toInt())
-            if (!resultBarcodeInfo.success || resultBarcodeInfo.data == null) {
-                dialog.dismiss()
-                // (requireActivity() as MainActivity).fragmentRouter.resumeFragmentToolbarTimer()
-                DFSToastUtil.fail("查询油品posItemUniqueId失败")
-                return@launchWhenStarted
+            // 查询油品 posItemUniqueId
+            // 枪数据中有缓存 posItemUniqueId
+            val nozzle = FusionManager.nozzles.find { it.physicalId == dc.nozzleNo }
+            var posItemUniqueId = nozzle?.posItemUniqueId
+            if (posItemUniqueId.isNullOrEmpty()) {
+                val barcodeId = nozzle?.barcodeId ?: dc.productNo1.toInt()
+                val resultBarcodeInfo = SystemApi.barcodeName(barcodeId)
+                if (!resultBarcodeInfo.success || resultBarcodeInfo.data == null) {
+                    dialog.dismiss()
+                    // (requireActivity() as MainActivity).fragmentRouter.resumeFragmentToolbarTimer()
+                    DFSToastUtil.fail("查询油品 posItemUniqueId 失败")
+                    return@launchWhenStarted
+                }
+                posItemUniqueId = resultBarcodeInfo.data.Id
+                DFSLog.w("barcodeId:$barcodeId")
             }
 
             // 获取云订单(本地需要缓存,避免重复生成订单)
             var posTrx: PosTrx? = SPUtil.findWayneOrder(dc)
             if (posTrx == null) {
-                val resultReportPayment = SystemApi.generateOrder(dc, resultBarcodeInfo.data.Id)
+                val resultReportPayment = SystemApi.generateOrder(dc, posItemUniqueId)
                 if (resultReportPayment.success && resultReportPayment.data != null && !resultReportPayment.data.id.isNullOrEmpty()) {
                     posTrx = resultReportPayment.data
                     SPUtil.addWayneOrder(dc, posTrx)

+ 1 - 1
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentSelect.kt

@@ -53,7 +53,7 @@ class FragmentSelect : FragmentBasic(),
 
         when (v) {
             binding.chooseNozzle -> {
-                (activity as MainActivity).fragmentRouter.push(FragmentNozzle.build(FusionManager.pumpList))
+                (activity as MainActivity).fragmentRouter.push(FragmentNozzle.build())
             }
             binding.chooseOil -> {
                 (activity as MainActivity).fragmentRouter.push(FragmentOrderList.build(-1))

+ 1 - 0
app/src/main/res/values/keys.xml

@@ -30,4 +30,5 @@
     <string name="sp_payment_name">payment_name</string>
 
     <string name="sp_choose_order_way">choose_order_way</string>
+    <string name="sp_use_fcc_2">use_fcc_2</string>
 </resources>

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -78,6 +78,7 @@
     <string name="not_set">未设置</string>
     <string name="preference_settings">偏好设置</string>
     <string name="order_choose_way">订单查询方式</string>
+    <string name="use_fcc_2">使用FCC2.0版本</string>
 
     <string name="select_search">请选择加油支付</string>
     <string name="select_oil">选择油品</string>

+ 5 - 1
app/src/main/res/xml/root_preferences.xml

@@ -86,7 +86,6 @@
     </PreferenceCategory>
 
     <PreferenceCategory app:title="@string/preference_settings">
-
         <ListPreference
             android:entries="@array/order_choose_names"
             android:entryValues="@array/order_choose_values"
@@ -94,5 +93,10 @@
             app:key="@string/sp_choose_order_way"
             app:title="@string/order_choose_way"
             app:useSimpleSummaryProvider="true" />
+
+        <SwitchPreference
+            android:defaultValue="false"
+            android:key="@string/sp_use_fcc_2"
+            android:title="@string/use_fcc_2" />
     </PreferenceCategory>
 </PreferenceScreen>