소스 검색

重新整理钥匙工作票下发和获取流程

Frankensteinly 11 달 전
부모
커밋
db3d86363c

+ 101 - 44
app/src/main/java/com/grkj/iscs/BusinessManager.kt

@@ -25,6 +25,7 @@ import com.grkj.iscs.extentions.toByteArray
 import com.grkj.iscs.extentions.toHexStrings
 import com.grkj.iscs.modbus.DockBean
 import com.grkj.iscs.modbus.ModBusController
+import com.grkj.iscs.model.Constants
 import com.grkj.iscs.model.Constants.PERMISSION_REQUEST_CODE
 import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_CARD
 import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_FINGERPRINT
@@ -233,9 +234,6 @@ object BusinessManager {
         }
     }
 
-
-    /****************************************** 蓝牙 ******************************************/
-
     /**
      * 检查钥匙和锁具数量
      *
@@ -272,18 +270,23 @@ object BusinessManager {
         callBack.invoke(if (lockCount < needLockCount) null else key, lockMap)
     }
 
-    /**
-     * 下发工作票
-     */
-    fun sendTicketBusiness(mac: String, activity: AppCompatActivity, loadingCallBack: (Boolean, String?) -> Unit) {
-        isSendTicket = true
+
+    /****************************************** 蓝牙 ******************************************/
+    /******************************************蓝牙通用准备******************************************/
+
+    private fun prepareBle(
+        mac: String,
+        activity: AppCompatActivity,
+        loadingCallBack: (Boolean, String?) -> Unit,
+        prepareDoneCallBack: (Boolean, BleBean?) -> Unit
+    ) {
         CommonUtils.checkBlePermission(activity) {
-            doScanBle(mac, loadingCallBack)
+            doScanBle(mac, loadingCallBack, prepareDoneCallBack)
         }
     }
 
     @AfterPermissionGranted(PERMISSION_REQUEST_CODE)
-    fun doScanBle(mac: String, loadingCallBack: (Boolean, String?) -> Unit) {
+    fun doScanBle(mac: String, loadingCallBack: (Boolean, String?) -> Unit, prepareDoneCallBack: (Boolean, BleBean?) -> Unit) {
         LogUtil.d("扫描开始:$mac")
         loadingCallBack(true, "正在扫描设备...")
         BleUtil.instance?.scan(object : CustomBleScanCallback() {
@@ -318,13 +321,20 @@ object BusinessManager {
                     return
                 }
                 BleUtil.instance?.getBleDeviceByMac(mac)?.bleDevice?.let {
-                    doConnect(it, loadingCallBack)
+                    doConnect(it, loadingCallBack, prepareDoneCallBack)
                 }
             }
         })
     }
 
-    fun doConnect(bleDevice: BleDevice, loadingCallBack: (Boolean, String?) -> Unit) {
+    /**
+     * 连接蓝牙设备
+     */
+    fun doConnect(
+        bleDevice: BleDevice,
+        loadingCallBack: (Boolean, String?) -> Unit,
+        prepareDoneCallBack: (Boolean, BleBean?) -> Unit
+    ) {
         loadingCallBack.invoke(true, CommonUtils.getStr(R.string.ble_connecting))
         BleManager.getInstance().disconnect(bleDevice)
         BleUtil.instance?.connectBySelect(bleDevice,
@@ -337,6 +347,7 @@ object BusinessManager {
 
                 override fun onConnectFail(bleDevice: BleDevice?, exception: BleException?) {
                     loadingCallBack.invoke(false, CommonUtils.getStr(R.string.ble_connect_fail))
+                    prepareDoneCallBack.invoke(false, null)
                 }
 
                 override fun onConnectSuccess(bleDevice: BleDevice?, gatt: BluetoothGatt?, status: Int) {
@@ -352,7 +363,7 @@ object BusinessManager {
                         }
                         // 监听
                         Executor.delayOnMain(500) {
-                            indicate(bleBean, loadingCallBack)
+                            indicate(bleBean, loadingCallBack, prepareDoneCallBack)
                         }
                     }
                 }
@@ -367,7 +378,14 @@ object BusinessManager {
             })
     }
 
-    fun indicate(bleBean: BleBean?, loadingCallBack: (Boolean, String?) -> Unit) {
+    /**
+     * 监听蓝牙设备
+     */
+    private fun indicate(
+        bleBean: BleBean?,
+        loadingCallBack: (Boolean, String?) -> Unit,
+        prepareDoneCallBack: (Boolean, BleBean?) -> Unit
+    ) {
         loadingCallBack.invoke(true, "开始监听...")
         bleBean?.let {
             BleUtil.instance?.indicate(it.bleDevice, indicateCallback = object : CustomBleIndicateCallback() {
@@ -387,15 +405,14 @@ object BusinessManager {
                     LogUtil.i("监听成功")
 //                    val testStr = "{\"cardNo\":\"80A8C0F4EA\",\"password\":\"12345678\",\"effectiveTime\":24,\"data\":[{\"taskCode\":\"202401020001\",\"taskId\":\"71b49baa49b343bc84d7e6b829ac1bdc\",\"codeId\":1,\"dataList\":[{\"dataId\":1,\"equipRfidNo\":\"049648B2E31690\",\"infoRfidNo\":\"04E3BCCA201290\",\"target\":1},{\"dataId\":2,\"equipRfidNo\":\"0405982414C563\",\"target\":0,\"prevId\":1}]},{\"taskCode\":\"202401020002\",\"taskId\":\"145b5a4cc38c41e19943f4c8b48d12b0\",\"codeId\":2,\"dataList\":[{\"dataId\":1,\"equipRfidNo\":\"045460F7F4F438\",\"infoRfidNo\":\"04BC6584C65009\",\"target\":1},{\"dataId\":2,\"equipRfidNo\":\"042B99E449E795\",\"target\":0,\"prevId\":1},{\"dataId\":3,\"equipRfidNo\":\"04A312EE848B62\",\"infoRfidNo\":\"04220E86831289\",\"target\":1,\"prevId\":2}]}],\"lockList\":[{\"lockId\":\"1\",\"rfid\":\"040E21443010E9\"},{\"lockId\":\"2\",\"rfid\":\"0457505E5861C2\"}]}"
 //                    sendTicket(testStr, it.bleDevice, loadingCallBack)
-                    Executor.delayOnMain(200) {
-                        getToken(bleBean, loadingCallBack)
-                    }
+                    getToken(bleBean, loadingCallBack, prepareDoneCallBack)
                 }
 
                 override fun onIndicateFailure(exception: BleException?) {
                     loadingCallBack.invoke(false, null)
                     ToastUtils.tip("监听失败")
                     LogUtil.i("监听失败")
+                    prepareDoneCallBack.invoke(false, null)
                 }
 
                 override fun onCharacteristicChanged(data: ByteArray?) {
@@ -408,35 +425,74 @@ object BusinessManager {
         }
     }
 
-    fun getToken(bleBean: BleBean?, loadingCallBack: (Boolean, String?) -> Unit) {
+    /**
+     * 获取蓝牙钥匙token
+     */
+    private fun getToken(
+        bleBean: BleBean?,
+        loadingCallBack: (Boolean, String?) -> Unit,
+        prepareDoneCallBack: (Boolean, BleBean?) -> Unit
+    ) {
         loadingCallBack.invoke(true, "开始获取token...")
         bleBean?.let {
             BleCmdManager.getToken(it.bleDevice.mac, object : CustomBleWriteCallback() {
                 override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
                     loadingCallBack.invoke(false, "token获取成功")
                     LogUtil.i("getToken success : ${bleBean.bleDevice.mac}")
-                    Executor.delayOnMain(500) {
-                        if (isSendTicket) {
-                            // TODO 要改成正式的json
-                            bleBean.ticketSend?.let { itJson ->
-                                sendTicket(itJson, it.bleDevice, loadingCallBack)
-                            }
-//                            sendTicket(PresentationManager.getTicketJson(), it.bleDevice, loadingCallBack)
-                        } else {
-                            getTicketStatus(it.bleDevice, loadingCallBack)
-                        }
-                    }
+                    prepareDoneCallBack.invoke(true, bleBean)
                 }
 
                 override fun onWriteFailure(exception: BleException?) {
                     loadingCallBack.invoke(false, "token获取失败")
                     LogUtil.e("getToken fail : ${bleBean.bleDevice.mac}")
+                    prepareDoneCallBack.invoke(false, null)
                 }
             })
         }
     }
 
-    fun sendTicket(jsonStr: String, bleDevice: BleDevice, loadingCallBack: (Boolean, String?) -> Unit) {
+    /******************************************蓝牙通用准备结束******************************************/
+
+    /**
+     * 下发工作票
+     */
+    fun sendTicketBusiness(
+        mac: String,
+        ticketDetail: TicketDetailRespVO,
+        activity: AppCompatActivity,
+        loadingCallBack: (Boolean, String?) -> Unit,
+    ) {
+        prepareBle(mac, activity, loadingCallBack) { done, bleBean ->
+            if (done) {
+                Executor.delayOnMain(500) {
+                    // 单bleBean json赋值
+                    bleBean?.ticketSend = generateTicketSendJson(ticketDetail)
+                    bleBean?.ticketSend?.let { itJson ->
+                        sendTicket(itJson, bleBean.bleDevice, loadingCallBack)
+                    }
+                }
+            } else {
+                loadingCallBack.invoke(false, null)
+            }
+        }
+    }
+
+    /**
+     * 读取工作票完成情况
+     */
+    fun getTicketStatusBusiness(mac: String, activity: AppCompatActivity, loadingCallBack: (Boolean, String?) -> Unit) {
+        prepareBle(mac, activity, loadingCallBack) { done, bleBean ->
+            if (done) {
+                Executor.delayOnMain(500) {
+                    getTicketStatus(bleBean!!.bleDevice, loadingCallBack)
+                }
+            } else {
+                loadingCallBack.invoke(false, null)
+            }
+        }
+    }
+
+    private fun sendTicket(jsonStr: String, bleDevice: BleDevice, loadingCallBack: (Boolean, String?) -> Unit) {
         loadingCallBack.invoke(true, "开始下发工作票...")
         BleCmdManager.sendWorkTicket(jsonStr, bleDevice = bleDevice, callback = object : CustomBleWriteCallback() {
             override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
@@ -452,11 +508,13 @@ object BusinessManager {
     }
 
     /**
-     * TODO 生成下发工作票Json
+     * 生成下发工作票Json
      *
-     * @param isLock true:上锁任务 false:解锁任务
+     * @param vo 工作票详情
      */
-    fun generateTicketSendJson(isLock: Boolean, vo: TicketDetailRespVO): String {
+    private fun generateTicketSendJson(vo: TicketDetailRespVO): String {
+        // 用ticketStatus的"待上锁"进行判断
+        val isLock = vo.ticketStatus == Constants.TICKET_STATUS_READY_TO_LOCK
         val bo = WorkTicketSendBO(
             cardNo = SPUtils.getLoginUser(MyApplication.instance!!.applicationContext)?.cardNfc,
         )
@@ -583,6 +641,15 @@ object BusinessManager {
                 override fun onWriteFailure(exception: BleException?) {
                     println("switch mode 1 fail")}
             })
+            // 打开钥匙卡扣
+            val keyBean = ModBusController.getKeyByRfid(bleBean.bleDevice.mac)
+            if (keyBean == null) {
+                loadingCallBack.invoke(false, "未找到钥匙信息")
+                ToastUtils.tip(R.string.key_not_exists)
+            } else {
+                val dock = ModBusController.getDockByKeyMac(bleBean.bleDevice.mac)
+                ModBusController.controlKeyBuckle(true, keyBean.isLeft, dock?.addr?.toInt())
+            }
         }
     }
 
@@ -641,20 +708,10 @@ object BusinessManager {
         }
     }
 
-    /**
-     * 读取工作票完成情况
-     */
-    fun getTicketStatusBusiness(mac: String, activity: AppCompatActivity, loadingCallBack: (Boolean, String?) -> Unit) {
-        isSendTicket = false
-        CommonUtils.checkBlePermission(activity) {
-            doScanBle(mac, loadingCallBack)
-        }
-    }
-
     /**
      * 获取工作票完成情况
      */
-    fun getTicketStatus(bleDevice: BleDevice, loadingCallBack: (Boolean, String?) -> Unit) {
+    private fun getTicketStatus(bleDevice: BleDevice, loadingCallBack: (Boolean, String?) -> Unit) {
         loadingCallBack.invoke(true, "开始获取工作票")
         BleCmdManager.getTicketStatus(bleDevice, object : CustomBleWriteCallback() {
             override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {

+ 17 - 0
app/src/main/java/com/grkj/iscs/modbus/ModBusController.kt

@@ -365,6 +365,13 @@ object ModBusController {
         return dockList.find { it.type == DOCK_TYPE_KEY || it.type == DOCK_TYPE_PORTABLE }?.getKeyList()?.find { it.rfid == rfid }
     }
 
+    /**
+     * 根据Mac找钥匙
+     */
+    fun getKeyByMac(mac: String): DockBean.KeyBean? {
+        return dockList.find { it.type == DOCK_TYPE_KEY || it.type == DOCK_TYPE_PORTABLE }?.getKeyList()?.find { it.mac == mac }
+    }
+
     /**
      * 根据RFID找锁具
      */
@@ -372,6 +379,16 @@ object ModBusController {
         return dockList.find { it.type == DOCK_TYPE_LOCK || it.type == DOCK_TYPE_PORTABLE }?.getLockList()?.find { it.rfid == rfid }
     }
 
+    /**
+     * 根据钥匙Mac获取底座
+     */
+    fun getDockByKeyMac(mac: String): DockBean? {
+        return dockList.find {
+            (it.type == DOCK_TYPE_KEY || it.type == DOCK_TYPE_PORTABLE)
+                    && it.getKeyList().any { it.mac == mac }
+        }
+    }
+
     /**
      * 根据类型获取底座列表
      */

+ 8 - 7
app/src/main/java/com/grkj/iscs/presentation/LockerActivity.kt

@@ -80,13 +80,14 @@ class LockerActivity : BaseActivity<ActivityLockerBinding>() {
                 }
             }
             if (lockerStatus == 0 || lockerStatus == 1) {
-                BusinessManager.sendTicketBusiness(PresentationManager.keyMac, this) { b, s ->
-                    handleLoading(b, s)
-                    if (s.equals("切换工作模式成功")) {
-                        ModBusController.controlKeyBuckle(true, isLeft = true, dockList[0].addr.toInt() - 1)
-                        finish()
-                    }
-                }
+                // TODO 业务变动,demo临时注掉
+//                BusinessManager.sendTicketBusiness(PresentationManager.keyMac, this) { b, s ->
+//                    handleLoading(b, s)
+//                    if (s.equals("切换工作模式成功")) {
+//                        ModBusController.controlKeyBuckle(true, isLeft = true, dockList[0].addr.toInt() - 1)
+//                        finish()
+//                    }
+//                }
             }
         }
     }

+ 1 - 1
app/src/main/java/com/grkj/iscs/presenter/TicketDetailPresenter.kt

@@ -123,7 +123,7 @@ class TicketDetailPresenter : BasePresenter<ITicketDetailView>() {
                         NetApi.updateKeyTake(ticketDetail.ticketId!!, keyPair.second?.rfid!!, mContext!!.serialNo()) {
                             if (it) {
                                 // 下发工作票
-                                BusinessManager.sendTicketBusiness(keyPair.second?.mac!!, mvpView as TicketDetailActivity) { b, s ->
+                                BusinessManager.sendTicketBusiness(keyPair.second?.mac!!, ticketDetail, mvpView as TicketDetailActivity) { b, s ->
 
                                 }
                             }

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

@@ -66,6 +66,8 @@
     <string name="ticket_is_locker_part_finished">工作票上锁人部分已完成</string>
     <string name="ticket_is_colocker_part_finished">工作票共锁人部分已完成</string>
 
+    <string name="key_not_exists">钥匙不存在</string>
+
     <!--  演示页  -->
     <string name="presentation_select_sop">选择SOP</string>
     <string name="presentation_select_workshop">选择车间</string>