浏览代码

修复锁单问题,优化订单页面显示

Zheng 3 年之前
父节点
当前提交
89a8032314

+ 2 - 2
app/build.gradle

@@ -21,8 +21,8 @@ android {
         applicationId "com.doverfuelingsolutions.issp"
         minSdkVersion 22
         targetSdkVersion 26
-        versionCode 7
-        versionName "1.1.21"
+        versionCode 9
+        versionName "1.1.22"
         archivesBaseName = versionName + "." + getTime()
 
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

+ 1 - 1
app/src/main/java/com/doverfuelingsolutions/issp/data/GlobalData.kt

@@ -27,7 +27,7 @@ object GlobalData {
     val paymentId = GlobalDataProvider(-1, SPKeys.PAYMENT_ID)
     val paymentName = GlobalDataProvider("", SPKeys.PAYMENT_NAME)
 
-    val colorForSignOrder = arrayListOf<Int>() //用于记录油枪是否有订单,有:深色;无:浅色
+    val colorForSignOrder = hashMapOf<String,Boolean>() //用于记录油枪是否有订单,有:深色;无:浅色
     fun init() {
         accessTokenExpire.get().let {
             DFSLog.i(if (it > 0) {

+ 43 - 41
app/src/main/java/com/doverfuelingsolutions/issp/fusion/FusionManager.kt

@@ -15,6 +15,8 @@ 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.utils.thread.ThreadUtil
+import com.doverfuelingsolutions.issp.view.fragment.callback.RefreshNozzle
+import com.doverfuelingsolutions.issp.view.fragment.callback.RefreshOrder
 import com.wayne.www.waynelib.fdc.FdcClient
 import com.wayne.www.waynelib.fdc.OnFdcClientStateChangedListener
 import com.wayne.www.waynelib.fdc.OnFdcMessageReceivedListener
@@ -24,7 +26,6 @@ import com.wayne.www.waynelib.util.HsLogTagFlag
 import com.wayne.www.waynelib.util.HsLogUtils
 import kotlinx.coroutines.*
 import java.util.*
-import kotlin.collections.ArrayList
 import kotlin.coroutines.resume
 import kotlin.coroutines.suspendCoroutine
 import kotlin.math.min
@@ -49,6 +50,8 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
     private var jobRestart: Job? = null
 
     var onFusionStatus: OnFusionStatus? = null
+    var onRefreshNozzleUi: RefreshNozzle? = null
+    var onRefreshOrderUi: RefreshOrder? = null
 
     override fun onFdcClientStateChanged(sender: FdcClient?, state: FdcClient.FdcClientState?) {
         DFSLog.d("Fusion state changed: ${state?.name?.toLowerCase(Locale.CHINESE)}")
@@ -141,48 +144,35 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
             if (null != dc.state) {
                 when (dc.state) {
                     "Payable" -> {  // 新的订单,可以支付
-//                        if (f.isHaveNoPayOrderDetailAndChange(
-//                                dc.pumpNo,
-//                                dc.transactionSeqNo,
-//                                dc.state
-//                            )
-//                        ) return  //代表已经有该订单了
-//                        f.addNewAvailableFuelSaleTrxs(dc)
-
-                        updateLocalOrder(dc)
                         //将订单页面增加此可支付订单
+                        onRefreshNozzleUi?.onRefreshNozzleUi(dc.pumpNo,true)
+                        onRefreshOrderUi?.onRefreshOrderUi(dc.pumpNo)
 
                     }
                     "Cleared" -> if (null != dc.pumpNo && null != dc.transactionSeqNo) { //需要消除的单(一般是已经支付过了,或本机支付的,或其他设备支付的)
-//                        HsSpUtils.removeUnLockSuccessOrder(dc)
-//                        HsSpUtils.removePayOrderDatas(dc)
-//                        HsSpUtils.removeLocalPumpNoPayOrder(dc.pumpNo, dc.transactionSeqNo)
-//                        HsSpUtils.removeLocalProductNoPayOrder(dc.productNo1, dc.transactionSeqNo)
-//                        BaseEventBusUtils.post(DcDetailEvent(true, dc)) //主要通知如果处于订单界面移除
-//                        BaseEventBusUtils.post(DcToOilEvent(true, dc)) //油品选择
-
+//                        val sourceOrder = SPUtil.getOrderListByPump(dc.pumpNo)
+//                        if (sourceOrder.isNotEmpty()){
+//                            sourceOrder.remove(sourceOrder.find { it.pumpNo == dc.pumpNo && it.transactionSeqNo == dc. transactionSeqNo})
+//                            SPUtil.setOrderListByPump(dc.pumpNo,sourceOrder)
+//
+//                            if (sourceOrder.isEmpty()) {
+//                                onRefreshNozzleUi?.onRefreshNozzleUi(dc.pumpNo,false)   //枪页面显示浅色
+//                            }
+//                        }
                         SPUtil.removeLockOrder(dc)
                         SPUtil.removeUnclearedOrder(dc)
                         SPUtil.removeWayneOrder(dc)
+
+
                         //将订单页面减去此需消除订单
+                        onRefreshNozzleUi?.onRefreshNozzleUi(dc.pumpNo,false)   //枪页面显示浅色
+                        onRefreshOrderUi?.onRefreshOrderUi(dc.pumpNo)
+
                     }
                     "Locked" -> if (null != dc.pumpNo && null != dc.transactionSeqNo) { // 锁单(被某一设备正在支付),或本机锁,或其他设备锁
-//                            DeviceClass lastLockOrder = HsSpUtils.getLastLockOrder();
-//                            if (null != lastLockOrder) {
-//                                if (lastLockOrder.isThis(dc)) {
-//                                    //当前订单在此台设备做支付时无需处理锁定操作
-//                                    HsSpUtils.saveLastLockOrder(null);//移掉(如果他只发一次过来的话肯定没问题)
-//                                    return;
-//                                }
-//                            }
-//                        f.isHaveNoPayOrderDetailAndChange(dc.pumpNo, dc.transactionSeqNo, dc.state)
 
-                        if (!SPUtil.isLockByThis(dc)) {  // 若是其他设备的锁单,更新这边订单的锁单情况
-                            val pumpSourceOrder = SPUtil.getOrderListByPump(dc.pumpNo)
-                            pumpSourceOrder.forEach{
-                                
-                            }
-                        }
+                        onRefreshOrderUi?.onRefreshOrderUi(dc.pumpNo)
+
                     }
                 }
             }
@@ -198,6 +188,8 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
             if (it.transactionSeqNo.equals(dc.transactionSeqNo)) { //存在更新数据
                 isExist = true
                 it.state = dc.state
+                it.releaseTokenAttribute = dc.releaseTokenAttribute
+                it.releaseTokenElement = dc.releaseTokenElement
             }
         }
         if (!isExist) pumpSourceOrder.add(dc) //不存在添加
@@ -293,16 +285,26 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
                         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 =
-                                    nozzles.find { n -> n.pumpId == it.data?.pumpNo && it.data.nozzleNo == n.physicalId }?.barcodeName
-                                        ?: ""
-                                it.data
+//                        val resultDetailList = unsettledList
+//                            .map { dc -> async { getOrderDetail(dc) } }
+//                            .map { deferred -> deferred.await() }
+//                            .filter { it.success }
+//                            .mapNotNull {
+//                                it.data?.productName =
+//                                    nozzles.find { n -> n.pumpId == it.data?.pumpNo && it.data.nozzleNo == n.physicalId }?.barcodeName
+//                                        ?: ""
+//                                it.data
+//                            }
+                        val resultDetailList = arrayListOf<DeviceClass>()
+                        unsettledList.forEach {
+                            val detail = getOrderDetail(it)
+                            if(detail.success) {
+                                detail.data?.productName =
+                                    nozzles.find { n -> n.pumpId == detail.data?.pumpNo && detail.data.nozzleNo == n.physicalId }?.barcodeName
+                                        ?:""
+                                detail.data?.let { it1 -> resultDetailList.add(it1) }
                             }
+                        }
                         val time3 = System.currentTimeMillis()
                         DFSLog.v("fetch uncleared orders detail cost ${time3 - time2}ms")
                         it.resume(DFSResult.success(resultDetailList))

+ 20 - 3
app/src/main/java/com/doverfuelingsolutions/issp/view/adapter/ChooseListAdapter.kt

@@ -6,11 +6,12 @@ import androidx.core.content.res.ResourcesCompat
 import androidx.recyclerview.widget.RecyclerView
 import com.doverfuelingsolutions.issp.DFSApplication
 import com.doverfuelingsolutions.issp.R
+import com.doverfuelingsolutions.issp.fusion.FusionManager
 import kotlinx.android.synthetic.main.adapter_choose_item.view.*
 
 class ChooseListAdapter(private val chooseList: List<String>, private val handler: (item: String) -> Unit,
                         private val chooseEffect: Boolean = false,
-                        private val signOrderList: ArrayList<Int> = arrayListOf()) :
+                        private var signOrderList: HashMap<String,Boolean> = hashMapOf()) :
     RecyclerView.Adapter<ChooseListAdapter.ChooseViewHolder>() {
 
     private var selectedIndex = 0
@@ -34,10 +35,20 @@ class ChooseListAdapter(private val chooseList: List<String>, private val handle
         }
 
         //油枪选择页面中,有订单的油枪深色显示
-        if (signOrderList.size > position) {
-            holder.itemView.chooseItemView.setBackgroundColor(signOrderList[position])
+        val pumpId = FusionManager.nozzles.find { it.physicalId.toString() == chooseList[position] }?.pumpId
+        val color: Boolean = signOrderList[pumpId.toString()] == true
+        if (color) {
+            holder.itemView.chooseItemView.setBackgroundColor(
+                ResourcesCompat.getColor(DFSApplication.instance.applicationContext.resources, R.color.colorPrimary, null)
+            )
+        } else {
+            holder.itemView.chooseItemView.setBackgroundColor(
+                ResourcesCompat.getColor(DFSApplication.instance.applicationContext.resources, R.color.colorPrimaryTransparent, null)
+            )
         }
 
+
+
         holder.itemView.chooseItemView.setOnClickListener {
             if (chooseEffect) {
                 selectedIndex = position
@@ -49,5 +60,11 @@ class ChooseListAdapter(private val chooseList: List<String>, private val handle
 
     override fun getItemCount(): Int = chooseList.size
 
+    fun setSignColor(map: HashMap<String,Boolean>){
+        this.signOrderList.clear()
+        this.signOrderList = map
+        notifyDataSetChanged()
+    }
+
     class ChooseViewHolder(view: View) : RecyclerView.ViewHolder(view)
 }

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

@@ -4,12 +4,9 @@ import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
-import androidx.appcompat.app.AlertDialog
-import androidx.core.content.res.ResourcesCompat
 import androidx.databinding.DataBindingUtil
 import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.GridLayoutManager
-import com.doverfuelingsolutions.issp.DFSApplication
 import com.doverfuelingsolutions.issp.R
 import com.doverfuelingsolutions.issp.api.SystemApi
 import com.doverfuelingsolutions.issp.data.GlobalData
@@ -17,31 +14,38 @@ import com.doverfuelingsolutions.issp.databinding.FragmentNozzleBinding
 import com.doverfuelingsolutions.issp.fusion.FusionManager
 import com.doverfuelingsolutions.issp.utils.DFSToastUtil
 import com.doverfuelingsolutions.issp.utils.StringUtil
+import com.doverfuelingsolutions.issp.utils.sp.SPUtil
 import com.doverfuelingsolutions.issp.view.MainActivity
 import com.doverfuelingsolutions.issp.view.adapter.ChooseListAdapter
-import com.hjq.toast.ToastUtils
+import com.doverfuelingsolutions.issp.view.fragment.callback.RefreshNozzle
 import com.scwang.smart.refresh.header.ClassicsHeader
 import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.async
 import kotlinx.coroutines.launch
 
-class FragmentNozzle private constructor() : FragmentBasic(){
+class FragmentNozzle private constructor() : FragmentBasic(),RefreshNozzle{
 
     companion object {
 
         fun build() = FragmentNozzle()
+
     }
 
+
+
     override val title = StringUtil.get(R.string.query_by_nozzle)
 
 //    private val colorForSignOrder = arrayListOf<Int>() // 用于标记该油枪是否有订单,有:深色 ; 无:浅色
 
     private lateinit var binding: FragmentNozzleBinding
+    private val isExistOrderMap = hashMapOf<String,Boolean>()
     private val chooseListAdapter = ChooseListAdapter(FusionManager.nozzles.map { it.physicalId.toString() },
-        this::select,signOrderList = GlobalData.colorForSignOrder)
+        this::select,signOrderList = isExistOrderMap)
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
+        FusionManager.onRefreshNozzleUi = this
         loadListData()
     }
 
@@ -56,9 +60,6 @@ class FragmentNozzle private constructor() : FragmentBasic(){
             binding.smartRefreshLayout.setRefreshHeader(ClassicsHeader(context))
             binding.smartRefreshLayout.setOnRefreshListener { handleNozzleRefresh() }
         }
-        //刷新页面,因为可能支付完成功后某一把枪没订单了,该枪颜色应变浅色
-        loadListData()
-        chooseListAdapter.notifyDataSetChanged()
         return binding.root
     }
 
@@ -102,23 +103,30 @@ class FragmentNozzle private constructor() : FragmentBasic(){
     }
 
     private suspend fun loadRemoteData() {
-        val colors = arrayListOf<Int>()
         FusionManager.nozzles.forEach {
             val result = FusionManager.getAllUnsettledOrder(it.pumpId)
-            if (result.success && result.data != null && result.data.isNotEmpty()) {
-                colors.add(ResourcesCompat.getColor(DFSApplication.instance.applicationContext.resources, R.color.colorPrimary, null))
-            } else {
-                colors.add(ResourcesCompat.getColor(DFSApplication.instance.applicationContext.resources, R.color.colorPrimaryTransparent, null))
-            }
+            isExistOrderMap[it.pumpId.toString()] = result.success && result.data != null && result.data.isNotEmpty()
         }
 
+        chooseListAdapter.notifyDataSetChanged()
+    }
 
-        GlobalData.colorForSignOrder.clear()
-        GlobalData.colorForSignOrder.addAll(colors)
+    override fun onRefreshNozzleUi(pump: Int,isExist: Boolean) {
+        lifecycleScope.launchWhenStarted {
+            if (isExist) {
+                isExistOrderMap[pump.toString()] = isExist
+            } else {  // false 表示有消单,还需检测是否此 pump 已无订单
+                val result = FusionManager.getAllUnsettledOrder(pump)
+                isExistOrderMap[pump.toString()] = result.success && result.data != null && result.data.isNotEmpty()
+            }
+            chooseListAdapter.notifyDataSetChanged()
 
-        chooseListAdapter.notifyDataSetChanged()
+//            isExistOrderMap[pump.toString()] = isExist
+//            chooseListAdapter.notifyDataSetChanged()
+        }
     }
 
+
     /*
     private fun unsettledList(): ArrayList<Int>{
         ToastUtils.show(R.string.in_get_nozzle)

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

@@ -20,10 +20,13 @@ import com.doverfuelingsolutions.issp.utils.sp.SPUtil
 import com.doverfuelingsolutions.issp.view.MainActivity
 import com.doverfuelingsolutions.issp.view.adapter.ChooseListAdapter
 import com.doverfuelingsolutions.issp.view.adapter.OrderListAdapter
+import com.doverfuelingsolutions.issp.view.fragment.callback.RefreshOrder
 import com.scwang.smart.refresh.header.ClassicsHeader
 import com.wayne.www.waynelib.fdc.message.DeviceClass
+import kotlinx.coroutines.async
+import kotlinx.coroutines.launch
 
-class FragmentOrderList private constructor() : FragmentBasic() {
+class FragmentOrderList private constructor() : FragmentBasic(),RefreshOrder {
 
     companion object {
         fun build(pumpId: Int): FragmentOrderList {
@@ -58,6 +61,7 @@ class FragmentOrderList private constructor() : FragmentBasic() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
+        FusionManager.onRefreshOrderUi = this
         pumpId = arguments?.getInt("pumpId") ?: -1
         loadListData()
     }
@@ -144,7 +148,7 @@ class FragmentOrderList private constructor() : FragmentBasic() {
             binding.orderListView.scrollTo(0, 0)
 
             // local cache
-            if (orderList.isNotEmpty()) orderList.clear()
+            orderList.clear()
             if (pumpId == -1) {
                 val allPumps = FusionManager.nozzles.map { it.pumpId }.toSet().toList()
                 val allPumpOrderList = allPumps.map {
@@ -181,7 +185,7 @@ class FragmentOrderList private constructor() : FragmentBasic() {
                 DFSToastUtil.info(R.string.no_unpaid_order)
                 back()
             } else {
-                if (orderList.isNotEmpty()) orderList.clear()
+                orderList.clear()
                 orderList.addAll(result.data)
                 filterOrderListByOilName()
                 orderListAdapter.notifyDataSetChanged()
@@ -198,4 +202,18 @@ class FragmentOrderList private constructor() : FragmentBasic() {
         val pump = MutableLiveData(-1)
         val isNozzle = MutableLiveData(true)
     }
+
+    override fun onRefreshOrderUi(pump: Int) {
+        lifecycleScope.launchWhenStarted {
+            loadRemoteData()
+        }
+
+
+//            val localOrder = SPUtil.getOrderListByPump(pumpId)
+//            orderList.clear()
+//            orderList.addAll(localOrder)
+//            filterOrderListByOilName()
+//            orderListAdapter.notifyDataSetChanged()
+
+    }
 }

+ 19 - 19
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentPayScanCode.kt

@@ -130,25 +130,25 @@ class FragmentPayScanCode private constructor() : FragmentBasic() {
 
                 }
 
-                //查找该 pumpIP 是否还有订单,更新 GlobalData.colorForSignOrder
-                val unsettledResult = FusionManager.getAllUnsettledOrder(dc.pumpNo)
-                val copyList = IntArray(GlobalData.colorForSignOrder.size)
-                GlobalData.colorForSignOrder.forEachIndexed { index, i ->
-                    copyList[index] = i
-                }
-                if (unsettledResult.success && unsettledResult.data != null && unsettledResult.data.isEmpty()) { //若为空
-
-                    /**   eg:
-                     * pumpID:                                    | 1 | 4 | 2 | 3 |
-                     * SiteLevelNozzleId / nozzleNo / physicalId:| 1 | 2 | 3 | 4 |
-                     * 下标:                                     | 0 | 1 | 2 | 3 |
-                     * */
-                    copyList[dc.nozzleNo - 1] = ResourcesCompat.getColor(  //colorForSignOrder对应的颜色顺序会与油枪列表的顺序对应
-                        DFSApplication.instance.applicationContext.resources, R.color.colorPrimaryTransparent, null)
-
-                }
-                GlobalData.colorForSignOrder.clear()
-                GlobalData.colorForSignOrder.addAll(copyList.toList())
+//                //查找该 pumpIP 是否还有订单,更新 GlobalData.colorForSignOrder
+//                val unsettledResult = FusionManager.getAllUnsettledOrder(dc.pumpNo)
+//                val copyList = IntArray(GlobalData.colorForSignOrder.size)
+//                GlobalData.colorForSignOrder.forEachIndexed { index, i ->
+//                    copyList[index] = i
+//                }
+//                if (unsettledResult.success && unsettledResult.data != null && unsettledResult.data.isEmpty()) { //若为空
+//
+//                    /**   eg:
+//                     * pumpID:                                    | 1 | 4 | 2 | 3 |
+//                     * SiteLevelNozzleId / nozzleNo / physicalId:| 1 | 2 | 3 | 4 |
+//                     * 下标:                                     | 0 | 1 | 2 | 3 |
+//                     * */
+//                    copyList[dc.nozzleNo - 1] = ResourcesCompat.getColor(  //colorForSignOrder对应的颜色顺序会与油枪列表的顺序对应
+//                        DFSApplication.instance.applicationContext.resources, R.color.colorPrimaryTransparent, null)
+//
+//                }
+//                GlobalData.colorForSignOrder.clear()
+//                GlobalData.colorForSignOrder.addAll(copyList.toList())
 
                 // 获取加油员名称
                 val resultInfo = SystemApi.getPosTicketInfo(posTrx.id)

+ 6 - 0
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/callback/RefreshNozzle.kt

@@ -0,0 +1,6 @@
+package com.doverfuelingsolutions.issp.view.fragment.callback
+
+interface RefreshNozzle {
+    fun onRefreshNozzleUi(pump: Int,isExist: Boolean)
+
+}

+ 7 - 0
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/callback/RefreshOrder.kt

@@ -0,0 +1,7 @@
+package com.doverfuelingsolutions.issp.view.fragment.callback
+
+import com.wayne.www.waynelib.fdc.model.Pump
+
+interface RefreshOrder {
+    fun onRefreshOrderUi(pump: Int)
+}