Ver Fonte

feat(作业管理)
- 新增弹窗遮罩
- 切换联网版和标准版入口添加
- 快捷入口新增

周文健 há 3 meses atrás
pai
commit
b2ce7ee159
28 ficheiros alterados com 485 adições e 48 exclusões
  1. 1 1
      app/build.gradle.kts
  2. 13 4
      app/src/main/AndroidManifest.xml
  3. 37 0
      app/src/main/java/com/grkj/iscs/features/init/activity/SetRemoteServerActivity.kt
  4. 7 5
      app/src/main/java/com/grkj/iscs/features/init/fragment/InitSetRemoteServerFragment.kt
  5. 1 0
      app/src/main/java/com/grkj/iscs/features/init/viewmodel/InitDeviceRegistrationKeyAndLockViewModel.kt
  6. 11 4
      app/src/main/java/com/grkj/iscs/features/login/activity/LoginActivity.kt
  7. 1 0
      app/src/main/java/com/grkj/iscs/features/login/dialog/LoginDialog.kt
  8. 122 0
      app/src/main/java/com/grkj/iscs/features/main/activity/QuickEntryActivity.kt
  9. 2 6
      app/src/main/java/com/grkj/iscs/features/main/dialog/CheckFaceDialog.kt
  10. 2 0
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/SlotsExceptionReportDialog.kt
  11. 2 0
      app/src/main/java/com/grkj/iscs/features/main/dialog/user_info/AddFingerprintDialog.kt
  12. 4 12
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt
  13. 5 3
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/MainViewModel.kt
  14. 100 0
      app/src/main/res/layout-land/activity_quick_entry.xml
  15. 102 0
      app/src/main/res/layout/activity_quick_entry.xml
  16. 20 0
      app/src/main/res/layout/activity_set_remote_server.xml
  17. 6 4
      app/src/main/res/layout/dialog_drop_down_list.xml
  18. 19 5
      app/src/main/res/layout/fragment_init_set_remote_server.xml
  19. 11 0
      app/src/main/res/navigation/nav_set_remote_server.xml
  20. 2 0
      app/src/main/res/values-en/strings.xml
  21. 2 0
      app/src/main/res/values-zh/strings.xml
  22. 2 0
      app/src/main/res/values/strings.xml
  23. 1 1
      data/src/main/java/com/grkj/data/dao/IsolationPointDao.kt
  24. 1 1
      data/src/main/java/com/grkj/data/dao/JobTicketDao.kt
  25. 1 1
      gradle/libs.versions.toml
  26. 4 1
      ui-base/src/main/java/com/grkj/ui_base/business/BleBusinessManager.kt
  27. 3 0
      ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleConnectionManager.kt
  28. 3 0
      ui-base/src/main/java/com/grkj/ui_base/utils/modbus/ModBusController.kt

+ 1 - 1
app/build.gradle.kts

@@ -15,7 +15,7 @@ android {
         minSdk = 24
         targetSdk = 35
         versionCode = 1
-        versionName = "v1.0"
+        versionName = "v1.0.0"
 
         testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
     }

+ 13 - 4
app/src/main/AndroidManifest.xml

@@ -32,8 +32,8 @@
         android:fullBackupContent="@xml/backup_rules"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
-        android:supportsRtl="true"
         android:requestLegacyExternalStorage="true"
+        android:supportsRtl="true"
         android:theme="@style/Theme.ISCS_BASE_APP"
         tools:targetApi="31">
         <activity
@@ -45,15 +45,24 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-        <activity android:name=".features.init.activity.InitActivity"
+        <activity
+            android:name=".features.init.activity.InitActivity"
             android:windowSoftInputMode="stateHidden|adjustPan" />
         <activity
             android:name=".features.login.activity.LoginActivity"
             android:exported="true" />
         <activity
             android:name=".features.main.activity.MainActivity"
-            android:windowSoftInputMode="stateHidden|adjustPan"
-            android:exported="true" />
+            android:exported="true"
+            android:windowSoftInputMode="stateHidden|adjustPan" />
+        <activity
+            android:name=".features.main.activity.QuickEntryActivity"
+            android:exported="true"
+            android:windowSoftInputMode="stateHidden|adjustPan" />
+        <activity
+            android:name=".features.init.activity.SetRemoteServerActivity"
+            android:exported="true"
+            android:windowSoftInputMode="stateHidden|adjustPan" />
 
         <receiver
             android:name=".receivers.BootReceiver"

+ 37 - 0
app/src/main/java/com/grkj/iscs/features/init/activity/SetRemoteServerActivity.kt

@@ -0,0 +1,37 @@
+package com.grkj.iscs.features.init.activity
+
+import android.view.InputDevice
+import android.view.KeyEvent
+import com.grkj.iscs.R
+import com.grkj.iscs.databinding.ActivitySetRemoteServerBinding
+import com.grkj.shared.config.Constants
+import com.grkj.shared.utils.extension.toByteArrays
+import com.grkj.shared.utils.extension.toHexStrings
+import com.grkj.ui_base.base.BaseActivity
+import com.grkj.ui_base.utils.ble.BleUtil
+import com.grkj.ui_base.utils.event.CardSwipeEvent
+import com.sik.sikcore.SIKCore
+import dagger.hilt.android.AndroidEntryPoint
+
+/**
+ * 设置远程服务器
+ */
+@AndroidEntryPoint
+class SetRemoteServerActivity : BaseActivity<ActivitySetRemoteServerBinding>() {
+    override fun navHostFragmentId() = R.id.nav_host_fragment
+    override fun getLayoutId(): Int {
+        return R.layout.activity_set_remote_server
+    }
+
+    override fun initView() {
+        requestPermissionsIfNeeded(*Constants.needPermission) {
+            if (it) {
+                BleUtil.instance?.initBle(SIKCore.getApplication())
+                logger.info("权限获取成功")
+            } else {
+                logger.info("权限获取失败")
+            }
+        }
+    }
+
+}

+ 7 - 5
app/src/main/java/com/grkj/iscs/features/init/fragment/InitSetRemoteServerFragment.kt

@@ -6,6 +6,7 @@ import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentInitSetRemoteServerBinding
 import com.grkj.iscs.utils.ServerUtils
 import com.grkj.ui_base.base.BaseFragment
+import com.grkj.ui_base.utils.event.RestartAppEvent
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.extension.saveMMKVData
 import com.sik.sikcore.extension.setDebouncedClickListener
@@ -25,15 +26,16 @@ class InitSetRemoteServerFragment : BaseFragment<FragmentInitSetRemoteServerBind
     }
 
     override fun initView() {
-        binding.previousBtn.setDebouncedClickListener {
-            requireActivity().finish()
-        }
-        binding.nextBtn.setDebouncedClickListener {
+        binding.confirm.setDebouncedClickListener {
             if (checkData()) {
                 MMKVConstants.SERVER_ADDRESS.saveMMKVData(serverAddress)
-                requireActivity().finish()
+                RestartAppEvent.sendRestartAppEvent()
             }
         }
+        binding.changeToStandard.setDebouncedClickListener {
+            MMKVConstants.SERVER_ADDRESS.saveMMKVData("")
+            RestartAppEvent.sendRestartAppEvent()
+        }
     }
 
     private fun checkData(): Boolean {

+ 1 - 0
app/src/main/java/com/grkj/iscs/features/init/viewmodel/InitDeviceRegistrationKeyAndLockViewModel.kt

@@ -78,6 +78,7 @@ class InitDeviceRegistrationKeyAndLockViewModel @Inject constructor(val hardware
                 })
             if (newHardwareKeyBean.isNotEmpty()) {
                 BleManager.getInstance().disconnectAllDevice()
+                BleConnectionManager.deviceList.clear()
                 logger.info("断开所有蓝牙设备")
             }
             alreadyUsedMac.addAll(

+ 11 - 4
app/src/main/java/com/grkj/iscs/features/login/activity/LoginActivity.kt

@@ -19,6 +19,7 @@ import com.grkj.data.model.local.LoginMenuEntity
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.ActivityLoginBinding
 import com.grkj.iscs.databinding.ItemLoginMethodBinding
+import com.grkj.iscs.features.init.activity.SetRemoteServerActivity
 import com.grkj.iscs.features.login.dialog.LoginDialog
 import com.grkj.iscs.features.login.viewmodel.LoginViewModel
 import com.grkj.iscs.features.main.activity.MainActivity
@@ -72,6 +73,10 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
                 onLoginMenuBinding(this)
             }
         }
+        binding.version.setOnLongClickListener {
+            startActivity(Intent(this, SetRemoteServerActivity::class.java))
+            true
+        }
     }
 
     private fun BindingAdapter.BindingViewHolder.onLoginMenuBinding(holder: BindingAdapter.BindingViewHolder) {
@@ -94,7 +99,7 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
 
     override fun initData() {
         super.initData()
-        viewModel.registerFaceFeature().observe(this){}
+        viewModel.registerFaceFeature().observe(this) {}
         //todo 测试用,直接创建管理员账号
 //        viewModel.insertAdminAccount().observe(this){}
         requestPermissionsIfNeeded(*Constants.needPermission) {
@@ -149,12 +154,14 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
         FingerprintUtil.start()
         FingerprintUtil.setScanListener(object : FingerprintUtil.OnScanListener {
             override fun onScan(bitmap: Bitmap) {
-                if (ISCSConfig.isNetVersion){
+                if (ISCSConfig.isNetVersion) {
                     LoadingEvent.sendLoadingEvent(
                         CommonUtils.getStr(com.grkj.ui_base.R.string.doing_login),
                         true
                     )
-                    viewModel.loginWithFingerprint(ImageConvertUtils.bitmapToBase64(bitmap).toString())
+                    viewModel.loginWithFingerprint(
+                        ImageConvertUtils.bitmapToBase64(bitmap).toString()
+                    )
                         .observe(this@LoginActivity) { isSuccess ->
                             LoadingEvent.sendLoadingEvent()
                             if (isSuccess) {
@@ -167,7 +174,7 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
             }
 
             override fun onScan(temp: ByteArray?) {
-                if (!ISCSConfig.isNetVersion){
+                if (!ISCSConfig.isNetVersion) {
                     viewModel.loginWithFingerprint(temp)
                         .observe(this@LoginActivity) { isSuccess ->
                             LoadingEvent.sendLoadingEvent()

+ 1 - 0
app/src/main/java/com/grkj/iscs/features/login/dialog/LoginDialog.kt

@@ -52,6 +52,7 @@ class LoginDialog(
 
     override fun onBind(customDialog: CustomDialog, contentView: View) {
         mBinding = DialogLoginBinding.bind(contentView)
+        customDialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
         customDialog.setDialogLifecycleCallback(object : DialogLifecycleCallback<CustomDialog>() {
             override fun onDismiss(dialog: CustomDialog?) {
                 ArcSoftUtil.stop()

+ 122 - 0
app/src/main/java/com/grkj/iscs/features/main/activity/QuickEntryActivity.kt

@@ -0,0 +1,122 @@
+package com.grkj.iscs.features.main.activity
+
+import android.content.Intent
+import android.view.InputDevice
+import android.view.KeyEvent
+import android.view.Menu
+import android.view.View
+import androidx.activity.viewModels
+import androidx.core.view.get
+import androidx.core.view.isNotEmpty
+import androidx.core.view.isVisible
+import coil.load
+import com.grkj.data.data.EventConstants
+import com.grkj.data.data.MainDomainData
+import com.grkj.data.enums.RoleFunctionalPermissionsEnum
+import com.grkj.data.model.local.TabConfig
+import com.grkj.iscs.R
+import com.grkj.iscs.databinding.ActivityMainBinding
+import com.grkj.iscs.databinding.ActivityQuickEntryBinding
+import com.grkj.iscs.features.login.activity.LoginActivity
+import com.grkj.iscs.features.main.viewmodel.MainViewModel
+import com.grkj.shared.model.EventBean
+import com.grkj.ui_base.base.BaseActivity
+import com.grkj.ui_base.utils.event.BottomNavVisibilityEvent
+import com.grkj.shared.utils.extension.toByteArrays
+import com.grkj.shared.utils.extension.toHexStrings
+import com.grkj.ui_base.utils.event.FlashTipEvent
+import com.grkj.ui_base.utils.event.RFIDCardReadEvent
+import com.sik.sikandroid.activity.ActivityTracker
+import com.sik.sikandroid.activity.ActivityUtil
+import com.sik.sikcore.extension.file
+import com.sik.sikimage.ImageConvertUtils
+import dagger.hilt.android.AndroidEntryPoint
+
+/**
+ * 首页
+ */
+@AndroidEntryPoint
+class QuickEntryActivity() : BaseActivity<ActivityQuickEntryBinding>() {
+    private val viewModel: MainViewModel by viewModels()
+    private var cardNo: String = ""
+    private var initialDestId: Int = 0
+
+    override fun navHostFragmentId() = R.id.nav_host_fragment
+
+    override fun getLayoutId(): Int {
+        return R.layout.activity_quick_entry
+    }
+
+    override fun initView() {
+        // 获取传入的数据
+        val navGraphId = intent.getIntExtra("nav_graph_id", 0)
+        initialDestId = intent.getIntExtra("dest_id", 0)
+        if (navGraphId == 0 || initialDestId == 0) {
+            finish()
+            return
+        }
+        replaceNavGraph(navGraphId)
+        navController.navigate(initialDestId)
+        binding.nickname.text = MainDomainData.userInfo?.nickName ?: ""
+        (MainDomainData.userInfo?.avatar
+            ?: MainDomainData.userBiometricDataVo.find { it.type == "2" }?.content)?.let {
+            if (it.isNotEmpty()) {
+                val faceData = it.file().readText()
+                val avatar = ImageConvertUtils.base64ToBitmap(faceData)
+                binding.avatar.load(avatar)
+            }
+        }
+
+        binding.userInfoLayout.setOnClickListener {
+            if (MainDomainData.permissions.contains(RoleFunctionalPermissionsEnum.USER_INFO_HOME.functionalPermission)) {
+                replaceNavGraph(R.navigation.nav_user_info)
+            }
+        }
+    }
+
+    override fun onEvent(event: EventBean<Any>) {
+        super.onEvent(event)
+        when (event.code) {
+            EventConstants.EVENT_LOGOUT -> {
+                logout()
+            }
+
+            EventConstants.EVENT_FLASH_TIP_CODE -> {
+                (event.data as FlashTipEvent).apply {
+                    binding.flashTipTv.isVisible = isShow
+                    binding.flashTipTv.text = msg
+                }
+            }
+        }
+    }
+
+    override fun initData() {
+        super.initData()
+        viewModel.bleIndicate()
+        viewModel.registerStatusListener()
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_UP && event.source == InputDevice.SOURCE_KEYBOARD) {
+            // 检测到回车开始处理
+            if (event.keyCode == 66) {
+                logger.info("Swipe card login Origin: $cardNo")
+                cardNo = cardNo.toLong().toByteArrays().toHexStrings(false)
+                logger.info("Swipe card login: $cardNo")
+                RFIDCardReadEvent.sendRFIDCardReadEvent(cardNo)
+                // 重置cardNo
+                cardNo = ""
+                return super.dispatchKeyEvent(event)
+            }
+            cardNo += event.keyCharacterMap.getDisplayLabel(event.keyCode)
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    /**
+     * 退出登录
+     */
+    private fun logout() {
+        finish()
+    }
+}

+ 2 - 6
app/src/main/java/com/grkj/iscs/features/main/dialog/CheckFaceDialog.kt

@@ -2,13 +2,9 @@ package com.grkj.iscs.features.main.dialog
 
 import android.graphics.Bitmap
 import android.view.View
-import androidx.appcompat.widget.PopupMenu
 import androidx.lifecycle.LifecycleOwner
-import com.grkj.data.model.res.UserInfoRes
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogCheckFaceBinding
-import com.grkj.iscs.databinding.DialogLoginBinding
-import com.grkj.iscs.features.login.viewmodel.LoginViewModel
 import com.grkj.shared.utils.ArcSoftUtil
 import com.grkj.ui_base.base.BaseViewModel
 import com.grkj.ui_base.config.ISCSConfig
@@ -19,12 +15,11 @@ import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.DialogLifecycleCallback
 import com.kongzue.dialogx.interfaces.OnBindView
-import com.sik.sikcore.SIKCore
 import com.sik.sikandroid.activity.ActivityTracker
+import com.sik.sikcore.SIKCore
 import com.sik.sikcore.extension.setDebouncedClickListener
 import com.sik.sikcore.thread.ThreadUtils
 import com.sik.sikimage.ImageConvertUtils
-import com.sik.sikimage.ImageUtils
 
 /**
  * 检查人脸弹窗
@@ -53,6 +48,7 @@ class CheckFaceDialog(
 
     override fun onBind(customDialog: CustomDialog, contentView: View) {
         mBinding = DialogCheckFaceBinding.bind(contentView)
+        customDialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
         customDialog.setDialogLifecycleCallback(object : DialogLifecycleCallback<CustomDialog>() {
             override fun onDismiss(dialog: CustomDialog?) {
                 ArcSoftUtil.stop()

+ 2 - 0
app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/SlotsExceptionReportDialog.kt

@@ -4,6 +4,7 @@ import android.content.Context
 import android.view.View
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogSlotsExceptionReportBinding
+import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
@@ -23,6 +24,7 @@ class SlotsExceptionReportDialog(
     override fun onBind(dialog: CustomDialog, contentView: View) {
         binding = DialogSlotsExceptionReportBinding.bind(contentView)
         dialog?.isCancelable = false
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
         binding.hardwareInfo.text = context.getString(
             com.grkj.ui_base.R.string.hardware_info,
             "${getDeviceTypeStr(slotType)},${context.getString(com.grkj.ui_base.R.string.number)} 行${row},列${col}"

+ 2 - 0
app/src/main/java/com/grkj/iscs/features/main/dialog/user_info/AddFingerprintDialog.kt

@@ -3,6 +3,7 @@ package com.grkj.iscs.features.main.dialog.user_info
 import android.view.View
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogAddFingerprintBinding
+import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.interfaces.OnBindView
 import com.sik.sikcore.extension.setDebouncedClickListener
@@ -15,6 +16,7 @@ class AddFingerprintDialog(val onCancel: () -> Unit) :
     private lateinit var binding: DialogAddFingerprintBinding
     override fun onBind(dialog: CustomDialog, p1: View) {
         binding = DialogAddFingerprintBinding.bind(p1)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
         dialog.isCancelable = false
         binding.cancel.setDebouncedClickListener {
             onCancel()

+ 4 - 12
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt

@@ -35,6 +35,7 @@ import com.grkj.data.data.Type
 import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.iscs.features.main.dialog.CheckFaceDialog
+import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.event.FlashTipEvent
@@ -42,6 +43,7 @@ import com.grkj.ui_base.utils.event.RFIDCardReadEvent
 import com.grkj.ui_base.utils.event.UiEvent
 import com.grkj.ui_base.utils.extension.tip
 import com.grkj.ui_base.utils.extension.toggleExpandView
+import com.kongzue.dialogx.dialogs.BottomMenu
 import com.kongzue.dialogx.dialogs.PopMenu
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
@@ -97,12 +99,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                 showToast(CommonUtils.getStr(R.string.not_group_can_lock).toString())
                 return@setDebouncedClickListener
             }
-            PopMenu.build().setBaseView(binding.toLock)
-                .setAlignGravity(Gravity.TOP or Gravity.CENTER_HORIZONTAL)
-                .apply {
-                    isOverlayBaseView = false
-                }
-                .setWidth(220)
+            BottomMenu.build()
                 .setMenuList(viewModel.groupInfo.map { it.groupName })
                 .setOnMenuItemClickListener { popMenu, itemText, position ->
                     popMenu.dismiss()
@@ -116,12 +113,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                 showToast(CommonUtils.getStr(R.string.not_group_can_unlock).toString())
                 return@setDebouncedClickListener
             }
-            PopMenu.build().setBaseView(binding.toUnlock)
-                .setAlignGravity(Gravity.TOP or Gravity.CENTER_HORIZONTAL)
-                .apply {
-                    isOverlayBaseView = false
-                }
-                .setWidth(220)
+            BottomMenu.build()
                 .setMenuList(viewModel.groupInfo.map { it.groupName })
                 .setOnMenuItemClickListener { popMenu, itemText, position ->
                     popMenu.dismiss()

+ 5 - 3
app/src/main/java/com/grkj/iscs/features/main/viewmodel/MainViewModel.kt

@@ -71,7 +71,7 @@ class MainViewModel @Inject constructor() : BaseViewModel() {
                                     )
                                 }
                                 ThreadUtils.runOnIO {
-                                    suspend fun readJobTicket(mac: String) {
+                                    suspend fun readJobTicket(mac: String, retryCount: Int = 3) {
                                         val isConnect =
                                             BleConnectionManager.tryConnectWithOptionalCharge(
                                                 mac
@@ -91,9 +91,11 @@ class MainViewModel @Inject constructor() : BaseViewModel() {
                                                     )
                                                 }
                                             }
-                                        } else {
+                                        } else if (retryCount > 0) {
                                             delay(1500)
-                                            readJobTicket(mac)
+                                            readJobTicket(mac, retryCount - 1)
+                                        } else {
+                                            LoadingEvent.sendLoadingEvent()
                                         }
                                     }
                                     if (!ISCSConfig.isDeviceRegistration) {

+ 100 - 0
app/src/main/res/layout-land/activity_quick_entry.xml

@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@mipmap/bg_main"
+        android:fitsSystemWindows="true"
+        android:orientation="vertical">
+
+        <FrameLayout
+            android:id="@+id/header_layout"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/header_height"
+            android:paddingHorizontal="@dimen/common_spacing_small">
+
+            <ImageView
+                android:layout_width="@dimen/header_logo_width"
+                android:layout_height="@dimen/header_logo_height"
+                android:layout_gravity="center_vertical"
+                android:src="@mipmap/icon_logo" />
+
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_gravity="right"
+                android:orientation="horizontal">
+
+                <TextClock
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:format12Hour="yyyy-MM-dd HH:mm:ss"
+                    android:format24Hour="yyyy-MM-dd HH:mm:ss"
+                    android:gravity="center_vertical"
+                    android:paddingHorizontal="@dimen/header_time_padding"
+                    android:textColor="@color/white"
+                    android:textSize="@dimen/header_time_text_size" />
+
+                <LinearLayout
+                    android:id="@+id/user_info_layout"
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:orientation="horizontal">
+
+                    <ImageView
+                        android:id="@+id/avatar"
+                        android:layout_width="@dimen/avatar_size"
+                        android:layout_height="@dimen/avatar_size"
+                        android:layout_gravity="center_vertical"
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:padding="@dimen/common_spacing"
+                        android:src="@mipmap/icon_avatar" />
+
+                    <TextView
+                        android:id="@+id/nickname"
+                        android:layout_width="wrap_content"
+                        android:layout_height="match_parent"
+                        android:layout_marginLeft="@dimen/home_nickname_margin"
+                        android:gravity="center"
+                        android:textColor="@color/white"
+                        android:textSize="@dimen/home_nickname_text_size" />
+                </LinearLayout>
+            </LinearLayout>
+
+
+            <com.grkj.ui_base.widget.FlashingTipTextView
+                android:id="@+id/flash_tip_tv"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:background="@drawable/bg_main_color_tip"
+                android:drawableLeft="@mipmap/tip"
+                android:drawablePadding="@dimen/common_spacing"
+                android:gravity="center_vertical"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:textColor="@color/white"
+                android:textSize="@dimen/common_btn_text_size"
+                android:visibility="gone" />
+        </FrameLayout>
+
+        <View
+            android:id="@+id/header_line"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line_height"
+            android:layout_below="@+id/header_layout"
+            android:background="@color/white30" />
+
+        <androidx.fragment.app.FragmentContainerView
+            android:id="@+id/nav_host_fragment"
+            android:name="androidx.navigation.fragment.NavHostFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_below="@+id/header_line"
+            android:layout_toRightOf="@+id/nav_bar"
+            app:defaultNavHost="true"
+            app:navGraph="@navigation/nav_home" />
+
+    </RelativeLayout>
+</layout>

+ 102 - 0
app/src/main/res/layout/activity_quick_entry.xml

@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@mipmap/bg_main"
+        android:fitsSystemWindows="true"
+        android:orientation="vertical">
+
+        <FrameLayout
+            android:id="@+id/header_layout"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/header_height"
+            android:paddingHorizontal="@dimen/header_padding">
+
+            <ImageView
+                android:layout_width="@dimen/header_logo_width"
+                android:layout_height="@dimen/header_logo_height"
+                android:layout_gravity="center_vertical"
+                android:src="@mipmap/icon_logo" />
+
+
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_gravity="right"
+                android:orientation="horizontal">
+
+                <TextClock
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:format12Hour="yyyy-MM-dd HH:mm:ss"
+                    android:format24Hour="yyyy-MM-dd HH:mm:ss"
+                    android:gravity="center_vertical"
+                    android:paddingHorizontal="@dimen/header_time_padding"
+                    android:textColor="@color/white"
+                    android:textSize="@dimen/header_time_text_size" />
+
+                <LinearLayout
+                    android:id="@+id/user_info_layout"
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:orientation="horizontal">
+
+                    <ImageView
+                        android:id="@+id/avatar"
+                        android:layout_width="@dimen/avatar_size"
+                        android:layout_height="@dimen/avatar_size"
+                        android:layout_gravity="center_vertical"
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:padding="@dimen/common_spacing"
+                        android:adjustViewBounds="false"
+                        android:src="@mipmap/icon_avatar" />
+
+                    <TextView
+                        android:id="@+id/nickname"
+                        android:layout_width="wrap_content"
+                        android:layout_height="match_parent"
+                        android:layout_marginLeft="@dimen/home_nickname_margin"
+                        android:gravity="center"
+                        android:textColor="@color/white"
+                        android:textSize="@dimen/home_nickname_text_size" />
+                </LinearLayout>
+            </LinearLayout>
+
+            <com.grkj.ui_base.widget.FlashingTipTextView
+                android:id="@+id/flash_tip_tv"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:background="@drawable/bg_main_color_tip"
+                android:drawableLeft="@mipmap/tip"
+                android:drawablePadding="@dimen/common_spacing"
+                android:gravity="center_vertical"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:textColor="@color/white"
+                android:textSize="@dimen/common_btn_text_size"
+                android:visibility="gone" />
+
+        </FrameLayout>
+
+        <View
+            android:id="@+id/header_line"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line_height"
+            android:layout_below="@+id/header_layout"
+            android:background="@color/white30" />
+
+        <androidx.fragment.app.FragmentContainerView
+            android:id="@+id/nav_host_fragment"
+            android:name="androidx.navigation.fragment.NavHostFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_above="@+id/nav_bar"
+            android:layout_below="@+id/header_line"
+            app:defaultNavHost="true"
+            app:navGraph="@navigation/nav_home" />
+
+    </RelativeLayout>
+</layout>

+ 20 - 0
app/src/main/res/layout/activity_set_remote_server.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@mipmap/bg_main"
+        android:fitsSystemWindows="true">
+
+        <androidx.fragment.app.FragmentContainerView
+            android:id="@+id/nav_host_fragment"
+            android:name="androidx.navigation.fragment.NavHostFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:padding="@dimen/common_spacing_2x"
+            app:defaultNavHost="true"
+            app:navGraph="@navigation/nav_set_remote_server" />
+    </FrameLayout>
+</layout>

+ 6 - 4
app/src/main/res/layout/dialog_drop_down_list.xml

@@ -1,9 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
 
     <LinearLayout
         android:layout_width="match_parent"
-        android:layout_height="@dimen/login_method_item_layout_height"
+        android:layout_height="wrap_content"
         android:background="@drawable/bg_text_drop_down"
         android:orientation="vertical">
 
@@ -20,9 +21,10 @@
             android:textSize="@dimen/common_text_size"
             android:visibility="gone" />
 
-        <androidx.recyclerview.widget.RecyclerView
+        <com.grkj.iscs.view.MaxHeightRecyclerView
             android:id="@+id/drop_down_rv"
             android:layout_width="match_parent"
-            android:layout_height="match_parent" />
+            android:layout_height="match_parent"
+            app:maxHeight="@dimen/login_method_item_layout_height" />
     </LinearLayout>
 </layout>

+ 19 - 5
app/src/main/res/layout/fragment_init_set_remote_server.xml

@@ -82,7 +82,19 @@
             app:layout_constraintTop_toTopOf="@+id/server_address_tv" />
 
         <TextView
-            android:id="@+id/previous_btn"
+            android:id="@+id/confirm_tip"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/common_spacing"
+            android:text="@string/restart_app_after_set"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_text_size"
+            app:layout_constraintBottom_toTopOf="@+id/confirm"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent" />
+
+        <TextView
+            android:id="@+id/confirm"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
@@ -90,11 +102,12 @@
             android:layout_marginBottom="100dp"
             android:background="@drawable/common_btn"
             android:paddingHorizontal="@dimen/common_spacing_2x"
-            android:text="@string/previous"
+            android:text="@string/confirm"
             android:textColor="@color/black"
             android:textSize="@dimen/common_btn_text_size"
             app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toStartOf="@+id/btn_space" />
+            app:layout_constraintEnd_toStartOf="@+id/btn_space"
+            app:layout_constraintStart_toStartOf="parent" />
 
         <Space
             android:id="@+id/btn_space"
@@ -105,7 +118,7 @@
             app:layout_constraintStart_toStartOf="parent" />
 
         <TextView
-            android:id="@+id/next_btn"
+            android:id="@+id/change_to_standard"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
@@ -113,10 +126,11 @@
             android:layout_marginBottom="100dp"
             android:background="@drawable/common_btn"
             android:paddingHorizontal="@dimen/common_spacing_2x"
-            android:text="@string/next"
+            android:text="@string/change_to_standard"
             android:textColor="@color/black"
             android:textSize="@dimen/common_btn_text_size"
             app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toEndOf="@+id/btn_space" />
     </androidx.constraintlayout.widget.ConstraintLayout>
 </layout>

+ 11 - 0
app/src/main/res/navigation/nav_set_remote_server.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<navigation xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/nav_init"
+    app:startDestination="@id/initSetRemoteServerFragment">
+
+    <fragment
+        android:id="@+id/initSetRemoteServerFragment"
+        android:name="com.grkj.iscs.features.init.fragment.InitSetRemoteServerFragment"
+        android:label="InitSetRemoteServerFragment" />
+</navigation>

+ 2 - 0
app/src/main/res/values-en/strings.xml

@@ -481,5 +481,7 @@
     <string name="all_quick_entrance">All Quick Entrances</string>
     <string name="quick_entrance_most_set_tip">Up to 8 quick entry points can be set</string>
     <string name="admin_role_can_not_edit">Admin role can not edit</string>
+    <string name="change_to_standard">Switch to Standard Version</string>
+    <string name="restart_app_after_set">The app will restart after the settings are completed</string>
 
 </resources>

+ 2 - 0
app/src/main/res/values-zh/strings.xml

@@ -481,5 +481,7 @@
     <string name="all_quick_entrance">所有快捷入口</string>
     <string name="quick_entrance_most_set_tip">快捷入口最多设置8个</string>
     <string name="admin_role_can_not_edit">管理员角色无法编辑</string>
+    <string name="change_to_standard">切换标准版</string>
+    <string name="restart_app_after_set">App将在设置完成后重启</string>
 
 </resources>

+ 2 - 0
app/src/main/res/values/strings.xml

@@ -484,5 +484,7 @@
     <string name="all_quick_entrance">所有快捷入口</string>
     <string name="quick_entrance_most_set_tip">快捷入口最多设置8个</string>
     <string name="admin_role_can_not_edit">管理员角色无法编辑</string>
+    <string name="change_to_standard">切换标准版</string>
+    <string name="restart_app_after_set">App将在设置完成后重启</string>
 
 </resources>

+ 1 - 1
data/src/main/java/com/grkj/data/dao/IsolationPointDao.kt

@@ -78,7 +78,7 @@ interface IsolationPointDao {
     fun deletePointByPointIds(pointIds: List<Long>)
 
     /**
-     * 获取所有隔离点数据
+     * 获取所有隔离点数据区域区分
      */
     @Query(
         """

+ 1 - 1
data/src/main/java/com/grkj/data/dao/JobTicketDao.kt

@@ -402,7 +402,7 @@ interface JobTicketDao {
         from is_job_ticket_points ijtp 
         left join is_job_ticket ijt on ijtp.ticket_id=ijt.ticket_id
         left join is_isolation_point iip on iip.point_id = ijtp.point_id
-        where ijtp.point_status = "1" and ijt.ticket_status in ('1','2','3','4','7')
+        where ijtp.point_status = "1" and ijt.ticket_status in ('1','2','3','4','5','7')
         order by ijtp.update_time desc
         limit :size offset :offset
     """

+ 1 - 1
gradle/libs.versions.toml

@@ -11,7 +11,7 @@ material = "1.10.0"
 activity = "1.8.0"
 constraintlayout = "2.1.4"
 jetbrainsKotlinJvm = "2.0.21"
-sikextension = "1.1.57"
+sikextension = "1.1.59"
 sikcamera = "1.0.11"
 sikcronjob = "1.0.3"
 sikfontmanager = "1.0.2"

+ 4 - 1
ui-base/src/main/java/com/grkj/ui_base/business/BleBusinessManager.kt

@@ -121,7 +121,7 @@ object BleBusinessManager {
                 if (res == 1) {
                     // 只能在这里断开,不能全部断开
                     BleManager.getInstance().disconnect(bleBean.bleDevice)
-
+                    BleConnectionManager.deviceList.removeIf { it.bleDevice.mac == bleBean.bleDevice.mac }
                     // 打开钥匙卡扣
                     val keyBean = ModBusController.getKeyByMac(bleBean.bleDevice.mac)
                     if (keyBean == null) {
@@ -344,6 +344,7 @@ object BleBusinessManager {
                                 if (BleConnectionManager.hasConnectWait() && BleManager.getInstance().allConnectedDevice.size >= BleConst.MAX_KEY_CONNECT_COUNT) {
                                     BleManager.getInstance()
                                         .disconnect(currentModeEvent.bleBean.bleDevice)
+                                    BleConnectionManager.deviceList.removeIf { it.bleDevice.mac == currentModeEvent.bleBean.bleDevice.mac }
                                 }
                                 return@runOnIO
                             }
@@ -401,6 +402,7 @@ object BleBusinessManager {
                         //连上之后没有工作票要下发就断开 看是否还有设备等待连接并且连接数是否大于等于预期,没有就不断开,有就让路,一般是初始化的时候
                         if (BleConnectionManager.hasConnectWait() && BleManager.getInstance().allConnectedDevice.size >= BleConst.MAX_KEY_CONNECT_COUNT) {
                             BleManager.getInstance().disconnect(currentModeEvent.bleBean.bleDevice)
+                            BleConnectionManager.deviceList.removeIf { it.bleDevice.mac == currentModeEvent.bleBean.bleDevice.mac }
                         }
                     }
                 }
@@ -522,6 +524,7 @@ object BleBusinessManager {
                             LoadingEvent.sendLoadingEvent()
                             PopTip.build().tip(CommonUtils.getStr(R.string.continue_the_ticket))
                             BleManager.getInstance().disconnect(bleDevice)
+                            BleConnectionManager.deviceList.removeIf { it.bleDevice.mac == bleDevice.mac }
                             // 打开卡扣,防止初始化的时候选择不处理钥匙导致无法使用
                             val dock = ModBusController.getDockByKeyMac(bleDevice.mac)
                             val keyBean = dock?.getKeyList()?.find { it.mac == bleDevice.mac }

+ 3 - 0
ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleConnectionManager.kt

@@ -168,6 +168,7 @@ object BleConnectionManager {
         if (connectNow) {
             logger.warn("蓝牙连接-立即连接 mac: $mac")
             BleManager.getInstance().disconnectAllDevice()
+            deviceList.clear()
             unregisterConnectListener(mac)
             currentConnectingMac.removeIf { it == mac }
         }
@@ -187,6 +188,7 @@ object BleConnectionManager {
                 if (connectNow && !isDisconnectAll) {
                     logger.info("蓝牙连接-超过最大连接数,但是需要立即连接,断开所有连接进行连接")
                     BleManager.getInstance().disconnectAllDevice()
+                    deviceList.clear()
                     checkAndConnect(true)
                 } else {
                     ThreadUtils.runOnIODelayed(500) {
@@ -369,6 +371,7 @@ object BleConnectionManager {
         )
         ThreadUtils.runOnIO {
             BleManager.getInstance().disconnect(bleDevice)
+            deviceList.removeIf { it.bleDevice.mac == bleDevice.mac }
             delay(300)
             BleUtil.Companion.instance?.connectBySelect(
                 bleDevice, object : CustomBleGattCallback() {

+ 3 - 0
ui-base/src/main/java/com/grkj/ui_base/utils/modbus/ModBusController.kt

@@ -15,6 +15,7 @@ import com.grkj.ui_base.utils.event.ModbusInitCompleteEvent
 import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.thread.ThreadUtils
+import kotlinx.coroutines.delay
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 import java.util.concurrent.atomic.AtomicInteger
@@ -237,7 +238,9 @@ object ModBusController {
                                     updateKeyMac(dockBean.addr, key.idx, keyInfo.macAddress!!)
                                     //已经初始化完成才会去连接
                                     if (ISCSConfig.isInit) {
+                                        controlKeyCharge(true, key.idx, dockBean.addr)
                                         ThreadUtils.runOnIO {
+                                            delay(500)
                                             val isConnect =
                                                 BleConnectionManager.tryConnectWithOptionalCharge(
                                                     keyInfo.macAddress!!