AddedChemicalsActivity.kt 75 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913
  1. package com.example.chemical.ui.newly
  2. import android.app.Activity
  3. import android.content.Context
  4. import android.content.Intent
  5. import android.content.IntentFilter
  6. import android.graphics.Rect
  7. import android.hardware.usb.UsbManager
  8. import android.os.Bundle
  9. import android.os.CountDownTimer
  10. import android.os.Handler
  11. import android.os.Looper
  12. import android.view.KeyEvent
  13. import android.view.LayoutInflater
  14. import android.view.View
  15. import android.view.ViewGroup
  16. import android.view.ViewTreeObserver
  17. import android.view.inputmethod.InputMethodManager
  18. import android.widget.ArrayAdapter
  19. import android.widget.EditText
  20. import android.widget.TextView
  21. import android.widget.Toast
  22. import androidx.lifecycle.lifecycleScope
  23. import androidx.recyclerview.widget.LinearLayoutManager
  24. import com.bumptech.glide.Glide
  25. import com.bumptech.glide.load.engine.DiskCacheStrategy
  26. import com.bumptech.glide.request.RequestOptions
  27. import com.caysn.autoreplyprint.AutoReplyPrint
  28. import com.example.chemical.ChemicalApp
  29. import com.example.chemical.R
  30. import com.example.chemical.blu.BluetoothConnectionManager
  31. import com.example.chemical.comm.Constants
  32. import com.example.chemical.databinding.ActivityAddedChemicalsBinding
  33. import com.example.chemical.receiver.OnSerialScanListener
  34. import com.example.chemical.receiver.PortScanHelper
  35. import com.example.chemical.receiver.UsbReceiver
  36. import com.example.chemical.ui.PrintBean
  37. import com.example.chemical.ui.SplashActivity
  38. import com.example.chemical.ui.adapter.ChemicalsAdapter
  39. import com.example.chemical.ui.common.BaseCountDownActivity
  40. import com.example.chemical.ui.verify.TwoVerificationActivity
  41. import com.example.chemical.utils.BitmapUtils
  42. import com.example.chemical.utils.ButtonDebouncer
  43. import com.example.chemical.utils.ConversionUtils
  44. import com.example.chemical.utils.HandlerUtil
  45. import com.example.chemical.utils.MediaPlayerHelper
  46. import com.example.chemical.utils.SharedPreferencesHelper
  47. import com.example.chemical.utils.TimeUpdater
  48. import com.example.chemical.utils.UiManager
  49. import com.example.chemical.weidith.BelongingPersonDialog
  50. import com.example.chemical.weidith.ChemicalTypeDialog
  51. import com.example.chemical.weidith.CustomDialog
  52. import com.example.chemical.weidith.DcaeDialog
  53. import com.example.chemical.weidith.LabelDialog
  54. import com.example.chemical.weidith.PackingDialog
  55. import com.example.chemical.weidith.SelectTopicDialog
  56. import com.example.chemical.weidith.StorageDialog
  57. import com.example.chemical.weidith.WeighDialog
  58. import com.rc.core.log.RcLog
  59. import com.rc.httpcore.HttpConfig
  60. import com.rc.httpcore.bean.BelongingPersonBean
  61. import com.rc.httpcore.bean.ChemicalABean
  62. import com.rc.httpcore.bean.ChemicalConfsBean
  63. import com.rc.httpcore.bean.ChemicalInfoBean
  64. import com.rc.httpcore.bean.ChemicalSearchBean
  65. import com.rc.httpcore.bean.ChemicalTypeBean
  66. import com.rc.httpcore.bean.LockVoListBean
  67. import com.rc.httpcore.bean.RuleBean
  68. import com.rc.httpcore.bean.StockDetailsModel
  69. import com.rc.httpcore.bean.StockModeBean
  70. import com.rc.httpcore.bean.StockModel
  71. import com.rc.httpcore.bean.TopicDataBean
  72. import com.rc.httpcore.client.ApiRepository
  73. import com.rc.httpcore.exception.NetException
  74. import com.sun.jna.Pointer
  75. import kotlinx.coroutines.Dispatchers
  76. import kotlinx.coroutines.delay
  77. import kotlinx.coroutines.launch
  78. import kotlinx.coroutines.withContext
  79. import org.greenrobot.eventbus.EventBus
  80. import org.greenrobot.eventbus.Subscribe
  81. import org.greenrobot.eventbus.ThreadMode
  82. import retrofit2.HttpException
  83. import java.math.BigDecimal
  84. import java.net.ConnectException
  85. import java.net.SocketTimeoutException
  86. import java.nio.charset.StandardCharsets
  87. /**
  88. * 新增入库 全新 包装0 已开封 可输入包装值
  89. * AutoCompleteTextView
  90. */
  91. class AddedChemicalsActivity : BaseCountDownActivity<ActivityAddedChemicalsBinding>() {
  92. private lateinit var timeUpdater: TimeUpdater
  93. private val mAdapter by lazy { ChemicalsAdapter(this) }
  94. private lateinit var modelA: ChemicalABean //新增-点击确定 需要的参数
  95. private var mLabelDialog: LabelDialog? = null
  96. private var mWeighDialog: WeighDialog? = null
  97. private var mChemicalInfoBean: ChemicalInfoBean? = null
  98. private var mListData: List<RuleBean>? = null //柜子信息
  99. private var mPrintTag = 0 //需要打印得内容条数
  100. private var mStockDetailsModel: MutableList<StockDetailsModel>? = null
  101. //刷卡
  102. private var mUsbReceiver: UsbReceiver? = null // 刷卡广播注册
  103. private var mHandleScanEvent = false //当前是否已经获取过 usb返回的参数
  104. private var mUserId: String? = null //归属人id
  105. // private val REQUEST_CODE = 6
  106. private var mCabinetId = "" //柜子id
  107. private var mCabinetName = "" //柜子名称
  108. // private var mUnlockingMethod = 1 //1无锁,2是智能锁,3是钥匙柜
  109. private var mLayers = 1 //柜子一共层数
  110. private var mLayersTow = 1 //柜子选择层数
  111. private var mDoorId: String = ""
  112. private var mDoorName = "" //柜门名称
  113. private var mLockNum: String = ""
  114. private var mChemicalId: String? = null
  115. private var chemTypeIsBoo = true
  116. private var mWeighingValue: EditText? = null
  117. private var mStockModeBean = StockModeBean(mutableListOf())
  118. private var mStockModelList = mutableListOf<StockModel>()
  119. private var mCabinetLockVoList: List<LockVoListBean>? = null //柜锁会又多个
  120. private var mLockStr = ArrayList<String>() // 需要打开得柜锁数量
  121. private val handlerUtil = HandlerUtil.getInstance()
  122. private val handlerPrint = HandlerUtil.getInstance()
  123. private var mJoinType = 1 //称重方式 1 称重,2 录入 提交
  124. private lateinit var mChemicalConfsBean: ChemicalConfsBean //获取化学品的称重超过比例or
  125. private var h = Pointer.NULL
  126. private var pritBot = false
  127. private var mWeighing: String? = null //记录上次数
  128. private var isClisLit = false //是否点击称重关闭按钮
  129. //厂家信息
  130. private var mOptionsList = mutableListOf<String>()
  131. override fun createViewBinding() =
  132. ActivityAddedChemicalsBinding.inflate(LayoutInflater.from(this))
  133. override fun initViews(savedInstanceState: Bundle?) {
  134. super.initViews(savedInstanceState)
  135. initTitle()
  136. inAdapter()//初始化适配器
  137. EventBus.getDefault().register(this)
  138. searchProducer()
  139. viewBinding.edName.setText("${ChemicalApp.userData!!.userName}-${ChemicalApp.userData!!.account}")
  140. viewBinding.tvReturn.text = "返回${ChemicalApp.confs!!.backTime}s"
  141. mUserId = ChemicalApp.userData!!.userId
  142. viewBinding.tvOutLogin.setOnClickListener {
  143. callLogoutApi {
  144. ChemicalApp.userData = null
  145. // HttpClient.token = null
  146. ChemicalApp.subjectId = null
  147. UiManager.switcherCashier(this, SplashActivity::class.java)
  148. }
  149. }
  150. // 责任人 校院管理员
  151. RcLog.info("==当前人员权限===${ChemicalApp.responsibles} ${ChemicalApp.administrators}")
  152. if (!ChemicalApp.administrators) { //不是校级院级管理员
  153. viewBinding.butUnregulated.isChecked = true
  154. viewBinding.butControl.isChecked = false //取消默认选中
  155. viewBinding.butControl.isEnabled = false //禁止点击
  156. }
  157. viewBinding.tvReturn.setOnClickListener {
  158. finish()
  159. }
  160. //品名搜索
  161. viewBinding.butPSearch.setOnClickListener {
  162. viewBinding.packNum.setText("")
  163. if (viewBinding.chemicalName.text.toString().isNotEmpty()) {
  164. // chemicalLevel //管控 1 非管控 2
  165. if (ChemicalApp.responsibles) { //非管控 类型查询
  166. searchChemica(viewBinding.chemicalName.text.toString(), "2")
  167. } else {
  168. searchChemica(viewBinding.chemicalName.text.toString(), null)
  169. }
  170. } else {
  171. showToast("请输入化学品名称")
  172. }
  173. }
  174. viewBinding.imgPosition.setOnClickListener {
  175. //更换柜子信息
  176. storageDialogView()
  177. }
  178. viewBinding.butOpen.setOnClickListener {
  179. //再次打开柜门
  180. if (mCabinetLockVoList != null && mCabinetLockVoList!!.size > 0) {
  181. mLockStr.clear()
  182. mCabinetLockVoList!!.forEach { it ->
  183. when (it.unlockingMethod) {
  184. 2 -> { //智能锁
  185. mLockStr.add("${it.lockNum}")
  186. }
  187. }
  188. }
  189. if (mLockStr != null && mLockStr.size > 0) {
  190. openLock(mLockStr)
  191. } else {
  192. subAddData(0)
  193. }
  194. } else {
  195. subAddData(0)
  196. }
  197. }
  198. //CAS号 搜索
  199. viewBinding.butCSearch.setOnClickListener {
  200. viewBinding.packNum.setText("")
  201. if (viewBinding.casNum.text.toString().isNotEmpty()) {
  202. RcLog.info("==当前人员权限=2==${ChemicalApp.responsibles} ${ChemicalApp.administrators}")
  203. if (ChemicalApp.responsibles) {
  204. searchChemica(viewBinding.casNum.text.toString(), "2")
  205. } else {
  206. searchChemica(viewBinding.casNum.text.toString(), null)
  207. }
  208. } else {
  209. showToast("请输入CAS号")
  210. }
  211. }
  212. //类别
  213. viewBinding.chemType.setOnClickListener {
  214. if (chemTypeIsBoo == false) {
  215. return@setOnClickListener
  216. }
  217. showLoading("查询中...")
  218. val disposable = ApiRepository.getOptions("chemicals_category")
  219. .subscribe({ data ->
  220. dismissLoading()
  221. val chemDialog = ChemicalTypeDialog(
  222. this,
  223. data.toMutableList(),
  224. object : ChemicalTypeDialog.IonClickListener {
  225. override fun onClick(data: ChemicalTypeBean) {
  226. // showToast("${data.label} ${data.itemId}")
  227. viewBinding.chemType.text = "${data.label}"
  228. viewBinding.chemType.tag = "${data.value}"
  229. }
  230. })
  231. if (!chemDialog.isShowing) {
  232. chemDialog.show()
  233. }
  234. }, { throwable ->
  235. dismissLoading()
  236. showNetError(throwable)
  237. })
  238. addDisposable(disposable)
  239. }
  240. //通过 姓名or工号 搜索 归属人信息
  241. viewBinding.butName.setOnClickListener {
  242. val edName = viewBinding.edName.text.toString()
  243. if (edName.isNotBlank()) {
  244. showLoading("查询中...")
  245. val disposable = ApiRepository.getSelects(edName)
  246. .subscribe({ data ->
  247. dismissLoading()
  248. val dialogs =
  249. BelongingPersonDialog(
  250. this,
  251. data,
  252. object : BelongingPersonDialog.IClickLit {
  253. override fun onClickUserId(dataBean: BelongingPersonBean) {
  254. //归属人 id 用于查询课题组信息
  255. mUserId = dataBean.userId
  256. viewBinding.edName.setText("${dataBean.userName}-${dataBean.account}")
  257. // viewBinding.topicName.tag = "${dataBean.userId}"
  258. }
  259. })
  260. dialogs.show()
  261. }, { throwable ->
  262. dismissLoading()
  263. showNetError(throwable)
  264. })
  265. addDisposable(disposable)
  266. } else {
  267. showToast("姓名或工号不能为空")
  268. }
  269. }
  270. //课题组信息查询
  271. viewBinding.topic.setOnClickListener {
  272. if (mUserId == null) {
  273. showToast("未选择归属人")
  274. return@setOnClickListener
  275. }
  276. showLoading("查询中...")
  277. val disposable = ApiRepository.getTopicList(mUserId!!)
  278. .subscribe({ data ->
  279. dismissLoading()
  280. var dialog =
  281. SelectTopicDialog(this, data, object : SelectTopicDialog.IonItemLint {
  282. override fun onItem(topicDataBean: TopicDataBean) {
  283. viewBinding.topicName.text = "${topicDataBean.topicName}"
  284. viewBinding.topicName.tag = "${topicDataBean.topicId}"
  285. }
  286. })
  287. dialog.show()
  288. }, { throwable ->
  289. dismissLoading()
  290. showNetError(throwable)
  291. })
  292. addDisposable(disposable)
  293. }
  294. //包装类型
  295. viewBinding.specType.setOnClickListener {
  296. showLoading("查询中...")
  297. val disposable = ApiRepository.getOptions("chemical_pack_utils")
  298. .subscribe({ data ->
  299. dismissLoading()
  300. val packingDialog =
  301. PackingDialog(this, data, object : PackingDialog.IonClickListener {
  302. override fun onClick(model: ChemicalTypeBean) {
  303. viewBinding.packUnit.text = model.label
  304. }
  305. })
  306. packingDialog.show()
  307. }, { throwable ->
  308. dismissLoading()
  309. showNetError(throwable)
  310. })
  311. addDisposable(disposable)
  312. }
  313. viewBinding.butResetting.setOnClickListener {
  314. //重置
  315. emptyViews()
  316. }
  317. val rootView = viewBinding.contents
  318. // 设置全局布局监听器
  319. rootView.viewTreeObserver.addOnGlobalLayoutListener(object :
  320. ViewTreeObserver.OnGlobalLayoutListener {
  321. private val visibleThreshold = 100 // 软键盘显示的阈值,可以根据需要调整
  322. override fun onGlobalLayout() {
  323. val rect = Rect()
  324. rootView.getWindowVisibleDisplayFrame(rect)
  325. // 获取屏幕高度
  326. val screenHeight = rootView.height
  327. // 计算键盘高度
  328. val keypadHeight = screenHeight - rect.bottom
  329. // 如果键盘高度大于一个阈值,判断为键盘显示
  330. val isKeyboardVisible = keypadHeight > visibleThreshold
  331. if (isKeyboardVisible) {
  332. // 键盘显示时,可以进一步判断焦点是否在EditText上
  333. val focusedView = currentFocus
  334. if (focusedView is EditText) {
  335. mHandleScanEvent = true
  336. }
  337. } else {
  338. //软键盘 隐藏
  339. }
  340. }
  341. })
  342. // //选择柜子信息
  343. // viewBinding.cabinet.setOnClickListener {
  344. // storageDialogView()
  345. // }
  346. //全新
  347. viewBinding.tvThe.setOnClickListener {
  348. viewBinding.tvTwo.isChecked = false
  349. viewBinding.packNum.isEnabled = false
  350. viewBinding.packNum.setText("")
  351. }
  352. //已开封
  353. viewBinding.tvTwo.setOnClickListener {
  354. viewBinding.tvThe.isChecked = false
  355. viewBinding.packNum.isEnabled = true
  356. }
  357. //====规格 g
  358. viewBinding.bugCationsLeft.setOnClickListener {
  359. viewBinding.bugCationsRight.isChecked = false
  360. viewBinding.packUnit.text = "件"
  361. }
  362. //====规格 ml
  363. viewBinding.bugCationsRight.setOnClickListener {
  364. viewBinding.bugCationsLeft.isChecked = false
  365. viewBinding.packUnit.text = "瓶"
  366. }
  367. //管控
  368. viewBinding.butControl.setOnClickListener {
  369. viewBinding.butUnregulated.isChecked = false
  370. }
  371. //非管控
  372. viewBinding.butUnregulated.setOnClickListener {
  373. viewBinding.butControl.isChecked = false
  374. }
  375. //根据规格值 查询最近一个包装值
  376. viewBinding.packNum.setOnFocusChangeListener { view, hasFocus ->
  377. if (hasFocus) {
  378. RcLog.info("=======1")
  379. val checked = viewBinding.tvTwo.isChecked
  380. if (checked) {
  381. //已开封
  382. val toString = viewBinding.specNum.text.toString()
  383. if (toString.isNotEmpty()) {
  384. RcLog.info("=======2")
  385. searchSpecView(toString)
  386. }
  387. }
  388. }
  389. }
  390. ButtonDebouncer.setDebouncedOnClickListener(viewBinding.butDetermine, 500L) {
  391. var isNew = true
  392. val checkedB = viewBinding.tvTwo.isChecked //已开封
  393. if (checkedB) {
  394. isNew = false
  395. }
  396. val chemicalName = viewBinding.chemicalName.text.toString().trim()
  397. if (chemicalName.isEmpty()) {
  398. showToast("化学品名称不能为空")
  399. return@setDebouncedOnClickListener
  400. }
  401. var casNum: String? = null
  402. if (viewBinding.casNum.text.toString().trim().isNotEmpty()) {
  403. casNum = viewBinding.casNum.text.toString().trim()
  404. }
  405. val chemicalCategory = try {
  406. viewBinding.chemType.tag.toString()
  407. } catch (e: Exception) {
  408. showToast("类别不能为空")
  409. return@setDebouncedOnClickListener
  410. }
  411. var chemicalPurity: String? = null
  412. // val chemicalPurity = viewBinding.chemicalPurity.text.toString().trim() //纯度
  413. val chemicalDensity = viewBinding.chemicalDensity.text.toString().trim()//密度
  414. if (viewBinding.chemicalPurity.text.toString().trim().isNotEmpty()) {
  415. chemicalPurity = viewBinding.chemicalPurity.text.toString().trim()
  416. }
  417. if (chemicalDensity.isEmpty()) {
  418. showToast("密度不能为空")
  419. return@setDebouncedOnClickListener
  420. }
  421. var chemicalLevel = 1 //管控
  422. //非管控
  423. if (viewBinding.butUnregulated.isChecked) {
  424. chemicalLevel = 2
  425. }
  426. var belongName = viewBinding.edName.text.toString().trim() //归属人
  427. var belongId: String? = null
  428. if (belongName.isEmpty()) {
  429. showToast("归属人不能为空")
  430. return@setDebouncedOnClickListener
  431. }
  432. belongId = mUserId //归属人id
  433. val topicName = viewBinding.topicName.text.toString().trim() //课题组 名称
  434. if (topicName.isNotBlank()) {
  435. belongName = topicName
  436. belongId = viewBinding.topicName.tag.toString() //课题组id
  437. }
  438. val chemicalNumber = viewBinding.number.text.toString().trim()//数量
  439. if (chemicalNumber.isEmpty()) {
  440. showToast("数量不能为空")
  441. return@setDebouncedOnClickListener
  442. }
  443. val factory = viewBinding.edManufacturer.text.toString().trim() //生产厂家
  444. var packNum = viewBinding.packNum.text.toString().trim() //包装值
  445. if (viewBinding.packNum.isEnabled) {
  446. if (packNum.isEmpty()) {
  447. showToast("包装不能为空")
  448. return@setDebouncedOnClickListener
  449. }
  450. } else {
  451. packNum = "0"
  452. }
  453. val packUnit = viewBinding.packUnit.text.toString().trim() //包装单位
  454. val specNum = viewBinding.specNum.text.toString().trim() //规格值
  455. if (specNum.isEmpty()) {
  456. showToast("规格不能为空")
  457. return@setDebouncedOnClickListener
  458. }
  459. var specUnit = "g"
  460. if (viewBinding.bugCationsRight.isChecked) {
  461. specUnit = "ml"
  462. }
  463. modelA = ChemicalABean(
  464. belongId = belongId,
  465. belongName = belongName,
  466. casNum = casNum,
  467. chemicalCategory = chemicalCategory,
  468. chemicalDensity = chemicalDensity.toDouble(),
  469. chemicalLevel = chemicalLevel,
  470. chemicalName = chemicalName,
  471. chemicalNumber = chemicalNumber.toInt(),
  472. chemicalPurity = chemicalPurity,
  473. factory = factory,
  474. isNew = isNew,
  475. packNum = BigDecimal(packNum),
  476. packUnit = packUnit,
  477. specNum = BigDecimal(specNum),
  478. specUnit = specUnit,
  479. chemicalId = mChemicalId
  480. )
  481. getControlConfigs(chemicalNumber)
  482. }
  483. ButtonDebouncer.setDebouncedOnClickListener(viewBinding.subAdd, 500L) {
  484. // 处理按钮点击事件的逻辑代码
  485. if (mAdapter.data.size > 0) {
  486. if (modelA.status == 2) {
  487. //不需要双人认证
  488. if (mCabinetLockVoList != null && mCabinetLockVoList!!.size > 0) {
  489. mLockStr.clear()
  490. mCabinetLockVoList!!.forEach { it ->
  491. when (it.unlockingMethod) {
  492. 2 -> { //智能锁
  493. mLockStr.add("${it.lockNum}")
  494. }
  495. }
  496. }
  497. if (mLockStr != null && mLockStr.size > 0) {
  498. openLock(mLockStr)
  499. } else {
  500. subAddData(0)
  501. }
  502. } else {
  503. subAddData(0)
  504. }
  505. } else {
  506. //需要双人认证 1人脸 2刷卡 3扫码
  507. if (ChemicalApp.confs!!.verifyType.length == 1) {
  508. val map = mutableMapOf<String, Any>()
  509. //当前 管控类型
  510. map["chemicalLevel"] = modelA.chemicalLevel //管控类型
  511. map["doorId"] = "${viewBinding.cabinet.tag}" //柜子id
  512. map["mTag"] = 0
  513. when (ChemicalApp.confs!!.verifyType) {
  514. "1" -> {//人脸
  515. map["mVerTyps"] = 1
  516. }
  517. "2" -> {//刷卡
  518. map["mVerTyps"] = 2
  519. }
  520. "3" -> {//扫码
  521. map["mVerTyps"] = 3
  522. }
  523. }
  524. UiManager.switcher(
  525. this,
  526. map,
  527. TwoVerificationActivity::class.java
  528. )
  529. // map["hides"] = 4 //隐藏扫码
  530. // when (ChemicalApp.confs!!.verifyType) {
  531. // "1" -> {//人脸
  532. // UiManager.switcher(
  533. // this,
  534. // map,
  535. // TwoPersonActivity::class.java,
  536. // Constants.REQUEST_CODE
  537. // )
  538. // }
  539. // "2" -> {//刷卡
  540. // UiManager.switcher(
  541. // this,
  542. // map,
  543. // SwipeCodeTwoActivity::class.java,
  544. // Constants.REQUEST_CODE
  545. // )
  546. // }
  547. // "3" -> {//扫码
  548. // UiManager.switcher(
  549. // this,
  550. // map,
  551. // ScanCodeTwoActivity::class.java,
  552. // Constants.REQUEST_CODE
  553. // )
  554. // }
  555. // }
  556. } else {
  557. verifyChecking()
  558. }
  559. }
  560. } else {
  561. showToast("缺少录入信息")
  562. }
  563. }
  564. }
  565. private fun getControlConfigs(chemicalNumber: String) {
  566. showLoading("提交中...")
  567. val disposable = ApiRepository.controlConfigs(modelA.chemicalLevel)
  568. .subscribe({ data ->
  569. dismissLoading()
  570. mChemicalConfsBean = data
  571. // searchProducer()
  572. certitude(chemicalNumber)
  573. }, { throwable ->
  574. showNetError(throwable)
  575. dismissLoading()
  576. })
  577. addDisposable(disposable)
  578. }
  579. private fun getCheckRfids(rfid: String, tagCode: String, wxCode: String, position: Int) {
  580. showLoading("查询标签...")
  581. val disposable = ApiRepository.checkRfids(rfid)
  582. .subscribe({ data ->
  583. dismissLoading()
  584. if (data) {
  585. customDialogView(2, "rfid标签不能重复,请重新扫描")
  586. mLabelDialog!!.getRfidTag(position)
  587. } else {
  588. if (mChemicalConfsBean.qrCodePrint) {
  589. //需要打印
  590. val print = PrintBean()
  591. print.tag = tagCode //化学品编码
  592. print.wxCode = wxCode
  593. print.name = modelA.chemicalName!! //化学品名称
  594. if (modelA.casNum != null) {
  595. print.casNo = modelA.casNum!! //cas号
  596. } else {
  597. print.casNo = ""
  598. }
  599. print.person = modelA.belongName!! //归属人
  600. //管控 1 非管控 2
  601. if (modelA.chemicalLevel == 1) {
  602. print.level = "管控"
  603. } else {
  604. print.level = "非管控"
  605. }
  606. print.types = "${viewBinding.chemType.text}"
  607. labelPrint(print)
  608. }
  609. }
  610. }, { throwable ->
  611. showNetError(throwable)
  612. mLabelDialog!!.getRfidTag(position)
  613. dismissLoading()
  614. })
  615. addDisposable(disposable)
  616. }
  617. private fun storageDialogView() {
  618. val storageDialog =
  619. StorageDialog(
  620. ct = this,
  621. listData = mListData!!,
  622. lint = object : StorageDialog.IonClickListener {
  623. override fun onClick(
  624. cabinetId: String,
  625. cabinetName: String,
  626. doorName: String,
  627. doorId: String,
  628. cabinetLockVoList: List<LockVoListBean>,
  629. layers: Int,
  630. lockNum: String,
  631. ) {
  632. mCabinetId = cabinetId
  633. mCabinetName = cabinetName
  634. mDoorId = doorId
  635. mDoorName = doorName
  636. mLockNum = lockNum
  637. mCabinetLockVoList = cabinetLockVoList
  638. viewBinding.cabinet.text = "存储位置:${cabinetName}-${doorName}"
  639. viewBinding.cabinet.tag = "$doorId"
  640. mLayers = layers //当前需要显示得层数
  641. if (mStockModelList != null && mStockModelList.size > 0) {
  642. mStockModelList.forEach {
  643. it.cabinetId = mCabinetId
  644. it.cabinetName = mCabinetName
  645. it.doorId = mDoorId
  646. it.doorName = mDoorName
  647. it.layers = mLayers
  648. }
  649. }
  650. mAdapter.updateData(mLayers)
  651. }
  652. override fun onClose() {
  653. }
  654. })
  655. storageDialog.show()
  656. }
  657. //验证方式
  658. private fun verifyChecking() {
  659. val map = mutableMapOf<String, Any>()
  660. map["chemicalLevel"] = modelA.chemicalLevel //管控类型
  661. map["doorId"] = "${viewBinding.cabinet.tag}" //柜子id
  662. map["mTag"] = 0
  663. map["mVerTyps"] = 0
  664. if (ChemicalApp.confs!!.verifyType == "1,2" || ChemicalApp.confs!!.verifyType == "2,1") {
  665. //人脸+刷卡
  666. map["hides"] = 1 //隐藏扫码
  667. // UiManager.switcher(this, map, TwoPersonActivity::class.java, Constants.REQUEST_CODE)
  668. } else if (ChemicalApp.confs!!.verifyType == "1,3" || ChemicalApp.confs!!.verifyType == "3,1") {
  669. //人脸+扫码
  670. map["hides"] = 2 //隐藏刷卡
  671. // UiManager.switcher(this, map, TwoPersonActivity::class.java, Constants.REQUEST_CODE)
  672. } else if (ChemicalApp.confs!!.verifyType == "2,3" || ChemicalApp.confs!!.verifyType == "3,2") {
  673. map["hides"] = 3 //隐藏扫码
  674. // UiManager.switcher(
  675. // this,
  676. // map,
  677. // SwipeCodeTwoActivity::class.java,
  678. // Constants.REQUEST_CODE
  679. // )
  680. } else {
  681. //人脸+刷卡+扫码
  682. map["hides"] = 4
  683. // UiManager.switcher(this, map, TwoPersonActivity::class.java, Constants.REQUEST_CODE)
  684. }
  685. UiManager.switcher(
  686. this,
  687. map,
  688. TwoVerificationActivity::class.java,
  689. Constants.REQUEST_CODE
  690. )
  691. }
  692. private fun initTitle() {
  693. viewBinding.tvName.text = ChemicalApp.userData!!.userName
  694. val imageView = viewBinding.imageName
  695. // 使用 Glide 加载网络图片
  696. Glide.with(this)
  697. .load("${HttpConfig.API_BASE_IMG_URL}${ChemicalApp.userData!!.avatar}")
  698. .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.AUTOMATIC))
  699. .into(imageView)
  700. // 使用 Glide 加载网络图片
  701. viewBinding.deptName.text = "${ChemicalApp.confs!!.deptName}-${ChemicalApp.confs!!.roomNum}"
  702. Glide.with(this)
  703. .load("${HttpConfig.API_BASE_IMG_URL}${ChemicalApp.confs!!.circularLogo}")
  704. .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.AUTOMATIC))
  705. .into(viewBinding.image)
  706. }
  707. //确定提交的信息
  708. private fun certitude(number: String) {
  709. showLoading("提交中...")
  710. val disposable = ApiRepository.certitude(modelA)
  711. .subscribe({ data ->
  712. dismissLoading()
  713. modelA.chemicalId = data.chemicalId //化学品id
  714. modelA.status = data.status //是否需要认证
  715. // val netContent = modelA.chemicalDensity * modelA.specNum // 净量 = 密度*规格
  716. var density = "${modelA.specNum}${modelA.specUnit}/${modelA.packUnit}"
  717. mLabelDialog = LabelDialog(this, number, mLayers, density,
  718. modelA.chemicalName!!, object : LabelDialog.IRfidClick {
  719. override fun onItemClick(
  720. modelList: MutableList<StockDetailsModel>?,
  721. layer: Int
  722. ) {
  723. RcLog.info("=======当前7选择 $layer")
  724. if (modelList == null) {
  725. //取消
  726. } else {
  727. mStockDetailsModel = modelList
  728. mLayersTow = layer
  729. RcLog.info("====选择层数的回显 $mLayers")
  730. //确定 链接蓝牙
  731. mWeighDialog = WeighDialog(
  732. this@AddedChemicalsActivity,
  733. density,
  734. object : WeighDialog.IViewLint {
  735. override fun weighingView(weighingValue: EditText) {
  736. // showLoading("蓝牙连接中...")
  737. mWeighingValue = weighingValue
  738. if (mWeighingValue!!.isEnabled) {
  739. // EditText允许输入
  740. // 在这里执行相应的操作
  741. showToast("请手动输入")
  742. weiView()
  743. } else {
  744. // EditText禁止输入
  745. // 在这里执行相应的操作
  746. isClisLit = false
  747. lifecycleScope.launch {
  748. connectToDeviceWithTimeout()
  749. }
  750. }
  751. mWeighingValue!!.setOnEditorActionListener { v, actionId, event ->
  752. if (event?.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER) {
  753. // 确认是否触发了"actionDone"
  754. RcLog.info("====键盘测试==1")
  755. true
  756. } else {
  757. RcLog.info("====键盘测试==2 ${mWeighingValue!!.text.toString()}")
  758. closEnd()
  759. false
  760. }
  761. }
  762. }
  763. //确定 关闭 获取文本值 跳转新的页面
  764. override fun viewCloses() {
  765. mHandleScanEvent = false
  766. isClisLit = true
  767. closEndTwo()
  768. }
  769. override fun onMovement() {
  770. showToast("请手动输入")
  771. weiView()
  772. }
  773. override fun onTimerReply() {
  774. stopCountDown()
  775. }
  776. })
  777. mWeighDialog!!.show()
  778. }
  779. }
  780. override fun onPrint(
  781. tagCode: String,
  782. wxCode: String,
  783. rfidCode: String,
  784. position: Int
  785. ) {
  786. getCheckRfids(rfidCode, tagCode, wxCode, position)
  787. }
  788. //根据后台配置进行打印
  789. override fun opTageCode(
  790. modelList: MutableList<StockDetailsModel>,
  791. layer: Int
  792. ) {
  793. RcLog.info("=======当前6选择 $layer")
  794. if (mChemicalConfsBean.qrCodePrint) {
  795. showLoading("打印中,请稍等")
  796. mStockDetailsModel = modelList
  797. mLayersTow = layer
  798. mPrintTag = mStockDetailsModel!!.size
  799. handlerPrint.startTask(taskPrint, 3000)
  800. } else {
  801. //打印完成
  802. mLabelDialog!!.printingCom()
  803. }
  804. }
  805. })
  806. mLabelDialog!!.show()
  807. }, { throwable ->
  808. dismissLoading()
  809. showNetError(throwable)
  810. })
  811. addDisposable(disposable)
  812. }
  813. private fun weiView() {
  814. mJoinType = 2
  815. // try {
  816. // jobTow?.cancel()
  817. // } catch (e: Exception) {
  818. // }
  819. mWeighingValue!!.isEnabled = true
  820. mWeighingValue!!.requestFocus()
  821. }
  822. private val taskPrint = Runnable {
  823. if (mPrintTag == 0) {
  824. //全部打印完成 关闭 并且调用下一步业务
  825. dismissLoading()
  826. handlerPrint.stopAllTasks()
  827. //打印完成
  828. mLabelDialog!!.printingCom()
  829. } else {
  830. // 输出当前循环的值
  831. val print = PrintBean()
  832. print.tag = mStockDetailsModel!![mPrintTag - 1].tagCode!! //化学品编码
  833. print.wxCode = mStockDetailsModel!![mPrintTag - 1].wxCode!! //化学品编码
  834. print.name = modelA.chemicalName!! //化学品名称
  835. if (modelA.casNum != null) {
  836. print.casNo = modelA.casNum!! //cas号
  837. } else {
  838. print.casNo = ""
  839. }
  840. print.person = modelA.belongName!! //归属人
  841. //管控 1 非管控 2
  842. if (modelA.chemicalLevel == 1) {
  843. print.level = "管控"
  844. } else {
  845. print.level = "非管控"
  846. }
  847. print.types = "${viewBinding.chemType.text}"
  848. labelPrint(print)
  849. }
  850. mPrintTag--
  851. }
  852. //校验当前数据是否合理
  853. private fun verificationData(model: StockModel) {
  854. showLoading("查询中...")
  855. val disposable = ApiRepository.addStockCheck(model)
  856. .subscribe({ data ->
  857. dismissLoading()
  858. mStockModelList.add(model)
  859. mStockModeBean = StockModeBean(mStockModelList)
  860. mAdapter.updateData(mLayers)
  861. //创建需要提交的数据源
  862. if (mAdapter.data != null && mAdapter.data.size > 0) {
  863. mAdapter.setList(mStockModelList)
  864. } else {
  865. viewBinding.labelView.visibility = View.GONE
  866. mAdapter.setNewInstance(mStockModelList.toMutableList())
  867. }
  868. viewBinding.imgPosition.visibility = View.GONE
  869. }, { throwable ->
  870. dismissLoading()
  871. showNetError(throwable)
  872. })
  873. addDisposable(disposable)
  874. }
  875. //types 0 请将化学品放入化学品柜 1 柜门已开,请将化学品放入化学品柜
  876. private fun subAddData(types: Int) {
  877. try {// 从 SharedPreferences 中取出集合
  878. val retrievedList =
  879. SharedPreferencesHelper.getList(this@AddedChemicalsActivity)
  880. if (retrievedList != null && retrievedList.size > 0) {
  881. SharedPreferencesHelper.clearList(this@AddedChemicalsActivity)
  882. }
  883. } catch (e: Exception) {
  884. }
  885. showLoading("入库中...")
  886. val disposable = ApiRepository.stockWaitAdd(mStockModeBean)
  887. .subscribe({ data ->
  888. dismissLoading()
  889. mStockModelList.clear()
  890. mAdapter.data.clear()
  891. mAdapter.notifyDataSetChanged()
  892. viewBinding.imgPosition.visibility = View.VISIBLE
  893. viewBinding.labelView.visibility = View.VISIBLE
  894. if (types == 0) {
  895. MediaPlayerHelper.playRawMp3(
  896. this,
  897. R.raw.qingjianghuaxuekaimen
  898. )
  899. customDialogView(1, "请将化学品放入化学品柜")
  900. } else {
  901. MediaPlayerHelper.playRawMp3(this, R.raw.guimenyikai)
  902. customDialogView(1, "柜门已开,请将化学品放入化学品柜")
  903. }
  904. mHandleScanEvent = false
  905. }, { throwable ->
  906. dismissLoading()
  907. showNetError(throwable)
  908. })
  909. addDisposable(disposable)
  910. }
  911. /**
  912. * 标签打印
  913. * 化学品信息
  914. */
  915. private fun labelPrint(printDate: PrintBean) {
  916. if (!pritBot) {
  917. h = try {//关闭打印
  918. AutoReplyPrint.INSTANCE.CP_Port_OpenUsb(
  919. "VID:0x0FE6,PID:0x811E",
  920. 1
  921. )
  922. } catch (e: Exception) {
  923. AutoReplyPrint.INSTANCE.CP_Port_OpenUsb(
  924. "VID:0x0FE6,PID:0x811E",
  925. 1
  926. )
  927. }
  928. }
  929. pritBot = true
  930. val bitmap = BitmapUtils.generateBitmap(printDate) //图片信息
  931. AutoReplyPrint.INSTANCE.CP_Label_BackPaperToPrintPosition(h)
  932. AutoReplyPrint.CP_Pos_PrintRasterImageFromData_Helper.PrintRasterImageFromBitmap(
  933. h,
  934. bitmap!!.width,
  935. bitmap.height,
  936. bitmap,
  937. AutoReplyPrint.CP_ImageBinarizationMethod_Thresholding,
  938. AutoReplyPrint.CP_ImageCompressionMethod_None
  939. )
  940. AutoReplyPrint.INSTANCE.CP_Label_PagePrint(h, 1)
  941. val result = AutoReplyPrint.INSTANCE.CP_Pos_HalfCutPaper(h) //全切
  942. if (result) {
  943. //打印成功
  944. MediaPlayerHelper.playRawMp3(this, R.raw.huaxuepinbiaoqian)
  945. }
  946. }
  947. private fun closePort() {
  948. if (h !== Pointer.NULL) {
  949. AutoReplyPrint.INSTANCE.CP_Port_Close(h)
  950. h = Pointer.NULL
  951. }
  952. }
  953. var taskStarted = false
  954. // 声明一个全局的 Handler 变量
  955. private var mHandlerTime: Handler? = null
  956. // 在需要执行任务的地方调用这个函数
  957. private fun delayedTaskToUpdateUI() {
  958. // 初始化 Handler,并关联到主线程 Looper
  959. if (isClisLit == false) {
  960. mHandlerTime = Handler(Looper.getMainLooper())
  961. // 定义一个延迟执行的任务
  962. val updateUITask = Runnable {
  963. RcLog.info("=====执行了")
  964. // 在这里执行更新 UI 的操作
  965. // 例如,更新 TextView 的文本
  966. // textView.text = "Updated text"
  967. closEnd()
  968. taskStarted = false
  969. // 执行完更新操作后,可以关闭 Handler
  970. mHandlerTime?.removeCallbacksAndMessages(null)
  971. mHandlerTime = null
  972. }
  973. // 延迟 3 秒执行任务
  974. mHandlerTime?.postDelayed(updateUITask, 3300)
  975. }
  976. }
  977. private suspend fun connectToDeviceWithTimeout() {
  978. showToast("连接中...", Toast.LENGTH_SHORT)
  979. // lifecycleScope.launch {
  980. val deviceAddress = withContext(Dispatchers.IO) {
  981. BluetoothConnectionManager.getDeviceAddress()
  982. }
  983. if (deviceAddress != null) {
  984. val socket = withContext(Dispatchers.IO) {
  985. BluetoothConnectionManager.connectToDevice(deviceAddress)
  986. }
  987. if (socket != null) {
  988. // 连接成功后的处理逻辑
  989. // 在这里使用返回的 BluetoothSocket 对象进行后续操作
  990. MediaPlayerHelper.playRawMp3(
  991. this@AddedChemicalsActivity,
  992. R.raw.qing_zheng_zhong
  993. )
  994. // showToast("连接成功", Toast.LENGTH_SHORT)
  995. // 连接成功后的处理逻辑
  996. // 切换回主线程更新 UI
  997. withContext(Dispatchers.Main) {
  998. do {
  999. val inputStream = socket!!.inputStream
  1000. val bt = ByteArray(1024)
  1001. val content = inputStream!!.read(bt)
  1002. if (content != null && content > 0) {
  1003. val contents = String(
  1004. bt,
  1005. 0,
  1006. content,
  1007. StandardCharsets.UTF_8
  1008. )
  1009. val split = contents.split("\n")
  1010. val weight = split[0].trim()
  1011. RcLog.info("===================称重未处理之前=======$contents")
  1012. RcLog.info("===================weight=======$weight")
  1013. RcLog.info("=====称重数据$weight $taskStarted ${mWeighingValue!!.text.toString()}")
  1014. if (weight.toDouble() > 2999) {
  1015. turnOffWeighing()
  1016. } else {
  1017. if (weight.toDouble() > 0) {
  1018. if (mWeighingValue!!.text.toString().trim()
  1019. .isNotEmpty()
  1020. ) {
  1021. if (weight.toDouble() == mWeighingValue!!.text.toString()
  1022. .trim().toDouble()
  1023. ) {
  1024. if (taskStarted == false) {
  1025. taskStarted = true
  1026. RcLog.info("=====执行了")
  1027. socket.close()
  1028. delayedTaskToUpdateUI()
  1029. break
  1030. }
  1031. }
  1032. }
  1033. mWeighingValue!!.setText("$weight")
  1034. } else {
  1035. mWeighingValue!!.setText("")
  1036. }
  1037. }
  1038. RcLog.info("==========蓝牙称 内存测试")
  1039. delay(200)
  1040. } else {
  1041. showToast("请手动输入")
  1042. weiView()
  1043. break
  1044. }
  1045. } while (true)
  1046. }
  1047. } else {
  1048. // 连接失败的处理逻辑
  1049. showToast("连接失败或超时", Toast.LENGTH_SHORT)
  1050. weiView()
  1051. }
  1052. } else {
  1053. // 根据设备名称获取的设备地址为空,处理无法找到设备的情况
  1054. showToast("找不到设备", Toast.LENGTH_SHORT)
  1055. weiView()
  1056. }
  1057. // }
  1058. }
  1059. private fun showToast(message: String, duration: Int) {
  1060. Toast.makeText(this, message, duration).show()
  1061. }
  1062. //超过量程
  1063. private fun turnOffWeighing() {
  1064. showToast("超过量程,手动输入")
  1065. mJoinType = 2
  1066. mWeighingValue!!.isEnabled = true
  1067. // jobTow?.cancel()
  1068. }
  1069. private fun closEndTwo() {
  1070. // jobTow?.cancel()
  1071. mWeighDialog!!.dismiss()
  1072. emptyViewsTwo()
  1073. }
  1074. private fun closEnd() {
  1075. dismissLoading()
  1076. // jobTow?.cancel()
  1077. mWeighDialog!!.dismiss()
  1078. emptyViewsTwo()
  1079. taskStarted = false
  1080. val weigh =
  1081. mWeighingValue!!.text.toString().trim() //称重后的重量
  1082. if (weigh.isEmpty()) {
  1083. showToast("未称重")
  1084. return
  1085. }
  1086. if (weigh.toDouble() <= 0) {
  1087. showToast("当前重量有误")
  1088. return
  1089. }
  1090. val topicName = viewBinding.topicName.text.toString()
  1091. .trim() //课题组 名称
  1092. var belongType = 2
  1093. if (topicName.isNotBlank()) {
  1094. belongType = 1
  1095. }
  1096. // val netContent =
  1097. // modelA.chemicalDensity * modelA.specNum // 净含量 = 密度*规格
  1098. var netContent = BigDecimal(0.0)
  1099. when {
  1100. modelA.specUnit.equals("g") -> {
  1101. netContent = BigDecimal(weigh).subtract(modelA.packNum)
  1102. }
  1103. modelA.specUnit.equals("ml") -> {
  1104. val subtract = BigDecimal(weigh).subtract(modelA.packNum)
  1105. netContent =
  1106. ConversionUtils.gramsToMilliliters(
  1107. subtract,
  1108. BigDecimal(modelA!!.chemicalDensity)
  1109. )
  1110. }
  1111. }
  1112. RcLog.info("=======当前3选择 $mLayers")
  1113. var model = StockModel(
  1114. "${modelA.belongId}",
  1115. "${modelA.belongName}",
  1116. belongType,
  1117. mChemicalInfoBean!!.buildId,
  1118. mChemicalInfoBean!!.buildName,
  1119. mCabinetId,
  1120. mCabinetName,
  1121. modelA.casNum,
  1122. modelA.chemicalCategory!!.toInt(),
  1123. modelA.chemicalId!!,
  1124. modelA.chemicalLevel,
  1125. modelA.chemicalName!!,
  1126. "${mStockDetailsModel!!.size}",
  1127. modelA.chemicalPurity,
  1128. mChemicalInfoBean!!.deptId,
  1129. mChemicalInfoBean!!.deptName,
  1130. viewBinding.cabinet.tag.toString(),
  1131. mDoorName,
  1132. modelA.factory!!,
  1133. mChemicalInfoBean!!.floorId,
  1134. mChemicalInfoBean!!.floorName,
  1135. modelA.isNew,
  1136. mJoinType, //入库方式1 称重,2 录入
  1137. "", //视频地址
  1138. mLayersTow, //当前选择得
  1139. mLayers, //一共几层
  1140. modelA.packNum,
  1141. modelA.packUnit!!,
  1142. modelA.specNum.toDouble(),
  1143. modelA.specUnit!!,
  1144. mStockDetailsModel,
  1145. 6,
  1146. mChemicalInfoBean!!.subId,
  1147. mChemicalInfoBean!!.subName,
  1148. mChemicalInfoBean!!.roomNum,
  1149. null,
  1150. mWeighingValue!!.text.toString().toDouble(),
  1151. netContent.toDouble(),
  1152. expireTime = null
  1153. )
  1154. verificationData(model)
  1155. }
  1156. private fun inAdapter() {
  1157. viewBinding.recyclerViewList?.layoutManager =
  1158. LinearLayoutManager(this)
  1159. viewBinding.recyclerViewList?.adapter = mAdapter
  1160. mAdapter.setOnItemChildClickListener { adapter, view, position ->
  1161. // 在这里处理子View的点击事件
  1162. when (view.id) {
  1163. R.id.imgDelete -> {
  1164. mAdapter.data.removeAt(position)
  1165. mStockModelList = mAdapter.data
  1166. mAdapter.notifyItemRemoved(position)
  1167. RcLog.info("=======当前条数 ${mStockModelList!!.size}")
  1168. if (mStockModelList!!.size == 0) {
  1169. RcLog.info("=======当前条数 ${mStockModelList!!.size}")
  1170. viewBinding.imgPosition.visibility = View.VISIBLE
  1171. }
  1172. }
  1173. }
  1174. }
  1175. }
  1176. override fun initData() {
  1177. super.initData()
  1178. val handler = Handler(Looper.getMainLooper())
  1179. timeUpdater = TimeUpdater(handler) { currentTime ->
  1180. viewBinding.nowTime.text = "$currentTime"
  1181. }
  1182. // 启动定时更新
  1183. timeUpdater.startUpdating()
  1184. getRelList(ChemicalApp.subjectId!!)
  1185. }
  1186. //查询存储位置 默认第一个
  1187. private fun getCabinet(subId: String) {
  1188. showLoading("查询中...")
  1189. val disposable = ApiRepository.getCabinetList(subId)
  1190. .subscribe({ data ->
  1191. dismissLoading()
  1192. mListData = data
  1193. viewBinding.cabinet.text =
  1194. "存储位置:${mListData!![0].cabinetName}-${mListData!![0].cabinetDoorVoList[0].doorName}"
  1195. viewBinding.cabinet.tag =
  1196. "${mListData!![0].cabinetDoorVoList[0].doorUniqueId}"
  1197. mCabinetLockVoList =
  1198. mListData!![0].cabinetDoorVoList[0].cabinetLockVoList //柜锁几条
  1199. mLayers =
  1200. mListData!![0].cabinetDoorVoList[0].doorLayers//当前几层
  1201. mCabinetId = mListData!![0].cabinetId
  1202. mCabinetName = mListData!![0].cabinetName
  1203. mDoorId = mListData!![0].cabinetDoorVoList[0].doorUniqueId
  1204. mDoorName = mListData!![0].cabinetDoorVoList[0].doorName
  1205. mLockNum = mListData!![0].lockNum
  1206. }, { throwable ->
  1207. dismissLoading()
  1208. showNetError(throwable)
  1209. })
  1210. addDisposable(disposable)
  1211. }
  1212. // 获取实验室基本信息
  1213. private fun getRelList(subjectId: String) {
  1214. showLoading("加载中...")
  1215. val disposable = ApiRepository.getRelList(subjectId)
  1216. .subscribe({ data ->
  1217. dismissLoading()
  1218. mChemicalInfoBean = data
  1219. getCabinet(mChemicalInfoBean!!.subId)
  1220. }, { throwable ->
  1221. dismissLoading()
  1222. showNetError(throwable)
  1223. })
  1224. addDisposable(disposable)
  1225. }
  1226. //化学品/cas搜索
  1227. private fun searchChemica(
  1228. searchValue: String,
  1229. chemicalLevel: String?
  1230. ) {
  1231. // val chemicalName = viewBinding.chemicalName.text.toString()
  1232. // val cas = viewBinding.casNum.text.toString()
  1233. RcLog.info("=============管控搜索$searchValue $chemicalLevel")
  1234. showLoading("加载中...")
  1235. val disposable =
  1236. ApiRepository.searchChemica(searchValue, chemicalLevel)
  1237. .subscribe({ data ->
  1238. dismissLoading()
  1239. val mDialog =
  1240. DcaeDialog(
  1241. this,
  1242. data.toMutableList(),
  1243. object : DcaeDialog.IonItemClick {
  1244. override fun onItem(chemicalSearchBean: ChemicalSearchBean) {
  1245. upView(chemicalSearchBean)
  1246. }
  1247. })
  1248. mDialog.show()
  1249. }, { throwable ->
  1250. dismissLoading()
  1251. showNetError(throwable)
  1252. })
  1253. addDisposable(disposable)
  1254. }
  1255. //查询结果 更新回显信息
  1256. private fun upView(chemicalSearchBean: ChemicalSearchBean) {
  1257. mChemicalId = chemicalSearchBean.chemicalId
  1258. viewBinding.chemicalName.setText("${chemicalSearchBean.chemicalName}")
  1259. if (chemicalSearchBean.casNum != null) {
  1260. viewBinding.casNum.setText("${chemicalSearchBean.casNum}")
  1261. }
  1262. viewBinding.chemicalDensity.setText("${chemicalSearchBean.chemicalDensity}")
  1263. if (chemicalSearchBean.chemicalPurity != null) {
  1264. viewBinding.chemicalPurity.setText("${chemicalSearchBean.chemicalPurity}")
  1265. }
  1266. if (chemicalSearchBean.specNum != null) {
  1267. viewBinding.specNum.setText("${chemicalSearchBean.specNum}")
  1268. }
  1269. if (chemicalSearchBean.depositUnit != null) {
  1270. when (chemicalSearchBean.depositUnit) {
  1271. "L" -> { //升
  1272. viewBinding.bugCationsRight.isChecked = true
  1273. viewBinding.bugCationsLeft.isChecked = false
  1274. viewBinding.bugCationsLeft.isEnabled = false
  1275. viewBinding.packUnit.text = "瓶"
  1276. }
  1277. "KG" -> { //千克
  1278. viewBinding.bugCationsLeft.isChecked = true
  1279. viewBinding.bugCationsRight.isChecked = false
  1280. viewBinding.bugCationsRight.isEnabled = false
  1281. viewBinding.packUnit.text = "件"
  1282. }
  1283. "g" -> { //克
  1284. viewBinding.bugCationsLeft.isChecked = true
  1285. viewBinding.bugCationsRight.isChecked = false
  1286. viewBinding.bugCationsRight.isEnabled = false
  1287. viewBinding.packUnit.text = "件"
  1288. }
  1289. "ml" -> {//毫升
  1290. viewBinding.bugCationsRight.isChecked = true
  1291. viewBinding.bugCationsLeft.isChecked = false
  1292. viewBinding.bugCationsLeft.isEnabled = false
  1293. viewBinding.packUnit.text = "瓶"
  1294. }
  1295. }
  1296. }
  1297. if (chemicalSearchBean.packNum != null) {
  1298. viewBinding.packNum.setText("${chemicalSearchBean.packNum}")
  1299. }
  1300. chemTypeIsBoo = false
  1301. if (chemicalSearchBean.chemicalCategory != null) {
  1302. viewBinding.chemType.text = "${chemicalSearchBean.chemicalCategoryName}"
  1303. viewBinding.chemType.tag = "${chemicalSearchBean.chemicalCategory}"
  1304. }
  1305. viewBinding.bugCationsLeft.isEnabled = false
  1306. viewBinding.bugCationsRight.isEnabled = false
  1307. if (chemicalSearchBean.chemicalLevel == 2) {
  1308. viewBinding.butUnregulated.isChecked = true
  1309. viewBinding.butControl.isChecked = false
  1310. } else {
  1311. viewBinding.butControl.isChecked = true
  1312. viewBinding.butUnregulated.isChecked = false
  1313. }
  1314. }
  1315. //厂家搜索
  1316. private fun searchProducer() {
  1317. val disposable = ApiRepository.searchProducer()
  1318. .subscribe({ data ->
  1319. mOptionsList.clear()
  1320. data.forEach {
  1321. mOptionsList.add(it.producerName)
  1322. }
  1323. // val adapter =
  1324. // ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, mOptionsList)
  1325. // 创建 ArrayAdapter 并使用自定义布局
  1326. val adapter = object : ArrayAdapter<String>(this, R.layout.dropdown_item, R.id.text, mOptionsList) {
  1327. override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
  1328. val view = super.getView(position, convertView, parent)
  1329. val textView: TextView = view.findViewById(R.id.text)
  1330. // 设置字体大小
  1331. textView.textSize = 10f
  1332. // 设置行高
  1333. val params = textView.layoutParams
  1334. params.height = 30 // 设置行高为 60 像素
  1335. textView.layoutParams = params
  1336. return view
  1337. }
  1338. }
  1339. viewBinding.edManufacturer.setAdapter(adapter)
  1340. }, { throwable ->
  1341. showNetError(throwable)
  1342. })
  1343. addDisposable(disposable)
  1344. }
  1345. //规格值查询包装值
  1346. private fun searchSpecView(specNum: String) {
  1347. val disposable = ApiRepository.searchSpec(specNum)
  1348. .subscribe({ data ->
  1349. if (data != null) {
  1350. if (data.packNum != null) {
  1351. viewBinding.packNum.setText("${data.packNum}")
  1352. }
  1353. }
  1354. }, { throwable ->
  1355. showNetError(throwable)
  1356. })
  1357. addDisposable(disposable)
  1358. }
  1359. override fun onDestroy() {
  1360. super.onDestroy()
  1361. // 停止定时更新
  1362. timeUpdater.stopUpdating()
  1363. // jobTow?.cancel()
  1364. mPortScanHelper.onPause()
  1365. // 停止定时任务
  1366. try {
  1367. handlerUtil.stopAllTasks()
  1368. countdownTimer?.cancel()
  1369. // timerLock.cancel()
  1370. closePort()
  1371. } catch (e: Exception) {
  1372. }
  1373. try {
  1374. timeUpdater.stopUpdating()
  1375. } catch (e: Exception) {
  1376. }
  1377. // 停止定时更新
  1378. unregisterReceiver(mUsbReceiver)
  1379. EventBus.getDefault().unregister(this) //关闭广播
  1380. }
  1381. //清空所有试图 进行新的录入
  1382. private fun emptyViews() {
  1383. viewBinding.chemicalName.setText("")
  1384. viewBinding.casNum.setText("")
  1385. viewBinding.edManufacturer.setText("")
  1386. viewBinding.chemicalPurity.setText("")
  1387. viewBinding.chemicalDensity.setText("1")
  1388. viewBinding.specNum.setText("")
  1389. viewBinding.packNum.setText("")
  1390. viewBinding.number.setText("1")
  1391. viewBinding.packUnit.text = "瓶"
  1392. viewBinding.chemType.text = ""
  1393. viewBinding.topic.text = "搜索"
  1394. hideKeyboard()
  1395. if (mStockModelList != null) {
  1396. mStockModelList.clear()
  1397. }
  1398. closeKeyboard(viewBinding.number)
  1399. closeKeyboard(viewBinding.chemicalName)
  1400. closeKeyboard(viewBinding.casNum)
  1401. closeKeyboard(viewBinding.edManufacturer)
  1402. closeKeyboard(viewBinding.chemicalPurity)
  1403. closeKeyboard(viewBinding.chemicalDensity)
  1404. closeKeyboard(viewBinding.specNum)
  1405. closeKeyboard(viewBinding.packNum)
  1406. closeKeyboard(viewBinding.number)
  1407. mHandleScanEvent = false
  1408. }
  1409. private fun hideKeyboard() {
  1410. val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  1411. imm.hideSoftInputFromWindow(currentFocus?.windowToken, 0)
  1412. }
  1413. //清空所有试图 进行新的录入
  1414. private fun emptyViewsTwo() {
  1415. viewBinding.chemicalName.setText("")
  1416. viewBinding.casNum.setText("")
  1417. viewBinding.edManufacturer.setText("")
  1418. viewBinding.chemicalPurity.setText("")
  1419. viewBinding.chemicalDensity.setText("1")
  1420. viewBinding.specNum.setText("")
  1421. viewBinding.packNum.setText("")
  1422. viewBinding.number.setText("1")
  1423. viewBinding.packUnit.text = "瓶"
  1424. viewBinding.chemType.text = ""
  1425. viewBinding.topic.text = "搜索"
  1426. closeKeyboard(viewBinding.chemicalName)
  1427. closeKeyboard(viewBinding.casNum)
  1428. closeKeyboard(viewBinding.edManufacturer)
  1429. closeKeyboard(viewBinding.chemicalPurity)
  1430. closeKeyboard(viewBinding.chemicalDensity)
  1431. closeKeyboard(viewBinding.specNum)
  1432. closeKeyboard(viewBinding.packNum)
  1433. closeKeyboard(viewBinding.number)
  1434. }
  1435. private fun closeKeyboard(editText: EditText) {
  1436. editText.clearFocus()
  1437. }
  1438. //=========================刷卡start================
  1439. //刷卡信息 调用当前化学品信息 进行归还
  1440. private fun handleScanEvent(cont: String) {
  1441. RcLog.info("=====刷卡信息$cont")
  1442. showLoading("查询中...")
  1443. val disposable =
  1444. // ApiRepository.chemicalSearchBean("202310160919545345", ChemicalApp.subjectId!!)
  1445. ApiRepository.chemicalSearchBean(cont, ChemicalApp.subjectId!!)
  1446. .subscribe({ data ->
  1447. dismissLoading()
  1448. upView(data)
  1449. }, { throwable ->
  1450. dismissLoading()
  1451. showNetError(throwable)
  1452. mHandleScanEvent = false
  1453. })
  1454. addDisposable(disposable)
  1455. }
  1456. private val mPortScanHelper by lazy {
  1457. PortScanHelper(this, object : OnSerialScanListener {
  1458. override fun dispatchScanEvent(
  1459. type: OnSerialScanListener.ScanType,
  1460. content: String
  1461. ) {
  1462. if (!mHandleScanEvent) {
  1463. if (content.isNotBlank()) {
  1464. mHandleScanEvent = true
  1465. handleScanEvent(content)
  1466. }
  1467. }
  1468. }
  1469. })
  1470. }
  1471. //刷卡usb链接
  1472. private fun registerUsbBroadcast() {
  1473. if (null == mUsbReceiver) {
  1474. val filter = IntentFilter().apply {
  1475. addAction(UsbReceiver.ACTION_USB_PERMISSION)
  1476. addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED)
  1477. addAction(UsbManager.ACTION_USB_DEVICE_DETACHED)
  1478. addAction(UsbReceiver.ACTION_USB_STATE) // usb连接状态广播
  1479. }
  1480. mUsbReceiver = UsbReceiver()
  1481. registerReceiver(mUsbReceiver, filter)
  1482. }
  1483. }
  1484. override fun onResume() {
  1485. super.onResume()
  1486. mPortScanHelper.onResume()
  1487. registerUsbBroadcast()
  1488. try {
  1489. if (Constants.AUTHENTICATION) {
  1490. try {// 从 SharedPreferences 中取出集合
  1491. val retrievedList =
  1492. SharedPreferencesHelper.getList(this@AddedChemicalsActivity)
  1493. if (retrievedList != null && retrievedList.size > 0) {
  1494. RcLog.info("===a===${retrievedList[0].userId}")
  1495. if (mStockModelList != null && mStockModelList.size > 0) {
  1496. mStockModelList.forEach {
  1497. it.oneUserId = "${retrievedList[0].userId}"
  1498. it.oneUserName = "${retrievedList[0].name}"
  1499. it.twoUserId = "${retrievedList[1].userId}"
  1500. it.twoUserName = "${retrievedList[1].name}"
  1501. }
  1502. }
  1503. // // 清空 SharedPreferences 中的集合
  1504. // SharedPreferencesHelper.clearList(this@AddedChemicalsActivity)
  1505. }
  1506. } catch (e: Exception) {
  1507. }
  1508. //1无锁,2是智能锁,3是钥匙柜
  1509. if (mCabinetLockVoList != null && mCabinetLockVoList!!.size > 0) {
  1510. mLockStr.clear()
  1511. mCabinetLockVoList!!.forEach { it ->
  1512. when (it.unlockingMethod) {
  1513. 2 -> { //智能锁
  1514. mLockStr.add("${it.lockNum}")
  1515. }
  1516. }
  1517. }
  1518. if (mLockStr != null && mLockStr.size > 0) {
  1519. openLock(mLockStr)
  1520. } else {
  1521. subAddData(0)
  1522. }
  1523. } else {
  1524. subAddData(0)
  1525. }
  1526. Constants.AUTHENTICATION = false
  1527. }
  1528. } catch (e: Exception) {
  1529. Constants.AUTHENTICATION = false
  1530. }
  1531. }
  1532. //获取刷卡信息
  1533. override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
  1534. mPortScanHelper.dispatchKeyEvent(event)
  1535. return super.dispatchKeyEvent(event)
  1536. }
  1537. //停止 销毁广播传递
  1538. override fun onPause() {
  1539. mPortScanHelper.onPause()
  1540. super.onPause()
  1541. }
  1542. //必须写这个方法 防止注册失败
  1543. @Subscribe(threadMode = ThreadMode.MAIN)
  1544. fun onUpdateEventEvent(event: KeyEvent) {
  1545. }
  1546. //=========================刷卡end==================
  1547. override fun onBackPressed() {
  1548. super.onBackPressed()
  1549. finish()
  1550. }
  1551. override fun onActivityResult(
  1552. requestCode: Int,
  1553. resultCode: Int,
  1554. data: Intent?
  1555. ) {
  1556. super.onActivityResult(requestCode, resultCode, data)
  1557. if (requestCode == Constants.REQUEST_CODE && resultCode == Activity.RESULT_OK) {
  1558. val value = data?.getBooleanExtra("isLogin", false) // 获取返回的参数
  1559. if (value == true) {
  1560. // //1无锁,2是智能锁,3是钥匙柜
  1561. // if (mCabinetLockVoList != null && mCabinetLockVoList!!.size > 0) {
  1562. // mCabinetLockVoList!!.forEach { it ->
  1563. // when (it.unlockingMethod) {
  1564. // 2 -> { //智能锁
  1565. // mLockStr.add("${it.lockNum}")
  1566. // }
  1567. // }
  1568. // }
  1569. // if (mLockStr != null && mLockStr.size > 0) {
  1570. // openLock(mLockStr)
  1571. // } else {
  1572. // subAddData()
  1573. // }
  1574. // } else {
  1575. // subAddData()
  1576. // }
  1577. } else {
  1578. showToast("认证失败!!")
  1579. }
  1580. }
  1581. }
  1582. override fun cdTime(cd: Int) {
  1583. viewBinding.tvReturn.text = "返回${cd}s"
  1584. }
  1585. //开锁
  1586. private fun openLock(mLockStr: ArrayList<String>) {
  1587. val map = mutableMapOf<String, Any>()
  1588. map["subId"] = mStockModeBean.stockModelList[0].subId
  1589. map["subName"] = mStockModeBean.stockModelList[0].subName
  1590. map["cabinetId"] = "$mCabinetId"
  1591. map["cabinetName"] = "$mCabinetName"
  1592. map["doorId"] = "$mDoorId"
  1593. map["doorName"] = "$mDoorName"
  1594. // map["lockNum"] = "guisuo001"
  1595. map["lockNumList"] = mLockStr
  1596. map["operationType"] = 1
  1597. if (ChemicalApp.subRoom != null) {
  1598. map["subRoom"] = ChemicalApp.subRoom!!
  1599. }
  1600. map["type"] = true
  1601. try {// 从 SharedPreferences 中取出集合
  1602. val retrievedList = SharedPreferencesHelper.getList(this)
  1603. if (retrievedList != null && retrievedList.size > 0) {
  1604. RcLog.info("===b===${retrievedList[0].userId}")
  1605. map["oneUserId"] = "${retrievedList[0].userId}"
  1606. map["oneUserName"] = "${retrievedList[0].name}"
  1607. map["twoUserId"] = "${retrievedList[1].userId}"
  1608. map["twoUserName"] = "${retrievedList[1].name}"
  1609. // 清空 SharedPreferences 中的集合
  1610. // SharedPreferencesHelper.clearList(this)
  1611. }
  1612. } catch (e: Exception) {
  1613. }
  1614. showLoading("加载中...")
  1615. val disposable = ApiRepository.lockOperate(map)
  1616. .subscribe({ data ->
  1617. dismissLoading()
  1618. val containsFalse =
  1619. mCabinetLockVoList!!.any { it.isOk == false && it.unlockingMethod == 2 }
  1620. if (containsFalse) {
  1621. showLoading("查询中...")
  1622. // 开始执行任务,每 3 秒执行一次
  1623. startCountdownLock()
  1624. handlerUtil.startTask(task, 1000)
  1625. } else {
  1626. try {
  1627. countdownTimer?.cancel()
  1628. } catch (e: Exception) {
  1629. }
  1630. dismissLoading()
  1631. //开锁成功
  1632. subAddData(1)
  1633. handlerUtil.stopAllTasks()
  1634. }
  1635. }, { throwable ->
  1636. dismissLoading()
  1637. showNetError(throwable)
  1638. })
  1639. addDisposable(disposable)
  1640. }
  1641. private var countdownTimer: CountDownTimer? = null
  1642. private fun startCountdownLock() {
  1643. val totalTime = 30 * 1000 // 30秒
  1644. val interval = 1000 // 每秒更新一次
  1645. countdownTimer = object : CountDownTimer(totalTime.toLong(), interval.toLong()) {
  1646. override fun onTick(millisUntilFinished: Long) {
  1647. val secondsLeft = millisUntilFinished / 1000
  1648. println("剩余时间: $secondsLeft 秒")
  1649. }
  1650. override fun onFinish() {
  1651. println("倒计时结束!")
  1652. mCabinetLockVoList = null
  1653. mLockStr.clear()
  1654. showToast("开锁超时,可重新操作")
  1655. dismissLoading()
  1656. handlerUtil.stopAllTasks()
  1657. // 在这里执行合适的操作,比如退出应用程序
  1658. }
  1659. }
  1660. println("倒计时开始...")
  1661. countdownTimer?.start()
  1662. }
  1663. private val task = Runnable {
  1664. //判断所有的锁开锁成功
  1665. val containsFalse =
  1666. mCabinetLockVoList!!.any { it.isOk == false && it.unlockingMethod == 2 }
  1667. if (containsFalse) {
  1668. getLocks()
  1669. } else {
  1670. try {
  1671. countdownTimer?.cancel()
  1672. } catch (e: Exception) {
  1673. }
  1674. dismissLoading()
  1675. //开锁成功
  1676. subAddData(1)
  1677. handlerUtil.stopAllTasks()
  1678. }
  1679. }
  1680. //查询开锁信息
  1681. private fun getLocks() {
  1682. mCabinetLockVoList!!.forEachIndexed { index, fruit ->
  1683. if (fruit.isOk == false && fruit.unlockingMethod == 2) {
  1684. getLocksDate(index, fruit.lockNum)
  1685. }
  1686. }
  1687. }
  1688. //查询开锁状态
  1689. private fun getLocksDate(index: Int, fruit: String) {
  1690. val disposable = ApiRepository.getLocks(ChemicalApp.subjectId!!, fruit)
  1691. .subscribe({ data ->
  1692. if (data) {
  1693. mCabinetLockVoList!![index].isOk = true
  1694. }
  1695. }, { throwable ->
  1696. dismissLoading()
  1697. showNetError(throwable)
  1698. })
  1699. addDisposable(disposable)
  1700. }
  1701. /**
  1702. * 0 没有图标 1 绿色(成功) 2红色(失败)
  1703. * 失败或者成功的弹框
  1704. */
  1705. private fun customDialogView(types: Int, msg: String) {
  1706. val customDialog = CustomDialog(this, types, msg)
  1707. customDialog.show()
  1708. }
  1709. /**
  1710. * 异常处理
  1711. */
  1712. private fun throwableView(throwable: Throwable) {
  1713. when (throwable) {
  1714. is NetException -> {
  1715. if (throwable.message.isNullOrEmpty()) {
  1716. "接口请求失败(${throwable.code})"
  1717. } else {
  1718. throwable.message!!
  1719. }
  1720. }
  1721. is SocketTimeoutException -> "请求超时,请稍后重试"
  1722. is ConnectException -> "无法连接服务器,请检查网络"
  1723. is HttpException -> "服务器繁忙,请稍后重试"
  1724. else -> null
  1725. }?.let { customDialogView(2, "$it") }
  1726. }
  1727. }