Ver Fonte

refactor(更新)
- 用户管理完成
- 角色管理除添加完成
- 区域管理完成
- 点位管理完成

周文健 há 5 meses atrás
pai
commit
db78c95be8
55 ficheiros alterados com 2311 adições e 27 exclusões
  1. 0 1
      app/build.gradle.kts
  2. 14 1
      app/src/main/java/com/grkj/iscs/features/main/dialog/TextDropDownDialog.kt
  3. 121 0
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddPointDialog.kt
  4. 56 0
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddWorkstationDialog.kt
  5. 94 0
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/FilterPointDialog.kt
  6. 12 0
      app/src/main/java/com/grkj/iscs/features/main/enums/IsolationPointPowerType.kt
  7. 2 2
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/DataManageHomeFragment.kt
  8. 194 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/PointMangeFragment.kt
  9. 4 4
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/RoleManageFragment.kt
  10. 5 5
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/UserManageFragment.kt
  11. 172 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/WorkstationManageFragment.kt
  12. 2 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/home/HomeFragment.kt
  13. 18 0
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateJobFragment.kt
  14. 12 0
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobManageHomeFragment.kt
  15. 82 0
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/PointManageViewModel.kt
  16. 2 2
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/RoleManageViewModel.kt
  17. 1 1
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/UserManageViewModel.kt
  18. 145 0
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/WorkstationManageViewModel.kt
  19. 5 0
      app/src/main/res/color/text_color_workstation_item.xml
  20. 5 0
      app/src/main/res/drawable/bg_workstation_item.xml
  21. 8 0
      app/src/main/res/drawable/bg_workstation_item_normal.xml
  22. 5 0
      app/src/main/res/drawable/bg_workstation_item_selected.xml
  23. 107 0
      app/src/main/res/layout/dialog_add_workstation.xml
  24. 235 0
      app/src/main/res/layout/dialog_filter_point.xml
  25. 9 0
      app/src/main/res/layout/fragment_create_job.xml
  26. 155 0
      app/src/main/res/layout/fragment_point_manage.xml
  27. 1 1
      app/src/main/res/layout/fragment_role_manage.xml
  28. 122 0
      app/src/main/res/layout/fragment_workstation_manage.xml
  29. 41 0
      app/src/main/res/layout/item_point_manage_point.xml
  30. 29 0
      app/src/main/res/layout/item_workstation.xml
  31. 14 0
      app/src/main/res/navigation/nav_data_manage.xml
  32. 9 1
      app/src/main/res/navigation/nav_job_manage.xml
  33. 30 0
      app/src/main/res/values-en/strings.xml
  34. 30 0
      app/src/main/res/values-zh/strings.xml
  35. 30 0
      app/src/main/res/values/strings.xml
  36. 68 0
      data/src/main/java/com/grkj/data/dao/IsolationPointDao.kt
  37. 19 0
      data/src/main/java/com/grkj/data/dao/RfidTokenDao.kt
  38. 19 0
      data/src/main/java/com/grkj/data/dao/WorkstationDao.kt
  39. 10 1
      data/src/main/java/com/grkj/data/database/ISCSDatabase.kt
  40. 66 0
      data/src/main/java/com/grkj/data/model/dos/IsIsolationPoint.kt
  41. 32 0
      data/src/main/java/com/grkj/data/model/dos/IsRfidToken.kt
  42. 3 3
      data/src/main/java/com/grkj/data/model/dos/IsWorkstation.kt
  43. 12 0
      data/src/main/java/com/grkj/data/model/vo/AddPointManageVo.kt
  44. 12 0
      data/src/main/java/com/grkj/data/model/vo/PointManageFilterVo.kt
  45. 17 0
      data/src/main/java/com/grkj/data/model/vo/PointManageVo.kt
  46. 24 0
      data/src/main/java/com/grkj/data/model/vo/WorkstationManageVo.kt
  47. 30 0
      data/src/main/java/com/grkj/data/repository/IIsolationPointRepository.kt
  48. 11 0
      data/src/main/java/com/grkj/data/repository/IRfidTokenRepository.kt
  49. 25 0
      data/src/main/java/com/grkj/data/repository/IWorkstationRepository.kt
  50. 59 0
      data/src/main/java/com/grkj/data/repository/impl/IsolationPointRepository.kt
  51. 29 0
      data/src/main/java/com/grkj/data/repository/impl/RfidTokenRepository.kt
  52. 60 0
      data/src/main/java/com/grkj/data/repository/impl/WorkstationRepository.kt
  53. 17 2
      ui-base/src/main/java/com/grkj/ui_base/base/BaseActivity.kt
  54. 5 0
      ui-base/src/main/java/com/grkj/ui_base/data/EventConstants.kt
  55. 22 0
      ui-base/src/main/java/com/grkj/ui_base/utils/event/JumpViewEvent.kt

+ 0 - 1
app/build.gradle.kts

@@ -83,7 +83,6 @@ dependencies {
     implementation(libs.kotlinx.serialization.json)
     implementation(libs.sik.camera)
     implementation("com.github.loper7:DateTimePicker:0.6.3")
-    implementation("io.github.amrdeveloper:treeview:1.2.0")
     implementation(project(":sync"))
     implementation(project(":ui-base"))
     implementation(project(":data"))

+ 14 - 1
app/src/main/java/com/grkj/iscs/features/main/dialog/TextDropDownDialog.kt

@@ -76,6 +76,11 @@ class TextDropDownDialog(context: Context) : BasePopupWindow(context) {
          */
         fun getId(): Long
 
+        /**
+         * 获取标签
+         */
+        fun getTag(): String
+
         /**
          * 获取展示文本
          */
@@ -85,11 +90,19 @@ class TextDropDownDialog(context: Context) : BasePopupWindow(context) {
     /**
      * 简易结构
      */
-    class SimpleTextDropDownEntity(var dataId: Long = 0, var dataText: String = "") : TextDropDownEntity {
+    class SimpleTextDropDownEntity(
+        var dataId: Long = 0,
+        val dataTag: String = "",
+        var dataText: String = ""
+    ) : TextDropDownEntity {
         override fun getId(): Long {
             return dataId
         }
 
+        override fun getTag(): String {
+            return dataTag
+        }
+
         override fun getShowText(): String {
             return dataText
         }

+ 121 - 0
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddPointDialog.kt

@@ -0,0 +1,121 @@
+package com.grkj.iscs.features.main.dialog.data_manage
+
+import android.content.Context
+import android.view.View
+import com.grkj.data.model.vo.AddPointManageVo
+import com.grkj.iscs.R
+import com.grkj.iscs.databinding.DialogFilterPointBinding
+import com.grkj.iscs.features.main.dialog.TextDropDownDialog
+import com.grkj.iscs.features.main.enums.IsolationPointPowerType
+import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.PopTip
+import razerdp.basepopup.BasePopupWindow
+
+/**
+ * 添加隔离点
+ */
+class AddPointDialog(context: Context) : BasePopupWindow(context) {
+    private var onConfirm: (AddPointManageVo) -> Unit = {}
+    private var textDropDownDialog: TextDropDownDialog
+    private var workstationData: List<TextDropDownDialog.TextDropDownEntity> = mutableListOf()
+    private var selectPowerType: TextDropDownDialog.TextDropDownEntity? = null
+    private var selectWorkstation: TextDropDownDialog.TextDropDownEntity? = null
+    private lateinit var binding: DialogFilterPointBinding
+
+    init {
+        setContentView(R.layout.dialog_filter_point)
+        textDropDownDialog = TextDropDownDialog(context)
+        textDropDownDialog.setWidthAsAnchorView(true)
+
+    }
+
+    override fun onViewCreated(contentView: View) {
+        super.onViewCreated(contentView)
+        binding = DialogFilterPointBinding.bind(contentView)
+        binding.powerTypeTv.setOnClickListener {
+            setPointPowerType()
+            textDropDownDialog.showPopupWindow(binding.powerTypeTv)
+        }
+        binding.workstationTv.setOnClickListener {
+            textDropDownDialog.setData(workstationData)
+            textDropDownDialog.setOnItemSelectListener {
+                selectWorkstation = it
+                binding.workstationTv.text = it.getShowText()
+            }
+            textDropDownDialog.showPopupWindow(binding.workstationTv)
+        }
+        binding.closeIv.setOnClickListener { dismiss() }
+        binding.confirm.setOnClickListener {
+            if (checkData()) {
+                val addData = AddPointManageVo(
+                    binding.pointNameTv.text.toString(),
+                    binding.functionEt.text.toString(),
+                    selectPowerType?.getTag(),
+                    selectWorkstation?.getId(),
+                    binding.rfidTagEt.text.toString()
+                )
+                onConfirm(addData)
+                dismiss()
+                binding.pointNameTv.setText("")
+                binding.functionEt.setText("")
+                binding.powerTypeTv.text = ""
+                binding.workstationTv.text = ""
+                binding.rfidTagEt.setText("")
+                selectPowerType = null
+                selectWorkstation = null
+            }
+        }
+        binding.cancel.setOnClickListener {
+            dismiss()
+        }
+    }
+
+    fun setWorkstationData(workstationData: List<TextDropDownDialog.TextDropDownEntity>) {
+        this.workstationData = workstationData
+    }
+
+    private fun setPointPowerType() {
+        textDropDownDialog.setData(
+            IsolationPointPowerType.values().map {
+                TextDropDownDialog.SimpleTextDropDownEntity(
+                    dataTag = it.name,
+                    dataText = it.description
+                )
+            })
+        textDropDownDialog.setOnItemSelectListener {
+            selectPowerType = it
+            binding.powerTypeTv.text = it.getShowText()
+        }
+    }
+
+    private fun checkData(): Boolean {
+        if (binding.pointNameTv.text.trim().toString().isEmpty()) {
+            PopTip.build().tipDialog(R.string.please_input_point_name)
+            return false
+        }
+        if (binding.functionEt.text.trim().toString().isEmpty()) {
+            PopTip.build().tipDialog(R.string.please_input_point_function)
+            return false
+        }
+        if (selectPowerType == null) {
+            PopTip.build().tipDialog(R.string.please_select_power_type)
+            return false
+        }
+        if (selectWorkstation == null) {
+            PopTip.build().tipDialog(R.string.please_select_workstation)
+            return false
+        }
+        if (binding.rfidTagEt.text.trim().toString().isEmpty()) {
+            PopTip.build().tipDialog(R.string.please_input_rfid_tag)
+            return false
+        }
+        return true
+    }
+
+    /**
+     * 设置确认事件
+     */
+    fun setOnConfirmListener(onConfirm: (AddPointManageVo) -> Unit) {
+        this.onConfirm = onConfirm
+    }
+}

+ 56 - 0
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddWorkstationDialog.kt

@@ -0,0 +1,56 @@
+package com.grkj.iscs.features.main.dialog.data_manage
+
+import android.content.Context
+import android.view.View
+import com.grkj.data.model.vo.AddUserDataVo
+import com.grkj.iscs.R
+import com.grkj.iscs.databinding.DialogAddUserBinding
+import com.grkj.iscs.databinding.DialogAddWorkstationBinding
+import com.grkj.iscs.features.main.dialog.TextDropDownDialog
+import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.PopTip
+import razerdp.basepopup.BasePopupWindow
+
+/**
+ * 新增区域
+ */
+class AddWorkstationDialog(context: Context) : BasePopupWindow(context) {
+    private lateinit var binding: DialogAddWorkstationBinding
+    private var onConfirm: (String) -> Unit = {}
+
+    init {
+        setContentView(R.layout.dialog_add_workstation)
+    }
+
+    override fun onViewCreated(contentView: View) {
+        super.onViewCreated(contentView)
+        binding = DialogAddWorkstationBinding.bind(contentView)
+        binding.cancel.setOnClickListener { dismiss() }
+        binding.closeIv.setOnClickListener { dismiss() }
+        binding.confirm.setOnClickListener {
+            if (checkData()) {
+                onConfirm(binding.workstationNameEt.text.toString())
+                binding.workstationNameEt.setText("")
+                dismiss()
+            }
+        }
+    }
+
+    /**
+     * 检查数据
+     */
+    private fun checkData(): Boolean {
+        if (binding.workstationNameEt.text.trim().toString().isEmpty()) {
+            PopTip.build().tipDialog(R.string.please_input_workstation_name)
+            return false
+        }
+        return true
+    }
+
+    /**
+     * 设置确认监听
+     */
+    fun setOnConfirmListener(onConfirm: (String) -> Unit) {
+        this.onConfirm = onConfirm
+    }
+}

+ 94 - 0
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/FilterPointDialog.kt

@@ -0,0 +1,94 @@
+package com.grkj.iscs.features.main.dialog.data_manage
+
+import android.content.Context
+import android.view.View
+import com.grkj.data.model.vo.PointManageFilterVo
+import com.grkj.data.model.vo.RoleManageFilterVo
+import com.grkj.iscs.R
+import com.grkj.iscs.databinding.DialogFilterPointBinding
+import com.grkj.iscs.features.main.dialog.TextDropDownDialog
+import com.grkj.iscs.features.main.enums.IsolationPointPowerType
+import razerdp.basepopup.BasePopupWindow
+
+/**
+ * 筛选隔离点
+ */
+class FilterPointDialog(context: Context) : BasePopupWindow(context) {
+    private var onConfirm: (PointManageFilterVo) -> Unit = {}
+    private var textDropDownDialog: TextDropDownDialog
+    private var workstationData: List<TextDropDownDialog.TextDropDownEntity> = mutableListOf()
+    private var selectPowerType: TextDropDownDialog.TextDropDownEntity? = null
+    private var selectWorkstation: TextDropDownDialog.TextDropDownEntity? = null
+    private lateinit var binding: DialogFilterPointBinding
+
+    init {
+        setContentView(R.layout.dialog_filter_point)
+        textDropDownDialog = TextDropDownDialog(context)
+        textDropDownDialog.setWidthAsAnchorView(true)
+
+    }
+
+    override fun onViewCreated(contentView: View) {
+        super.onViewCreated(contentView)
+        binding = DialogFilterPointBinding.bind(contentView)
+        binding.powerTypeTv.setOnClickListener {
+            setPointPowerType()
+            textDropDownDialog.showPopupWindow(binding.powerTypeTv)
+        }
+        binding.workstationTv.setOnClickListener {
+            textDropDownDialog.setData(workstationData)
+            textDropDownDialog.setOnItemSelectListener {
+                selectWorkstation = it
+                binding.workstationTv.text = it.getShowText()
+            }
+            textDropDownDialog.showPopupWindow(binding.workstationTv)
+        }
+        binding.closeIv.setOnClickListener { dismiss() }
+        binding.confirm.setOnClickListener {
+            val filterData = PointManageFilterVo(
+                binding.pointNameTv.text.toString(),
+                binding.functionEt.text.toString(),
+                selectPowerType?.getTag(),
+                selectWorkstation?.getId(),
+                binding.rfidTagEt.text.toString()
+            )
+            onConfirm(filterData)
+            dismiss()
+            binding.pointNameTv.setText("")
+            binding.functionEt.setText("")
+            binding.powerTypeTv.text = ""
+            binding.workstationTv.text = ""
+            binding.rfidTagEt.setText("")
+            selectPowerType = null
+            selectWorkstation = null
+        }
+        binding.cancel.setOnClickListener {
+            dismiss()
+        }
+    }
+
+    fun setWorkstationData(workstationData: List<TextDropDownDialog.TextDropDownEntity>) {
+        this.workstationData = workstationData
+    }
+
+    private fun setPointPowerType() {
+        textDropDownDialog.setData(
+            IsolationPointPowerType.values().map {
+                TextDropDownDialog.SimpleTextDropDownEntity(
+                    dataTag = it.name,
+                    dataText = it.description
+                )
+            })
+        textDropDownDialog.setOnItemSelectListener {
+            selectPowerType = it
+            binding.powerTypeTv.text = it.getShowText()
+        }
+    }
+
+    /**
+     * 设置确认事件
+     */
+    fun setOnConfirmListener(onConfirm: (PointManageFilterVo) -> Unit) {
+        this.onConfirm = onConfirm
+    }
+}

+ 12 - 0
app/src/main/java/com/grkj/iscs/features/main/enums/IsolationPointPowerType.kt

@@ -0,0 +1,12 @@
+package com.grkj.iscs.features.main.enums
+
+/**
+ * 能量源
+ */
+enum class IsolationPointPowerType(val description: String) {
+    ZS("注塑"),
+    JJG("机加工"),
+    ZZ("组装"),
+    CK("仓库"),
+    KHJKA("电能"),
+}

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/DataManageHomeFragment.kt

@@ -95,11 +95,11 @@ class DataManageHomeFragment : BaseFragment<FragmentDataManageHomeBinding>() {
             }
 
             2 -> {
-
+                navController.navigate(R.id.action_dataManageHomeFragment_to_workstationManageFragment)
             }
 
             3 -> {
-
+                navController.navigate(R.id.action_dataManageHomeFragment_to_pointMangeFragment)
             }
         }
     }

+ 194 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/PointMangeFragment.kt

@@ -1,7 +1,200 @@
 package com.grkj.iscs.features.main.fragment.data_manage
 
+import android.graphics.Color
+import android.view.Gravity
+import androidx.lifecycle.ViewModelProvider
+import com.drake.brv.BindingAdapter
+import com.drake.brv.annotaion.DividerOrientation
+import com.drake.brv.utils.divider
+import com.drake.brv.utils.linear
+import com.drake.brv.utils.models
+import com.drake.brv.utils.setup
+import com.grkj.data.model.vo.PointManageVo
+import com.grkj.iscs.R
+import com.grkj.iscs.databinding.FragmentPointManageBinding
+import com.grkj.iscs.databinding.ItemPointManagePointBinding
+import com.grkj.iscs.features.main.dialog.TextDropDownDialog
+import com.grkj.iscs.features.main.dialog.data_manage.AddPointDialog
+import com.grkj.iscs.features.main.dialog.data_manage.FilterPointDialog
+import com.grkj.iscs.features.main.viewmodel.data_manage.PointManageViewModel
+import com.grkj.ui_base.base.BaseFragment
+import com.grkj.ui_base.dialog.TipDialog
+import com.grkj.ui_base.utils.CommonUtils
+import com.kongzue.dialogx.dialogs.PopTip
+import com.sik.sikcore.extension.setDebouncedClickListener
+
 /**
  * 点位管理
  */
-class PointMangeFragment {
+class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
+    private val viewModel: PointManageViewModel by lazy { ViewModelProvider(this)[PointManageViewModel::class] }
+    private lateinit var filterPointDialog: FilterPointDialog
+    private lateinit var addPointDialog: AddPointDialog
+    override fun getLayoutId(): Int {
+        return R.layout.fragment_point_manage
+    }
+
+    override fun initView() {
+        filterPointDialog = FilterPointDialog(requireContext())
+        filterPointDialog.popupGravity = Gravity.CENTER
+        addPointDialog = AddPointDialog(requireContext())
+        addPointDialog.popupGravity = Gravity.CENTER
+        binding.back.setOnClickListener { navController.popBackStack() }
+        filterPointDialog.setOnConfirmListener {
+            viewModel.pointFilterData = it
+            getPointData(nextPage = false)
+        }
+        addPointDialog.setOnConfirmListener {
+            viewModel.addIsolationPoint(it).observe(this) {
+                if (it) {
+                    TipDialog.show(
+                        title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_succeed)
+                            .toString(),
+                        dialogType = TipDialog.DialogType.SUCCESS,
+                        msg = CommonUtils.getStr(R.string.add_point_succeed).toString(),
+                        countDownTime = 10,
+                        showConfirm = false,
+                        onCancelClick = {
+                            getPointData(nextPage = false)
+                        }
+                    )
+                } else {
+                    TipDialog.show(
+                        title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_failed)
+                            .toString(),
+                        dialogType = TipDialog.DialogType.ERROR,
+                        msg = CommonUtils.getStr(R.string.add_point_failed).toString(),
+                        countDownTime = 10,
+                        showConfirm = false,
+                        onCancelClick = {
+                            getPointData(nextPage = false)
+                        }
+                    )
+                }
+            }
+        }
+        binding.back.setDebouncedClickListener {
+            navController.popBackStack()
+        }
+        binding.deletePoint.setDebouncedClickListener {
+            deleteSelectPoint()
+        }
+        binding.addPoint.setDebouncedClickListener {
+            viewModel.initWorkStationData().observe(this) {
+                addPointDialog.setWorkstationData(viewModel.workstationData.map {
+                    TextDropDownDialog.SimpleTextDropDownEntity(
+                        dataId = it.workstationId,
+                        dataText = it.workstationName
+                    )
+                })
+                addPointDialog.showPopupWindow()
+            }
+        }
+        binding.filterPoint.setDebouncedClickListener {
+            viewModel.initWorkStationData().observe(this) {
+                filterPointDialog.setWorkstationData(viewModel.workstationData.map {
+                    TextDropDownDialog.SimpleTextDropDownEntity(
+                        dataId = it.workstationId,
+                        dataText = it.workstationName
+                    )
+                })
+                filterPointDialog.showPopupWindow()
+            }
+        }
+        binding.refreshLayout.setOnRefreshListener {
+            viewModel.pointFilterData = null
+            getPointData(nextPage = false)
+        }
+        binding.refreshLayout.setOnLoadMoreListener {
+            getPointData()
+        }
+        binding.roleListRv.linear().divider {
+            this.setColor(Color.BLACK)
+            this.startVisible = false
+            this.endVisible = true
+            this.orientation = DividerOrientation.VERTICAL
+        }.setup {
+            addType<PointManageVo>(R.layout.item_point_manage_point)
+            onBind {
+                onRoleDataBinding(this)
+            }
+        }
+        setSelectAllListener()
+    }
+
+    private fun setSelectAllListener() {
+        binding.selectAll.setOnCheckedChangeListener { v, checked ->
+            viewModel.pointManageDataList.forEach { it.isSelected = checked }
+            binding.roleListRv.adapter?.notifyDataSetChanged()
+        }
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onRoleDataBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemPointManagePointBinding>()
+        val item = holder.getModel<PointManageVo>()
+        itemBinding.pointName.text = item.pointName.toString()
+        itemBinding.pointFunction.text = item.pointFunction
+        itemBinding.workstation.text = item.workstationName
+        itemBinding.select.setOnCheckedChangeListener(null)
+        itemBinding.select.isChecked = item.isSelected
+        itemBinding.select.setOnCheckedChangeListener { _, checked ->
+            item.isSelected = checked
+            binding.selectAll.setOnCheckedChangeListener(null)
+            binding.selectAll.isChecked = viewModel.pointManageDataList.all { it.isSelected }
+            setSelectAllListener()
+        }
+    }
+
+    override fun initData() {
+        super.initData()
+        viewModel.pointFilterData = null
+        getPointData(nextPage = false)
+    }
+
+    private fun getPointData(nextPage: Boolean = true) {
+        viewModel.getPointData(viewModel.pointFilterData, nextPage).observe(this) {
+            if (!nextPage) {
+                viewModel.pointFilterData = null
+                binding.selectAll.setOnCheckedChangeListener(null)
+                binding.selectAll.isChecked = false
+                setSelectAllListener()
+            }
+            binding.refreshLayout.finishRefresh()
+            binding.refreshLayout.finishLoadMore()
+            binding.roleListRv.models = viewModel.pointManageDataList
+        }
+    }
+
+    private fun deleteSelectPoint() {
+        if (viewModel.pointManageDataList.none { it.isSelected }) {
+            PopTip.tip(R.string.please_select_point)
+            return
+        }
+        TipDialog.show(
+            msg = CommonUtils.getStr(R.string.check_delete_point).toString(),
+            countDownTime = 10,
+            onConfirmClick = {
+                viewModel.deleteSelectedPoints(viewModel.pointManageDataList.filter { it.isSelected }
+                    .map { it.pointId }).observe(this) {
+                    if (it) {
+                        TipDialog.show(
+                            dialogType = TipDialog.DialogType.SUCCESS,
+                            msg = CommonUtils.getStr(R.string.point_manage_delete_succeed)
+                                .toString(),
+                            showConfirm = false,
+                            countDownTime = 10
+                        )
+                        getPointData(false)
+                    } else {
+                        TipDialog.show(
+                            dialogType = TipDialog.DialogType.ERROR,
+                            msg = CommonUtils.getStr(R.string.point_manage_delete_failed)
+                                .toString(),
+                            showConfirm = false,
+                            countDownTime = 10
+                        )
+                    }
+                }
+            })
+    }
 }

+ 4 - 4
app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/RoleManageFragment.kt

@@ -14,7 +14,7 @@ import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentRoleManageBinding
 import com.grkj.iscs.databinding.ItemRoleManageRoleBinding
 import com.grkj.iscs.features.main.dialog.data_manage.FilterRoleDialog
-import com.grkj.iscs.features.main.viewmodel.user_manage.RoleManageViewModel
+import com.grkj.iscs.features.main.viewmodel.data_manage.RoleManageViewModel
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
@@ -58,7 +58,7 @@ class RoleManageFragment : BaseFragment<FragmentRoleManageBinding>() {
         binding.refreshLayout.setOnLoadMoreListener {
             getRoleData()
         }
-        binding.userListRv.linear().divider {
+        binding.roleListRv.linear().divider {
             this.setColor(Color.BLACK)
             this.startVisible = false
             this.endVisible = true
@@ -75,7 +75,7 @@ class RoleManageFragment : BaseFragment<FragmentRoleManageBinding>() {
     private fun setSelectAllListener() {
         binding.selectAll.setOnCheckedChangeListener { v, checked ->
             viewModel.roleManageDataList.forEach { it.isSelected = checked }
-            binding.userListRv.adapter?.notifyDataSetChanged()
+            binding.roleListRv.adapter?.notifyDataSetChanged()
         }
     }
 
@@ -111,7 +111,7 @@ class RoleManageFragment : BaseFragment<FragmentRoleManageBinding>() {
             }
             binding.refreshLayout.finishRefresh()
             binding.refreshLayout.finishLoadMore()
-            binding.userListRv.models = viewModel.roleManageDataList
+            binding.roleListRv.models = viewModel.roleManageDataList
         }
     }
 

+ 5 - 5
app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/UserManageFragment.kt

@@ -17,7 +17,7 @@ import com.grkj.iscs.features.main.dialog.data_manage.AddUserDialog
 import com.grkj.iscs.features.main.dialog.data_manage.FilterUserDialog
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.iscs.features.main.dialog.data_manage.UserDetailDialog
-import com.grkj.iscs.features.main.viewmodel.user_manage.UserManageViewModel
+import com.grkj.iscs.features.main.viewmodel.data_manage.UserManageViewModel
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
@@ -86,14 +86,14 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
             viewModel.initRoleAndWorkStationData().observe(this) {
                 addUserDialog.setRoleData(viewModel.roleData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
-                        it.roleId,
-                        it.roleName
+                        dataId = it.roleId,
+                        dataText = it.roleName
                     )
                 })
                 addUserDialog.setWorkstationData(viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
-                        it.workstationId,
-                        it.workstationName
+                        dataId = it.workstationId,
+                        dataText = it.workstationName
                     )
                 })
                 addUserDialog.showPopupWindow()

+ 172 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/WorkstationManageFragment.kt

@@ -1,7 +1,178 @@
 package com.grkj.iscs.features.main.fragment.data_manage
 
+import android.view.Gravity
+import androidx.lifecycle.ViewModelProvider
+import com.drake.brv.utils.linear
+import com.drake.brv.utils.models
+import com.drake.brv.utils.setup
+import com.grkj.data.model.vo.WorkstationManageVo
+import com.grkj.iscs.R
+import com.grkj.iscs.databinding.FragmentWorkstationManageBinding
+import com.grkj.iscs.databinding.ItemWorkstationBinding
+import com.grkj.iscs.features.main.dialog.data_manage.AddWorkstationDialog
+import com.grkj.iscs.features.main.viewmodel.data_manage.WorkstationManageViewModel
+import com.grkj.ui_base.base.BaseFragment
+import com.grkj.ui_base.dialog.TipDialog
+import com.grkj.ui_base.utils.CommonUtils
+import com.kongzue.dialogx.dialogs.PopTip
+import com.sik.sikcore.extension.setDebouncedClickListener
+import me.jessyan.autosize.utils.AutoSizeUtils
+
 /**
  * 区域管理
  */
-class WorkstationManageFragment {
+class WorkstationManageFragment : BaseFragment<FragmentWorkstationManageBinding>() {
+    private val viewModel: WorkstationManageViewModel by lazy { ViewModelProvider(this)[WorkstationManageViewModel::class] }
+    private lateinit var addWorkstationDialog: AddWorkstationDialog
+    private val indentPx: Int by lazy { AutoSizeUtils.dp2px(requireContext(), 20f) }
+    override fun getLayoutId(): Int {
+        return R.layout.fragment_workstation_manage
+    }
+
+    override fun initView() {
+        addWorkstationDialog = AddWorkstationDialog(requireContext())
+        addWorkstationDialog.popupGravity = Gravity.CENTER
+        addWorkstationDialog.setOnConfirmListener {
+            viewModel.addWorkstation(it).observe(this) {
+                if (it) {
+                    TipDialog.show(
+                        title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_succeed)
+                            .toString(),
+                        dialogType = TipDialog.DialogType.SUCCESS,
+                        msg = CommonUtils.getStr(R.string.add_workstation_succeed).toString(),
+                        countDownTime = 10,
+                        showConfirm = false,
+                        onCancelClick = {
+                            getWorkstationManageData()
+                        }
+                    )
+                } else {
+                    TipDialog.show(
+                        title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_failed)
+                            .toString(),
+                        dialogType = TipDialog.DialogType.ERROR,
+                        msg = CommonUtils.getStr(R.string.add_workstation_failed).toString(),
+                        countDownTime = 10,
+                        showConfirm = false,
+                        onCancelClick = {
+                            getWorkstationManageData()
+                        }
+                    )
+                }
+            }
+        }
+        binding.back.setDebouncedClickListener {
+            navController.popBackStack()
+        }
+        binding.addWorkstation.setDebouncedClickListener {
+            addWorkstationDialog.showPopupWindow()
+        }
+        binding.deleteWorkstation.setDebouncedClickListener {
+            deleteSelectWorkstation()
+        }
+        binding.moveUp.setDebouncedClickListener {
+            if (viewModel.workstationManageData.none { it.isSelected }) {
+                PopTip.tip(R.string.please_select_workstation)
+                return@setDebouncedClickListener
+            }
+            viewModel.moveUp().observe(this) {
+                if (it) {
+                    getWorkstationManageData()
+                } else {
+                    PopTip.tip(R.string.workstation_is_in_top)
+                }
+            }
+        }
+        binding.moveDown.setDebouncedClickListener {
+            if (viewModel.workstationManageData.none { it.isSelected }) {
+                PopTip.tip(R.string.please_select_workstation)
+                return@setDebouncedClickListener
+            }
+            viewModel.moveDown().observe(this) {
+                if (it) {
+                    getWorkstationManageData()
+                } else {
+                    PopTip.tip(R.string.workstation_is_in_bottom)
+                }
+            }
+        }
+        binding.workstationListRv.linear().setup {
+            // 对 TreeItem 类型,使用 item_tree.xml
+            addType<WorkstationManageVo>(R.layout.item_workstation)
+            onBind {
+                val itemBinding = getBinding<ItemWorkstationBinding>()
+                val node = getModel<WorkstationManageVo>()
+                itemBinding.node = node
+                // ① 动态缩进
+                itemBinding.rootLayout.setPadding(indentPx * node.level, 0, 0, 0)
+                itemBinding.tvName.isSelected = node.isSelected
+                itemBinding.root.setOnClickListener {
+                    viewModel.workstationManageData.filter { it.isSelected }
+                        .forEach { it.isSelected = false }
+                    node.isSelected = true
+                    adapter.notifyDataSetChanged()
+                }
+            }
+        }
+        binding.refreshLayout.setOnRefreshListener {
+            getWorkstationManageData()
+        }
+        binding.refreshLayout.setEnableLoadMore(false)
+    }
+
+
+    override fun initData() {
+        super.initData()
+        getWorkstationManageData()
+    }
+
+    private fun getWorkstationManageData() {
+        viewModel.getWorkstationManageData().observe(this) {
+            binding.refreshLayout.finishRefresh()
+            binding.workstationListRv.models = viewModel.workstationManageData
+        }
+    }
+
+    private fun deleteSelectWorkstation() {
+        if (viewModel.workstationManageData.none { it.isSelected }) {
+            PopTip.tip(R.string.please_select_workstation)
+            return
+        }
+        val deleteItem = viewModel.workstationManageData.first { it.isSelected }
+        TipDialog.show(
+            msg = CommonUtils.getStr(
+                R.string.check_delete_workstation,
+                args = listOf(deleteItem.workstationName.toString()).toTypedArray()
+            )
+                .toString(),
+            countDownTime = 10,
+            onConfirmClick = {
+                viewModel.deleteWorkstation().observe(this) {
+                    if (it) {
+                        TipDialog.show(
+                            dialogType = TipDialog.DialogType.SUCCESS,
+                            msg = CommonUtils.getStr(
+                                R.string.workstation_manage_delete_succeed,
+                                args = listOf(deleteItem.workstationName.toString()).toTypedArray()
+                            )
+                                .toString(),
+                            showConfirm = false,
+                            countDownTime = 10
+                        )
+                        getWorkstationManageData()
+                    } else {
+                        TipDialog.show(
+                            dialogType = TipDialog.DialogType.ERROR,
+                            msg = CommonUtils.getStr(
+                                R.string.workstation_manage_delete_failed,
+                                args = listOf(deleteItem.workstationName.toString()).toTypedArray()
+                            )
+                                .toString(),
+                            showConfirm = false,
+                            countDownTime = 10
+                        )
+                    }
+                }
+            })
+    }
 }

+ 2 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/home/HomeFragment.kt

@@ -13,6 +13,7 @@ import com.grkj.iscs.databinding.ItemHomeMenuBinding
 import com.grkj.iscs.databinding.ItemHomeQuickEntranceBinding
 import com.grkj.iscs.features.main.entity.MenuItemEntity
 import com.grkj.ui_base.base.BaseFragment
+import com.grkj.ui_base.utils.event.JumpViewEvent
 
 /**
  * 首页
@@ -61,7 +62,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
     private fun onMenuClick(menuType: Int) {
         when (menuType) {
             0 -> {
-
+                JumpViewEvent.sendJumpViewEvent(R.navigation.nav_job_manage, R.id.action_jobManageHomeFragment_to_createJobFragment)
             }
         }
     }

+ 18 - 0
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateJobFragment.kt

@@ -0,0 +1,18 @@
+package com.grkj.iscs.features.main.fragment.job_manage
+
+import com.grkj.iscs.R
+import com.grkj.iscs.databinding.FragmentCreateJobBinding
+import com.grkj.ui_base.base.BaseFragment
+
+/**
+ * 新建作业
+ */
+class CreateJobFragment: BaseFragment<FragmentCreateJobBinding>() {
+    override fun getLayoutId(): Int {
+        return R.layout.fragment_create_job
+    }
+
+    override fun initView() {
+
+    }
+}

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

@@ -54,6 +54,18 @@ class JobManageHomeFragment : BaseFragment<FragmentJobManageHomeBinding>() {
             "作业管理",
             "job_manage:job_manage"
         ),
+        MenuItemEntity(
+            6,
+            R.mipmap.icon_data_manage_menu_point_manage,
+            "新建SOP作业",
+            "job_manage:create_sop_job"
+        ),
+        MenuItemEntity(
+            7,
+            R.mipmap.icon_data_manage_menu_point_manage,
+            "锁定中的点位",
+            "job_manage:locked_point"
+        ),
     )
 
     override fun getLayoutId(): Int {

+ 82 - 0
app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/PointManageViewModel.kt

@@ -0,0 +1,82 @@
+package com.grkj.iscs.features.main.viewmodel.data_manage
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.liveData
+import com.grkj.data.model.dos.IsWorkstation
+import com.grkj.data.model.vo.AddPointManageVo
+import com.grkj.data.model.vo.PointManageFilterVo
+import com.grkj.data.model.vo.PointManageVo
+import com.grkj.data.repository.IIsolationPointRepository
+import com.grkj.data.repository.IRfidTokenRepository
+import com.grkj.data.repository.IWorkstationRepository
+import com.grkj.data.repository.impl.IsolationPointRepository
+import com.grkj.data.repository.impl.RfidTokenRepository
+import com.grkj.data.repository.impl.WorkstationRepository
+import com.grkj.ui_base.base.BaseViewModel
+import kotlinx.coroutines.Dispatchers
+
+/**
+ * 隔离点管理界面模型
+ */
+class PointManageViewModel : BaseViewModel() {
+    private val isolationPointRepository: IIsolationPointRepository by lazy { IsolationPointRepository.instance }
+    private val rfidTokenRepository: IRfidTokenRepository by lazy { RfidTokenRepository.instance }
+    private val workstationRepository: IWorkstationRepository by lazy { WorkstationRepository.instance }
+    private var current: Int = 0
+    private var size: Int = 50
+    var workstationData: List<IsWorkstation> = mutableListOf()
+    var pointManageDataList: MutableList<PointManageVo> = mutableListOf()
+    var pointFilterData: PointManageFilterVo? = null
+
+    /**
+     * 删除选中隔离点
+     */
+    fun deleteSelectedPoints(pointIds: List<Long>): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            isolationPointRepository.deletePointByPointIds(pointIds)
+            emit(true)
+        }
+    }
+
+    /**
+     * 获取角色数据
+     */
+    fun getPointData(
+        filterData: PointManageFilterVo? = null,
+        nextPage: Boolean = true
+    ): LiveData<Boolean> {
+        if (nextPage) {
+            current += 1
+        } else {
+            current = 0
+            pointManageDataList.clear()
+        }
+        return liveData(Dispatchers.IO) {
+            val pointManageDataPage =
+                isolationPointRepository.getPointManagerData(filterData, current, size)
+            pointManageDataList.addAll(pointManageDataPage)
+            emit(true)
+        }
+    }
+
+    /**
+     * 添加隔离点
+     */
+    fun addIsolationPoint(addPointManageVo: AddPointManageVo): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            val rfidId = rfidTokenRepository.addRfidToken(addPointManageVo.RFIDTag)
+            isolationPointRepository.addIsolationPoint(addPointManageVo,rfidId)
+            emit(true)
+        }
+    }
+
+    /**
+     * 初始化岗位数据
+     */
+    fun initWorkStationData(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            workstationData = workstationRepository.getWorkStationData()
+            emit(true)
+        }
+    }
+}

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/main/viewmodel/user_manage/RoleManageViewModel.kt → app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/RoleManageViewModel.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.features.main.viewmodel.user_manage
+package com.grkj.iscs.features.main.viewmodel.data_manage
 
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
@@ -10,7 +10,7 @@ import com.grkj.ui_base.base.BaseViewModel
 import kotlinx.coroutines.Dispatchers
 
 /**
- * 用户管理界面模型
+ * 角色管理界面模型
  */
 class RoleManageViewModel : BaseViewModel() {
     private val roleRepository: IRoleRepository by lazy { RoleRepository.instance }

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/viewmodel/user_manage/UserManageViewModel.kt → app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/UserManageViewModel.kt

@@ -1,4 +1,4 @@
-package com.grkj.iscs.features.main.viewmodel.user_manage
+package com.grkj.iscs.features.main.viewmodel.data_manage
 
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData

+ 145 - 0
app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/WorkstationManageViewModel.kt

@@ -0,0 +1,145 @@
+package com.grkj.iscs.features.main.viewmodel.data_manage
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.liveData
+import com.grkj.data.model.vo.WorkstationManageVo
+import com.grkj.data.repository.IWorkstationRepository
+import com.grkj.data.repository.impl.WorkstationRepository
+import com.grkj.ui_base.base.BaseViewModel
+import kotlinx.coroutines.Dispatchers
+
+/**
+ * 岗位数据
+ */
+class WorkstationManageViewModel : BaseViewModel() {
+    private val workstationRepository: IWorkstationRepository by lazy { WorkstationRepository() }
+    var workstationManageData: MutableList<WorkstationManageVo> = mutableListOf()
+
+    /**
+     * 获取岗位数据
+     */
+    fun getWorkstationManageData(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            workstationManageData.clear()
+            val tempData = workstationRepository.getWorkstationManageData()
+
+            // 2. 默认全部展开
+            fun expandAll(nodes: List<WorkstationManageVo>) {
+                nodes.forEach { node ->
+                    node.isExpanded = true
+                    if (node.children.isNotEmpty()) expandAll(node.children)
+                }
+            }
+            expandAll(tempData)
+            // 3. 扁平化
+            val visible = flattenVisible(tempData)
+            workstationManageData.addAll(flattenVisible(tempData))
+            emit(true)
+        }
+    }
+
+    private fun flattenVisible(
+        nodes: List<WorkstationManageVo>,
+        level: Int = 0
+    ): List<WorkstationManageVo> {
+        val result = mutableListOf<WorkstationManageVo>()
+        for (n in nodes) {
+            n.level = level
+            result += n
+            if (n.isExpanded) {
+                result += flattenVisible(n.children, level + 1)
+            }
+        }
+        return result
+    }
+
+    /**
+     * 添加区域
+     */
+    fun addWorkstation(workstationName: String): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            val selectedItem = workstationManageData.first { it.isSelected }
+            val orderNum =
+                workstationManageData.count { it.parentId == selectedItem.workstationId } + 1
+            workstationRepository.insertWorkstation(
+                workstationManageData.first { it.isSelected },
+                orderNum,
+                workstationName
+            )
+            emit(true)
+        }
+    }
+
+    /**
+     * 删除区域
+     */
+    fun deleteWorkstation(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            val deletedItem = workstationManageData.first { it.isSelected }
+            workstationRepository.deleteWorkstationByWorkstationId(deletedItem.workstationId)
+            emit(true)
+        }
+    }
+
+    /**
+     * 上移
+     */
+    fun moveUp(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            val selectedItem = workstationManageData.first { it.isSelected }
+            val upItem =
+                workstationManageData.find {
+                    it.parentId == selectedItem.parentId && it.orderNum == (selectedItem.orderNum
+                        ?: 0) - 1
+                }
+            if (upItem == null) {
+                emit(false)
+            } else {
+                val upItemOrderNum = upItem.orderNum
+                upItem.orderNum = selectedItem.orderNum
+                selectedItem.orderNum = upItemOrderNum
+                workstationRepository.updateWorkstationOrderNumById(
+                    selectedItem.workstationId,
+                    selectedItem.orderNum
+                )
+                workstationRepository.updateWorkstationOrderNumById(
+                    upItem.workstationId,
+                    upItem.orderNum
+                )
+                emit(true)
+            }
+        }
+    }
+
+    /**
+     * 下移
+     */
+    fun moveDown(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            val selectedItem = workstationManageData.first { it.isSelected }
+            val downItem =
+                workstationManageData.find {
+                    it.parentId == selectedItem.parentId && it.orderNum == (selectedItem.orderNum
+                        ?: 0) + 1
+                }
+            if (downItem == null) {
+                emit(false)
+            } else {
+                val downItemOrderNum = downItem.orderNum
+                downItem.orderNum = selectedItem.orderNum
+                selectedItem.orderNum = downItemOrderNum
+                workstationRepository.updateWorkstationOrderNumById(
+                    selectedItem.workstationId,
+                    selectedItem.orderNum
+                )
+                workstationRepository.updateWorkstationOrderNumById(
+                    downItem.workstationId,
+                    downItem.orderNum
+                )
+                emit(true)
+            }
+        }
+    }
+
+
+}

+ 5 - 0
app/src/main/res/color/text_color_workstation_item.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="@color/white" android:state_selected="true" />
+    <item android:color="@color/black" />
+</selector>

+ 5 - 0
app/src/main/res/drawable/bg_workstation_item.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/bg_workstation_item_selected" android:state_selected="true" />
+    <item android:drawable="@drawable/bg_workstation_item_normal" />
+</selector>

+ 8 - 0
app/src/main/res/drawable/bg_workstation_item_normal.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/white" />
+    <stroke
+        android:width="1dp"
+        android:color="@color/black" />
+</shape>

+ 5 - 0
app/src/main/res/drawable/bg_workstation_item_selected.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/common_tip_dialog_info" />
+</shape>

+ 107 - 0
app/src/main/res/layout/dialog_add_workstation.xml

@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <LinearLayout
+        android:layout_width="400dp"
+        android:layout_height="200dp"
+        android:background="@drawable/common_card_bg"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/title_layout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingHorizontal="10dp"
+            android:paddingVertical="5dp">
+
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="@string/workstation_manage_new_workstation"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+
+            <ImageView
+                android:id="@+id/close_iv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:paddingHorizontal="10dp"
+                android:src="@drawable/icon_close" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:background="@color/black" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="20dp"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingHorizontal="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/workstation_manage_workstation_name"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+
+                <EditText
+                    android:id="@+id/workstation_name_et"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:background="@drawable/bg_common_input"
+                    android:hint="@string/please_input_workstation_name"
+                    android:maxLines="1"
+                    android:paddingHorizontal="10dp"
+                    android:paddingVertical="2dp"
+                    android:singleLine="true"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+            </LinearLayout>
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="right"
+            android:orientation="horizontal"
+            android:padding="10dp">
+
+            <TextView
+                android:id="@+id/confirm"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/confirm"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+
+            <TextView
+                android:id="@+id/cancel"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/cancel"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+        </LinearLayout>
+    </LinearLayout>
+</layout>

+ 235 - 0
app/src/main/res/layout/dialog_filter_point.xml

@@ -0,0 +1,235 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <LinearLayout
+        android:layout_width="400dp"
+        android:layout_height="400dp"
+        android:background="@drawable/common_card_bg"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/title_layout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingHorizontal="10dp"
+            android:paddingVertical="5dp">
+
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="@string/user_manage_filter_title"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+
+            <ImageView
+                android:id="@+id/close_iv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:paddingHorizontal="10dp"
+                android:src="@drawable/icon_close" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:background="@color/black" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="20dp"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingHorizontal="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/point_manage_point_name"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+
+                <EditText
+                    android:id="@+id/point_name_tv"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:background="@drawable/bg_common_input"
+                    android:hint="@string/please_input_point_name"
+                    android:maxLines="1"
+                    android:paddingHorizontal="10dp"
+                    android:paddingVertical="2dp"
+                    android:singleLine="true"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="20dp"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingHorizontal="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/point_manage_point_function"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+
+                <EditText
+                    android:id="@+id/function_et"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:background="@drawable/bg_common_input"
+                    android:hint="@string/please_input_point_function"
+                    android:maxLines="1"
+                    android:paddingHorizontal="10dp"
+                    android:paddingVertical="2dp"
+                    android:singleLine="true"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="37dp"
+                android:layout_marginTop="20dp"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingHorizontal="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/point_manage_point_power_type"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+
+                <TextView
+                    android:id="@+id/power_type_tv"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:background="@drawable/bg_common_input"
+                    android:drawableRight="@drawable/icon_drop_down"
+                    android:hint="@string/please_select_power_type"
+                    android:maxLines="1"
+                    android:paddingHorizontal="10dp"
+                    android:paddingVertical="2dp"
+                    android:singleLine="true"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+            </LinearLayout>
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="55dp"
+                android:layout_marginTop="20dp"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingHorizontal="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/point_manage_workstation"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+
+                <TextView
+                    android:id="@+id/workstation_tv"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:background="@drawable/bg_common_input"
+                    android:drawableRight="@drawable/icon_drop_down"
+                    android:hint="@string/please_select_workstation"
+                    android:maxLines="1"
+                    android:paddingHorizontal="10dp"
+                    android:paddingVertical="2dp"
+                    android:singleLine="true"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="13dp"
+                android:layout_marginTop="20dp"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingHorizontal="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/point_manage_rfid_tag"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+
+                <EditText
+                    android:id="@+id/rfid_tag_et"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:background="@drawable/bg_common_input"
+                    android:hint="@string/please_input_rfid_tag"
+                    android:maxLines="1"
+                    android:paddingHorizontal="10dp"
+                    android:paddingVertical="2dp"
+                    android:singleLine="true"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+            </LinearLayout>
+
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="right"
+            android:orientation="horizontal"
+            android:padding="10dp">
+
+            <TextView
+                android:id="@+id/confirm"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/confirm"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+
+            <TextView
+                android:id="@+id/cancel"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/cancel"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+        </LinearLayout>
+    </LinearLayout>
+</layout>

+ 9 - 0
app/src/main/res/layout/fragment_create_job.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    </RelativeLayout>
+</layout>

+ 155 - 0
app/src/main/res/layout/fragment_point_manage.xml

@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_margin="20dp"
+        android:background="@drawable/home_card_bg"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/title_layout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingHorizontal="10dp"
+            android:paddingVertical="5dp">
+
+            <ImageView
+                android:layout_width="20dp"
+                android:layout_height="20dp"
+                android:src="@mipmap/icon_data_manage_menu_user_manage" />
+
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:layout_weight="1"
+                android:text="@string/point_manage_title"
+                android:textColor="@color/black"
+                android:textSize="24sp" />
+
+            <TextView
+                android:id="@+id/back"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/back"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:background="@color/black" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:paddingHorizontal="10dp"
+            android:paddingVertical="10dp">
+
+
+            <TextView
+                android:id="@+id/add_point"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/insert"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+
+
+            <TextView
+                android:id="@+id/delete_point"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/delete"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+
+
+            <View
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:layout_weight="1" />
+
+            <TextView
+                android:id="@+id/filter_point"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/filter"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginHorizontal="20dp"
+            android:layout_marginTop="10dp"
+            android:background="@drawable/common_card_bg"
+            android:divider="@drawable/divider_table"
+            android:showDividers="middle">
+
+            <CheckBox
+                android:id="@+id/select_all"
+                android:layout_width="30dp"
+                android:layout_height="30dp"
+                android:layout_gravity="center"
+                android:layout_margin="10dp" />
+
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center"
+                android:text="@string/point_manage_point_name"
+                android:textSize="18sp" />
+
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center"
+                android:text="@string/point_manage_point_function"
+                android:textSize="18sp" />
+
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center"
+                android:text="@string/point_manage_workstation"
+                android:textSize="18sp" />
+        </LinearLayout>
+
+        <com.scwang.smart.refresh.layout.SmartRefreshLayout
+            android:id="@+id/refresh_layout"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginHorizontal="20dp"
+            android:layout_marginBottom="10dp">
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/role_list_rv"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:background="@drawable/common_card_bg" />
+        </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+    </LinearLayout>
+</layout>

+ 1 - 1
app/src/main/res/layout/fragment_role_manage.xml

@@ -146,7 +146,7 @@
             android:layout_marginBottom="10dp">
 
             <androidx.recyclerview.widget.RecyclerView
-                android:id="@+id/user_list_rv"
+                android:id="@+id/role_list_rv"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 android:background="@drawable/common_card_bg" />

+ 122 - 0
app/src/main/res/layout/fragment_workstation_manage.xml

@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_margin="20dp"
+        android:background="@drawable/home_card_bg"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/title_layout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingHorizontal="10dp"
+            android:paddingVertical="5dp">
+
+            <ImageView
+                android:layout_width="20dp"
+                android:layout_height="20dp"
+                android:src="@mipmap/icon_data_manage_menu_user_manage" />
+
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:layout_weight="1"
+                android:text="@string/workstation_manage_title"
+                android:textColor="@color/black"
+                android:textSize="24sp" />
+
+            <TextView
+                android:id="@+id/back"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/back"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:background="@color/black" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:paddingHorizontal="10dp"
+            android:paddingVertical="10dp">
+
+
+            <TextView
+                android:id="@+id/add_workstation"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/insert"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+
+
+            <TextView
+                android:id="@+id/delete_workstation"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/delete"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+
+
+            <TextView
+                android:id="@+id/move_up"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/move_up"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+
+            <TextView
+                android:id="@+id/move_down"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/move_down"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+        </LinearLayout>
+
+        <com.scwang.smart.refresh.layout.SmartRefreshLayout
+            android:id="@+id/refresh_layout"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginHorizontal="20dp"
+            android:layout_marginBottom="10dp">
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/workstation_list_rv"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:background="@drawable/common_card_bg"
+                android:paddingHorizontal="10dp"
+                android:paddingBottom="10dp" />
+        </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+    </LinearLayout>
+</layout>

+ 41 - 0
app/src/main/res/layout/item_point_manage_point.xml

@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:divider="@drawable/divider_table"
+        android:showDividers="middle">
+
+        <CheckBox
+            android:id="@+id/select"
+            android:layout_width="30dp"
+            android:layout_height="30dp"
+            android:layout_gravity="center"
+            android:layout_margin="10dp" />
+
+        <TextView
+            android:id="@+id/point_name"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:gravity="center"
+            android:textSize="18sp" />
+
+        <TextView
+            android:id="@+id/point_function"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:gravity="center"
+            android:textSize="18sp" />
+
+        <TextView
+            android:id="@+id/workstation"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:gravity="center"
+            android:textSize="18sp" />
+    </LinearLayout>
+</layout>

+ 29 - 0
app/src/main/res/layout/item_workstation.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <data>
+
+        <variable
+            name="node"
+            type="com.grkj.data.model.vo.WorkstationManageVo" />
+    </data>
+
+    <LinearLayout
+        android:id="@+id/rootLayout"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="10dp"
+        android:gravity="center_vertical"
+        android:orientation="horizontal">
+
+        <TextView
+            android:id="@+id/tvName"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:background="@drawable/bg_workstation_item"
+            android:padding="10dp"
+            android:text="@{node.workstationName}"
+            android:textColor="@color/text_color_workstation_item"
+            android:textSize="28sp" />
+    </LinearLayout>
+</layout>

+ 14 - 0
app/src/main/res/navigation/nav_data_manage.xml

@@ -14,6 +14,12 @@
         <action
             android:id="@+id/action_dataManageHomeFragment_to_roleManageFragment"
             app:destination="@id/roleManageFragment" />
+        <action
+            android:id="@+id/action_dataManageHomeFragment_to_workstationManageFragment"
+            app:destination="@id/workstationManageFragment" />
+        <action
+            android:id="@+id/action_dataManageHomeFragment_to_pointMangeFragment"
+            app:destination="@id/pointMangeFragment" />
     </fragment>
     <fragment
         android:id="@+id/userManageFragment"
@@ -23,4 +29,12 @@
         android:id="@+id/roleManageFragment"
         android:name="com.grkj.iscs.features.main.fragment.data_manage.RoleManageFragment"
         android:label="RoleManageFragment" />
+    <fragment
+        android:id="@+id/workstationManageFragment"
+        android:name="com.grkj.iscs.features.main.fragment.data_manage.WorkstationManageFragment"
+        android:label="WorkstationManageFragment" />
+    <fragment
+        android:id="@+id/pointMangeFragment"
+        android:name="com.grkj.iscs.features.main.fragment.data_manage.PointMangeFragment"
+        android:label="PointMangeFragment" />
 </navigation>

+ 9 - 1
app/src/main/res/navigation/nav_job_manage.xml

@@ -7,5 +7,13 @@
     <fragment
         android:id="@+id/jobManageHomeFragment"
         android:name="com.grkj.iscs.features.main.fragment.job_manage.JobManageHomeFragment"
-        android:label="JobManageHomeFragment" />
+        android:label="JobManageHomeFragment" >
+        <action
+            android:id="@+id/action_jobManageHomeFragment_to_createJobFragment"
+            app:destination="@id/createJobFragment" />
+    </fragment>
+    <fragment
+        android:id="@+id/createJobFragment"
+        android:name="com.grkj.iscs.features.main.fragment.job_manage.CreateJobFragment"
+        android:label="CreateJobFragment" />
 </navigation>

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

@@ -54,4 +54,34 @@
     <string name="role_manage_delete_failed">Role delete failed</string>
     <string name="check_delete_role">Do you want to delete selected roles?</string>
     <string name="role_manage_role_num">Role NO.</string>
+    <string name="workstation_manage_title">Workstation Manage</string>
+    <string name="move_up">move up</string>
+    <string name="move_down">move down</string>
+    <string name="workstation_manage_new_workstation">New workstation</string>
+    <string name="please_input_workstation_name">please input workstation name</string>
+    <string name="workstation_manage_workstation_name">Workstation name</string>
+    <string name="please_select_workstation">please select workstation</string>
+    <string name="check_delete_workstation">Do you want to delete selected workstation "%1$s"?</string>
+    <string name="workstation_manage_delete_succeed">delete workstation "%1$s" succeed</string>
+    <string name="workstation_manage_delete_failed">delete workstation "%1$s" failed</string>
+    <string name="workstation_is_in_top">workstation is top</string>
+    <string name="workstation_is_in_bottom">workstation is bottom</string>
+    <string name="point_manage_title">Point Manage</string>
+    <string name="point_manage_point_name">Point name</string>
+    <string name="point_manage_point_function">Point function</string>
+    <string name="point_manage_workstation">Workstation</string>
+    <string name="please_input_point_name">please input point name</string>
+    <string name="please_input_point_function">please input point function</string>
+    <string name="point_manage_point_power_type">Power type</string>
+    <string name="please_select_power_type">please select power type</string>
+    <string name="point_manage_rfid_tag">RFID Tag</string>
+    <string name="please_input_rfid_tag">please input RFID tag</string>
+    <string name="please_select_point">please select point</string>
+    <string name="check_delete_point">Do you want to delete selected points</string>
+    <string name="point_manage_delete_succeed">point delete succeed</string>
+    <string name="point_manage_delete_failed">point delete failed</string>
+    <string name="add_point_succeed">new point succeed</string>
+    <string name="add_point_failed">new point failed</string>
+    <string name="add_workstation_succeed">new workstation succeed</string>
+    <string name="add_workstation_failed">new workstation failed</string>
 </resources>

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

@@ -54,4 +54,34 @@
     <string name="role_manage_delete_failed">无法删除角色</string>
     <string name="check_delete_role">您确认要删除角色吗</string>
     <string name="role_manage_role_num">角色编号</string>
+    <string name="workstation_manage_title">区域管理</string>
+    <string name="move_up">上移</string>
+    <string name="move_down">下移</string>
+    <string name="workstation_manage_new_workstation">新增区域</string>
+    <string name="please_input_workstation_name">请输入区域名称</string>
+    <string name="workstation_manage_workstation_name">区域名称</string>
+    <string name="please_select_workstation">请选择区域</string>
+    <string name="check_delete_workstation">您确定要删除区域"%1$s"吗</string>
+    <string name="workstation_manage_delete_succeed">删除区域"%1$s"成功</string>
+    <string name="workstation_manage_delete_failed">无法删除区域"%1$s"</string>
+    <string name="workstation_is_in_top">区域已经在顶部</string>
+    <string name="workstation_is_in_bottom">区域已经在底部</string>
+    <string name="point_manage_title">点位管理</string>
+    <string name="point_manage_point_name">隔离点名称</string>
+    <string name="point_manage_point_function">隔离点作用</string>
+    <string name="point_manage_workstation">区域</string>
+    <string name="please_input_point_name">请输入隔离点名称</string>
+    <string name="please_input_point_function">请输入隔离点作用</string>
+    <string name="point_manage_point_power_type">能量源</string>
+    <string name="please_select_power_type">请选择能量源</string>
+    <string name="point_manage_rfid_tag">RFID 标签</string>
+    <string name="please_input_rfid_tag">请输入RFID标签</string>
+    <string name="please_select_point">请选择隔离点</string>
+    <string name="check_delete_point">您确定要删除隔离点吗</string>
+    <string name="point_manage_delete_succeed">隔离点删除成功</string>
+    <string name="point_manage_delete_failed">无法删除隔离点</string>
+    <string name="add_point_succeed">新增隔离点成功</string>
+    <string name="add_point_failed">新增隔离点失败</string>
+    <string name="add_workstation_succeed">新增区域成功</string>
+    <string name="add_workstation_failed">新增区域失败</string>
 </resources>

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

@@ -53,4 +53,34 @@
     <string name="role_manage_delete_failed">无法删除角色</string>
     <string name="check_delete_role">您确认要删除角色吗</string>
     <string name="role_manage_role_num">角色编号</string>
+    <string name="workstation_manage_title">区域管理</string>
+    <string name="move_up">上移</string>
+    <string name="move_down">下移</string>
+    <string name="workstation_manage_new_workstation">新增区域</string>
+    <string name="please_input_workstation_name">请输入区域名称</string>
+    <string name="workstation_manage_workstation_name">区域名称</string>
+    <string name="please_select_workstation">请选择区域</string>
+    <string name="check_delete_workstation">您确定要删除区域"%1$s"吗</string>
+    <string name="workstation_manage_delete_succeed">删除区域"%1$s"成功</string>
+    <string name="workstation_manage_delete_failed">无法删除区域"%1$s"</string>
+    <string name="workstation_is_in_top">区域已经在顶部</string>
+    <string name="workstation_is_in_bottom">区域已经在底部</string>
+    <string name="point_manage_title">点位管理</string>
+    <string name="point_manage_point_name">隔离点名称</string>
+    <string name="point_manage_point_function">隔离点作用</string>
+    <string name="point_manage_workstation">区域</string>
+    <string name="please_input_point_name">请输入隔离点名称</string>
+    <string name="please_input_point_function">请输入隔离点作用</string>
+    <string name="point_manage_point_power_type">能量源</string>
+    <string name="please_select_power_type">请选择能量源</string>
+    <string name="point_manage_rfid_tag">RFID 标签</string>
+    <string name="please_input_rfid_tag">请输入RFID标签</string>
+    <string name="please_select_point">请选择隔离点</string>
+    <string name="check_delete_point">您确定要删除隔离点吗</string>
+    <string name="point_manage_delete_succeed">隔离点删除成功</string>
+    <string name="point_manage_delete_failed">无法删除隔离点</string>
+    <string name="add_point_succeed">新增隔离点成功</string>
+    <string name="add_point_failed">新增隔离点失败</string>
+    <string name="add_workstation_succeed">新增区域成功</string>
+    <string name="add_workstation_failed">新增区域失败</string>
 </resources>

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

@@ -0,0 +1,68 @@
+package com.grkj.data.dao
+
+import androidx.room.Dao
+import androidx.room.Insert
+import androidx.room.OnConflictStrategy
+import androidx.room.Query
+import com.grkj.data.model.dos.IsIsolationPoint
+import com.grkj.data.model.vo.PointManageVo
+
+/**
+ * 隔离点数据操作
+ */
+@Dao
+interface IsolationPointDao {
+    /**
+     * 添加隔离点
+     */
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
+    fun addIsolationPoint(isolationPoint: IsIsolationPoint)
+
+    /**
+     * 获取隔离点数据
+     */
+    @Query(
+        """
+        select iip.point_id as pointId,
+        iip.point_name as pointName,
+        iip.remark as pointFunction,
+        iw.workstation_name as workstationName,
+        irt.rfid as rfidToken
+        from is_isolation_point iip
+        left join is_rfid_token irt on iip.rfid_id = irt.rfid_id
+        left join is_workstation iw on iip.workstation_id=iw.workstation_id
+        WHERE iip.del_flag = 0
+
+          -- 只有当 nickname 不为 NULL 且非空才做模糊匹配
+          AND (:pointName       IS NULL OR trim(:pointName) = '' OR iip.point_name       LIKE '%' || :pointName       || '%')
+    
+          -- 只有当 cardCode 不为 NULL 且非空才做模糊匹配
+          AND (:pointFunction       IS NULL OR trim(:pointFunction) = '' OR iip.remark       LIKE '%' || :pointFunction       || '%')
+    
+          -- 只有当 workstationName 不为 NULL 且非空才做模糊匹配
+          AND (:powerType IS NULL OR trim(:powerType) = '' OR iip.power_type LIKE '%' || :powerType || '%')
+          AND (:workstation IS NULL OR trim(:workstation) = '' OR iw.workstation_id = :workstation)
+          -- 只有当 workstationName 不为 NULL 且非空才做模糊匹配
+          AND (:rfidTag IS NULL OR trim(:rfidTag) = '' OR irt.rfid LIKE '%' || :rfidTag || '%')
+    
+    
+        LIMIT :size OFFSET :offset
+    """
+    )
+    fun getPointManageData(
+        pointName: String?,
+        pointFunction: String?,
+        powerType: String?,
+        workstation: Long?,
+        rfidTag: String?,
+        size: Int,
+        offset: Int
+    ): List<PointManageVo>
+
+    /**
+     * 根据隔离点id删除隔离点
+     */
+    @Query("delete from is_isolation_point where point_id in (:pointIds)")
+    fun deletePointByPointIds(pointIds: List<Long>)
+
+}

+ 19 - 0
data/src/main/java/com/grkj/data/dao/RfidTokenDao.kt

@@ -0,0 +1,19 @@
+package com.grkj.data.dao
+
+import androidx.room.Dao
+import androidx.room.Insert
+import androidx.room.OnConflictStrategy
+import com.grkj.data.model.dos.IsRfidToken
+
+/**
+ * rfid数据操作
+ */
+@Dao
+interface RfidTokenDao {
+    /**
+     * 添加rfid标签
+     */
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
+    fun insertRfidToken(rfidToken: IsRfidToken): Long
+
+}

+ 19 - 0
data/src/main/java/com/grkj/data/dao/WorkstationDao.kt

@@ -2,6 +2,7 @@ package com.grkj.data.dao
 
 import androidx.room.Dao
 import androidx.room.Insert
+import androidx.room.OnConflictStrategy
 import androidx.room.Query
 import com.grkj.data.model.dos.IsUserWorkstation
 import com.grkj.data.model.dos.IsWorkstation
@@ -28,4 +29,22 @@ interface WorkstationDao {
      */
     @Query("delete from is_user_workstation where user_id in (:userIds)")
     fun deleteUserWorkstationByUserIds(userIds: List<Long>)
+
+    /**
+     * 新增区域
+     */
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
+    fun insertWorkstation(workstation: IsWorkstation)
+
+    /**
+     * 根据区域id删除
+     */
+    @Query("delete from is_workstation where workstation_id = :workstationId")
+    fun deleteWorkstationByWorkstationId(workstationId: Long)
+
+    /**
+     * 根据区域id更新排序
+     */
+    @Query("update is_workstation set order_num = :orderNum where workstation_id = :workstationId")
+    fun updateWorkstationOrderNumById(workstationId: Long, orderNum: Int?)
 }

+ 10 - 1
data/src/main/java/com/grkj/data/database/ISCSDatabase.kt

@@ -5,10 +5,14 @@ import androidx.room.Database
 import androidx.room.Room
 import androidx.room.RoomDatabase
 import com.grkj.data.dao.HardwareDao
+import com.grkj.data.dao.IsolationPointDao
+import com.grkj.data.dao.RfidTokenDao
 import com.grkj.data.dao.RoleDao
 import com.grkj.data.dao.UserDao
 import com.grkj.data.dao.WorkstationDao
+import com.grkj.data.model.dos.IsIsolationPoint
 import com.grkj.data.model.dos.IsJobCardDo
+import com.grkj.data.model.dos.IsRfidToken
 import com.grkj.data.model.dos.IsUserWorkstation
 import com.grkj.data.model.dos.IsWorkstation
 import com.grkj.data.model.dos.SysRole
@@ -21,7 +25,8 @@ import com.sik.sikcore.SIKCore
  * 本地数据库
  */
 @Database(
-    entities = [IsJobCardDo::class, SysUserDo::class, SysUserCharacteristicDo::class, SysRole::class, SysUserRole::class, IsUserWorkstation::class, IsWorkstation::class],
+    entities = [IsJobCardDo::class, SysUserDo::class, SysUserCharacteristicDo::class,
+        SysRole::class, SysUserRole::class, IsUserWorkstation::class, IsWorkstation::class, IsIsolationPoint::class, IsRfidToken::class],
     version = ISCSMigrations.VERSION
 )
 abstract class ISCSDatabase : RoomDatabase() {
@@ -48,4 +53,8 @@ abstract class ISCSDatabase : RoomDatabase() {
     abstract fun roleDao(): RoleDao
 
     abstract fun workstationDao(): WorkstationDao
+
+    abstract fun isolationPointDao(): IsolationPointDao
+
+    abstract fun rfidTokenDao(): RfidTokenDao
 }

+ 66 - 0
data/src/main/java/com/grkj/data/model/dos/IsIsolationPoint.kt

@@ -0,0 +1,66 @@
+package com.grkj.data.model.dos
+
+import androidx.room.ColumnInfo
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+/**
+ * 隔离点表
+ */
+@Entity(tableName = "is_isolation_point")
+class IsIsolationPoint : BaseBean() {
+    @PrimaryKey(autoGenerate = true)
+    @ColumnInfo("point_id")
+    var pointId: Long = 0
+
+    @ColumnInfo("point_code")
+    var pointCode: String = ""
+
+    @ColumnInfo("point_name")
+    var pointName: String = ""
+
+    @ColumnInfo("point_type")
+    var pointType: String? = null
+
+    @ColumnInfo("rfid_id")
+    var rfidId: Long? = null
+
+    @ColumnInfo("workshop_id")
+    var workshopId: Long? = null
+
+    @ColumnInfo("workarea_id")
+    var workareaId: Long? = null
+
+    @ColumnInfo("workstation_id")
+    var workstationId: Long? = null
+
+    @ColumnInfo("loto_id")
+    var lotoId: Long? = null
+
+    @ColumnInfo("power_type")
+    var powerType: String? = null
+
+    @ColumnInfo("isolation_method")
+    var isolationMethod: String? = null
+
+    @ColumnInfo("point_icon")
+    var pointIcon: String? = null
+
+    @ColumnInfo("point_picture")
+    var pointPicture: String? = null
+
+    @ColumnInfo("lock_type_id")
+    var lockTypeId: Long? = null
+
+    @ColumnInfo("lockset_type_id")
+    var locksetTypeId: Long? = null
+
+    @ColumnInfo("switch_status")
+    var switchStatus: String? = null
+
+    @ColumnInfo("point_serial_number")
+    var pointSerialNumber: String? = null
+
+    @ColumnInfo("del_flag")
+    var delFlag: String? = "0"
+}

+ 32 - 0
data/src/main/java/com/grkj/data/model/dos/IsRfidToken.kt

@@ -0,0 +1,32 @@
+package com.grkj.data.model.dos
+
+import androidx.room.ColumnInfo
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+/**
+ * rfid标签
+ */
+@Entity("is_rfid_token")
+class IsRfidToken : BaseBean() {
+
+    @PrimaryKey(autoGenerate = true)
+    @ColumnInfo("rfid_id")
+    var rfidId: Long = 0
+
+    @ColumnInfo("rfid_code")
+    var rfidCode: String? = ""
+
+    @ColumnInfo("hardware_id")
+    var hardwareId: Long? = null
+
+    var rfid: String = ""
+
+    @ColumnInfo("rfid_type")
+    var rfidType: String? = null
+
+    @ColumnInfo("del_flag")
+    var delFlag: String? = "0"
+
+    var status: String? = "0"
+}

+ 3 - 3
data/src/main/java/com/grkj/data/model/dos/IsWorkstation.kt

@@ -26,12 +26,12 @@ class IsWorkstation : BaseBean() {
     var ancestors: String? = null
 
     @ColumnInfo("order_num")
-    var orderNum: Int? = null
+    var orderNum: Int? = 0
 
     @ColumnInfo("status")
-    var status: String? = null
+    var status: String? = "0"
 
     @ColumnInfo("del_flag")
-    var delFlag: String? = null
+    var delFlag: String? = "0"
 
 }

+ 12 - 0
data/src/main/java/com/grkj/data/model/vo/AddPointManageVo.kt

@@ -0,0 +1,12 @@
+package com.grkj.data.model.vo
+
+/**
+ * 添加隔离点
+ */
+data class AddPointManageVo(
+    val pointName: String?,
+    val pointFunction: String?,
+    val powerType: String?,
+    val workstationId: Long?,
+    val RFIDTag: String?
+)

+ 12 - 0
data/src/main/java/com/grkj/data/model/vo/PointManageFilterVo.kt

@@ -0,0 +1,12 @@
+package com.grkj.data.model.vo
+
+/**
+ * 筛选隔离点
+ */
+data class PointManageFilterVo(
+    val pointName: String?,
+    val pointFunction: String?,
+    val powerType: String?,
+    val workstation: Long?,
+    val RFIDTag: String?
+)

+ 17 - 0
data/src/main/java/com/grkj/data/model/vo/PointManageVo.kt

@@ -0,0 +1,17 @@
+package com.grkj.data.model.vo
+
+import androidx.room.Ignore
+
+/**
+ * 隔离点展示实体
+ */
+class PointManageVo {
+    var pointId: Long = 0
+    var pointName: String? = ""
+    var pointFunction: String? = ""
+    var workstationName: String? = ""
+    var rfidToken: String? = ""
+
+    @Ignore
+    var isSelected: Boolean = false
+}

+ 24 - 0
data/src/main/java/com/grkj/data/model/vo/WorkstationManageVo.kt

@@ -0,0 +1,24 @@
+package com.grkj.data.model.vo
+
+import androidx.room.Ignore
+
+/**
+ * 岗位管理数据树形
+ */
+class WorkstationManageVo {
+    var workstationId: Long = 0
+    var workstationName: String = ""
+    var parentId: Long? = null
+    var ancestors: String? = null
+    var orderNum: Int? = null
+
+    @Ignore var isSelected: Boolean = false
+
+    // 新增:树结构 & 层级 & 展开状态,用 @Ignore 标记 Room 不映射
+    @Ignore var children: MutableList<WorkstationManageVo> = mutableListOf()
+    @Ignore var level: Int = 0
+    @Ignore var isExpanded: Boolean = false
+
+    /** 判断自己有没有子节点 */
+    fun hasChildren() = children.isNotEmpty()
+}

+ 30 - 0
data/src/main/java/com/grkj/data/repository/IIsolationPointRepository.kt

@@ -0,0 +1,30 @@
+package com.grkj.data.repository
+
+import com.grkj.data.model.vo.AddPointManageVo
+import com.grkj.data.model.vo.PointManageFilterVo
+import com.grkj.data.model.vo.PointManageVo
+
+/**
+ * 隔离点仓储
+ */
+interface IIsolationPointRepository {
+    /**
+     * 根据隔离点id删除隔离点
+     */
+    fun deletePointByPointIds(pointIds: List<Long>)
+
+    /**
+     * 获取隔离点数据
+     */
+    fun getPointManagerData(
+        filterData: PointManageFilterVo?,
+        current: Int,
+        size: Int
+    ): List<PointManageVo>
+
+    /**
+     * 添加隔离点
+     */
+    fun addIsolationPoint(addPointManageVo: AddPointManageVo, rfidId: Long)
+
+}

+ 11 - 0
data/src/main/java/com/grkj/data/repository/IRfidTokenRepository.kt

@@ -0,0 +1,11 @@
+package com.grkj.data.repository
+
+/**
+ * RFID标签仓储
+ */
+interface IRfidTokenRepository {
+    /**
+     * 添加rfid
+     */
+    fun addRfidToken(rfidToken: String?): Long
+}

+ 25 - 0
data/src/main/java/com/grkj/data/repository/IWorkstationRepository.kt

@@ -1,6 +1,7 @@
 package com.grkj.data.repository
 
 import com.grkj.data.model.dos.IsWorkstation
+import com.grkj.data.model.vo.WorkstationManageVo
 
 /**
  * 岗位仓储
@@ -20,4 +21,28 @@ interface IWorkstationRepository {
      * 根据用户id删除数据
      */
     fun deleteUserWorkstationByUserIds(userIds: List<Long>)
+
+    /**
+     * 获取岗位管理数据
+     */
+    fun getWorkstationManageData(): List<WorkstationManageVo>
+
+    /**
+     * 新增区域
+     */
+    fun insertWorkstation(
+        workstationManageVo: WorkstationManageVo,
+        orderNum: Int,
+        workstationName: String
+    )
+
+    /**
+     * 根据区域id删除
+     */
+    fun deleteWorkstationByWorkstationId(workstationId: Long)
+
+    /**
+     * 更新区域排序
+     */
+    fun updateWorkstationOrderNumById(workstationId: Long, orderNum: Int?)
 }

+ 59 - 0
data/src/main/java/com/grkj/data/repository/impl/IsolationPointRepository.kt

@@ -0,0 +1,59 @@
+package com.grkj.data.repository.impl
+
+import com.grkj.data.dao.IsolationPointDao
+import com.grkj.data.database.ISCSDatabase
+import com.grkj.data.model.dos.IsIsolationPoint
+import com.grkj.data.model.vo.AddPointManageVo
+import com.grkj.data.model.vo.PointManageFilterVo
+import com.grkj.data.model.vo.PointManageVo
+import com.grkj.data.repository.IIsolationPointRepository
+
+/**
+ * 隔离点仓储实现
+ */
+class IsolationPointRepository : IIsolationPointRepository {
+    private val isolationPointDao: IsolationPointDao by lazy { ISCSDatabase.instance.isolationPointDao() }
+
+    override fun deletePointByPointIds(pointIds: List<Long>) {
+        isolationPointDao.deletePointByPointIds(pointIds)
+    }
+
+    override fun getPointManagerData(
+        filterData: PointManageFilterVo?,
+        current: Int,
+        size: Int
+    ): List<PointManageVo> {
+        return isolationPointDao.getPointManageData(
+            filterData?.pointName,
+            filterData?.pointFunction,
+            filterData?.powerType,
+            filterData?.workstation,
+            filterData?.RFIDTag,
+            size,
+            current * size
+        )
+    }
+
+    override fun addIsolationPoint(
+        addPointManageVo: AddPointManageVo,
+        rfidId: Long
+    ) {
+        val isIsolationPoint = IsIsolationPoint()
+        isIsolationPoint.pointName = addPointManageVo.pointName.toString()
+        isIsolationPoint.powerType = addPointManageVo.powerType
+        isIsolationPoint.workstationId = addPointManageVo.workstationId
+        isIsolationPoint.rfidId = rfidId
+        isIsolationPoint.remark = addPointManageVo.pointFunction
+        isolationPointDao.addIsolationPoint(isIsolationPoint)
+    }
+
+    companion object {
+        /**
+         * 单例
+         */
+        @JvmStatic
+        val instance: IsolationPointRepository by lazy {
+            IsolationPointRepository()
+        }
+    }
+}

+ 29 - 0
data/src/main/java/com/grkj/data/repository/impl/RfidTokenRepository.kt

@@ -0,0 +1,29 @@
+package com.grkj.data.repository.impl
+
+import com.grkj.data.dao.RfidTokenDao
+import com.grkj.data.database.ISCSDatabase
+import com.grkj.data.model.dos.IsRfidToken
+import com.grkj.data.repository.IIsolationPointRepository
+import com.grkj.data.repository.IRfidTokenRepository
+
+/**
+ * RFID标签仓储实现
+ */
+class RfidTokenRepository : IRfidTokenRepository {
+    private val rfidTokenDao: RfidTokenDao by lazy { ISCSDatabase.instance.rfidTokenDao() }
+    override fun addRfidToken(rfidToken: String?): Long {
+        val isRfidToken = IsRfidToken()
+        isRfidToken.rfid = rfidToken ?: ""
+        return rfidTokenDao.insertRfidToken(isRfidToken)
+    }
+
+    companion object {
+        /**
+         * 单例
+         */
+        @JvmStatic
+        val instance: RfidTokenRepository by lazy {
+            RfidTokenRepository()
+        }
+    }
+}

+ 60 - 0
data/src/main/java/com/grkj/data/repository/impl/WorkstationRepository.kt

@@ -4,6 +4,7 @@ import com.grkj.data.dao.WorkstationDao
 import com.grkj.data.database.ISCSDatabase
 import com.grkj.data.model.dos.IsUserWorkstation
 import com.grkj.data.model.dos.IsWorkstation
+import com.grkj.data.model.vo.WorkstationManageVo
 import com.grkj.data.repository.IWorkstationRepository
 
 /**
@@ -26,6 +27,65 @@ class WorkstationRepository : IWorkstationRepository {
     override fun deleteUserWorkstationByUserIds(userIds: List<Long>) {
         workstationDao.deleteUserWorkstationByUserIds(userIds)
     }
+
+    override fun getWorkstationManageData(): List<WorkstationManageVo> {
+        return buildTree(workstationDao.getWorkstationData())
+    }
+
+    override fun insertWorkstation(
+        workstationManageVo: WorkstationManageVo,
+        orderNum: Int,
+        workstationName: String
+    ) {
+        val isWorkstation = IsWorkstation()
+        isWorkstation.workstationName = workstationName
+        isWorkstation.parentId = workstationManageVo.workstationId
+        isWorkstation.ancestors =
+            workstationManageVo.ancestors + ",${workstationManageVo.workstationId}"
+        isWorkstation.orderNum = orderNum
+        workstationDao.insertWorkstation(isWorkstation)
+    }
+
+    override fun deleteWorkstationByWorkstationId(workstationId: Long) {
+        workstationDao.deleteWorkstationByWorkstationId(workstationId)
+    }
+
+    override fun updateWorkstationOrderNumById(workstationId: Long, orderNum: Int?) {
+        workstationDao.updateWorkstationOrderNumById(workstationId,orderNum)
+    }
+
+    private fun buildTree(all: List<IsWorkstation>): List<WorkstationManageVo> {
+        // 1) 映射到 VO 并按 id 建立索引
+        val map = all.map { db ->
+            WorkstationManageVo().apply {
+                workstationId = db.workstationId
+                workstationName = db.workstationName
+                parentId = db.parentId
+                ancestors = db.ancestors
+                orderNum = db.orderNum
+            }
+        }.associateBy { it.workstationId }
+            .toMutableMap()
+
+        // 2) 把每个节点挂到它的 parent.children
+        val roots = mutableListOf<WorkstationManageVo>()
+        map.values.forEach { node ->
+            if (node.parentId == null || node.parentId == 0L) {
+                roots += node
+            } else {
+                map[node.parentId]?.children?.add(node)
+            }
+        }
+
+        // 3) (可选)给每个同级按照 orderNum 排个序
+        fun sortRec(nodes: MutableList<WorkstationManageVo>) {
+            nodes.sortBy { it.orderNum ?: 0 }
+            nodes.forEach { sortRec(it.children) }
+        }
+        sortRec(roots)
+        return roots
+    }
+
     companion object {
         /**
          * 单例

+ 17 - 2
ui-base/src/main/java/com/grkj/ui_base/base/BaseActivity.kt

@@ -13,6 +13,7 @@ import com.google.android.material.bottomnavigation.BottomNavigationView
 import com.grkj.shared.model.EventBean
 import com.grkj.ui_base.data.EventConstants
 import com.grkj.ui_base.dialog.LoadingDialog
+import com.grkj.ui_base.utils.event.JumpViewEvent
 import com.grkj.ui_base.utils.event.LoadingEvent
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikandroid.permission.PermissionUtils
@@ -27,7 +28,8 @@ import org.slf4j.LoggerFactory
  */
 abstract class BaseActivity<V : ViewDataBinding> : AppCompatActivity() {
     protected val logger: Logger = LoggerFactory.getLogger(this::class.java)
-
+    private var bottomNav: BottomNavigationView? = null
+    private var graphMap: Map<Int, Int>? = null
     protected lateinit var binding: V
 
     /** 是否启用 Navigation 多 Graph 与 BottomNav */
@@ -53,7 +55,7 @@ abstract class BaseActivity<V : ViewDataBinding> : AppCompatActivity() {
             EventBus.getDefault().register(this)
         }
         initView()
-        if (enableNavigation()){
+        if (enableNavigation()) {
 
         }
         initData()
@@ -82,6 +84,8 @@ abstract class BaseActivity<V : ViewDataBinding> : AppCompatActivity() {
         bottomNav: BottomNavigationView,
         graphMap: Map<Int, Int>
     ) {
+        this.bottomNav = bottomNav
+        this.graphMap = graphMap
         bottomNav.setOnItemSelectedListener { item ->
             graphMap[item.itemId]?.let {
                 replaceNavGraph(it)
@@ -103,6 +107,17 @@ abstract class BaseActivity<V : ViewDataBinding> : AppCompatActivity() {
                     }
                 }
             }
+
+            EventConstants.EVENT_JUMP_TO -> {
+                (event.data as JumpViewEvent).apply {
+                    graphMap?.filter { it.value == navGraphId }?.firstNotNullOf {
+                        bottomNav?.menu?.findItem(it.key)?.let {
+                            bottomNav?.selectedItemId = it.itemId
+                            navController.navigate(targetId)
+                        }
+                    }
+                }
+            }
         }
     }
 

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

@@ -15,6 +15,11 @@ object EventConstants {
      */
     const val EVENT_UPDATE_TICKET_PROGRESS: Int = 100_000_002
 
+    /**
+     * 跳转事件,设计导航切换
+     */
+    const val EVENT_JUMP_TO: Int = 100_000_003
+
     //---------------------------作业票------------------------
     const val EVENT_GET_TICKET_STATUS: Int = 100_001_001
 

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

@@ -0,0 +1,22 @@
+package com.grkj.ui_base.utils.event
+
+import com.grkj.shared.model.EventBean
+import com.grkj.ui_base.data.EventConstants
+import com.grkj.ui_base.utils.ble.BleBean
+
+class JumpViewEvent(val navGraphId: Int, val targetId: Int) {
+    companion object {
+        /**
+         * 发送当前模式通知
+         */
+        @JvmStatic
+        fun sendJumpViewEvent(
+            navGraphId: Int, targetId: Int
+        ) {
+            val jumpViewEventBean = EventBean<JumpViewEvent>(
+                EventConstants.EVENT_JUMP_TO, JumpViewEvent(navGraphId, targetId)
+            )
+            EventHelper.sendEvent(jumpViewEventBean)
+        }
+    }
+}