Jelajahi Sumber

simple demo临时提交

Frankensteinly 10 bulan lalu
induk
melakukan
df137e2ce7

+ 92 - 60
app/src/main/java/com/grkj/iscs/BusinessManager.kt

@@ -42,6 +42,7 @@ import com.grkj.iscs.model.bo.WorkTicketGetBO
 import com.grkj.iscs.model.bo.WorkTicketSendBO
 import com.grkj.iscs.model.vo.ticket.LockPointUpdateReqVO
 import com.grkj.iscs.model.vo.ticket.TicketDetailRespVO
+import com.grkj.iscs.presentation.PresentationManager
 import com.grkj.iscs.util.ActivityUtils
 import com.grkj.iscs.util.CommonUtils
 import com.grkj.iscs.util.Executor
@@ -98,20 +99,20 @@ object BusinessManager {
                 }
                 when (dockBean.type) {
                     DOCK_TYPE_KEY -> {
-                        dockBean.getKeyList().forEach { keyBean ->
+                        dockBean.deviceList.forEach { keyBean ->
                             if (keyBean.isExist) {
                                 // 放回钥匙,读取rfid
-                                ModBusController.readKeyRfid(dockBean.addr.toInt() - 1, if (keyBean.isLeft) 0 else 1) { isLeft, res ->
+                                ModBusController.readKeyRfid(dockBean.addr.toInt() - 1, if ((keyBean as DockBean.KeyBean).isLeft) 0 else 1) { isLeft, res ->
                                     val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
                                     ModBusController.updateKeyRfid(dockBean.addr.toInt(), keyBean.isLeft, rfid)
-                                    NetApi.getKeyInfo(rfid) {
-                                        if (it != null && !it.macAddress.isNullOrEmpty()) {
-                                            ModBusController.updateKeyMac(dockBean.addr.toInt(), keyBean.isLeft, it.macAddress)
-                                            showKeyReturnDialog(it.macAddress, isLeft, dockBean.addr.toInt())
-                                        } else {
-                                            ToastUtils.tip(R.string.get_key_info_fail)
-                                        }
-                                    }
+//                                    NetApi.getKeyInfo(rfid) {
+//                                        if (it != null && !it.macAddress.isNullOrEmpty()) {
+//                                            ModBusController.updateKeyMac(dockBean.addr.toInt(), keyBean.isLeft, it.macAddress)
+//                                            showKeyReturnDialog(it.macAddress, isLeft, dockBean.addr.toInt())
+//                                        } else {
+//                                            ToastUtils.tip(R.string.get_key_info_fail)
+//                                        }
+//                                    }
                                     // TODO 蓝牙通信
                                 }
 //                                ModBusController.controlKeyBuckle(false, isLeft = true, dockBean.addr.toInt() - 1)
@@ -119,22 +120,22 @@ object BusinessManager {
                         }
                     }
                     DOCK_TYPE_LOCK -> {
-                        dockBean.getLockList().forEach { lockBean ->
+                        dockBean.deviceList.forEach { lockBean ->
                             if (lockBean.isExist) {
                                 ModBusController.readLockRfid(dockBean.addr.toInt() - 1, lockBean.idx) { res ->
                                     val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
                                     ModBusController.updateLockRfid(dockBean.addr.toInt(), lockBean.idx, rfid)
-                                    NetApi.getLockInfo(rfid) {
-                                        if (it != null) {
+//                                    NetApi.getLockInfo(rfid) {
+//                                        if (it != null) {
                                             // TODO 考虑快速拿取
                                             ModBusController.controlLockBuckle(false, dockBean.addr.toInt() - 1, lockBean.idx) { itRst ->
                                                 if (itRst.isNotEmpty()) {
                                                     // 上报锁具信息
-                                                    NetApi.updateLockReturn(rfid, MyApplication.instance!!.serialNo()) {}
+//                                                    NetApi.updateLockReturn(rfid, MyApplication.instance!!.serialNo()) {}
                                                 }
                                             }
-                                        }
-                                    }
+//                                        }
+//                                    }
                                 }
                             }
                         }
@@ -209,7 +210,7 @@ object BusinessManager {
         dlg.setType(TipDialog.TYPE_CONFIRM)
         dlg.setConfirmListener {
             ModBusController.controlKeyBuckle(false, isLeft, slaveIdx)
-            getTicketStatusBusiness(mac, ActivityUtils.currentActivity() as BaseActivity<*>) { b, s ->
+            getTicketStatusBusiness(mac, ActivityUtils.currentActivity() as BaseActivity<*>) { b, s, rst ->
                 (ActivityUtils.currentActivity() as BaseActivity<*>).handleLoading(b, s)
             }
         }
@@ -311,7 +312,7 @@ object BusinessManager {
     private fun prepareBle(
         mac: String,
         activity: AppCompatActivity,
-        loadingCallBack: (Boolean, String?) -> Unit,
+        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
         prepareDoneCallBack: (Boolean, BleBean?) -> Unit
     ) {
         CommonUtils.checkBlePermission(activity) {
@@ -320,9 +321,9 @@ object BusinessManager {
     }
 
     @AfterPermissionGranted(PERMISSION_REQUEST_CODE)
-    fun doScanBle(mac: String, loadingCallBack: (Boolean, String?) -> Unit, prepareDoneCallBack: (Boolean, BleBean?) -> Unit) {
+    fun doScanBle(mac: String, loadingCallBack: (Boolean, String?, Boolean?) -> Unit, prepareDoneCallBack: (Boolean, BleBean?) -> Unit) {
         LogUtil.d("扫描开始:$mac")
-        loadingCallBack(true, "正在扫描设备...")
+        loadingCallBack(true, "正在扫描设备...", null)
         BleUtil.instance?.scan(object : CustomBleScanCallback() {
             override fun onPrompt(promptStr: String?) {
                 BleManager.getInstance().enableBluetooth()
@@ -349,9 +350,10 @@ object BusinessManager {
             }
 
             override fun onScanFinished(scanResultList: MutableList<BleDevice>?) {
-                loadingCallBack.invoke(false, null)
+                loadingCallBack.invoke(false, null, null)
                 if (BleUtil.instance?.deviceList?.isEmpty() == true) {
                     ToastUtils.tip(R.string.ble_no_device_found)
+                    loadingCallBack.invoke(false, null, false)
                     return
                 }
                 BleUtil.instance?.getBleDeviceByMac(mac)?.bleDevice?.let {
@@ -366,26 +368,26 @@ object BusinessManager {
      */
     fun doConnect(
         bleDevice: BleDevice,
-        loadingCallBack: (Boolean, String?) -> Unit,
+        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
         prepareDoneCallBack: (Boolean, BleBean?) -> Unit
     ) {
-        loadingCallBack.invoke(true, CommonUtils.getStr(R.string.ble_connecting))
+        loadingCallBack.invoke(true, CommonUtils.getStr(R.string.ble_connecting), null)
         BleManager.getInstance().disconnect(bleDevice)
         BleUtil.instance?.connectBySelect(bleDevice,
             object : CustomBleGattCallback() {
                 override fun onPrompt(promptStr: String?) {
-                    loadingCallBack.invoke(false, promptStr)
+                    loadingCallBack.invoke(false, promptStr, false)
                 }
 
                 override fun onStartConnect() {}
 
                 override fun onConnectFail(bleDevice: BleDevice?, exception: BleException?) {
-                    loadingCallBack.invoke(false, CommonUtils.getStr(R.string.ble_connect_fail))
+                    loadingCallBack.invoke(false, CommonUtils.getStr(R.string.ble_connect_fail), false)
                     prepareDoneCallBack.invoke(false, null)
                 }
 
                 override fun onConnectSuccess(bleDevice: BleDevice?, gatt: BluetoothGatt?, status: Int) {
-                    loadingCallBack.invoke(false, null)
+                    loadingCallBack.invoke(false, null, null)
                     LogUtil.i("onConnectSuccess : $bleDevice")
                     bleDevice?.let {
                         val bleBean = BleBean(it)
@@ -403,7 +405,7 @@ object BusinessManager {
                 }
 
                 override fun onDisConnected(isActiveDisConnected: Boolean, device: BleDevice?, gatt: BluetoothGatt?, status: Int) {
-                    loadingCallBack.invoke(false, null)
+                    loadingCallBack.invoke(false, null, false)
                     ToastUtils.tip(CommonUtils.getStr(R.string.ble_disconnect))
                     BleUtil.instance?.getBleDeviceByMac(device?.mac)?.let {
                         BleUtil.instance?.deviceList?.remove(it)
@@ -417,10 +419,10 @@ object BusinessManager {
      */
     private fun indicate(
         bleBean: BleBean?,
-        loadingCallBack: (Boolean, String?) -> Unit,
+        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
         prepareDoneCallBack: (Boolean, BleBean?) -> Unit
     ) {
-        loadingCallBack.invoke(true, "开始监听...")
+        loadingCallBack.invoke(true, "开始监听...", null)
         bleBean?.let {
             BleUtil.instance?.indicate(it.bleDevice, indicateCallback = object : CustomBleIndicateCallback() {
                 override fun onPrompt(promptStr: String?) {
@@ -443,7 +445,7 @@ object BusinessManager {
                 }
 
                 override fun onIndicateFailure(exception: BleException?) {
-                    loadingCallBack.invoke(false, null)
+                    loadingCallBack.invoke(false, null, false)
                     ToastUtils.tip("监听失败")
                     LogUtil.i("监听失败")
                     prepareDoneCallBack.invoke(false, null)
@@ -464,20 +466,20 @@ object BusinessManager {
      */
     private fun getToken(
         bleBean: BleBean?,
-        loadingCallBack: (Boolean, String?) -> Unit,
+        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
         prepareDoneCallBack: (Boolean, BleBean?) -> Unit
     ) {
-        loadingCallBack.invoke(true, "开始获取token...")
+        loadingCallBack.invoke(true, "开始获取token...", null)
         bleBean?.let {
             BleCmdManager.getToken(it.bleDevice.mac, object : CustomBleWriteCallback() {
                 override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
-                    loadingCallBack.invoke(false, "token获取成功")
+                    loadingCallBack.invoke(false, "token获取成功", null)
                     LogUtil.i("getToken success : ${bleBean.bleDevice.mac}")
                     prepareDoneCallBack.invoke(true, bleBean)
                 }
 
                 override fun onWriteFailure(exception: BleException?) {
-                    loadingCallBack.invoke(false, "token获取失败")
+                    loadingCallBack.invoke(false, "token获取失败", false)
                     LogUtil.e("getToken fail : ${bleBean.bleDevice.mac}")
                     prepareDoneCallBack.invoke(false, null)
                 }
@@ -487,6 +489,31 @@ object BusinessManager {
 
     /******************************************蓝牙通用准备结束******************************************/
 
+    /**
+     * 下发工作票
+     * TODO 演示demo专用
+     * @param loadingCallBack 是否显示loading、提示信息、是否结束(true成功结束、false失败结束、null继续执行)
+     */
+    fun sendTicketBusiness(
+        mac: String,
+        activity: AppCompatActivity,
+        loadingCallBack: (Boolean, String?, Boolean?) -> Unit
+    ) {
+        prepareBle(mac, activity, loadingCallBack) { done, bleBean ->
+            if (done) {
+                Executor.delayOnMain(500) {
+                    // 单bleBean json赋值
+                    bleBean?.ticketSend = PresentationManager.getSimpleTicketJson()
+                    bleBean?.ticketSend?.let { itJson ->
+                        sendTicket(itJson, bleBean.bleDevice, loadingCallBack)
+                    }
+                }
+            } else {
+                loadingCallBack.invoke(false, null, false)
+            }
+        }
+    }
+
     /**
      * 下发工作票
      */
@@ -494,7 +521,7 @@ object BusinessManager {
         mac: String,
         ticketDetail: TicketDetailRespVO,
         activity: AppCompatActivity,
-        loadingCallBack: (Boolean, String?) -> Unit,
+        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
     ) {
         prepareBle(mac, activity, loadingCallBack) { done, bleBean ->
             if (done) {
@@ -506,7 +533,7 @@ object BusinessManager {
                     }
                 }
             } else {
-                loadingCallBack.invoke(false, null)
+                loadingCallBack.invoke(false, null, false)
             }
         }
     }
@@ -514,29 +541,30 @@ object BusinessManager {
     /**
      * 读取工作票完成情况
      */
-    fun getTicketStatusBusiness(mac: String, activity: AppCompatActivity, loadingCallBack: (Boolean, String?) -> Unit) {
+    fun getTicketStatusBusiness(mac: String, activity: AppCompatActivity, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
         prepareBle(mac, activity, loadingCallBack) { done, bleBean ->
             if (done) {
                 Executor.delayOnMain(500) {
                     getTicketStatus(bleBean!!.bleDevice, loadingCallBack)
                 }
             } else {
-                loadingCallBack.invoke(false, null)
+                loadingCallBack.invoke(false, null, false)
             }
         }
     }
 
-    private fun sendTicket(jsonStr: String, bleDevice: BleDevice, loadingCallBack: (Boolean, String?) -> Unit) {
-        loadingCallBack.invoke(true, "开始下发工作票...")
+    private fun sendTicket(jsonStr: String, bleDevice: BleDevice, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
+        val ctx = MyApplication.instance!!
+        loadingCallBack.invoke(true, ctx.getString(R.string.simple_start_send_ticket), null)
         BleCmdManager.sendWorkTicket(jsonStr, bleDevice = bleDevice, callback = object : CustomBleWriteCallback() {
             override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
                 println("sendTicket success")
-                loadingCallBack.invoke(true, "工作票下发中...")
+                loadingCallBack.invoke(true, ctx.getString(R.string.simple_sending_ticket), null)
             }
 
             override fun onWriteFailure(exception: BleException?) {
                 LogUtil.e("sendTicket fail : ${bleDevice.mac}")
-                loadingCallBack.invoke(false, "工作票下发失败")
+                loadingCallBack.invoke(false, ctx.getString(R.string.simple_send_ticket_fail), null)
             }
         })
     }
@@ -589,7 +617,7 @@ object BusinessManager {
         return jsonStr
     }
 
-    fun handleRsp(bleBean: BleBean, byteArray: ByteArray, loadingCallBack: (Boolean, String?) -> Unit) {
+    fun handleRsp(bleBean: BleBean, byteArray: ByteArray, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
         // TODO Token校验
 //        val len = byteArray[2].toInt()
 //        val token = byteArray.copyOfRange(len + 7, len + 11)
@@ -628,15 +656,16 @@ object BusinessManager {
      * job : 0x01:工作模式 0x02:待机模式
      * res : 0x01:成功 0x02:失败
      */
-    private fun handleSwitchModeResult(byteArray: ByteArray, loadingCallBack: (Boolean, String?) -> Unit) {
+    private fun handleSwitchModeResult(byteArray: ByteArray, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
         LogUtil.i("handleSwitchModeResult : ${byteArray.toHexStrings()}")
+        val ctx = MyApplication.instance!!
         val job = byteArray[4]
         val res = byteArray[5]
-        loadingCallBack.invoke(false, null)
+        loadingCallBack.invoke(false, null, null)
         if (res == 0x01.toByte() && job == 0x01.toByte()) {
-            loadingCallBack.invoke(false, "切换工作模式成功")
+            loadingCallBack.invoke(false, ctx.getString(R.string.simple_switch_work_mode_success), null)
         } else if (res == 0x02.toByte() && job == 0x01.toByte()) {
-            loadingCallBack.invoke(false, "切换待机模式成功")
+            loadingCallBack.invoke(false, ctx.getString(R.string.simple_switch_standby_mode_success), null)
         }
         BleManager.getInstance().disconnectAllDevice()
     }
@@ -645,9 +674,10 @@ object BusinessManager {
      * 工作票下发结果
      * res:0x00:成功 0x01:失败 0x02:传输超时 0x0D:当前IDX超出范围 0x0E:当前数据CRC校验失败 0x14:JSON结构错误 0x63:未知错误
      */
-    private fun handleWorkTicketResult(bleBean: BleBean, byteArray: ByteArray, loadingCallBack: (Boolean, String?) -> Unit) {
+    private fun handleWorkTicketResult(bleBean: BleBean, byteArray: ByteArray, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
+        val ctx = MyApplication.instance!!
         LogUtil.i("handleWorkTicketResult : ${byteArray.toHexStrings()}")
-        loadingCallBack.invoke(false, null)
+        loadingCallBack.invoke(false, null, null)
         val idx = byteArray[4] + byteArray[5]
         val total = byteArray[6] + byteArray[7]
         val res = byteArray[8]
@@ -668,7 +698,7 @@ object BusinessManager {
         } else {
             LogUtil.i("Work ticket is done")
             // 下发完毕,切换工作模式
-            loadingCallBack.invoke(true, "切换钥匙为工作模式")
+            loadingCallBack.invoke(true, ctx.getString(R.string.simple_switch_work_mode), null)
             BleCmdManager.switchMode(STATUS_WORK, bleBean.bleDevice, object : CustomBleWriteCallback() {
                 override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
                     println("switch mode 1 success")}
@@ -678,9 +708,10 @@ object BusinessManager {
             // 打开钥匙卡扣
             val keyBean = ModBusController.getKeyByRfid(bleBean.bleDevice.mac)
             if (keyBean == null) {
-                loadingCallBack.invoke(false, "未找到钥匙信息")
-                ToastUtils.tip(R.string.key_not_exists)
+                loadingCallBack.invoke(false, ctx.getString(R.string.simple_key_not_found), false)
+                ToastUtils.tip(R.string.simple_key_not_exists)
             } else {
+                loadingCallBack.invoke(false, null, true)
                 val dock = ModBusController.getDockByKeyMac(bleBean.bleDevice.mac)
                 ModBusController.controlKeyBuckle(true, keyBean.isLeft, dock?.addr?.toInt())
             }
@@ -690,9 +721,10 @@ object BusinessManager {
     /**
      * 处理工作票完成情况
      */
-    private fun handleTicketStatus(bleDevice: BleDevice, byteArray: ByteArray, loadingCallBack: (Boolean, String?) -> Unit) {
+    private fun handleTicketStatus(bleDevice: BleDevice, byteArray: ByteArray, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
         // TODO 需要有超时重传机制
         LogUtil.i("handleTicketStatus : ${byteArray.toHexStrings()}")
+        val ctx = MyApplication.instance!!
 
         val total = byteArray[4] + byteArray[5]
         val idx = byteArray[6] + byteArray[7]
@@ -705,7 +737,7 @@ object BusinessManager {
         }
         // TODO 缺少res处理
         if (idx != total - 1) {
-            loadingCallBack.invoke(true, "获取工作票分包")
+            loadingCallBack.invoke(true, ctx.getString(R.string.simple_get_ticket_part), null)
             getTicketStatusPart((idx + 1).toByteArray(), total.toByteArray(), byteArrayOf(0x01.toByte()), bleDevice, object : CustomBleWriteCallback() {
                 override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
                     println("getTicketStatusPart success")
@@ -716,10 +748,10 @@ object BusinessManager {
                 }
             })
         } else {
-            loadingCallBack.invoke(false, "工作票完成状态读取完成")
+            loadingCallBack.invoke(false, ctx.getString(R.string.simple_get_ticket_status_done), null)
             BleUtil.instance?.getBleDeviceByMac(bleDevice.mac)?.let {
                 println("工作票完成接收 : ${String(it.ticketStatus)}")
-                loadingCallBack.invoke(false, "工作票完成接收${String(it.ticketStatus)}")
+                loadingCallBack.invoke(false, "工作票完成接收${String(it.ticketStatus)}", true)
                 // TODO 清空ticket
                 it.ticketStatus = byteArrayOf()
                 // TODO 根据工作票完成情况,切换为待机模式
@@ -773,14 +805,14 @@ object BusinessManager {
     /**
      * 获取工作票完成情况
      */
-    private fun getTicketStatus(bleDevice: BleDevice, loadingCallBack: (Boolean, String?) -> Unit) {
-        loadingCallBack.invoke(true, "开始获取工作票")
+    private fun getTicketStatus(bleDevice: BleDevice, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
+        loadingCallBack.invoke(true, "开始获取工作票", null)
         BleCmdManager.getTicketStatus(bleDevice, object : CustomBleWriteCallback() {
             override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
-                loadingCallBack.invoke(false, "工作票获取成功")
+                loadingCallBack.invoke(false, "工作票获取成功", null)
                 println("getTicketStatus success")}
             override fun onWriteFailure(exception: BleException?) {
-                loadingCallBack.invoke(false, "工作票获取失败")
+                loadingCallBack.invoke(false, "工作票获取失败", false)
                 println("getTicketStatus fail")}
         })
     }

+ 81 - 9
app/src/main/java/com/grkj/iscs/presentation/PresentationManager.kt

@@ -1,14 +1,21 @@
 package com.grkj.iscs.presentation
 
+import androidx.appcompat.app.AppCompatActivity
 import com.google.gson.Gson
+import com.grkj.iscs.BusinessManager
 import com.grkj.iscs.MyApplication
 import com.grkj.iscs.R
+import com.grkj.iscs.activity.TicketDetailActivity
+import com.grkj.iscs.extentions.serialNo
+import com.grkj.iscs.extentions.toHexStrings
 import com.grkj.iscs.modbus.DockBean
 import com.grkj.iscs.modbus.ModBusController
 import com.grkj.iscs.model.DeviceConst
 import com.grkj.iscs.model.WorkTicketBean
 import com.grkj.iscs.model.WorkTicketStatusBean
+import com.grkj.iscs.model.vo.lock.LockTakeUpdateReqVO
 import com.grkj.iscs.util.Executor
+import com.grkj.iscs.util.NetApi
 import com.grkj.iscs.util.ToastUtils
 import com.grkj.iscs.util.log.LogUtil
 import java.text.SimpleDateFormat
@@ -250,13 +257,14 @@ object PresentationManager {
         var workTicketBean: WorkTicketBean? = null,
         var startTime: String? = null,
         var endTime: String? = null,
-        var status: Int? = null,     // 0:待上锁人上锁 1:部分共锁人上锁 2:待共锁人解锁 3:部分共锁人解锁 4:待上锁人解锁 5:待归还设备 6:已完成
+        var status: Int? = null,     // 0:未开始 1:待上锁 2:进行中 3:待解锁 4:已解锁 5:已结束
         var locker: PLockerBean? = null,    // 上锁人
         var lockerTogetherList: MutableList<PLockerTogetherBean>? = null,  // 共锁人
         var isAllLocksReturned: Boolean = false    // 是否归还所有锁具
     )
 
-    fun initTicket(lockList: List<DockBean.LockBean>) {
+//    fun initTicket(lockList: List<DockBean.LockBean>) {
+    fun initTicket() {
         val ctx = MyApplication.instance!!
         val sop = PresentationBean(
             1,
@@ -294,13 +302,13 @@ object PresentationManager {
 
         ticket.data?.add(dataDTO)
 
-        ticket.lockList = mutableListOf()
-        for (i in lockList.indices) {
-            val lockListDTO = WorkTicketBean.LockListDTO()
-            lockListDTO.lockId = "${i + 1}"
-            lockListDTO.rfid = lockList[i].rfid
-            ticket.lockList?.add(lockListDTO)
-        }
+//        ticket.lockList = mutableListOf()
+//        for (i in lockList.indices) {
+//            val lockListDTO = WorkTicketBean.LockListDTO()
+//            lockListDTO.lockId = "${i + 1}"
+//            lockListDTO.rfid = lockList[i].rfid
+//            ticket.lockList?.add(lockListDTO)
+//        }
 
         mSimpleTicket = SimpleTicket(
             sop,
@@ -322,4 +330,68 @@ object PresentationManager {
         LogUtil.i("getSimpleTicketJson : $jsonStr")
         return jsonStr
     }
+
+    fun checkSimpleEquip(ctx: AppCompatActivity) {
+        val lockerStatus = mSimpleTicket?.locker?.status
+
+        // 锁
+        val dockList = ModBusController.getDockByType(DeviceConst.DOCK_TYPE_LOCK)
+        if (dockList.isEmpty()) {
+            ToastUtils.tip(R.string.simple_no_lock_dock)
+            return
+        }
+        val lockList = dockList[0].getLockList().take(2)
+        if (lockList.size < 2) {
+            ToastUtils.tip(R.string.simple_lock_count_not_enough)
+            return
+        }
+        val lockIdxList = lockList.map { it.idx } as MutableList
+
+        // 蓝牙钥匙
+        val keyList = ModBusController.getKeyByDockType(DeviceConst.DOCK_TYPE_KEY)
+        if (keyList.isNullOrEmpty()) {
+            ToastUtils.tip(R.string.simple_key_count_not_enough)
+            return
+        }
+        val rfid = keyList[0].rfid
+        if (rfid.isNullOrEmpty()) {
+            ToastUtils.tip(R.string.simple_key_rfid_is_null)
+            return
+        }
+
+        if (lockerStatus == 2) {
+            ToastUtils.tip(R.string.simple_locker_finished)
+            return
+        }
+
+        // 操作设备
+        BusinessManager.checkEquipCount(2) { keyPair, lockMap ->
+
+            if (mSimpleTicket?.status == 0 || mSimpleTicket?.status == 1) {
+                mSimpleTicket!!.workTicketBean?.lockList = mutableListOf()
+
+                // TODO 更新锁具配对
+                lockMap.forEach { (addr, lockList) ->
+                    // 开锁卡扣
+                    ModBusController.controlLockBuckle(true, addr.toInt(), lockList.map { it.idx }.toMutableList())
+                    for (i in lockList.indices) {
+                        val lockListDTO = WorkTicketBean.LockListDTO()
+                        lockListDTO.lockId = "${i + 1}"
+                        lockListDTO.rfid = lockList[i].rfid
+                        mSimpleTicket!!.workTicketBean?.lockList?.add(lockListDTO)
+                    }
+                }
+            }
+            // null表示锁具数量不够,不给钥匙
+            if (keyPair != null) {
+                if (lockerStatus == 0 || lockerStatus == 1) {
+                    // 更新钥匙信息
+                    // TODO 更新钥匙配对
+                    BusinessManager.sendTicketBusiness(keyPair.second?.mac!!, ctx) { b, s, rst ->
+
+                    }
+                }
+            }
+        }
+    }
 }

+ 53 - 2
app/src/main/java/com/grkj/iscs/presentation/simple/SimpleProcessActivity.kt

@@ -1,10 +1,28 @@
 package com.grkj.iscs.presentation.simple
 
+import android.content.Intent
 import android.view.View
+import com.google.gson.Gson
+import com.grkj.iscs.BusinessManager
 import com.grkj.iscs.R
 import com.grkj.iscs.base.BaseActivity
 import com.grkj.iscs.databinding.ActivitySimpleProcessBinding
+import com.grkj.iscs.extentions.removeLeadingZeros
+import com.grkj.iscs.extentions.toHexStrings
+import com.grkj.iscs.modbus.DockBean
+import com.grkj.iscs.modbus.ModBusController
+import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_CARD
+import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_KEY
+import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_LOCK
+import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_KEY
+import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_LOCK
+import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_PORTABLE
+import com.grkj.iscs.model.WorkTicketStatusBean
+import com.grkj.iscs.presentation.LockerActivity
+import com.grkj.iscs.presentation.LockerTogetherActivity
 import com.grkj.iscs.presentation.PresentationManager
+import com.grkj.iscs.util.ActivityUtils
+import com.grkj.iscs.util.Executor
 import com.grkj.iscs.util.ToastUtils
 
 class SimpleProcessActivity : BaseActivity<ActivitySimpleProcessBinding>() {
@@ -15,6 +33,8 @@ class SimpleProcessActivity : BaseActivity<ActivitySimpleProcessBinding>() {
         get() = ActivitySimpleProcessBinding.inflate(layoutInflater)
 
     override fun initView() {
+        reg()
+
         mStepList = mutableListOf(mBinding!!.rlContainer0, mBinding!!.rlContainer1,
             mBinding!!.rlContainer2, mBinding!!.rlContainer3, mBinding!!.rlContainer4, mBinding!!.rlContainer5)
 
@@ -32,8 +52,7 @@ class SimpleProcessActivity : BaseActivity<ActivitySimpleProcessBinding>() {
 
         mBinding?.tvStart?.setOnClickListener {
             PresentationManager.mStep = 1
-            // TODO 检查锁具数量
-//            PresentationManager.initTicket()
+            PresentationManager.initTicket()
             changeStep(PresentationManager.mStep)
         }
     }
@@ -48,4 +67,36 @@ class SimpleProcessActivity : BaseActivity<ActivitySimpleProcessBinding>() {
         }
         mBinding?.tvReturnHome?.visibility = if (step == 0) View.GONE else View.VISIBLE
     }
+
+
+    private fun reg() {
+        BusinessManager.registerStatusListener(this) { dockBean ->
+            when (dockBean.type) {
+                DOCK_TYPE_KEY -> {
+                    dockBean.deviceList.forEach { keyBean ->
+                        Executor.runOnMain {
+                            BusinessManager.getTicketStatusBusiness((keyBean as DockBean.KeyBean).mac!!, this) { b, s ->
+                                handleLoading(b, s)
+                                if (!s.isNullOrEmpty() && s.startsWith("工作票完成接收")) {
+                                    val ticket = s.substring(7)
+                                    val ticketStatusBean = Gson().fromJson(ticket, WorkTicketStatusBean::class.java)
+                                    PresentationManager.updateWorkTicket(ticketStatusBean)
+                                }
+                            }
+                        }
+                    }
+                }
+                DOCK_TYPE_LOCK -> {
+                    dockBean.deviceList.forEach { lockBean ->
+                        if (lockBean.isExist) {
+                            ModBusController.readLockRfid(dockBean.addr.toInt() - 1, lockBean.idx) { res ->
+                                val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
+                                ModBusController.updateLockRfid(dockBean.addr.toInt(), lockBean.idx, rfid)
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
 }

+ 5 - 0
app/src/main/java/com/grkj/iscs/presentation/simple/SimpleSettingActivity.kt

@@ -3,6 +3,7 @@ package com.grkj.iscs.presentation.simple
 import com.grkj.iscs.base.BaseActivity
 import com.grkj.iscs.databinding.ActivitySimpleSettingBinding
 import com.grkj.iscs.modbus.ModBusController
+import com.grkj.iscs.presentation.PresentationManager
 
 class SimpleSettingActivity : BaseActivity<ActivitySimpleSettingBinding>() {
 
@@ -10,6 +11,10 @@ class SimpleSettingActivity : BaseActivity<ActivitySimpleSettingBinding>() {
         get() = ActivitySimpleSettingBinding.inflate(layoutInflater)
 
     override fun initView() {
+        mBinding?.tvFinishTicket?.setOnClickListener {
+            PresentationManager.initTicket()
+        }
+
         mBinding?.tvCloseAllLockBuckles?.setOnClickListener {
             ModBusController.controlAllLockBuckles(false)
         }

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

@@ -131,4 +131,20 @@
     <string name="simple_workshop_assemble">组装车间</string>
     <string name="simple_sop_type">保养</string>
     <string name="simple_line">打包线</string>
+
+    <string name="simple_no_lock_dock">没有找到挂锁底座</string>
+    <string name="simple_lock_count_not_enough">挂锁数量不够</string>
+    <string name="simple_key_count_not_enough">钥匙数量不够</string>
+    <string name="simple_key_rfid_is_null">没有找到钥匙的RFID</string>
+    <string name="simple_locker_finished">解锁已完成</string>
+    <string name="simple_start_send_ticket">开始下发工作票...</string>
+    <string name="simple_sending_ticket">工作票下发中...</string>
+    <string name="simple_send_ticket_fail">工作票下发失败</string>
+    <string name="simple_switch_work_mode">切换钥匙为工作模式</string>
+    <string name="simple_key_not_found">未找到钥匙</string>
+    <string name="simple_key_not_exists">钥匙不存在</string>
+    <string name="simple_switch_work_mode_success">切换工作模式成功</string>
+    <string name="simple_switch_standby_mode_success">切换待机模式成功</string>
+    <string name="simple_get_ticket_part">获取工作票分包</string>
+    <string name="simple_get_ticket_status_done">工作票完成状态读取完成</string>
 </resources>