Pārlūkot izejas kodu

add(新增)
- 新增卡片和新增点位完成

周文健 5 mēneši atpakaļ
vecāks
revīzija
343ab7ceaa
22 mainītis faili ar 978 papildinājumiem un 29 dzēšanām
  1. 28 2
      app/src/main/java/com/grkj/iscs/features/init/activity/InitActivity.kt
  2. 57 1
      app/src/main/java/com/grkj/iscs/features/init/fragment/InitCardRegistrationFragment.kt
  3. 14 2
      app/src/main/java/com/grkj/iscs/features/init/fragment/InitDeviceRegistrationKeyAndLockFragment.kt
  4. 64 1
      app/src/main/java/com/grkj/iscs/features/init/fragment/InitPointRfidRegistrationFragment.kt
  5. 35 1
      app/src/main/java/com/grkj/iscs/features/init/fragment/InitSetRemoteServerFragment.kt
  6. 37 4
      app/src/main/java/com/grkj/iscs/features/init/viewmodel/InitViewModel.kt
  7. 51 0
      app/src/main/java/com/grkj/iscs/utils/ServerUtils.kt
  8. 144 4
      app/src/main/res/layout/fragment_init_card_registration.xml
  9. 115 4
      app/src/main/res/layout/fragment_init_device_registration_key_and_lock.xml
  10. 143 4
      app/src/main/res/layout/fragment_init_point_rfid_registration.xml
  11. 118 4
      app/src/main/res/layout/fragment_init_set_remote_server.xml
  12. 28 0
      app/src/main/res/layout/item_init_hardware_rfid.xml
  13. 17 0
      app/src/main/res/values-en/strings.xml
  14. 17 0
      app/src/main/res/values-zh/strings.xml
  15. 21 0
      app/src/main/res/values/strings.xml
  16. 12 0
      data/src/main/java/com/grkj/data/dao/HardwareDao.kt
  17. 9 0
      data/src/main/java/com/grkj/data/data/CommonConstants.kt
  18. 5 0
      data/src/main/java/com/grkj/data/data/EventConstants.kt
  19. 7 1
      data/src/main/java/com/grkj/data/data/MMKVConstants.kt
  20. 10 0
      data/src/main/java/com/grkj/data/repository/IHardwareRepository.kt
  21. 22 1
      data/src/main/java/com/grkj/data/repository/impl/HardwareRepository.kt
  22. 24 0
      ui-base/src/main/java/com/grkj/ui_base/utils/event/CardSwipeEvent.kt

+ 28 - 2
app/src/main/java/com/grkj/iscs/features/init/activity/InitActivity.kt

@@ -1,16 +1,24 @@
 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.ActivityInitBinding
 import com.grkj.ui_base.base.BaseActivity
+import com.grkj.ui_base.utils.event.CardSwipeEvent
+import com.grkj.ui_base.utils.extension.toByteArrays
+import com.grkj.ui_base.utils.extension.toHexStrings
 import dagger.hilt.android.AndroidEntryPoint
 
 /**
  * 初始化
  */
 @AndroidEntryPoint
-class InitActivity: BaseActivity<ActivityInitBinding>() {
-
+class InitActivity : BaseActivity<ActivityInitBinding>() {
+    /**
+     * 读卡数据
+     */
+    private var cardNo: String = ""
     override fun navHostFragmentId() = R.id.nav_host_fragment
     override fun getLayoutId(): Int {
         return R.layout.activity_init
@@ -19,4 +27,22 @@ class InitActivity: BaseActivity<ActivityInitBinding>() {
     override fun initView() {
 
     }
+
+    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")
+                CardSwipeEvent.sendCardSwipeEvent(cardNo)
+                // 重置cardNo
+                cardNo = ""
+                return super.dispatchKeyEvent(event)
+            }
+            cardNo += event.keyCharacterMap.getDisplayLabel(event.keyCode)
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
 }

+ 57 - 1
app/src/main/java/com/grkj/iscs/features/init/fragment/InitCardRegistrationFragment.kt

@@ -1,18 +1,74 @@
 package com.grkj.iscs.features.init.fragment
 
+import androidx.fragment.app.viewModels
+import com.drake.brv.BindingAdapter
+import com.drake.brv.utils.linear
+import com.drake.brv.utils.setup
+import com.grkj.data.data.EventConstants
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentInitCardRegistrationBinding
+import com.grkj.iscs.databinding.ItemInitHardwareRfidBinding
+import com.grkj.iscs.features.init.viewmodel.InitViewModel
+import com.grkj.shared.model.EventBean
 import com.grkj.ui_base.base.BaseFragment
+import com.grkj.ui_base.utils.event.CardSwipeEvent
+import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
 
 /**
  * 卡片录入
  */
-class InitCardRegistrationFragment: BaseFragment<FragmentInitCardRegistrationBinding>() {
+@AndroidEntryPoint
+class InitCardRegistrationFragment : BaseFragment<FragmentInitCardRegistrationBinding>() {
+    private val viewModel: InitViewModel by viewModels()
+
+    /**
+     * 卡片rfid数据
+     */
+    private val cardRfidData: MutableList<String> = mutableListOf()
     override fun getLayoutId(): Int {
         return R.layout.fragment_init_card_registration
     }
 
     override fun initView() {
+        binding.previousBtn.setDebouncedClickListener {
+            navController.popBackStack()
+        }
+        binding.nextBtn.setDebouncedClickListener {
+            viewModel.registrationCardHardware(cardRfidData).observe(this) {
+                navController.navigate(R.id.action_initCardRegistrationFragment_to_initPointRfidRegistrationFragment)
+            }
+        }
+        binding.skiStep.setDebouncedClickListener {
+            cardRfidData.clear()
+            navController.navigate(R.id.action_initCardRegistrationFragment_to_initPointRfidRegistrationFragment)
+        }
+        binding.cardRv.linear().setup {
+            addType<String>(R.layout.item_init_hardware_rfid)
+            onBind {
+                onInitHardwareBinding(this)
+            }
+        }.models = cardRfidData
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onInitHardwareBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemInitHardwareRfidBinding>()
+        val item = holder.getModel<String>()
+        itemBinding.hardwareRfid.text = item
+        itemBinding.delete.setDebouncedClickListener {
+            cardRfidData.removeIf { it == item }
+            adapter.notifyDataSetChanged()
+        }
+    }
 
+    override fun onEvent(event: EventBean<Any>) {
+        super.onEvent(event)
+        when (event.code) {
+            EventConstants.EVENT_CARD_SWIPE -> {
+                val cardSwipeEvent = (event.data as CardSwipeEvent)
+                cardRfidData.add(cardSwipeEvent.cardNo)
+                binding.cardRv.adapter?.notifyDataSetChanged()
+            }
+        }
     }
 }

+ 14 - 2
app/src/main/java/com/grkj/iscs/features/init/fragment/InitDeviceRegistrationKeyAndLockFragment.kt

@@ -1,18 +1,30 @@
 package com.grkj.iscs.features.init.fragment
 
+import androidx.fragment.app.viewModels
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentInitDeviceRegistrationKeyAndLockBinding
+import com.grkj.iscs.features.init.viewmodel.InitViewModel
 import com.grkj.ui_base.base.BaseFragment
+import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
 
 /**
  * 钥匙和挂锁的识别检测
  */
-class InitDeviceRegistrationKeyAndLockFragment: BaseFragment<FragmentInitDeviceRegistrationKeyAndLockBinding>() {
+@AndroidEntryPoint
+class InitDeviceRegistrationKeyAndLockFragment :
+    BaseFragment<FragmentInitDeviceRegistrationKeyAndLockBinding>() {
+    private val viewModel: InitViewModel by viewModels()
     override fun getLayoutId(): Int {
         return R.layout.fragment_init_device_registration_key_and_lock
     }
 
     override fun initView() {
-
+        binding.previousBtn.setDebouncedClickListener {
+            navController.popBackStack()
+        }
+        binding.nextBtn.setDebouncedClickListener {
+            navController.navigate(R.id.action_initDeviceRegistrationKeyAndLockFragment_to_initCardRegistrationFragment)
+        }
     }
 }

+ 64 - 1
app/src/main/java/com/grkj/iscs/features/init/fragment/InitPointRfidRegistrationFragment.kt

@@ -1,18 +1,81 @@
 package com.grkj.iscs.features.init.fragment
 
+import android.content.Intent
+import androidx.fragment.app.viewModels
+import com.drake.brv.BindingAdapter
+import com.drake.brv.utils.linear
+import com.drake.brv.utils.setup
+import com.grkj.data.data.EventConstants
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentInitPointRfidRegistrationBinding
+import com.grkj.iscs.databinding.ItemInitHardwareRfidBinding
+import com.grkj.iscs.features.init.viewmodel.InitViewModel
+import com.grkj.iscs.features.login.activity.LoginActivity
+import com.grkj.shared.model.EventBean
 import com.grkj.ui_base.base.BaseFragment
+import com.grkj.ui_base.utils.event.CardSwipeEvent
+import com.sik.sikcore.extension.setDebouncedClickListener
+import kotlin.getValue
 
 /**
  * 点位rfid录入
  */
-class InitPointRfidRegistrationFragment: BaseFragment<FragmentInitPointRfidRegistrationBinding>() {
+class InitPointRfidRegistrationFragment : BaseFragment<FragmentInitPointRfidRegistrationBinding>() {
+    private val viewModel: InitViewModel by viewModels()
+
+    /**
+     * 点位rfid数据
+     */
+    private val pointRfidData: MutableList<String> = mutableListOf()
     override fun getLayoutId(): Int {
         return R.layout.fragment_init_point_rfid_registration
     }
 
     override fun initView() {
+        binding.previousBtn.setDebouncedClickListener {
+            navController.popBackStack()
+        }
+        binding.nextBtn.setDebouncedClickListener {
+            viewModel.registrationPointRfidHardware(pointRfidData).observe(this) {
+                requireActivity().startActivity(
+                    Intent(
+                        requireActivity(),
+                        LoginActivity::class.java
+                    )
+                )
+                requireActivity().finish()
+            }
+        }
+        binding.skipAndComplete.setDebouncedClickListener {
+            requireActivity().startActivity(Intent(requireActivity(), LoginActivity::class.java))
+            requireActivity().finish()
+        }
+        binding.pointRfidRv.linear().setup {
+            addType<String>(R.layout.item_init_hardware_rfid)
+            onBind {
+                onInitHardwareBinding(this)
+            }
+        }.models = pointRfidData
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onInitHardwareBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemInitHardwareRfidBinding>()
+        val item = holder.getModel<String>()
+        itemBinding.hardwareRfid.text = item
+        itemBinding.delete.setDebouncedClickListener {
+            pointRfidData.removeIf { it == item }
+            adapter.notifyDataSetChanged()
+        }
+    }
 
+    override fun onEvent(event: EventBean<Any>) {
+        super.onEvent(event)
+        when (event.code) {
+            EventConstants.EVENT_CARD_SWIPE -> {
+                val cardSwipeEvent = (event.data as CardSwipeEvent)
+                pointRfidData.add(cardSwipeEvent.cardNo)
+                binding.pointRfidRv.adapter?.notifyDataSetChanged()
+            }
+        }
     }
 }

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

@@ -1,18 +1,52 @@
 package com.grkj.iscs.features.init.fragment
 
+import com.grkj.data.data.CommonConstants
+import com.grkj.data.data.MMKVConstants
 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.kongzue.dialogx.dialogs.PopTip
+import com.sik.sikcore.extension.saveMMKVData
+import com.sik.sikcore.extension.setDebouncedClickListener
+import java.net.Inet4Address
+import java.net.InetAddress
 
 /**
  * 服务器配置
  */
-class InitSetRemoteServerFragment: BaseFragment<FragmentInitSetRemoteServerBinding>() {
+class InitSetRemoteServerFragment : BaseFragment<FragmentInitSetRemoteServerBinding>() {
+    /**
+     * 服务器地址
+     */
+    private var serverAddress: String? = null
     override fun getLayoutId(): Int {
         return R.layout.fragment_init_set_remote_server
     }
 
     override fun initView() {
+        binding.previousBtn.setDebouncedClickListener {
+            requireActivity().finish()
+        }
+        binding.nextBtn.setDebouncedClickListener {
+            if (checkData()) {
+                MMKVConstants.SERVER_ADDRESS.saveMMKVData(serverAddress)
+                requireActivity().finish()
+            }
+        }
+    }
 
+    private fun checkData(): Boolean {
+        serverAddress = binding.serverAddressEt.text.toString().lowercase()
+        if (serverAddress?.isEmpty() == true) {
+            PopTip.tip(R.string.please_input_remote_server_address)
+            return false
+        }
+        serverAddress = ServerUtils.normalizeServerUrl(serverAddress ?: "")
+        if (serverAddress == null) {
+            PopTip.tip(R.string.server_address_error)
+            return false
+        }
+        return true
     }
 }

+ 37 - 4
app/src/main/java/com/grkj/iscs/features/init/viewmodel/InitViewModel.kt

@@ -2,7 +2,7 @@ package com.grkj.iscs.features.init.viewmodel
 
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
-import com.grkj.data.model.vo.AddUserDataVo
+import com.grkj.data.repository.IHardwareRepository
 import com.grkj.data.repository.IUserRepository
 import com.grkj.ui_base.base.BaseViewModel
 import dagger.hilt.android.lifecycle.HiltViewModel
@@ -13,7 +13,10 @@ import javax.inject.Inject
  * 初始化数据存储
  */
 @HiltViewModel
-class InitViewModel @Inject constructor(val userRepository: IUserRepository) : BaseViewModel() {
+class InitViewModel @Inject constructor(
+    val userRepository: IUserRepository,
+    val hardwareRepository: IHardwareRepository
+) : BaseViewModel() {
     /**
      * 移除超级管理员用户
      */
@@ -24,9 +27,39 @@ class InitViewModel @Inject constructor(val userRepository: IUserRepository) : B
         }
     }
 
+    /**
+     * 添加管理员账号
+     */
     fun insertAdminAccount(username: String, password: String): LiveData<Boolean> {
-        return liveData(Dispatchers.IO){
-            userRepository.addAdminUser(username,password)
+        return liveData(Dispatchers.IO) {
+            userRepository.addAdminUser(username, password)
+            emit(true)
+        }
+    }
+
+    /**
+     * 注册硬件
+     */
+    fun registrationHardware() {
+
+    }
+
+    /**
+     * 注册卡片
+     */
+    fun registrationCardHardware(cardRfidData: MutableList<String>): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            hardwareRepository.addCardHardware(cardRfidData)
+            emit(true)
+        }
+    }
+
+    /**
+     * 注册点位rfid
+     */
+    fun registrationPointRfidHardware(pointRfidData: MutableList<String>): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            hardwareRepository.addRfidTokenHardware(pointRfidData)
             emit(true)
         }
     }

+ 51 - 0
app/src/main/java/com/grkj/iscs/utils/ServerUtils.kt

@@ -0,0 +1,51 @@
+package com.grkj.iscs.utils
+
+import java.net.URI
+import java.net.URISyntaxException
+
+/**
+ * 服务器地址工具
+ */
+object ServerUtils {
+
+    /**
+     * 校验并返回标准化的服务器 URL,失败返回 null
+     */
+    fun normalizeServerUrl(input: String): String? {
+        // 1. 去空格
+        var raw = input.trim()
+        if (raw.isEmpty()) return null
+
+        // 2. 补协议
+        if (!raw.startsWith("http://") && !raw.startsWith("https://")) {
+            raw = "http://$raw"
+        }
+
+        // 3. 解析
+        val uri = try {
+            URI(raw)
+        } catch (e: URISyntaxException) {
+            return null
+        }
+
+        // 4. 校验 host
+        val host = uri.host ?: return null
+        // 简单用正则区分域名或 IPv4
+        val isIp = Regex("^((25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d?\\d)$")
+            .matches(host)
+        val isDomain = Regex("^[a-zA-Z0-9](?:[a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z]{2,})+\$")
+            .matches(host)
+        if (!isIp && !isDomain) return null
+
+        // 5. 校验端口
+        val port = uri.port
+        if (port != -1 && port !in 1..65535) return null
+
+        // 6. 拼回标准 URL
+        return if (port == -1) {
+            "${uri.scheme}://$host"
+        } else {
+            "${uri.scheme}://$host:$port"
+        }
+    }
+}

+ 144 - 4
app/src/main/res/layout/fragment_init_card_registration.xml

@@ -1,8 +1,148 @@
 <?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android">
-    <RelativeLayout
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:background="@drawable/bg_card_white_r8"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/step_title_layout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="100dp"
+            android:layout_marginTop="100dp"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <TextView
+                android:id="@+id/step_tv"
+                android:layout_width="40dp"
+                android:layout_height="40dp"
+                android:background="@drawable/init_step_circle"
+                android:gravity="center"
+                android:text="@string/init_card_registration_step"
+                android:textColor="@color/white"
+                android:textSize="@dimen/normal_text_size" />
+
+            <TextView
+                android:id="@+id/step_tip"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/common_spacing"
+                android:text="@string/init_card_registration_step_tip"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size_big" />
+        </LinearLayout>
+
+        <TextView
+            android:id="@+id/step_hint"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/common_spacing"
+            android:layout_marginTop="@dimen/common_spacing_2x"
+            android:text="@string/init_card_registration_step_hint"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_text_size"
+            app:layout_constraintStart_toStartOf="@+id/step_title_layout"
+            app:layout_constraintTop_toBottomOf="@+id/step_title_layout" />
+
+        <LinearLayout
+            android:id="@+id/rv_header_layout"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:layout_marginHorizontal="100dp"
+            android:layout_marginTop="@dimen/common_spacing"
+            android:background="@drawable/common_card_bg"
+            android:divider="@drawable/divider_table"
+            android:showDividers="middle"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/step_hint">
+
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="2"
+                android:gravity="center"
+                android:text="@string/recognized_card_rfid"
+                android:textSize="@dimen/common_text_size" />
+
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center"
+                android:text="@string/operation"
+                android:textSize="@dimen/common_text_size" />
+        </LinearLayout>
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/card_rv"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_marginHorizontal="100dp"
+            android:layout_marginBottom="@dimen/common_spacing"
+            app:layout_constraintBottom_toTopOf="@+id/previous_btn"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/rv_header_layout" />
+
+        <TextView
+            android:id="@+id/previous_btn"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:layout_centerHorizontal="true"
+            android:layout_marginBottom="100dp"
+            android:background="@drawable/common_btn"
+            android:paddingHorizontal="@dimen/common_spacing_2x"
+            android:text="@string/previous"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_btn_text_size"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@+id/btn_space" />
+
+        <Space
+            android:id="@+id/btn_space"
+            android:layout_width="@dimen/common_spacing_2x"
+            android:layout_height="1dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent" />
+
+        <TextView
+            android:id="@+id/next_btn"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:layout_centerHorizontal="true"
+            android:layout_marginBottom="100dp"
+            android:background="@drawable/common_btn"
+            android:paddingHorizontal="@dimen/common_spacing_2x"
+            android:text="@string/next"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_btn_text_size"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toEndOf="@+id/btn_space" />
 
-    </RelativeLayout>
+        <TextView
+            android:id="@+id/ski_step"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:layout_centerHorizontal="true"
+            android:layout_marginTop="@dimen/common_spacing"
+            android:layout_marginBottom="100dp"
+            android:paddingHorizontal="@dimen/common_spacing_2x"
+            android:text="@string/ski_step"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_btn_text_size"
+            app:layout_constraintEnd_toEndOf="@+id/next_btn"
+            app:layout_constraintStart_toStartOf="@+id/previous_btn"
+            app:layout_constraintTop_toBottomOf="@+id/next_btn" />
+    </androidx.constraintlayout.widget.ConstraintLayout>
 </layout>

+ 115 - 4
app/src/main/res/layout/fragment_init_device_registration_key_and_lock.xml

@@ -1,8 +1,119 @@
 <?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android">
-    <RelativeLayout
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:background="@drawable/bg_card_white_r8"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/step_title_layout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="100dp"
+            android:layout_marginTop="100dp"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <TextView
+                android:id="@+id/step_tv"
+                android:layout_width="40dp"
+                android:layout_height="40dp"
+                android:background="@drawable/init_step_circle"
+                android:gravity="center"
+                android:text="@string/init_device_registration_key_and_lock_step"
+                android:textColor="@color/white"
+                android:textSize="@dimen/normal_text_size" />
+
+            <TextView
+                android:id="@+id/step_tip"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/common_spacing"
+                android:text="@string/init_device_registration_key_and_lock_step_tip"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size_big" />
+        </LinearLayout>
+
+        <TextView
+            android:id="@+id/step_hint"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/common_spacing"
+            android:layout_marginTop="@dimen/common_spacing_2x"
+            android:text="@string/init_device_registration_key_and_lock_step_hint"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_text_size"
+            app:layout_constraintStart_toStartOf="@+id/step_title_layout"
+            app:layout_constraintTop_toBottomOf="@+id/step_title_layout" />
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/dock_rv"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_marginVertical="@dimen/common_spacing"
+            android:layout_marginHorizontal="100dp"
+            app:layout_constraintTop_toBottomOf="@+id/step_hint"
+            app:layout_constraintBottom_toTopOf="@+id/previous_btn"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"/>
+
+        <TextView
+            android:id="@+id/previous_btn"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:layout_centerHorizontal="true"
+            android:layout_marginBottom="100dp"
+            android:background="@drawable/common_btn"
+            android:paddingHorizontal="@dimen/common_spacing_2x"
+            android:text="@string/previous"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_btn_text_size"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@+id/btn_space" />
+
+        <Space
+            android:id="@+id/btn_space"
+            android:layout_width="@dimen/common_spacing_2x"
+            android:layout_height="1dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent" />
+
+        <TextView
+            android:id="@+id/next_btn"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:layout_centerHorizontal="true"
+            android:layout_marginBottom="100dp"
+            android:background="@drawable/common_btn"
+            android:paddingHorizontal="@dimen/common_spacing_2x"
+            android:text="@string/next"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_btn_text_size"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toEndOf="@+id/btn_space" />
 
-    </RelativeLayout>
+        <TextView
+            android:id="@+id/re_recognize"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:layout_centerHorizontal="true"
+            android:layout_marginBottom="100dp"
+            android:paddingHorizontal="@dimen/common_spacing_2x"
+            android:text="@string/re_recognize"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_btn_text_size"
+            app:layout_constraintTop_toBottomOf="@+id/next_btn"
+            app:layout_constraintStart_toStartOf="@+id/previous_btn"
+            app:layout_constraintEnd_toEndOf="@+id/next_btn"
+            android:layout_marginTop="@dimen/common_spacing"/>
+    </androidx.constraintlayout.widget.ConstraintLayout>
 </layout>

+ 143 - 4
app/src/main/res/layout/fragment_init_point_rfid_registration.xml

@@ -1,8 +1,147 @@
 <?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android">
-    <RelativeLayout
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:background="@drawable/bg_card_white_r8"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/step_title_layout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="100dp"
+            android:layout_marginTop="100dp"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <TextView
+                android:id="@+id/step_tv"
+                android:layout_width="40dp"
+                android:layout_height="40dp"
+                android:background="@drawable/init_step_circle"
+                android:gravity="center"
+                android:text="@string/init_point_rfid_registration_step"
+                android:textColor="@color/white"
+                android:textSize="@dimen/normal_text_size" />
+
+            <TextView
+                android:id="@+id/step_tip"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/common_spacing"
+                android:text="@string/init_point_rfid_registration_step_tip"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size_big" />
+        </LinearLayout>
+
+        <TextView
+            android:id="@+id/step_hint"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/common_spacing"
+            android:layout_marginTop="@dimen/common_spacing_2x"
+            android:text="@string/init_point_rfid_registration_step_hint"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_text_size"
+            app:layout_constraintStart_toStartOf="@+id/step_title_layout"
+            app:layout_constraintTop_toBottomOf="@+id/step_title_layout" />
+
+        <LinearLayout
+            android:id="@+id/rv_header_layout"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:layout_marginTop="@dimen/common_spacing"
+            android:background="@drawable/common_card_bg"
+            android:divider="@drawable/divider_table"
+            android:layout_marginHorizontal="100dp"
+            app:layout_constraintTop_toBottomOf="@+id/step_hint"
+            app:layout_constraintStart_toStartOf="parent"
+            android:showDividers="middle">
+
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="2"
+                android:gravity="center"
+                android:text="@string/recognized_point_rfid"
+                android:textSize="@dimen/common_text_size" />
+
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center"
+                android:text="@string/operation"
+                android:textSize="@dimen/common_text_size" />
+        </LinearLayout>
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/point_rfid_rv"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_marginBottom="@dimen/common_spacing"
+            android:layout_marginHorizontal="100dp"
+            app:layout_constraintTop_toBottomOf="@+id/rv_header_layout"
+            app:layout_constraintBottom_toTopOf="@+id/previous_btn"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"/>
+
+        <TextView
+            android:id="@+id/previous_btn"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:layout_centerHorizontal="true"
+            android:layout_marginBottom="100dp"
+            android:background="@drawable/common_btn"
+            android:paddingHorizontal="@dimen/common_spacing_2x"
+            android:text="@string/previous"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_btn_text_size"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@+id/btn_space" />
+
+        <Space
+            android:id="@+id/btn_space"
+            android:layout_width="@dimen/common_spacing_2x"
+            android:layout_height="1dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent" />
+
+        <TextView
+            android:id="@+id/next_btn"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:layout_centerHorizontal="true"
+            android:layout_marginBottom="100dp"
+            android:background="@drawable/common_btn"
+            android:paddingHorizontal="@dimen/common_spacing_2x"
+            android:text="@string/next"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_btn_text_size"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toEndOf="@+id/btn_space" />
 
-    </RelativeLayout>
+        <TextView
+            android:id="@+id/skip_and_complete"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:layout_centerHorizontal="true"
+            android:layout_marginBottom="100dp"
+            android:paddingHorizontal="@dimen/common_spacing_2x"
+            android:text="@string/skip_and_complete"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_btn_text_size"
+            app:layout_constraintTop_toBottomOf="@+id/next_btn"
+            app:layout_constraintStart_toStartOf="@+id/previous_btn"
+            app:layout_constraintEnd_toEndOf="@+id/next_btn"
+            android:layout_marginTop="@dimen/common_spacing"/>
+    </androidx.constraintlayout.widget.ConstraintLayout>
 </layout>

+ 118 - 4
app/src/main/res/layout/fragment_init_set_remote_server.xml

@@ -1,8 +1,122 @@
 <?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android">
-    <RelativeLayout
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:background="@drawable/bg_card_white_r8"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/step_title_layout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="100dp"
+            android:layout_marginTop="100dp"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <TextView
+                android:id="@+id/step_tv"
+                android:layout_width="40dp"
+                android:layout_height="40dp"
+                android:background="@drawable/init_step_circle"
+                android:gravity="center"
+                android:text="@string/init_set_remote_server_step"
+                android:textColor="@color/white"
+                android:textSize="@dimen/normal_text_size" />
+
+            <TextView
+                android:id="@+id/step_tip"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/common_spacing"
+                android:text="@string/init_set_remote_server_step_tip"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size_big" />
+        </LinearLayout>
+
+        <TextView
+            android:id="@+id/step_hint"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/common_spacing"
+            android:layout_marginTop="@dimen/common_spacing_2x"
+            android:text="@string/init_set_remote_server_step_hint"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_text_size"
+            app:layout_constraintStart_toStartOf="@+id/step_title_layout"
+            app:layout_constraintTop_toBottomOf="@+id/step_title_layout" />
+
+        <TextView
+            android:id="@+id/server_address_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_spacing_2x"
+            android:text="@string/server_address"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_text_size"
+            app:layout_constraintStart_toStartOf="@+id/step_hint"
+            app:layout_constraintTop_toBottomOf="@+id/step_hint" />
+
+        <EditText
+            android:id="@+id/server_address_et"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/common_spacing"
+            android:layout_marginRight="@dimen/common_spacing_7x"
+            android:background="@drawable/bg_common_input"
+            android:hint="@string/please_input_remote_server_address"
+            android:maxLines="1"
+            android:paddingHorizontal="@dimen/common_spacing_1_5x"
+            android:paddingVertical="2dp"
+            android:singleLine="true"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_text_size"
+            app:layout_constraintBottom_toBottomOf="@+id/server_address_tv"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@+id/server_address_tv"
+            app:layout_constraintTop_toTopOf="@+id/server_address_tv" />
+
+        <TextView
+            android:id="@+id/previous_btn"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:layout_centerHorizontal="true"
+            android:layout_marginBottom="100dp"
+            android:background="@drawable/common_btn"
+            android:paddingHorizontal="@dimen/common_spacing_2x"
+            android:text="@string/previous"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_btn_text_size"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@+id/btn_space" />
+
+        <Space
+            android:id="@+id/btn_space"
+            android:layout_width="@dimen/common_spacing_2x"
+            android:layout_height="1dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent" />
 
-    </RelativeLayout>
+        <TextView
+            android:id="@+id/next_btn"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:layout_centerHorizontal="true"
+            android:layout_marginBottom="100dp"
+            android:background="@drawable/common_btn"
+            android:paddingHorizontal="@dimen/common_spacing_2x"
+            android:text="@string/next"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_btn_text_size"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toEndOf="@+id/btn_space" />
+    </androidx.constraintlayout.widget.ConstraintLayout>
 </layout>

+ 28 - 0
app/src/main/res/layout/item_init_hardware_rfid.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+    <LinearLayout
+        android:id="@+id/rv_header_layout"
+        android:layout_width="match_parent"
+        android:layout_height="40dp"
+        android:background="@drawable/common_card_bg"
+        android:divider="@drawable/divider_table"
+        android:showDividers="middle">
+
+        <TextView
+            android:id="@+id/hardware_rfid"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="2"
+            android:gravity="center"
+            android:textSize="@dimen/common_text_size" />
+
+        <TextView
+            android:id="@+id/delete"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:gravity="center"
+            android:text="@string/delete"
+            android:textSize="@dimen/common_text_size" />
+    </LinearLayout>
+</layout>

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

@@ -209,4 +209,21 @@
     <string name="next">Next</string>
     <string name="password_and_repeat_password_not_same">Password and repeat password not same</string>
     <string name="role_key_already_exists">Role manage permission string already exists</string>
+    <string name="init_device_registration_key_and_lock_step_tip">Registration keys and padlocks</string>
+    <string name="init_device_registration_key_and_lock_step_hint">Please wait for the system to recognize the key and padlock</string>
+    <string name="re_recognize">Re recognize</string>
+    <string name="init_card_registration_step_tip">Registration and input the card</string>
+    <string name="init_point_rfid_registration_step_tip">Registration and input the point RFID</string>
+    <string name="init_point_rfid_registration_step_hint">Please swipe the RFID tag on the card reader</string>
+    <string name="init_card_registration_step_hint">Please swipe your card on the card reader</string>
+    <string name="ski_step">Skip this step</string>
+    <string name="skip_and_complete">Skip and complete</string>
+    <string name="init_set_remote_server_step_tip">Configure server</string>
+    <string name="init_set_remote_server_step_hint">Please set the address and port of the server</string>
+    <string name="server_address">Service Address</string>
+    <string name="please_input_remote_server_address">Please enter the service address</string>
+    <string name="server_address_error">Server address error</string>
+    <string name="recognized_point_rfid">Recognized point rfid</string>
+    <string name="operation">Operation</string>
+    <string name="recognized_card_rfid">Recognized card rfid</string>
 </resources>

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

@@ -209,4 +209,21 @@
     <string name="next">下一步</string>
     <string name="password_and_repeat_password_not_same">密码与重复密码不一致</string>
     <string name="role_key_already_exists">该角色权限字符已存在</string>
+    <string name="init_device_registration_key_and_lock_step_tip">识别钥匙和挂锁</string>
+    <string name="init_device_registration_key_and_lock_step_hint">请等待系统识别钥匙和挂锁</string>
+    <string name="re_recognize">重新识别</string>
+    <string name="init_card_registration_step_tip">识别并录入卡片</string>
+    <string name="init_point_rfid_registration_step_tip">识别并录入点位RFID标签</string>
+    <string name="init_point_rfid_registration_step_hint">请在读卡器上刷点位RFID标签</string>
+    <string name="init_card_registration_step_hint">请在读卡器上刷卡</string>
+    <string name="ski_step">跳过该步骤</string>
+    <string name="skip_and_complete">跳过并完成</string>
+    <string name="init_set_remote_server_step_tip">配置服务器</string>
+    <string name="init_set_remote_server_step_hint">请设置服务器的地址和端口</string>
+    <string name="server_address">服务地址</string>
+    <string name="please_input_remote_server_address">请输入服务地址</string>
+    <string name="server_address_error">服务器地址错误</string>
+    <string name="recognized_point_rfid">已识别的点位RFID</string>
+    <string name="operation">操作</string>
+    <string name="recognized_card_rfid">已识别的卡片RFID</string>
 </resources>

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

@@ -208,4 +208,25 @@
     <string name="next">下一步</string>
     <string name="password_and_repeat_password_not_same">密码与重复密码不一致</string>
     <string name="role_key_already_exists">该角色权限字符已存在</string>
+    <string name="init_device_registration_key_and_lock_step">2</string>
+    <string name="init_device_registration_key_and_lock_step_tip">识别钥匙和挂锁</string>
+    <string name="init_device_registration_key_and_lock_step_hint">请等待系统识别钥匙和挂锁</string>
+    <string name="re_recognize">重新识别</string>
+    <string name="init_card_registration_step">3</string>
+    <string name="init_card_registration_step_tip">识别并录入卡片</string>
+    <string name="init_point_rfid_registration_step">4</string>
+    <string name="init_point_rfid_registration_step_tip">识别并录入点位RFID标签</string>
+    <string name="init_point_rfid_registration_step_hint">请在读卡器上刷点位RFID标签</string>
+    <string name="init_card_registration_step_hint">请在读卡器上刷卡</string>
+    <string name="ski_step">跳过该步骤</string>
+    <string name="skip_and_complete">跳过并完成</string>
+    <string name="init_set_remote_server_step_tip">配置服务器</string>
+    <string name="init_set_remote_server_step">X</string>
+    <string name="init_set_remote_server_step_hint">请设置服务器的地址和端口</string>
+    <string name="server_address">服务地址</string>
+    <string name="please_input_remote_server_address">请输入服务地址</string>
+    <string name="server_address_error">服务器地址错误</string>
+    <string name="recognized_point_rfid">已识别的点位RFID</string>
+    <string name="operation">操作</string>
+    <string name="recognized_card_rfid">已识别的卡片RFID</string>
 </resources>

+ 12 - 0
data/src/main/java/com/grkj/data/dao/HardwareDao.kt

@@ -8,6 +8,7 @@ import com.grkj.data.model.dos.IsJobCard
 import com.grkj.data.model.dos.IsKey
 import com.grkj.data.model.dos.IsLock
 import com.grkj.data.model.dos.IsLockCabinetSlots
+import com.grkj.data.model.dos.IsRfidToken
 import com.grkj.data.model.local.LockData
 import com.grkj.data.model.local.PointData
 import com.sik.sikcore.date.TimeUtils
@@ -28,6 +29,11 @@ interface HardwareDao {
      */
     @Insert(onConflict = OnConflictStrategy.REPLACE)
     fun addCard(isJobCard: IsJobCard)
+    /**
+     * 批量添加卡片
+     */
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
+    fun addCard(isJobCard: List<IsJobCard>)
 
     /**
      * 根据rfid获取钥匙信息
@@ -168,4 +174,10 @@ interface HardwareDao {
     @Query("select point_id from is_isolation_point iip left join is_rfid_token irt on iip.rfid_id = irt.rfid_id where irt.rfid = :pointNfc")
     fun getPointIdByPointNfc(pointNfc: String?): Long
 
+    /**
+     * 添加点位Rfid
+     */
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
+    fun addRfidToken(isRfidToken: List<IsRfidToken>)
+
 }

+ 9 - 0
data/src/main/java/com/grkj/data/data/CommonConstants.kt

@@ -8,4 +8,13 @@ object CommonConstants {
      * 作业票数据丢失
      */
     const val TICKET_LOST = "{\"msg\":\"作业票数据丢失啦!\",\"code\":500}"
+
+    /**
+     * http前缀
+     */
+    const val PREFIX_HTTP = "http://"
+    /**
+     * https前缀
+     */
+    const val PREFIX_HTTPS = "https://"
 }

+ 5 - 0
data/src/main/java/com/grkj/data/data/EventConstants.kt

@@ -36,6 +36,11 @@ object EventConstants {
      */
     const val EVENT_LOGOUT = 100_000_006
 
+    /**
+     * 刷卡事件
+     */
+    const val EVENT_CARD_SWIPE = 100_000_007
+
     //---------------------------作业票------------------------
     const val EVENT_GET_TICKET_STATUS: Int = 100_001_001
 

+ 7 - 1
data/src/main/java/com/grkj/data/data/MMKVConstants.kt

@@ -4,6 +4,7 @@ package com.grkj.data.data
  * 持久化存储的KEY
  */
 object MMKVConstants {
+
     /**
      * 基座配置
      */
@@ -27,5 +28,10 @@ object MMKVConstants {
     /**
      * APP初始化
      */
-    const val APP_INIT= "APP_INIT"
+    const val APP_INIT= "app_init"
+
+    /**
+     * 服务器地址
+     */
+    const val SERVER_ADDRESS = "server_address"
 }

+ 10 - 0
data/src/main/java/com/grkj/data/repository/IHardwareRepository.kt

@@ -69,6 +69,11 @@ interface IHardwareRepository {
      */
     fun addCard(userId: Long, cardCode: String, nickName: String)
 
+    /**
+     * 注册卡片
+     */
+    fun addCardHardware(cardCode: List<String>)
+
     /**
      * 根据用户id和卡片码删除数据
      */
@@ -83,4 +88,9 @@ interface IHardwareRepository {
      * 根据点位id获取已上锁的同点位的锁
      */
     fun getJobTicketPointLockNfcDataListByPointId(pointId: Long): List<LockData>
+
+    /**
+     * 添加点位硬件
+     */
+    fun addRfidTokenHardware(pointRfid: List<String>)
 }

+ 22 - 1
data/src/main/java/com/grkj/data/repository/impl/HardwareRepository.kt

@@ -4,6 +4,7 @@ import com.grkj.data.dao.HardwareDao
 import com.grkj.data.dao.IsolationPointDao
 import com.grkj.data.enums.CommonDictDataEnum
 import com.grkj.data.model.dos.IsJobCard
+import com.grkj.data.model.dos.IsRfidToken
 import com.grkj.data.model.local.LockData
 import com.grkj.data.model.local.PointData
 import com.grkj.data.repository.IHardwareRepository
@@ -159,12 +160,23 @@ class HardwareRepository @Inject constructor(
         val isJobCard = IsJobCard()
         isJobCard.userId = userId
         isJobCard.cardCode = cardCode
+        isJobCard.cardNfc = cardCode
         isJobCard.userName = Pinyin4jUtil.toInitials(nickName)
         hardwareDao.addCard(isJobCard)
     }
 
+    override fun addCardHardware(cardCode: List<String>) {
+        val isJobCard = cardCode.map {
+            val isJobCard = IsJobCard()
+            isJobCard.cardCode = it
+            isJobCard.cardNfc = it
+            isJobCard
+        }
+        hardwareDao.addCard(isJobCard)
+    }
+
     override fun deleteCardByUserIdAndCardCode(userId: Long, cardCode: String) {
-        hardwareDao.deleteCardByUserIdAndCardCode(userId,cardCode)
+        hardwareDao.deleteCardByUserIdAndCardCode(userId, cardCode)
     }
 
     override fun getPointNfcDataByPointIds(pointIds: List<Long?>): List<PointData> {
@@ -174,4 +186,13 @@ class HardwareRepository @Inject constructor(
     override fun getJobTicketPointLockNfcDataListByPointId(pointId: Long): List<LockData> {
         return hardwareDao.getJobTicketPointLockNfcDataListByPointId(pointId)
     }
+
+    override fun addRfidTokenHardware(pointRfid: List<String>) {
+        val isRfidToken = pointRfid.map {
+            val isRfidToken = IsRfidToken()
+            isRfidToken.rfid = it
+            isRfidToken
+        }
+        hardwareDao.addRfidToken(isRfidToken)
+    }
 }

+ 24 - 0
ui-base/src/main/java/com/grkj/ui_base/utils/event/CardSwipeEvent.kt

@@ -0,0 +1,24 @@
+package com.grkj.ui_base.utils.event
+
+import com.grkj.shared.model.EventBean
+import com.grkj.data.data.EventConstants
+
+/**
+ * 刷卡事件
+ */
+class CardSwipeEvent(val cardNo: String) {
+
+    companion object {
+        /**
+         * 发送刷卡事件
+         */
+        @JvmStatic
+        fun sendCardSwipeEvent(cardNo: String) {
+            val cardSwipeEvent = CardSwipeEvent(cardNo)
+            val cardSwipeEventBean = EventBean<CardSwipeEvent>(
+                EventConstants.EVENT_CARD_SWIPE, cardSwipeEvent
+            )
+            EventHelper.sendEvent(cardSwipeEventBean)
+        }
+    }
+}