Преглед на файлове

完善工作票创建;修复下发工作票长度取值

Frankensteinly преди 1 година
родител
ревизия
0c00041179

+ 18 - 9
app/src/main/java/com/grkj/iscs/BusinessManager.kt

@@ -191,6 +191,8 @@ object BusinessManager {
 
     /****************************************** 蓝牙 ******************************************/
 
+    // 工作票下发json
+    var ticketJson: String? = null
     /**
      * 下发工作票
      */
@@ -307,7 +309,8 @@ object BusinessManager {
                 override fun onIndicateSuccess() {
                     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)
+//                    sendTicket(testStr, it.bleDevice, loadingCallBack)
+                    sendTicket(ticketJson!!, it.bleDevice, loadingCallBack)
                 }
 
                 override fun onIndicateFailure(exception: BleException?) {
@@ -317,7 +320,7 @@ object BusinessManager {
                 override fun onCharacteristicChanged(data: ByteArray?) {
                     LogUtil.i("监听数据 : ${data?.toHexStrings()}")
                     data?.let { itData ->
-                        handleRsp(it, itData)
+                        handleRsp(it, itData, loadingCallBack)
                     }
                 }
             })
@@ -334,15 +337,17 @@ object BusinessManager {
 
             override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
                 println("sendTicket success")
+                loadingCallBack.invoke(true, "工作票下发中...")
             }
 
             override fun onWriteFailure(exception: BleException?) {
                 println("sendTicket fail")
+                loadingCallBack.invoke(false, "工作票下发失败")
             }
         })
     }
 
-    fun handleRsp(bleBean: BleBean, byteArray: ByteArray) {
+    fun handleRsp(bleBean: BleBean, byteArray: ByteArray, loadingCallBack: (Boolean, String?) -> Unit) {
         val len = byteArray[2].toInt()
         val token = byteArray.copyOfRange(len + 7, len + 11)
         if (token.contentEquals(bleBean.token)) {
@@ -352,12 +357,12 @@ object BusinessManager {
         }
         when {
             // 工作模式切换
-            byteArray.startsWith(BleConst.RSP_SWITCH_MODE) -> handleSwitchModeResult(byteArray)
+            byteArray.startsWith(BleConst.RSP_SWITCH_MODE) -> handleSwitchModeResult(byteArray, loadingCallBack)
             // 工作票下发
-            byteArray.startsWith(BleConst.RSP_SEND_WORK_TICKET) -> handleWorkTicketResult(bleBean, byteArray)
+            byteArray.startsWith(BleConst.RSP_SEND_WORK_TICKET) -> handleWorkTicketResult(bleBean, byteArray, loadingCallBack)
             // 获取设备工作票完成情况
             byteArray.startsWith(BleConst.RSP_WORK_TICKET_RESULT) && byteArray[3] == 0x02.toByte() ->
-                handleTicketStatus(bleBean.bleDevice, byteArray)
+                handleTicketStatus(bleBean.bleDevice, byteArray, loadingCallBack)
         }
     }
 
@@ -366,18 +371,20 @@ object BusinessManager {
      * job : 0x01:工作模式 0x02:待机模式
      * res : 0x01:成功 0x02:失败
      */
-    private fun handleSwitchModeResult(byteArray: ByteArray) {
+    private fun handleSwitchModeResult(byteArray: ByteArray, loadingCallBack: (Boolean, String?) -> Unit) {
         LogUtil.i("handleSwitchModeResult : ${byteArray.toHexStrings()}")
         val job = byteArray[4]
         val res = byteArray[5]
+        loadingCallBack.invoke(false, null)
     }
 
     /**
      * 工作票下发结果
      * res:0x00:成功 0x01:失败 0x02:传输超时 0x0D:当前IDX超出范围 0x0E:当前数据CRC校验失败 0x14:JSON结构错误 0x63:未知错误
      */
-    private fun handleWorkTicketResult(bleBean: BleBean, byteArray: ByteArray) {
+    private fun handleWorkTicketResult(bleBean: BleBean, byteArray: ByteArray, loadingCallBack: (Boolean, String?) -> Unit) {
         LogUtil.i("handleWorkTicketResult : ${byteArray.toHexStrings()}")
+        loadingCallBack.invoke(false, null)
         val idx = byteArray[4] + byteArray[5]
         val total = byteArray[6] + byteArray[7]
         val res = byteArray[8]
@@ -401,6 +408,7 @@ object BusinessManager {
                 })
         } else {
             // 下发完毕,切换工作模式
+            loadingCallBack.invoke(true, "切换钥匙为工作模式")
             BleCmdManager.switchMode(byteArrayOf(0x01), bleBean.bleDevice, object : CustomBleWriteCallback() {
                 override fun onPrompt(promptStr: String?) {}
 
@@ -419,9 +427,10 @@ object BusinessManager {
     /**
      * 处理工作票完成情况
      */
-    private fun handleTicketStatus(bleDevice: BleDevice, byteArray: ByteArray) {
+    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]

+ 2 - 1
app/src/main/java/com/grkj/iscs/activity/BleActivity.kt

@@ -230,7 +230,8 @@ class BleActivity : BaseActivity<ActivityBleBinding>() {
 
                     holder.setOnClickListener(R.id.sendTicket) {
 //                        val testStr = "{\"cardNo\":\"ACB13E0B\",\"data\":[{\"taskCode\":\"87654321110\",\"taskId\":\"587aa6cfcce940778836e512a10c330e\",\"dataList\":[{\"dataId\":1,\"target\":0,\"status\":0,\"closed\":1,\"equipRfidNo\":\"1DA0C66D031080\",\"infoRfidNo\":\"206BD295\"},{\"dataId\":2,\"target\":0,\"status\":0,\"closed\":1,\"equipRfidNo\":\"1DCAD26D031080\",\"infoRfidNo\":\"D074D295\"}],\"closed\":1}]}"
-                        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\"}]}"
+//                        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\"}]}"
+                        val testStr = "{\"cardNo\":\"267747D5\",\"data\":[{\"codeId\":1,\"dataList\":[{\"dataId\":0,\"equipRfidNo\":\"1DA0C66D031080\",\"target\":0},{\"dataId\":1,\"equipRfidNo\":\"1DCAD26D031080\",\"prevId\":0,\"target\":0}],\"taskCode\":\"202410290918\"}],\"effectiveTime\":24,\"lockList\":[{\"lockId\":\"1\",\"rfid\":\"706BD295\"},{\"lockId\":\"2\",\"rfid\":\"6CD295\"}]}"
                         BleCmdManager.sendWorkTicket(testStr, bleDevice = item?.bleDevice!!, callback = object : CustomBleWriteCallback() {
                             override fun onPrompt(promptStr: String?) {}
 

+ 2 - 2
app/src/main/java/com/grkj/iscs/ble/BleBean.kt

@@ -7,6 +7,6 @@ data class BleBean(
     var bleDevice: BleDevice,
     var token: ByteArray? = null,
     var fileSend: File? = null,
-    var ticketSend: String? = null,
-    var ticketStatus: ByteArray = byteArrayOf()
+    var ticketSend: String? = null,             // 下发的工作票
+    var ticketStatus: ByteArray = byteArrayOf() // 从钥匙拿的工作票
 )

+ 10 - 2
app/src/main/java/com/grkj/iscs/ble/BleCmdManager.kt

@@ -153,7 +153,7 @@ object BleCmdManager {
         val total = totalPackets.toByteArray()
 
         val data = if (idx == totalPackets - 1) {
-            json.toByteArray().copyOfRange(idx * 128, json.toByteArray().size - 1)
+            json.toByteArray().copyOfRange(idx * 128, totalLength)
         } else {
             json.toByteArray().copyOfRange(idx * 128, (idx + 1) * 128)
         }
@@ -178,6 +178,14 @@ object BleCmdManager {
         val idx = byteArray[4] + byteArray[5]
         val total = byteArray[6] + byteArray[7]
         val res = byteArray[8]
+        when (res) {
+            0x00.toByte() -> LogUtil.i("Work ticket send success")
+            0x01.toByte() -> LogUtil.i("Work ticket send fail")
+            0x02.toByte() -> LogUtil.i("Work ticket send timeout")
+            0x0D.toByte() -> LogUtil.i("Work ticket send idx out of range")
+            0x0E.toByte() -> LogUtil.i("Work ticket send data crc error")
+            0x14.toByte() -> LogUtil.i("Work ticket send json error")
+        }
         if (idx != total - 1 && (res == 0x00.toByte() || res == 0x02.toByte())) {
             // TODO 要判断res
             sendWorkTicket(
@@ -274,7 +282,7 @@ object BleCmdManager {
             BleUtil.instance?.getBleDeviceByMac(bleDevice.mac)?.let {
                 println("工作票完成接收 : ${String(it.ticketStatus)}")
                 // TODO 清空ticket
-//                it.ticket = byteArrayOf()
+                it.ticketStatus = byteArrayOf()
             }
         }
     }

+ 27 - 18
app/src/main/java/com/grkj/iscs/presentation/PresentationActivity.kt

@@ -3,6 +3,8 @@ package com.grkj.iscs.presentation
 import android.view.Gravity
 import android.widget.CheckBox
 import androidx.recyclerview.widget.LinearLayoutManager
+import com.google.gson.Gson
+import com.grkj.iscs.BusinessManager
 import com.grkj.iscs.R
 import com.grkj.iscs.base.BaseMvpActivity
 import com.grkj.iscs.databinding.ActivityPresentationBinding
@@ -47,7 +49,7 @@ class PresentationActivity :
             }
         })
 
-        mBinding?.siPersonLock?.mOptionList = PresentationManager.mLockerList
+        mBinding?.siPersonLock?.mOptionList = PresentationManager.mLockerList.map { it.name } as MutableList
         mBinding?.siPersonSafety?.mOptionList = PresentationManager.mSafetyList
 
         mBinding?.confirm?.setOnClickListener {
@@ -95,20 +97,6 @@ class PresentationActivity :
             ToastUtils.tip("请选择SOP")
             return
         }
-        // 蓝牙钥匙
-        val keyList = ModBusController.getKeyByDockType(DeviceConst.DOCK_TYPE_PORTABLE)
-        if (keyList.isNullOrEmpty()) {
-            ToastUtils.tip("没有找到钥匙")
-            return
-        }
-        val rfid = keyList[0].rfid
-        if (rfid.isNullOrEmpty()) {
-            ToastUtils.tip("没有找到钥匙的RFID")
-            return
-        }
-        BusinessManager.sendTicketBusiness(rfid, this) { b, s ->
-            handleLoading(b, s)
-        }
 
         // 锁
         val dockList = ModBusController.getDockByType(DeviceConst.DOCK_TYPE_PORTABLE)
@@ -131,14 +119,29 @@ class PresentationActivity :
             LogUtil.i("confirm开锁卡扣 : ${res.toHexStrings()}")
         }
 
-        createWorkTicket(lockList)
+        // 蓝牙钥匙
+        val keyList = ModBusController.getKeyByDockType(DeviceConst.DOCK_TYPE_PORTABLE)
+        if (keyList.isNullOrEmpty()) {
+            ToastUtils.tip("没有找到钥匙")
+            return
+        }
+        val rfid = keyList[0].rfid
+        if (rfid.isNullOrEmpty()) {
+            ToastUtils.tip("没有找到钥匙的RFID")
+            return
+        }
+        BusinessManager.ticketJson = createWorkTicket(lockList)
+        println("haha : ${BusinessManager.ticketJson}")
+        BusinessManager.sendTicketBusiness(rfid, this) { b, s ->
+            handleLoading(b, s)
+        }
     }
 
 
     /**
      * 创建工作票
      */
-    private fun createWorkTicket(lockList: List<DockBean.LockBean>) {
+    private fun createWorkTicket(lockList: List<DockBean.LockBean>): String {
         val ticket = WorkTicketBean()
         ticket.cardNo = cardRfid
         ticket.effectiveTime = 24
@@ -179,9 +182,15 @@ class PresentationActivity :
                 PresentationManager.mSopList[mSelectedSopIdx!!],
                 ticket,
                 mBinding?.tvStartTime?.text.toString(),
-                mBinding?.tvEndTime?.text.toString()
+                mBinding?.tvEndTime?.text.toString(),
+                0,
+                PresentationManager.mLockerList[mBinding?.siPersonLock?.mSelectIdx!!],
+                PresentationManager.mLockerTogetherList.filter { it.isChecked } as MutableList,
+                PresentationManager.mSafetyList[mBinding?.siPersonSafety?.mSelectIdx!!]
             )
         )
+
+        return Gson().toJson(ticket)
     }
 
 

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

@@ -33,6 +33,20 @@ class PresentationLoginActivity : BaseActivity<ActivityPresentationLoginBinding>
         println("Mac Json : $str")
         PresentationManager.cardList =
             Gson().fromJson(str, object : TypeToken<List<PresentationManager.PCardInfoBean>>() {}.type)
+        val lockerList = PresentationManager.cardList.filter { it.isLocker }
+        for (i in lockerList.indices) {
+            PresentationManager.mLockerList.add(PresentationManager.PLockerBean("上锁人${i + 1}", lockerList[i + 1].rfid))
+        }
+        val togetherList = PresentationManager.cardList.filter { !it.isLocker }
+        for (i in togetherList.indices) {
+            PresentationManager.mLockerTogetherList.add(
+                PresentationManager.PLockerTogetherBean(
+                    "共锁人${i + 1}",
+                    false,
+                    togetherList[i + 1].rfid
+                )
+            )
+        }
 
         handleLoading(true, "正在初始化设备...")
         BusinessManager.connectDock(1, true)

+ 12 - 5
app/src/main/java/com/grkj/iscs/presentation/PresentationManager.kt

@@ -32,21 +32,25 @@ object PresentationManager {
     )
 
     // 上锁人
-    val mLockerList = mutableListOf("上锁人1", "上锁人2", "上锁人3")
+//    val mLockerList = mutableListOf("上锁人1", "上锁人2", "上锁人3")
+    val mLockerList = mutableListOf<PLockerBean>()
     // 安全员
     val mSafetyList = mutableListOf("安全员1", "安全员2", "安全员3")
 
 
     // 共锁人
-    val mLockerTogetherList = mutableListOf(
-        PLockerTogetherBean("共锁人1", false, null),
-        PLockerTogetherBean("共锁人2", false, null)
-    )
+    val mLockerTogetherList = mutableListOf<PLockerTogetherBean>()
+//    val mLockerTogetherList = mutableListOf(
+//        PLockerTogetherBean("共锁人1", false, null),
+//        PLockerTogetherBean("共锁人2", false, null)
+//    )
 
     var workTicketList = mutableListOf<PServerTicket>()
 
     // 卡片信息
     data class PCardInfoBean(val rfid: String, val isLocker: Boolean)
+    // 上锁人
+    data class PLockerBean(val name: String, var rfid: String?)
     // 共锁人
     data class PLockerTogetherBean(var name: String? = null, var isChecked: Boolean = false, var rfid: String?)
     // 隔离点位
@@ -60,5 +64,8 @@ object PresentationManager {
         var startTime: String? = null,
         var endTime: String? = null,
         var status: Int? = null     // 0:待上锁 1:待上锁人上锁 2:部分共锁人上锁 3:待共锁人解锁 4:部分共锁人解锁 5:待上锁人解锁 6:已完成
+        var locker: PLockerBean? = null,    // 上锁人
+        var lockerTogetherList: MutableList<PLockerTogetherBean>? = null,  // 共锁人
+        var safety: String? = null  // 安全员
     )
 }

+ 2 - 0
app/src/main/java/com/grkj/iscs/widget/SelectableInput.kt

@@ -29,6 +29,7 @@ class SelectableInput(private val ctx: Context, attrs: AttributeSet) : LinearLay
     var mOptionList = mutableListOf<String>()
     private var isSkipListener: Boolean = true
     private var mSelectListener: OnSpinnerSelectListener? = null
+    var mSelectIdx: Int? = null
 
     init {
         val root = View.inflate(ctx, R.layout.layout_selectable_input, this)
@@ -118,6 +119,7 @@ class SelectableInput(private val ctx: Context, attrs: AttributeSet) : LinearLay
                         mBinding.et.setText(option)
                         mSelectListener?.onSelect(option, position)
                         mPopWindow?.dismiss()
+                        mSelectIdx = position
                     }
                 }
             }