Jelajahi Sumber

添加获取工作票完成状态业务

Frankensteinly 1 tahun lalu
induk
melakukan
2f2fe8e0f0

+ 84 - 16
app/src/main/java/com/grkj/iscs/BusinessManager.kt

@@ -9,7 +9,9 @@ import com.clj.fastble.data.BleDevice
 import com.clj.fastble.exception.BleException
 import com.grkj.iscs.ble.BleBean
 import com.grkj.iscs.ble.BleCmdManager
+import com.grkj.iscs.ble.BleCmdManager.assembleData
 import com.grkj.iscs.ble.BleConst
+import com.grkj.iscs.ble.BleConst.REQ_WORK_TICKET_RESULT
 import com.grkj.iscs.ble.BleConst.REQ_WORK_TICKET_RESULT_PART
 import com.grkj.iscs.ble.BleUtil
 import com.grkj.iscs.ble.CustomBleGattCallback
@@ -198,6 +200,7 @@ object BusinessManager {
      * 下发工作票
      */
     fun sendTicketBusiness(mac: String, activity: AppCompatActivity, loadingCallBack: (Boolean, String?) -> Unit) {
+        isSendTicket = true
         CommonUtils.checkBlePermission(activity) {
             doScanBle(mac, loadingCallBack)
         }
@@ -354,8 +357,12 @@ object BusinessManager {
                     loadingCallBack.invoke(false, "token获取成功")
                     println("getToken success")
                     Executor.delayOnMain(500) {
-                        println("haha : $ticketJson")
-                        sendTicket(ticketJson!!, it.bleDevice, loadingCallBack)
+                        if (isSendTicket) {
+                            println("haha : $ticketJson")
+                            sendTicket(ticketJson!!, it.bleDevice, loadingCallBack)
+                        } else {
+                            getTicketStatus(it.bleDevice, loadingCallBack)
+                        }
                     }
                 }
 
@@ -433,7 +440,10 @@ object BusinessManager {
         loadingCallBack.invoke(false, null)
         if (res == 0x01.toByte() && job == 0x01.toByte()) {
             loadingCallBack.invoke(false, "切换工作模式成功")
+        } else if (res == 0x02.toByte() && job == 0x01.toByte()) {
+            loadingCallBack.invoke(false, "切换待机模式成功")
         }
+        BleManager.getInstance().disconnectAllDevice()
     }
 
     /**
@@ -446,25 +456,28 @@ object BusinessManager {
         val idx = byteArray[4] + byteArray[5]
         val total = byteArray[6] + byteArray[7]
         val res = byteArray[8]
-        if (idx != total - 1 && (res == 0x00.toByte() || res == 0x02.toByte())) {
-            // TODO 要判断res
-            BleCmdManager.sendWorkTicket(
-                BleUtil.instance?.getBleDeviceByMac(bleBean.bleDevice.mac)?.ticketSend!!,
-                if (res == 0x00.toByte()) idx + 1 else idx,
-                bleBean.bleDevice,
-                object : CustomBleWriteCallback() {
-                    override fun onPrompt(promptStr: String?) {}
+        if (idx != total - 1) {
+            if ((res == 0x00.toByte() || res == 0x02.toByte())) {
+                // TODO 要判断res
+                BleCmdManager.sendWorkTicket(
+                    BleUtil.instance?.getBleDeviceByMac(bleBean.bleDevice.mac)?.ticketSend!!,
+                    if (res == 0x00.toByte()) idx + 1 else idx,
+                    bleBean.bleDevice,
+                    object : CustomBleWriteCallback() {
+                        override fun onPrompt(promptStr: String?) {}
 
-                    override fun onConnectPrompt(promptStr: String?) {}
+                        override fun onConnectPrompt(promptStr: String?) {}
 
-                    override fun onDisConnectPrompt(promptStr: String?) {}
+                        override fun onDisConnectPrompt(promptStr: String?) {}
 
-                    override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {}
+                        override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {}
 
-                    override fun onWriteFailure(exception: BleException?) {}
+                        override fun onWriteFailure(exception: BleException?) {}
 
-                })
+                    })
+            }
         } else {
+            LogUtil.i("Work ticket is done")
             // 下发完毕,切换工作模式
             loadingCallBack.invoke(true, "切换钥匙为工作模式")
             BleCmdManager.switchMode(byteArrayOf(0x01), bleBean.bleDevice, object : CustomBleWriteCallback() {
@@ -488,7 +501,6 @@ object BusinessManager {
     private fun handleTicketStatus(bleDevice: BleDevice, byteArray: ByteArray, loadingCallBack: (Boolean, String?) -> Unit) {
         // TODO 需要有超时重传机制
         LogUtil.i("handleTicketStatus : ${byteArray.toHexStrings()}")
-        loadingCallBack.invoke(false, null)
 
         val total = byteArray[4] + byteArray[5]
         val idx = byteArray[6] + byteArray[7]
@@ -501,6 +513,7 @@ object BusinessManager {
         }
         // TODO 缺少res处理
         if (idx != total - 1) {
+            loadingCallBack.invoke(true, "获取工作票分包")
             getTicketStatusPart((idx + 1).toByteArray(), total.toByteArray(), byteArrayOf(0x01.toByte()), bleDevice, object : CustomBleWriteCallback() {
                 override fun onPrompt(promptStr: String?) {}
 
@@ -517,10 +530,25 @@ object BusinessManager {
                 }
             })
         } else {
+            loadingCallBack.invoke(false, "工作票完成状态读取完成")
             BleUtil.instance?.getBleDeviceByMac(bleDevice.mac)?.let {
                 println("工作票完成接收 : ${String(it.ticketStatus)}")
+                loadingCallBack.invoke(false, "工作票完成接收${String(it.ticketStatus)}")
                 // TODO 清空ticket
                 it.ticketStatus = byteArrayOf()
+                // 切换为待机模式
+                BleCmdManager.switchMode(byteArrayOf(0x02), bleDevice, object : CustomBleWriteCallback() {
+                    override fun onPrompt(promptStr: String?) {}
+
+                    override fun onConnectPrompt(promptStr: String?) {}
+
+                    override fun onDisConnectPrompt(promptStr: String?) {}
+
+                    override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
+                        println("switch mode 1 success")}
+                    override fun onWriteFailure(exception: BleException?) {
+                        println("switch mode 1 fail")}
+                })
             }
         }
     }
@@ -533,4 +561,44 @@ object BusinessManager {
             BleUtil.instance?.write(it.bleDevice, cmd = BleCmdManager.assembleData(it, REQ_WORK_TICKET_RESULT_PART + idx + total + res), writeCallback = callback)
         }
     }
+
+
+
+
+
+    /**
+     * 读取工作票完成情况
+     */
+    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) {
+        loadingCallBack.invoke(true, "开始获取工作票")
+        BleCmdManager.getTicketStatus(bleDevice, object : CustomBleWriteCallback() {
+            override fun onPrompt(promptStr: String?) {}
+
+            override fun onConnectPrompt(promptStr: String?) {}
+
+            override fun onDisConnectPrompt(promptStr: String?) {}
+
+            override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
+                loadingCallBack.invoke(false, "工作票获取成功")
+                println("getTicketStatus success")}
+            override fun onWriteFailure(exception: BleException?) {
+                loadingCallBack.invoke(false, "工作票获取失败")
+                println("getTicketStatus fail")}
+        })
+    }
+
+    /**
+     * 下发工作票还是读取工作票完成状态
+     */
+    var isSendTicket = true
 }

+ 60 - 0
app/src/main/java/com/grkj/iscs/model/WorkTicketStatusBean.kt

@@ -0,0 +1,60 @@
+package com.grkj.iscs.model
+
+class WorkTicketStatusBean {
+    /**
+     * 权限卡号
+     */
+    var cardNo: String? = null
+    /**
+     * 用户密码
+     */
+    var password: String? = null
+    /**
+     * 工作票数组
+     */
+    var data: MutableList<DataDTO>? = null
+
+    class DataDTO {
+        /**
+         * 工作票号
+         */
+        var taskCode: String? = null
+        /**
+         * 工作票ID
+         */
+        var taskId: String? = null
+        /**
+         * 工作票下挂任务列表
+         */
+        var dataList: MutableList<DataListDTO>? = null
+
+        class DataListDTO {
+            /**
+             * 任务ID
+             */
+            var dataId: Int? = null
+            /**
+             * 工作点位RFID号
+             */
+            var equipRfidNo: String? = null
+            /**
+             * 锁RFID号(只在创建的时候有)
+             */
+            var infoRfidNo: String? = null
+            /**
+             * 任务目标 0:挂锁 1:解锁
+             */
+            var target: Int? = null
+            /**
+             * 任务当前状态:
+             * 0—挂锁;1—解锁;2-无操作
+             */
+            var status: Int? = null
+            /**
+             * 任务操作状态
+             * 0—待完成;1—已完成
+             */
+            var closed: Int? = null
+        }
+    }
+}

+ 1 - 9
app/src/main/java/com/grkj/iscs/presentation/PresentationActivity.kt

@@ -127,8 +127,6 @@ class PresentationActivity :
             ToastUtils.tip("没有找到钥匙的RFID")
             return
         }
-        val keyMac = "64:E8:33:47:59:7A"
-//        val keyMac = "64:E8:33:47:59:42"
 
         // 创建工单
         if (mBinding?.siPersonLock?.mSelectIdx == null) {
@@ -141,7 +139,7 @@ class PresentationActivity :
         ModBusController.controlLockBuckle(true, dockList[0].addr.toInt() - 1, lockIdxList) { res ->
             LogUtil.i("confirm开锁卡扣 : ${res.toHexStrings()}")
         }
-        BusinessManager.sendTicketBusiness(keyMac, this) { b, s ->
+        BusinessManager.sendTicketBusiness(PresentationManager.keyMac, this) { b, s ->
             handleLoading(b, s)
             if (s.equals("切换工作模式成功")) {
                 ModBusController.controlKeyBuckle(true, isLeft = true, dockList[0].addr.toInt() - 1)
@@ -207,12 +205,6 @@ class PresentationActivity :
     }
 
 
-    override fun onDestroy() {
-        super.onDestroy()
-        BleManager.getInstance().disconnectAllDevice()
-    }
-
-
     override fun initPresenter(): PresentationPresenter {
         return PresentationPresenter()
     }

+ 20 - 0
app/src/main/java/com/grkj/iscs/presentation/PresentationLoginActivity.kt

@@ -11,8 +11,12 @@ import com.grkj.iscs.databinding.ActivityPresentationLoginBinding
 import com.grkj.iscs.extentions.removeLeadingZeros
 import com.grkj.iscs.extentions.toHexStrings
 import com.grkj.iscs.modbus.ModBusController
+import com.grkj.iscs.model.DeviceConst
 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_PORTABLE
+import com.grkj.iscs.model.WorkTicketStatusBean
 import com.grkj.iscs.util.ActivityUtils
 import com.grkj.iscs.util.Executor
 import com.grkj.iscs.util.FileUtil
@@ -100,6 +104,22 @@ class PresentationLoginActivity : BaseActivity<ActivityPresentationLoginBinding>
                                         }
                                     }
                                 }
+
+
+                                DEVICE_TYPE_KEY -> {
+                                    Executor.runOnMain {
+                                        BusinessManager.getTicketStatusBusiness(PresentationManager.keyMac, this) { b, s ->
+                                            handleLoading(b, s)
+                                            if (!s.isNullOrEmpty() && s.startsWith("工作票完成接收")) {
+                                                val ticket = s.substring(7)
+                                                val ticketStatusBean = Gson().fromJson(ticket, WorkTicketStatusBean::class.java)
+                                            }
+                                        }
+                                    }
+                                }
+                                DEVICE_TYPE_LOCK -> {
+
+                                }
                             }
                         }
                     }

+ 37 - 6
app/src/main/java/com/grkj/iscs/presentation/PresentationManager.kt

@@ -1,31 +1,36 @@
 package com.grkj.iscs.presentation
 
 import com.grkj.iscs.model.WorkTicketBean
+import com.grkj.iscs.model.WorkTicketStatusBean
 import com.grkj.iscs.util.ToastUtils
 
 object PresentationManager {
 
 //    val cardList = mutableListOf("267747D5", "34A347D5", "464947D5")
 
+
+    val keyMac = "64:E8:33:47:59:7A"
+//        val keyMac = "64:E8:33:47:59:42"
+
     var cardList: List<PCardInfoBean> = mutableListOf()
 
     val mSopList = mutableListOf(
         PresentationBean(
             1,
-            "士力架车间",
+            "组装车间",
             "打包线1",
-            "士力架包装车间-打包线1-保养",
-            "士力架包装车间-打包线1-保养",
+            "组装包装车间-打包线1-保养",
+            "组装包装车间-打包线1-保养",
             "SOP001",
             "保养",
             mutableListOf(PPointBean("E-1", "1DA0C66D031080"), PPointBean("E-2", "1DCAD26D031080"))
         ),
         PresentationBean(
             2,
-            "德芙车间",
+            "拆解车间",
             "打包线2",
-            "德芙包装车间-打包线2-维护",
-            "德芙包装车间-打包线2-维护",
+            "拆解包装车间-打包线2-维护",
+            "拆解包装车间-打包线2-维护",
             "SOP002",
             "维护",
             mutableListOf(PPointBean("E-3", "1DA0C66D031080"), PPointBean("E-4", "1DCAD26D031080"))
@@ -104,4 +109,30 @@ object PresentationManager {
         }
         return locker.lockerTogetherList?.find { it.rfid == rfid }?.status
     }
+
+    fun updateWorkTicket(ticketStatusBean: WorkTicketStatusBean) {
+        val list = findMatchingTickets(ticketStatusBean)
+        if (list.isNotEmpty()) {
+            val ticket = list.first()
+        }
+    }
+
+    fun findMatchingTickets(ticketStatusBean: WorkTicketStatusBean): List<PServerTicket> {
+        val matchingTickets = mutableListOf<PServerTicket>()
+
+        // 获取 ticketStatusBean 中的所有 taskCode
+        val taskCodes = ticketStatusBean.data?.map { it.taskCode }
+
+        // 遍历 workTicketList
+        for (ticket in workTicketList) {
+            // 检查 ticket 的 workTicketBean 是否存在且包含相同的 taskCode
+            ticket.workTicketBean?.data?.forEach { data ->
+                if (taskCodes?.contains(data.taskCode) == true) {
+                    matchingTickets.add(ticket)
+                }
+            }
+        }
+
+        return matchingTickets
+    }
 }