Эх сурвалжийг харах

refactor(更新) :
- 多版本合并

周文健 4 сар өмнө
parent
commit
e83fd0ddbb
100 өөрчлөгдсөн 601 нэмэгдсэн , 980 устгасан
  1. 7 12
      app/build.gradle
  2. 1 1
      app/src/androidTest/java/com/grkj/iscs_mars/ExampleInstrumentedTest.kt
  3. 0 29
      app/src/main/java/com/grkj/iscs/model/ISCSDatabase.kt
  4. 0 11
      app/src/main/java/com/grkj/iscs/model/ISCSMigrations.kt
  5. 0 8
      app/src/main/java/com/grkj/iscs/model/bo/DockStatusBO.kt
  6. 0 8
      app/src/main/java/com/grkj/iscs/model/eventmsg/CurrentModeMsg.kt
  7. 0 9
      app/src/main/java/com/grkj/iscs/model/eventmsg/DeviceExceptionMsg.kt
  8. 0 6
      app/src/main/java/com/grkj/iscs/presentation/ILockerTogetherView.kt
  9. 0 5
      app/src/main/java/com/grkj/iscs/presentation/IPresentationView.kt
  10. 0 6
      app/src/main/java/com/grkj/iscs/presentation/LockerTogetherPresenter.kt
  11. 0 93
      app/src/main/java/com/grkj/iscs/view/dialog/FaceCaptureDialog.kt
  12. 0 119
      app/src/main/java/com/grkj/iscs/view/fragment/FingerprintConfigFragment.kt
  13. 0 5
      app/src/main/java/com/grkj/iscs/view/iview/IDeviceStatusView.kt
  14. 0 6
      app/src/main/java/com/grkj/iscs/view/iview/IExceptionReportView.kt
  15. 0 6
      app/src/main/java/com/grkj/iscs/view/iview/IFaceConfigView.kt
  16. 0 6
      app/src/main/java/com/grkj/iscs/view/iview/IFingerprintConfigView.kt
  17. 0 6
      app/src/main/java/com/grkj/iscs/view/iview/IHomeView.kt
  18. 0 6
      app/src/main/java/com/grkj/iscs/view/iview/IJobExecutionView.kt
  19. 0 6
      app/src/main/java/com/grkj/iscs/view/iview/IJobManagementView.kt
  20. 0 6
      app/src/main/java/com/grkj/iscs/view/iview/IJobProgressView.kt
  21. 0 5
      app/src/main/java/com/grkj/iscs/view/iview/ILoginView.kt
  22. 0 5
      app/src/main/java/com/grkj/iscs/view/iview/IModbusView.kt
  23. 0 6
      app/src/main/java/com/grkj/iscs/view/iview/IStepView.kt
  24. 0 6
      app/src/main/java/com/grkj/iscs/view/iview/ISwitchStatusView.kt
  25. 0 6
      app/src/main/java/com/grkj/iscs/view/iview/ISystemSettingView.kt
  26. 0 6
      app/src/main/java/com/grkj/iscs/view/iview/ITechnologySopView.kt
  27. 0 5
      app/src/main/java/com/grkj/iscs/view/iview/ITicketDetailView.kt
  28. 0 6
      app/src/main/java/com/grkj/iscs/view/iview/IWorkerView.kt
  29. 0 6
      app/src/main/java/com/grkj/iscs/view/iview/IWorkshopView.kt
  30. 0 7
      app/src/main/java/com/grkj/iscs/view/presenter/DeviceRegistrationHomePresenter.kt
  31. 0 7
      app/src/main/java/com/grkj/iscs/view/presenter/JobExecutionPresenter.kt
  32. 0 7
      app/src/main/java/com/grkj/iscs/view/presenter/JobManagementPresenter.kt
  33. 0 8
      app/src/main/java/com/grkj/iscs/view/presenter/ModBusPresenter.kt
  34. 276 321
      app/src/main/java/com/grkj/iscs_mars/BusinessManager.kt
  35. 13 13
      app/src/main/java/com/grkj/iscs_mars/MyApplication.kt
  36. 1 1
      app/src/main/java/com/grkj/iscs_mars/ble/BleBean.kt
  37. 21 21
      app/src/main/java/com/grkj/iscs_mars/ble/BleCmdManager.kt
  38. 61 43
      app/src/main/java/com/grkj/iscs_mars/ble/BleConnectionManager.kt
  39. 1 1
      app/src/main/java/com/grkj/iscs_mars/ble/BleConst.kt
  40. 7 7
      app/src/main/java/com/grkj/iscs_mars/ble/BleUtil.kt
  41. 1 1
      app/src/main/java/com/grkj/iscs_mars/ble/CustomBleGattCallback.kt
  42. 1 1
      app/src/main/java/com/grkj/iscs_mars/ble/CustomBleIndicateCallback.kt
  43. 1 1
      app/src/main/java/com/grkj/iscs_mars/ble/CustomBleScanCallback.kt
  44. 1 1
      app/src/main/java/com/grkj/iscs_mars/ble/CustomBleWriteCallback.kt
  45. 1 1
      app/src/main/java/com/grkj/iscs_mars/ble/KeyGenerator.java
  46. 1 1
      app/src/main/java/com/grkj/iscs_mars/enums/DeviceInputTypeEnum.kt
  47. 2 2
      app/src/main/java/com/grkj/iscs_mars/extentions/ByteArray.kt
  48. 2 4
      app/src/main/java/com/grkj/iscs_mars/extentions/Context.kt
  49. 1 1
      app/src/main/java/com/grkj/iscs_mars/extentions/Int.kt
  50. 1 1
      app/src/main/java/com/grkj/iscs_mars/extentions/Long.kt
  51. 30 0
      app/src/main/java/com/grkj/iscs_mars/extentions/Rect.kt
  52. 1 1
      app/src/main/java/com/grkj/iscs_mars/extentions/String.kt
  53. 1 1
      app/src/main/java/com/grkj/iscs_mars/extentions/View.kt
  54. 1 1
      app/src/main/java/com/grkj/iscs_mars/extentions/ViewHolder.kt
  55. 18 18
      app/src/main/java/com/grkj/iscs_mars/modbus/DockBean.kt
  56. 2 2
      app/src/main/java/com/grkj/iscs_mars/modbus/FrameTask.kt
  57. 2 2
      app/src/main/java/com/grkj/iscs_mars/modbus/MBFrame.kt
  58. 2 2
      app/src/main/java/com/grkj/iscs_mars/modbus/ModBusCMDHelper.kt
  59. 1 1
      app/src/main/java/com/grkj/iscs_mars/modbus/ModBusConstants.kt
  60. 42 33
      app/src/main/java/com/grkj/iscs_mars/modbus/ModBusController.kt
  61. 8 10
      app/src/main/java/com/grkj/iscs_mars/modbus/ModBusManager.kt
  62. 16 6
      app/src/main/java/com/grkj/iscs_mars/modbus/PortManager.kt
  63. 1 1
      app/src/main/java/com/grkj/iscs_mars/modbus/StatusListener.kt
  64. 4 4
      app/src/main/java/com/grkj/iscs_mars/model/Constants.kt
  65. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/DeviceConst.kt
  66. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/DictAndSystemConstants.kt
  67. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/FileBean.kt
  68. 2 2
      app/src/main/java/com/grkj/iscs_mars/model/ISCSDomainData.kt
  69. 1 2
      app/src/main/java/com/grkj/iscs_mars/model/Token.kt
  70. 2 2
      app/src/main/java/com/grkj/iscs_mars/model/UrlConsts.kt
  71. 2 2
      app/src/main/java/com/grkj/iscs_mars/model/bo/DeviceTakeUpdateBO.kt
  72. 8 0
      app/src/main/java/com/grkj/iscs_mars/model/bo/DockStatusBO.kt
  73. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/bo/LoginUserBO.kt
  74. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/bo/PageChangeBO.kt
  75. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/bo/UpdateKeyReturnBO.kt
  76. 8 5
      app/src/main/java/com/grkj/iscs_mars/model/bo/WorkTicketGetBO.kt
  77. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/bo/WorkTicketSendBO.kt
  78. 8 0
      app/src/main/java/com/grkj/iscs_mars/model/eventmsg/CurrentModeMsg.kt
  79. 9 0
      app/src/main/java/com/grkj/iscs_mars/model/eventmsg/DeviceExceptionMsg.kt
  80. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/eventmsg/DeviceTakeUpdateMsg.kt
  81. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/eventmsg/GetTicketStatusMsg.kt
  82. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/eventmsg/LoadingMsg.kt
  83. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/eventmsg/MsgEvent.kt
  84. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/eventmsg/MsgEventConstants.kt
  85. 2 2
      app/src/main/java/com/grkj/iscs_mars/model/eventmsg/SwitchModeMsg.kt
  86. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/eventmsg/UpdateTicketProgressMsg.kt
  87. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/presentation/WorkTicketBean.kt
  88. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/presentation/WorkTicketStatusBean.kt
  89. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/vo/BaseVO.kt
  90. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/vo/FileStreamReqParam.kt
  91. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/vo/cabinet/LockCabinetPageRespVO.kt
  92. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/vo/card/CardInfoRespVO.kt
  93. 3 1
      app/src/main/java/com/grkj/iscs_mars/model/vo/characteristic/CharacteristicPageRespVO.kt
  94. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/vo/dept/DeptListRespVO.kt
  95. 2 2
      app/src/main/java/com/grkj/iscs_mars/model/vo/dict/CommonDictRespVO.kt
  96. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/vo/finger/LoginCharacteristicRespVO.kt
  97. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/vo/hardware/CabinetSlotsRespVo.kt
  98. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/vo/hardware/JobCardPageRespVO.kt
  99. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/vo/hardware/RfidTokenPageRespVO.kt
  100. 1 1
      app/src/main/java/com/grkj/iscs_mars/model/vo/hardware/SwitchListReqVO.kt

+ 7 - 12
app/build.gradle

@@ -6,7 +6,7 @@ plugins {
 }
 
 android {
-    namespace 'com.grkj.iscs'
+    namespace 'com.grkj.iscs_mars'
     compileSdk 34
     viewBinding.enabled = true
 
@@ -15,11 +15,11 @@ android {
     }
 
     defaultConfig {
-        applicationId "com.grkj.iscs"
+        applicationId "com.grkj.iscs_mars"
         minSdk 24
         targetSdk 34
         versionCode 1
-        versionName "1.0"
+        versionName "1.0.0"
 
         multiDexEnabled true
 
@@ -42,9 +42,9 @@ android {
             signingConfig signingConfigs.release
         }
         release {
-            minifyEnabled true  // 混淆
-            zipAlignEnabled true // 进行压缩优化
-            shrinkResources true    // 移除无用的resource文件
+            minifyEnabled false  // 混淆
+            zipAlignEnabled false // 进行压缩优化
+            shrinkResources false    // 移除无用的resource文件
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
             signingConfig signingConfigs.release
         }
@@ -90,11 +90,6 @@ dependencies {
     implementation(libs.viewmodel.savestate)
     kapt(libs.viewmodel.compiler)
 
-    implementation(libs.room.runtime)
-    implementation(libs.room.ktx)
-    implementation(libs.room.testing)
-    ksp(libs.room.compiler)
-
     implementation(libs.android.navigation.fragment)
     implementation(libs.android.navigation.ui)
     implementation(libs.android.navigation.dynamic.features.fragment)
@@ -145,5 +140,5 @@ dependencies {
 
     implementation 'io.github.razerdp:BasePopup:3.2.1'
 
-    implementation 'com.github.SilverIceKey.SIKExtension:SIKCore:1.1.39'
+    implementation 'com.github.SilverIceKey.SIKExtension:SIKCore:1.1.46'
 }

+ 1 - 1
app/src/androidTest/java/com/grkj/iscs/ExampleInstrumentedTest.kt → app/src/androidTest/java/com/grkj/iscs_mars/ExampleInstrumentedTest.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs
+package com.grkj.iscs_mars
 
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.ext.junit.runners.AndroidJUnit4

+ 0 - 29
app/src/main/java/com/grkj/iscs/model/ISCSDatabase.kt

@@ -1,29 +0,0 @@
-package com.grkj.iscs.model
-
-import androidx.room.Database
-import androidx.room.Room
-import androidx.room.RoomDatabase
-import com.grkj.iscs.MyApplication
-
-/**
- * 本地数据库
- */
-//@Database(entities = [], version = ISCSMigrations.VERSION, exportSchema = false)
-abstract class ISCSDatabase : RoomDatabase() {
-    companion object {
-        /**
-         * 单例
-         */
-        @JvmStatic
-        val instance: ISCSDatabase by lazy {
-            Room.databaseBuilder(
-                MyApplication.instance?.applicationContext!!,
-                ISCSDatabase::class.java,
-                "iscs_database"
-            )
-                // 如需在主线程查询,可取消下行注释(不推荐):
-                // .allowMainThreadQueries()
-                .build()
-        }
-    }
-}

+ 0 - 11
app/src/main/java/com/grkj/iscs/model/ISCSMigrations.kt

@@ -1,11 +0,0 @@
-package com.grkj.iscs.model
-
-/**
- * 数据库升级、版本相关信息
- */
-object ISCSMigrations {
-    /**
-     * 版本号
-     */
-    const val VERSION = 1
-}

+ 0 - 8
app/src/main/java/com/grkj/iscs/model/bo/DockStatusBO.kt

@@ -1,8 +0,0 @@
-package com.grkj.iscs.model.bo
-
-import com.grkj.iscs.view.fragment.DockTestFragment.DockTestBean
-
-data class DockStatusBO(
-    val row: Int,
-    val dockList: MutableList<DockTestBean>
-)

+ 0 - 8
app/src/main/java/com/grkj/iscs/model/eventmsg/CurrentModeMsg.kt

@@ -1,8 +0,0 @@
-package com.grkj.iscs.model.eventmsg
-
-import com.grkj.iscs.ble.BleBean
-
-data class CurrentModeMsg(
-    val bleBean: BleBean,
-    val mode: Byte
-)

+ 0 - 9
app/src/main/java/com/grkj/iscs/model/eventmsg/DeviceExceptionMsg.kt

@@ -1,9 +0,0 @@
-package com.grkj.iscs.model.eventmsg
-
-/**
- * @param type {@link [com.grkj.iscs.model.DeviceConst]<class>#[deviceType]}
- */
-data class DeviceExceptionMsg(
-    val type: Int,
-    val rfid: String
-)

+ 0 - 6
app/src/main/java/com/grkj/iscs/presentation/ILockerTogetherView.kt

@@ -1,6 +0,0 @@
-package com.grkj.iscs.presentation
-
-import com.grkj.iscs.view.base.IView
-
-interface ILockerTogetherView : IView {
-}

+ 0 - 5
app/src/main/java/com/grkj/iscs/presentation/IPresentationView.kt

@@ -1,5 +0,0 @@
-package com.grkj.iscs.presentation
-
-import com.grkj.iscs.view.base.IView
-
-interface IPresentationView : IView {}

+ 0 - 6
app/src/main/java/com/grkj/iscs/presentation/LockerTogetherPresenter.kt

@@ -1,6 +0,0 @@
-package com.grkj.iscs.presentation
-
-import com.grkj.iscs.view.base.BasePresenter
-
-class LockerTogetherPresenter : BasePresenter<ILockerTogetherView>() {
-}

+ 0 - 93
app/src/main/java/com/grkj/iscs/view/dialog/FaceCaptureDialog.kt

@@ -1,93 +0,0 @@
-package com.grkj.iscs.view.dialog
-
-import android.graphics.Bitmap
-import android.view.View
-import androidx.core.view.isVisible
-import com.grkj.iscs.R
-import com.grkj.iscs.databinding.DialogFaceCaptureBinding
-import com.grkj.iscs.util.ArcSoftUtil
-import com.grkj.iscs.util.ToastUtils
-import com.grkj.iscs.util.log.LogUtil
-import com.grkj.iscs.view.base.BaseActivity
-import com.grkj.iscs.view.base.BaseDialog
-
-/**
- * 人脸采集弹框
- */
-class FaceCaptureDialog(val ctx: BaseActivity<*>, var callback: (Bitmap?) -> Unit) :
-    BaseDialog<DialogFaceCaptureBinding>(ctx) {
-
-    private var mCapturedBitmap: Bitmap? = null
-
-    override val viewBinding: DialogFaceCaptureBinding
-        get() = DialogFaceCaptureBinding.inflate(layoutInflater)
-
-    override fun initView() {
-        mBinding?.cbRecapture?.setOnClickListener {
-            mBinding?.preview?.visibility = View.VISIBLE
-            mBinding?.preview?.bringToFront()
-
-            mBinding?.cbRecapture?.visibility = View.GONE
-            mBinding?.cbConfirm?.visibility = View.GONE
-
-            startFace()
-        }
-
-        mBinding?.cbCancel?.setOnClickListener {
-            mBinding?.cbRecapture?.visibility = View.GONE
-            mBinding?.cbConfirm?.visibility = View.GONE
-            dismiss()
-        }
-
-        mBinding?.cbConfirm?.setOnClickListener {
-            callback(mCapturedBitmap)
-            dismiss()
-        }
-    }
-
-    override fun show() {
-        super.show()
-        // 启动预览
-        mBinding?.preview?.visibility = View.VISIBLE
-        mBinding?.preview?.bringToFront()
-        if (!ArcSoftUtil.isActivated) {
-            ToastUtils.tip(R.string.face_can_not_process)
-        }
-        startFace()
-    }
-
-    private fun startFace() {
-        ArcSoftUtil.initEngine(context)
-        ArcSoftUtil.initCamera(
-            context,
-            ctx.windowManager,
-            mBinding?.preview!!
-        ) { bitmap, faceSize, alive ->
-            mBinding?.tipTv?.isVisible = faceSize > 1 || alive == false
-            LogUtil.i("人脸检测结果: ${bitmap == null},$faceSize,$alive")
-            if (faceSize > 1) {
-                mBinding?.tipTv?.text = context.getString(R.string.only_one_person_allowed)
-                return@initCamera
-            }
-            if (alive == false) {
-                mBinding?.tipTv?.text =
-                    context.getString(R.string.real_person_verification_required)
-                return@initCamera
-            }
-            ArcSoftUtil.stop()
-            mBinding?.preview?.visibility = View.INVISIBLE
-            mBinding?.image?.visibility = View.VISIBLE
-            mCapturedBitmap = bitmap
-            mBinding?.image?.setImageBitmap(bitmap)
-
-            mBinding?.cbRecapture?.visibility = View.VISIBLE
-            mBinding?.cbConfirm?.visibility = View.VISIBLE
-        }
-    }
-
-    override fun dismiss() {
-        super.dismiss()
-        mCapturedBitmap = null
-        ArcSoftUtil.stop()
-    }
-}

+ 0 - 119
app/src/main/java/com/grkj/iscs/view/fragment/FingerprintConfigFragment.kt

@@ -1,119 +0,0 @@
-package com.grkj.iscs.view.fragment
-
-import com.grkj.iscs.R
-import com.grkj.iscs.databinding.FragmentFingerprintConfigBinding
-import com.grkj.iscs.model.vo.characteristic.CharacteristicPageRespVO
-import com.grkj.iscs.util.ToastUtils
-import com.grkj.iscs.view.base.BaseMvpFragment
-import com.grkj.iscs.view.dialog.FingerScanDialog
-import com.grkj.iscs.view.dialog.TipDialog
-import com.grkj.iscs.view.iview.IFingerprintConfigView
-import com.grkj.iscs.view.presenter.FingerprintConfigPresenter
-import com.zhy.adapter.recyclerview.CommonAdapter
-import com.zhy.adapter.recyclerview.base.ViewHolder
-
-/**
- * 指纹设置页
- */
-class FingerprintConfigFragment :
-    BaseMvpFragment<IFingerprintConfigView, FingerprintConfigPresenter, FragmentFingerprintConfigBinding>() {
-
-    private val mFingerList = mutableListOf<CharacteristicPageRespVO.Record>()
-    private var mTipDialog: TipDialog? = null
-    private var mFingerDialog: FingerScanDialog? = null
-    private var mFingerprintLimit: Int = 5
-
-    override val viewBinding: FragmentFingerprintConfigBinding
-        get() = FragmentFingerprintConfigBinding.inflate(layoutInflater)
-
-    override fun initView() {
-        mBinding?.cbAddFinger?.setOnClickListener {
-            if (mFingerList.size >= mFingerprintLimit) {
-                ToastUtils.tip(getString(R.string.fingerprint_config_tip, mFingerprintLimit))
-                return@setOnClickListener
-            }
-            showFingerScanDialog()
-        }
-
-        mBinding?.rvFinger?.adapter = object : CommonAdapter<CharacteristicPageRespVO.Record>(
-            requireContext(),
-            R.layout.item_rv_finger,
-            mFingerList
-        ) {
-            override fun convert(
-                holder: ViewHolder,
-                record: CharacteristicPageRespVO.Record,
-                position: Int
-            ) {
-                holder.setText(R.id.tv_name, "${getString(R.string.fingerprint)}${position + 1}")
-                holder.setOnClickListener(R.id.root) {
-                    showTipDialog(
-                        getString(
-                            R.string.fingerprint_delete_confirm_tip,
-                            "${getString(R.string.fingerprint)}${position + 1}"
-                        ), record.recordId
-                    )
-                }
-            }
-        }
-
-        refreshFingerList()
-        presenter?.getFingerprintLimit {
-            mFingerprintLimit = it
-            mBinding?.fingerprintLimitTv?.text =
-                getString(R.string.fingerprint_config_tip, mFingerprintLimit)
-        }
-    }
-
-    private fun refreshFingerList() {
-        presenter?.getFingerPage {
-            mFingerList.clear()
-            it?.records?.let {
-                mFingerList.addAll(it)
-            }
-            mBinding?.rvFinger?.adapter?.notifyDataSetChanged()
-        }
-    }
-
-    private fun showTipDialog(tip: String, recordId: Long? = null, isAdd: Boolean = false) {
-        mTipDialog ?: let {
-            mTipDialog = TipDialog(requireContext())
-        }
-        mTipDialog?.setTip(tip)
-        mTipDialog?.setType(if (isAdd) TipDialog.TYPE_CONFIRM else TipDialog.TYPE_ALL)
-        mTipDialog?.setConfirmListener {
-            if (!isAdd) {
-                recordId?.let {
-                    presenter?.deleteFinger(it) {
-                        refreshFingerList()
-                    }
-                }
-            }
-        }
-        mTipDialog?.show()
-    }
-
-    private fun showFingerScanDialog() {
-        mFingerDialog ?: let {
-            mFingerDialog = FingerScanDialog(requireContext()) {
-                if (it != null) {
-                    presenter?.insertFinger(it) {
-                        mFingerDialog?.dismiss()
-                        if (it) {
-                            showTipDialog(
-                                getString(R.string.fingerprint_add_success_tip),
-                                isAdd = true
-                            )
-                            refreshFingerList()
-                        }
-                    }
-                }
-            }
-        }
-        mFingerDialog?.show()
-    }
-
-    override fun initPresenter(): FingerprintConfigPresenter {
-        return FingerprintConfigPresenter()
-    }
-}

+ 0 - 5
app/src/main/java/com/grkj/iscs/view/iview/IDeviceStatusView.kt

@@ -1,5 +0,0 @@
-package com.grkj.iscs.view.iview
-
-import com.grkj.iscs.view.base.IView
-
-interface IDeviceStatusView : IView {}

+ 0 - 6
app/src/main/java/com/grkj/iscs/view/iview/IExceptionReportView.kt

@@ -1,6 +0,0 @@
-package com.grkj.iscs.view.iview
-
-import com.grkj.iscs.view.base.IView
-
-interface IExceptionReportView : IView {
-}

+ 0 - 6
app/src/main/java/com/grkj/iscs/view/iview/IFaceConfigView.kt

@@ -1,6 +0,0 @@
-package com.grkj.iscs.view.iview
-
-import com.grkj.iscs.view.base.IView
-
-interface IFaceConfigView : IView {
-}

+ 0 - 6
app/src/main/java/com/grkj/iscs/view/iview/IFingerprintConfigView.kt

@@ -1,6 +0,0 @@
-package com.grkj.iscs.view.iview
-
-import com.grkj.iscs.view.base.IView
-
-interface IFingerprintConfigView : IView {
-}

+ 0 - 6
app/src/main/java/com/grkj/iscs/view/iview/IHomeView.kt

@@ -1,6 +0,0 @@
-package com.grkj.iscs.view.iview
-
-import com.grkj.iscs.view.base.IView
-
-interface IHomeView : IView {
-}

+ 0 - 6
app/src/main/java/com/grkj/iscs/view/iview/IJobExecutionView.kt

@@ -1,6 +0,0 @@
-package com.grkj.iscs.view.iview
-
-import com.grkj.iscs.view.base.IView
-
-interface IJobExecutionView : IView {
-}

+ 0 - 6
app/src/main/java/com/grkj/iscs/view/iview/IJobManagementView.kt

@@ -1,6 +0,0 @@
-package com.grkj.iscs.view.iview
-
-import com.grkj.iscs.view.base.IView
-
-interface IJobManagementView : IView {
-}

+ 0 - 6
app/src/main/java/com/grkj/iscs/view/iview/IJobProgressView.kt

@@ -1,6 +0,0 @@
-package com.grkj.iscs.view.iview
-
-import com.grkj.iscs.view.base.IView
-
-interface IJobProgressView : IView {
-}

+ 0 - 5
app/src/main/java/com/grkj/iscs/view/iview/ILoginView.kt

@@ -1,5 +0,0 @@
-package com.grkj.iscs.view.iview
-
-import com.grkj.iscs.view.base.IView
-
-interface ILoginView : IView {}

+ 0 - 5
app/src/main/java/com/grkj/iscs/view/iview/IModbusView.kt

@@ -1,5 +0,0 @@
-package com.grkj.iscs.view.iview
-
-import com.grkj.iscs.view.base.IView
-
-interface IModbusView : IView

+ 0 - 6
app/src/main/java/com/grkj/iscs/view/iview/IStepView.kt

@@ -1,6 +0,0 @@
-package com.grkj.iscs.view.iview
-
-import com.grkj.iscs.view.base.IView
-
-interface IStepView : IView {
-}

+ 0 - 6
app/src/main/java/com/grkj/iscs/view/iview/ISwitchStatusView.kt

@@ -1,6 +0,0 @@
-package com.grkj.iscs.view.iview
-
-import com.grkj.iscs.view.base.IView
-
-interface ISwitchStatusView:IView {
-}

+ 0 - 6
app/src/main/java/com/grkj/iscs/view/iview/ISystemSettingView.kt

@@ -1,6 +0,0 @@
-package com.grkj.iscs.view.iview
-
-import com.grkj.iscs.view.base.IView
-
-interface ISystemSettingView : IView {
-}

+ 0 - 6
app/src/main/java/com/grkj/iscs/view/iview/ITechnologySopView.kt

@@ -1,6 +0,0 @@
-package com.grkj.iscs.view.iview
-
-import com.grkj.iscs.view.base.IView
-
-interface ITechnologySopView : IView {
-}

+ 0 - 5
app/src/main/java/com/grkj/iscs/view/iview/ITicketDetailView.kt

@@ -1,5 +0,0 @@
-package com.grkj.iscs.view.iview
-
-import com.grkj.iscs.view.base.IView
-
-interface ITicketDetailView : IView {}

+ 0 - 6
app/src/main/java/com/grkj/iscs/view/iview/IWorkerView.kt

@@ -1,6 +0,0 @@
-package com.grkj.iscs.view.iview
-
-import com.grkj.iscs.view.base.IView
-
-interface IWorkerView : IView {
-}

+ 0 - 6
app/src/main/java/com/grkj/iscs/view/iview/IWorkshopView.kt

@@ -1,6 +0,0 @@
-package com.grkj.iscs.view.iview
-
-import com.grkj.iscs.view.base.IView
-
-interface IWorkshopView : IView {
-}

+ 0 - 7
app/src/main/java/com/grkj/iscs/view/presenter/DeviceRegistrationHomePresenter.kt

@@ -1,7 +0,0 @@
-package com.grkj.iscs.view.presenter
-
-import com.grkj.iscs.view.base.BasePresenter
-import com.grkj.iscs.view.iview.IDeviceRegistrationHomeView
-
-class DeviceRegistrationHomePresenter : BasePresenter<IDeviceRegistrationHomeView>() {
-}

+ 0 - 7
app/src/main/java/com/grkj/iscs/view/presenter/JobExecutionPresenter.kt

@@ -1,7 +0,0 @@
-package com.grkj.iscs.view.presenter
-
-import com.grkj.iscs.view.base.BasePresenter
-import com.grkj.iscs.view.iview.IJobExecutionView
-
-class JobExecutionPresenter : BasePresenter<IJobExecutionView>() {
-}

+ 0 - 7
app/src/main/java/com/grkj/iscs/view/presenter/JobManagementPresenter.kt

@@ -1,7 +0,0 @@
-package com.grkj.iscs.view.presenter
-
-import com.grkj.iscs.view.base.BasePresenter
-import com.grkj.iscs.view.iview.IJobManagementView
-
-class JobManagementPresenter : BasePresenter<IJobManagementView>() {
-}

+ 0 - 8
app/src/main/java/com/grkj/iscs/view/presenter/ModBusPresenter.kt

@@ -1,8 +0,0 @@
-package com.grkj.iscs.view.presenter
-
-import com.grkj.iscs.view.base.BasePresenter
-import com.grkj.iscs.view.iview.IModbusView
-
-class ModBusPresenter: BasePresenter<IModbusView>() {
-
-}

+ 276 - 321
app/src/main/java/com/grkj/iscs/BusinessManager.kt → app/src/main/java/com/grkj/iscs_mars/BusinessManager.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs
+package com.grkj.iscs_mars
 //todo 所有蓝牙包替换com.clj. -> com.clj.
 import android.content.Context
 import android.content.Intent
@@ -8,71 +8,72 @@ import com.clj.fastble.BleManager
 import com.clj.fastble.data.BleDevice
 import com.clj.fastble.exception.BleException
 import com.google.gson.Gson
-import com.grkj.iscs.ble.BleBean
-import com.grkj.iscs.ble.BleCmdManager
-import com.grkj.iscs.ble.BleConnectionManager
-import com.grkj.iscs.ble.BleConst
-import com.grkj.iscs.ble.BleConst.STATUS_READY
-import com.grkj.iscs.ble.BleConst.STATUS_WORK
-import com.grkj.iscs.ble.BleUtil
-import com.grkj.iscs.ble.CustomBleWriteCallback
-import com.grkj.iscs.extentions.removeLeadingZeros
-import com.grkj.iscs.extentions.serialNo
-import com.grkj.iscs.extentions.startsWith
-import com.grkj.iscs.extentions.toHexStrings
-import com.grkj.iscs.modbus.DockBean
-import com.grkj.iscs.modbus.ModBusController
-import com.grkj.iscs.modbus.ModBusController.dockList
-import com.grkj.iscs.modbus.ModBusController.getOneKey
-import com.grkj.iscs.model.Constants.USER_TYPE_LOCKER
-import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_CARD
-import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_FINGERPRINT
-import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_KEY
-import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_LOCK
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_ELEC_LOCK_BOARD
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_KEY
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_LOCK
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_PORTABLE
-import com.grkj.iscs.model.DictAndSystemConstants
-import com.grkj.iscs.model.ISCSDomainData
-import com.grkj.iscs.model.bo.DeviceTakeUpdateBO
-import com.grkj.iscs.model.bo.UpdateKeyReturnBO
-import com.grkj.iscs.model.bo.WorkTicketGetBO
-import com.grkj.iscs.model.bo.WorkTicketSendBO
-import com.grkj.iscs.model.bo.WorkTicketSendBO.LockListBO
-import com.grkj.iscs.model.eventmsg.CurrentModeMsg
-import com.grkj.iscs.model.eventmsg.DeviceExceptionMsg
-import com.grkj.iscs.model.eventmsg.DeviceTakeUpdateMsg
-import com.grkj.iscs.model.eventmsg.LoadingMsg
-import com.grkj.iscs.model.eventmsg.MsgEvent
-import com.grkj.iscs.model.eventmsg.MsgEventConstants
-import com.grkj.iscs.model.eventmsg.MsgEventConstants.MSG_EVENT_CURRENT_MODE
-import com.grkj.iscs.model.eventmsg.MsgEventConstants.MSG_EVENT_DEVICE_EXCEPTION
-import com.grkj.iscs.model.eventmsg.MsgEventConstants.MSG_EVENT_DEVICE_TAKE_UPDATE
-import com.grkj.iscs.model.eventmsg.MsgEventConstants.MSG_EVENT_LOADING
-import com.grkj.iscs.model.eventmsg.MsgEventConstants.MSG_EVENT_SWITCH_COLLECTION_UPDATE
-import com.grkj.iscs.model.eventmsg.MsgEventConstants.MSG_EVENT_SWITCH_MODE
-import com.grkj.iscs.model.eventmsg.MsgEventConstants.MSG_EVENT_UPDATE_TICKET_PROGRESS
-import com.grkj.iscs.model.eventmsg.SwitchModeMsg
-import com.grkj.iscs.model.eventmsg.UpdateTicketProgressMsg
-import com.grkj.iscs.model.vo.dict.CommonDictRespVO
-import com.grkj.iscs.model.vo.hardware.CabinetSlotsRespVo
-import com.grkj.iscs.model.vo.hardware.SwitchListReqVO
-import com.grkj.iscs.model.vo.key.KeyPageRespVO
-import com.grkj.iscs.model.vo.lock.LockPageRespVO
-import com.grkj.iscs.model.vo.lock.LockTakeUpdateReqVO
-import com.grkj.iscs.model.vo.ticket.LockPointUpdateReqVO
-import com.grkj.iscs.model.vo.ticket.TicketDetailRespVO
-import com.grkj.iscs.util.ActivityUtils
-import com.grkj.iscs.util.CommonUtils
-import com.grkj.iscs.util.Executor
-import com.grkj.iscs.util.NetApi
-import com.grkj.iscs.util.SPUtils
-import com.grkj.iscs.util.ToastUtils
-import com.grkj.iscs.util.log.LogUtil
-import com.grkj.iscs.view.activity.LoginActivity
-import com.grkj.iscs.view.base.BaseActivity
-import com.grkj.iscs.view.dialog.TipDialog
+import com.grkj.iscs_mars.ble.BleBean
+import com.grkj.iscs_mars.ble.BleCmdManager
+import com.grkj.iscs_mars.ble.BleConnectionManager
+import com.grkj.iscs_mars.ble.BleConst
+import com.grkj.iscs_mars.ble.BleConst.STATUS_READY
+import com.grkj.iscs_mars.ble.BleConst.STATUS_WORK
+import com.grkj.iscs_mars.ble.BleUtil
+import com.grkj.iscs_mars.ble.CustomBleWriteCallback
+import com.grkj.iscs_mars.extentions.removeLeadingZeros
+import com.grkj.iscs_mars.extentions.serialNo
+import com.grkj.iscs_mars.extentions.startsWith
+import com.grkj.iscs_mars.extentions.toHexStrings
+import com.grkj.iscs_mars.modbus.DockBean
+import com.grkj.iscs_mars.modbus.ModBusController
+import com.grkj.iscs_mars.modbus.ModBusController.dockList
+import com.grkj.iscs_mars.modbus.ModBusController.getOneKey
+import com.grkj.iscs_mars.model.Constants.USER_TYPE_LOCKER
+import com.grkj.iscs_mars.model.DeviceConst.DEVICE_TYPE_CARD
+import com.grkj.iscs_mars.model.DeviceConst.DEVICE_TYPE_FINGERPRINT
+import com.grkj.iscs_mars.model.DeviceConst.DEVICE_TYPE_KEY
+import com.grkj.iscs_mars.model.DeviceConst.DEVICE_TYPE_LOCK
+import com.grkj.iscs_mars.model.DeviceConst.DOCK_TYPE_ELEC_LOCK_BOARD
+import com.grkj.iscs_mars.model.DeviceConst.DOCK_TYPE_KEY
+import com.grkj.iscs_mars.model.DeviceConst.DOCK_TYPE_LOCK
+import com.grkj.iscs_mars.model.DeviceConst.DOCK_TYPE_PORTABLE
+import com.grkj.iscs_mars.model.DictAndSystemConstants
+import com.grkj.iscs_mars.model.ISCSDomainData
+import com.grkj.iscs_mars.model.bo.DeviceTakeUpdateBO
+import com.grkj.iscs_mars.model.bo.UpdateKeyReturnBO
+import com.grkj.iscs_mars.model.bo.WorkTicketGetBO
+import com.grkj.iscs_mars.model.bo.WorkTicketSendBO
+import com.grkj.iscs_mars.model.bo.WorkTicketSendBO.LockListBO
+import com.grkj.iscs_mars.model.eventmsg.CurrentModeMsg
+import com.grkj.iscs_mars.model.eventmsg.DeviceExceptionMsg
+import com.grkj.iscs_mars.model.eventmsg.DeviceTakeUpdateMsg
+import com.grkj.iscs_mars.model.eventmsg.LoadingMsg
+import com.grkj.iscs_mars.model.eventmsg.MsgEvent
+import com.grkj.iscs_mars.model.eventmsg.MsgEventConstants
+import com.grkj.iscs_mars.model.eventmsg.MsgEventConstants.MSG_EVENT_CURRENT_MODE
+import com.grkj.iscs_mars.model.eventmsg.MsgEventConstants.MSG_EVENT_DEVICE_EXCEPTION
+import com.grkj.iscs_mars.model.eventmsg.MsgEventConstants.MSG_EVENT_DEVICE_TAKE_UPDATE
+import com.grkj.iscs_mars.model.eventmsg.MsgEventConstants.MSG_EVENT_LOADING
+import com.grkj.iscs_mars.model.eventmsg.MsgEventConstants.MSG_EVENT_SWITCH_COLLECTION_UPDATE
+import com.grkj.iscs_mars.model.eventmsg.MsgEventConstants.MSG_EVENT_SWITCH_MODE
+import com.grkj.iscs_mars.model.eventmsg.MsgEventConstants.MSG_EVENT_UPDATE_TICKET_PROGRESS
+import com.grkj.iscs_mars.model.eventmsg.SwitchModeMsg
+import com.grkj.iscs_mars.model.eventmsg.UpdateTicketProgressMsg
+import com.grkj.iscs_mars.model.vo.dict.CommonDictRespVO
+import com.grkj.iscs_mars.model.vo.hardware.CabinetSlotsRespVo
+import com.grkj.iscs_mars.model.vo.hardware.SwitchListReqVO
+import com.grkj.iscs_mars.model.vo.key.KeyPageRespVO
+import com.grkj.iscs_mars.model.vo.lock.LockPageRespVO
+import com.grkj.iscs_mars.model.vo.lock.LockTakeUpdateReqVO
+import com.grkj.iscs_mars.model.vo.ticket.LockPointUpdateReqVO
+import com.grkj.iscs_mars.model.vo.ticket.TicketDetailRespVO
+import com.grkj.iscs_mars.util.ActivityUtils
+import com.grkj.iscs_mars.util.CommonUtils
+import com.grkj.iscs_mars.util.Executor
+import com.grkj.iscs_mars.util.NetApi
+import com.grkj.iscs_mars.util.SPUtils
+import com.grkj.iscs_mars.util.ToastUtils
+import com.grkj.iscs_mars.util.log.LogUtil
+import com.grkj.iscs_mars.view.activity.LoginActivity
+import com.grkj.iscs_mars.view.base.BaseActivity
+import com.grkj.iscs_mars.view.dialog.TipDialog
+import com.sik.sikcore.SIKCore
 import com.sik.sikcore.date.TimeUtils
 import com.sik.sikcore.thread.ThreadUtils
 import kotlinx.coroutines.Dispatchers
@@ -354,178 +355,13 @@ object BusinessManager {
             when (dockBean.type) {
                 DOCK_TYPE_KEY -> {
                     dockBean.getKeyList().forEach { keyBean ->
-                        if (keyBean.isExist) {
-                            // 放回钥匙,读取rfid
-                            ModBusController.readKeyRfid(
-                                dockBean.addr, if (keyBean.isLeft) 0 else 1
-                            ) { isLeft, res ->
-                                if (!ISCSDomainData.isDeviceRegistration) {
-                                    ModBusController.controlKeyCharge(
-                                        true, keyBean.isLeft, dockBean.addr
-                                    )
-                                }
-                                if (res.size < 11) {
-                                    LogUtil.e("Key rfid error")
-                                    return@readKeyRfid
-                                }
-                                val rfid =
-                                    res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
-                                ThreadUtils.runOnIO {
-                                    val slotStatus =
-                                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_SLOT_STATUS) }
-                                    val slotType =
-                                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_SLOT_TYPE) }
-                                    val slotsPageReq = async { getSlotsPage() }
-                                    val keyStatusReq =
-                                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_KEY_STATUS) }
-                                    val keyPageReq = async { getKeyPage() }
-                                    var keyStatus = keyStatusReq.await()
-                                    var keyData = keyPageReq.await()
-                                    val slotsPage = slotsPageReq.await()
-                                    val slotStatusList = slotStatus.await()
-                                    val slotTypeList = slotType.await()
-                                    //锁钥匙未异常正常请求锁数据,关锁
-                                    if (rfid in (keyData?.records?.filter { it.exStatus == keyStatus.find { it.dictLabel == "异常" }?.dictValue }
-                                            ?.map { it.keyNfc }?.toMutableList()
-                                            ?: mutableListOf())
-                                    ) {
-                                        ToastUtils.tip(
-                                            MyApplication.instance?.applicationContext!!.getString(
-                                                R.string.key_exception_tag
-                                            )
-                                        )
-                                    } else if (slotsPage?.records?.filter {
-                                            it.slotType == slotTypeList.find { d -> d.dictLabel == "钥匙" }?.dictValue && it.status == slotStatusList.find { d -> d.dictLabel == "异常" }?.dictValue
-                                        }
-                                            ?.find { it.row?.toInt() == dockBean.row && it.col?.toInt() == (dockBean.col + (if (keyBean.isLeft) 0 else 1) * 2) } != null) {
-                                        ToastUtils.tip(
-                                            MyApplication.instance?.applicationContext!!.getString(
-                                                R.string.slot_exception_tag
-                                            )
-                                        )
-                                    } else {
-                                        ModBusController.updateKeyRfid(
-                                            dockBean.addr, keyBean.isLeft, rfid
-                                        )
-                                        // 放回钥匙,上锁
-                                        ModBusController.controlKeyBuckle(
-                                            false, keyBean.isLeft, dockBean.addr
-                                        ) {
-                                            NetApi.getKeyInfo(rfid) {
-                                                ModBusController.updateKeyNewHardware(
-                                                    dockBean.addr, true, it == null
-                                                )
-                                                if (it != null && !it.macAddress.isNullOrEmpty()) {
-                                                    ModBusController.updateKeyMac(
-                                                        dockBean.addr, keyBean.isLeft, it.macAddress
-                                                    )
-                                                    ModBusController.updateKeyReadyStatus(
-                                                        it.macAddress, false, 5
-                                                    )
-                                                } else {
-                                                    LogUtil.e("Get key info fail : $rfid")
-                                                    if (!ISCSDomainData.isDeviceRegistration) {
-                                                        ToastUtils.tip(R.string.get_key_info_fail)
-                                                    }
-                                                    ModBusController.controlKeyBuckle(
-                                                        true, keyBean.isLeft, dockBean.addr
-                                                    )
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        } else if (!keyBean.isCharging) {//增加充电判断,防止无线充电干扰锁仓状态导致判断为取出
-                            // 移出待连监听集合,防止connectKey循环失败
-                            keyBean.mac?.let {
-                                unregisterConnectListener(it)
-                            }
-                            sendEventMsg(
-                                MsgEvent(
-                                    MSG_EVENT_DEVICE_TAKE_UPDATE,
-                                    DeviceTakeUpdateMsg(DEVICE_TYPE_KEY, keyBean.rfid)
-                                )
-                            )
-                        }
+                        deviceKeyHandler(dockBean, keyBean)
                     }
                 }
 
                 DOCK_TYPE_LOCK -> {
                     dockBean.getLockList().forEach { lockBean ->
-                        if (lockBean.isExist) {
-                            ModBusController.readLockRfid(dockBean.addr, lockBean.idx) { res ->
-                                if (res.size < 11) {
-                                    LogUtil.e("Lock rfid error")
-                                    return@readLockRfid
-                                }
-                                val rfid =
-                                    res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
-                                ModBusController.updateLockRfid(
-                                    dockBean.addr, lockBean.idx, rfid
-                                )
-                                ThreadUtils.runOnIO {
-                                    val lockStatusReq =
-                                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_PAD_LOCK_STATUS) }
-                                    val slotStatus =
-                                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_SLOT_STATUS) }
-                                    val slotType =
-                                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_SLOT_TYPE) }
-                                    val slotsPageReq = async { getSlotsPage() }
-                                    var lockStatus = lockStatusReq.await()
-                                    val slotsPage = slotsPageReq.await()
-                                    val slotStatusList = slotStatus.await()
-                                    val slotTypeList = slotType.await()
-                                    NetApi.getIsLockPage { lockData ->
-                                        //锁rfid未异常正常请求锁数据,关锁
-                                        if (rfid in (lockData?.records?.filter { it.exStatus == lockStatus.find { it.dictLabel == "异常" }?.dictValue }
-                                                ?.map { it.lockNfc }?.toMutableList()
-                                                ?: mutableListOf())
-                                        ) {
-                                            ToastUtils.tip(
-                                                MyApplication.instance?.applicationContext!!.getString(
-                                                    R.string.lock_exception_tag
-                                                )
-                                            )
-                                        } else if (slotsPage?.records?.filter {
-                                                it.slotType == slotTypeList.find { d -> d.dictLabel == "锁" }?.dictValue && it.status == slotStatusList.find { d -> d.dictLabel == "异常" }?.dictValue
-                                            }
-                                                ?.find { it.row?.toInt() == dockBean.row && (lockBean.idx + 1) == it.col?.toInt() } != null) {
-                                            ToastUtils.tip(
-                                                MyApplication.instance?.applicationContext!!.getString(
-                                                    R.string.slot_exception_tag
-                                                )
-                                            )
-                                        } else {
-                                            NetApi.getLockInfo(rfid) {
-                                                if (it != null) {
-                                                    // TODO 考虑快速拿取
-                                                    ModBusController.controlLockBuckle(
-                                                        false, dockBean.addr, lockBean.idx
-                                                    ) { itRst ->
-                                                        if (itRst.isNotEmpty()) {
-                                                            // 上报锁具信息
-                                                            NetApi.updateLockReturn(
-                                                                rfid,
-                                                                MyApplication.instance!!.serialNo()
-                                                            ) {}
-                                                        }
-                                                    }
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        } else {
-                            LogUtil.i("挂锁取出-:${lockBean.rfid}")
-                            sendEventMsg(
-                                MsgEvent(
-                                    MSG_EVENT_DEVICE_TAKE_UPDATE,
-                                    DeviceTakeUpdateMsg(DEVICE_TYPE_LOCK, lockBean.rfid)
-                                )
-                            )
-                        }
+                        deviceLockHandler(dockBean, lockBean)
                     }
                 }
 
@@ -539,86 +375,11 @@ object BusinessManager {
                         if (deviceBean.isExist) {
                             when (deviceBean.type) {
                                 DEVICE_TYPE_KEY -> {
-                                    ModBusController.readKeyRfid(
-                                        dockBean.addr, deviceBean.idx
-                                    ) { isLeft, res ->
-                                        if (res.size < 11) {
-                                            LogUtil.e("Key rfid error")
-                                            return@readKeyRfid
-                                        }
-                                        val rfid = res.copyOfRange(3, 11).toHexStrings(false)
-                                            .removeLeadingZeros()
-                                        ModBusController.updateKeyRfid(
-                                            dockBean.addr, true, rfid
-                                        )
-                                        NetApi.getKeyInfo(rfid) {
-                                            ModBusController.updateKeyNewHardware(
-                                                dockBean.addr, true, it == null
-                                            )
-                                            if (it != null && !it.macAddress.isNullOrEmpty()) {
-                                                ModBusController.updateKeyMac(
-                                                    dockBean.addr, isLeft, it.macAddress
-                                                )
-//                                                    showKeyReturnDialog(it.macAddress, isLeft, dockBean.addr)
-                                            } else {
-                                                ToastUtils.tip(R.string.get_key_info_fail)
-                                            }
-                                        }
-                                        // TODO 蓝牙通信
-                                    }
+                                    deviceKeyHandler(dockBean, deviceBean as DockBean.KeyBean)
                                 }
 
                                 DEVICE_TYPE_LOCK -> {
-                                    ModBusController.readLockRfid(
-                                        dockBean.addr, deviceBean.idx
-                                    ) { res ->
-                                        if (res.size < 11) {
-                                            LogUtil.e("Lock rfid error")
-                                            return@readLockRfid
-                                        }
-                                        val rfid = res.copyOfRange(3, 11).toHexStrings(false)
-                                            .removeLeadingZeros()
-                                        ModBusController.updateLockRfid(
-                                            dockBean.addr, deviceBean.idx, rfid
-                                        )
-                                        ThreadUtils.runOnIO {
-                                            val lockStatusReq = async {
-                                                fetchDict<CommonDictRespVO>(
-                                                    DictAndSystemConstants.KEY_PAD_LOCK_STATUS
-                                                )
-                                            }
-                                            var lockStatus = lockStatusReq.await()
-                                            NetApi.getIsLockPage { lockData ->
-                                                //锁rfid未异常正常请求锁数据,关锁
-                                                if (rfid !in (lockData?.records?.filter { it.exStatus == lockStatus.find { it.dictLabel == "异常" }?.dictValue }
-                                                        ?.map { it.lockNfc }?.toMutableList()
-                                                        ?: mutableListOf())
-                                                ) {
-                                                    NetApi.getLockInfo(rfid) {
-                                                        ModBusController.updateLockNewHardware(
-                                                            dockBean.addr,
-                                                            deviceBean.idx,
-                                                            it == null
-                                                        )
-                                                        if (it != null) {
-                                                            // TODO 考虑快速拿取
-                                                            ModBusController.controlLockBuckle(
-                                                                false, dockBean.addr, deviceBean.idx
-                                                            ) { itRst ->
-                                                                if (itRst.isNotEmpty()) {
-                                                                    // 上报锁具信息
-                                                                    NetApi.updateLockReturn(
-                                                                        rfid,
-                                                                        MyApplication.instance!!.serialNo()
-                                                                    ) {}
-                                                                }
-                                                            }
-                                                        }
-                                                    }
-                                                }
-                                            }
-                                        }
-                                    }
+                                    deviceLockHandler(dockBean, deviceBean as DockBean.LockBean)
                                 }
 
                                 DEVICE_TYPE_CARD -> {
@@ -654,6 +415,185 @@ object BusinessManager {
         }
     }
 
+    /**
+     * 挂锁处理
+     */
+    private fun deviceLockHandler(
+        dockBean: DockBean,
+        lockBean: DockBean.LockBean
+    ) {
+        if (lockBean.isExist) {
+            ModBusController.readLockRfid(dockBean.addr, lockBean.idx) { res ->
+                if (res.size < 11) {
+                    LogUtil.e("Lock rfid error")
+                    return@readLockRfid
+                }
+                val rfid =
+                    res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
+                ModBusController.updateLockRfid(
+                    dockBean.addr, lockBean.idx, rfid
+                )
+                ThreadUtils.runOnIO {
+                    val lockStatusReq =
+                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_PAD_LOCK_STATUS) }
+                    val slotStatus =
+                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_SLOT_STATUS) }
+                    val slotType =
+                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_SLOT_TYPE) }
+                    val slotsPageReq = async { getSlotsPage() }
+                    var lockStatus = lockStatusReq.await()
+                    val slotsPage = slotsPageReq.await()
+                    val slotStatusList = slotStatus.await()
+                    val slotTypeList = slotType.await()
+                    NetApi.getIsLockPage { lockData ->
+                        //锁rfid未异常正常请求锁数据,关锁
+                        if (rfid in (lockData?.records?.filter { it.exStatus == lockStatus.find { it.dictLabel == "异常" }?.dictValue }
+                                ?.map { it.lockNfc }?.toMutableList()
+                                ?: mutableListOf())
+                        ) {
+                            ToastUtils.tip(
+                                MyApplication.instance?.applicationContext!!.getString(
+                                    R.string.lock_exception_tag
+                                )
+                            )
+                        } else if (slotsPage?.records?.filter {
+                                it.slotType == slotTypeList.find { d -> d.dictLabel == "锁" }?.dictValue && it.status == slotStatusList.find { d -> d.dictLabel == "异常" }?.dictValue
+                            }
+                                ?.find { it.row?.toInt() == dockBean.row && (lockBean.idx + 1) == it.col?.toInt() } != null) {
+                            ToastUtils.tip(
+                                MyApplication.instance?.applicationContext!!.getString(
+                                    R.string.slot_exception_tag
+                                )
+                            )
+                        } else {
+                            NetApi.getLockInfo(rfid) {
+                                if (it != null) {
+                                    // TODO 考虑快速拿取
+                                    ModBusController.controlLockBuckle(
+                                        false, dockBean.addr, lockBean.idx
+                                    ) { itRst ->
+                                        if (itRst.isNotEmpty()) {
+                                            // 上报锁具信息
+                                            NetApi.updateLockReturn(
+                                                rfid,
+                                                MyApplication.instance!!.serialNo()
+                                            ) {}
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        } else {
+            LogUtil.i("挂锁取出-:${lockBean.rfid}")
+            sendEventMsg(
+                MsgEvent(
+                    MSG_EVENT_DEVICE_TAKE_UPDATE,
+                    DeviceTakeUpdateMsg(DEVICE_TYPE_LOCK, lockBean.rfid)
+                )
+            )
+        }
+    }
+
+    private fun deviceKeyHandler(dockBean: DockBean, keyBean: DockBean.KeyBean) {
+        if (keyBean.isExist) {
+            // 放回钥匙,读取rfid
+            ModBusController.readKeyRfid(
+                dockBean.addr, if (keyBean.isLeft) 0 else 1
+            ) { isLeft, res ->
+                if (!ISCSDomainData.isDeviceRegistration) {
+                    ModBusController.controlKeyCharge(
+                        true, keyBean.isLeft, dockBean.addr
+                    )
+                }
+                if (res.size < 11) {
+                    LogUtil.e("Key rfid error")
+                    return@readKeyRfid
+                }
+                val rfid =
+                    res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
+                ThreadUtils.runOnIO {
+                    val slotStatus =
+                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_SLOT_STATUS) }
+                    val slotType =
+                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_SLOT_TYPE) }
+                    val slotsPageReq = async { getSlotsPage() }
+                    val keyStatusReq =
+                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_KEY_STATUS) }
+                    val keyPageReq = async { getKeyPage() }
+                    var keyStatus = keyStatusReq.await()
+                    var keyData = keyPageReq.await()
+                    val slotsPage = slotsPageReq.await()
+                    val slotStatusList = slotStatus.await()
+                    val slotTypeList = slotType.await()
+                    //锁钥匙未异常正常请求锁数据,关锁
+                    if (rfid in (keyData?.records?.filter { it.exStatus == keyStatus.find { it.dictLabel == "异常" }?.dictValue }
+                            ?.map { it.keyNfc }?.toMutableList()
+                            ?: mutableListOf())
+                    ) {
+                        ToastUtils.tip(
+                            MyApplication.instance?.applicationContext!!.getString(
+                                R.string.key_exception_tag
+                            )
+                        )
+                    } else if (slotsPage?.records?.filter {
+                            it.slotType == slotTypeList.find { d -> d.dictLabel == "钥匙" }?.dictValue && it.status == slotStatusList.find { d -> d.dictLabel == "异常" }?.dictValue
+                        }
+                            ?.find { it.row?.toInt() == dockBean.row && it.col?.toInt() == (dockBean.col + (if (keyBean.isLeft) 0 else 1) * 2) } != null) {
+                        ToastUtils.tip(
+                            MyApplication.instance?.applicationContext!!.getString(
+                                R.string.slot_exception_tag
+                            )
+                        )
+                    } else {
+                        ModBusController.updateKeyRfid(
+                            dockBean.addr, keyBean.isLeft, rfid
+                        )
+                        // 放回钥匙,上锁
+                        ModBusController.controlKeyBuckle(
+                            false, keyBean.isLeft, dockBean.addr
+                        ) {
+                            NetApi.getKeyInfo(rfid) {
+                                ModBusController.updateKeyNewHardware(
+                                    dockBean.addr, true, it == null
+                                )
+                                if (it != null && !it.macAddress.isNullOrEmpty()) {
+                                    ModBusController.updateKeyMac(
+                                        dockBean.addr, keyBean.isLeft, it.macAddress
+                                    )
+                                    ModBusController.updateKeyReadyStatus(
+                                        it.macAddress, false, 5
+                                    )
+                                } else {
+                                    LogUtil.e("Get key info fail : $rfid")
+                                    if (!ISCSDomainData.isDeviceRegistration) {
+                                        ToastUtils.tip(R.string.get_key_info_fail)
+                                    }
+                                    ModBusController.controlKeyBuckle(
+                                        true, keyBean.isLeft, dockBean.addr
+                                    )
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        } else if (!keyBean.isCharging) {//增加充电判断,防止无线充电干扰锁仓状态导致判断为取出
+            // 移出待连监听集合,防止connectKey循环失败
+            keyBean.mac?.let {
+                unregisterConnectListener(it)
+            }
+            sendEventMsg(
+                MsgEvent(
+                    MSG_EVENT_DEVICE_TAKE_UPDATE,
+                    DeviceTakeUpdateMsg(DEVICE_TYPE_KEY, keyBean.rfid)
+                )
+            )
+        }
+    }
+
     /**
      * 更新所有锁仓状态
      */
@@ -763,6 +703,7 @@ object BusinessManager {
     private suspend fun getKeyPage(): KeyPageRespVO? = suspendCancellableCoroutine { cont ->
         NetApi.getIsKeyPage { keys ->
             cont.resume(keys)
+            cont.cancel()
         }
     }
 
@@ -1277,7 +1218,7 @@ object BusinessManager {
     fun getCurrentStatus(
         from: Int,
         bleDevice: BleDevice,
-        retryCount: Int = 3,
+        retryCount: Int = 0,
         timeoutCallBack: ((Boolean) -> Unit)? = null
     ) {
         LogUtil.i("getCurrentStatus - ${bleDevice.mac} - from : $from")
@@ -1392,6 +1333,17 @@ object BusinessManager {
                 if (finishedStatus.first) {
                     Executor.delayOnMain(500) {
                         handleKeyReturn(bleDevice, workTicketGetBO, finishedStatus.second)
+                        //检查钥匙是否代取,如果是的话给钥匙
+                        val keyBean = ModBusController.getKeyByMac(bleDevice.mac)
+                        mDeviceTakeList.find { it.deviceType == DEVICE_TYPE_KEY && it.nfc == keyBean?.rfid }
+                            ?.let { itKey ->
+                                sendLoadingEventMsg(
+                                    MyApplication.instance?.applicationContext!!.getString(
+                                        R.string.ble_connecting
+                                    )
+                                )
+                                handleGiveKey(itKey)
+                            }
                     }
                 } else {
                     // 当前策略:作业票未完成禁止归还钥匙
@@ -1425,10 +1377,11 @@ object BusinessManager {
             ModBusController.controlKeyBuckle(false, keyBean.isLeft, dock.addr)
         }
         if (ticketFinished) {
+            mDeviceTakeList.removeIf { it.nfc == keyBean?.rfid }
             switchReadyMode(bleDevice)
         } else {
             // 上报隔离点状态
-            val keyNfc = ModBusController.getKeyByMac(bleDevice.mac)?.rfid?:"key rfid lost"
+            val keyNfc = ModBusController.getKeyByMac(bleDevice.mac)?.rfid ?: "key rfid lost"
             workTicketGetBO?.data?.forEach { data ->
                 val updateList = mutableListOf<LockPointUpdateReqVO>()
                 data.dataList?.forEach { dataListDTO ->
@@ -1763,10 +1716,10 @@ object BusinessManager {
                 checkEquipCount(0, true) { keyPair, lockMap ->
                     if (keyPair == null) {
                         ThreadUtils.runOnMain {
-
-                            val ctx = MyApplication.instance?.applicationContext!!
-                            val tipDialog = TipDialog(ctx)
-                            tipDialog.setTip(ctx.getString(R.string.key_take_error_tip))
+                            val tipDialog = TipDialog(SIKCore.getApplication())
+                            tipDialog.setTip(
+                                SIKCore.getApplication().getString(R.string.key_take_error_tip)
+                            )
                             tipDialog.setConfirmListener {
                                 tipDialog.dismiss()
                                 sendEventMsg(
@@ -1792,9 +1745,8 @@ object BusinessManager {
             }
         } ?: run {
             ThreadUtils.runOnMain {
-                val ctx = MyApplication.instance?.applicationContext!!
-                val tipDialog = TipDialog(ctx)
-                tipDialog.setTip(ctx.getString(R.string.key_take_error_tip))
+                val tipDialog = TipDialog(SIKCore.getApplication())
+                tipDialog.setTip(SIKCore.getApplication().getString(R.string.key_take_error_tip))
                 tipDialog.setConfirmListener {
                     tipDialog.dismiss()
                     sendEventMsg(
@@ -1875,7 +1827,10 @@ object BusinessManager {
                             currentModeMsg.bleBean.bleDevice.mac, true, 4
                         )
                         sendLoadingEventMsg(null, false)
-                        //连上之后没有工作票要下发就断开 todo不断开,还钥匙的时候有可能断开全部,原本要锁定仓位,但是会出现快速取出钥匙锁定
+                        //连上之后没有工作票要下发就断开 看是否还有设备等待连接,没有就不断开,有就让路,一般是初始化的时候
+                        if (BleConnectionManager.hasConnectWait()) {
+                            BleManager.getInstance().disconnect(currentModeMsg.bleBean.bleDevice)
+                        }
                     }
                 }
             }
@@ -1996,6 +1951,7 @@ object BusinessManager {
     }
 
     fun logout(context: Context) {
+        reConnectKey()
         NetApi.logout()
         // 关所有有设备的卡扣
         dockList.filter { it.type == DOCK_TYPE_LOCK || it.type == DOCK_TYPE_PORTABLE }
@@ -2027,7 +1983,6 @@ object BusinessManager {
                     }
                 }
             }
-        reConnectKey()
         sendLoadingEventMsg(null, false)
         context.startActivity(Intent(context, LoginActivity::class.java))
     }

+ 13 - 13
app/src/main/java/com/grkj/iscs/MyApplication.kt → app/src/main/java/com/grkj/iscs_mars/MyApplication.kt

@@ -1,20 +1,20 @@
-package com.grkj.iscs
+package com.grkj.iscs_mars
 
 import android.app.Application
 import android.content.Context
 import androidx.multidex.MultiDex
-import com.grkj.iscs.ble.BleUtil
-import com.grkj.iscs.extentions.serialNo
-import com.grkj.iscs.model.Token
-import com.grkj.iscs.util.ArcSoftUtil
-import com.grkj.iscs.util.Executor
-import com.grkj.iscs.util.FileUtil
-import com.grkj.iscs.util.FileUtil.LOG_DIR
-import com.grkj.iscs.util.MyCrashHandler
-import com.grkj.iscs.util.NetApi
-import com.grkj.iscs.util.NetHttpManager
-import com.grkj.iscs.util.SPUtils
-import com.grkj.iscs.util.log.LogUtil
+import com.grkj.iscs_mars.ble.BleUtil
+import com.grkj.iscs_mars.extentions.serialNo
+import com.grkj.iscs_mars.model.Token
+import com.grkj.iscs_mars.util.ArcSoftUtil
+import com.grkj.iscs_mars.util.Executor
+import com.grkj.iscs_mars.util.FileUtil
+import com.grkj.iscs_mars.util.FileUtil.LOG_DIR
+import com.grkj.iscs_mars.util.MyCrashHandler
+import com.grkj.iscs_mars.util.NetApi
+import com.grkj.iscs_mars.util.NetHttpManager
+import com.grkj.iscs_mars.util.SPUtils
+import com.grkj.iscs_mars.util.log.LogUtil
 import com.sik.sikcore.SIKCore
 
 class MyApplication : Application() {

+ 1 - 1
app/src/main/java/com/grkj/iscs/ble/BleBean.kt → app/src/main/java/com/grkj/iscs_mars/ble/BleBean.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.ble
+package com.grkj.iscs_mars.ble
 
 import com.clj.fastble.data.BleDevice
 import java.io.File

+ 21 - 21
app/src/main/java/com/grkj/iscs/ble/BleCmdManager.kt → app/src/main/java/com/grkj/iscs_mars/ble/BleCmdManager.kt

@@ -1,27 +1,27 @@
-package com.grkj.iscs.ble
+package com.grkj.iscs_mars.ble
 
 import com.clj.fastble.data.BleDevice
 import com.clj.fastble.exception.BleException
-import com.grkj.iscs.BusinessManager
-import com.grkj.iscs.ble.BleConst.REQ_CURRENT_STATUS
-import com.grkj.iscs.ble.BleConst.REQ_GET_TOKEN
-import com.grkj.iscs.ble.BleConst.REQ_GET_VERSION
-import com.grkj.iscs.ble.BleConst.REQ_POWER_STATUS
-import com.grkj.iscs.ble.BleConst.REQ_SEND_WORK_TICKET
-import com.grkj.iscs.ble.BleConst.REQ_SWITCH_MODE
-import com.grkj.iscs.ble.BleConst.REQ_TRANSFER_FILE
-import com.grkj.iscs.ble.BleConst.REQ_WORK_TICKET_RESULT
-import com.grkj.iscs.ble.BleConst.REQ_WORK_TICKET_RESULT_PART
-import com.grkj.iscs.ble.BleConst.WRITE_UUID
-import com.grkj.iscs.extentions.crc16
-import com.grkj.iscs.extentions.startsWith
-import com.grkj.iscs.extentions.toByteArray
-import com.grkj.iscs.extentions.toHexStrings
-import com.grkj.iscs.model.eventmsg.GetTicketStatusMsg
-import com.grkj.iscs.model.eventmsg.MsgEvent
-import com.grkj.iscs.model.eventmsg.MsgEventConstants.MSG_EVENT_GET_TICKET_STATUS
-import com.grkj.iscs.util.Executor
-import com.grkj.iscs.util.log.LogUtil
+import com.grkj.iscs_mars.BusinessManager
+import com.grkj.iscs_mars.ble.BleConst.REQ_CURRENT_STATUS
+import com.grkj.iscs_mars.ble.BleConst.REQ_GET_TOKEN
+import com.grkj.iscs_mars.ble.BleConst.REQ_GET_VERSION
+import com.grkj.iscs_mars.ble.BleConst.REQ_POWER_STATUS
+import com.grkj.iscs_mars.ble.BleConst.REQ_SEND_WORK_TICKET
+import com.grkj.iscs_mars.ble.BleConst.REQ_SWITCH_MODE
+import com.grkj.iscs_mars.ble.BleConst.REQ_TRANSFER_FILE
+import com.grkj.iscs_mars.ble.BleConst.REQ_WORK_TICKET_RESULT
+import com.grkj.iscs_mars.ble.BleConst.REQ_WORK_TICKET_RESULT_PART
+import com.grkj.iscs_mars.ble.BleConst.WRITE_UUID
+import com.grkj.iscs_mars.extentions.crc16
+import com.grkj.iscs_mars.extentions.startsWith
+import com.grkj.iscs_mars.extentions.toByteArray
+import com.grkj.iscs_mars.extentions.toHexStrings
+import com.grkj.iscs_mars.model.eventmsg.GetTicketStatusMsg
+import com.grkj.iscs_mars.model.eventmsg.MsgEvent
+import com.grkj.iscs_mars.model.eventmsg.MsgEventConstants.MSG_EVENT_GET_TICKET_STATUS
+import com.grkj.iscs_mars.util.Executor
+import com.grkj.iscs_mars.util.log.LogUtil
 import java.io.File
 
 /**

+ 61 - 43
app/src/main/java/com/grkj/iscs/ble/BleConnectionManager.kt → app/src/main/java/com/grkj/iscs_mars/ble/BleConnectionManager.kt

@@ -1,32 +1,30 @@
-package com.grkj.iscs.ble
+package com.grkj.iscs_mars.ble
 
 import android.bluetooth.BluetoothGatt
 import androidx.appcompat.app.AppCompatActivity
 import com.clj.fastble.BleManager
 import com.clj.fastble.data.BleDevice
 import com.clj.fastble.exception.BleException
-import com.grkj.iscs.BusinessManager
-import com.grkj.iscs.BusinessManager.deviceList
-import com.grkj.iscs.BusinessManager.getBleDeviceByMac
-import com.grkj.iscs.BusinessManager.getCurrentStatus
-import com.grkj.iscs.BusinessManager.isTestMode
-import com.grkj.iscs.BusinessManager.removeExceptionKey
-import com.grkj.iscs.BusinessManager.sendEventMsg
-import com.grkj.iscs.BusinessManager.sendLoadingEventMsg
-import com.grkj.iscs.R
-import com.grkj.iscs.extentions.toHexStrings
-import com.grkj.iscs.modbus.ModBusController
-import com.grkj.iscs.modbus.ModBusController.controlKeyCharge
-import com.grkj.iscs.model.Constants.PERMISSION_REQUEST_CODE
-import com.grkj.iscs.model.eventmsg.LoadingMsg
-import com.grkj.iscs.model.eventmsg.MsgEvent
-import com.grkj.iscs.model.eventmsg.MsgEventConstants.MSG_EVENT_LOADING
-import com.grkj.iscs.util.ActivityUtils
-import com.grkj.iscs.util.CommonUtils
-import com.grkj.iscs.util.Executor
-import com.grkj.iscs.util.ToastUtils
-import com.grkj.iscs.util.log.LogUtil
-import com.grkj.iscs.view.base.BaseActivity
+import com.grkj.iscs_mars.BusinessManager
+import com.grkj.iscs_mars.BusinessManager.deviceList
+import com.grkj.iscs_mars.BusinessManager.getBleDeviceByMac
+import com.grkj.iscs_mars.BusinessManager.isTestMode
+import com.grkj.iscs_mars.BusinessManager.removeExceptionKey
+import com.grkj.iscs_mars.BusinessManager.sendEventMsg
+import com.grkj.iscs_mars.BusinessManager.sendLoadingEventMsg
+import com.grkj.iscs_mars.R
+import com.grkj.iscs_mars.extentions.toHexStrings
+import com.grkj.iscs_mars.modbus.ModBusController
+import com.grkj.iscs_mars.modbus.ModBusController.controlKeyCharge
+import com.grkj.iscs_mars.model.Constants.PERMISSION_REQUEST_CODE
+import com.grkj.iscs_mars.model.eventmsg.LoadingMsg
+import com.grkj.iscs_mars.model.eventmsg.MsgEvent
+import com.grkj.iscs_mars.model.eventmsg.MsgEventConstants.MSG_EVENT_LOADING
+import com.grkj.iscs_mars.util.ActivityUtils
+import com.grkj.iscs_mars.util.CommonUtils
+import com.grkj.iscs_mars.util.Executor
+import com.grkj.iscs_mars.util.log.LogUtil
+import com.grkj.iscs_mars.view.base.BaseActivity
 import com.sik.sikcore.activity.ActivityTracker
 import com.sik.sikcore.thread.ThreadUtils
 import kotlinx.coroutines.Dispatchers
@@ -35,6 +33,7 @@ import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlinx.coroutines.withContext
 import pub.devrel.easypermissions.AfterPermissionGranted
 import java.util.LinkedList
+import java.util.concurrent.atomic.AtomicInteger
 import kotlin.coroutines.resume
 import kotlin.coroutines.suspendCoroutine
 
@@ -115,6 +114,13 @@ object BleConnectionManager {
         checkAndConnect()
     }
 
+    /**
+     * 是否有连接在等待
+     */
+    fun hasConnectWait(): Boolean {
+        return connectListeners.isEmpty() == false
+    }
+
     /**
      * 连接监听反注册
      */
@@ -167,7 +173,6 @@ object BleConnectionManager {
                         listener.callBack?.invoke(false, null)
                         unregisterConnectListener(listener.mac)
                     }
-                    ModBusController.controlKeyBuckle(true, listener.mac)
                     LogUtil.i("蓝牙连接-连接钥匙失败")
                     return@runOnMain
                 }
@@ -240,11 +245,11 @@ object BleConnectionManager {
             }
 
             override fun onScanning(bleDevice: BleDevice?) {
-                val mac = bleDevice?.mac ?: return
-                LogUtil.i("蓝牙连接-onScanning:$mac")
-                if (mac.equals(mac, ignoreCase = true)) {
+                val bleMac = bleDevice?.mac ?: return
+                LogUtil.i("蓝牙连接-onScanning:$bleMac")
+                if (mac.equals(bleMac, ignoreCase = true)) {
                     // 找到目标设备,马上停止扫描
-                    LogUtil.i("找到目标设备 $mac,停止扫描并尝试连接")
+                    LogUtil.i("蓝牙连接-找到目标设备 $bleMac,停止扫描并尝试连接")
                     BleManager.getInstance().cancelScan()
                     // 立刻调用 doConnect,下一步进入连接流程
                     doConnect(bleDevice, isNeedLoading, prepareDoneCallBack)
@@ -292,6 +297,7 @@ object BleConnectionManager {
             BleUtil.instance?.connectBySelect(
                 bleDevice, object : CustomBleGattCallback() {
                     override fun onPrompt(promptStr: String?) {
+                        LogUtil.i("蓝牙连接-连接指定设备参数:${promptStr}")
                         if (isNeedLoading) sendEventMsg(
                             MsgEvent(
                                 MSG_EVENT_LOADING, LoadingMsg(false, promptStr, null)
@@ -299,7 +305,9 @@ object BleConnectionManager {
                         )
                     }
 
-                    override fun onStartConnect() {}
+                    override fun onStartConnect() {
+                        LogUtil.i("蓝牙连接-开始连接")
+                    }
 
                     override fun onConnectFail(bleDevice: BleDevice?, exception: BleException?) {
                         if (isNeedLoading) sendEventMsg(
@@ -370,15 +378,16 @@ object BleConnectionManager {
                                 return
                             }
                             // 断开和重连之间最好间隔一段时间,否则可能会出现长时间连接不上的情况
-                            Executor.delayOnMain(300) {
-                                registerConnectListener(bleDevice.mac) { isDone, bleBean ->
-                                    if (isDone && bleBean != null) {
-                                        Executor.delayOnMain(300) {
-                                            getCurrentStatus(6, bleBean.bleDevice)
-                                        }
-                                    }
-                                }
-                            }
+//                            Executor.delayOnMain(300) {
+//                                registerConnectListener(bleDevice.mac) { isDone, bleBean ->
+//                                    if (isDone && bleBean != null) {
+//                                        Executor.delayOnMain(300) {
+//                                            getCurrentStatus(6, bleBean.bleDevice)
+//                                        }
+//                                    }
+//                                }
+//                            }
+                            ModBusController.updateKeyReadyStatus(bleDevice.mac, false, 3)
                         } else {
                             ModBusController.updateKeyReadyStatus(bleDevice.mac, false, 3)
                         }
@@ -596,14 +605,20 @@ object BleConnectionManager {
                 override fun onScanFinished(scanResultList: MutableList<BleDevice>?) {
                     val devicesSnapshot = scanResultList?.toList().orEmpty()
                     ThreadUtils.runOnIO {
+                        val handlerDeviceSize = AtomicInteger(0)
                         devicesSnapshot.forEach {
                             val connected = tryConnectWithOptionalCharge(it.mac, false)
                             if (connected) {
                                 val sendSuccess = sendEmptyTicketJson(it)
                                 LogUtil.i("设备录入-发送切换工作模式:${it.mac},${sendSuccess}")
+                                handlerDeviceSize.addAndGet(1)
+                            } else {
+                                handlerDeviceSize.addAndGet(1)
+                            }
+                            if (devicesSnapshot.size == handlerDeviceSize.get()) {
+                                parentCont.resume(true)
                             }
                         }
-                        parentCont.resume(true)
                     }
                 }
             })
@@ -697,14 +712,14 @@ object BleConnectionManager {
     /**
      * 扫描在线的蓝牙
      */
-    fun scanOnlineKeyLockMac(callback: (List<BleDevice>?) -> Unit) {
+    fun scanOnlineKeyLockMac(existsMac: List<String>, callback: (BleDevice?) -> Unit) {
         BleUtil.instance?.scan(object : CustomBleScanCallback() {
             override fun onPrompt(promptStr: String?) {
                 // 蓝牙未启动重试
                 LogUtil.d("设备录入-参数:${promptStr}")
                 BleManager.getInstance().enableBluetooth()
                 ThreadUtils.runOnMainDelayed(300) {
-                    scanOnlineKeyLockMac(callback)
+                    scanOnlineKeyLockMac(existsMac, callback)
                 }
             }
 
@@ -712,7 +727,7 @@ object BleConnectionManager {
                 LogUtil.d("设备录入-onScanStarted:${success}")
                 if (!success) {
                     ThreadUtils.runOnMainDelayed(300) {
-                        scanOnlineKeyLockMac(callback)
+                        scanOnlineKeyLockMac(existsMac, callback)
                     }
                 }
             }
@@ -720,11 +735,14 @@ object BleConnectionManager {
             override fun onScanning(bleDevice: BleDevice?) {
                 val mac = bleDevice?.mac ?: return
                 LogUtil.d("设备录入-onScanning:$mac")
+                if (mac !in existsMac) {
+                    callback(bleDevice)
+                    BleManager.getInstance().cancelScan()
+                }
             }
 
             override fun onScanFinished(scanResultList: MutableList<BleDevice>?) {
                 LogUtil.d("设备录入-扫描完成:$scanResultList")
-                callback(scanResultList?.toList())
             }
         })
     }

+ 1 - 1
app/src/main/java/com/grkj/iscs/ble/BleConst.kt → app/src/main/java/com/grkj/iscs_mars/ble/BleConst.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.ble
+package com.grkj.iscs_mars.ble
 
 /**
  * 指令,均为未加密或解密后的

+ 7 - 7
app/src/main/java/com/grkj/iscs/ble/BleUtil.kt → app/src/main/java/com/grkj/iscs_mars/ble/BleUtil.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.ble
+package com.grkj.iscs_mars.ble
 
 import android.app.Application
 import android.bluetooth.BluetoothGatt
@@ -10,12 +10,12 @@ import com.clj.fastble.callback.BleMtuChangedCallback
 import com.clj.fastble.data.BleDevice
 import com.clj.fastble.exception.BleException
 import com.clj.fastble.scan.BleScanRuleConfig
-import com.grkj.iscs.model.Constants.BLE_LOCAL_NAME
-import com.grkj.iscs.ble.BleConst.INDICATE_UUID
-import com.grkj.iscs.ble.BleConst.MTU
-import com.grkj.iscs.ble.BleConst.SERVICE_UUID
-import com.grkj.iscs.extentions.toHexStrings
-import com.grkj.iscs.util.log.LogUtil
+import com.grkj.iscs_mars.model.Constants.BLE_LOCAL_NAME
+import com.grkj.iscs_mars.ble.BleConst.INDICATE_UUID
+import com.grkj.iscs_mars.ble.BleConst.MTU
+import com.grkj.iscs_mars.ble.BleConst.SERVICE_UUID
+import com.grkj.iscs_mars.extentions.toHexStrings
+import com.grkj.iscs_mars.util.log.LogUtil
 
 /**
  * 蓝牙工具类

+ 1 - 1
app/src/main/java/com/grkj/iscs/ble/CustomBleGattCallback.kt → app/src/main/java/com/grkj/iscs_mars/ble/CustomBleGattCallback.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.ble
+package com.grkj.iscs_mars.ble
 
 import com.clj.fastble.callback.BleGattCallback
 

+ 1 - 1
app/src/main/java/com/grkj/iscs/ble/CustomBleIndicateCallback.kt → app/src/main/java/com/grkj/iscs_mars/ble/CustomBleIndicateCallback.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.ble
+package com.grkj.iscs_mars.ble
 
 import com.clj.fastble.callback.BleIndicateCallback
 

+ 1 - 1
app/src/main/java/com/grkj/iscs/ble/CustomBleScanCallback.kt → app/src/main/java/com/grkj/iscs_mars/ble/CustomBleScanCallback.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.ble
+package com.grkj.iscs_mars.ble
 
 import com.clj.fastble.callback.BleScanCallback
 

+ 1 - 1
app/src/main/java/com/grkj/iscs/ble/CustomBleWriteCallback.kt → app/src/main/java/com/grkj/iscs_mars/ble/CustomBleWriteCallback.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.ble
+package com.grkj.iscs_mars.ble
 
 import com.clj.fastble.callback.BleWriteCallback
 

+ 1 - 1
app/src/main/java/com/grkj/iscs/ble/KeyGenerator.java → app/src/main/java/com/grkj/iscs_mars/ble/KeyGenerator.java

@@ -1,4 +1,4 @@
-package com.grkj.iscs.ble;
+package com.grkj.iscs_mars.ble;
 
 /**
  * 蓝牙 章节 4.1

+ 1 - 1
app/src/main/java/com/grkj/iscs/enums/DeviceInputTypeEnum.kt → app/src/main/java/com/grkj/iscs_mars/enums/DeviceInputTypeEnum.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.enums
+package com.grkj.iscs_mars.enums
 
 /**
  * 设备录入类型

+ 2 - 2
app/src/main/java/com/grkj/iscs/extentions/ByteArray.kt → app/src/main/java/com/grkj/iscs_mars/extentions/ByteArray.kt

@@ -1,7 +1,7 @@
-package com.grkj.iscs.extentions
+package com.grkj.iscs_mars.extentions
 
 import android.util.Base64
-import com.grkj.iscs.util.CRC16
+import com.grkj.iscs_mars.util.CRC16
 import java.io.ByteArrayOutputStream
 import kotlin.experimental.xor
 

+ 2 - 4
app/src/main/java/com/grkj/iscs/extentions/Context.kt → app/src/main/java/com/grkj/iscs_mars/extentions/Context.kt

@@ -1,16 +1,14 @@
-package com.grkj.iscs.extentions
+package com.grkj.iscs_mars.extentions
 
 import android.Manifest
 import android.annotation.SuppressLint
 import android.content.Context
 import android.content.pm.PackageManager
 import android.os.Build
-import androidx.annotation.RequiresPermission
 import androidx.core.app.ActivityCompat
 import androidx.core.content.ContextCompat
 import androidx.lifecycle.Observer
-import com.grkj.iscs.util.NetManager
-import com.sik.sikcore.device.DeviceUtils
+import com.grkj.iscs_mars.util.NetManager
 import java.util.Locale
 
 /**

+ 1 - 1
app/src/main/java/com/grkj/iscs/extentions/Int.kt → app/src/main/java/com/grkj/iscs_mars/extentions/Int.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.extentions
+package com.grkj.iscs_mars.extentions
 
 //fun Int.toByteArray(capability: Int = 2): ByteArray {
 //    return ByteBuffer.allocate(capability)

+ 1 - 1
app/src/main/java/com/grkj/iscs/extentions/Long.kt → app/src/main/java/com/grkj/iscs_mars/extentions/Long.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.extentions
+package com.grkj.iscs_mars.extentions
 
 import java.nio.ByteBuffer
 import java.nio.ByteOrder

+ 30 - 0
app/src/main/java/com/grkj/iscs_mars/extentions/Rect.kt

@@ -0,0 +1,30 @@
+package com.grkj.iscs_mars.extentions
+
+import android.graphics.Rect
+
+
+/**
+ * 判断 Rect 是否在父容器中心区域内。
+ *
+ * @param parentWidth 父容器宽度(px)
+ * @param parentHeight 父容器高度(px)
+ * @param horizontalMarginPercent 水平边距百分比,范围 0f…0.5f(比如 0.1667f 表示左右各留 16.67%)
+ * @param verticalMarginPercent   垂直边距百分比,范围 0f…0.5f(同理)
+ * @return 如果 rect 完全在这块中心区域内,返回 true
+ */
+fun Rect.isInCenterArea(
+    parentWidth: Int,
+    parentHeight: Int,
+    horizontalMarginPercent: Float = 0.1667f,
+    verticalMarginPercent: Float = 0.1667f
+): Boolean {
+    // 计算左右、上下的像素边距
+    val marginX = parentWidth * horizontalMarginPercent
+    val marginY = parentHeight * verticalMarginPercent
+
+    // rect 的四条边都要在“margin 区域”之外
+    return left   >= marginX &&
+            right  <= parentWidth - marginX &&
+            top    >= marginY &&
+            bottom <= parentHeight - marginY
+}

+ 1 - 1
app/src/main/java/com/grkj/iscs/extentions/String.kt → app/src/main/java/com/grkj/iscs_mars/extentions/String.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.extentions
+package com.grkj.iscs_mars.extentions
 
 /**
  * 长度不足默认补0

+ 1 - 1
app/src/main/java/com/grkj/iscs/extentions/View.kt → app/src/main/java/com/grkj/iscs_mars/extentions/View.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.extentions
+package com.grkj.iscs_mars.extentions
 
 import android.view.View
 

+ 1 - 1
app/src/main/java/com/grkj/iscs/extentions/ViewHolder.kt → app/src/main/java/com/grkj/iscs_mars/extentions/ViewHolder.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.extentions
+package com.grkj.iscs_mars.extentions
 
 import android.view.View
 import com.zhy.adapter.recyclerview.base.ViewHolder

+ 18 - 18
app/src/main/java/com/grkj/iscs/modbus/DockBean.kt → app/src/main/java/com/grkj/iscs_mars/modbus/DockBean.kt

@@ -1,24 +1,24 @@
-package com.grkj.iscs.modbus
+package com.grkj.iscs_mars.modbus
 
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
-import com.grkj.iscs.BusinessManager
-import com.grkj.iscs.MyApplication
-import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_CARD
-import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_FINGERPRINT
-import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_KEY
-import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_LOCK
-import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_SWITCH
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_COLLECT
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_ELEC_LOCK_BOARD
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_KEY
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_LOCK
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_PORTABLE
-import com.grkj.iscs.model.eventmsg.MsgEvent
-import com.grkj.iscs.model.eventmsg.MsgEventConstants.MSG_EVENT_SWITCH_COLLECTION_UPDATE
-import com.grkj.iscs.util.SPUtils
-import com.grkj.iscs.util.log.LogUtil
-import com.grkj.iscs.view.fragment.DockTestFragment
+import com.grkj.iscs_mars.BusinessManager
+import com.grkj.iscs_mars.MyApplication
+import com.grkj.iscs_mars.model.DeviceConst.DEVICE_TYPE_CARD
+import com.grkj.iscs_mars.model.DeviceConst.DEVICE_TYPE_FINGERPRINT
+import com.grkj.iscs_mars.model.DeviceConst.DEVICE_TYPE_KEY
+import com.grkj.iscs_mars.model.DeviceConst.DEVICE_TYPE_LOCK
+import com.grkj.iscs_mars.model.DeviceConst.DEVICE_TYPE_SWITCH
+import com.grkj.iscs_mars.model.DeviceConst.DOCK_TYPE_COLLECT
+import com.grkj.iscs_mars.model.DeviceConst.DOCK_TYPE_ELEC_LOCK_BOARD
+import com.grkj.iscs_mars.model.DeviceConst.DOCK_TYPE_KEY
+import com.grkj.iscs_mars.model.DeviceConst.DOCK_TYPE_LOCK
+import com.grkj.iscs_mars.model.DeviceConst.DOCK_TYPE_PORTABLE
+import com.grkj.iscs_mars.model.eventmsg.MsgEvent
+import com.grkj.iscs_mars.model.eventmsg.MsgEventConstants.MSG_EVENT_SWITCH_COLLECTION_UPDATE
+import com.grkj.iscs_mars.util.SPUtils
+import com.grkj.iscs_mars.util.log.LogUtil
+import com.grkj.iscs_mars.view.fragment.DockTestFragment
 import java.util.concurrent.atomic.AtomicInteger
 
 /**

+ 2 - 2
app/src/main/java/com/grkj/iscs/modbus/FrameTask.kt → app/src/main/java/com/grkj/iscs_mars/modbus/FrameTask.kt

@@ -1,6 +1,6 @@
-package com.grkj.iscs.modbus
+package com.grkj.iscs_mars.modbus
 
-import com.grkj.iscs.extentions.crc16
+import com.grkj.iscs_mars.extentions.crc16
 
 class FrameTask(
     val req: ByteArray,

+ 2 - 2
app/src/main/java/com/grkj/iscs/modbus/MBFrame.kt → app/src/main/java/com/grkj/iscs_mars/modbus/MBFrame.kt

@@ -1,6 +1,6 @@
-package com.grkj.iscs.modbus
+package com.grkj.iscs_mars.modbus
 
-import com.grkj.iscs.extentions.crc16
+import com.grkj.iscs_mars.extentions.crc16
 
 /**
  * ModBus 数据帧

+ 2 - 2
app/src/main/java/com/grkj/iscs/modbus/ModBusCMDHelper.kt → app/src/main/java/com/grkj/iscs_mars/modbus/ModBusCMDHelper.kt

@@ -1,6 +1,6 @@
-package com.grkj.iscs.modbus
+package com.grkj.iscs_mars.modbus
 
-import com.grkj.iscs.model.DeviceConst
+import com.grkj.iscs_mars.model.DeviceConst
 
 /**
  * 通信指令帮助工具

+ 1 - 1
app/src/main/java/com/grkj/iscs/modbus/ModBusConstants.kt → app/src/main/java/com/grkj/iscs_mars/modbus/ModBusConstants.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.modbus
+package com.grkj.iscs_mars.modbus
 
 /**
  * modbus 最小发送间隔(150豪秒)

+ 42 - 33
app/src/main/java/com/grkj/iscs/modbus/ModBusController.kt → app/src/main/java/com/grkj/iscs_mars/modbus/ModBusController.kt

@@ -1,28 +1,28 @@
-package com.grkj.iscs.modbus
+package com.grkj.iscs_mars.modbus
 
 import android.content.Context
 import com.clj.fastble.BleManager
-import com.grkj.iscs.BusinessManager
-import com.grkj.iscs.BusinessManager.CAN_RETURN
-import com.grkj.iscs.R
-import com.grkj.iscs.ble.BleConnectionManager
-import com.grkj.iscs.extentions.removeLeadingZeros
-import com.grkj.iscs.extentions.toHexStrings
-import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_CARD
-import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_FINGERPRINT
-import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_KEY
-import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_LOCK
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_COLLECT
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_ELEC_LOCK_BOARD
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_KEY
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_LOCK
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_PORTABLE
-import com.grkj.iscs.model.vo.hardware.CabinetSlotsRecord
-import com.grkj.iscs.util.CommonUtils
-import com.grkj.iscs.util.Executor
-import com.grkj.iscs.util.NetApi
-import com.grkj.iscs.util.ToastUtils
-import com.grkj.iscs.util.log.LogUtil
+import com.grkj.iscs_mars.BusinessManager
+import com.grkj.iscs_mars.BusinessManager.CAN_RETURN
+import com.grkj.iscs_mars.R
+import com.grkj.iscs_mars.ble.BleConnectionManager
+import com.grkj.iscs_mars.extentions.removeLeadingZeros
+import com.grkj.iscs_mars.extentions.toHexStrings
+import com.grkj.iscs_mars.model.DeviceConst.DEVICE_TYPE_CARD
+import com.grkj.iscs_mars.model.DeviceConst.DEVICE_TYPE_FINGERPRINT
+import com.grkj.iscs_mars.model.DeviceConst.DEVICE_TYPE_KEY
+import com.grkj.iscs_mars.model.DeviceConst.DEVICE_TYPE_LOCK
+import com.grkj.iscs_mars.model.DeviceConst.DOCK_TYPE_COLLECT
+import com.grkj.iscs_mars.model.DeviceConst.DOCK_TYPE_ELEC_LOCK_BOARD
+import com.grkj.iscs_mars.model.DeviceConst.DOCK_TYPE_KEY
+import com.grkj.iscs_mars.model.DeviceConst.DOCK_TYPE_LOCK
+import com.grkj.iscs_mars.model.DeviceConst.DOCK_TYPE_PORTABLE
+import com.grkj.iscs_mars.model.vo.hardware.CabinetSlotsRecord
+import com.grkj.iscs_mars.util.CommonUtils
+import com.grkj.iscs_mars.util.Executor
+import com.grkj.iscs_mars.util.NetApi
+import com.grkj.iscs_mars.util.ToastUtils
+import com.grkj.iscs_mars.util.log.LogUtil
 import com.sik.sikcore.thread.ThreadUtils
 import java.util.concurrent.atomic.AtomicInteger
 import java.util.stream.Collectors
@@ -691,13 +691,20 @@ object ModBusController {
         slaveAddress: Byte?,
         done: ((res: ByteArray) -> Unit)? = null
     ) {
-        slaveAddress?.let {
-            ModBusCMDHelper.generateKeyBuckleCmd(isOpen, if (isLeft) 0 else 1)?.let { cmd ->
-                modBusManager?.sendTo(it, cmd) { res ->
-                    if (isOpen) {
-                        controlKeyCharge(false, isLeft, slaveAddress)
+        slaveAddress?.let { addr ->
+            if (isOpen) {
+                controlKeyCharge(false, isLeft, addr) {
+                    ModBusCMDHelper.generateKeyBuckleCmd(isOpen, if (isLeft) 0 else 1)?.let { cmd ->
+                        modBusManager?.sendTo(addr, cmd) { res ->
+                            done?.invoke(res)
+                        }
+                    }
+                }
+            } else {
+                ModBusCMDHelper.generateKeyBuckleCmd(isOpen, if (isLeft) 0 else 1)?.let { cmd ->
+                    modBusManager?.sendTo(addr, cmd) { res ->
+                        done?.invoke(res)
                     }
-                    done?.invoke(res)
                 }
             }
         }
@@ -711,7 +718,6 @@ object ModBusController {
             .forEach { dock ->
                 dock.type?.let { dockType ->
                     ModBusCMDHelper.generateAllKeyBuckleOpenCmd(dockType).let { cmd ->
-                        LogUtil.i("硬件:打开所有钥匙锁仓,${dock.addr},${cmd.data}")
                         modBusManager?.sendTo(dock.addr, cmd) { res ->
                         }
                     }
@@ -758,9 +764,7 @@ object ModBusController {
     ) {
         slaveAddress?.let {
             ModBusCMDHelper.generateKeyBuckleChargeCmd(isOpen, if (isLeft) 0 else 1)?.let { cmd ->
-                LogUtil.i("钥匙充电:${isOpen},${isLeft},${slaveAddress},${cmd.data.toHexStrings()}")
                 modBusManager?.sendTo(it, cmd) { res ->
-                    LogUtil.i("钥匙充电接收:${isOpen},${isLeft},${slaveAddress},${res.toHexStrings()}")
                     done?.invoke(res)
                 }
             }
@@ -1017,7 +1021,7 @@ object ModBusController {
             dockList.filter { it.type == DOCK_TYPE_KEY || it.type == DOCK_TYPE_PORTABLE }
                 .sortedBy { it.addr }.onEach { it.deviceList.sortBy { dev -> dev.idx } }
 
-        val keyList = keyDockList.flatMap { it.deviceList }.apply {
+        var keyList = keyDockList.flatMap { it.deviceList }.apply {
             LogUtil.i("keyStatus:${this}")
         }.filterIsInstance<DockBean.KeyBean>()
             .filterIndexed { idx, _ -> (idx + 1) !in slotCols }.filter { kb ->
@@ -1029,7 +1033,12 @@ object ModBusController {
             ToastUtils.tip(R.string.no_available_key)
             return null
         }
-        keyList.sortedBy { BusinessManager.getBleDeviceByMac(it.mac)?.token != null }
+        keyList = keyList.sortedWith(
+            compareByDescending<DockBean.KeyBean> {
+                BleManager.getInstance().isConnected(it.mac)
+            }    // 主键:在线优先
+                .thenByDescending { BusinessManager.getBleDeviceByMac(it.mac)?.token != null } // 次键:有 token 优先
+        )
 
         for (kb in keyList) {
             val mac = kb.mac ?: continue

+ 8 - 10
app/src/main/java/com/grkj/iscs/modbus/ModBusManager.kt → app/src/main/java/com/grkj/iscs_mars/modbus/ModBusManager.kt

@@ -1,18 +1,15 @@
-package com.grkj.iscs.modbus
+package com.grkj.iscs_mars.modbus
 
-import android.util.Log
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
-import com.grkj.iscs.MyApplication
-import com.grkj.iscs.extentions.crc16
-import com.grkj.iscs.extentions.toHexStrings
-import com.grkj.iscs.util.Executor
-import com.grkj.iscs.util.SPUtils
-import com.grkj.iscs.util.log.LogUtil
-import com.grkj.iscs.view.fragment.DockTestFragment
+import com.grkj.iscs_mars.MyApplication
+import com.grkj.iscs_mars.extentions.toHexStrings
+import com.grkj.iscs_mars.util.Executor
+import com.grkj.iscs_mars.util.SPUtils
+import com.grkj.iscs_mars.util.log.LogUtil
+import com.grkj.iscs_mars.view.fragment.DockTestFragment
 import kotlinx.coroutines.*
 import kotlinx.coroutines.channels.Channel
-import kotlin.random.Random
 
 /**
  * ModBus 协议管理器(协程版)
@@ -57,6 +54,7 @@ class ModBusManager(
                 }
             }
         }
+        portManager?.clearGarbageSafe()
         // 初始化地址池
         val dockConfig = SPUtils.getDockConfig(MyApplication.instance?.applicationContext!!)
         LogUtil.i("基座配置: ${dockConfig}")

+ 16 - 6
app/src/main/java/com/grkj/iscs/modbus/PortManager.kt → app/src/main/java/com/grkj/iscs_mars/modbus/PortManager.kt

@@ -1,13 +1,12 @@
-package com.grkj.iscs.modbus
+package com.grkj.iscs_mars.modbus
 
 import android.content.Context
 import androidx.annotation.WorkerThread
 import com.epton.sdk.SerialPort
-import com.google.android.datatransport.runtime.dagger.Reusable
-import com.grkj.iscs.util.Executor
-import com.grkj.iscs.util.SPUtils
-import com.grkj.iscs.util.ToastUtils
-import com.grkj.iscs.util.log.LogUtil
+import com.grkj.iscs_mars.util.Executor
+import com.grkj.iscs_mars.util.SPUtils
+import com.grkj.iscs_mars.util.ToastUtils
+import com.grkj.iscs_mars.util.log.LogUtil
 import java.io.File
 import java.io.IOException
 import java.io.InputStream
@@ -67,6 +66,17 @@ class PortManager private constructor(
         t?.start()
     }
 
+    /**
+     * 安全清除垃圾
+     */
+    fun clearGarbageSafe(timeoutMs: Int = 100) {
+        val buffer = ByteArray(256)
+        val start = System.currentTimeMillis()
+        while ((System.currentTimeMillis() - start) < timeoutMs && input.available() > 0) {
+            input.read(buffer)
+        }
+    }
+
     /**
      * 关闭
      */

+ 1 - 1
app/src/main/java/com/grkj/iscs/modbus/StatusListener.kt → app/src/main/java/com/grkj/iscs_mars/modbus/StatusListener.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.modbus
+package com.grkj.iscs_mars.modbus
 
 /**
  * 状态监听器

+ 4 - 4
app/src/main/java/com/grkj/iscs/model/Constants.kt → app/src/main/java/com/grkj/iscs_mars/model/Constants.kt

@@ -1,9 +1,9 @@
-package com.grkj.iscs.model
+package com.grkj.iscs_mars.model
 
 import android.content.Context
-import com.grkj.iscs.R
-import com.grkj.iscs.util.CommonUtils
-import com.grkj.iscs.util.SPUtils
+import com.grkj.iscs_mars.R
+import com.grkj.iscs_mars.util.CommonUtils
+import com.grkj.iscs_mars.util.SPUtils
 
 object Constants {
     const val DEVICE_TYPE = 1 // 1.机柜 2.物料柜 3.手提柜 4.混合柜

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/DeviceConst.kt → app/src/main/java/com/grkj/iscs_mars/model/DeviceConst.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model
+package com.grkj.iscs_mars.model
 
 object DeviceConst {
 

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/DictAndSystemConstants.kt → app/src/main/java/com/grkj/iscs_mars/model/DictAndSystemConstants.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model
+package com.grkj.iscs_mars.model
 
 /**
  * 字典参数

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/FileBean.kt → app/src/main/java/com/grkj/iscs_mars/model/FileBean.kt

@@ -1,3 +1,3 @@
-package com.grkj.iscs.model
+package com.grkj.iscs_mars.model
 
 data class FileBean(var fileName: String?, var pathStr: String, var isAssets: Boolean)

+ 2 - 2
app/src/main/java/com/grkj/iscs/model/ISCSDomainData.kt → app/src/main/java/com/grkj/iscs_mars/model/ISCSDomainData.kt

@@ -1,6 +1,6 @@
-package com.grkj.iscs.model
+package com.grkj.iscs_mars.model
 
-import com.grkj.iscs.enums.DeviceInputTypeEnum
+import com.grkj.iscs_mars.enums.DeviceInputTypeEnum
 
 /**
  * 业务数据

+ 1 - 2
app/src/main/java/com/grkj/iscs/model/Token.kt → app/src/main/java/com/grkj/iscs_mars/model/Token.kt

@@ -1,8 +1,7 @@
-package com.grkj.iscs.model
+package com.grkj.iscs_mars.model
 
 import android.content.Context
 import android.content.SharedPreferences
-import java.util.concurrent.TimeUnit
 
 class Token(
     val token: String,

+ 2 - 2
app/src/main/java/com/grkj/iscs/model/UrlConsts.kt → app/src/main/java/com/grkj/iscs_mars/model/UrlConsts.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model
+package com.grkj.iscs_mars.model
 
 object UrlConsts {
     //    const val BASE_URL = "http://192.168.28.82:9190"  // 本地
@@ -236,7 +236,7 @@ object UrlConsts {
      * 删除用户特征(指纹、面部)
      */
     const val REMOVE_USER_CHARACTERISTIC =
-        "/system/user/characteristic/removeSysUserCharacteristicByRecordIds"
+        "/system/user/characteristic/deleteSysUserCharacteristicByRecordIds"
 
     /**
      * 新增异常记录

+ 2 - 2
app/src/main/java/com/grkj/iscs/model/bo/DeviceTakeUpdateBO.kt → app/src/main/java/com/grkj/iscs_mars/model/bo/DeviceTakeUpdateBO.kt

@@ -1,7 +1,7 @@
-package com.grkj.iscs.model.bo
+package com.grkj.iscs_mars.model.bo
 
 /**
- * @param deviceType {@link [com.grkj.iscs.model.bo.DeviceTakeUpdateBO]<class>#[deviceType]}
+ * @param deviceType {@link [com.grkj.iscs_mars.model.bo.DeviceTakeUpdateBO]<class>#[deviceType]}
  */
 data class DeviceTakeUpdateBO(
     val deviceType: Int,    // DeviceConst.DEVICE_TYPE_KEY or DeviceConst.DEVICE_TYPE_LOCK

+ 8 - 0
app/src/main/java/com/grkj/iscs_mars/model/bo/DockStatusBO.kt

@@ -0,0 +1,8 @@
+package com.grkj.iscs_mars.model.bo
+
+import com.grkj.iscs_mars.view.fragment.DockTestFragment.DockTestBean
+
+data class DockStatusBO(
+    val row: Int,
+    val dockList: MutableList<DockTestBean>
+)

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/bo/LoginUserBO.kt → app/src/main/java/com/grkj/iscs_mars/model/bo/LoginUserBO.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.bo
+package com.grkj.iscs_mars.model.bo
 
 data class LoginUserBO(
     val userId: Long?,

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/bo/PageChangeBO.kt → app/src/main/java/com/grkj/iscs_mars/model/bo/PageChangeBO.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.bo
+package com.grkj.iscs_mars.model.bo
 
 data class PageChangeBO(
     val pageIdx: Int,   // -1为回首页,连续跳转,即车间岗位页

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/bo/UpdateKeyReturnBO.kt → app/src/main/java/com/grkj/iscs_mars/model/bo/UpdateKeyReturnBO.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.bo
+package com.grkj.iscs_mars.model.bo
 
 data class UpdateKeyReturnBO(
     val ticketId: Long,

+ 8 - 5
app/src/main/java/com/grkj/iscs/model/bo/WorkTicketGetBO.kt → app/src/main/java/com/grkj/iscs_mars/model/bo/WorkTicketGetBO.kt

@@ -1,9 +1,8 @@
-package com.grkj.iscs.model.bo
+package com.grkj.iscs_mars.model.bo
 
-import com.grkj.iscs.MyApplication
-import com.grkj.iscs.R
-import com.grkj.iscs.util.NetApi
-import com.grkj.iscs.util.log.LogUtil
+import com.grkj.iscs_mars.BusinessManager.CAN_RETURN
+import com.grkj.iscs_mars.util.NetApi
+import com.grkj.iscs_mars.util.log.LogUtil
 import kotlin.coroutines.resume
 import kotlin.coroutines.suspendCoroutine
 
@@ -94,6 +93,10 @@ class WorkTicketGetBO {
         // 如果没有数据,默认本地完成且远程未完成
         if (data.isNullOrEmpty()) return true to false
 
+        if (!CAN_RETURN) {
+            return true to true
+        }
+
         var anyRemoteFinished = false
         //点位的rfid是否被刷到锁的rfid
         val pointRfidEqLockRfid = data?.any { dataDto ->

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/bo/WorkTicketSendBO.kt → app/src/main/java/com/grkj/iscs_mars/model/bo/WorkTicketSendBO.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.bo
+package com.grkj.iscs_mars.model.bo
 
 /**
  * 工作票下发BO

+ 8 - 0
app/src/main/java/com/grkj/iscs_mars/model/eventmsg/CurrentModeMsg.kt

@@ -0,0 +1,8 @@
+package com.grkj.iscs_mars.model.eventmsg
+
+import com.grkj.iscs_mars.ble.BleBean
+
+data class CurrentModeMsg(
+    val bleBean: BleBean,
+    val mode: Byte
+)

+ 9 - 0
app/src/main/java/com/grkj/iscs_mars/model/eventmsg/DeviceExceptionMsg.kt

@@ -0,0 +1,9 @@
+package com.grkj.iscs_mars.model.eventmsg
+
+/**
+ * @param type {@link [com.grkj.iscs_mars.model.DeviceConst]<class>#[deviceType]}
+ */
+data class DeviceExceptionMsg(
+    val type: Int,
+    val rfid: String
+)

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/eventmsg/DeviceTakeUpdateMsg.kt → app/src/main/java/com/grkj/iscs_mars/model/eventmsg/DeviceTakeUpdateMsg.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.eventmsg
+package com.grkj.iscs_mars.model.eventmsg
 
 data class DeviceTakeUpdateMsg(
     val deviceType: Int,    // 0:钥匙 1:挂锁

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/eventmsg/GetTicketStatusMsg.kt → app/src/main/java/com/grkj/iscs_mars/model/eventmsg/GetTicketStatusMsg.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.eventmsg
+package com.grkj.iscs_mars.model.eventmsg
 
 import com.clj.fastble.data.BleDevice
 

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/eventmsg/LoadingMsg.kt → app/src/main/java/com/grkj/iscs_mars/model/eventmsg/LoadingMsg.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.eventmsg
+package com.grkj.iscs_mars.model.eventmsg
 
 data class LoadingMsg(
     val isShow: Boolean,                    // 是否显示loading

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/eventmsg/MsgEvent.kt → app/src/main/java/com/grkj/iscs_mars/model/eventmsg/MsgEvent.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.eventmsg
+package com.grkj.iscs_mars.model.eventmsg
 
 data class MsgEvent(
     val code: Int,

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/eventmsg/MsgEventConstants.kt → app/src/main/java/com/grkj/iscs_mars/model/eventmsg/MsgEventConstants.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.eventmsg
+package com.grkj.iscs_mars.model.eventmsg
 
 object MsgEventConstants {
 

+ 2 - 2
app/src/main/java/com/grkj/iscs/model/eventmsg/SwitchModeMsg.kt → app/src/main/java/com/grkj/iscs_mars/model/eventmsg/SwitchModeMsg.kt

@@ -1,6 +1,6 @@
-package com.grkj.iscs.model.eventmsg
+package com.grkj.iscs_mars.model.eventmsg
 
-import com.grkj.iscs.ble.BleBean
+import com.grkj.iscs_mars.ble.BleBean
 
 /**
  * job : 0x01:工作模式 0x02:待机模式

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/eventmsg/UpdateTicketProgressMsg.kt → app/src/main/java/com/grkj/iscs_mars/model/eventmsg/UpdateTicketProgressMsg.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.eventmsg
+package com.grkj.iscs_mars.model.eventmsg
 
 data class UpdateTicketProgressMsg(
     val ticketId: Long

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/presentation/WorkTicketBean.kt → app/src/main/java/com/grkj/iscs_mars/model/presentation/WorkTicketBean.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.presentation
+package com.grkj.iscs_mars.model.presentation
 
 class WorkTicketBean {
     /**

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/presentation/WorkTicketStatusBean.kt → app/src/main/java/com/grkj/iscs_mars/model/presentation/WorkTicketStatusBean.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.presentation
+package com.grkj.iscs_mars.model.presentation
 
 class WorkTicketStatusBean {
     /**

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/vo/BaseVO.kt → app/src/main/java/com/grkj/iscs_mars/model/vo/BaseVO.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.vo
+package com.grkj.iscs_mars.model.vo
 
 open class BaseVO<T> {
     val code = 0

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/vo/FileStreamReqParam.kt → app/src/main/java/com/grkj/iscs_mars/model/vo/FileStreamReqParam.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.vo
+package com.grkj.iscs_mars.model.vo
 
 data class FileStreamReqParam(
     val name: String,

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/vo/cabinet/LockCabinetPageRespVO.kt → app/src/main/java/com/grkj/iscs_mars/model/vo/cabinet/LockCabinetPageRespVO.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.vo.cabinet
+package com.grkj.iscs_mars.model.vo.cabinet
 
 /**
  * 锁柜列表实体

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/vo/card/CardInfoRespVO.kt → app/src/main/java/com/grkj/iscs_mars/model/vo/card/CardInfoRespVO.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.vo.card
+package com.grkj.iscs_mars.model.vo.card
 
 import java.io.Serializable
 

+ 3 - 1
app/src/main/java/com/grkj/iscs/model/vo/characteristic/CharacteristicPageRespVO.kt → app/src/main/java/com/grkj/iscs_mars/model/vo/characteristic/CharacteristicPageRespVO.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.vo.characteristic
+package com.grkj.iscs_mars.model.vo.characteristic
 
 data class CharacteristicPageRespVO(
     val countId: Any,
@@ -25,6 +25,8 @@ data class CharacteristicPageRespVO(
 
         val imagePath: String?,
 
+        val groupCode: String?,
+
         val orderNum: Int?,
 
         val delFlag: String?,

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/vo/dept/DeptListRespVO.kt → app/src/main/java/com/grkj/iscs_mars/model/vo/dept/DeptListRespVO.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.vo.dept
+package com.grkj.iscs_mars.model.vo.dept
 
 data class DeptListRespVO(
     /** 部门ID */

+ 2 - 2
app/src/main/java/com/grkj/iscs/model/vo/dict/CommonDictRespVO.kt → app/src/main/java/com/grkj/iscs_mars/model/vo/dict/CommonDictRespVO.kt

@@ -1,6 +1,6 @@
-package com.grkj.iscs.model.vo.dict
+package com.grkj.iscs_mars.model.vo.dict
 
-import com.grkj.iscs.model.vo.ticket.TicketTypeRespVO.Params
+import com.grkj.iscs_mars.model.vo.ticket.TicketTypeRespVO.Params
 
 data class CommonDictRespVO(
     val createBy: String?,

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/vo/finger/LoginCharacteristicRespVO.kt → app/src/main/java/com/grkj/iscs_mars/model/vo/finger/LoginCharacteristicRespVO.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.vo.finger
+package com.grkj.iscs_mars.model.vo.finger
 
 data class LoginCharacteristicRespVO(
     val msg: String?,

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/vo/hardware/CabinetSlotsRespVo.kt → app/src/main/java/com/grkj/iscs_mars/model/vo/hardware/CabinetSlotsRespVo.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.vo.hardware
+package com.grkj.iscs_mars.model.vo.hardware
 
 /**
  * 锁柜-仓位返回实体

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/vo/hardware/JobCardPageRespVO.kt → app/src/main/java/com/grkj/iscs_mars/model/vo/hardware/JobCardPageRespVO.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.vo.hardware
+package com.grkj.iscs_mars.model.vo.hardware
 
 data class JobCardPageRespVO(
     val total: Int,

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/vo/hardware/RfidTokenPageRespVO.kt → app/src/main/java/com/grkj/iscs_mars/model/vo/hardware/RfidTokenPageRespVO.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.vo.hardware
+package com.grkj.iscs_mars.model.vo.hardware
 
 data class RfidTokenPageRespVO(
     val total: Int,

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/vo/hardware/SwitchListReqVO.kt → app/src/main/java/com/grkj/iscs_mars/model/vo/hardware/SwitchListReqVO.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.model.vo.hardware
+package com.grkj.iscs_mars.model.vo.hardware
 
 /**
  * 开关状态请求实体

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно