瀏覽代碼

完善钥匙、锁具数量检查

Frankensteinly 11 月之前
父節點
當前提交
6e7ab6b16a

+ 10 - 13
app/src/main/java/com/grkj/iscs/BusinessManager.kt

@@ -214,27 +214,24 @@ object BusinessManager {
      * 检查钥匙和锁具数量
      *
      * @param needLockCount 需要的锁具的数量(可能在别的机柜取过)
-     *
-     * @return 返回能提供的锁具和钥匙的数量 Pair<锁具数量,钥匙数量>
      */
-    fun checkEquipCount(needLockCount: Int): Pair<Int, Int> {
+    fun checkEquipCount(needLockCount: Int, callBack: (String?, MutableMap<Byte, MutableList<String>>) -> Unit) {
         var lockCount = 0
-        var keyCount = 0
-        val lockDockList = ModBusController.dockList.filter { it.type == DOCK_TYPE_LOCK || it.type == DOCK_TYPE_PORTABLE }
-        val keyDockList = ModBusController.dockList.filter { it.type == DOCK_TYPE_KEY || it.type == DOCK_TYPE_PORTABLE }
-        lockDockList.forEach {
-            lockCount += it.getLockList().size
-        }
-        keyDockList.forEach {
-            keyCount += it.getKeyList().size
+        val lockMap = ModBusController.getLocks(needLockCount)
+        lockMap.forEach { (_, rfidList) ->
+            lockCount += rfidList.size
         }
+        
+        val keyNfc = ModBusController.getOneKey()
+
         var tipStr = ""
         if (lockCount < needLockCount) {
             val msg = MyApplication.instance!!.applicationContext.resources.getString(R.string.lock_is_not_enough)
             LogUtil.w(msg)
             tipStr = msg
         }
-        if (keyCount == 0) {
+
+        if (keyNfc == null) {
             val msg = MyApplication.instance!!.applicationContext.resources.getString(R.string.key_is_not_enough)
             LogUtil.w(msg)
             tipStr = if (tipStr.isEmpty()) {
@@ -246,7 +243,7 @@ object BusinessManager {
         if (tipStr.isNotEmpty()) {
             ToastUtils.tip(tipStr)
         }
-        return Pair(lockCount, keyCount)
+        callBack.invoke(keyNfc, lockMap)
     }
 
     /**

+ 21 - 15
app/src/main/java/com/grkj/iscs/modbus/ModBusController.kt

@@ -449,11 +449,11 @@ object ModBusController {
     }
 
     /**
-     * 打开一个钥匙卡扣(基于钥匙柜和便携柜不存在接一起的情况)
+     * 获取一个钥匙(基于钥匙柜和便携柜不存在接一起的情况)
      *
-     * @return 打开的钥匙RFID
+     * @return 获取的钥匙RFID,如果数量不足,返回null
      */
-    fun openOneKeyBuckle(): String? {
+    fun getOneKey(): String? {
         val keyDockList = dockList.filter { it.type == DOCK_TYPE_KEY || it.type == DOCK_TYPE_PORTABLE }
         val keyList = keyDockList.flatMap { it.getKeyList() }.filter { it.isExist }
         if (keyList.isEmpty()) {
@@ -464,22 +464,28 @@ object ModBusController {
     }
 
     /**
-     * 根据数量打开锁具卡扣(基于锁柜和便携柜不存在接一起的情况)
+     * 根据数量获取锁具(基于锁柜和便携柜不存在接一起的情况)
      *
-     * @param lockCount 需要打开的锁具数量
+     * @param needLockCount 需要打开的锁具数量
      *
-     * @return 打开的锁具RFID列表
+     * @return key: dock地址,value: 锁具RFID列表
      */
-    fun openLockBuckle(lockCount: Int): MutableList<String> {
+    fun getLocks(needLockCount: Int): MutableMap<Byte, MutableList<String>> {
+        val map = mutableMapOf<Byte, MutableList<String>>()
         val lockDockList = dockList.filter { it.type == DOCK_TYPE_LOCK || it.type == DOCK_TYPE_PORTABLE }
-        val lockList = lockDockList.flatMap { it.getLockList() }.filter { it.isExist }
-        if (lockList.size < lockCount) {
-            ToastUtils.tip(R.string.lock_is_not_enough)
-        }
-        val rfidList = mutableListOf<String>()
-        for (i in 0 until lockCount.coerceAtMost(lockList.size)) {
-            lockList[i].rfid?.let { rfidList.add(it) }
+
+        var provideCount = 0
+        lockDockList.forEach loop@ { lockDock ->
+            val lockList = lockDock.getLockList().filter { it.isExist }
+            if (lockList.size < (needLockCount - provideCount)) {
+                provideCount += lockList.size
+                map[lockDock.addr] = lockList.mapNotNull { it.rfid }.toMutableList()
+            } else {
+                val rfidList = lockList.subList(0, needLockCount - provideCount).mapNotNull { it.rfid }.toMutableList()
+                map[lockDock.addr] = rfidList
+                return@loop
+            }
         }
-        return rfidList
+        return map
     }
 }