PresentationActivity.kt 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. package com.grkj.iscs.presentation
  2. import android.view.Gravity
  3. import android.widget.CheckBox
  4. import androidx.recyclerview.widget.LinearLayoutManager
  5. import com.clj.fastble.BleManager
  6. import com.google.gson.Gson
  7. import com.grkj.iscs.BusinessManager
  8. import com.grkj.iscs.R
  9. import com.grkj.iscs.base.BaseMvpActivity
  10. import com.grkj.iscs.databinding.ActivityPresentationBinding
  11. import com.grkj.iscs.extentions.toHexStrings
  12. import com.grkj.iscs.modbus.DockBean
  13. import com.grkj.iscs.modbus.ModBusController
  14. import com.grkj.iscs.model.DeviceConst
  15. import com.grkj.iscs.model.WorkTicketBean
  16. import com.grkj.iscs.util.ToastUtils
  17. import com.grkj.iscs.util.log.LogUtil
  18. import com.grkj.iscs.widget.SelectableInput
  19. import com.manu.mdatepicker.MDatePicker
  20. import com.zhy.adapter.recyclerview.CommonAdapter
  21. import com.zhy.adapter.recyclerview.base.ViewHolder
  22. import java.text.SimpleDateFormat
  23. import java.util.Date
  24. import java.util.stream.Collectors
  25. class PresentationActivity :
  26. BaseMvpActivity<IPresentationView, PresentationPresenter, ActivityPresentationBinding>() {
  27. private var cardRfid: String? = null
  28. private var mSelectedSopIdx: Int? = null
  29. override val viewBinding: ActivityPresentationBinding
  30. get() = ActivityPresentationBinding.inflate(layoutInflater)
  31. override fun initView() {
  32. cardRfid = intent.getStringExtra("card")
  33. mBinding?.siSop?.mOptionList = PresentationManager.mSopList.stream().map { it.sop }.collect(Collectors.toList())
  34. mBinding?.siSop?.setOnSpinnerSelectListener(object : SelectableInput.OnSpinnerSelectListener {
  35. override fun onSelect(str: String?, index: Int) {
  36. mSelectedSopIdx = index
  37. val sop = PresentationManager.mSopList[index]
  38. mBinding?.siWorkshop?.setText(sop.workshop)
  39. mBinding?.siLine?.setText(sop.line)
  40. mBinding?.siTicketName?.setText(sop.ticketName)
  41. mBinding?.siTicketNumber?.setText(sop.ticketNumber)
  42. mBinding?.siTicketType?.setText(sop.type)
  43. mBinding?.siSegregationPoint?.setText(sop.pointList.map { it.name }.toString())
  44. }
  45. })
  46. mBinding?.siPersonLock?.mOptionList = PresentationManager.mLockerList.map { it.name } as MutableList
  47. mBinding?.siPersonSafety?.mOptionList = PresentationManager.mSafetyList
  48. mBinding?.confirm?.setOnClickListener {
  49. confirm()
  50. }
  51. mBinding?.tvStartTime?.setOnClickListener {
  52. MDatePicker.create(this)
  53. .setCanceledTouchOutside(true)
  54. .setGravity(Gravity.CENTER)
  55. .setSupportTime(true)
  56. .setTwelveHour(false)
  57. .setOnDateResultListener {
  58. mBinding?.tvStartTime?.text = SimpleDateFormat("yyyy-MM-dd HH:mm").format(Date(it))
  59. }
  60. .build().show()
  61. }
  62. mBinding?.tvEndTime?.setOnClickListener {
  63. MDatePicker.create(this)
  64. .setCanceledTouchOutside(true)
  65. .setGravity(Gravity.CENTER)
  66. .setSupportTime(true)
  67. .setTwelveHour(false)
  68. .setOnDateResultListener {
  69. mBinding?.tvEndTime?.text = SimpleDateFormat("yyyy-MM-dd HH:mm").format(Date(it))
  70. }
  71. .build().show()
  72. }
  73. (mBinding?.rvLockerTogether?.layoutManager as LinearLayoutManager).orientation = LinearLayoutManager.HORIZONTAL
  74. mBinding?.rvLockerTogether?.adapter = object : CommonAdapter<PresentationManager.PLockerTogetherBean>(this, R.layout.item_rv_locker_together, PresentationManager.mLockerTogetherList) {
  75. override fun convert(holder: ViewHolder, data: PresentationManager.PLockerTogetherBean, position: Int) {
  76. holder.setText(R.id.tv_name, data.name)
  77. holder.setChecked(R.id.cb, data.isChecked)
  78. holder.getView<CheckBox>(R.id.cb).setOnCheckedChangeListener { _, b ->
  79. data.isChecked = b
  80. }
  81. }
  82. }
  83. }
  84. private fun confirm() {
  85. if (mSelectedSopIdx == null) {
  86. ToastUtils.tip("请选择SOP")
  87. return
  88. }
  89. // 锁
  90. val dockList = ModBusController.getDockByType(DeviceConst.DOCK_TYPE_PORTABLE)
  91. if (dockList.isEmpty()) {
  92. ToastUtils.tip("没有找到移动柜")
  93. return
  94. }
  95. val lockList = dockList[0].getLockList().take(2)
  96. if (lockList.isEmpty()) {
  97. ToastUtils.tip("没有找到移动柜的锁")
  98. return
  99. }
  100. if (lockList.size < 2) {
  101. ToastUtils.tip("移动柜的锁数量不够2个")
  102. return
  103. }
  104. val lockIdxList = lockList.map { it.idx } as MutableList
  105. // 蓝牙钥匙
  106. val keyList = ModBusController.getKeyByDockType(DeviceConst.DOCK_TYPE_PORTABLE)
  107. if (keyList.isNullOrEmpty()) {
  108. ToastUtils.tip("没有找到钥匙")
  109. return
  110. }
  111. val rfid = keyList[0].rfid
  112. if (rfid.isNullOrEmpty()) {
  113. ToastUtils.tip("没有找到钥匙的RFID")
  114. return
  115. }
  116. // 创建工单
  117. if (mBinding?.siPersonLock?.mSelectIdx == null) {
  118. ToastUtils.tip("请选择上锁人")
  119. return
  120. }
  121. BusinessManager.ticketJson = createWorkTicket(lockList)
  122. // 操作设备
  123. ModBusController.controlLockBuckle(true, dockList[0].addr.toInt() - 1, lockIdxList) { res ->
  124. LogUtil.i("confirm开锁卡扣 : ${res.toHexStrings()}")
  125. }
  126. BusinessManager.sendTicketBusiness(PresentationManager.keyMac, this) { b, s ->
  127. handleLoading(b, s)
  128. if (s.equals("切换工作模式成功")) {
  129. ModBusController.controlKeyBuckle(true, isLeft = true, dockList[0].addr.toInt() - 1)
  130. }
  131. }
  132. }
  133. /**
  134. * 创建工作票
  135. */
  136. private fun createWorkTicket(lockList: List<DockBean.LockBean>): String {
  137. val ticket = WorkTicketBean()
  138. ticket.cardNo = cardRfid
  139. ticket.effectiveTime = 24
  140. ticket.data = mutableListOf()
  141. val dataDTO = WorkTicketBean.DataDTO()
  142. dataDTO.taskCode = SimpleDateFormat("yyyyMMddHHmm").format(Date(System.currentTimeMillis()))
  143. dataDTO.taskId = "123456"
  144. dataDTO.codeId = PresentationManager.workTicketList.size + 1
  145. dataDTO.dataList = mutableListOf()
  146. val pointList = PresentationManager.mSopList[mSelectedSopIdx!!].pointList
  147. for (i in pointList.indices) {
  148. val dataListDTO = WorkTicketBean.DataDTO.DataListDTO()
  149. dataListDTO.dataId = i
  150. dataListDTO.equipRfidNo = pointList[i].rfid
  151. dataListDTO.target = 0
  152. if (i != 0) {
  153. dataListDTO.prevId = i - 1
  154. }
  155. dataDTO.dataList?.add(dataListDTO)
  156. }
  157. ticket.data?.add(dataDTO)
  158. ticket.lockList = mutableListOf()
  159. for (i in lockList.indices) {
  160. val lockListDTO = WorkTicketBean.LockListDTO()
  161. lockListDTO.lockId = "${i + 1}"
  162. lockListDTO.rfid = lockList[i].rfid
  163. ticket.lockList?.add(lockListDTO)
  164. }
  165. PresentationManager.workTicketList.add(
  166. PresentationManager.PServerTicket(
  167. PresentationManager.workTicketList.size + 1,
  168. PresentationManager.mSopList[mSelectedSopIdx!!].sopId,
  169. PresentationManager.mSopList[mSelectedSopIdx!!],
  170. ticket,
  171. mBinding?.tvStartTime?.text.toString(),
  172. mBinding?.tvEndTime?.text.toString(),
  173. 0,
  174. PresentationManager.mLockerList[mBinding?.siPersonLock?.mSelectIdx!!],
  175. PresentationManager.mLockerTogetherList.filter { it.isChecked } as MutableList,
  176. PresentationManager.mSafetyList[mBinding?.siPersonSafety?.mSelectIdx!!]
  177. )
  178. )
  179. return Gson().toJson(ticket)
  180. }
  181. override fun initPresenter(): PresentationPresenter {
  182. return PresentationPresenter()
  183. }
  184. }