Prechádzať zdrojové kódy

feat(工作站)
- 新增工作站树形结构选择功能
- 工作站选择弹窗支持树形数据显示和选择

fix(人脸识别)
- 修复人脸识别成功后弹窗未关闭的问题
- 优化人脸识别逻辑,仅校验当前用户的人脸信息

refactor(作业执行)
- 优化作业步骤确认逻辑
- 调整步骤确认时的人脸识别调用方式

refactor(用户)
- 调整人脸识别验证逻辑,提高准确性

style(下拉框)
- 调整下拉框选项的箭头图标和间距

周文健 3 mesiacov pred
rodič
commit
235d19070b
30 zmenil súbory, kde vykonal 297 pridanie a 113 odobranie
  1. 4 0
      app/src/main/java/com/grkj/iscs/features/main/dialog/CheckFaceDialog.kt
  2. 26 6
      app/src/main/java/com/grkj/iscs/features/main/dialog/TextDropDownDialog.kt
  3. 4 4
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddPointDialog.kt
  4. 1 1
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddUserDialog.kt
  5. 1 1
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/FilterPointDialog.kt
  6. 1 1
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdatePointDialog.kt
  7. 2 2
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateUserDialog.kt
  8. 42 3
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/PointMangeFragment.kt
  9. 28 2
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/UserManageFragment.kt
  10. 16 2
      app/src/main/java/com/grkj/iscs/features/main/fragment/home/HomeFragment.kt
  11. 15 2
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateJobFragment.kt
  12. 17 3
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopFragment.kt
  13. 14 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopJobFragment.kt
  14. 17 3
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditJobFragment.kt
  15. 14 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopFragment.kt
  16. 16 2
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopJobFragment.kt
  17. 19 29
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt
  18. 3 3
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/PointManageViewModel.kt
  19. 3 2
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/UserManageViewModel.kt
  20. 3 2
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/home/HomeViewModel.kt
  21. 1 1
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobExecuteViewModel.kt
  22. 4 4
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobViewModel.kt
  23. 4 3
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopJobViewModel.kt
  24. 3 3
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopViewModel.kt
  25. 5 4
      app/src/main/res/layout/item_home_text_drop_down.xml
  26. 24 4
      data/src/main/java/com/grkj/data/model/vo/WorkstationManageVo.kt
  27. 0 4
      data/src/main/java/com/grkj/data/repository/IWorkstationRepository.kt
  28. 0 3
      data/src/main/java/com/grkj/data/repository/impl/network/NetworkWorkstationRepository.kt
  29. 6 12
      data/src/main/java/com/grkj/data/repository/impl/standard/UserRepository.kt
  30. 4 5
      data/src/main/java/com/grkj/data/repository/impl/standard/WorkstationRepository.kt

+ 4 - 0
app/src/main/java/com/grkj/iscs/features/main/dialog/CheckFaceDialog.kt

@@ -32,6 +32,7 @@ class CheckFaceDialog(
 ) : OnBindView<CustomDialog>(R.layout.dialog_check_face) {
     private var mLoginType = 0 // 0:人脸 1:指纹 2:工卡 3:账号
     private var inFaceChecking: Boolean = false
+    private var dialog: CustomDialog?=null
     private val mPairList = mutableListOf(
         Pair(
             SIKCore.getApplication().getString(com.grkj.ui_base.R.string.please_scan_face),
@@ -49,6 +50,7 @@ class CheckFaceDialog(
 
     override fun onBind(customDialog: CustomDialog, contentView: View) {
         mBinding = DialogCheckFaceBinding.bind(contentView)
+        dialog = customDialog
         customDialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
         customDialog.setDialogLifecycleCallback(object : DialogLifecycleCallback<CustomDialog>() {
             override fun onDismiss(dialog: CustomDialog?) {
@@ -108,6 +110,7 @@ class CheckFaceDialog(
                             ImageConvertUtils.bitmapToBase64(bitmap).toString()
                         ).observe(lifecycleOwner) {
                             if (it == LoginResultEnum.FINGERPRINTER_VERIFY_SUCCESS) {
+                                customDialog.dismiss()
                                 callBack?.invoke(it)
                             } else {
                                 PopTip.tip(R.string.verify_failed)
@@ -171,6 +174,7 @@ class CheckFaceDialog(
                             PopTip.tip(R.string.face_login_failed)
                         } else {
                             ArcSoftUtil.stop()
+                            dialog?.dismiss()
                             callBack?.invoke(it)
                         }
                     }

+ 26 - 6
app/src/main/java/com/grkj/iscs/features/main/dialog/TextDropDownDialog.kt

@@ -29,6 +29,7 @@ class TextDropDownDialog(
     private val multiSelect: Boolean,
     private val treeSelect: Boolean,
     private val showSearchView: Boolean = false,
+    private val canSelectedParent: Boolean = false,
     private val onSelect: (TextDropDownEntity) -> Unit,
     private val onMultiSelect: (List<TextDropDownEntity>?) -> Unit
 ) : OnBindView<CustomDialog>(R.layout.dialog_drop_down_list) {
@@ -49,15 +50,19 @@ class TextDropDownDialog(
                 onBind {
                     val item = getModel<TextDropDownEntity>()
                     val itemBinding = getBinding<ItemHomeTextDropDownBinding>()
-                    itemBinding.arrowIv.isVisible = item.getChildren().isNotEmpty()
+                    itemBinding.arrowIv.isVisible = true
                     // 缩进
                     itemBinding.rootLayout.setPadding(indentPx * item.getLevel(), 0, 0, 0)
                     itemBinding.arrowIv.rotation = if (item.itemExpand) 90f else 0f
                     // 文本和选中
                     itemBinding.dropDownText.text = item.getShowText()
+                    itemBinding.arrowIv.setDebouncedClickListener {
+                        if (item.itemExpand) collapse() else expand()
+                        itemBinding.arrowIv.rotation = if (item.itemExpand) 90f else 0f
+                    }
                     itemBinding.rootLayout.setDebouncedClickListener {
                         if (multiSelect) {
-                            if (item.getChildren().isEmpty()) {
+                            if (item.getChildren().isEmpty() || canSelectedParent) {
                                 item.setSelected(!item.isSelected())
                                 itemBinding.checkIv.isVisible = item.isSelected()
                                 val selected = binding.dropDownRv.models
@@ -115,7 +120,7 @@ class TextDropDownDialog(
             onSelect: (TextDropDownEntity) -> Unit
         ) {
             CustomDialog.show(
-                TextDropDownDialog(data, false, false, showSearchView, onSelect) { }
+                TextDropDownDialog(data, false, false, showSearchView, false, onSelect) { }
             ).setAlignBaseViewGravity(view, Gravity.BOTTOM or Gravity.CENTER).setWidth(view.width)
         }
 
@@ -130,7 +135,7 @@ class TextDropDownDialog(
             onMultiSelect: (List<TextDropDownEntity>?) -> Unit
         ) {
             CustomDialog.show(
-                TextDropDownDialog(data, true, false, showSearchView, {}) { selected ->
+                TextDropDownDialog(data, true, false, showSearchView, false, {}) { selected ->
                     onMultiSelect(
                         selected
                     )
@@ -146,10 +151,18 @@ class TextDropDownDialog(
             data: List<TextDropDownEntity>,
             view: View,
             showSearchView: Boolean = false,
+            canSelectedParent: Boolean = true,
             onSelect: (TextDropDownEntity) -> Unit
         ) {
             CustomDialog.show(
-                TextDropDownDialog(data, false, true, showSearchView, onSelect) { }
+                TextDropDownDialog(
+                    data,
+                    false,
+                    true,
+                    showSearchView,
+                    canSelectedParent,
+                    onSelect
+                ) { }
             ).setAlignBaseViewGravity(view, Gravity.BOTTOM or Gravity.CENTER).setWidth(view.width)
         }
 
@@ -161,10 +174,17 @@ class TextDropDownDialog(
             data: List<TextDropDownEntity>,
             view: View,
             showSearchView: Boolean = false,
+            canSelectedParent: Boolean = false,
             onMultiSelect: (List<TextDropDownEntity>?) -> Unit
         ) {
             CustomDialog.show(
-                TextDropDownDialog(data, true, true, showSearchView, {}) { selected ->
+                TextDropDownDialog(
+                    data,
+                    true,
+                    true,
+                    showSearchView,
+                    canSelectedParent,
+                    {}) { selected ->
                     onMultiSelect(
                         selected
                     )

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

@@ -42,21 +42,21 @@ class AddPointDialog(
                     dataText = it.description
                 )
             }
-            TextDropDownDialog.showSingle(list,binding.powerTypeTv) { item ->
+            TextDropDownDialog.showSingle(list, binding.powerTypeTv) { item ->
                 binding.powerTypeTv.text = item.getShowText()
                 binding.powerTypeTv.tag = item.getTag()
             }
         }
 
         binding.workstationTv.setDebouncedClickListener {
-            TextDropDownDialog.showSingle(workstationData,binding.workstationTv) { item ->
+            TextDropDownDialog.showSingleTree(workstationData, binding.workstationTv) { item ->
                 binding.workstationTv.text = item.getShowText()
                 binding.workstationTv.tag = item.getId()
             }
         }
 
         binding.rfidTagTv.setDebouncedClickListener {
-            TextDropDownDialog.showSingle(rfidTokenData,binding.rfidTagTv) { item ->
+            TextDropDownDialog.showSingle(rfidTokenData, binding.rfidTagTv) { item ->
                 binding.rfidTagTv.text = item.getShowText()
                 binding.rfidTagTv.tag = item.getId()
             }
@@ -76,7 +76,7 @@ class AddPointDialog(
                     binding.workstationTv.tag as Long,
                     binding.rfidTagTv.tag as Long
                 )
-                onConfirm(vo,dialog)
+                onConfirm(vo, dialog)
             }
         }
     }

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddUserDialog.kt

@@ -51,7 +51,7 @@ class AddUserDialog(
         }
         // 岗位多选
         binding.workstationNameTv.setDebouncedClickListener {
-            TextDropDownDialog.showMulti(workstationData, binding.workstationNameTv) { list ->
+            TextDropDownDialog.showMultiTree(workstationData, binding.workstationNameTv, canSelectedParent = true) { list ->
                 selectedWorkstations = list.orEmpty()
                 binding.workstationNameTv.text =
                     selectedWorkstations.joinToString(",") { it.getShowText() }

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

@@ -50,7 +50,7 @@ class FilterPointDialog(
 
         // 工作站单选
         binding.workstationTv.setDebouncedClickListener {
-            TextDropDownDialog.showSingle(workstationData,binding.workstationTv) { item ->
+            TextDropDownDialog.showSingleTree(workstationData,binding.workstationTv) { item ->
                 binding.workstationTv.text = item.getShowText()
                 binding.workstationTv.tag = item.getId()
             }

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdatePointDialog.kt

@@ -70,7 +70,7 @@ class UpdatePointDialog(
         }
         // 工作站
         binding.workstationTv.setDebouncedClickListener {
-            TextDropDownDialog.showSingle(workstationData,binding.workstationTv) { item ->
+            TextDropDownDialog.showSingleTree(workstationData,binding.workstationTv) { item ->
                 binding.workstationTv.text = item.getShowText()
                 binding.workstationTv.tag = item.getId()
             }

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateUserDialog.kt

@@ -75,12 +75,12 @@ class UpdateUserDialog(
 
         // 工作站多选
         binding.workstationNameTv.setDebouncedClickListener {
-            TextDropDownDialog.showMulti(workstationData.apply {
+            TextDropDownDialog.showMultiTree(workstationData.apply {
                 forEach {
                     it.setSelected(selectedWorkstations.map { it.getShowText() }
                         .contains(it.getShowText()))
                 }
-            }, binding.workstationNameTv) { list ->
+            }, binding.workstationNameTv, canSelectedParent = true) { list ->
                 selectedWorkstations = list.orEmpty().toMutableList()
                 binding.workstationNameTv.text =
                     selectedWorkstations.joinToString(",") { it.getShowText() }

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

@@ -51,8 +51,21 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
             AddPointDialog.show(viewModel.workstationData.map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataId = it.workstationId,
-                    dataText = it.workstationName
+                    dataText = it.workstationName,
                 )
+                    .apply {
+                        setChildren(it.children.map {
+                            TextDropDownDialog.SimpleTextDropDownEntity(
+                                dataId = it.workstationId,
+                                dataText = it.workstationName,
+                                dataObject = it,
+                                dataLevel = 1
+                            ).apply {
+                                setSelected(viewModel.workstationData.map { it.workstationName }
+                                    .contains(getShowText()))
+                            }
+                        })
+                    }
             }, viewModel.rfidTokenData.map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataId = it.rfidId,
@@ -95,8 +108,21 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
             FilterPointDialog.show(viewModel.workstationData.map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataId = it.workstationId,
-                    dataText = it.workstationName
+                    dataText = it.workstationName,
                 )
+                    .apply {
+                        setChildren(it.children.map {
+                            TextDropDownDialog.SimpleTextDropDownEntity(
+                                dataId = it.workstationId,
+                                dataText = it.workstationName,
+                                dataObject = it,
+                                dataLevel = 1
+                            ).apply {
+                                setSelected(viewModel.workstationData.map { it.workstationName }
+                                    .contains(getShowText()))
+                            }
+                        })
+                    }
             }) {
                 viewModel.pointFilterData = it
                 getPointData(nextPage = false)
@@ -153,8 +179,21 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
             UpdatePointDialog.show(item, viewModel.workstationData.map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataId = it.workstationId,
-                    dataText = it.workstationName
+                    dataText = it.workstationName,
                 )
+                    .apply {
+                        setChildren(it.children.map {
+                            TextDropDownDialog.SimpleTextDropDownEntity(
+                                dataId = it.workstationId,
+                                dataText = it.workstationName,
+                                dataObject = it,
+                                dataLevel = 1
+                            ).apply {
+                                setSelected(viewModel.workstationData.map { it.workstationName }
+                                    .contains(getShowText()))
+                            }
+                        })
+                    }
             }, viewModel.rfidTokenData.map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataId = it.rfidId,

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

@@ -56,8 +56,21 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
                 }, viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.workstationId,
-                        dataText = it.workstationName
+                        dataText = it.workstationName,
                     )
+                        .apply {
+                            setChildren(it.children.map {
+                                TextDropDownDialog.SimpleTextDropDownEntity(
+                                    dataId = it.workstationId,
+                                    dataText = it.workstationName,
+                                    dataObject = it,
+                                    dataLevel = 1
+                                ).apply {
+                                    setSelected(viewModel.workstationData.map { it.workstationName }
+                                        .contains(getShowText()))
+                                }
+                            })
+                        }
                 }) { data, dialog ->
                     viewModel.validateUserData(data.username).observe(this) {
                         viewModel.addUser(data).observe(this) {
@@ -138,8 +151,21 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
                 }, viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.workstationId,
-                        dataText = it.workstationName
+                        dataText = it.workstationName,
                     )
+                        .apply {
+                            setChildren(it.children.map {
+                                TextDropDownDialog.SimpleTextDropDownEntity(
+                                    dataId = it.workstationId,
+                                    dataText = it.workstationName,
+                                    dataObject = it,
+                                    dataLevel = 1
+                                ).apply {
+                                    setSelected(viewModel.workstationData.map { it.workstationName }
+                                        .contains(getShowText()))
+                                }
+                            })
+                        }
                 }) { data, dialog ->
                     viewModel.updateUser(data).observe(this@UserManageFragment) {
                         dialog.dismiss()

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

@@ -222,11 +222,25 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
         workstationTv: TextView, onSelected: (TextDropDownDialog.TextDropDownEntity) -> Unit
     ) {
         viewModel.getWorkstationData().observe(this) {
-            TextDropDownDialog.showSingle(
+            TextDropDownDialog.showSingleTree(
                 viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
-                        dataId = it.workstationId, dataText = it.workstationName
+                        dataId = it.workstationId,
+                        dataText = it.workstationName,
                     )
+                        .apply {
+                            setChildren(it.children.map {
+                                TextDropDownDialog.SimpleTextDropDownEntity(
+                                    dataId = it.workstationId,
+                                    dataText = it.workstationName,
+                                    dataObject = it,
+                                    dataLevel = 1
+                                ).apply {
+                                    setSelected(viewModel.workstationData.map { it.workstationName }
+                                        .contains(getShowText()))
+                                }
+                            })
+                        }
                 }.toMutableList().apply {
                     add(
                         0, TextDropDownDialog.SimpleTextDropDownEntity(

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

@@ -609,12 +609,25 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
 
     private fun setWorkstationData() {
         viewModel.getWorkstationData().observe(this) {
-            TextDropDownDialog.showSingle(
+            TextDropDownDialog.showSingleTree(
                 viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.workstationId,
-                        dataText = it.workstationName
+                        dataText = it.workstationName,
                     )
+                        .apply {
+                            setChildren(it.children.map {
+                                TextDropDownDialog.SimpleTextDropDownEntity(
+                                    dataId = it.workstationId,
+                                    dataText = it.workstationName,
+                                    dataObject = it,
+                                    dataLevel = 1
+                                ).apply {
+                                    setSelected(viewModel.workstationData.map { it.workstationName }
+                                        .contains(getShowText()))
+                                }
+                            })
+                        }
                 }, binding.workstationTv
             ) {
                 binding.workstationTv.text = it.getShowText()

+ 17 - 3
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopFragment.kt

@@ -488,11 +488,25 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
 
     private fun setWorkstationData() {
         viewModel.getWorkstationData().observe(this) {
-            TextDropDownDialog.showSingle(
+            TextDropDownDialog.showSingleTree(
                 viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
-                        dataId = it.workstationId, dataText = it.workstationName
-                    )
+                    dataId = it.workstationId,
+                    dataText = it.workstationName,
+                )
+                    .apply {
+                        setChildren(it.children.map {
+                            TextDropDownDialog.SimpleTextDropDownEntity(
+                                dataId = it.workstationId,
+                                dataText = it.workstationName,
+                                dataObject = it,
+                                dataLevel = 1
+                            ).apply {
+                                setSelected(viewModel.workstationData.map { it.workstationName }
+                                    .contains(getShowText()))
+                            }
+                        })
+                    }
                 }, binding.workstationTv
             ) {
                 binding.workstationTv.text = it.getShowText()

+ 14 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopJobFragment.kt

@@ -444,8 +444,21 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
                 viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.workstationId,
-                        dataText = it.workstationName
+                        dataText = it.workstationName,
                     )
+                        .apply {
+                            setChildren(it.children.map {
+                                TextDropDownDialog.SimpleTextDropDownEntity(
+                                    dataId = it.workstationId,
+                                    dataText = it.workstationName,
+                                    dataObject = it,
+                                    dataLevel = 1
+                                ).apply {
+                                    setSelected(viewModel.workstationData.map { it.workstationName }
+                                        .contains(getShowText()))
+                                }
+                            })
+                        }
                 }, binding.workstationTv
             ) {
                 binding.workstationTv.text = it.getShowText()

+ 17 - 3
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditJobFragment.kt

@@ -417,7 +417,7 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
         viewModel.getWorkflowModes().observe(this) {
             viewModel.getJobData(ticketId ?: 0).observe(this) {
                 binding.workstationTv.text =
-                    viewModel.workstationData.find { it.workstationId == viewModel.jobTicketData?.workstationId }?.workstationName
+                    viewModel.workstationData.firstNotNullOfOrNull { it.findWorkstation(viewModel.jobTicketData?.workstationId) }?.workstationName
                 selectedWorkstationId = viewModel.jobTicketData?.workstationId
                 selectedModeId = viewModel.jobTicketData?.modeId
                 viewModel.getWorkflowSteps(selectedModeId!!).observe(this) {
@@ -519,11 +519,25 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
 
     private fun setWorkstationData() {
         viewModel.getWorkstationData().observe(this) {
-            TextDropDownDialog.showSingle(
+            TextDropDownDialog.showSingleTree(
                 viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
-                        dataId = it.workstationId, dataText = it.workstationName
+                        dataId = it.workstationId,
+                        dataText = it.workstationName,
                     )
+                        .apply {
+                            setChildren(it.children.map {
+                                TextDropDownDialog.SimpleTextDropDownEntity(
+                                    dataId = it.workstationId,
+                                    dataText = it.workstationName,
+                                    dataObject = it,
+                                    dataLevel = 1
+                                ).apply {
+                                    setSelected(viewModel.workstationData.map { it.workstationName }
+                                        .contains(getShowText()))
+                                }
+                            })
+                        }
                 }, binding.workstationTv
             ) {
                 binding.workstationTv.text = it.getShowText()

+ 14 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopFragment.kt

@@ -490,8 +490,21 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
                 viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.workstationId,
-                        dataText = it.workstationName
+                        dataText = it.workstationName,
                     )
+                        .apply {
+                            setChildren(it.children.map {
+                                TextDropDownDialog.SimpleTextDropDownEntity(
+                                    dataId = it.workstationId,
+                                    dataText = it.workstationName,
+                                    dataObject = it,
+                                    dataLevel = 1
+                                ).apply {
+                                    setSelected(viewModel.workstationData.map { it.workstationName }
+                                        .contains(getShowText()))
+                                }
+                            })
+                        }
                 }, binding.workstationTv
             ) {
                 binding.workstationTv.text = it.getShowText()

+ 16 - 2
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopJobFragment.kt

@@ -405,7 +405,7 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
                 selectedSopId = viewModel.jobTicketData?.sopId
                 selectedSop = viewModel.sopData.find { it.sopId == viewModel.jobTicketData?.sopId }
                 binding.workstationTv.text =
-                    viewModel.workstationData.find { it.workstationId == viewModel.jobTicketData?.workstationId }?.workstationName
+                    viewModel.workstationData.firstNotNullOfOrNull { it.findWorkstation(viewModel.jobTicketData?.workstationId) }?.workstationName
                 binding.sopTv.text =
                     viewModel.sopData.find { it.sopId == viewModel.jobTicketData?.sopId }?.sopName
                 binding.jobNameEt.setText(viewModel.jobTicketData?.ticketName)
@@ -461,8 +461,22 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
             TextDropDownDialog.showSingle(
                 viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
-                        dataId = it.workstationId, dataText = it.workstationName
+                        dataId = it.workstationId,
+                        dataText = it.workstationName,
                     )
+                        .apply {
+                            setChildren(it.children.map {
+                                TextDropDownDialog.SimpleTextDropDownEntity(
+                                    dataId = it.workstationId,
+                                    dataText = it.workstationName,
+                                    dataObject = it,
+                                    dataLevel = 1
+                                ).apply {
+                                    setSelected(viewModel.workstationData.map { it.workstationName }
+                                        .contains(getShowText()))
+                                }
+                            })
+                        }
                 }, binding.workstationTv
             ) {
                 binding.workstationTv.text = it.getShowText()

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

@@ -18,6 +18,7 @@ import com.drake.brv.utils.setup
 import com.grkj.data.data.EventConstants
 import com.grkj.data.data.MainDomainData
 import com.grkj.data.data.Type
+import com.grkj.data.enums.LoginResultEnum
 import com.grkj.data.enums.RoleEnum
 import com.grkj.data.model.vo.IsJobTicketPointsDataVo
 import com.grkj.data.model.vo.IsJobTicketStepDataVo
@@ -275,7 +276,14 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                     } else if (workflowStep?.confirmType == 0 && (viewModel.ticketData?.createBy == MainDomainData.userInfo?.userName || workflowStep.currentUserCanConfirm())) {//手动确认 需要时创建者或者指定人员
                         if (workflowStep.currentUserCanConfirm()) {
                             CheckFaceDialog.show(viewLifecycleOwner, viewModel, 0) {
-                                stepClickConfirm(adapter, item, workflowStep)
+                                if (it in listOf(
+                                        LoginResultEnum.FINGERPRINTER_VERIFY_SUCCESS,
+                                        LoginResultEnum.FACE_VERIFY_SUCCESS,
+                                        LoginResultEnum.JOB_CARD_LOGIN_SUCCESS
+                                    )
+                                ) {
+                                    stepClickConfirm(adapter, item, workflowStep)
+                                }
                             }
                         } else {
                             stepClickConfirm(adapter, item, workflowStep)
@@ -708,35 +716,17 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                 if (workflowStep?.confirmType != 0 ||//自动确认
                     (viewModel.ticketData?.createBy == MainDomainData.userInfo?.userName || workflowStep.currentUserCanConfirm())
                 ) {
-                    if (workflowStep?.currentUserCanConfirm() == true) {
-                        CheckFaceDialog.show(viewLifecycleOwner, viewModel, 0) {
-                            viewModel.currentStepData?.stepStatus = "1"
-                            viewModel.currentStepData?.updateTime =
-                                TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
-                            viewModel.currentStepData?.let {
-                                viewModel.updateStepStatus(it).observe(this@JobExecuteFragment) {
-                                    if (it == false) {
-                                        PopTip.build().tip(R.string.step_confirm_failed)
-                                    } else {
-                                        checkCurrentStep()
-                                    }
-                                    binding.stepRv.adapter?.notifyDataSetChanged()
-                                }
-                            }
-                        }
-                    } else {
-                        viewModel.currentStepData?.stepStatus = "1"
-                        viewModel.currentStepData?.updateTime =
-                            TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
-                        viewModel.currentStepData?.let {
-                            viewModel.updateStepStatus(it).observe(this@JobExecuteFragment) {
-                                if (it == false) {
-                                    PopTip.build().tip(R.string.step_confirm_failed)
-                                } else {
-                                    checkCurrentStep()
-                                }
-                                binding.stepRv.adapter?.notifyDataSetChanged()
+                    viewModel.currentStepData?.stepStatus = "1"
+                    viewModel.currentStepData?.updateTime =
+                        TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
+                    viewModel.currentStepData?.let {
+                        viewModel.updateStepStatus(it).observe(this@JobExecuteFragment) {
+                            if (it == false) {
+                                PopTip.build().tip(R.string.step_confirm_failed)
+                            } else {
+                                checkCurrentStep()
                             }
+                            binding.stepRv.adapter?.notifyDataSetChanged()
                         }
                     }
                 }

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

@@ -5,10 +5,10 @@ import androidx.lifecycle.liveData
 import com.grkj.data.model.dos.IsRfidToken
 import com.grkj.data.model.dos.IsWorkstation
 import com.grkj.data.model.vo.AddPointManageVo
-import com.grkj.data.model.vo.LockedPointVo
 import com.grkj.data.model.vo.PointManageFilterVo
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UpdatePointManageVo
+import com.grkj.data.model.vo.WorkstationManageVo
 import com.grkj.data.repository.IIsolationPointRepository
 import com.grkj.data.repository.IJobTicketRepository
 import com.grkj.data.repository.IRfidTokenRepository
@@ -32,7 +32,7 @@ class PointManageViewModel @Inject constructor(
 ) : BaseViewModel() {
     private var current: Int = 0
     private var size: Int = 50
-    var workstationData: List<IsWorkstation> = mutableListOf()
+    var workstationData: List<WorkstationManageVo> = mutableListOf()
     var rfidTokenData: List<IsRfidToken> = mutableListOf()
     var pointManageDataList: MutableList<PointManageVo> = mutableListOf()
     var pointFilterData: PointManageFilterVo? = null
@@ -95,7 +95,7 @@ class PointManageViewModel @Inject constructor(
      */
     fun initDialogData(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
-            workstationData = workstationRepository.getWorkStationData()
+            workstationData = workstationRepository.getWorkstationManageData()
             rfidTokenData = rfidTokenRepository.getRfidData()
             emit(true)
         }

+ 3 - 2
app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/UserManageViewModel.kt

@@ -8,6 +8,7 @@ import com.grkj.data.model.vo.AddUserDataVo
 import com.grkj.data.model.vo.UpdateUserDataVo
 import com.grkj.data.model.vo.UserManageFilterVo
 import com.grkj.data.model.vo.UserManageVo
+import com.grkj.data.model.vo.WorkstationManageVo
 import com.grkj.data.repository.IHardwareRepository
 import com.grkj.data.repository.IRoleRepository
 import com.grkj.data.repository.IUserRepository
@@ -34,7 +35,7 @@ class UserManageViewModel @Inject constructor(
     var userManageDataList: MutableList<UserManageVo> = mutableListOf()
     var userFilterData: UserManageFilterVo? = null
     var roleData: List<SysRole> = listOf()
-    var workstationData: List<IsWorkstation> = listOf()
+    var workstationData: List<WorkstationManageVo> = listOf()
 
     /**
      * 删除选中用户
@@ -88,7 +89,7 @@ class UserManageViewModel @Inject constructor(
     fun getRoleAndWorkStationData(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
             roleData = roleRepository.getRoleData()
-            workstationData = workstationRepository.getWorkStationData()
+            workstationData = workstationRepository.getWorkstationManageData()
             emit(true)
         }
     }

+ 3 - 2
app/src/main/java/com/grkj/iscs/features/main/viewmodel/home/HomeViewModel.kt

@@ -5,6 +5,7 @@ import androidx.lifecycle.liveData
 import com.grkj.data.data.MainDomainData
 import com.grkj.data.model.dos.IsWorkstation
 import com.grkj.data.model.dos.WorkflowMode
+import com.grkj.data.model.vo.WorkstationManageVo
 import com.grkj.data.repository.IHardwareRepository
 import com.grkj.data.repository.IJobTicketRepository
 import com.grkj.data.repository.IUserRepository
@@ -27,7 +28,7 @@ class HomeViewModel @Inject constructor(
     override val userRepository: IUserRepository
 ) :
     BaseViewModel(userRepository) {
-    var workstationData: List<IsWorkstation> = listOf()
+    var workstationData: List<WorkstationManageVo> = listOf()
     var inProgressJobNum = 0
     var lockedPointNum = 0
     var usedHardwareNum = 0
@@ -61,7 +62,7 @@ class HomeViewModel @Inject constructor(
      */
     fun getWorkstationData(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
-            workstationData = workstationRepository.getWorkStationData()
+            workstationData = workstationRepository.getWorkstationManageData()
             emit(true)
         }
     }

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobExecuteViewModel.kt

@@ -785,7 +785,7 @@ class JobExecuteViewModel @Inject constructor(
         return liveData(Dispatchers.IO) {
             val workflowStep = currentStepData
             logger.info("检查是否可以确认步骤:${ticketData?.createBy != MainDomainData.userInfo?.userName},${workflowStep?.currentUserCanConfirm() == false}")
-            if (ticketData?.createBy != MainDomainData.userInfo?.userName || workflowStep?.currentUserCanConfirm() == false) {
+            if (ticketData?.createBy != MainDomainData.userInfo?.userName && workflowStep?.currentUserCanConfirm() == false) {
                 ThreadUtils.runOnMain {
                     PopTip.build()
                         .tip(CommonUtils.getStr(com.grkj.ui_base.R.string.no_permission_to_handle))

+ 4 - 4
app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobViewModel.kt

@@ -9,10 +9,10 @@ import com.grkj.data.model.dos.WorkflowMode
 import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.JobPointVo
 import com.grkj.data.model.vo.JobTicketGroupDataVo
-import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.data.model.vo.JobTicketManageVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.model.vo.SysBiometricDataVo
+import com.grkj.data.model.vo.WorkstationManageVo
 import com.grkj.data.repository.IJobTicketRepository
 import com.grkj.data.repository.ISopRepository
 import com.grkj.data.repository.IWorkflowRepository
@@ -34,7 +34,7 @@ class JobViewModel @Inject constructor(
     val workflowRepository: IWorkflowRepository,
     override val userRepository: UserRepository
 ) : BaseViewModel(userRepository) {
-    var workstationData: List<IsWorkstation> = listOf()
+    var workstationData: List<WorkstationManageVo> = listOf()
     var jobTicketData: JobTicketManageVo? = null
     var jobPointsData: List<JobPointVo> = mutableListOf()
     var jobLockerData: List<JobUserVo> = mutableListOf()
@@ -49,7 +49,7 @@ class JobViewModel @Inject constructor(
      */
     fun getWorkstationData(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
-            workstationData = workstationRepository.getWorkStationData()
+            workstationData = workstationRepository.getWorkstationManageData()
             emit(true)
         }
     }
@@ -160,7 +160,7 @@ class JobViewModel @Inject constructor(
     fun getJobData(ticketId: Long): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
             jobTicketData = jobTicketRepository.getTicketDataByTicketId(ticketId)
-            workstationData = workstationRepository.getWorkStationData()
+            workstationData = workstationRepository.getWorkstationManageData()
             jobPointsData =
                 jobTicketRepository.getTicketPointsByTicketId(ticketId)
             val tempJobTicketUserId = jobTicketRepository.getTicketUsersByTicketId(ticketId)

+ 4 - 3
app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopJobViewModel.kt

@@ -13,6 +13,7 @@ import com.grkj.data.model.vo.JobTicketManageVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.model.vo.SopManageVo
 import com.grkj.data.model.vo.SysBiometricDataVo
+import com.grkj.data.model.vo.WorkstationManageVo
 import com.grkj.data.repository.IJobTicketRepository
 import com.grkj.data.repository.ISopRepository
 import com.grkj.data.repository.IUserRepository
@@ -35,7 +36,7 @@ class SopJobViewModel @Inject constructor(
     val workflowRepository: IWorkflowRepository,
     override val userRepository: IUserRepository
 ) : BaseViewModel(userRepository) {
-    var workstationData: List<IsWorkstation> = listOf()
+    var workstationData: List<WorkstationManageVo> = listOf()
     var sopData: List<SopManageVo> = listOf()
     var sopPoints: List<JobTicketGroupDataVo<JobPointVo>> = listOf()
     var sopLockerData: List<JobTicketGroupDataVo<JobUserVo>> = listOf()
@@ -51,7 +52,7 @@ class SopJobViewModel @Inject constructor(
      */
     fun getWorkstationData(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
-            workstationData = workstationRepository.getWorkStationData()
+            workstationData = workstationRepository.getWorkstationManageData()
             emit(true)
         }
     }
@@ -167,7 +168,7 @@ class SopJobViewModel @Inject constructor(
     fun getSopJobData(ticketId: Long): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
             jobTicketData = jobTicketRepository.getTicketDataByTicketId(ticketId)
-            workstationData = workstationRepository.getWorkStationData()
+            workstationData = workstationRepository.getWorkstationManageData()
             sopData = sopRepository.getSopDataByWorkstationId(jobTicketData?.workstationId ?: 0)
             val sopJobUsers = jobTicketRepository.getTicketUsersByTicketId(ticketId)
             userBiometricDataVo =

+ 3 - 3
app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopViewModel.kt

@@ -8,10 +8,10 @@ import com.grkj.data.model.dos.WorkflowMode
 import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.JobPointVo
 import com.grkj.data.model.vo.JobTicketGroupDataVo
-import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.model.vo.SopManageVo
 import com.grkj.data.model.vo.SysBiometricDataVo
+import com.grkj.data.model.vo.WorkstationManageVo
 import com.grkj.data.repository.ISopRepository
 import com.grkj.data.repository.IWorkflowRepository
 import com.grkj.data.repository.IWorkstationRepository
@@ -31,7 +31,7 @@ class SopViewModel @Inject constructor(
     val workflowRepository: IWorkflowRepository,
     override val userRepository: UserRepository
 ) : BaseViewModel(userRepository) {
-    var workstationData: List<IsWorkstation> = listOf()
+    var workstationData: List<WorkstationManageVo> = listOf()
     var selectedSopData: SopManageVo? = null
     var selectedSopPointData: List<JobPointVo> = mutableListOf()
     var selectedSopUserData: List<JobUserVo> = mutableListOf()
@@ -45,7 +45,7 @@ class SopViewModel @Inject constructor(
      */
     fun getWorkstationData(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
-            workstationData = workstationRepository.getWorkStationData()
+            workstationData = workstationRepository.getWorkstationManageData()
             emit(true)
         }
     }

+ 5 - 4
app/src/main/res/layout/item_home_text_drop_down.xml

@@ -12,23 +12,24 @@
             android:id="@+id/arrow_iv"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:padding="@dimen/common_spacing_2x"
             android:src="@drawable/icon_arrow_right"
             android:visibility="gone" />
 
         <TextView
             android:id="@+id/drop_down_text"
             android:layout_width="0dp"
-            android:layout_height="wrap_content"
+            android:layout_height="match_parent"
             android:layout_weight="1"
-            android:paddingHorizontal="8dp"
-            android:paddingVertical="4dp"
+            android:gravity="center_vertical"
+            android:padding="@dimen/common_spacing"
             android:textColor="@color/black"
             android:textSize="@dimen/normal_text_size_18" />
 
         <ImageView
             android:id="@+id/check_iv"
             android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
+            android:layout_height="match_parent"
             android:layout_marginRight="@dimen/common_spacing"
             android:src="@drawable/icon_check"
             android:visibility="gone" />

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

@@ -12,13 +12,33 @@ class WorkstationManageVo {
     var ancestors: String? = null
     var orderNum: Int? = null
 
-    @Ignore var isSelected: Boolean = false
+    @Ignore
+    var isSelected: Boolean = false
 
     // 新增:树结构 & 层级 & 展开状态,用 @Ignore 标记 Room 不映射
-    @Ignore var children: MutableList<WorkstationManageVo> = mutableListOf()
-    @Ignore var level: Int = 0
-    @Ignore var isExpanded: Boolean = false
+    @Ignore
+    var children: MutableList<WorkstationManageVo> = mutableListOf()
+    @Ignore
+    var level: Int = 0
+    @Ignore
+    var isExpanded: Boolean = false
 
     /** 判断自己有没有子节点 */
     fun hasChildren() = children.isNotEmpty()
+
+    /**
+     * 查找
+     */
+    fun findWorkstation(workstationId: Long?): WorkstationManageVo? {
+        if (this.workstationId == workstationId) {
+            return this
+        }
+        for (child in children) {
+            val found = child.findWorkstation(workstationId)
+            if (found != null) {
+                return found
+            }
+        }
+        return null
+    }
 }

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

@@ -7,10 +7,6 @@ import com.grkj.data.model.vo.WorkstationManageVo
  * 岗位仓储
  */
 interface IWorkstationRepository {
-    /**
-     * 获取岗位数据
-     */
-    fun getWorkStationData(): List<IsWorkstation>
 
     /**
      * 添加角色岗位关联

+ 0 - 3
data/src/main/java/com/grkj/data/repository/impl/network/NetworkWorkstationRepository.kt

@@ -12,9 +12,6 @@ import javax.inject.Singleton
  */
 @Singleton
 class NetworkWorkstationRepository @Inject constructor()  : BaseRepository(), IWorkstationRepository{
-    override fun getWorkStationData(): List<IsWorkstation> {
-        TODO("Not yet implemented")
-    }
 
     override fun addUserWorkstationData(
         userId: Long,

+ 6 - 12
data/src/main/java/com/grkj/data/repository/impl/standard/UserRepository.kt

@@ -239,28 +239,22 @@ class UserRepository @Inject constructor(
     }
 
     override fun checkFace(face: String): LoginResultEnum {
-        val faceDataList = userDao.getFaceData()
+        val userId = MainDomainData.userInfo?.userId
+        if (userId == null) {
+            return LoginResultEnum.FACE_VERIFY_FAILED
+        }
+        val faceDataList = userDao.getFaceDataByUserId(userId)
         if (faceDataList.isEmpty()) {
             return LoginResultEnum.FACE_VERIFY_FAILED
         }
-        var userId: String? = null
         for (faceData in faceDataList) {
             if (faceData.content.isNotEmpty()) {
                 val fileData = faceData.content.file().readText()
                 if (BiometricVerifier.verifyFaceArcSoft(face, fileData)) {
-                    userId = faceData.userId.toString()
-                    break
+                    return LoginResultEnum.FACE_VERIFY_SUCCESS
                 }
             }
         }
-        if (userId != null) {
-            val sysUserDo = userDao.getUserInfoByUserId(userId)
-            if (sysUserDo != null) {
-                return LoginResultEnum.FACE_VERIFY_SUCCESS
-            } else {
-                return LoginResultEnum.FACE_VERIFY_FAILED
-            }
-        }
         return LoginResultEnum.FACE_VERIFY_FAILED
     }
 

+ 4 - 5
data/src/main/java/com/grkj/data/repository/impl/standard/WorkstationRepository.kt

@@ -17,10 +17,6 @@ import kotlin.collections.get
 class WorkstationRepository @Inject constructor(val workstationDao: WorkstationDao) :
     BaseRepository(), IWorkstationRepository {
 
-    override fun getWorkStationData(): List<IsWorkstation> {
-        return workstationDao.getWorkstationData()
-    }
-
     override fun addUserWorkstationData(userId: Long, workstationIds: List<Long>) {
         val isUserWorkstation = workstationIds.map { workstationId ->
             val isUserWorkstation = IsUserWorkstation()
@@ -59,7 +55,10 @@ class WorkstationRepository @Inject constructor(val workstationDao: WorkstationD
         parentId: Long,
         workstationName: String
     ): IsWorkstation? {
-        return workstationDao.getWorkstationDataByParentIdAndWorkstationName(parentId, workstationName)
+        return workstationDao.getWorkstationDataByParentIdAndWorkstationName(
+            parentId,
+            workstationName
+        )
     }
 
     override fun deleteWorkstationByWorkstationId(workstationId: Long) {