LabelDialog.kt 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. package xn.hxp.weidith
  2. import android.annotation.SuppressLint
  3. import android.app.Activity
  4. import android.app.Dialog
  5. import android.content.IntentFilter
  6. import android.graphics.Color
  7. import android.graphics.drawable.ColorDrawable
  8. import android.hardware.usb.UsbManager
  9. import android.os.Bundle
  10. import android.os.Handler
  11. import android.os.Looper
  12. import android.os.Message
  13. import android.util.Log
  14. import android.view.*
  15. import android.widget.*
  16. import androidx.recyclerview.widget.LinearLayoutManager
  17. import androidx.recyclerview.widget.RecyclerView
  18. import xn.hxp.R
  19. import xn.hxp.comm.Constants
  20. import xn.hxp.receiver.OnSerialScanListener
  21. import xn.hxp.receiver.PortScanHelper
  22. import xn.hxp.receiver.UsbReceiver
  23. import xn.hxp.ui.PrintBean
  24. import xn.hxp.ui.adapter.CustomSpinnerAdapter
  25. import xn.hxp.ui.adapter.LabelDialogAdapter
  26. import com.blankj.utilcode.util.LogUtils
  27. import com.rc.httpcore.HttpConfig
  28. import com.rc.httpcore.bean.StockDetailsModel
  29. import org.greenrobot.eventbus.EventBus
  30. import org.greenrobot.eventbus.Subscribe
  31. import org.greenrobot.eventbus.ThreadMode
  32. import xn.hxp.utils.AudioPlayer
  33. import java.time.Instant
  34. import java.time.LocalDateTime
  35. import java.time.format.DateTimeFormatter
  36. //新增-入库-列表 弹框
  37. class LabelDialog(
  38. private val ac: Activity,
  39. private val number: String,
  40. private val layers: Int,
  41. private var density: String,
  42. private var chemicalName: String,
  43. private var ILin: IRfidClick
  44. ) : Dialog(ac) {
  45. private var listData: MutableList<StockDetailsModel>? = mutableListOf()
  46. private val mAdapter by lazy { LabelDialogAdapter() }
  47. private val mStoreyList = mutableListOf<String>() //层数
  48. private var mLayers = 1 //默认层数已选择的层数
  49. private var recyclerView: RecyclerView? = null
  50. private var butClos: Button? = null
  51. ///刷卡===============获取RFID 电子标签=====
  52. private var mUsbReceiver: UsbReceiver? = null // 刷卡广播注册
  53. private var mHandleScanEvent = false //当前是否已经获取过 usb返回的参数
  54. @SuppressLint("NewApi")
  55. private val formatter: DateTimeFormatter =
  56. DateTimeFormatter.ofPattern("yyMMddHHmmssSSS")
  57. @SuppressLint("NewApi")
  58. fun getCurrentDateTimeString(): String {
  59. return LocalDateTime.now().format(formatter)
  60. }
  61. private fun getLast8DigitsOfTimestamp(): String {
  62. val timestamp = System.currentTimeMillis().toString() // 获取当前时间戳并转换为字符串
  63. return if (timestamp.length >= 8) {
  64. timestamp.takeLast(8) // 获取字符串的最后8位
  65. } else {
  66. timestamp // 如果时间戳长度小于8位,返回完整的时间戳字符串
  67. }
  68. }
  69. override fun onStart() {
  70. super.onStart()
  71. EventBus.getDefault().register(this)
  72. }
  73. override fun onStop() {
  74. super.onStop()
  75. mPortScanHelper.onPause()
  76. ac.unregisterReceiver(mUsbReceiver)
  77. EventBus.getDefault().unregister(this)
  78. }
  79. init {
  80. requestWindowFeature(Window.FEATURE_NO_TITLE)
  81. setContentView(R.layout.label_dialogs)
  82. window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
  83. window?.setGravity(Gravity.CENTER)
  84. window?.setLayout(
  85. WindowManager.LayoutParams.MATCH_PARENT,
  86. WindowManager.LayoutParams.WRAP_CONTENT
  87. )
  88. // 设置点击外部空白处不关闭对话框
  89. setCanceledOnTouchOutside(false)
  90. }
  91. @SuppressLint("NewApi")
  92. override fun onCreate(savedInstanceState: Bundle?) {
  93. super.onCreate(savedInstanceState)
  94. registerUsbBroadcast()
  95. findViewById<TextView>(R.id.chemicalName).text = "$chemicalName"
  96. findViewById<TextView>(R.id.density).text = "净重:${density}"
  97. recyclerView = findViewById<RecyclerView>(R.id.rvView)
  98. //初始化柜子层数
  99. for (i in 1..layers) {
  100. mStoreyList.add("$i")
  101. }
  102. val sPinner = findViewById<Spinner>(R.id.sPinner)
  103. val customAdapter = CustomSpinnerAdapter(ac, mStoreyList)
  104. sPinner.adapter = customAdapter
  105. sPinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
  106. override fun onItemSelected(
  107. parent: AdapterView<*>?,
  108. view: View?,
  109. position: Int,
  110. id: Long
  111. ) {
  112. // 当用户选择某一项时被调用
  113. mLayers = mStoreyList[position].toInt()
  114. LogUtils.i("=======当前1选择 $mLayers")
  115. }
  116. override fun onNothingSelected(parent: AdapterView<*>?) {
  117. // 当没有任何项被选择时被调用
  118. LogUtils.i("=======DUOC")
  119. }
  120. }
  121. val toInt = number.toInt() + 1 //根据输入的数量 生成数据
  122. for (i in 1 until toInt) {
  123. // 在这里编写循环体的逻辑
  124. val currentDateTimeString = getCurrentDateTimeString()
  125. LogUtils.i("====CAS码生成 $number $currentDateTimeString")
  126. val takeLast = currentDateTimeString.takeLast(7)
  127. var wxCode = "${HttpConfig.API_BASE_QC_URL}?code=${takeLast}&type=9"
  128. var bean = StockDetailsModel(null, null, takeLast, i, wxCode)
  129. listData!!.add(bean)
  130. Thread.sleep(10)
  131. }
  132. val layoutManager = LinearLayoutManager(ac, LinearLayoutManager.VERTICAL, false)
  133. recyclerView!!.layoutManager = layoutManager
  134. recyclerView!!.adapter = mAdapter
  135. mAdapter.setNewInstance(listData)
  136. mAdapter.setOnItemChildClickListener { adapter, view, position ->
  137. // 在这里处理子View的点击事件
  138. when (view.id) {
  139. R.id.imgDelete -> {
  140. var count = 1
  141. mAdapter.data.removeAt(position)
  142. mAdapter.data.forEach {
  143. it.no = count
  144. count++
  145. }
  146. // mAdapter.notifyItemRemoved(position)
  147. mAdapter.notifyDataSetChanged()
  148. }
  149. }
  150. }
  151. findViewById<Button>(R.id.butClos).setOnClickListener {
  152. closHandle()
  153. dismiss()
  154. ILin.onItemClick(null, 1)
  155. }
  156. findViewById<Button>(R.id.determine).setOnClickListener {
  157. closHandle()
  158. if (mAdapter.data.size > 0) {
  159. var isOk = false
  160. mAdapter.data.forEach { it ->
  161. if (it.rfidCode != null) {
  162. isOk = true
  163. }
  164. }
  165. // val allNotNull = mAdapter.data.all { it.rfidCode != null }
  166. // if (allNotNull) {
  167. // println("所有数据的字段 a 都不为 null")
  168. // } else {
  169. // println("至少有一条数据的字段 a 为 null")
  170. // showToast("RFID不能为空")
  171. // return@setOnClickListener
  172. // }
  173. // dismiss()
  174. // ILin.onItemClick(mAdapter.data, mLayers)
  175. LogUtils.i("=======当前2选择 $mLayers")
  176. if (isOk) {
  177. val allNotNull = mAdapter.data.all { it.rfidCode != null }
  178. if (allNotNull) {
  179. println("所有数据的字段 a 都不为 null")
  180. } else {
  181. println("至少有一条数据的字段 a 为 null")
  182. showToast("RFID不能为空")
  183. return@setOnClickListener
  184. }
  185. dismiss()
  186. LogUtils.i("=======当前4选择 $mLayers")
  187. ILin.onItemClick(mAdapter.data, mLayers)
  188. } else {
  189. //直接需要判断是否打印标签
  190. dismiss()
  191. LogUtils.i("=======当前5选择 $mLayers")
  192. ILin.opTageCode(mAdapter.data, mLayers)
  193. }
  194. } else {
  195. dismiss()
  196. ILin.onItemClick(null, 1)
  197. }
  198. }
  199. AudioPlayer.getInstance().play(R.raw.saomiaobiaoqian)
  200. // customDialogView(0, "请扫描标签")
  201. butClos = findViewById<Button>(R.id.butClos)
  202. mCountDownHandler.removeMessages(Constants.WHAT_COUNT_DOWN_TWO)
  203. mCountDownHandler.sendEmptyMessage(Constants.WHAT_COUNT_DOWN_TWO)
  204. }
  205. private fun closHandle() {
  206. mCountDownHandler.removeMessages(Constants.WHAT_COUNT_DOWN_TWO)
  207. mCountDownHandler.removeCallbacksAndMessages(null)
  208. }
  209. private val mCountDownHandler = object : Handler(Looper.getMainLooper()) {
  210. override fun handleMessage(msg: Message) {
  211. if (Constants.WHAT_COUNT_DOWN_TWO == msg.what) {
  212. val countDown = Constants.OFFTIME_TIME - mCounter
  213. if (countDown <= 0) {
  214. dismiss()
  215. } else {
  216. sendEmptyMessageDelayed(Constants.WHAT_COUNT_DOWN_TWO, 1000)
  217. }
  218. mCounter++
  219. }
  220. }
  221. }
  222. interface IRfidClick {
  223. fun onItemClick(modelList: MutableList<StockDetailsModel>?, layer: Int)
  224. fun onPrint(tagCode: String, wxCode: String, rfidCode: String, position: Int) //回显需要打印的数据
  225. fun opTageCode(data: MutableList<StockDetailsModel>, layer: Int)//打印所有编码
  226. }
  227. override fun dispatchKeyEvent(event: KeyEvent): Boolean {
  228. if (event.keyCode == KeyEvent.KEYCODE_BACK) {
  229. // 在Dialog弹出时处理返回键事件
  230. // 处理完事件后返回true表示事件已经被消费,不再传递
  231. return true
  232. }
  233. mPortScanHelper.dispatchKeyEvent(event)
  234. return super.dispatchKeyEvent(event)
  235. }
  236. //必须写这个方法 防止注册失败
  237. @Subscribe(threadMode = ThreadMode.MAIN)
  238. fun onUpdateEventEvent(event: KeyEvent) {
  239. }
  240. private var mCounter = 0
  241. private val mPortScanHelper by lazy {
  242. PortScanHelper(ac, object : OnSerialScanListener {
  243. override fun dispatchScanEvent(type: OnSerialScanListener.ScanType, rfid: String) {
  244. mCounter = 0
  245. if (!mHandleScanEvent) {
  246. if (rfid.isNotBlank()) {
  247. LogUtils.i("========aa==当前rfid返回参数$rfid")
  248. mHandleScanEvent = true
  249. var isOk = false
  250. mAdapter.data.forEachIndexed { index, stockDetailsModel ->
  251. if (stockDetailsModel.rfidCode != null && stockDetailsModel.rfidCode.equals(
  252. rfid
  253. )
  254. ) {
  255. showToast("RFID不能重复")
  256. mHandleScanEvent = false
  257. isOk = true
  258. return@forEachIndexed
  259. }
  260. }
  261. if (isOk == false) {
  262. upViewRfid(rfid)
  263. }
  264. }
  265. }
  266. }
  267. })
  268. }
  269. //刷卡usb链接
  270. private fun registerUsbBroadcast() {
  271. if (null == mUsbReceiver) {
  272. val filter = IntentFilter().apply {
  273. addAction(UsbReceiver.ACTION_USB_PERMISSION)
  274. addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED)
  275. addAction(UsbManager.ACTION_USB_DEVICE_DETACHED)
  276. addAction(UsbReceiver.ACTION_USB_STATE) // usb连接状态广播
  277. }
  278. mUsbReceiver = UsbReceiver()
  279. ac.registerReceiver(mUsbReceiver, filter)
  280. }
  281. }
  282. //更新Rfid
  283. fun upViewRfid(rfid: String) {
  284. var tagCode: String = ""
  285. var wxCode: String = ""
  286. var rfidCode: String = ""
  287. var position = -1
  288. for (index in mAdapter.data.indices) {
  289. if (mAdapter.data[index].rfidCode == null) {
  290. mAdapter.data[index].rfidCode = rfid
  291. tagCode = mAdapter.data[index].tagCode!!
  292. wxCode = mAdapter.data[index].wxCode!!
  293. rfidCode = mAdapter.data[index].rfidCode!!
  294. position = index
  295. LogUtils.i("====下标 ${index + 1} ${mAdapter.data.size}")
  296. mHandleScanEvent = false
  297. if (index + 1 == mAdapter.data.size) {
  298. //没有内容需要打印
  299. mHandleScanEvent = true
  300. }
  301. break
  302. }
  303. }
  304. mAdapter.notifyDataSetChanged()
  305. val isOk = mAdapter.data.lastOrNull()
  306. if (!mHandleScanEvent || (mHandleScanEvent && isOk!!.rfidCode != null)) {
  307. LogUtils.i("打印回调========")
  308. //回调打印
  309. ILin.onPrint(tagCode, wxCode, rfidCode, position)
  310. }
  311. }
  312. // 在自定义对话框类中定义一个方法来显示 Toast 消息
  313. fun showToast(message: String) {
  314. Toast.makeText(ac, message, Toast.LENGTH_SHORT).show()
  315. }
  316. /**
  317. * 0 没有图标 1 绿色(成功) 2红色(失败)
  318. * 失败或者成功的弹框
  319. */
  320. private fun customDialogView(types: Int, msg: String) {
  321. val customDialog = CustomDialog(ac, types, msg)
  322. customDialog.show()
  323. }
  324. fun getRfidTag(position: Int) {
  325. //不能打印
  326. mHandleScanEvent = false
  327. mAdapter.data[position].rfidCode = null
  328. // mAdapter.setData(position, mAdapter.data[position])
  329. mAdapter.notifyDataSetChanged()
  330. }
  331. fun printingCom() {
  332. dismiss()
  333. ILin.onItemClick(mAdapter.data, mLayers)
  334. }
  335. override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
  336. // 在触摸事件发生时被调用
  337. when (ev.action) {
  338. MotionEvent.ACTION_DOWN -> {
  339. // 用户按下屏幕时的处理逻辑
  340. onUserInteraction()
  341. }
  342. MotionEvent.ACTION_MOVE -> {
  343. // 用户在屏幕上移动手指时的处理逻辑
  344. }
  345. MotionEvent.ACTION_UP -> {
  346. // 用户抬起手指时的处理逻辑
  347. }
  348. }
  349. return super.dispatchTouchEvent(ev)
  350. }
  351. private fun onUserInteraction() {
  352. // 在用户与对话框交互时的逻辑处理
  353. LogUtils.i("=========弹框触发了")
  354. mCounter = 0
  355. }
  356. }